diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8147cdc --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +built +node_modules +yotta_modules +yotta_targets +pxt_modules +*.db +*.tgz +.header.json diff --git a/LCD1in8.cpp b/LCD1in8.cpp new file mode 100644 index 0000000..b9ff24d --- /dev/null +++ b/LCD1in8.cpp @@ -0,0 +1,51 @@ +#include "pxt.h" +#include "LCD_Driver.h" + +using namespace pxt; + +//% weight=20 color=#436EEE icon="\uf108" +namespace LCD1IN8 { + LCD_Driver *LCD; + + //% + void LCD_Init() { + LCD->LCD_Init(); + } + + //% + void LCD_Clear() { + LCD->LCD_Clear(WHITE); + LCD->LCD_ClearBuf(); + } + + //% + void LCD_Filling(int Color) { + LCD->LCD_Clear(Color); + } + + //% + void LCD_Display() { + LCD->LCD_Display(); + } + + //% + void LCD_DisplayWindows(int Xstart, int Ystart, int Xend, int Yend) { + LCD->LCD_DisplayWindows(Xstart, Ystart, Xend, Yend); + } + + //% + void LCD_SetBL(int Lev) { + LCD->LCD_SetBL(Lev); + } + + //% + void DrawPoint(int x, int y, int Color, int Dot) { + LCD->LCD_DrawPoint(x, y, Color, Dot); + } + + //% + void DisChar_1207(int Xchar, int Ychar, int Char_Offset, int Color){ + LCD->LCD_DisChar_1207(Xchar, Ychar, Char_Offset, Color); + } +} + diff --git a/LCD1in8.ts b/LCD1in8.ts new file mode 100644 index 0000000..11a34f6 --- /dev/null +++ b/LCD1in8.ts @@ -0,0 +1,274 @@ +let GUI_BACKGROUND_COLOR = LCD_COLOR.WHITE +let FONT_BACKGROUND_COLOR = LCD_COLOR.WHITE +let FONT_FOREGROUND_COLOR = LCD_COLOR.BLACK + +//% weight=20 color=#436EEE icon="\uf108" +namespace LCD1IN8{ + function Swop_AB(Point1: number, Point2: number): void { + let Temp = 0; + Temp = Point1; + Point1 = Point2; + Point2 = Temp; + } + + //% blockId=LCD_Init + //% blockGap=8 + //% block="LCD1IN8 Init" + //% shim=LCD1IN8::LCD_Init + //% weight=200 + export function LCD_Init(): void { + return; + } + + //% blockId=LCD_Clear + //% blockGap=8 + //% block="Clear screen and cache" + //% shim=LCD1IN8::LCD_Clear + //% weight=195 + export function LCD_Clear(): void { + return; + } + + //% blockId=LCD_Filling + //% blockGap=8 + //% block="Filling Color %Color" + //% shim=LCD1IN8::LCD_Filling + //% weight=194 + export function LCD_Filling(Color: number): void { + return; + } + + //% blockId=LCD_Display + //% blockGap=8 + //% block="Send display data" + //% shim=LCD1IN8::LCD_Display + //% weight=190 + export function LCD_Display(): void { + return; + } + + //% blockId=LCD_DisplayWindows + //% blockGap=8 + //% block="Show Windows display data |Xstart %Xstart|Ystart %Ystart|Xend %Xend|Yend %Yend " + //% shim=LCD1IN8::LCD_DisplayWindows + //% Xstart.min=1 Xstart.max=160 Ystart.min=1 Ystart.max=128 + //% Xend.min=1 Xend.max=160 Yend.min=1 Yend.max=128 + //% weight=189 + export function LCD_DisplayWindows(Xstart: number, Ystart: number, Xend: number, Yend: number): void { + return; + } + + //% blockId=Get_Color + //% blockGap=8 + //% block="%Color" + //% weight=185 + export function Get_Color(Color: LCD_COLOR): number { + return Color; + } + + //% blockId=LCD_SetBL + //% blockGap=8 + //% block="Set back light level %Lev" + //% Lev.min=0 Lev.max=10 + //% shim=LCD1IN8::LCD_SetBL + //% weight=180 + export function LCD_SetBL(Lev: number): void { + return; + } + + //% blockId=DrawPoint + //% blockGap=8 + //% block="Draw Point|x %x|y %y|Color %Color|Point Size %Dot" + //% x.min=1 x.max=160 y.min=1 y.max=128 + //% Color.min=0 Color.max=65535 + //% shim=LCD1IN8::DrawPoint + //% weight=150 + export function DrawPoint(x: number, y: number, Color: number, Dot: DOT_PIXEL): void { + return; + } + + //% blockId=DrawLine + //% blockGap=8 + //% block="Draw Line|Xstart %Xstart|Ystart %Ystart|Xend %Xend|Yend %Yend|Color %Color|Line width %Line_width|Line Style %Line_Style" + //% Xstart.min=1 Xstart.max=160 Ystart.min=1 Ystart.max=128 + //% Xend.min=1 Xend.max=160 Yend.min=1 Yend.max=128 + //% Color.min=0 Color.max=65535 + //% weight=140 + export function DrawLine(Xstart: number, Ystart: number, Xend: number, Yend: number, Color: number, Line_width: DOT_PIXEL, Line_Style: LINE_STYLE): void { + if (Xstart > Xend) + Swop_AB(Xstart, Xend); + if (Ystart > Yend) + Swop_AB(Ystart, Yend); + + let Xpoint = Xstart; + let Ypoint = Ystart; + let dx = Xend - Xstart >= 0 ? Xend - Xstart : Xstart - Xend; + let dy = Yend - Ystart <= 0 ? Yend - Ystart : Ystart - Yend; + + // Increment direction, 1 is positive, -1 is counter; + let XAddway = Xstart < Xend ? 1 : -1; + let YAddway = Ystart < Yend ? 1 : -1; + + //Cumulative error + let Esp = dx + dy; + let Line_Style_Temp = 0; + + for (; ;) { + Line_Style_Temp++; + //Painted dotted line, 2 point is really virtual + if (Line_Style == LINE_STYLE.LINE_DOTTED && Line_Style_Temp % 3 == 0) { + DrawPoint(Xpoint, Ypoint, GUI_BACKGROUND_COLOR, Line_width); + Line_Style_Temp = 0; + } else { + DrawPoint(Xpoint, Ypoint, Color, Line_width); + } + if (2 * Esp >= dy) { + if (Xpoint == Xend) break; + Esp += dy + Xpoint += XAddway; + } + if (2 * Esp <= dx) { + if (Ypoint == Yend) break; + Esp += dx; + Ypoint += YAddway; + } + } + } + + + //% blockId=DrawRectangle + //% blockGap=8 + //% block="Draw Rectangle|Xstart2 %Xstart2|Ystart2 %Ystart2|Xend2 %Xend2|Yend2 %Yend2|Color %Color|Filled %Filled |Line width %Dot_Pixel" + //% Xstart2.min=1 Xstart2.max=160 Ystart2.min=1 Ystart2.max=128 + //% Xend2.min=1 Xend2.max=160 Yend2.min=1 Yend2.max=128 + //% Color.min=0 Color.max=65535 + //% weight=130 + export function DrawRectangle(Xstart2: number, Ystart2: number, Xend2: number, Yend2: number, Color: number, Filled: DRAW_FILL, Dot_Pixel: DOT_PIXEL): void { + if (Xstart2 > Xend2) + Swop_AB(Xstart2, Xend2); + if (Ystart2 > Yend2) + Swop_AB(Ystart2, Yend2); + + let Ypoint = 0; + if (Filled) { + for(Ypoint = Ystart2; Ypoint < Yend2; Ypoint++) { + DrawLine(Xstart2, Ypoint, Xend2, Ypoint, Color, Dot_Pixel, LINE_STYLE.LINE_SOLID); + } + } else { + DrawLine(Xstart2, Ystart2, Xend2, Ystart2, Color, Dot_Pixel, LINE_STYLE.LINE_SOLID); + DrawLine(Xstart2, Ystart2, Xstart2, Yend2, Color, Dot_Pixel, LINE_STYLE.LINE_SOLID); + DrawLine(Xend2, Yend2, Xend2, Ystart2, Color, Dot_Pixel, LINE_STYLE.LINE_SOLID); + DrawLine(Xend2, Yend2, Xstart2, Yend2, Color, Dot_Pixel, LINE_STYLE.LINE_SOLID); + } + } + + //% blockId=DrawCircle + //% blockGap=8 + //% block="Draw Circle|X_Center %X_Center|Y_Center %Y_Center|Radius %Radius|Color %Color|Filled %Draw_Fill|Line width %Dot_Pixel" + //% X_Center.min=1 X_Center.max=160 Y_Center.min=1 Y_Center.max=128 + //% Radius.min=0 Radius.max=160 + //% Color.min=0 Color.max=65535 + //% weight=120 + export function DrawCircle(X_Center: number, Y_Center: number, Radius: number, Color: number, Draw_Fill: DRAW_FILL, Dot_Pixel: DOT_PIXEL): void { + //Draw a circle from(0, R) as a starting point + let XCurrent = 0; + let YCurrent = Radius; + + //Cumulative error,judge the next point of the logo + let Esp = 3 - (Radius << 1); + + let sCountY = 0; + if (Draw_Fill == DRAW_FILL.DRAW_FULL) {//DrawPoint(Xpoint, Ypoint, GUI_BACKGROUND_COLOR, Line_width); + while (XCurrent <= YCurrent) { //Realistic circles + for (sCountY = XCurrent; sCountY <= YCurrent; sCountY++) { + DrawPoint(X_Center + XCurrent, Y_Center + sCountY, Color, DOT_PIXEL.DOT_PIXEL_1); //1 + DrawPoint(X_Center - XCurrent, Y_Center + sCountY, Color, DOT_PIXEL.DOT_PIXEL_1); //2 + DrawPoint(X_Center - sCountY, Y_Center + XCurrent, Color, DOT_PIXEL.DOT_PIXEL_1); //3 + DrawPoint(X_Center - sCountY, Y_Center - XCurrent, Color, DOT_PIXEL.DOT_PIXEL_1); //4 + DrawPoint(X_Center - XCurrent, Y_Center - sCountY, Color, DOT_PIXEL.DOT_PIXEL_1); //5 + DrawPoint(X_Center + XCurrent, Y_Center - sCountY, Color, DOT_PIXEL.DOT_PIXEL_1); //6 + DrawPoint(X_Center + sCountY, Y_Center - XCurrent, Color, DOT_PIXEL.DOT_PIXEL_1); //7 + DrawPoint(X_Center + sCountY, Y_Center + XCurrent, Color, DOT_PIXEL.DOT_PIXEL_1); + } + if (Esp < 0) + Esp += 4 * XCurrent + 6; + else { + Esp += 10 + 4 * (XCurrent - YCurrent); + YCurrent--; + } + XCurrent++; + } + } else { //Draw a hollow circle + while (XCurrent <= YCurrent) { + DrawPoint(X_Center + XCurrent, Y_Center + YCurrent, Color, Dot_Pixel); //1 + DrawPoint(X_Center - XCurrent, Y_Center + YCurrent, Color, Dot_Pixel); //2 + DrawPoint(X_Center - YCurrent, Y_Center + XCurrent, Color, Dot_Pixel); //3 + DrawPoint(X_Center - YCurrent, Y_Center - XCurrent, Color, Dot_Pixel); //4 + DrawPoint(X_Center - XCurrent, Y_Center - YCurrent, Color, Dot_Pixel); //5 + DrawPoint(X_Center + XCurrent, Y_Center - YCurrent, Color, Dot_Pixel); //6 + DrawPoint(X_Center + YCurrent, Y_Center - XCurrent, Color, Dot_Pixel); //7 + DrawPoint(X_Center + YCurrent, Y_Center + XCurrent, Color, Dot_Pixel); //0 + + if (Esp < 0) + Esp += 4 * XCurrent + 6; + else { + Esp += 10 + 4 * (XCurrent - YCurrent); + YCurrent--; + } + XCurrent++; + } + } + } + + //% shim=LCD1IN8::DisChar_1207 + function DisChar_1207(Xchar: number, Ychar: number, Char_Offset: number, Color: number): void { + return; + } + + //% blockId=DisString + //% blockGap=8 + //% block="Show String|X %Xchar|Y %Ychar|char %ch|Color %Color" + //% Xchar.min=1 Xchar.max=160 Ychar.min=1 Ychar.max=128 + //% Color.min=0 Color.max=65535 + //% weight=100 + export function DisString(Xchar: number, Ychar: number, ch: string, Color: number): void { + let Xpoint = Xchar; + let Ypoint = Ychar; + let Font_Height = 12; + let Font_Width = 7; + let ch_len = ch.length; + let i = 0; + for(i = 0; i < ch_len; i++) { + let ch_asicc = ch.charCodeAt(i) - 32;//NULL = 32 + let Char_Offset = ch_asicc * Font_Height; + // let Char_Offset = ch_asicc * Font_Height *(Font_Width/8 +(Font_Width%8?1:0)); + + if((Xpoint + Font_Width) > 160) { + Xpoint = Xchar; + Ypoint += Font_Height; + } + + // If the Y direction is full, reposition to(Xstart, Ystart) + if((Ypoint + Font_Height) > 128) { + Xpoint = Xchar; + Ypoint = Ychar; + } + DisChar_1207(Xpoint, Ypoint, Char_Offset, Color); + + //The next word of the abscissa increases the font of the broadband + Xpoint += Font_Width; + } + } + + //% blockId=DisNumber + //% blockGap=8 + //% block="Show number|X %Xnum|Y %Ynum|number %num|Color %Color" + //% Xnum.min=1 Xnum.max=160 Ynum.min=1 Ynum.max=128 + //% Color.min=0 Color.max=65535 + //% weight=100 + export function DisNumber(Xnum: number, Ynum: number, num: number, Color: number): void { + let Xpoint = Xnum; + let Ypoint = Ynum; + DisString(Xnum, Ynum, num + "", Color); + } +} diff --git a/LCD_Driver.cpp b/LCD_Driver.cpp new file mode 100644 index 0000000..dd8f586 --- /dev/null +++ b/LCD_Driver.cpp @@ -0,0 +1,432 @@ +#include "MicroBitPin.h" +#include "mbed.h" +#include "LCD_Driver.h" +#include "SPI_RAM.h" + +//spi +SPI lcd_spi(MOSI, MISO, SCK); +#define LCD_SPI_Write_Byte(value) lcd_spi.write(value) + +//LCD +DigitalOut LCD_RST(MICROBIT_PIN_P8); +DigitalOut LCD_DC(MICROBIT_PIN_P12); +DigitalOut LCD_CS(MICROBIT_PIN_P16); +PwmOut LCD_BL(MICROBIT_PIN_P1); + +#define LCD_RST_0 LCD_RST = 0 +#define LCD_RST_1 LCD_RST = 1 +#define LCD_DC_0 LCD_DC = 0 +#define LCD_DC_1 LCD_DC = 1 +#define LCD_CS_0 LCD_CS = 0 +#define LCD_CS_1 LCD_CS = 1 + +//delay +#define Driver_Delay_ms(xms) wait_ms(xms) + +//SPI Ram +SPIRAM *spiram; + +/********************************************* +function: + Initialization system +*********************************************/ +void LCD_Driver::LCD_SPI_Init(void) +{ + lcd_spi.format(8,0); + lcd_spi.frequency(1000000); + LCD_CS_1; +} + +/******************************************************************************* +function: + Hardware reset +*******************************************************************************/ +void LCD_Driver::LCD_Reset(void) +{ + LCD_RST_1; + Driver_Delay_ms(100); + LCD_RST_0; + Driver_Delay_ms(100); + LCD_RST_1; + Driver_Delay_ms(100); +} + +/******************************************************************************* +function: + Write register address and data +*******************************************************************************/ + +void LCD_Driver::LCD_WriteReg(UBYTE Reg) +{ + LCD_DC_0; + LCD_CS_0; + LCD_SPI_Write_Byte(Reg); + LCD_CS_1; +} + +void LCD_Driver::LCD_WriteData_8Bit(UBYTE Data) +{ + LCD_DC_1; + LCD_CS_0; + LCD_SPI_Write_Byte(Data); + LCD_CS_1; +} + +void LCD_Driver::LCD_WriteData_Buf(UWORD Buf, unsigned long Len) +{ + unsigned long i; + LCD_DC_1; + LCD_CS_0; + for(i = 0; i < Len; i++) { + LCD_SPI_Write_Byte((int)(Buf >> 8)); + LCD_SPI_Write_Byte((int)(Buf & 0XFF)); + } + LCD_CS_1; +} +void LCD_Driver::LCD_REG_DATA(UWORD Reg ,UWORD Data) +{ + LCD_WriteReg(Reg>>8); + LCD_WriteReg(Reg&0xff); + LCD_WriteData_8Bit(Data >> 8); + LCD_WriteData_8Bit(Data & 0xff); +} +/******************************************************************************* +function: + Common register initialization +*******************************************************************************/ +void LCD_Driver::LCD_InitReg(void) +{ + +//ST7735R Frame Rate + /* LCD_WriteReg(0xB1); + LCD_WriteData_8Bit(0x01); + LCD_WriteData_8Bit(0x2C); + LCD_WriteData_8Bit(0x2D); + + LCD_WriteReg(0xB2); + LCD_WriteData_8Bit(0x01); + LCD_WriteData_8Bit(0x2C); + LCD_WriteData_8Bit(0x2D); + + LCD_WriteReg(0xB3); + LCD_WriteData_8Bit(0x01); + LCD_WriteData_8Bit(0x2C); + LCD_WriteData_8Bit(0x2D); + LCD_WriteData_8Bit(0x01); + LCD_WriteData_8Bit(0x2C); + LCD_WriteData_8Bit(0x2D); + + LCD_WriteReg(0xB4); //Column inversion + LCD_WriteData_8Bit(0x07); + + //ST7735R Power Sequence + LCD_WriteReg(0xC0); + LCD_WriteData_8Bit(0xA2); + LCD_WriteData_8Bit(0x02); + LCD_WriteData_8Bit(0x84); + LCD_WriteReg(0xC1); + LCD_WriteData_8Bit(0xC5); + + LCD_WriteReg(0xC2); + LCD_WriteData_8Bit(0x0A); + LCD_WriteData_8Bit(0x00); + + LCD_WriteReg(0xC3); + LCD_WriteData_8Bit(0x8A); + LCD_WriteData_8Bit(0x2A); + LCD_WriteReg(0xC4); + LCD_WriteData_8Bit(0x8A); + LCD_WriteData_8Bit(0xEE); + + LCD_WriteReg(0xC5); //VCOM + LCD_WriteData_8Bit(0x0E); + + //ST7735R Gamma Sequence + LCD_WriteReg(0xe0); + LCD_WriteData_8Bit(0x0f); + LCD_WriteData_8Bit(0x1a); + LCD_WriteData_8Bit(0x0f); + LCD_WriteData_8Bit(0x18); + LCD_WriteData_8Bit(0x2f); + LCD_WriteData_8Bit(0x28); + LCD_WriteData_8Bit(0x20); + LCD_WriteData_8Bit(0x22); + LCD_WriteData_8Bit(0x1f); + LCD_WriteData_8Bit(0x1b); + LCD_WriteData_8Bit(0x23); + LCD_WriteData_8Bit(0x37); + LCD_WriteData_8Bit(0x00); + LCD_WriteData_8Bit(0x07); + LCD_WriteData_8Bit(0x02); + LCD_WriteData_8Bit(0x10); + + LCD_WriteReg(0xe1); + LCD_WriteData_8Bit(0x0f); + LCD_WriteData_8Bit(0x1b); + LCD_WriteData_8Bit(0x0f); + LCD_WriteData_8Bit(0x17); + LCD_WriteData_8Bit(0x33); + LCD_WriteData_8Bit(0x2c); + LCD_WriteData_8Bit(0x29); + LCD_WriteData_8Bit(0x2e); + LCD_WriteData_8Bit(0x30); + LCD_WriteData_8Bit(0x30); + LCD_WriteData_8Bit(0x39); + LCD_WriteData_8Bit(0x3f); + LCD_WriteData_8Bit(0x00); + LCD_WriteData_8Bit(0x07); + LCD_WriteData_8Bit(0x03); + LCD_WriteData_8Bit(0x10); + + LCD_WriteReg(0xF0); //Enable test command + LCD_WriteData_8Bit(0x01); + + LCD_WriteReg(0xF6); //Disable ram power save mode + LCD_WriteData_8Bit(0x00); + + LCD_WriteReg(0x3A); //65k mode + LCD_WriteData_8Bit(0x05); + + LCD_WriteReg(0x36); //MX, MY, RGB mode + LCD_WriteData_8Bit(0xd7); //RGB color filter panel b7 + */ + //9106 + LCD_WriteReg(0xfe); + LCD_WriteReg(0xfe); + LCD_WriteReg(0xef); + LCD_WriteReg(0xb3); + LCD_WriteData_8Bit(0x03); + LCD_WriteReg(0xb6); + LCD_WriteData_8Bit(0x01); + LCD_WriteReg(0xa3); + LCD_WriteData_8Bit(0x11); + LCD_WriteReg(0x21); + LCD_WriteReg(0x36); + LCD_WriteData_8Bit(0xd0); //08 + LCD_WriteReg(0x3a); + LCD_WriteData_8Bit(0x05); + LCD_WriteReg(0xb4); + LCD_WriteData_8Bit(0x21); + LCD_WriteReg(0xF0); + LCD_WriteData_8Bit(0x31); + LCD_WriteData_8Bit(0x26); + LCD_WriteData_8Bit(0x28); + LCD_WriteData_8Bit(0x00); + LCD_WriteData_8Bit(0x2C); + LCD_WriteData_8Bit(0x0C); + LCD_WriteData_8Bit(0x0C); + LCD_WriteData_8Bit(0x15); + LCD_WriteData_8Bit(0x15); + LCD_WriteData_8Bit(0x0f); + LCD_WriteReg(0xF1); + LCD_WriteData_8Bit(0x0E); + LCD_WriteData_8Bit(0x12); + LCD_WriteData_8Bit(0x13); + LCD_WriteData_8Bit(0x00); + LCD_WriteData_8Bit(0x0A); + LCD_WriteData_8Bit(0x0D); + LCD_WriteData_8Bit(0x0D); + LCD_WriteData_8Bit(0x14); + LCD_WriteData_8Bit(0x13); + LCD_WriteData_8Bit(0x0f); + LCD_WriteReg(0xfe); + LCD_WriteReg(0xff); + LCD_WriteReg(0x11); + //delayms(120); + LCD_WriteReg(0x29); + +} + +/******************************************************************************** +function: Sets the start position and size of the display area +parameter: + Xstart : X direction Start coordinates + Ystart : Y direction Start coordinates + Xend : X direction end coordinates + Yend : Y direction end coordinates +********************************************************************************/ +void LCD_Driver::LCD_SetWindows(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend) +{ + //set the X coordinates + //set the X coordinates + LCD_WriteReg(0x2A); + //LCD_WriteData_8Bit(0x00); + LCD_WriteData_8Bit(Xstart>>8); + LCD_WriteData_8Bit((Xstart & 0xff) ); + LCD_WriteData_8Bit(Xend>>8 ); + LCD_WriteData_8Bit(((Xend - 1) & 0xff) ); + + //set the Y coordinates + LCD_WriteReg(0x2B); + LCD_WriteData_8Bit(Ystart>>8); + LCD_WriteData_8Bit((Ystart & 0xff) ); + LCD_WriteData_8Bit(Yend>>8 ); + LCD_WriteData_8Bit(((Yend - 1) & 0xff)); + + LCD_WriteReg(0x2C); +} + +/******************************************************************************** +function: + Set the display point (Xpoint, Ypoint) +********************************************************************************/ +void LCD_Driver::LCD_SetCursor(UWORD Xpoint, UWORD Ypoint) +{ + LCD_SetWindows(Xpoint, Ypoint, Xpoint, Ypoint); +} + +/******************************************************************************** +function: + Set show color +********************************************************************************/ +void LCD_Driver::LCD_SetColor(UWORD Color, UWORD Xpoint, UWORD Ypoint) +{ + LCD_WriteData_Buf(Color, (unsigned long)Xpoint * (unsigned long)Ypoint); +} + +/******************************************************************************** +function: + initialization +********************************************************************************/ +void LCD_Driver::LCD_Init(void) +{ + //start spi + SPI spi(MOSI, MISO, SCK); + spi.write(0x00); + + //back light + LCD_BL.period(0.02); + LCD_BL.write(1); + + LCD_SPI_Init(); + + //spiram->SPIRAM_SPI_Init(); + //spiram->SPIRAM_Set_Mode(BYTE_MODE); + + //Hardware reset + LCD_Reset(); + + //Set the initialization register + LCD_InitReg(); + + //sleep out + LCD_WriteReg(0x11); + Driver_Delay_ms(120); + + //Turn on the LCD display + LCD_WriteReg(0x29); +} + +void LCD_Driver::LCD_SetBL(int Lev) +{ + float light = (float)Lev / 10; + LCD_BL.write(light); +} + +/******************************************************************************** +function: + Clear screen +********************************************************************************/ +void LCD_Driver::LCD_Clear(UWORD Color) +{ + LCD_SetWindows(0, 0, LCD_WIDTH, LCD_HEIGHT); + LCD_SetColor(Color, LCD_WIDTH + 2, LCD_HEIGHT + 2); + +} + +void LCD_Driver::LCD_ClearBuf(void) +{ + UWORD x, y; + UWORD Color = 0xffff; + for (y = 0; y < 128; y++) { + for (x = 0; x < 160; x++ ) {//1 pixel = 2 byte + //spiram->SPIRAM_WR_Byte((x + y * 160)* 2, Color >> 8); + LCD_REG_DATA((x + y * 160)* 2, Color >> 8); + //spiram->SPIRAM_WR_Byte((x + y * 160)* 2 + 1, Color); + LCD_REG_DATA((x + y * 160)* 2 + 1, Color); + } + } +} + +void LCD_Driver::LCD_SetPoint(UWORD Xpoint, UWORD Ypoint, UWORD Color) +{ + + LCD_SetWindows(Xpoint, Ypoint, Xpoint+1, Ypoint+1); + LCD_WriteData_8Bit(Color>>8); + LCD_WriteData_8Bit(Color); + LCD_WriteReg(0x29); + +} + +void LCD_Driver::LCD_DrawPoint(int x, int y, int Color, int Dot) +{ + int XDir_Num ,YDir_Num; + for(XDir_Num = 0; XDir_Num < Dot; XDir_Num++) { + for(YDir_Num = 0; YDir_Num < Dot; YDir_Num++) { + LCD_SetPoint(x + XDir_Num - Dot, y + YDir_Num - Dot, Color); + } + } +} + +void LCD_Driver::LCD_Display(void) +{ + UWORD x, y; + UBYTE RBUF[160 * 2 * 2];//read tow lines + memset(RBUF, 0xff, sizeof(RBUF)); + + spiram->SPIRAM_Set_Mode(STREAM_MODE); + LCD_SetWindows(0, 0, 160, 128); + for (y = 0; y < 128 / 2; y++) {//line + spiram->SPIRAM_RD_Stream(y * 160 * 2 * 2, RBUF, 160 * 2 * 2); + + LCD_DC_1; + LCD_CS_0; + for (x = 0; x < 160 * 2; x++ ) { + LCD_SPI_Write_Byte((uint8_t)RBUF[x * 2]); + LCD_SPI_Write_Byte((uint8_t)RBUF[x * 2 + 1]); + } + LCD_CS_1; + } +} + +void LCD_Driver::LCD_DisplayWindows(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend) +{ + UWORD x, y; + UBYTE BUF[(Xend - Xstart + 1) * 2]; + memset(BUF, 0xff, sizeof(BUF)); + + //spiram->SPIRAM_Set_Mode(STREAM_MODE); + LCD_SetWindows(Xstart, Ystart, Xend, Yend); + for (y = Ystart; y < Yend; y++) {//line + //spiram->SPIRAM_RD_Stream((y * 160 + Xstart) * 2, BUF, sizeof(BUF)); + + LCD_DC_1; + LCD_CS_0; + for (x = 0; x < Xend - Xstart; x++) { + LCD_SPI_Write_Byte((uint8_t)BUF[x * 2]); + LCD_SPI_Write_Byte((uint8_t)BUF[x * 2 + 1]); + } + LCD_CS_1; + } +} + + + +void LCD_Driver::LCD_DisChar_1207(int Xchar, int Ychar, int Char_Offset, int Color) +{ + int Page = 0, Column = 0; + const unsigned char *ptr = &Font12_Table[Char_Offset]; + + for(Page = 0; Page < 12; Page ++ ) { + for(Column = 0; Column < 7; Column ++ ) { + if(*ptr & (0x80 >> (Column % 8))) + LCD_SetPoint(Xchar + Column, Ychar + Page, Color); + + //One pixel is 8 bits + if(Column % 8 == 7) + ptr++; + }// Write a line + if(7 % 8 != 0) + ptr++; + }// Write all +} \ No newline at end of file diff --git a/LCD_Driver.h b/LCD_Driver.h new file mode 100644 index 0000000..8bba5ab --- /dev/null +++ b/LCD_Driver.h @@ -0,0 +1,1415 @@ +#ifndef __LCD_DRIVER_H +#define __LCD_DRIVER_H + +//data +#define UBYTE unsigned char +#define UWORD unsigned int + +//Define the full screen height length of the display +#define LCD_WIDTH 128 //LCD width +#define LCD_HEIGHT 160 //LCD height + +enum LCD_COLOR { + WHITE = 0xFFFF, + BLACK = 0x0000, + BLUE = 0x001F, + BRED = 0XF81F, + GRED = 0XFFE0, + GBLUE = 0X07FF, + RED = 0xF800, + MAGENTA = 0xF81F, + GREEN = 0x07E0, + CYAN = 0x7FFF, + YELLOW = 0xFFE0, + BROWN = 0XBC40, + BRRED = 0XFC07, + GRAY = 0X8430 +}; + +enum DOT_PIXEL{ + DOT_PIXEL_1 = 1, + DOT_PIXEL_2, + DOT_PIXEL_3, + DOT_PIXEL_4 +}; + +enum LINE_STYLE { + LINE_SOLID = 0, + LINE_DOTTED, +}; + +enum DRAW_FILL { + DRAW_EMPTY = 0, + DRAW_FULL, +}; + +class LCD_Driver{ +private: + void LCD_SPI_Init(void); + void LCD_Reset(void); + void LCD_InitReg(void); + + void LCD_WriteReg(UBYTE Reg); + void LCD_WriteData_8Bit(UBYTE Data); + void LCD_REG_DATA(UWORD Reg, UWORD Data); + void LCD_WriteData_Buf(UWORD Buf,unsigned long Len); + + void LCD_SetWindows(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend); + void LCD_SetCursor(UWORD X, UWORD Y); + void LCD_SetColor(UWORD Color ,UWORD Xnum, UWORD Ynum); + + void LCD_SetPoint(UWORD Xpoint, UWORD Ypoint, UWORD Color); +public: + void LCD_Init(void); + + void LCD_SetBL(int Lev); + + void LCD_Clear(UWORD Color); + void LCD_ClearBuf(void); + + void LCD_Display(void); + void LCD_DisplayWindows(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend); + + void LCD_DrawPoint(int x, int y, int Color, int Dot); + void LCD_DisChar_1207(int Xchar, int Ychar, int Char_Offset, int Color); +}; + +static const unsigned char Font12_Table[] = +{ + // @0 ' ' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @12 '!' (7 pixels wide) + 0x00, // + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + 0x10, // # + 0x00, // + 0x00, // + 0x00, // + + // @24 '"' (7 pixels wide) + 0x00, // + 0x6C, // ## ## + 0x48, // # # + 0x48, // # # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @36 '#' (7 pixels wide) + 0x00, // + 0x14, // # # + 0x14, // # # + 0x28, // # # + 0x7C, // ##### + 0x28, // # # + 0x7C, // ##### + 0x28, // # # + 0x50, // # # + 0x50, // # # + 0x00, // + 0x00, // + + // @48 '$' (7 pixels wide) + 0x00, // + 0x10, // # + 0x38, // ### + 0x40, // # + 0x40, // # + 0x38, // ### + 0x48, // # # + 0x70, // ### + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + + // @60 '%' (7 pixels wide) + 0x00, // + 0x20, // # + 0x50, // # # + 0x20, // # + 0x0C, // ## + 0x70, // ### + 0x08, // # + 0x14, // # # + 0x08, // # + 0x00, // + 0x00, // + 0x00, // + + // @72 '&' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x18, // ## + 0x20, // # + 0x20, // # + 0x54, // # # # + 0x48, // # # + 0x34, // ## # + 0x00, // + 0x00, // + 0x00, // + + // @84 ''' (7 pixels wide) + 0x00, // + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @96 '(' (7 pixels wide) + 0x00, // + 0x08, // # + 0x08, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x08, // # + 0x08, // # + 0x00, // + + // @108 ')' (7 pixels wide) + 0x00, // + 0x20, // # + 0x20, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x20, // # + 0x20, // # + 0x00, // + + // @120 '*' (7 pixels wide) + 0x00, // + 0x10, // # + 0x7C, // ##### + 0x10, // # + 0x28, // # # + 0x28, // # # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @132 '+' (7 pixels wide) + 0x00, // + 0x00, // + 0x10, // # + 0x10, // # + 0x10, // # + 0xFE, // ####### + 0x10, // # + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + 0x00, // + + // @144 ',' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x18, // ## + 0x10, // # + 0x30, // ## + 0x20, // # + 0x00, // + + // @156 '-' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @168 '.' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x30, // ## + 0x30, // ## + 0x00, // + 0x00, // + 0x00, // + + // @180 '/' (7 pixels wide) + 0x00, // + 0x04, // # + 0x04, // # + 0x08, // # + 0x08, // # + 0x10, // # + 0x10, // # + 0x20, // # + 0x20, // # + 0x40, // # + 0x00, // + 0x00, // + + // @192 '0' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @204 '1' (7 pixels wide) + 0x00, // + 0x30, // ## + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @216 '2' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x44, // # # + 0x04, // # + 0x08, // # + 0x10, // # + 0x20, // # + 0x44, // # # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @228 '3' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x44, // # # + 0x04, // # + 0x18, // ## + 0x04, // # + 0x04, // # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @240 '4' (7 pixels wide) + 0x00, // + 0x0C, // ## + 0x14, // # # + 0x14, // # # + 0x24, // # # + 0x44, // # # + 0x7E, // ###### + 0x04, // # + 0x0E, // ### + 0x00, // + 0x00, // + 0x00, // + + // @252 '5' (7 pixels wide) + 0x00, // + 0x3C, // #### + 0x20, // # + 0x20, // # + 0x38, // ### + 0x04, // # + 0x04, // # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @264 '6' (7 pixels wide) + 0x00, // + 0x1C, // ### + 0x20, // # + 0x40, // # + 0x78, // #### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @276 '7' (7 pixels wide) + 0x00, // + 0x7C, // ##### + 0x44, // # # + 0x04, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + 0x00, // + + // @288 '8' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @300 '9' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x3C, // #### + 0x04, // # + 0x08, // # + 0x70, // ### + 0x00, // + 0x00, // + 0x00, // + + // @312 ':' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x30, // ## + 0x30, // ## + 0x00, // + 0x00, // + 0x30, // ## + 0x30, // ## + 0x00, // + 0x00, // + 0x00, // + + // @324 ';' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x18, // ## + 0x18, // ## + 0x00, // + 0x00, // + 0x18, // ## + 0x30, // ## + 0x20, // # + 0x00, // + 0x00, // + + // @336 '<' (7 pixels wide) + 0x00, // + 0x00, // + 0x0C, // ## + 0x10, // # + 0x60, // ## + 0x80, // # + 0x60, // ## + 0x10, // # + 0x0C, // ## + 0x00, // + 0x00, // + 0x00, // + + // @348 '=' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x7C, // ##### + 0x00, // + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @360 '>' (7 pixels wide) + 0x00, // + 0x00, // + 0xC0, // ## + 0x20, // # + 0x18, // ## + 0x04, // # + 0x18, // ## + 0x20, // # + 0xC0, // ## + 0x00, // + 0x00, // + 0x00, // + + // @372 '?' (7 pixels wide) + 0x00, // + 0x00, // + 0x18, // ## + 0x24, // # # + 0x04, // # + 0x08, // # + 0x10, // # + 0x00, // + 0x30, // ## + 0x00, // + 0x00, // + 0x00, // + + // @384 '@' (7 pixels wide) + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x4C, // # ## + 0x54, // # # # + 0x54, // # # # + 0x4C, // # ## + 0x40, // # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + + // @396 'A' (7 pixels wide) + 0x00, // + 0x30, // ## + 0x10, // # + 0x28, // # # + 0x28, // # # + 0x28, // # # + 0x7C, // ##### + 0x44, // # # + 0xEE, // ### ### + 0x00, // + 0x00, // + 0x00, // + + // @408 'B' (7 pixels wide) + 0x00, // + 0xF8, // ##### + 0x44, // # # + 0x44, // # # + 0x78, // #### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0xF8, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @420 'C' (7 pixels wide) + 0x00, // + 0x3C, // #### + 0x44, // # # + 0x40, // # + 0x40, // # + 0x40, // # + 0x40, // # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @432 'D' (7 pixels wide) + 0x00, // + 0xF0, // #### + 0x48, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x48, // # # + 0xF0, // #### + 0x00, // + 0x00, // + 0x00, // + + // @444 'E' (7 pixels wide) + 0x00, // + 0xFC, // ###### + 0x44, // # # + 0x50, // # # + 0x70, // ### + 0x50, // # # + 0x40, // # + 0x44, // # # + 0xFC, // ###### + 0x00, // + 0x00, // + 0x00, // + + // @456 'F' (7 pixels wide) + 0x00, // + 0x7E, // ###### + 0x22, // # # + 0x28, // # # + 0x38, // ### + 0x28, // # # + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + 0x00, // + + // @468 'G' (7 pixels wide) + 0x00, // + 0x3C, // #### + 0x44, // # # + 0x40, // # + 0x40, // # + 0x4E, // # ### + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @480 'H' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x44, // # # + 0x7C, // ##### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0xEE, // ### ### + 0x00, // + 0x00, // + 0x00, // + + // @492 'I' (7 pixels wide) + 0x00, // + 0x7C, // ##### + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @504 'J' (7 pixels wide) + 0x00, // + 0x3C, // #### + 0x08, // # + 0x08, // # + 0x08, // # + 0x48, // # # + 0x48, // # # + 0x48, // # # + 0x30, // ## + 0x00, // + 0x00, // + 0x00, // + + // @516 'K' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x48, // # # + 0x50, // # # + 0x70, // ### + 0x48, // # # + 0x44, // # # + 0xE6, // ### ## + 0x00, // + 0x00, // + 0x00, // + + // @528 'L' (7 pixels wide) + 0x00, // + 0x70, // ### + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x24, // # # + 0x24, // # # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @540 'M' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x6C, // ## ## + 0x6C, // ## ## + 0x54, // # # # + 0x54, // # # # + 0x44, // # # + 0x44, // # # + 0xEE, // ### ### + 0x00, // + 0x00, // + 0x00, // + + // @552 'N' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x64, // ## # + 0x64, // ## # + 0x54, // # # # + 0x54, // # # # + 0x54, // # # # + 0x4C, // # ## + 0xEC, // ### ## + 0x00, // + 0x00, // + 0x00, // + + // @564 'O' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @576 'P' (7 pixels wide) + 0x00, // + 0x78, // #### + 0x24, // # # + 0x24, // # # + 0x24, // # # + 0x38, // ### + 0x20, // # + 0x20, // # + 0x70, // ### + 0x00, // + 0x00, // + 0x00, // + + // @588 'Q' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x1C, // ### + 0x00, // + 0x00, // + + // @600 'R' (7 pixels wide) + 0x00, // + 0xF8, // ##### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x78, // #### + 0x48, // # # + 0x44, // # # + 0xE2, // ### # + 0x00, // + 0x00, // + 0x00, // + + // @612 'S' (7 pixels wide) + 0x00, // + 0x34, // ## # + 0x4C, // # ## + 0x40, // # + 0x38, // ### + 0x04, // # + 0x04, // # + 0x64, // ## # + 0x58, // # ## + 0x00, // + 0x00, // + 0x00, // + + // @624 'T' (7 pixels wide) + 0x00, // + 0xFE, // ####### + 0x92, // # # # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @636 'U' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @648 'V' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x44, // # # + 0x28, // # # + 0x28, // # # + 0x28, // # # + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + 0x00, // + + // @660 'W' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x44, // # # + 0x54, // # # # + 0x54, // # # # + 0x54, // # # # + 0x54, // # # # + 0x28, // # # + 0x00, // + 0x00, // + 0x00, // + + // @672 'X' (7 pixels wide) + 0x00, // + 0xC6, // ## ## + 0x44, // # # + 0x28, // # # + 0x10, // # + 0x10, // # + 0x28, // # # + 0x44, // # # + 0xC6, // ## ## + 0x00, // + 0x00, // + 0x00, // + + // @684 'Y' (7 pixels wide) + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x28, // # # + 0x28, // # # + 0x10, // # + 0x10, // # + 0x10, // # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @696 'Z' (7 pixels wide) + 0x00, // + 0x7C, // ##### + 0x44, // # # + 0x08, // # + 0x10, // # + 0x10, // # + 0x20, // # + 0x44, // # # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @708 '[' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x38, // ### + 0x00, // + + // @720 '\' (7 pixels wide) + 0x00, // + 0x40, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x10, // # + 0x10, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x00, // + 0x00, // + + // @732 ']' (7 pixels wide) + 0x00, // + 0x38, // ### + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x38, // ### + 0x00, // + + // @744 '^' (7 pixels wide) + 0x00, // + 0x10, // # + 0x10, // # + 0x28, // # # + 0x44, // # # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @756 '_' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0xFE, // ####### + + // @768 '`' (7 pixels wide) + 0x00, // + 0x10, // # + 0x08, // # + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + + // @780 'a' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x38, // ### + 0x44, // # # + 0x3C, // #### + 0x44, // # # + 0x44, // # # + 0x3E, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @792 'b' (7 pixels wide) + 0x00, // + 0xC0, // ## + 0x40, // # + 0x58, // # ## + 0x64, // ## # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0xF8, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @804 'c' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x3C, // #### + 0x44, // # # + 0x40, // # + 0x40, // # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @816 'd' (7 pixels wide) + 0x00, // + 0x0C, // ## + 0x04, // # + 0x34, // ## # + 0x4C, // # ## + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x3E, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @828 'e' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x38, // ### + 0x44, // # # + 0x7C, // ##### + 0x40, // # + 0x40, // # + 0x3C, // #### + 0x00, // + 0x00, // + 0x00, // + + // @840 'f' (7 pixels wide) + 0x00, // + 0x1C, // ### + 0x20, // # + 0x7C, // ##### + 0x20, // # + 0x20, // # + 0x20, // # + 0x20, // # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @852 'g' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x36, // ## ## + 0x4C, // # ## + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x3C, // #### + 0x04, // # + 0x38, // ### + 0x00, // + + // @864 'h' (7 pixels wide) + 0x00, // + 0xC0, // ## + 0x40, // # + 0x58, // # ## + 0x64, // ## # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0xEE, // ### ### + 0x00, // + 0x00, // + 0x00, // + + // @876 'i' (7 pixels wide) + 0x00, // + 0x10, // # + 0x00, // + 0x70, // ### + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @888 'j' (7 pixels wide) + 0x00, // + 0x10, // # + 0x00, // + 0x78, // #### + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x08, // # + 0x70, // ### + 0x00, // + + // @900 'k' (7 pixels wide) + 0x00, // + 0xC0, // ## + 0x40, // # + 0x5C, // # ### + 0x48, // # # + 0x70, // ### + 0x50, // # # + 0x48, // # # + 0xDC, // ## ### + 0x00, // + 0x00, // + 0x00, // + + // @912 'l' (7 pixels wide) + 0x00, // + 0x30, // ## + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @924 'm' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xE8, // ### # + 0x54, // # # # + 0x54, // # # # + 0x54, // # # # + 0x54, // # # # + 0xFE, // ####### + 0x00, // + 0x00, // + 0x00, // + + // @936 'n' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xD8, // ## ## + 0x64, // ## # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0xEE, // ### ### + 0x00, // + 0x00, // + 0x00, // + + // @948 'o' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x38, // ### + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x38, // ### + 0x00, // + 0x00, // + 0x00, // + + // @960 'p' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xD8, // ## ## + 0x64, // ## # + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x78, // #### + 0x40, // # + 0xE0, // ### + 0x00, // + + // @972 'q' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x36, // ## ## + 0x4C, // # ## + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x3C, // #### + 0x04, // # + 0x0E, // ### + 0x00, // + + // @984 'r' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x6C, // ## ## + 0x30, // ## + 0x20, // # + 0x20, // # + 0x20, // # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @996 's' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x3C, // #### + 0x44, // # # + 0x38, // ### + 0x04, // # + 0x44, // # # + 0x78, // #### + 0x00, // + 0x00, // + 0x00, // + + // @1008 't' (7 pixels wide) + 0x00, // + 0x00, // + 0x20, // # + 0x7C, // ##### + 0x20, // # + 0x20, // # + 0x20, // # + 0x22, // # # + 0x1C, // ### + 0x00, // + 0x00, // + 0x00, // + + // @1020 'u' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xCC, // ## ## + 0x44, // # # + 0x44, // # # + 0x44, // # # + 0x4C, // # ## + 0x36, // ## ## + 0x00, // + 0x00, // + 0x00, // + + // @1032 'v' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x44, // # # + 0x28, // # # + 0x28, // # # + 0x10, // # + 0x00, // + 0x00, // + 0x00, // + + // @1044 'w' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x54, // # # # + 0x54, // # # # + 0x54, // # # # + 0x28, // # # + 0x00, // + 0x00, // + 0x00, // + + // @1056 'x' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xCC, // ## ## + 0x48, // # # + 0x30, // ## + 0x30, // ## + 0x48, // # # + 0xCC, // ## ## + 0x00, // + 0x00, // + 0x00, // + + // @1068 'y' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0xEE, // ### ### + 0x44, // # # + 0x24, // # # + 0x28, // # # + 0x18, // ## + 0x10, // # + 0x10, // # + 0x78, // #### + 0x00, // + + // @1080 'z' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x7C, // ##### + 0x48, // # # + 0x10, // # + 0x20, // # + 0x44, // # # + 0x7C, // ##### + 0x00, // + 0x00, // + 0x00, // + + // @1092 '{' (7 pixels wide) + 0x00, // + 0x08, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x20, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x08, // # + 0x00, // + + // @1104 '|' (7 pixels wide) + 0x00, // + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x00, // + 0x00, // + + // @1116 '}' (7 pixels wide) + 0x00, // + 0x20, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x08, // # + 0x10, // # + 0x10, // # + 0x10, // # + 0x20, // # + 0x00, // + + // @1128 '~' (7 pixels wide) + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x24, // # # + 0x58, // # ## + 0x00, // + 0x00, // + 0x00, // + 0x00, // + 0x00, // +}; + + + +#endif + + + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..9068464 --- /dev/null +++ b/Makefile @@ -0,0 +1,10 @@ +all: deploy + +build: + pxt build + +deploy: + pxt deploy + +test: + pxt test diff --git a/README.md b/README.md index 8d59f9b..ebeed81 100644 --- a/README.md +++ b/README.md @@ -1 +1,111 @@ -# MFDLCD18 \ No newline at end of file +# LCD1in8 + +waveshare electronics + +![Waveshare_logo.png](Waveshare_logo.png) + +# Package product +https://www.waveshare.com/1.8inch-lcd-for-micro-bit.htm + +# test +Test can refer to test.ts + +# user +If you find a problem with the https://makecode.microbit.org/# +programming website, you can't download it. +Try https://makecode.microbit.org/v0 to edit your project. +For reference, please refer to our user manual. + + +If you find that there are many places to change, +such as the function name changed you can find the answer here, +Or contact us + +1.Initiation: +You need to initial LCD module first. + +block: LCD1IN8 Init. +javascript: LCD_Init() + +2.Clear the screen: +Clear the screen to white. Create an buffer on RAM with the resolution size 160*128 and initial it to white. + +block: Clear Clear screen and cache. +javascript: LCD_Init() + +3.Set the backlight: + +block: Set back light level. +javascript: LCD_SetBL() + +4.Send display data: +With this block, it will send one frame of buffer to the LCD and display. +Note: it is always following drawing operation. + +block: Send display data. +javascript: LCD_Display() + +5.Send widows display data: +Sometimes it is not necessary to refresh the entire screen data, +only need to display part of the window data. + +block: Send widows display data. +javascript: LCD_DisplayWindows() + +6.Clear screen and cache: + +block: Clear screen and cache. +javascript: LCD_Clear() + +7.Fill the full screen color: +block: Filling Color. +javascript: LCD_Filling() + +8.Draw point: +Place the block before send display data. +You can choose the position, color and size. +For the screen, (1,1) is on top-left, and (160,128) is on bottom-right +There are tow way to set the color, +the one is use the color block as above, +another is to set the value (RGB565) by drag the slider. + +block: Draw Point. +javascript: DrawPoint() + +9.Draw line: +You can choose the the line's position, color, size and its sytle. + +block: Draw Line. +javascript: DrawLine() + +10.Draw rectange: + +block: Draw Rectange. +javascript: DrawRectangle() + +11.Draw Circle: + +block: Draw Circle. +javascript: DrawCirclee() + +12.Show String: + +block: Show String. +javascript: DisString() + +13.Show number: + +block: Show number. +javascript: DisNumber() + +#More parameters can be found in test.ts for a detailed understanding. + +## License + +MIT + +## Supported targets + +* for PXT/microbit +(The metadata above is needed for package search.) + diff --git a/SPI_RAM.cpp b/SPI_RAM.cpp new file mode 100644 index 0000000..4ce5841 --- /dev/null +++ b/SPI_RAM.cpp @@ -0,0 +1,162 @@ +#include "SPI_RAM.h" +#include "mbed.h" +#include "MicroBitPin.h" + +//SPI +SPI ram_spi(MOSI, MISO, SCK); +#define SPIRAM_SPI_Write_Byte(value) ram_spi.write(value) +#define SPIRAM_SPI_Read_Byte(value) ram_spi.write(value) + +//SPIRAM +DigitalOut SPIRAM_CS(MICROBIT_PIN_P2); +#define SPIRAM_CS_0 SPIRAM_CS = 0 +#define SPIRAM_CS_1 SPIRAM_CS = 1 + + +/********************************************* +function: + Initialization system +*********************************************/ +void SPIRAM::SPIRAM_SPI_Init(void) +{ + ram_spi.format(8,0); + ram_spi.frequency(9000000); + SPIRAM_CS_1; +} + + +/******************************************************************************* +function: + // Mode handling +*******************************************************************************/ +void SPIRAM::SPIRAM_Set_Mode(BYTE mode) +{ + SPIRAM_CS_0; + + SPIRAM_SPI_Write_Byte(CMD_WRSR); + SPIRAM_SPI_Write_Byte(mode); + + SPIRAM_CS_1; +} + +/******************************************************************************* +function: + // Write and read byte +*******************************************************************************/ +BYTE SPIRAM::SPIRAM_RD_Byte(WORD Addr) +{ + BYTE RD_Byte; + + SPIRAM_CS_0; + SPIRAM_SPI_Write_Byte(CMD_READ); + + SPIRAM_SPI_Write_Byte(0X00); + SPIRAM_SPI_Write_Byte((BYTE)(Addr >> 8)); + SPIRAM_SPI_Write_Byte((BYTE)Addr); + + RD_Byte = SPIRAM_SPI_Read_Byte(0x00); + SPIRAM_CS_1; + + return RD_Byte; +} + +void SPIRAM::SPIRAM_WR_Byte(WORD Addr, const BYTE Data) +{ + // Write Addr,data + SPIRAM_CS_0; + + SPIRAM_SPI_Write_Byte(CMD_WRITE); + + SPIRAM_SPI_Write_Byte(0X00); + SPIRAM_SPI_Write_Byte((BYTE)(Addr >> 8)); + SPIRAM_SPI_Write_Byte((BYTE)Addr); + + SPIRAM_SPI_Write_Byte(Data); + SPIRAM_CS_1; +} + + +/******************************************************************************* +function: + // Page transfer functions. Bound to current page. Passing the boundary + // will wrap to the beginning +*******************************************************************************/ +void SPIRAM::SPIRAM_RD_Page(WORD Addr, BYTE *pBuf) +{ + WORD i; + + // Write Addr, read data + SPIRAM_CS_0; + SPIRAM_SPI_Write_Byte(CMD_READ); + + SPIRAM_SPI_Write_Byte(0X00); + SPIRAM_SPI_Write_Byte((BYTE)(Addr >> 8)); + SPIRAM_SPI_Write_Byte((BYTE)Addr); + + for (i = 0; i < 32; i++) { + *pBuf = SPIRAM_SPI_Read_Byte(0x00); + pBuf++; + } + SPIRAM_CS_1; +} + +void SPIRAM::SPIRAM_WR_Page(WORD Addr, BYTE *pBuf) +{ + WORD i; + + // Write Addr, read data + SPIRAM_CS_0; + SPIRAM_SPI_Write_Byte(CMD_WRITE); + + SPIRAM_SPI_Write_Byte(0X00); + SPIRAM_SPI_Write_Byte((BYTE)(Addr >> 8)); + SPIRAM_SPI_Write_Byte((BYTE)Addr); + + for (i = 0; i < 32; i++) { + SPIRAM_SPI_Write_Byte(*pBuf); + pBuf++; + } + SPIRAM_CS_1; +} + +/******************************************************************************* +function: + // Write and read Len +*******************************************************************************/ +void SPIRAM::SPIRAM_RD_Stream(WORD Addr, BYTE *pBuf, unsigned long Len) +{ + WORD i; + + // Write Addr, read data + SPIRAM_CS_0; + SPIRAM_SPI_Write_Byte(CMD_READ); + + SPIRAM_SPI_Write_Byte(0X00); + SPIRAM_SPI_Write_Byte((BYTE)(Addr >> 8)); + SPIRAM_SPI_Write_Byte((BYTE)Addr); + + for (i = 0; i < Len; i++) { + *pBuf = SPIRAM_SPI_Read_Byte(0x00); + pBuf++; + } + SPIRAM_CS_1; +} + +void SPIRAM::SPIRAM_WR_Stream(WORD Addr, BYTE *pBuf, unsigned long Len) +{ + WORD i; + + // Write Addr, read data + SPIRAM_CS_0; + SPIRAM_SPI_Write_Byte(CMD_WRITE); + + SPIRAM_SPI_Write_Byte(0X00); + SPIRAM_SPI_Write_Byte((BYTE)(Addr >> 8)); + SPIRAM_SPI_Write_Byte((BYTE)Addr); + + for (i = 0; i < Len; i++) { + SPIRAM_SPI_Write_Byte(*pBuf); + pBuf++; + } + SPIRAM_CS_1; +} diff --git a/SPI_RAM.h b/SPI_RAM.h new file mode 100644 index 0000000..498287c --- /dev/null +++ b/SPI_RAM.h @@ -0,0 +1,35 @@ +#ifndef __SPI_RAM_H_ +#define __SPI_RAM_H_ + +//data +#define BYTE unsigned char +#define WORD unsigned short + +// SRAM opcodes +#define CMD_WREN 0x06 +#define CMD_WRDI 0x04 +#define CMD_RDSR 0x05 +#define CMD_WRSR 0x01 +#define CMD_READ 0x03 +#define CMD_WRITE 0x02 + +// SRAM modes +#define BYTE_MODE 0x00 +#define PAGE_MODE 0x80 +#define STREAM_MODE 0x40 + + +class SPIRAM{ +public: + void SPIRAM_SPI_Init(void); + + void SPIRAM_Set_Mode(BYTE mode); + + BYTE SPIRAM_RD_Byte(WORD Addr); + void SPIRAM_WR_Byte(WORD Addr, BYTE Data); + void SPIRAM_RD_Page(WORD Addr, BYTE *pBuf); + void SPIRAM_WR_Page(WORD Addr, BYTE *pBuf); + void SPIRAM_RD_Stream(WORD Addr, BYTE *pBuf, unsigned long Len); + void SPIRAM_WR_Stream(WORD Addr, BYTE *pBuf, unsigned long Len); +}; +#endif diff --git a/built/binary.asm b/built/binary.asm new file mode 100644 index 0000000..969593e --- /dev/null +++ b/built/binary.asm @@ -0,0 +1,1689 @@ +; Interface tables: 0/0 (NaN%) +; Virtual methods: 0 / 0 +; generated code sizes (bytes): 3048 (incl. 2290 user, 700 helpers, 14 vtables, 44 lits); src size 0 +; assembly: 2073 lines; density: 31.81 bytes/stmt; (72 stmts) +; total bytes: 221160 (91.1% of 237.0k flash with 21528 free) +; peep hole pass: 87 instructions removed and 45 updated +; peep hole pass: 4 instructions removed and 0 updated +; peep hole pass: 0 instructions removed and 0 updated + + +; start + .startaddr 0x35400 + .hex 708E3B92C615A841C49866C975EE5197 ; magic number + .hex 81901D135C738E7E ; hex template hash + .hex 823CDC229FB40FB2 ; program hash + .short 4 ; num. globals + .short 0 ; patched with number of 64 bit words resulting from assembly + .word _pxt_config_data + .short 0 ; patched with comm section size + .short 1 ; number of globals that are not pointers (they come first) + .word _pxt_iface_member_names + .word _pxt_lambda_trampoline@fn + .word _pxt_perf_counters + .word 0 ; reserved + .word 0 ; reserved + ; +; Function
test.ts:1 + ; + .section code + .balign 4 +_main___P1_Lit: + .word pxt::RefAction_vtable + .short 0, 0 ; no captured vars + .word _main___P1_args@fn +_main___P1_args: + .section code +_main___P1: +_main___P1_nochk: + @stackmark func + @stackmark args + push {lr} +.locals: + @stackmark locals +_main___P1_locals: + movs r0, #1 + ldr r7, [r6, #0] + str r0, [r7, #4] + @stackempty locals + movs r0, #3 + ldr r7, [r6, #0] + str r0, [r7, #8] + @stackempty locals + movs r0, #5 + ldr r7, [r6, #0] + str r0, [r7, #12] + @stackempty locals + mov r7, sp + str r7, [r6, #4] + bl LCD1IN8::LCD_Init + @stackempty locals + movs r0, #31 + lsls r0, r0, #11 + mov r7, sp + str r7, [r6, #4] + bl LCD1IN8::LCD_Filling + @stackempty locals + movs r0, #63 + push {r0} ; proc-arg + bl Get_Color__P451 +_proccall1: + add sp, #4*1 ; pop locals 1 + mov r3, r0 + movs r0, #3 + push {r0} ; proc-arg + movs r0, #1 + push {r0} ; proc-arg + push {r3} ; the one arg + movs r0, #41 + push {r0} ; proc-arg + movs r0, #121 + push {r0} ; proc-arg + movs r0, #161 + push {r0} ; proc-arg + bl DrawCircle__P456 +_proccall2: + add sp, #4*6 ; pop locals 6 + @stackempty locals + movs r0, #15 + lsls r0, r0, #8 + adds r0, #193 + push {r0} ; proc-arg + bl Get_Color__P451 +_proccall3: + add sp, #4*1 ; pop locals 1 + mov r3, r0 + movs r0, #9 + push {r0} ; proc-arg + movs r0, #3 + push {r0} ; proc-arg + push {r3} ; the one arg + movs r0, #17 + push {r0} ; proc-arg + movs r0, #71 + push {r0} ; proc-arg + movs r0, #41 + push {r0} ; proc-arg + bl DrawCircle__P456 +_proccall4: + add sp, #4*6 ; pop locals 6 + @stackempty locals + ldr r0, _ldlit_2 + push {r0} ; proc-arg + bl Get_Color__P451 +_proccall5: + add sp, #4*1 ; pop locals 1 + push {r0} ; the one arg + movs r0, #250 + lsls r0, r0, #8 + adds r0, #211 + push {r0} ; proc-arg + movs r0, #21 + push {r0} ; proc-arg + movs r0, #101 + push {r0} ; proc-arg + bl DisNumber__P459 +_proccall6: + add sp, #4*4 ; pop locals 4 + @stackempty locals + movs r0, #63 + push {r0} ; proc-arg + bl Get_Color__P451 +_proccall7: + add sp, #4*1 ; pop locals 1 + push {r0} ; the one arg + ldr r0, _ldlit_3 + push {r0} ; proc-arg + movs r0, #171 + push {r0} ; proc-arg + movs r0, #1 + push {r0} ; proc-arg + bl DisString__P458 +_proccall8: + add sp, #4*4 ; pop locals 4 + @stackempty locals +.ret.1: + @stackempty locals +_main___P1_end: + pop {pc} + @stackempty func + @stackempty args +; endfun + ; +; Function DisString LCD1in8.ts:234 + ; + .section code + .balign 4 + .section code +DisString__P458: +DisString__P458_nochk: + @stackmark func + @stackmark args + push {lr} +.locals: + movs r0, #0 + push {r0} ;loc + push {r0} ;loc + push {r0} ;loc + push {r0} ;loc + push {r0} ;loc + push {r0} ;loc + push {r0} ;loc + push {r0} ;loc + @stackmark locals +DisString__P458_locals: + ldr r0, [sp, args@0] + str r0, [sp, locals@0] + @stackempty locals + ldr r0, [sp, args@1] + str r0, [sp, locals@1] + @stackempty locals + movs r0, #25 + str r0, [sp, locals@2] + @stackempty locals + movs r0, #15 + str r0, [sp, locals@3] + @stackempty locals + ldr r0, [sp, args@2] + push {r0} ; proc-arg + bl _conv_0 + mov r7, sp + str r7, [r6, #4] + bl String_::length + add sp, #4*1 ; pop locals 1 + bl _numops_fromInt + str r0, [sp, locals@4] + @stackempty locals + movs r0, #1 + str r0, [sp, locals@5] + @stackempty locals + movs r0, #1 + str r0, [sp, locals@5] + @stackempty locals +.fortop.471: + ldr r0, [sp, locals@5] + ldr r1, [sp, locals@4] + bl _cmp_lt + beq .brk.471 +.jmpz9: + ldr r0, [sp, args@2] + push {r0} ; proc-arg + ldr r0, [sp, locals@5] + push {r0} ; proc-arg + bl _conv_1 + mov r7, sp + str r7, [r6, #4] + bl String_::charCodeAt + add sp, #4*2 ; pop locals 2 + movs r1, #65 + bl _numops_subs + str r0, [sp, locals@6] + @stackempty locals + ldr r0, [sp, locals@6] + push {r0} ; proc-arg + ldr r0, [sp, locals@2] + push {r0} ; proc-arg + ldr r0, [sp, #4*1] ; estack + ldr r1, [sp, #4*0] ; estack + mov r7, sp + str r7, [r6, #4] + bl numops::muls + add sp, #4*2 ; pop locals 2 + str r0, [sp, locals@7] + @stackempty locals + ldr r0, [sp, locals@0] + ldr r1, [sp, locals@3] + bl _numops_adds + movs r1, #1 + lsls r1, r1, #8 + adds r1, #65 + bl _cmp_gt + beq .else_0_2 +.jmpz10: + ldr r0, [sp, args@0] + str r0, [sp, locals@0] + @stackempty locals + ldr r0, [sp, locals@1] + ldr r1, [sp, locals@2] + bl _numops_adds + str r0, [sp, locals@1] + @stackempty locals +.else_0_2: +.afterif_1_2: + ldr r0, [sp, locals@1] + ldr r1, [sp, locals@2] + bl _numops_adds + movs r1, #1 + lsls r1, r1, #8 + adds r1, #1 + bl _cmp_gt + beq .else_2_2 +.jmpz11: + ldr r0, [sp, args@0] + str r0, [sp, locals@0] + @stackempty locals + ldr r0, [sp, args@1] + str r0, [sp, locals@1] + @stackempty locals +.else_2_2: +.afterif_3_2: + ldr r0, [sp, locals@0] + push {r0} ; proc-arg + ldr r0, [sp, locals@1] + push {r0} ; proc-arg + ldr r0, [sp, locals@7] + push {r0} ; proc-arg + ldr r0, [sp, args@3] + push {r0} ; proc-arg + bl _conv_2 + mov r7, sp + str r7, [r6, #4] + bl LCD1IN8::DisChar_1207 + add sp, #4*4 ; pop locals 4 + @stackempty locals + ldr r0, [sp, locals@0] + ldr r1, [sp, locals@3] + bl _numops_adds + str r0, [sp, locals@0] + @stackempty locals +.cont.471: + ldr r0, [sp, locals@5] + movs r1, #3 + bl _numops_adds + str r0, [sp, locals@5] + @stackempty locals + b .fortop.471 +.brk.471: +.ret.458: + @stackempty locals + add sp, #4*8 ; pop locals 8 +DisString__P458_end: + pop {pc} + @stackempty func + @stackempty args +; endfun + ; +; Function DisNumber LCD1in8.ts:269 + ; + .section code + .balign 4 + .section code +DisNumber__P459: +DisNumber__P459_nochk: + @stackmark func + @stackmark args + push {lr} +.locals: + movs r0, #0 + push {r0} ;loc + push {r0} ;loc + @stackmark locals +DisNumber__P459_locals: + ldr r0, [sp, args@0] + str r0, [sp, locals@0] + @stackempty locals + ldr r0, [sp, args@1] + str r0, [sp, locals@1] + @stackempty locals + ldr r0, [sp, args@0] + push {r0} ; proc-arg + ldr r0, [sp, args@1] + push {r0} ; proc-arg + ldr r0, [sp, args@2] + push {r0} ; proc-arg + mov r7, sp + str r7, [r6, #4] + bl String_::mkEmpty + push {r0} ; proc-arg + bl _conv_3 + mov r7, sp + str r7, [r6, #4] + bl String_::concat + add sp, #4*2 ; pop locals 2 + push {r0} ; proc-arg + pop {r1, r2, r3} + ldr r0, [sp, args@3] + push {r0} ; proc-arg + push {r1} + push {r2} + push {r3} + bl DisString__P458 +_proccall12: + add sp, #4*4 ; pop locals 4 + @stackempty locals +.ret.459: + @stackempty locals + add sp, #4*2 ; pop locals 2 +DisNumber__P459_end: + pop {pc} + @stackempty func + @stackempty args +; endfun + ; +; Function Get_Color LCD1in8.ts:65 + ; + .section code + .balign 4 + .section code +Get_Color__P451: +Get_Color__P451_nochk: + @stackmark func + @stackmark args + push {lr} +.locals: + @stackmark locals +Get_Color__P451_locals: + ldr r0, [sp, args@0] +.ret.451: + @stackempty locals +; jmp value (already in r0) +.final_0_4: +Get_Color__P451_end: + pop {pc} + @stackempty func + @stackempty args +; endfun + ; +; Function DrawCircle LCD1in8.ts:172 + ; + .section code + .balign 4 + .section code +DrawCircle__P456: +DrawCircle__P456_nochk: + @stackmark func + @stackmark args + push {lr} +.locals: + movs r0, #0 + push {r0} ;loc + push {r0} ;loc + push {r0} ;loc + push {r0} ;loc + @stackmark locals +DrawCircle__P456_locals: + movs r0, #1 + str r0, [sp, locals@0] + @stackempty locals + ldr r0, [sp, args@2] + str r0, [sp, locals@1] + @stackempty locals + ldr r0, [sp, args@2] + push {r0} ; proc-arg + movs r1, #3 + mov r7, sp + str r7, [r6, #4] + bl numops::lsls + add sp, #4*1 ; pop locals 1 + mov r1, r0 + movs r0, #7 + bl _numops_subs + str r0, [sp, locals@2] + @stackempty locals + movs r0, #1 + str r0, [sp, locals@3] + @stackempty locals + ldr r0, [sp, args@4] + movs r1, #3 + bl _cmp_eq + bne .jmpz13 + b .else_0_5 +.jmpz13: +.cont.492: + ldr r0, [sp, locals@0] + ldr r1, [sp, locals@1] + bl _cmp_le + bne .jmpz14 + b .brk.492 +.jmpz14: + ldr r0, [sp, locals@0] + str r0, [sp, locals@3] + @stackempty locals +.fortop.493: + ldr r0, [sp, locals@3] + ldr r1, [sp, locals@1] + bl _cmp_le + bne .jmpz15 + b .brk.493 +.balign 4 +_ldlit_2: + .word 127039 +_ldlit_3: + .word _str0meta +.jmpz15: + ldr r0, [sp, args@0] + ldr r1, [sp, locals@0] + bl _numops_adds + push {r0} ; proc-arg + ldr r0, [sp, args@1] + ldr r1, [sp, locals@3] + bl _numops_adds + push {r0} ; proc-arg + ldr r0, [sp, args@3] + push {r0} ; proc-arg + bl _conv_4 + movs r3, #1 + mov r7, sp + str r7, [r6, #4] + bl LCD1IN8::DrawPoint + add sp, #4*3 ; pop locals 3 + @stackempty locals + ldr r0, [sp, args@0] + ldr r1, [sp, locals@0] + bl _numops_subs + push {r0} ; proc-arg + ldr r0, [sp, args@1] + ldr r1, [sp, locals@3] + bl _numops_adds + push {r0} ; proc-arg + ldr r0, [sp, args@3] + push {r0} ; proc-arg + bl _conv_4 + movs r3, #1 + mov r7, sp + str r7, [r6, #4] + bl LCD1IN8::DrawPoint + add sp, #4*3 ; pop locals 3 + @stackempty locals + ldr r0, [sp, args@0] + ldr r1, [sp, locals@3] + bl _numops_subs + push {r0} ; proc-arg + ldr r0, [sp, args@1] + ldr r1, [sp, locals@0] + bl _numops_adds + push {r0} ; proc-arg + ldr r0, [sp, args@3] + push {r0} ; proc-arg + bl _conv_4 + movs r3, #1 + mov r7, sp + str r7, [r6, #4] + bl LCD1IN8::DrawPoint + add sp, #4*3 ; pop locals 3 + @stackempty locals + ldr r0, [sp, args@0] + ldr r1, [sp, locals@3] + bl _numops_subs + push {r0} ; proc-arg + ldr r0, [sp, args@1] + ldr r1, [sp, locals@0] + bl _numops_subs + push {r0} ; proc-arg + ldr r0, [sp, args@3] + push {r0} ; proc-arg + bl _conv_4 + movs r3, #1 + mov r7, sp + str r7, [r6, #4] + bl LCD1IN8::DrawPoint + add sp, #4*3 ; pop locals 3 + @stackempty locals + ldr r0, [sp, args@0] + ldr r1, [sp, locals@0] + bl _numops_subs + push {r0} ; proc-arg + ldr r0, [sp, args@1] + ldr r1, [sp, locals@3] + bl _numops_subs + push {r0} ; proc-arg + ldr r0, [sp, args@3] + push {r0} ; proc-arg + bl _conv_4 + movs r3, #1 + mov r7, sp + str r7, [r6, #4] + bl LCD1IN8::DrawPoint + add sp, #4*3 ; pop locals 3 + @stackempty locals + ldr r0, [sp, args@0] + ldr r1, [sp, locals@0] + bl _numops_adds + push {r0} ; proc-arg + ldr r0, [sp, args@1] + ldr r1, [sp, locals@3] + bl _numops_subs + push {r0} ; proc-arg + ldr r0, [sp, args@3] + push {r0} ; proc-arg + bl _conv_4 + movs r3, #1 + mov r7, sp + str r7, [r6, #4] + bl LCD1IN8::DrawPoint + add sp, #4*3 ; pop locals 3 + @stackempty locals + ldr r0, [sp, args@0] + ldr r1, [sp, locals@3] + bl _numops_adds + push {r0} ; proc-arg + ldr r0, [sp, args@1] + ldr r1, [sp, locals@0] + bl _numops_subs + push {r0} ; proc-arg + ldr r0, [sp, args@3] + push {r0} ; proc-arg + bl _conv_4 + movs r3, #1 + mov r7, sp + str r7, [r6, #4] + bl LCD1IN8::DrawPoint + add sp, #4*3 ; pop locals 3 + @stackempty locals + ldr r0, [sp, args@0] + ldr r1, [sp, locals@3] + bl _numops_adds + push {r0} ; proc-arg + ldr r0, [sp, args@1] + ldr r1, [sp, locals@0] + bl _numops_adds + push {r0} ; proc-arg + ldr r0, [sp, args@3] + push {r0} ; proc-arg + bl _conv_4 + movs r3, #1 + mov r7, sp + str r7, [r6, #4] + bl LCD1IN8::DrawPoint + add sp, #4*3 ; pop locals 3 + @stackempty locals +.cont.493: + ldr r0, [sp, locals@3] + movs r1, #3 + bl _numops_adds + str r0, [sp, locals@3] + @stackempty locals + b .fortop.493 +.brk.493: + ldr r0, [sp, locals@2] + movs r1, #1 + bl _cmp_lt + beq .else_1_5 +.jmpz16: + ldr r0, [sp, locals@2] + push {r0} ; proc-arg + ldr r0, [sp, locals@0] + push {r0} ; proc-arg + ldr r1, [sp, #4*0] ; estack + movs r0, #9 + mov r7, sp + str r7, [r6, #4] + bl numops::muls + add sp, #4*1 ; pop locals 1 + movs r1, #13 + bl _numops_adds + push {r0} ; proc-arg + ldr r0, [sp, #4*1] ; estack + ldr r1, [sp, #4*0] ; estack + bl _numops_adds + add sp, #4*2 ; pop locals 2 + str r0, [sp, locals@2] + @stackempty locals + b .afterif_2_5 +.else_1_5: + ldr r0, [sp, locals@2] + push {r0} ; proc-arg + ldr r0, [sp, locals@0] + ldr r1, [sp, locals@1] + bl _numops_subs + push {r0} ; proc-arg + ldr r1, [sp, #4*0] ; estack + movs r0, #9 + mov r7, sp + str r7, [r6, #4] + bl numops::muls + add sp, #4*1 ; pop locals 1 + mov r1, r0 + movs r0, #21 + bl _numops_adds + push {r0} ; proc-arg + ldr r0, [sp, #4*1] ; estack + ldr r1, [sp, #4*0] ; estack + bl _numops_adds + add sp, #4*2 ; pop locals 2 + str r0, [sp, locals@2] + @stackempty locals + ldr r0, [sp, locals@1] + movs r1, #3 + bl _numops_subs + str r0, [sp, locals@1] + @stackempty locals +.afterif_2_5: + ldr r0, [sp, locals@0] + movs r1, #3 + bl _numops_adds + str r0, [sp, locals@0] + @stackempty locals + b .cont.492 +.brk.492: + b .afterif_3_5 +.else_0_5: +.cont.494: + ldr r0, [sp, locals@0] + ldr r1, [sp, locals@1] + bl _cmp_le + bne .jmpz17 + b .brk.494 +.jmpz17: + ldr r0, [sp, args@0] + ldr r1, [sp, locals@0] + bl _numops_adds + push {r0} ; proc-arg + ldr r0, [sp, args@1] + ldr r1, [sp, locals@1] + bl _numops_adds + push {r0} ; proc-arg + ldr r0, [sp, args@3] + push {r0} ; proc-arg + ldr r0, [sp, args@5] + push {r0} ; proc-arg + bl _conv_2 + mov r7, sp + str r7, [r6, #4] + bl LCD1IN8::DrawPoint + add sp, #4*4 ; pop locals 4 + @stackempty locals + ldr r0, [sp, args@0] + ldr r1, [sp, locals@0] + bl _numops_subs + push {r0} ; proc-arg + ldr r0, [sp, args@1] + ldr r1, [sp, locals@1] + bl _numops_adds + push {r0} ; proc-arg + ldr r0, [sp, args@3] + push {r0} ; proc-arg + ldr r0, [sp, args@5] + push {r0} ; proc-arg + bl _conv_2 + mov r7, sp + str r7, [r6, #4] + bl LCD1IN8::DrawPoint + add sp, #4*4 ; pop locals 4 + @stackempty locals + ldr r0, [sp, args@0] + ldr r1, [sp, locals@1] + bl _numops_subs + push {r0} ; proc-arg + ldr r0, [sp, args@1] + ldr r1, [sp, locals@0] + bl _numops_adds + push {r0} ; proc-arg + ldr r0, [sp, args@3] + push {r0} ; proc-arg + ldr r0, [sp, args@5] + push {r0} ; proc-arg + bl _conv_2 + mov r7, sp + str r7, [r6, #4] + bl LCD1IN8::DrawPoint + add sp, #4*4 ; pop locals 4 + @stackempty locals + ldr r0, [sp, args@0] + ldr r1, [sp, locals@1] + bl _numops_subs + push {r0} ; proc-arg + ldr r0, [sp, args@1] + ldr r1, [sp, locals@0] + bl _numops_subs + push {r0} ; proc-arg + ldr r0, [sp, args@3] + push {r0} ; proc-arg + ldr r0, [sp, args@5] + push {r0} ; proc-arg + bl _conv_2 + mov r7, sp + str r7, [r6, #4] + bl LCD1IN8::DrawPoint + add sp, #4*4 ; pop locals 4 + @stackempty locals + ldr r0, [sp, args@0] + ldr r1, [sp, locals@0] + bl _numops_subs + push {r0} ; proc-arg + ldr r0, [sp, args@1] + ldr r1, [sp, locals@1] + bl _numops_subs + push {r0} ; proc-arg + ldr r0, [sp, args@3] + push {r0} ; proc-arg + ldr r0, [sp, args@5] + push {r0} ; proc-arg + bl _conv_2 + mov r7, sp + str r7, [r6, #4] + bl LCD1IN8::DrawPoint + add sp, #4*4 ; pop locals 4 + @stackempty locals + ldr r0, [sp, args@0] + ldr r1, [sp, locals@0] + bl _numops_adds + push {r0} ; proc-arg + ldr r0, [sp, args@1] + ldr r1, [sp, locals@1] + bl _numops_subs + push {r0} ; proc-arg + ldr r0, [sp, args@3] + push {r0} ; proc-arg + ldr r0, [sp, args@5] + push {r0} ; proc-arg + bl _conv_2 + mov r7, sp + str r7, [r6, #4] + bl LCD1IN8::DrawPoint + add sp, #4*4 ; pop locals 4 + @stackempty locals + ldr r0, [sp, args@0] + ldr r1, [sp, locals@1] + bl _numops_adds + push {r0} ; proc-arg + ldr r0, [sp, args@1] + ldr r1, [sp, locals@0] + bl _numops_subs + push {r0} ; proc-arg + ldr r0, [sp, args@3] + push {r0} ; proc-arg + ldr r0, [sp, args@5] + push {r0} ; proc-arg + bl _conv_2 + mov r7, sp + str r7, [r6, #4] + bl LCD1IN8::DrawPoint + add sp, #4*4 ; pop locals 4 + @stackempty locals + ldr r0, [sp, args@0] + ldr r1, [sp, locals@1] + bl _numops_adds + push {r0} ; proc-arg + ldr r0, [sp, args@1] + ldr r1, [sp, locals@0] + bl _numops_adds + push {r0} ; proc-arg + ldr r0, [sp, args@3] + push {r0} ; proc-arg + ldr r0, [sp, args@5] + push {r0} ; proc-arg + bl _conv_2 + mov r7, sp + str r7, [r6, #4] + bl LCD1IN8::DrawPoint + add sp, #4*4 ; pop locals 4 + @stackempty locals + ldr r0, [sp, locals@2] + movs r1, #1 + bl _cmp_lt + beq .else_4_5 +.jmpz18: + ldr r0, [sp, locals@2] + push {r0} ; proc-arg + ldr r0, [sp, locals@0] + push {r0} ; proc-arg + ldr r1, [sp, #4*0] ; estack + movs r0, #9 + mov r7, sp + str r7, [r6, #4] + bl numops::muls + add sp, #4*1 ; pop locals 1 + movs r1, #13 + bl _numops_adds + push {r0} ; proc-arg + ldr r0, [sp, #4*1] ; estack + ldr r1, [sp, #4*0] ; estack + bl _numops_adds + add sp, #4*2 ; pop locals 2 + str r0, [sp, locals@2] + @stackempty locals + b .afterif_5_5 +.else_4_5: + ldr r0, [sp, locals@2] + push {r0} ; proc-arg + ldr r0, [sp, locals@0] + ldr r1, [sp, locals@1] + bl _numops_subs + push {r0} ; proc-arg + ldr r1, [sp, #4*0] ; estack + movs r0, #9 + mov r7, sp + str r7, [r6, #4] + bl numops::muls + add sp, #4*1 ; pop locals 1 + mov r1, r0 + movs r0, #21 + bl _numops_adds + push {r0} ; proc-arg + ldr r0, [sp, #4*1] ; estack + ldr r1, [sp, #4*0] ; estack + bl _numops_adds + add sp, #4*2 ; pop locals 2 + str r0, [sp, locals@2] + @stackempty locals + ldr r0, [sp, locals@1] + movs r1, #3 + bl _numops_subs + str r0, [sp, locals@1] + @stackempty locals +.afterif_5_5: + ldr r0, [sp, locals@0] + movs r1, #3 + bl _numops_adds + str r0, [sp, locals@0] + @stackempty locals + b .cont.494 +.brk.494: +.afterif_3_5: +.ret.456: + @stackempty locals + add sp, #4*4 ; pop locals 4 +DrawCircle__P456_end: + pop {pc} + @stackempty func + @stackempty args +; endfun + .section code +_pxt_lambda_trampoline: + push { r4, r5, r6, r7, lr} + mov r4, r1 + mov r5, r2 + mov r6, r3 + mov r7, r0 + bl _inst_builtin4_validate_5 + mov r0, sp + push {r4, r5, r6, r7} ; push args and the lambda + mov r1, sp + bl pxt::pushThreadContext + ;bl pxtrt::getGlobalsPtr + mov r6, r0 ; save ctx or globals + mov r5, r7 ; save lambda for closure + ;mov r0, r7 + ;bl _pxt_incr ; make sure lambda stays alive + ldr r0, [r5, #8] ; ld fnptr + movs r4, #3 ; 3 args + blx r0 ; execute the actual lambda + mov r7, r0 ; save result + @dummystack 4 + add sp, #4*4 ; remove arguments and lambda + ;mov r0, r5 ; decrement lambda + ;bl _pxt_decr + mov r0, r6 ; or pop the thread context + bl pxt::popThreadContext + mov r0, r7 ; restore result + pop { r4, r5, r6, r7, pc} + .section code +_pxt_stringConv: + lsls r2, r0, #30 + bne .fail + cmp r0, #0 + beq .fail + ldr r3, [r0, #0] +; vtable in R3 + ldrh r2, [r3, #8] + cmp r2, #1 + bne .notstring + bx lr +.notstring: + ldr r7, [r3, #4*8] + cmp r7, #0 + beq .fail + push {r0, lr} + ;bl _pxt_incr + movs r4, #1 + blx r7 + str r0, [sp, #0] + ;mov r7, r0 + ;pop {r0} + ;bl _pxt_decr + ;mov r0, r7 + ;push {r7} + b .numops +.fail: + push {r0, lr} +.numops: + mov r7, sp + str r7, [r6, #4] + bl numops::toString + pop {r1, pc} + ;mov r7, r0 + ;pop {r0} + ;bl _pxt_decr + ;mov r0, r7 + .section code +_pxt_buffer_get: + lsls r4, r0, #30 + bne .fail + cmp r0, #0 + beq .fail + ldr r3, [r0, #0] +; vtable in R3 + ldrh r4, [r3, #8] + cmp r4, #3 + bne .fail + asrs r1, r1, #1 + bcc .notint + ldr r4, [r0, #4] + cmp r1, r4 + bhs .oob + adds r4, r0, r1 + ldrb r0, [r4, #8] + lsls r0, r0, #1 + adds r0, #1 + bx lr +.notint: + lsls r1, r1, #1 + push {lr, r0, r2} + mov r0, r1 + mov r7, sp + str r7, [r6, #4] + bl pxt::toInt + mov r1, r0 + pop {r0, r2} +.doop: + mov r7, sp + str r7, [r6, #4] + bl Array_::getAt + lsls r0, r0, #1 + adds r0, #1 + pop {pc} +.fail: + bl pxt::failedCast +.oob: + movs r0, #1 ; 0 or undefined + bx lr + .section code +_pxt_array_get: + lsls r4, r0, #30 + bne .fail + cmp r0, #0 + beq .fail + ldr r3, [r0, #0] +; vtable in R3 + ldrh r4, [r3, #8] + cmp r4, #6 + bne .fail + asrs r1, r1, #1 + bcc .notint + ldrh r4, [r0, #8] + cmp r1, r4 + bhs .oob + lsls r1, r1, #2 + ldr r4, [r0, #4] + ldr r0, [r4, r1] + bx lr +.notint: + lsls r1, r1, #1 + push {lr, r0, r2} + mov r0, r1 + mov r7, sp + str r7, [r6, #4] + bl pxt::toInt + mov r1, r0 + pop {r0, r2} +.doop: + mov r7, sp + str r7, [r6, #4] + bl Array_::getAt + pop {pc} +.fail: + bl pxt::failedCast +.oob: + movs r0, #0 ; 0 or undefined + bx lr + .section code +_pxt_buffer_set: + lsls r4, r0, #30 + bne .fail + cmp r0, #0 + beq .fail + ldr r3, [r0, #0] +; vtable in R3 + ldrh r4, [r3, #8] + cmp r4, #3 + bne .fail + asrs r1, r1, #1 + bcc .notint + ldr r4, [r0, #4] + cmp r1, r4 + bhs .oob + adds r4, r0, r1 + strb r2, [r4, #8] + bx lr +.notint: + lsls r1, r1, #1 + push {lr, r0, r2} + mov r0, r1 + mov r7, sp + str r7, [r6, #4] + bl pxt::toInt + mov r1, r0 + pop {r0, r2} +.doop: + mov r7, sp + str r7, [r6, #4] + bl Array_::setAt + pop {pc} +.fail: + bl pxt::failedCast +.oob: + push {lr} + b .doop + .section code +_pxt_array_set: + lsls r4, r0, #30 + bne .fail + cmp r0, #0 + beq .fail + ldr r3, [r0, #0] +; vtable in R3 + ldrh r4, [r3, #8] + cmp r4, #6 + bne .fail + asrs r1, r1, #1 + bcc .notint + ldrh r4, [r0, #8] + cmp r1, r4 + bhs .oob + lsls r1, r1, #2 + ldr r4, [r0, #4] + str r2, [r4, r1] + bx lr +.notint: + lsls r1, r1, #1 + push {lr, r0, r2} + mov r0, r1 + mov r7, sp + str r7, [r6, #4] + bl pxt::toInt + mov r1, r0 + pop {r0, r2} +.doop: + mov r7, sp + str r7, [r6, #4] + bl Array_::setAt + pop {pc} +.fail: + bl pxt::failedCast +.oob: + push {lr} + b .doop + .section code +_pxt_map_get: + lsls r4, r0, #30 + bne .fail + cmp r0, #0 + beq .fail + ldr r3, [r0, #0] +; vtable in R3 + ldrh r4, [r3, #8] + cmp r4, #8 + bne .notmap + push {lr} + mov r7, sp + str r7, [r6, #4] + bl pxtrt::mapGetByString + pop {pc} +.notmap: + mov r4, r3 ; save VT + push {r0, lr} + mov r0, r1 + bl pxtrt::lookupMapKey + mov r1, r0 ; put key index in r1 + ldr r0, [sp, #0] ; restore obj pointer + mov r3, r4 ; restore vt + bl .dowork + add sp, #4*1 ; pop locals 1 + pop {pc} +.dowork: + ldr r2, [r3, #12] ; load mult + movs r7, r2 + beq .objlit ; built-in types have mult=0 + muls r7, r1 + lsrs r7, r2 + lsls r7, r7, #1 ; r7 - hash offset + ldr r3, [r3, #4] ; iface table + adds r3, r3, r7 +; r0-this, r1-method idx, r2-free, r3-hash entry, r4-num args, r7-free + ldrh r2, [r3, #0] ; r2-offset of descriptor + ldrh r7, [r2, r3] ; r7-method idx + cmp r7, r1 + beq .hit + adds r3, #2 + ldrh r2, [r3, #0] ; r2-offset of descriptor + ldrh r7, [r2, r3] ; r7-method idx + cmp r7, r1 + beq .hit + adds r3, #2 + ldrh r2, [r3, #0] ; r2-offset of descriptor + ldrh r7, [r2, r3] ; r7-method idx + cmp r7, r1 + beq .hit + movs r0, #0 ; undefined + bx lr +.hit: + adds r3, r3, r2 ; r3-descriptor + ldr r2, [r3, #4] + lsls r7, r2, #31 + beq .field + movs r4, #1 + bx r2 +.field: + ldr r0, [r0, r2] ; load field + bx lr +.objlit: +.fail: + mov r7, sp + str r7, [r6, #4] + bl pxt::failedCast +.fail2: + mov r7, sp + str r7, [r6, #4] + bl pxt::missingProperty + .section code +_pxt_map_set: + lsls r4, r0, #30 + bne .fail + cmp r0, #0 + beq .fail + ldr r3, [r0, #0] +; vtable in R3 + ldrh r4, [r3, #8] + cmp r4, #8 + bne .notmap + push {lr} + mov r7, sp + str r7, [r6, #4] + bl pxtrt::mapSetByString + pop {pc} +.notmap: + mov r4, r3 ; save VT + push {r0, r2, lr} + mov r0, r1 + bl pxtrt::lookupMapKey + mov r1, r0 ; put key index in r1 + ldr r0, [sp, #0] ; restore obj pointer + mov r3, r4 ; restore vt + bl .dowork + add sp, #4*2 ; pop locals 2 + pop {pc} +.dowork: + ldr r2, [r3, #12] ; load mult + movs r7, r2 + beq .objlit ; built-in types have mult=0 + muls r7, r1 + lsrs r7, r2 + lsls r7, r7, #1 ; r7 - hash offset + ldr r3, [r3, #4] ; iface table + adds r3, r3, r7 +; r0-this, r1-method idx, r2-free, r3-hash entry, r4-num args, r7-free + ldrh r2, [r3, #0] ; r2-offset of descriptor + ldrh r7, [r2, r3] ; r7-method idx + cmp r7, r1 + beq .hit + adds r3, #2 + ldrh r2, [r3, #0] ; r2-offset of descriptor + ldrh r7, [r2, r3] ; r7-method idx + cmp r7, r1 + beq .hit + adds r3, #2 + ldrh r2, [r3, #0] ; r2-offset of descriptor + ldrh r7, [r2, r3] ; r7-method idx + cmp r7, r1 + bne .fail2 +.hit: + adds r3, r3, r2 ; r3-descriptor + ldr r2, [r3, #4] + lsls r7, r2, #31 + beq .field +; check for next descriptor + ldrh r7, [r3, #8] + cmp r7, r1 + bne .fail2 ; no setter! + ldr r2, [r3, #12] + movs r4, #2 + bx r2 +.field: + ldr r3, [sp, #4] ; ld-val + str r3, [r0, r2] ; store field + bx lr +.objlit: +.fail: + mov r7, sp + str r7, [r6, #4] + bl pxt::failedCast +.fail2: + mov r7, sp + str r7, [r6, #4] + bl pxt::missingProperty +_code_end: + .section code +_conv_0: + @stackmark args + push {lr} + ldr r0, [sp, #4*1] ; estack + bl _pxt_stringConv + str r0, [sp, #4*1] ; estack + pop {pc} + @stackempty args + .section code +_conv_1: + @stackmark args + push {lr} + ldr r0, [sp, #4*2] ; estack + bl _pxt_stringConv + str r0, [sp, #4*2] ; estack + push {r0} + ldr r0, [sp, #4*2] ; estack + asrs r0, r0, #1 + bcs .isint2 + lsls r0, r0, #1 + bl _numops_toInt +.isint2: + mov r1, r0 + pop {r0, pc} + @stackempty args + .section code +_conv_2: + @stackmark args + push {lr} + ldr r0, [sp, #4*4] ; estack + asrs r0, r0, #1 + bcs .isint1 + lsls r0, r0, #1 + bl _numops_toInt +.isint1: + push {r0} + ldr r0, [sp, #4*4] ; estack + asrs r0, r0, #1 + bcs .isint2 + lsls r0, r0, #1 + bl _numops_toInt +.isint2: + push {r0} + ldr r0, [sp, #4*4] ; estack + asrs r0, r0, #1 + bcs .isint3 + lsls r0, r0, #1 + bl _numops_toInt +.isint3: + push {r0} + ldr r0, [sp, #4*4] ; estack + asrs r0, r0, #1 + bcs .isint4 + lsls r0, r0, #1 + bl _numops_toInt +.isint4: + mov r3, r0 + pop {r2} + pop {r1} + pop {r0, pc} + @stackempty args + .section code +_conv_3: + @stackmark args + push {lr} + ldr r0, [sp, #4*2] ; estack + bl _pxt_stringConv + str r0, [sp, #4*2] ; estack + ldr r1, [sp, #4*1] ; estack + pop {pc} + @stackempty args + .section code +_conv_4: + @stackmark args + push {lr} + ldr r0, [sp, #4*3] ; estack + asrs r0, r0, #1 + bcs .isint1 + lsls r0, r0, #1 + bl _numops_toInt +.isint1: + push {r0} + ldr r0, [sp, #4*3] ; estack + asrs r0, r0, #1 + bcs .isint2 + lsls r0, r0, #1 + bl _numops_toInt +.isint2: + push {r0} + ldr r0, [sp, #4*3] ; estack + asrs r0, r0, #1 + bcs .isint3 + lsls r0, r0, #1 + bl _numops_toInt +.isint3: + mov r2, r0 + pop {r1} + pop {r0, pc} + @stackempty args + .section code +_inst_builtin4_validate_5: + lsls r2, r0, #30 + bne .fail + cmp r0, #0 + beq .fail + ldr r3, [r0, #0] +; vtable in R3 + ldrh r2, [r3, #8] + cmp r2, #4 + bne .fail + bx lr +.fail: + mov r7, sp + str r7, [r6, #4] + bl pxt::failedCast +_numops_adds: + @scope _numops_adds + lsls r2, r0, #31 + beq .boxed + lsls r2, r1, #31 + beq .boxed + subs r2, r1, #1 + adds r2, r0, r2 + bvs .boxed + movs r0, r2 + blx lr +.boxed: + push {lr, r0, r1} + mov r7, sp + str r7, [r6, #4] + bl numops::adds + add sp, #8 + pop {pc} +_numops_subs: + @scope _numops_subs + lsls r2, r0, #31 + beq .boxed + lsls r2, r1, #31 + beq .boxed + subs r2, r1, #1 + subs r2, r0, r2 + bvs .boxed + movs r0, r2 + blx lr +.boxed: + push {lr, r0, r1} + mov r7, sp + str r7, [r6, #4] + bl numops::subs + add sp, #8 + pop {pc} +_numops_ands: + @scope _numops_ands + lsls r2, r0, #31 + beq .boxed + lsls r2, r1, #31 + beq .boxed + ands r0, r1 + blx lr +.boxed: + push {lr, r0, r1} + mov r7, sp + str r7, [r6, #4] + bl numops::ands + add sp, #8 + pop {pc} +_numops_orrs: + @scope _numops_orrs + lsls r2, r0, #31 + beq .boxed + lsls r2, r1, #31 + beq .boxed + orrs r0, r1 + blx lr +.boxed: + push {lr, r0, r1} + mov r7, sp + str r7, [r6, #4] + bl numops::orrs + add sp, #8 + pop {pc} +_numops_eors: + @scope _numops_eors + lsls r2, r0, #31 + beq .boxed + lsls r2, r1, #31 + beq .boxed + eors r0, r1 + adds r0, r0, #1 + blx lr +.boxed: + push {lr, r0, r1} + mov r7, sp + str r7, [r6, #4] + bl numops::eors + add sp, #8 + pop {pc} +@scope _numops_toInt +_numops_toInt: + asrs r0, r0, #1 + bcc .over + blx lr +.over: + lsls r0, r0, #1 + push {lr} +mov r7, sp + str r7, [r6, #4] +bl pxt::toInt +pop {pc} +_numops_fromInt: + lsls r2, r0, #1 + asrs r1, r2, #1 + cmp r0, r1 + bne .over2 + adds r0, r2, #1 + blx lr +.over2: + push {lr} +mov r7, sp + str r7, [r6, #4] +bl pxt::fromInt +pop {pc} +.section code +_cmp_lt: + lsls r2, r0, #31 + beq .boxed + lsls r2, r1, #31 + beq .boxed + subs r0, r1 + blt .true +.false: + movs r0, #0 + bx lr +.true: + movs r0, #1 + bx lr +.boxed: + push {lr, r0, r1} + mov r7, sp + str r7, [r6, #4] + bl numops::lt + bl numops::toBoolDecr + cmp r0, #0 + add sp, #8 + pop {pc} +.section code +_cmp_gt: + lsls r2, r0, #31 + beq .boxed + lsls r2, r1, #31 + beq .boxed + subs r0, r1 + bgt .true +.false: + movs r0, #0 + bx lr +.true: + movs r0, #1 + bx lr +.boxed: + push {lr, r0, r1} + mov r7, sp + str r7, [r6, #4] + bl numops::gt + bl numops::toBoolDecr + cmp r0, #0 + add sp, #8 + pop {pc} +.section code +_cmp_le: + lsls r2, r0, #31 + beq .boxed + lsls r2, r1, #31 + beq .boxed + subs r0, r1 + ble .true +.false: + movs r0, #0 + bx lr +.true: + movs r0, #1 + bx lr +.boxed: + push {lr, r0, r1} + mov r7, sp + str r7, [r6, #4] + bl numops::le + bl numops::toBoolDecr + cmp r0, #0 + add sp, #8 + pop {pc} +.section code +_cmp_ge: + lsls r2, r0, #31 + beq .boxed + lsls r2, r1, #31 + beq .boxed + subs r0, r1 + bge .true +.false: + movs r0, #0 + bx lr +.true: + movs r0, #1 + bx lr +.boxed: + push {lr, r0, r1} + mov r7, sp + str r7, [r6, #4] + bl numops::ge + bl numops::toBoolDecr + cmp r0, #0 + add sp, #8 + pop {pc} +.section code +_cmp_eq: + lsls r2, r0, #31 + beq .boxed + lsls r2, r1, #31 + beq .boxed + subs r0, r1 + beq .true +.false: + movs r0, #0 + bx lr +.true: + movs r0, #1 + bx lr +.boxed: + push {lr, r0, r1} + mov r7, sp + str r7, [r6, #4] + bl numops::eq + bl numops::toBoolDecr + cmp r0, #0 + add sp, #8 + pop {pc} +.section code +_cmp_eqq: + lsls r2, r0, #31 + beq .boxed + lsls r2, r1, #31 + beq .boxed + subs r0, r1 + beq .true +.false: + movs r0, #0 + bx lr +.true: + movs r0, #1 + bx lr +.boxed: + push {lr, r0, r1} + mov r7, sp + str r7, [r6, #4] + bl numops::eqq + bl numops::toBoolDecr + cmp r0, #0 + add sp, #8 + pop {pc} +.section code +_cmp_neq: + lsls r2, r0, #31 + beq .boxed + lsls r2, r1, #31 + beq .boxed + subs r0, r1 + bne .true +.false: + movs r0, #0 + bx lr +.true: + movs r0, #1 + bx lr +.boxed: + push {lr, r0, r1} + mov r7, sp + str r7, [r6, #4] + bl numops::neq + bl numops::toBoolDecr + cmp r0, #0 + add sp, #8 + pop {pc} +.section code +_cmp_neqq: + lsls r2, r0, #31 + beq .boxed + lsls r2, r1, #31 + beq .boxed + subs r0, r1 + bne .true +.false: + movs r0, #0 + bx lr +.true: + movs r0, #1 + bx lr +.boxed: + push {lr, r0, r1} + mov r7, sp + str r7, [r6, #4] + bl numops::neqq + bl numops::toBoolDecr + cmp r0, #0 + add sp, #8 + pop {pc} +_helpers_end: +.balign 4 +_pxt_iface_member_names: + .word 1 + .word _str19meta ; 0 . + .word 0 +_vtables_end: +.balign 4 +_pxt_config_data: + .word 0 +.balign 4 +_str19meta: + .word pxt::string_inline_ascii_vt + .short 0 +_str19: + .string "" +.balign 4 +_str0meta: + .word pxt::string_inline_ascii_vt + .short 21 +_str0: + .string "Welcome to Mcufriend " +.balign 4 +.section code +_pxt_perf_counters: + .word 0 +_literals_end: diff --git a/built/binary.hex b/built/binary.hex new file mode 100644 index 0000000..d0baa0b --- /dev/null +++ b/built/binary.hex @@ -0,0 +1,14802 @@ +:020000040000FA +:10000000C0070000D1060000D1000000B1060000CA +:1000100000000000000000000000000000000000E0 +:100020000000000000000000000000005107000078 +:100030000000000000000000DB000000E500000000 +:10004000EF000000F9000000030100000D010000B6 +:1000500017010000210100002B0100003501000004 +:100060003F01000049010000530100005D01000054 +:1000700067010000710100007B01000085010000A4 +:100080008F01000099010000A3010000AD010000F4 +:10009000B7010000C1010000CB010000D501000044 +:1000A000DF010000E9010000F3010000FD01000094 +:1000B00007020000110200001B02000025020000E0 +:1000C0001FB5C046C04600F0EFFA04B00FB41FBD24 +:1000D00008205A49096809580847382057490968CB +:1000E000095808473C2055490968095808474020E5 +:1000F0005249096809580847442050490968095875 +:10010000084748204D490968095808474C204B4981 +:10011000096809580847502048490968095808479C +:100120005420464909680958084758204349096836 +:10013000095808475C204149096809580847602068 +:100140003E4909680958084764203C49096809582C +:100150000847682039490968095808476C20374919 +:100160000968095808477020344909680958084740 +:100170007420324909680958084778202F490968CE +:10018000095808477C202D490968095808478020EC +:100190002A490968095808478420284909680958E4 +:1001A0000847882025490968095808478C202349B1 +:1001B00009680958084790202049096809580847E4 +:1001C00094201E4909680958084798201B49096866 +:1001D000095808479C201949096809580847A02070 +:1001E0001649096809580847A4201449096809589C +:1001F0000847A8201149096809580847AC200F4949 +:10020000096809580847B0200C4909680958084787 +:10021000B4200A49096809580847B82007490968FD +:1002200009580847BC2005490968095808470000D3 +:1002300003480449024A034B7047000000000020B5 +:10024000C0070000C00700000122D84B5A6000BF61 +:10025000D74A1268002AFBD0016000BFD44A126856 +:10026000002AFBD00022D14B5A6000BFD04A12684E +:10027000002AFBD07047F0B505460E46174600240D +:1002800006E0A200B158A2005019FFF7DDFF641C80 +:10029000BC42F6D30020F0BD0120C043C549086030 +:1002A000401048607047014601229204086890425D +:1002B00001D9102070470020FCE7F0B505460C4638 +:1002C0001646002706E028462168FFF7BDFF2D1DD2 +:1002D000241D7F1CB742F6D3F0BD70B505460C4611 +:1002E0002E460BE0304600F075F9FF2C01D80024B3 +:1002F00001E0FF3C013C012080023618002CF1D1C6 +:1003000070BD0146012292044868904201D909203B +:100310007047A9484069401C01D10F20F8E7002030 +:10032000F6E7FEB504462068030000F037FA05043E +:100330002B4249598B00201DFFF7E3FF0546002D96 +:1003400001D02846FEBDFFF7A7FF0120C00200F044 +:1003500041F9042221469948FFF78DFF002801D07A +:100360000320EFE708222146944800F06DF90028A9 +:1003700006D1002192480068FFF766FF00F00CF9F3 +:100380000320DFE7A768E6686068019031463846D9 +:10039000FFF7A3FF324638460199FFF78EFFB20000 +:1003A0003846019900F050F9002800D1CAE703202F +:1003B000C8E700F0E3F9834800688349086041E03A +:1003C00060680190E668A0680090B200009901980A +:1003D00000F03AF90746002F00D1B3E70E20B1E74D +:1003E000201DFFF760FF0546002D01D02846A9E734 +:1003F0006068002807D1FFF74FFF0320800200F05C +:10040000E9F800F0C9F8FFF747FF0120C00200F04B +:10041000E1F8042221466948FFF72DFF002801D0AA +:1004200003208FE708222146644800F00DF90028D8 +:1004300006D1002162480068FFF706FF00F0ACF823 +:1004400003207FE700BF00207CE770B505460C461F +:10045000182D04D12068FFF764FF206002E001201E +:10046000206000BF00BF70BDF0B589B05248406940 +:1004700003905248806881000398081802900398FE +:10048000000B01900121090302984018401E000B47 +:1004900000900124002520462946019A00F0C4F866 +:1004A0000022401E91410791069001260027304608 +:1004B0003946009A00F0B8F80022401E914105919B +:1004C0000490049BDB43059AD2430698184307998E +:1004D00011430791069037490698086007984860CD +:1004E00009B0F0BD70B53448446934488568466841 +:1004F000AA003146204600F0A7F8002801D00020CD +:1005000070BD0120FCE72D484068002801D0012083 +:1005100000E000200546FFF7E5FF002807D0FFF7C1 +:10052000BBFE0320800200F055F800F035F8FFF71D +:100530009BFF002D0ED020484669204884684768FC +:1005400021463046FFF7C9FE224639463046FFF7BE +:10055000B4FE00BF00F020F810B5184844681A48EF +:100560000460204600F0DCF810BD15480068006803 +:10057000401C01D100BFFEE710480068002802D0EF +:10058000042806D101E0FFF7BEFFFFF7E5FF00BF3B +:10059000FEE700BF00BFFEE7BFF34F8F0B480C49DB +:1005A000C860BFF34F8F00BFFEE7000000E50140C9 +:1005B00000E40140000600400010001000080000A8 +:1005C000B8070000BC070000000000200400FA0586 +:1005D00000ED00E010B50146104B1A6808460223F2 +:1005E0000F4C636000BF0F4B1B68002BFBD0531CEC +:1005F00004D0904202D20A4B186101E0084B986087 +:1006000000BF084B1B68002BFBD00023044C636029 +:1006100000BF044B1B68002BFBD010BD0010001066 +:1006200000E5014000E4014010B5202A04DB01464A +:10063000203A9140002010BD914020239C1A03468F +:10064000E3401943904010BD034610B50B439B0790 +:100650000FD1042A0DD308C810C9121FA342F8D025 +:1006600018BA21BA884201D9012010BD0020C04328 +:1006700010BD002A03D0D30703D0521C07E000208E +:1006800010BD03780C78401C491C1B1B07D1037854 +:100690000C78401C491C1B1B01D1921EF1D118463D +:1006A00010BD70477047704710B500F007F810BDD7 +:1006B000014B1B68DB6818470000002019481A49E5 +:1006C0007047FFF7FBFFFFF7FBFC00BD20BFFDE716 +:1006D0001649174C24688C420BD1164B1B68994263 +:1006E0000CD1154B154A1360186810498842EDD09B +:1006F0000AE0134880F30888124B18470F4A13602A +:1007000018680A498842E1D080F308880E49884277 +:1007100004DD0E48026802210A4302605B68184744 +:100720000346DFE7C0070000C0070000FFFFFFFF30 +:10073000000C000014100010001000000000002049 +:10074000000400206B05000000200020240500406C +:100750000D48704502D1EFF3098101E0EFF3088104 +:10076000886902380078182802D1C046074A104725 +:10077000074A12682C3212681047000000B5054B7A +:10078000054A9B58984700BDFDFFFFFF4B04000042 +:1007900000000020001000000400000030B4744687 +:1007A000641E2578641CAB4204D3635D5B00E318D0 +:1007B00030BC18471D46F8E7000C00000010000090 +:1010000000150020CD64010025220000336401009A +:1010100000000000000000000000000000000000D0 +:101020000000000000000000000000003D6501001D +:101030000000000000000000252200002522000022 +:10104000A9650100AF6501002522000025220000EE +:101050002522000025220000252200002522000074 +:10106000B56501002522000025220000BB650100B6 +:1010700025220000C1650100C7650100CD650100A2 +:101080002522000025220000252200002522000044 +:101090002522000025220000252200002522000034 +:1010A000D3650100D965010025220000252200003A +:1010B0002522000025220000252200002522000014 +:1010C00000F002F815F0E3F90CA030C80838241835 +:1010D0002D18A246671EAB4654465D46AC4201D170 +:1010E00015F0D5F97E460F3E0FCCB64601263342A9 +:1010F00000D0FB1AA246AB4633431847B456010052 +:10110000E4560100103A02D378C878C1FAD85207E1 +:1011100001D330C830C101D504680C6070470000AD +:101120000023002400250026103A01D378C1FBD803 +:10113000520700D330C100D50B6070471FB5C046C1 +:10114000C04615F063F904B00FB41FBDF0B44046BB +:10115000494652465B460FB402A0013001B506482D +:10116000004700BF01BC86460FBC804689469246B8 +:101170009B46F0BC70470000C11000008269024924 +:101180008161024810447047911100000100000085 +:1011900001B41EB400B50BF0E6FF01B40198864619 +:1011A00001BC01B01EBD0000401E00BF00BF00BF5B +:1011B00000BF00BF00BF00BF00BF00BF00BF00BF37 +:1011C00000BFF1D17047000070B505460C461646C9 +:1011D00002E00FCC0FC5103E102EFAD2082E02D31B +:1011E00003CC03C5083E042E07D301CC01C5361F2E +:1011F00003E021782970641C6D1C761EF9D270BD45 +:101200008307FF22DB0E9A408907090E99400028C8 +:101210000BDA0007000F0838830828489B001818CD +:10122000C36993430B43C3617047830824489B0001 +:101230001B181868904308431860704710B504469F +:1012400000210120FFF7DCFF00211820FFF7D8FF65 +:1012500000210B20FFF7D4FF02211920FFF7D0FF58 +:1012600002210D20FFF7CCFF02210E20FFF7C8FF5F +:1012700002210F20FFF7C4FF0221C81FFFF7C0FFA4 +:1012800003211620FFF7BCFF03211520FFF7B8FF4D +:10129000204600F019F8002010BD6421018070473D +:1012A00010B500F020F810BD0648704710B500F0EA +:1012B00022F810BD704770477047000000ED00E055 +:1012C00000E400E003F9004370B505462D4C07200B +:1012D0002070A01CFFF7E1FF5920A080294620467E +:1012E00000F099FB70BD10B500F09EFB2549002071 +:1012F000891E087010BDF8B5224E0446B61E30781F +:1013000001270D46002807D0204660380B2808D852 +:10131000204600F03DFF2BE0602CF9D01A48086011 +:10132000F8BD20466C38032803D8204600F071FF32 +:101330001EE0204670381F2803D8204600F045F9EB +:1013400016E0204690380F2803D8204600F0E8F831 +:101350000EE02046A0380F2803D8204600F074F88D +:1013600006E02046B0380F2804D8204600F0CAF91D +:10137000286000E02F60602CD2D128680028CFD1EF +:101380003770F8BD1A000020013000000120244908 +:10139000C003086023490020087007202249C005C7 +:1013A0008860704770B51F4D04462878A04207D06A +:1013B000002C05D0002803D01CA14D2015F033F8D7 +:1013C0002878A0420ED000211D4A17482C70002C0E +:1013D00019D01C4B012C06D0022C0BD013A1682075 +:1013E00015F021F870BD11600221116053610321D5 +:1013F000090605E011600321116053610121C9054F +:101400008160416070BD116011600721C905816074 +:1014100070BD10B505A1712015F005F810BD0000D4 +:1014200080E100E02000002000F501407372635C61 +:1014300068616C5F63636D5F6161722E63000000C1 +:1014400000F500404001002010B5A038030015F061 +:10145000DBF80B070E172028313A414B525C650030 +:101460004B6808788A68194603F0E6F910BD888849 +:101470008A6883B20888194680B203F0ECF910BD7F +:1014800008884C68CB688A6880B2214603F0E7F987 +:1014900010BD08884B688A6880B2194603F0FBF9D2 +:1014A00010BD88888A6883B20888194680B203F024 +:1014B00007FA10BD88888A6883B20888194680B206 +:1014C00003F041FA10BD08884A6880B2114603F063 +:1014D00080FA10BD088982B2888883B208881946CC +:1014E00080B203F081FA10BD08884A6880B21146C4 +:1014F00003F09EFA10BD08894C6882B20888CB6858 +:1015000080B2214603F018FB10BD08884C68CB68F8 +:101510008A6880B2214603F02AFC10BD012010BD6C +:1015200010B59038030015F06FF809060F161D244A +:101530002C363F464E0088888A6883B20888194650 +:1015400080B204F031F910BD08884A6880B21146B3 +:1015500004F065F910BD08884A6880B2114604F0AD +:101560006AF910BD08884A6880B2114604F070F923 +:1015700010BD08884B688A6880B2194604F07BF970 +:1015800010BD088982B2888883B20888194680B263 +:1015900004F07AF910BD08894B6882B208881946B0 +:1015A00080B204F090F910BD08884A6880B21146F4 +:1015B00004F09BF910BD888882B20888114680B279 +:1015C00004F0EFF910BD012010BD10B57038030014 +:1015D00015F01AF81B0F15192125282F363B40440A +:1015E000484C53585F688D707980888D8D8D8D8FB4 +:1015F00096004A680878114608F0FDFD10BD08689D +:1016000008F04AFE10BD0C790B7B8A6808682146F9 +:1016100008F053FE10BD086808F011FF10BD08F077 +:1016200065FB10BD08884A6880B2114609F043F88E +:1016300010BD0A790888114680B209F0D3F810BDB0 +:10164000087840B209F0DCF810BD088880B209F0D3 +:10165000F0F810BD086809F0FEF810BD086801F048 +:10166000D2FB10BD086801F0FCFB10BD088982B2F6 +:1016700009C9194609F007F910BD05C9114609F055 +:1016800051F910BD08884A6880B211460AF0A6F9DF +:1016900010BD0C790888CB688A6880B221460AF0B0 +:1016A000C5FA10BD0B7908888A6880B219460AF01D +:1016B0006DFC10BD08884C68CB688A6880B22146F2 +:1016C0000AF0D5FC10BD08884A6880B211460AF0BD +:1016D00018FD10BD0B7908880A7A80B2194609F006 +:1016E00044F910BD088880B209F044F910BD062005 +:1016F00010BD08884A6880B2114609F042F910BD51 +:10170000012010BD10B5B02805D0B12808D0B228EE +:101710000BD0012010BD088880B20BF0FBF810BD83 +:10172000088880B20BF015F910BD08884B688A68EC +:1017300080B219460BF01EF910BD000010B5030071 +:1017400014F062FF0A0609060C0C0F0F06060612BB +:1017500008F0F4FA10BD0AF0C5FE10BD01F03EFA23 +:1017600010BD06F09FFA10BDFAA1FE4814F05BFE12 +:1017700010BD3EB5FC49054603C900900191FF200C +:10178000C33069460881F94A092310460A212838DE +:101790000BF0BFFD0024F6480BF0D9FD641CE4B249 +:1017A0000A2CF8D3F14801231A4602A990300BF015 +:1017B000A0F9002804D0FF20E6A13D3014F033FE4C +:1017C000686800F024FC00211E22084604F06CF931 +:1017D00008F0C3FC02222421E64801F07DFBE54825 +:1017E00001222C214C3001F077FBE2490B20B0396B +:1017F00001F0FEF9002804D0FF20D6A1513014F0EA +:1018000012FE0AF03EFE02F097F96B460022082114 +:10181000D9A008F07DFB002804D0FF20CDA15730CF +:1018200014F001FE284602F0E7FC002804D0FF2057 +:10183000C8A1593014F0F7FDF3218900D14814F004 +:10184000D3FCD04801214171022181710721C1716E +:101850003EBD10B5CB4CA0780A2804D3FF20BDA113 +:10186000903014F0E0FD20786021484300190021F9 +:101870000173417BF722C908C900C91C1140EF223E +:10188000114041730121E1700C3010BD70B50E465E +:1018900000211C4619801546030014F0B5FE0723ED +:1018A000050B1711231D23002246294630460AF056 +:1018B00037FE70BD22462946304608F095F870BDC7 +:1018C00022462946304601F0E2FF70BD22462946F5 +:1018D000304603F0EAFD70BD22462946304600F04E +:1018E00010FC70BDFF209BA1EF3014F09CFD032085 +:1018F00070BD70B5A34CE078002818D02078602126 +:1019000048430019407B00254007400F0119087922 +:10191000401E08712078401CC0B220700A2800D1F7 +:101920002570A078401CA0700BF097FEE57070BD8C +:101930009448C079002800D08BE7704770B5914D6E +:10194000A86800280CD0FFF7F3FF002862D06022BF +:10195000A968FFF739FCFFF7CCFF0020A860EFE78C +:101960006879002856D0FFF774FF044681484C3050 +:1019700001F0C2FA6060002804D17A4875A14A30AB +:1019800014F051FD606801F01AFB00280DD02046CC +:1019900007F00BFF6078010703D5C008C000401CAA +:1019A0002BE0744861684C302DE0724861684C301F +:1019B00001F0ABFA00F05AFB00282BD1FFF749FFEA +:1019C00004466C4801F098FA6060002804D1332086 +:1019D00060A1000114F027FD606801F0F4FA00280E +:1019E00014D060680088608020460AF0CCFD6078E2 +:1019F000010706D5C008C000801C6070FFF779FFA2 +:101A00009EE75C48616801F080FA99E7594861688F +:101A100001F07BFA70BD10B55B4CE160A0605B48E3 +:101A200000F032FC607010BD57490020087070470C +:101A300070B5574E0546706A94B00C46401C04D1F0 +:101A4000B06AC0430004000C0BD0306AC007C00F5E +:101A50002870706A14F0DBFBB06A2071000A6071B4 +:101A600014E02B206946087009A9684601F07BFA4A +:101A7000002804D03B4837A17E3814F0D4FC012064 +:101A8000287006220AA9204614F04FFB2878002867 +:101A900003D06079C0210843607114B070BDF0B507 +:101AA0003B4C0646206895B00D4637460837401C2B +:101AB00008D16068401C05D1A068401C02D1E068D4 +:101AC000401C11D02068314614F0A1FB6068311D24 +:101AD00014F09DFBA068394614F099FBE06831468C +:101AE0000C3114F094FB25E02B206946087009A9FD +:101AF000684601F038FA002804D01A4815A1553874 +:101B000014F091FC08220AA9304614F00EFB2B2099 +:101B10006946087009A9684601F025FA002804D032 +:101B200010480CA14E3814F07EFC08220AA9384651 +:101B300014F0FBFA20692E460836401C08D1606973 +:101B4000401C05D1A069401C02D1E069401C33D083 +:101B500020691FE07372635C686F73745F636F72F8 +:101B6000652E6300C3020000F866010094010020A6 +:101B70003D170000640800206E524635313832327D +:101B800000000000E8030020240000203D190000B0 +:101B900080000010294614F03AFB6069291D14F0FA +:101BA00036FBA069314614F032FBE06929460C315E +:101BB00014F02DFB15B0F0BD2B246846047009A964 +:101BC00001F0D1F9002803D0F649F74814F02BFCB6 +:101BD000082209AF28460AA914F0A7FA684604703B +:101BE00009A901F0C0F9002804D0EF48ED49C01D53 +:101BF00014F019FC0822391D304614F096FAD9E782 +:101C000070B5EA4C0546A068002804D0E648E549CE +:101C1000563014F008FCA56070BD10B50146E448CC +:101C200001F073F9E1498879401CC0B2887101283C +:101C300003D1E048407800F04BFB10BD70B504467E +:101C4000DD4816460D46814204D1D748D549CB30F0 +:101C500014F0E9FB012E05D0D348D249DA3014F054 +:101C6000E2FB70BD6620207000202072A58101205B +:101C7000A07370BD70B515460C460646FFF758FEBA +:101C800000280CD066210170468001210172216874 +:101C90000161A18881820573FFF72BFE70BD1321BE +:101CA000304608F09FFD70BDC2494968884201D2A4 +:101CB00010207047072101700020704770B5BD4C9F +:101CC00005462078002694B0002801D00820E4E6DC +:101CD000BA4A6260954201D21020DEE668680028A8 +:101CE00009D00921D82804D3C31C9B089B00834238 +:101CF00005D00846D1E60720000268600EE0012109 +:101D000009074B6B896B4B43AD49511A0122591A94 +:101D1000D202891A814201D20421EAE700F050FF81 +:101D20006178A06806F052F8E068401E07280BD8DA +:101D3000302269460A708870684607F007F9002863 +:101D400002D009A806F07CFA2846FFF712FD012010 +:101D500020703046A1E6F8B5044696480F46406824 +:101D6000814208D3002C01D0844204D3E01C8008B7 +:101D70008000A04201D01020F8BD8C488178002955 +:101D800011D0398800914178602251430D18287B89 +:101D90000C350007000F3B4600222946FFF776FD71 +:101DA000060004D015E0002038800520F8BD002C86 +:101DB00013D039880098814201D90C260DE028788B +:101DC0003B460007000F22462946FFF75FFD06004D +:101DD00005D00C2E01D0002038803046F8BD734C61 +:101DE0006078401CC0B260700A2801D10020607089 +:101DF000A078401EA07068784107490F01290ED0D5 +:101E0000022906D003291AD066496E4814F00BFB4C +:101E1000E3E7C006E1D46868FFF7FFFEDDE764484A +:101E200069684C3001F071F86079401CC0B2607193 +:101E30000128D2D15F48407800F04AFACDE7E07936 +:101E4000401CE071C9E7604A10B5904209D3594A75 +:101E50000124A4045268A04201D3904201D39142CC +:101E600001D2102010BD00F0FCFE10BD564B10B585 +:101E7000994209D34F4B0124A4045B68A14201D3CA +:101E8000994201D39A4201D2102010BD022803D0FA +:101E9000102801D0092010BD00F009FF0028FAD059 +:101EA000052010BD484B10B598420DD3414B01247D +:101EB000A4045B68A04201D3984205D3994203D39E +:101EC000002A03D09A4201D2102010BD00F015FF65 +:101ED0000028FAD0072010BD10B50446354894B04C +:101EE0004068844202D2102014B010BD0F2008A90F +:101EF000087369460BA801F036F80028F4D168464B +:101F0000007A207068464089608068468089A08099 +:101F10000020E9E710B500290BD0264A526891420B +:101F200002D30B68934201D2102010BD8A88002A88 +:101F300002D001F05AFE10BD092010BD10B5224A92 +:101F400094B091420ED31B4A01239B0452689942DC +:101F500001D3914206D3441E1E2C41D8994203D38B +:101F6000914201D21020BFE7012837D10878002420 +:101F7000C007C00F002803D003206946887001E025 +:101F80006846847038206946087009A9684600F0E0 +:101F9000EAFF002804D041200CA1C00014F043FA4D +:101FA0002046A1E7541B000093020000E803002034 +:101FB0006408002024000020FFFF0000001900201A +:101FC000000000200A040000008001007372635CBE +:101FD000686F73745F636F72652E6300072083E719 +:101FE0000246203A1F2AF9D807F0F9FF7CE710B51E +:101FF0005F4A5268914201D2102010BD0246203A39 +:102000001F2A02D808F065F810BD072010BD70B572 +:102010000546584C0020207020464619544846601A +:10202000E01C80088000A04204D0FF2052491330F9 +:1020300014F0F9F901200007C06AC0430006000E41 +:1020400003D14E480068401C03D04D484D49301A1A +:10205000C862A8B20122214604F039F9002804D050 +:10206000FF204549233014F0DEF970BDF0B595B07E +:102070003B2008A9087369460BA800F074FF0028EC +:1020800004D0FF203C496B3014F0CDF93E4E0024C3 +:102090006D4630E02F19B87DC10706D0400704D443 +:1020A00060004019C0880AF08DFB3848807900280C +:1020B0001FD0B87D80071CD560004019C088002261 +:1020C00006210AF09CFB002813D03C2108A80173CC +:1020D00060004019C1886846C18569460BA800F0B8 +:1020E00042FF06000BD0FF2023497F3014F09BF9FC +:1020F00005E0641CE4B268460079A042CAD83046C4 +:1021000058E5F7B505460078002700090C463E461D +:10211000062804D0FF201849A83014F084F9287A42 +:1021200000280ED0012814D0FF201349C93014F024 +:102130007AF90298002C068001D027806680002062 +:10214000FEBD02270926002C0ED0A889A080A87BFE +:1021500008E003271426002C06D02869E060A88A2E +:102160002082287B2072E4E702980680E7E70000DF +:102170002400002000190020CC1F000000100010D7 +:10218000000000200005004004300000E8030020AB +:1021900010B56038030014F037FA0A060A0F131856 +:1021A0001F252930353A0868FFF788FD10BD05C99D +:1021B0001146FFF7D0FD10BD0868FFF775FD10BD93 +:1021C00005C91146FFF73FFE10BD4B6808788A68C5 +:1021D0001946FFF74BFE10BD8A6809C91946FFF77B +:1021E00061FE10BD0868FFF777FE10BD08884A68D9 +:1021F00080B21146FFF78EFE10BD05C91146FFF7EC +:102200009DFE10BD05C91146FFF7F1FE10BD01206E +:1022100010BD0120704700000E4A12680C498A4226 +:102220000AD118470B4A1268094B9A4204D101B5EA +:102230000AF090FF03BC8E46074909680958084711 +:1022400006480749054A064B704700000000000099 +:10225000BEBAFECA7800002004000020001500204D +:102260000015002001203F49400608603E490860F3 +:102270003E490A68FF231B029A4383121A430A60ED +:10228000384980390860704710B502460420384943 +:1022900004E0C3005B181B79002B0AD00346401EE4 +:1022A000C0B2002BF5D133A1432014F0BCF8FF20BD +:1022B00010BDC300CA50002259184A718A71012208 +:1022C0000A7110BD2A4A0021C000801801717047B0 +:1022D00010B50446042803D326A1522014F0A3F815 +:1022E0002348E1000C182079012803D021A15320B4 +:1022F00014F099F86079A179401CC0B2814200D0F5 +:1023000060710120174940068031086010BD70B52A +:10231000164804250068164E0004800F1B4C022846 +:102320001AD014A1692014F07EF815E02078C100BD +:1023300088190279012A07D1427983799A4203D018 +:1023400042798271705880472078401CC0B220705A +:10235000042801D30020207028466D1EEDB200280D +:10236000E4D170BD80E100E080E200E018E400E02C +:10237000E00800207372635C736F635F7369676E5C +:10238000616C6C696E672E630000000034000020F1 +:1023900010B5EFF31080C407E40F72B6D24841784D +:1023A000491C41704078012801D10BF07BF9002CC9 +:1023B00000D162B610BD70B5CB4CE07800280AD1D0 +:1023C0000125E570FFF7E4FF0BF074F9002804D055 +:1023D00000200BF047F9002070BDC44865714560CE +:1023E000F9E770B5EFF31080C507ED0F72B6BE4C7C +:1023F0006078002803D1BEA18F2014F014F8607813 +:10240000401E60706078002801D10BF04FF9002D5C +:1024100000D162B670BD10B5B348C178002904D0B0 +:1024200000214171C170FFF7DCFF002010BD10B525 +:1024300004460BF03FF9AC49C978084000D00120B0 +:102440002060002010BDF8B50246A74C0026A671FA +:102450000820042101251027130014F0D5F80D08D9 +:102460000A0C0E101214161E262123252800257191 +:1024700022E0022001E021711EE020711CE02771A2 +:102480001AE02020F9E7012616E0FFF781FF0BF0A4 +:1024900011F90028FBD002260EE02171A5710BE096 +:1024A0002771FBE7202000E040202071F6E7FF20A5 +:1024B0008FA1763013F0B7FF0BF008F9002809D090 +:1024C0000BF00AF9B04205D130460BF008F90028AC +:1024D000FAD02CE001208007C560894900224A60BB +:1024E000884A9661814B02225A608560864802695B +:1024F000D243D206D517026910231A4302610F4650 +:102500006D1C00E020BF78680028FBD030460BF03F +:10251000E6F80028FAD0002D04D17B48026910218A +:102520008A43026171490220886000207860A079A6 +:1025300000280CD00BF0BEF805460BF01BF8734AD0 +:10254000002D02D0A260E06001E0E260A060002EF9 +:1025500001D100F0A5F8F8BD10B504460BF0B0F8B5 +:10256000002805D060490120C8704A78521C4A7082 +:102570002046FFF768FF10BDF8B5614DA86800263A +:10258000012802D1AE600BF06DF86868012800D117 +:102590006E6028680127544C012812D12E606079A2 +:1025A000002803D000200BF05DF866712078002829 +:1025B00007D00BF07FF8002803D0012080070761C7 +:1025C000A770286901282AD12E6100F05FF8012048 +:1025D00080074761A079002815D00BF06BF80090B8 +:1025E0000AF0C8FF0099002901D0E16800E0A16865 +:1025F000411A022901DA8A1C11DC0099002901D054 +:10260000E06000E0A060FFF7C3FE0BF053F8002885 +:1026100004D0012080070761A77000E02770E868F8 +:10262000012812D100F032F800F030F800F02EF856 +:10263000A078002804D1FF202DA1033013F0F3FE71 +:10264000EE60A6702670FFF7CCFEF8BD10B5264CE4 +:10265000E078002801D10BF029F80120810788617A +:1026600000F014F8A07800280BD0254CE068002872 +:1026700003D10BF034F80028F8D10020E06000F01E +:1026800005F800201949C043886010BD08B55020E6 +:10269000694608806A461088411E1180FAD208BD3A +:1026A000F8B5124819278760154900200860C860EE +:1026B0000BF000F8BE0701240B4D002802D0346156 +:1026C000AC7000E02C70FFF763FE084847600D49CE +:1026D00028798863FFF7DAFFB461FFF7D7FF08496D +:1026E000002008617461F8BD38000020000300403C +:1026F0007372635C736F635F636C6F636B2E6300F5 +:10270000000100400005004000ED00E0FFFFFF7FFA +:102710008107C90E002808DA0007000F0838800872 +:102720002E4A80008018C06904E080082C4A80008E +:1027300080180068C8400006800F704710B50D2053 +:10274000FFF7E6FFC4B20420C043FFF7E1FFC0B2C9 +:10275000844203D023A11A2013F065FE26490120EC +:10276000486010BD0121254A48031060244B002217 +:102770001A60244A5160244A1060244A11601F499B +:1027800080390860704701211C4A480310601F4AC5 +:1027900051601B4A002111601B490860704710B549 +:1027A00017490868012804D00EA1572013F03BFEFA +:1027B00010BD114880680022C0B20A600AF020FCF7 +:1027C00010BD10B50E4801680029FCD0FFF7E7FFE7 +:1027D00001200D494003086010BD000000ED00E03D +:1027E00000E400E07372635C736F635F68616C5F49 +:1027F000726E672E6300000000D5004080E100E0AB +:1028000000D1004000D3004080E200E000D0004052 +:1028100030B40121BC48C9020160CD1005604A03F3 +:102820000260BA4803681B021B0A036004680023A5 +:10283000240A24020460B6480468240A24020460BE +:10284000B448012444608460B34C23606360A36097 +:10285000B24B19601D601A60B14B19601A600121FA +:10286000016030BC704710B40121A748CA02026061 +:102870000B0203600C060460A64841608160A94811 +:1028800041680029FCD1A4490020086048608860A4 +:10289000A24802600360046010BC704701219F4899 +:1028A000C9020160C91001607047002805D00128E5 +:1028B00005D0022805D19C4870479C4870479C4829 +:1028C000704710B59BA18B2013F0ADFD002010BD0B +:1028D00070B500219E4C9F4D9F4A8F4B002808D019 +:1028E00001281DD0022822D092A1B32013F09BFD15 +:1028F00070BD01200004A060A86011601960974BB2 +:10290000C2039A60964A90607F4A00121060954810 +:10291000016086480160944801609448017070BD70 +:1029200001204004A060A8605160596070BD012082 +:102930008004A060A8609160996070BDF8B594466D +:10294000834A8B4F834D00240126002808D001289C +:1029500032D0022840D077A1E82013F064FDF8BD02 +:10296000891E0902090A0120000490603C64686025 +:102970006C4A1164012B1DD000217C4A7D4B5170A3 +:102980006146DC63DE637C4B5C6002249C60042453 +:102990001C61744B3D31196073490E605F4B8915A2 +:1029A00019606F4B58605E4801606C49C005486013 +:1029B0001670F8BD0121E0E70120704E4004704F11 +:1029C000012B04D13464506068603964F8BD9060B4 +:1029D000346468603964F8BD01206A4E80046A4F2F +:1029E000012BF4D1EEE74F484068704770B54A4D6F +:1029F00028680026564C012806D1A068C00303D5DC +:102A000001200004A0602E606868012809D1A06838 +:102A1000800306D501204004A0606E6001200BF009 +:102A200041FEA868012809D1A068400306D501200D +:102A30008004A060AE6002200BF034FE70BD10B5C3 +:102A40004A490878002818D00120444AC0079060FD +:102A5000434AC00B90602C4A00121060414A00208B +:102A60001060324A1060404A106008704A78002AAC +:102A700002D048700BF016FE10BD0320FAE70120CB +:102A8000424900060860704701202449000608609A +:102A9000704701203D4940050860704701201F49EB +:102AA00040050860704733490020C86388151B49FA +:102AB00008607047410A364AC005C00D5043801C6B +:102AC0005143400A0818704710B4324C430B63431B +:102AD0001B0C5C020C602E4C6343C31A2E485C0234 +:102AE00058432B4B400D4343E31A0124DB032404DA +:102AF0001B191B1613700A681018086010BC704769 +:102B000010B50BF0A2FE10BD80E100E008E400E08B +:102B100018E400E000B0004040B1004080E200E076 +:102B200000E100E000B5004048B1004040810040B5 +:102B300044B100407372635C72656D5F68616C5F85 +:102B40006576656E745F74696D65722E6300000052 +:102B500000B3004040B3004040B5004000F50140E4 +:102B60000083004040850040008200404800002073 +:102B700000B10040C08F00400085004004B100401B +:102B800004B5004008B1004008B5004000E200E094 +:102B9000093D0000378600006F0C010010B50BF0F6 +:102BA00040FE10BD00200449C8630120012181407E +:102BB000024A116000BF7047C01F004080E200E081 +:102BC00010B50CF097FA0AF059F9FEF7DFFB12F096 +:102BD00063FA0CF0F5FF0CF081FF10BD70B50C46E8 +:102BE000054603F0D5FA214628460EF026F870BDBA +:102BF00070B50D46040012D0002D10D021012846DA +:102C000013F0F0FA10225449284613F08EFA524875 +:102C100001210838018044804560002070BD0120FA +:102C200070BD70B54C4E00240546083E11E0716839 +:102C300020014018817BAA7B914209D1C17BEA7BAC +:102C4000914205D10C22294613F042FA002806D001 +:102C5000641C30888442EADB0020C04370BD2046FB +:102C600070BD70B50D4606000AD0002D08D03A4C54 +:102C7000083C20886188401C884203D9042070BD2C +:102C8000102070BD3046FFF7CCFF002801DB401C50 +:102C90000AE020886168000140181022314613F0D4 +:102CA00044FA2088401C20802870002070BD70B538 +:102CB00014460D001FD0002C1DD00021A170022849 +:102CC00002D0102817D108E068782978000208435C +:102CD00011D00121A17010800BE02846FFF7A1FF61 +:102CE000002808DB401CA070687B297B0002084399 +:102CF0002080002070BD012070BD70B505461446CF +:102D00000E000AD000203070A878012807D004D91E +:102D1000114908390A8890420BD9012070BD002C56 +:102D200004D0287820702888000A5070022008708B +:102D300010E0002C0CD049680001411810222046F8 +:102D4000103913F0F2F9287820732888000A60738C +:102D500010203070002070BD540000205A4910B57A +:102D6000884207D301218904884205D3574909685D +:102D7000884201D2102010BD0146012006F0E4FA7D +:102D800010BD30B5044693B000200D4607901421C5 +:102D90000BA813F029FA1C21684613F025FA6A469D +:102DA000112010770020507710780221084310700E +:102DB00007A80C90012008AA907245486A46108521 +:102DC0000AA80B902088108460885084A088908482 +:102DD000E088D084907FF9210840801C40084000A2 +:102DE000907708209086108708A80F9010AA0BA94A +:102DF000684600F083FF002803D110A800882880CF +:102E0000002013B030BD3EB5044608206946088056 +:102E10002D48844207D301208004844205D32B48E7 +:102E20000068844201D210203EBD2146012006F0F8 +:102E30008BFA0028F8D12088694688806088C8808D +:102E4000A0880881E088488107F05FF801AB6A46F6 +:102E5000002101F0E1FB694609880829E4D003203C +:102E60003EBD1FB504460020029008206946088137 +:102E700015480391844207D301208004844206D37D +:102E800012480068844202D2102004B010BD07F03E +:102E90003CF8014602AA0F4801F055FD0028F4D184 +:102EA00069460989082901D00320EEE769460988A7 +:102EB000218069464988618069468988A180694680 +:102EC000C988E180E1E700000080010028000020BF +:102ED000042A0000FFFF000010B5031D036000205E +:102EE000521E04E05C181C60401C2346C0B2904295 +:102EF000F8DB0020186010BD01460A680020002A97 +:102F000002D0104612680A60704702680A600160C9 +:102F10007047000000B51E2823D00BDC0C281CD005 +:102F20001FDC030013F070FB090F1D111D1D171787 +:102F300013151D00302814DD3A38030013F064FB2C +:102F4000030F11091100002000BD214800BD04201D +:102F500000BD0D2000BD0F2000BD082000BD1120C8 +:102F600000BD032000BD10B50C4605F0EFFF0028A2 +:102F70001ED0204605F064F9002816D022780E2ACB +:102F80000DD00F2A0BD0022A09D0032A07D0102A0D +:102F900009D010A17C2013F046FA002010BDA078C3 +:102FA000FFF7B8FF10BD112010BD0AA18220F2E783 +:102FB00008A18820EFE710B504F083FF10BD10B51D +:102FC00005F03EF910BD10B504F0D9FF10BD0000AA +:102FD000023000007372635C686F73745F686369CA +:102FE0002E63000070477047704770477047704706 +:102FF00070477047704770477047704770470000D0 +:1030000010FFFFFFDBE5B151008001006400FFFF0E +:1030100003B40148019001BD09000020002803D03D +:103020008178012939D101E0102070470188FE4ADA +:10303000881A914233D01BDCFC4A881A91422ED068 +:103040000BDC00292BD00320C002081A27D001284E +:1030500025D001210903401A07E001281FD00228CA +:103060001DD0FF281BD0FF380138002815D116E0ED +:10307000FF220132811A904211D008DC01280ED0C3 +:1030800002280CD0FE280AD0FF2806D107E001292B +:1030900005D0022903D0032901D0002070470F205A +:1030A000704700B50B2826D009DC030013F0ACFAFA +:1030B0000B1D2125251B25292325271F1B00112832 +:1030C0001BD008DC0C2816D00D281CD00F2814D0DB +:1030D000102808D10FE0822809D084280FD0852835 +:1030E0000FD0872811D0032000BD002000BD05208F +:1030F00000BDCF4800BD072000BD0F2000BD04204B +:1031000000BD062000BD0C2000BD0D20800200BDCA +:1031100070B500290BD0CB1FFA3B81241E46CDB2DF +:10312000112B1BD2012805D0022806D009E000206F +:1031300010701DE0FF20043001E0FF2003308142C9 +:1031400018D0330013F060FA111613131613161665 +:103150001316161613131313161316000846FF380A +:1031600081381F2803D9FF39FE39022902D815708A +:10317000002070BD1470072070BD00B5030013F06F +:1031800043FA060406040C080A0C002000BD1120B6 +:1031900000BD072000BD082000BD032000BD007851 +:1031A0000207120F04D0012A05D0022A0AD10EE02C +:1031B000000907D108E00009012805D0022803D042 +:1031C000032801D0072070470870002070470620B0 +:1031D0007047002807D0012807D0022807D003280D +:1031E00007D007207047002004E0112002E02120D2 +:1031F00000E0312008700020704738B50C4605000B +:103200004FD06946FFF7CBFF002822D12088032149 +:1032100089028843694609788907090D0843208097 +:103220006946681CFFF7BBFF002812D121880320E4 +:1032300000038143684600788007800C01432180A9 +:10324000A8784007820F2020012A03D0022A03D049 +:10325000072038BD814300E00143218088B2010589 +:10326000890F08D0012189038843A9780907C90F6C +:1032700089030843208080B28104890F0AD0A9788D +:103280004004C906C90F400CC903084320808004CC +:10329000800F02D12088400403D5208840210843B4 +:1032A0002080002038BD70B50446002008801546F7 +:1032B0006068FFF7A2FF002815D12189A08981420B +:1032C00010D861688978C90708D00121490288426D +:1032D00008D8491C12F0A3FF298009E0FF21FF3123 +:1032E000884201D90C2070BDFF30FF3003302880A8 +:1032F000002070BD10B5137804785B08E4075B000C +:10330000E40F23431370FD2423400478A407E40F43 +:10331000640023431370FB24234004786407E40F04 +:10332000A40023431370F724234004782407E40FF8 +:10333000E40023431370EF2423400478E406E40FF1 +:10334000240123431370DF2423400478A406E40FF0 +:103350006401234313700078BF244006C00F23404C +:10336000800103431370002906D00878C10701D1FA +:10337000800701D5012000E00020C0015906490E58 +:103380000843107010BD30B50A8803239B020488DF +:103390009A4323059D0F02D1A3049C0F01D09B0FDC +:1033A00000E001239B021A4303230A801B039A4374 +:1033B00003889804840F02D11805830F01D0800F71 +:1033C00000E00120000302430A8030BDF3B593B052 +:1033D0000D000FD0139800280FD01221284612F0AC +:1033E00001FF03AAFF21012003F0E7F8002426468D +:1033F00037467AE0102015B0F0BD0720FBE768469D +:10340000807D01280BD16846818A0520C002081AF8 +:1034100010D0012810D0022812D0032812D0042C7A +:1034200014D0052C15D113E002290000012800005A +:1034300003300000012400E002246846468A08E0C8 +:10344000032406E068460424478A02E0052400E0DD +:1034500006246846418A1398814246D12C74002E76 +:1034600041D00DAA0EA905200292019100901023CF +:103470000022FF21304603F041F9002823D168469D +:10348000808E2A46C0B20EA9FFF711FC00281AD17F +:10349000AE81002F27D00DA9052008AE0291009023 +:1034A000132300220196FF21384603F027F9002854 +:1034B00009D16846808EF11CC01EC0B22A1DFFF7DC +:1034C000F6FB002801D0032095E708A88178427810 +:1034D00008021043E881062C05D16846807DA87259 +:1034E0006846808A2881002085E703A803F06EF8EB +:1034F000002884D0FFF7D5FD7DE7002805D0F94AE4 +:10350000012903D0022903D003207047518800E02D +:103510009188814201D1002070470720704770B523 +:103520000C4605461C21204612F05CFE002020803F +:10353000002D08D0012D04D0EBA1F04812F073FF4C +:1035400070BD062000E00520A07070BD70B592B07F +:103550001546064601206A461071107453740846D9 +:1035600008300395029048889082FEF7E1F9040044 +:1035700019D06580172069468883203600940AABED +:103580007178023307AA01A80DF05FF9064660784A +:10359000000701D5FEF7ADF9002E0AD03046FFF73F +:1035A000ECFD12B070BD1321284607F01BF9032073 +:1035B000F7E708A800906846838B0422012128467B +:1035C00008F035FEEDE770B506468AB000200D46DE +:1035D00007900590069003A90490052402460291E5 +:1035E0000190102300942946304603F087F8002804 +:1035F0000DD108A804A9009102900194684683891E +:1036000000222946304602F095FE002801D0FFF73F +:1036100048FD0AB070BD10B50DF01DFB10BDF0B532 +:1036200089B000260546059600780C460827030059 +:1036300012F0EAFF0CFD070C3A0B77779EC2FCD81C +:10364000E8FD68680A38FEF7E8FA0DE1A88800236B +:1036500080B201220321009009F08CFA0290002C24 +:1036600004D0A648A0A16E3012F0DDFE029800281A +:1036700004D1A2489CA16F3012F0D5FE02980099A7 +:1036800008300CF017FDFEF753F9040007D06078FE +:103690003843607000986080FEF72BF9E6E0132154 +:1036A000009807F09FF8EFE0002C04D1BD208EA118 +:1036B000800012F0B8FE608800230122032109F087 +:1036C00059FA0090002804D18C4887A1883012F064 +:1036D000AAFE0099002008802A7994461EE0C300C3 +:1036E0005B199B6807936B469B8B1A0708D5DA0614 +:1036F00006D56046C20050194038C08F088006E0E9 +:103700005B0409D50871C2005019C08848806078F0 +:10371000384360700226A7E0401CC0B28445DED862 +:10372000A2E0E888694608800090002C04D1734824 +:103730006DA1983012F077FE2878062814D10098F1 +:10374000C00B11D0608800230122032109F012FA76 +:10375000060004D1694864A1A23012F064FE002082 +:103760003071A88870803BE06078384360707BE0FF +:10377000002C04D161485CA1B43012F054FE608882 +:1037800000230122032109F0F5F90090002804D15B +:103790005A4855A1B73012F046FE009808300DF097 +:1037A000ACFA0121484002D1E888C00B5CD00098F7 +:1037B00061880226C180D7E7002C04D14F484AA176 +:1037C000D03012F030FE608800230122032109F07E +:1037D000D1F9002804D1494843A1D33012F023FE87 +:1037E0000226C1E7002C04D144483FA1DC3012F08E +:1037F0001AFE0226618801222046FEF71FFA0120E8 +:103800000590B1E7A889002380B20122032100902E +:1038100009F0B0F90746002C04D0384832A1EE3048 +:1038200012F001FE002F07D12FA101E00FE016E0FA +:103830003248EF3012F0F7FD686802902889694637 +:103840008881012202A90098FEF714FA0CE0002CEE +:103850008AD16D2024A1C00012F0E5FD84E727483D +:1038600021A1FE3012F0DFFD002C0DD060780007A2 +:103870000AD50598002807D18420207020465822B8 +:1038800029460830FDF7A0FC304609B0F0BDF7B579 +:103890000C460546007A224688B00A320292921CF3 +:1038A00004920027811E16323E4601920B0012F050 +:1038B000ABFE08F605F548488DD1F4F5688800237D +:1038C0000122032109F056F90190002803D106A135 +:1038D0000B4812F0A8FD01980088002812D052274A +:1038E000072601E1000900207372635C676174744C +:1038F000735F636F72652E63000000006F0200004B +:103900008603000051271E26002C7DD06888A080E9 +:103910000120A071019802990079C0004019C08966 +:10392000FFF754FD002870D101980079C0004019BC +:10393000C089208101980079C0004019408AA08385 +:10394000F2E0698A0091062820D1E889C00B1DD0D9 +:1039500008462230512786B2002CD6D0A889049977 +:10396000FFF734FD002873D16888A0800220A07181 +:10397000A88920810120A072288AE08300982084F1 +:103980006969009A019812F0D0FBCDE0084620301A +:10399000502786B2002CB8D0A8890299FFF716FDEF +:1039A000002855D16888A080A889E080287A062858 +:1039B0000AD002202072288AA0830098E083204643 +:1039C00069692030009ADEE70120F3E76888002368 +:1039D0000122032109F0CEF80690688A009006982B +:1039E000002803D1FD49FE4812F01DFD069808305D +:1039F0000DF083F90121484002D1E889C00B26D09F +:103A00000098223086B201E073E021E05127002CBB +:103A100079D06888A080A8890499FFF7D7FC00288E +:103A200016D10220A071A88920810420A072288AC2 +:103A3000E083009820846969009A019812F075FB70 +:103A40000699002008710698A98941806CE003203E +:103A50000BB0F0BD688805F0D2FB019068880023A8 +:103A60000122032109F086F800900198002804D172 +:103A7000DB48DA492C3012F0D6FC0098002804D13B +:103A8000D748D6492D3012F0CEFC0098D549C088D1 +:103A9000884205D05127222604E01EE03FE035E0B1 +:103AA00050272026002C2ED06888A080502F07D0C9 +:103AB0000220A0712146287B0831FFF730FD33E05A +:103AC000287BA11DFFF72BFD6A8800230099019830 +:103AD000FFF73CFD0028BBD126E0C349A889C9886F +:103AE000814207D154270626002C0CD06888A0807C +:103AF0001AE008E053270826002C04D06888A0802C +:103B0000A889E08010E00A98068013E05527072670 +:103B1000002CF8D0A889A0800020A07104E08D209E +:103B2000AE49C00012F07FFC0A98002C068001D03C +:103B30002780668000208BE7AB4900200870704723 +:103B400030B585B00C4601F0E0F90546FF2804D1F8 +:103B5000A348A249953012F066FC00202080207115 +:103B60006080401EE0802046294608300CF096FA1E +:103B70006A462946012002F020FD102412E0684622 +:103B8000808800070ED56846C0882946FFF71BFDD0 +:103B900068468188FF2321438180C0882946019A95 +:103BA00002F036FE684602F011FD0028E7D005B0AD +:103BB00030BD0A46014610B5104608300CF082FAB6 +:103BC00010BD70B5002305461A46032108F0D2FF48 +:103BD000040004D182488149B73012F024FC204609 +:103BE000294608300CF066FA70BDF0B591B00C466D +:103BF000074605F004FB050005D02878222804D2EA +:103C0000082011B0F0BD7948FBE700231A460321D4 +:103C1000384608F0AFFF0646002C02D0A0880028E6 +:103C20000CD00120694608710220087400204874F5 +:103C3000002C05D0A0880883206802E00920E0E776 +:103C4000088305903046083003970290FDF770FE18 +:103C5000040018D0678017206946888320350094B7 +:103C60000AAB6978023307AA01A80CF0EEFD0546FD +:103C70006078000701D5FDF73CFE002D09D02846ED +:103C8000FFF77BFABDE71321384606F0ABFD0320B2 +:103C9000B7E708A800906846838B042201213846C4 +:103CA00008F0C5FA0021C943F180AAE7FFB585B045 +:103CB0000E9E7788384605F0A2FA054600231A467C +:103CC0000321384608F056FF0446002D03D143492E +:103CD000474812F0A8FB002C04D145483F49401C3E +:103CE00012F0A1FB0834089869460394C1C105A8E5 +:103CF0000DC8203569780CF017FAC6E5F0B5044612 +:103D0000002099B00D4601460D9010A881811646FD +:103D100001818180344A68469180018510A8018024 +:103D200068460187818581841078012808D002289F +:103D300006D0032804D0042802D0082019B0F0BD12 +:103D40002C4A944273D32C4F0121890438688C4249 +:103D500001D3844278D3274A954275D3012189043F +:103D60008D4201D385426FD36168002913D0214A67 +:103D7000914269D301229204914201D3814263D3DB +:103D800060892189884203D801225202914201D9D7 +:103D90000C20D3E70D9016AA0EA92846FFF783FA48 +:103DA0000028CBD1686880784007800F02280AD1AC +:103DB0006846008F8004800F05D02869002802D053 +:103DC0003968884240D30AA92069FFF716FA00280B +:103DD000B4D1206900281CD060780FE0E8380000DA +:103DE000EE030000FFFF0000000900200230000089 +:103DF0000C050000008001002800002080076846B4 +:103E0000008D03D58004800F68D002E08004800F0D +:103E100064D16846008D810618D58004800F6068E3 +:103E200006D0002812D0396888420DD302E00BE09A +:103E300000280BD0FE49884206D30121890488421C +:103E400004D33968884201D2102077E709A9606954 +:103E5000FFF7D3F900289CD16069002808D0684694 +:103E6000808C0105890F012938D18004800F35D05D +:103E70000BA9A069FFF7C1F900288AD16846808C98 +:103E800080062BD46846808D810627D4A16900293D +:103E900006D00105890F012920D18004800F1DD093 +:103EA000E068002804D00078002817D01C2815D21C +:103EB00004AA611C2046FFF71DFA0121890210A8FF +:103EC0000180012768468773DA49818104AA033299 +:103ED00017A92868FEF711FF002801D007202DE759 +:103EE00010A8007F15A9C01CC2B200200C9201903E +:103EF000FF32009003460291FF3203A8033210996B +:103F000002F0B3FA002826D110A9888A0F902A89D6 +:103F10002969C94801910092029010A90A8B6B8906 +:103F200028680E9902F0A1FA01007DD1C24800254F +:103F3000001F818868464174090A8174052104A81C +:103F40006A4623C210A82A46FF21808A0C9B02F0F1 +:103F5000F1F9002802D0FFF7A4F8EFE66846007CEC +:103F60000322C1090020920290430122920280188C +:103F70001490002928D0014610A801806846292104 +:103F8000877309028181058608A8007C0023410807 +:103F900060784900C007C00F014308A80174FD20E4 +:103FA00001406078A54A8007C00F4000014308A87F +:103FB00001740CA9022001910090029503A81099A8 +:103FC00002F053FA01002FD16068002828D0206940 +:103FD00000280DD10AA90EA8FFF7D5F9607880074F +:103FE00006D46946088D032109038843694608857C +:103FF000904968468773FE31818190492089891EE6 +:1040000012F00DF962680D9811AB019200900293C5 +:104010000A46002303A80A9902F027FA010003D1F7 +:104020002078C10603D400E086E080062AD56846E1 +:104030000586606900280DD109A90EA8FFF7A3F92C +:104040006846818C03208002814301208002091888 +:10405000684681846946888CC821084369468884FB +:1040600074488F73FF30888112AA0CA90220029233 +:10407000019100900023714A03A8099902F0F5F913 +:10408000010059D12078C00729D068460586A0696B +:1040900000280DD10BA90EA8FFF775F96846818D90 +:1040A000032080028143012080020918684681852F +:1040B0006846818D40200143684681858773604949 +:1040C000818113AA0CA90220029201910090002381 +:1040D0005A4A03A80B9902F0C8F901002CD1E068F4 +:1040E00000282DD010A8149901805549684687737F +:1040F000491C8181E16808A80A78027449784174F2 +:10410000E0684122418868464186E06800230179E1 +:1041100008A80175E068D200C18808A84175090A9D +:1041200081750CA8072101900091029503A81099B0 +:1041300002F09BF9010003D00F9800F0EAFEFDE5C4 +:104140003D480321001F0170002E0AD08088308076 +:1041500010A88088708010A80089B08010A880897D +:10416000F0800020EAE530B501248BB015460B46FF +:10417000012802D002281CD104E06846052184737E +:10418000C90203E02B4968468473891E8181002B94 +:1041900012D003210020890288430121890240189E +:1041A0006946888405AA04A91846FEF7A6FD0028DA +:1041B00004D007200BB030BD1020FBE76A46127C0C +:1041C0001D480092801E05A9FF3201910290FF3226 +:1041D000002303A80332099902F047F9002802D00E +:1041E000FEF75FFFE6E71448001F002D01D041886D +:1041F000298004700020DDE770B592B004460126E6 +:1042000008A886700F496846018410AA08A930469C +:10421000FFF7A9FF00284DD12078074DC0070024E3 +:104220002D1F002848D01C21684611F0DDFF0BE04F +:1042300000800100032800000409002003020000A0 +:10424000032900000118000068460178202001437E +:104250006846017008A88670F9496846018411947F +:104260000794817FF92001406846891C81770020EE +:1042700001466846017700200146684641770421DF +:104280008185C485018607A80A9011A80D9008A809 +:1042900009900EAA09A96846FFF730FD002809D148 +:1042A0006846008FE8806846808F2881401C6881BE +:1042B0002C70002012B070BDEC802C8110A80088FA +:1042C000F4E7F7B5DF4900260A789EB0012A04D04A +:1042D000022A02D0082021B0F0BD4A88824201D0D3 +:1042E0000620F8E71F98824201D10720F3E7012258 +:1042F00010A98A75D4488882002003239B020146B6 +:1043000099439302CB1810A90B8669468A81CF4A3C +:10431000CA8118A9887110A9888419A904916946CD +:10432000CA820690FF20087503A802F072F90024E3 +:104330002546274608AA052103A802F06DF90028A2 +:1043400010D082286FD1002C6FD0002D6DD010A816 +:104350008480C5800021017418A8807B11AC0128DD +:1043600065D06DE008A88079002F21D0012857D1B1 +:104370006846818CB44881421CD113AA0DA905203E +:104380006B4607C36846408C10230022FF2102F0D1 +:10439000B5F9002868D110A88089042801D0062822 +:1043A0004CD16846818E1F98814239D10F2092E707 +:1043B000012835D16846808C0521C902884202D087 +:1043C000491C88422CD19F4841886846408C8142D4 +:1043D00001D1012700E00027002C01D0002D10D0D2 +:1043E0001F9988421CD113AB0DAA05216E460EC63B +:1043F000044610230022FF2102F080F9002833D167 +:1044000001E035460CE010A88089022801D0102870 +:1044100014D1C0B21BAA0DA9FEF749FC00280DD18A +:104420006846468C86E71FE0FFE7052053E714A99E +:104430001BA8221DFEF761FC002801D003204AE7DB +:1044400010A8007C0023001DC2B210A8027420989E +:1044500002900194009215A81C9902F006F8002819 +:1044600002D1784902220A70FEF71BFE33E710B52D +:104470000B46401E86B084B203AA00211846FEF700 +:1044800039FF04AA052103A802920191009001239B +:104490000022FF21204601F04DFF04466846008AB5 +:1044A000012804D06D206A49000111F0BCFF2046AC +:1044B000FEF7F7FD06B010BDF0B5624F0446387840 +:1044C00087B00E46032804D0042802D0082007B085 +:1044D000F0BD04AA03A92046FEF7E5FE0500F6D1CB +:1044E000606880784007800F02280DD16846808977 +:1044F0008004800F08D02069002805D0554909683C +:10450000884201D21020E2E7208905AA6B46216982 +:1045100007C369460A8A63892068039901F0A5FFE9 +:10452000002802D0FEF7BDFDD1E7002E02D068467C +:10453000808A3080042038702846C8E738B50C00DF +:10454000054609D000236A46FF2102F039F9002808 +:1045500004D0FEF7A6FD38BD102038BD69462046C0 +:10456000FEF74BFE0028F8D1A078FF21C307DB0F30 +:104570002846009A02F04CF9EBE73EB50C0009D052 +:1045800002AB6A46FF2102F01BF9002804D0FEF7B7 +:1045900088FD3EBD10203EBD0321204611F022FEC5 +:1045A0006846008801A90005800FFEF712FE00286A +:1045B0000BD16846007920706846008801A9800404 +:1045C000800FFEF706FE002801D003203EBD68469E +:1045D00000796070A278EF20024068460088C10B25 +:1045E00009010A43F7210A404104C90FC9000A43DF +:1045F000A270F9210A40800601D5022000E00120C6 +:10460000400069460243097A50084000C907C90FB3 +:104610000843A07000203EBD7FB5144605220192DC +:1046200003AD029500930A462388FF2101F082FE24 +:10463000694689892180FEF734FD04B070BD000011 +:10464000052A00000009002002280000FFFF0000EA +:10465000E838000028000020F3B5002799B068462C +:104660000C4607873D4600291ED0E068002806D08A +:10467000A068002818D001886A4611870780199819 +:1046800004F0BDFD002812D0007822287ED31998AE +:1046900000F03BFC002300901A460321199808F013 +:1046A00069FA060009D104E010201BB0F0BDFD48F6 +:1046B000FBE7FD49FD4811F0B6FEA078012803D0C4 +:1046C000022801D00720F0E72088002808D0401EEB +:1046D00080B203AA009901F070FF002859D11DE0B3 +:1046E000F048401CE1E76946498A228891420BD292 +:1046F0006846807D0025012810D16846808AEC49F3 +:1047000088420BD1012509E0914203D1002D2AD026 +:104710006D1C01E0022D0BD0032D04D203A801F083 +:1047200055FF0028DFD082281BD0002831D11DE0A2 +:104730006946897D0129F1D16946DD4B8A8A5B1E74 +:10474000D11A9A420FD005DCDA48101A0BD0012892 +:10475000E4D108E0012906D0FF390129DED1032583 +:10476000E1E7022D15D10D2080029EE7E0680028C8 +:1047700016D00EA9052202910192009069460B8F76 +:10478000A2882088FF2101F0D5FD00E01EE000286E +:1047900002D0FEF786FC88E76846A168008F088093 +:1047A0006846008AC00601D5C3487EE707980028FE +:1047B00003D06846008B022801D0032075E70798D4 +:1047C000A1780078012903D0800710D408206CE775 +:1047D000C007FBD000220721199808F010F8002824 +:1047E00002D00725022004E0AE48801C5DE70225C8 +:1047F000032008A908702188684681851998083621 +:104800000A90099617216846818712AB02330FAAD6 +:10481000052108A800970CF018F8002802D0FEF730 +:10482000ACFC42E710A800906846838F042229461A +:10483000199807F0FCFC38E770B5064615460C469B +:104840000846FEF7EBFB002804D12A4621463046F5 +:10485000FFF789FCF2E610B5FFF733FD10BD70B528 +:104860001E4614460D0014D0002C12D06168002999 +:104870000FD00121FEF741FE002809D12068FEF784 +:10488000CDFB002804D1324621462846FFF736FAF0 +:10489000D4E61020D2E670B515460C000ED00221E9 +:1048A000FEF72BFE002808D12068FEF7B7FB002892 +:1048B00003D129462046FFF7FFFDBFE61020BDE6E5 +:1048C000F8B506467D480D46016814468A4231D344 +:1048D0006068002808D07A4A90422BD301229204C3 +:1048E000904201D3884225D37648864204D0304690 +:1048F00004F085FC00280CD0304600F006FB06468C +:10490000284600F0BFFA002804D16068002802D0D1 +:1049100012E06448F8BD00236A463146284601F09B +:104920004FFF002802D0FEF7BCFBF8BD68460088A8 +:10493000800601D41020F8BD6188224628466368AD +:10494000FFF76AFEF8BDF7B55C4E0746306886B0E3 +:104950001446824202D2102009B0F0BD384600F061 +:10496000D4FA05465748874201D0FF2D08D00023CE +:1049700004AA2946079801F023FF002826D101E068 +:104980004848E9E76846008AC00601D54A48E3E797 +:1049900003A9002002910527019000976288494BE6 +:1049A0002946079801F0AAFE00280FD161683268F5 +:1049B000914208D30191029000972388628829468A +:1049C000079801F09BFE694689892180FEF769FB03 +:1049D000C2E7002907D03C4B0A881B899A4202D8BB +:1049E0003048401C704737E610B586B004236C464B +:1049F000A382354BDC88002C07D01B898B4201D267 +:104A0000914204D92748401C54E5062052E56B46E4 +:104A100019825A820021009101911C800221997013 +:104A200005A9029104A903916946FFF715FE41E526 +:104A3000F3B50C4685B0812069460873002C1BD065 +:104A4000059804F0DCFB070018D03878222869D3D9 +:104A5000059800F05AFA049000220121059807F009 +:104A6000CEFE00280CD000231A460321059808F03A +:104A700081F805000AD105E0102028E5094826E55F +:104A8000112024E50849114811F0CDFC28460830D2 +:104A90000BF032FB06462078012819D0022838D0C6 +:104AA000072014E502300000E8380000E1080000AB +:104AB0000328000000280000013400002800002026 +:104AC00000800100FFFF000000090020840A0000B0 +:104AD000A18803AAFEF71CFB0028CED1B00721D580 +:104AE0006846007B00281FD1A079C0071CD0E06871 +:104AF000002205216B4607C36389228968880499CF +:104B000001F018FC6946087300280DD0FEF7C9FAB9 +:104B1000DDE4A18803AAFEF7FBFA0028ADD134201A +:104B2000064201D10820D2E46846037B2946384674 +:104B3000059AFEF70BFDCAE4FFB597B0002001907F +:104B40001F4615460C460E46179804F058FB0028E1 +:104B500004D00078222803D20820A6E5F448A4E572 +:104B6000B80801D00720A0E5032F00D1002717982F +:104B700000F0CBF90890002C1BD0022D77D3ED4824 +:104B8000006884427CD361190091012902D0491E3A +:104B9000814275D3AD1EAAB22146E74810F036F81F +:104BA00000991E394A7F0B7F11021943884267D151 +:104BB000ADB2E248B90702D50189491C00E00121E4 +:104BC00089B20091F90701D0078900E0DA4F03AA02 +:104BD0000899009801F0F1FC0DE0F078B17800023E +:104BE000084310284CD80199091D401880B2019043 +:104BF000A84245D82618002E60D07078317800027F +:104C0000084300998842E8D358E06946098A0A07B0 +:104C100054D5002C3FD0019AA618121D92B20992C9 +:104C2000F278B37812021A439446102A28D8099AC7 +:104C30006244AA4224D87278337812021A4390420E +:104C40001ED1C8061ED509980AAA052120186B4650 +:104C500007C3707831780002084363460022089940 +:104C600001F068FB002803D0FEF71BFA1DE507E002 +:104C7000F078B178000208436946098D884201D076 +:104C80000B2012E5F078B17800020843099940182A +:104C900080B2019006E0C90604D50899FEF793FC9E +:104CA0000028E3D16946088A1021884369460882B2 +:104CB000488AFF23049A089901F0AAFD03A801F08D +:104CC00085FC002803D16846408AB8429DD900235C +:104CD0001A460321179807F04DFF040003D19849A5 +:104CE000984811F0A0FB20880028BFD0012108A817 +:104CF00001700173002646732188684601862046AC +:104D00000830099017980A90FCF712FE05001BD096 +:104D10001798688017206946888010AB023301AA73 +:104D2000052108A800950BF090FD0746687800075C +:104D300004D584488249223011F075FB002F09D038 +:104D40003846FEF71AFAB0E41321179805F04AFD29 +:104D50000320AAE40EA8009068468388042201215B +:104D6000179807F064FA00288BD126809DE4F0B5EF +:104D700000248DB01F4615460E46002A04D0B908FF +:104D800004D007200DB0F0BD1020FBE7032F00D1A9 +:104D9000002700F0BAF80390FF2804D06749B8074D +:104DA00003D5488902E06248ECE70120FA0702D007 +:104DB0004989491E00E0604906AA8FB2039901F0B3 +:104DC000FCFB38E06946898B090734D504AB052123 +:104DD0000022029300910192574B039901F08EFC3F +:104DE000002821D1002E21D06A46128A2988A218D3 +:104DF0003019121D914234D36946CA8B0270120ACF +:104E000042700A8A8270120AC27004A90522001D2B +:104E10000092029101906946C88B0B8A0022039987 +:104E200001F06CFC002801D00320ABE76846008A43 +:104E30002018001D84B206A801F0C8FB002804D089 +:104E4000822806D0FEF72DF99CE76846C08BB84251 +:104E5000B8D9002C07D0002E10D02988A01C814280 +:104E600003D20C208EE705208CE7224631463248DB +:104E70000FF0CCFE31190870000A4870A41C2C8079 +:104E800000207FE700B585B06946FEF79FFA00284D +:104E90000AD16846007C030011F0B6FB08052F2FED +:104EA0002F2F08080531032005B000BD6846807823 +:104EB000012807D1684600880321C902401A1CD086 +:104EC00001281AD068468079012806D16846808872 +:104ED00015214902401A05280FD96846807A012811 +:104EE00011D16846018929200002081A05D002283C +:104EF00003D0032801D0042805D10F20D4E712A144 +:104F0000164811F090FA0020CEE710B507F028FE01 +:104F100010BD10B50C4601F023FB002803D00AA1F8 +:104F20000F4811F080FA2046FEF7BBF810BD0000D4 +:104F30000230000028000020FFFF000000090020D0 +:104F4000E83800003F0B00007372635C67617474A3 +:104F5000735F636F72652E63000000002202000021 +:104F6000BB060000F8B500780C46164610340E3625 +:104F7000069F022809D0032836D005287ED0FF20BE +:104F8000F6A1E53011F04FFAF8BDCD890A2068434B +:104F90000E30188031203880002AF5D0087B9581AA +:104FA000801FC7B21AE020886168308048780A788C +:104FB00000021043F080C8788A78000210433081E4 +:104FC000B21C3846091DFDF772FE002F01D00028E3 +:104FD00002D000203071708008340A3628466D1ED9 +:104FE000ADB20028DFD1F8BDCD890A2068430E306C +:104FF000188032203880002AF5D0087B9581401F28 +:10500000C7B243E0616822880878F2803279C3072A +:1050100052085200DB0F1A43FD231A408307DB0FAF +:105020005B001A43FB231A404307DB0F9B001A4324 +:10503000F7231A400307DB0FDB001A43EF231A4064 +:10504000C306DB0F1B011A43DF231A408306DB0F65 +:105050005B011A43BF231A404306DB0F9B011A432F +:105060003271C00970718A784B7810021843308110 +:1050700032463846C91CFDF71AFE00E00CE0002855 +:1050800002D00020B070308008340A3628466D1EE9 +:10509000ADB20028B6D1F8BD087BCD89801E86B29E +:1050A0003046083068431030188034203880002A99 +:1050B000F1D0174695811037E800D681C0190090CD +:1050C0000DE020883880009878603246616800984A +:1050D00011F02BF800980834801908370090284602 +:1050E0006D1EADB20028ECD1F8BDFFB581B00A9DB0 +:1050F0001E460C46002A05D0607AFF300130D08071 +:10510000E089108101980E270078030011F07CFAE5 +:105110000B7E0719293541536C7878787E00009210 +:10512000087B082805D0032803D091A1954811F0E9 +:105130007AF9378030200FE000990020888105B08F +:10514000F0BD0092087B042804D08E4888A114305A +:1051500011F069F937803120288000980028EBD1C0 +:10516000EDE70092087B042804D0932080A1800002 +:1051700011F059F937803220EEE70092087B0228BF +:1051800004D080487AA13A3011F04DF937803320AD +:10519000E2E7087B1746042804D07A4874A14C3013 +:1051A00011F041F91020308034202880002FC6D023 +:1051B0000020B88116E0207B1746052806D0062877 +:1051C00004D070486AA1603011F02DF912203080AF +:1051D00035202880002FB2D0E089B88100203882A5 +:1051E00001984088F881AAE70092087B072804D03C +:1051F00064485FA1713011F016F937803620ABE7B3 +:1052000033460095019800F00EFC98E72F2053A13B +:10521000000111F008F992E770B50C46054603F05D +:10522000EEFF002804D00078222803D2082070BDA9 +:10523000554870BD00231A460421284607F09AFC01 +:105240002060002801D0002070BD032070BDFFB594 +:105250008BB00D4607461720694608850E98032631 +:105260001446002805D10EA93846FFF7D5FF0028BF +:1052700034D1002D0BD000220321384607F0BFFAAD +:10528000002834D00E980078002830D108E020782B +:10529000092819D00F2823D030A13C4811F0C3F8B9 +:1052A0000E98A760801D03AA606002320AA92046FA +:1052B00000F00FFC002827D0030011F0A5F9071A11 +:1052C000182323211C1E23000726002231463846BE +:1052D00007F095FA0028E3D12B48801C0FB0F0BDF1 +:1052E00000220321384607F08AFA0028D8D111207D +:1052F000F4E70020F2E70820F0E72348401CEDE740 +:105300000720EBE70320E9E701A800906846038D3A +:1053100004223146384606F08AFF0028DED1002DEF +:10532000DCD00E990D70D9E730B587B01D460C461C +:10533000002A11D0042369460B7013888B81528890 +:10534000CA81A2788A7422880A8200236A46294682 +:10535000FFF77DFF07B030BD1020FBE77372635C81 +:1053600067617474635F636F72652E630000000091 +:105370007372635C67617474635F636F72652E63DD +:105380000000000025020000023000004F03000072 +:10539000F3B581B001980C4600780826030011F09F +:1053A00033F9125F47471B134B0A0A0A0A0A0A0A13 +:1053B0000A0A0A0A0A5F002C02D1F849F84808E0F4 +:1053C0006078304360703CE0002CF9D1F448F34938 +:1053D000083011F028F8F3E70198002380880122B3 +:1053E00087B20421384607F0C5FB0546002C04D0DF +:1053F0007520EA49C00011F016F8002D04D1E848E4 +:10540000E649143011F00FF83946A81D00F058FB9A +:10541000FCF78EFA040006D0607830436070678035 +:10542000FCF767FA0FE01321384605F0DBF915E0C9 +:10543000DB48DA49283002E0D948D8492D3010F04D +:10544000F2FF002C0AD06078000707D59320207067 +:105450002046582208300199FBF7B6FE0020FEBD19 +:10546000CF48CE493130EAE710B500210170801DE8 +:1054700000F023FB10BD0A4610B50146901D00F058 +:1054800027FB10BD70B5002305461A46042107F01E +:1054900071FB040004D1F920C049800010F0C3FF63 +:1054A0002946A01D00F00CFB70BDF7B5054684B081 +:1054B0000C4600206946088188806F8803460122D7 +:1054C0000421384607F056FB060004D1FD20B349FD +:1054D000800010F0A8FF002C03D0A7800020E080FF +:1054E0002081297A20461230C91E142700900B0013 +:1054F00011F08AF80FFEFDFC3809A95E657A2FB21B +:10550000C9E99191FC003078012804D0A3497020AA +:10551000143110F088FFA9896A46C8000E309080C7 +:1055200030201081002C13D0A18100200DE0C1009B +:10553000327909190A747288CA8182005319DA898A +:105540004A821A8A401C8A8280B2A1898142EED89E +:10555000F1E002A8009001AB22462946304600F057 +:105560002BFAE8E03078042804D08C49BD201431AF +:1055700010F059FFA8890622014650436A460E30B2 +:10558000908033201081002CE2D0A18100200BE01C +:10559000062141434F190919FA89CA81BA7C8A74D4 +:1055A0003A8A401C0A8280B2A1898142F0D8C2E0C6 +:1055B000307806280BD079491431D72005E03078AF +:1055C000062804D07549EB20143110F02CFFE8892F +:1055D00069461230888035200881002CB8D0A9890E +:1055E000A1817188E18126E03078072804D06B49D9 +:1055F000FF20143110F017FFA8896A4601460E30CB +:10560000908036201081002CA2D0A1812046AA894A +:105610000E30296954E0E8896946123080B2382298 +:1056200088800A81002C7ED0A989A181287A10283F +:1056300007D00221A173E9892182EA8929690098AA +:105640003EE00121F6E702A8009001AB2246294680 +:105650003046FFF787FC6EE03078082805D04F49C8 +:10566000FF201431EE3010F0DEFE684637218780CF +:105670000181002C5FD0A989A18100206082208255 +:105680000120A07357E03078092805D04349FF2056 +:105690001431FF3010F0C7FE288A69461430888024 +:1056A00037200881002C46D00421A173A989A1814B +:1056B000E9892182298A618220462A8A143069690F +:1056C00010F033FD37E030780A2804D033493548EC +:1056D000143110F0A8FE6846372187800181002C24 +:1056E00029D00521A1730020A08102E01EE003E083 +:1056F0000CE0208260821EE002A8009001AB2246EE +:1057000029463046FFF7F1FC15E00CE00D20694614 +:10571000392288800A81002C05D00120E0800020F9 +:105720002081207307E00699088019E01C481B4976 +:10573000A43010F078FE6846069980880880002C16 +:105740000ED0684600892080684680886080287A6C +:10575000032805D0102803D0112801D00020307074 +:10576000002007B0F0BDF7B5568815460F46002358 +:1057700082B01A460421304607F0FCF9040004D137 +:1057800007480649C43010F04EFEA41D33462A4691 +:1057900039460094029800F022FBD0E45C530000EC +:1057A0009503000013020000F7B58CB00D461446B7 +:1057B00007A90C98FFF730FD002812D1B64E01273B +:1057C000002C0FD00321684601701021818208A8A7 +:1057D00002460690204605A9FDF78FFA00280BD057 +:1057E00007207BE50821684601708581C681052177 +:1057F0008774C90201820BE00798A17801712188A2 +:105800004180684605218774C90201828581C6816D +:1058100002460121079B0C98FFF719FD5EE508B5CC +:1058200001236A4693709D4B13800A460223694602 +:10583000FFF77AFD08BD08B501236A469370974BC0 +:105840005B1C13800A4603236946FFF76DFD08BD04 +:1058500000B587B000290CD002236A4613700B886C +:1058600093814988D18100230421FFF7F0FC07B020 +:1058700000BD1020FBE710B5002903D00523FFF77A +:1058800053FD10BD072010BD70B588B00D461446FD +:10589000064607A9FFF7C0FC00280DD1002C0DD04B +:1058A0000621684601708581C481079B02465C80A1 +:1058B00006213046FFF7CBFC08B070BD05216846D5 +:1058C00001708581F1E710B588B000290BD007245D +:1058D0006B461C709A81049100236A462146FFF7AB +:1058E000B6FC08B010BD1020FBE770B500241722ED +:1058F00088B0002914D00D782B0010F085FE062307 +:10590000050519041B231522D21E93B2CA88002A4A +:1059100002D08E68002E03D09A4203D90C20CBE728 +:105920001020C9E7042D05D08A88002A0AD101E099 +:105930000620C1E7012D11D0022D05D0042D18D06D +:10594000052D23D00720B7E709236A4613704B883B +:105950009381CB88D381896804911DE00C236A462A +:1059600013704B889381CB88D38189680824049174 +:1059700012E00D236A4613704B8893818B88D38184 +:10598000CB88138289680924059105E00E236A46B5 +:105990001370497811730A2400232146FFF757FC3E +:1059A0008AE700B587B00F236A4613709181002300 +:1059B0001946FFF74CFC5AE7FEB50078089D1C46D7 +:1059C00016460F46012803D03549912010F02BFDD3 +:1059D000F889C0000E30208030202880387B001FDE +:1059E000C0B20190002E1DD0F889B081002516E0CC +:1059F000E8008419C0190090224641690E320198CE +:105A0000FDF755F9002802D000202074E0810098AD +:105A10006D1C008A60820098ADB2408AA082B08975 +:105A2000A842E5D8FEBD70B514461425049A1D8021 +:105A300037231380002C0ED0CA89A28100226282F3 +:105A40000078082808D0092810D00A2819D014494D +:105A5000144810F0E8FC70BD087B0C2804D01148F5 +:105A60000F490C3810F0DFFC012008E0087B0D28FE +:105A700004D00C480A49083810F0D5FC0420A07363 +:105A800070BD087B0E2804D006480549001F10F0A1 +:105A9000CAFC0520F3E70000FFFF00000228000019 +:105AA00070530000BB02000010B5FE4B5860197225 +:105AB0001A80C90010F098FB10BD002101807047CA +:105AC00010B50022D2430280032007F0F8FC10BD7D +:105AD0007047F0B50E460446017801208840F2492F +:105AE00099B008400090616815460888EF4A9042D6 +:105AF00006D0009A002A06D0EB4A521E104202D06D +:105B0000012019B0F0BD009A10430880002D12D07A +:105B1000002028702178EA1C0027681C01920B00E5 +:105B200010F072FD10F30E16233A59616F3CB4B0B9 +:105B30008AB8F2F1F0F320780B28EBD00420E0E7EC +:105B400002212970A1890170090A4170032097E0A0 +:105B500004212970A1890170090A41700198E18925 +:105B60000170090A417005208AE006212970A18987 +:105B70000170090A41700199E2890A70120A4A709B +:105B8000218A0171090A4171A28AE81DA16910F0F8 +:105B9000CCFAA08AC01D73E0082129702178082959 +:105BA00001D110212970A1890170090A4170019861 +:105BB000E1890170090A41700520308020466A1D84 +:105BC00002A91030FDF799F800287DD16946308888 +:105BD000097A401854E00A212970A1890170090A44 +:105BE000417003200BE00C212970A1890170090A82 +:105BF00041700198E1890170090A417005203080E7 +:105C00009CE0A08984464000401C81B230888842D4 +:105C10005AD3052958D30E202870002008E02369A4 +:105C200042009B5A521953701B0A401C937080B259 +:105C30006045F4D33180B9E09A48417A002973D0A5 +:105C4000491E4172217B4068C9004518A98828680F +:105C5000082240180838216910F067FA02216846C6 +:105C600001710021417128680390A988684601816B +:105C7000002101A8FFF78CFB0020A880002E00D097 +:105C8000308093E0297880221143297029784022BE +:105C90001143297029788909890112312970A18954 +:105CA0000170090A4170E289E81C216910F03DFA8F +:105CB000E089C01C3080287841063FD5C00975D0E6 +:105CC00001216846017200E02CE000214172318818 +:105CD000091D81810495E189019808180590001D2E +:105CE00006907048017A68460177002102A8FFF704 +:105CF0004FFB074630880C303080022F06D0002F33 +:105D000054D065E03DE033E01CE05EE06548694664 +:105D1000097F4268CB00D218037A994202D2918857 +:105D2000002902D0042753E02FE0417A491C417238 +:105D30001560308890800020308049E06168A0893B +:105D4000888033E029788909890116312970A18971 +:105D50000170090A41700198E1890170090A4170D6 +:105D6000228A681D616910F0E0F9208A401D46E72B +:105D700028788009800118302870207B6870022004 +:105D80007EE760680188090401D4052720E0C08807 +:105D9000A189884201D006271AE01E202870012020 +:105DA0003080606801884904490C0180009800280F +:105DB0000ED03C4800220088A1688300032007F031 +:105DC000D9FA61682078887007E0002030800327C6 +:105DD0006068009902888A430280384691E6FFB5E0 +:105DE0009FB0289D0E46002805D0172803D82A8882 +:105DF0002E4B9A4202D1072023B0F0BD32785306D1 +:105E000001D4D20901D00820F6E700226B461A71AE +:105E10005A7114463278431E1D939BB2189303ABFC +:105E20001A939706CB1CBF0E1B93821E711C3B005E +:105E300010F0EAFB209011EE66EE74EEB0EED4EEB8 +:105E4000EDEEECEEEBEEEAEEE9EEEEEEE8EEE7EE8E +:105E5000E6EEE5EE90EE05287CD10421684601715E +:105E6000A9780172F078B278010211436846418145 +:105E70003179417170788006800E0C282ED009DCB3 +:105E8000801E030010F0C0FB0919661C6621662401 +:105E90006627660012282AD00ADC0E2821D0102896 +:105EA000DAD121E00C090020FF710000FFFF0000A3 +:105EB00016281FD01828CFD11FE02878800701E0CE +:105EC00028784007002845DA45E128780007F9E7F7 +:105ED0002878C006F6E728788006F3E72878400699 +:105EE000F0E728780006EDE72888C005EAE728886B +:105EF000C004E7E728888004E4E728884004E1E755 +:105F00002A78920726D50328A6D105206A46107163 +:105F1000487809780002084310811CE12978490774 +:105F2000F0D5062816D3717890B2012902D0022943 +:105F300092D101E0022100E01021189106216A4669 +:105F400011710021118102AF189AB11C0237921C05 +:105F50001B921AE0B3E04A780B7812021A433A8097 +:105F6000801E891C1790BA1C1A911898FCF79FFE86 +:105F70001A991898189A091817986B46801A1A894E +:105F800080B2521C1A811B9ABF1D8242E3D900289D +:105F900086D1E0E028780007B4D51D98694682B222 +:105FA0000720087100200881701C0A3111E0437835 +:105FB00007781B023B430B80C37887781B023B4367 +:105FC0004B806F463B89121F5B1C001D92B23B81C8 +:105FD000091D042AEBD2002A71D1BCE02978C90638 +:105FE0006DD502286BD308206946087100204881CE +:105FF00070780872844692B2B01C1A9919E089E050 +:1060000090E07EE067E05BE030E025E019E013E03F +:10601000BCE0437807781B023B430B80831C4B603A +:106020006346D21A6F467B8960445B1C92B27B81C7 +:1060300008319445EDD9CEE7287880063FD509226E +:1060400003E0287840063AD50A2268460271AA88F9 +:106050000281189A428107E0287800062FD50B208C +:106060006A46107118981081039174E02988C90557 +:1060700025D5022823D30C206946087100204881C9 +:1060800070780872844692B2B01C1A9914E0437872 +:1060900007781B023B430B80C37887781B023B4386 +:1060A0004B80031D4B606346D21A6F467B89604468 +:1060B0005B1C92B27B8108319445E8D98BE763E0A1 +:1060C0002988C90460D501285ED10D216846017177 +:1060D000A98801813FE02988890455D5052853D333 +:1060E0000E2269460A71AA880A811B99401F4A78C4 +:1060F000097812020A4369464A818881701D04901A +:1061000029E0298849043FD501283DD10F2069465F +:10611000087120E02A88120436D44A780B781202DB +:106120001A43EA8003282FD332789206920E1B2A54 +:1061300026D011226B461A712A880123DB031A43E9 +:106140002A804A78097812020A4369460A81C01EE9 +:1061500048811B98039030788006800E1B2809D058 +:106160001D2807D00320229907F0A9F92888C00B21 +:10617000C003288001A82199FFF70AF920463BE6D1 +:1061800010226B461A71DCE70724F7E70824F5E7CD +:1061900000B597B0032806D16A461070019100211E +:1061A0006846FFF7F5F817B000BD000010B58B7812 +:1061B000002B11D082789A4207D10B88002B0BD08C +:1061C00003E08B79091D002B08D08B789A42F8D117 +:1061D00003880C88A342F4D1002010BD812010BD9B +:1061E000052826D0002A02D0012A0DD102E0098814 +:1061F000090501E009888904890F07D0012918D011 +:10620000022909D003290ED081207047002A01D02D +:10621000032070470220704703280AD0042808D0C2 +:10622000002804D007E0042803D0022803D005206A +:106230007047002070470F20704770B513880546DF +:1062400014460B8018061DD5FE481022807AA842FD +:1062500003D813430B80002070BDA06893430078DF +:10626000E840C007C00E03430B802078A178800768 +:10627000800D0843F4490FF0D2FFA0686943081865 +:10628000401C70BD906870BD37B569468B8813801F +:1062900019061BD5EB4C0125A47A9168844209D8D4 +:1062A000FE280FD1D80602D5A5406D1E00E00025BE +:1062B0000D7007E085400C78DB06DB0FAC438340B4 +:1062C0001C430C7010881021884310803EBDF8B527 +:1062D0000746C81C80080E468000B04201D08620C8 +:1062E000F8BD082A01D90E20F8BDD64D00202E6039 +:1062F000AF802881AA723446E88016E0E988491CFC +:10630000E980810610D48007A178800D0843CE492A +:106310000FF085FF206800F0BAFA2989401880B292 +:106320002881381A8019A0600C3420884107E5D4F0 +:106330000020F8BDFFB589B09F041646139DBF0C21 +:106340000193099800F095FA04000AD0207800061D +:1063500009D5BC48817A0A98814204D887200DB0BB +:10636000F0BD0120FBE7224669460A98FFF765FF6A +:106370000690002069460872052D14D0012221469E +:106380002846FFF72DFF0028E9D1207840060AD5DE +:10639000022168460172099981810188C1810682C2 +:1063A0004782129805900198000404D500273E46C4 +:1063B0000125079709E02078A1788007800D084320 +:1063C000A14907900FF02BFF0D46019840040AD514 +:1063D0000798A84207D12088E1788005800F000245 +:1063E0000843B04201D3AE4201D90720B7E7B8193C +:1063F00080B20190A84201D90D20B0E76846007A2A +:10640000002804D002A8FDF706F90028A7D10798B4 +:10641000A8420BD1208803210902884301998905EC +:10642000890F0902084320800198E0701498002821 +:1064300000D007801298002815D006983A46801997 +:1064400012990FF072FE224669460A98FFF7F5FE90 +:1064500069460888102188436946088022460099C9 +:106460000A98FFF711FF002079E7FFB5754D0C2260 +:10647000E8882968504383B00C180D9F724905982D +:106480000FF0CDFE0091049800F001FA29682A89E6 +:106490008E46611A0C310918944651188AB2A9889F +:1064A000914202D8842007B0F0BD6A46168A3206AF +:1064B00003D5B20601D58520F5E7EA88521C92B2D1 +:1064C000EA800E9B002B00D01A80B20601D5A7608F +:1064D00006E0604480B22881091A70460818A0605E +:1064E0002246FE200499FFF7CFFE0598A070009881 +:1064F000E07020880599800889058000890F08438D +:1065000003210902884300998905890F090208437C +:1065100004210843208003988078A07103980088A4 +:10652000A08000202073310601D5AC7A00E0012460 +:10653000B10600D5002700260EE0052100200191BC +:1065400002900097E88831460C9B069AFFF7F2FE0E +:106550000028A8D1761CF6B2A642EED30020A2E70E +:10656000F1B5009800F085F9060002D00025009CE6 +:1065700014E00120F8BD204600F07BF907460078C2 +:1065800031498007820DB87810430FF048FE386813 +:1065900000F07DF94019641C85B2A4B22948C18875 +:1065A000601E8142E7DC00992648491EC1800189AE +:1065B000491B018100203070F8BD002804D0401E26 +:1065C00010809170002070470120704710B504467C +:1065D00001881C48C288914201D3822010BD006806 +:1065E0000C22514342189079A07290882081108823 +:1065F000D1788005800F00020843A081A078211D7A +:10660000FFF71BFE20612088401C2080E0800020D6 +:1066100010BD012101827047F7B50546002084B006 +:10662000C043108068681746817868468170686842 +:1066300001886846018000218171288A2C88A04247 +:1066400005D303E0180900200102000004462C8253 +:1066500035E0288A401C2882301D6968FFF7A6FDB6 +:1066600000282AD139889248814201D1601E3880A1 +:106670006888A04228D33088F1788005800F000216 +:10668000084302906946301DFFF790FD002814D1A1 +:106690006989874881421BD0002231460598FFF75F +:1066A0009FFD002809D16A890298824205D1E968D4 +:1066B000B0680FF00DFD00280AD0641CA4B220467B +:1066C00000F0D7F80600C4D1641E2C828220EAE6CE +:1066D0007C80B079B871B088B8803078B1788007A4 +:1066E000800D084378810298B8813946287A32466D +:1066F0000831FFF7A2FD38610020D4E6FFB585B070 +:106700001C460F46059800F0B4F8050009D028781B +:10671000000608D56748807AB84204D8872009B0B7 +:10672000F0BD0120FBE707982A468605B60D6946AD +:106730003846FFF782FD07460E98052816D000223E +:106740002946FFF74DFD0028E9D1287840060DD5F0 +:106750000121684601710599018101884181868185 +:10676000C48101A8FCF757FF0028D8D12888AA784F +:106770008107890D11438005800FEA7800021043DC +:10678000079A964207D04C4A914204D3611E814237 +:1067900001DD0B20C3E7864201D90720BFE7801B3C +:1067A00082B2A24200D922461098002800D002806E +:1067B0000F98002802D0B9190FF0B7FC0020AEE7FF +:1067C000F8B51D4617460E4600F053F8040008D0F1 +:1067D0002078000607D53748807AB04203D8872052 +:1067E000F8BD0120F8BD224639463046FFF725FDA9 +:1067F000002D0BD02078A1788007800D08432E490A +:10680000884201D2012000E0002028700020F8BD5D +:10681000F8B51E4617460D4600F02BF8040008D0C8 +:106820002078000607D52348807AA84203D887201D +:10683000F8BD0120F8BD224639462846FFF724FD61 +:10684000FF2E14D02588A178A807800D08431A4987 +:106850000FF0E5FC002E03D1FF31FF31033189B287 +:10686000A170A80880008905890F084320800020B6 +:10687000F8BD1049CA88824207D3002805D00C22EF +:10688000096850430C38081870470020704703B55A +:106890000846694609888A0607D4090604D50549C9 +:1068A000897A4143491C88B20CBD00200CBD000010 +:1068B000FFFF00001809002001020000F8B507786A +:1068C0000D460446012F19D0072F02D00C2F19D1E5 +:1068D00014E0A068216906780B2E0BD0052006F085 +:1068E000EEFD052E0ED0782300220520216906F04A +:1068F00041FD07E0782300220620F8E70520216902 +:1069000006F0DDFD002D0ED000202870294620461F +:1069100004F0AEF9FE482978C05D884201D1032019 +:10692000F8BD0220F8BD0021204604F0A1F90020A6 +:10693000F8BD70B50E460C462036317901208AB07C +:106940001546002909D0012905D12978042902D149 +:106950000520107000200AB070BD6068019005A885 +:1069600002900D21C01C0FF03DFC032205A8A16878 +:106970000FF0DBFB01203071062069460870206AA9 +:10698000049029466846FFF799FFE4E770B50C4686 +:10699000154620310A790120062686B0002A2CD01F +:1069A000012A28D12978042925D169681022A068F4 +:1069B00001F0B4F96868C07B000606D5D44AA06827 +:1069C0001023103A014601F09EF91022A168E068F8 +:1069D00001F0A4F9A068C07B000606D5CC4AE068A7 +:1069E0001023103A014601F08EF92E70A0686860FD +:1069F000E068A860002006B070BD60680190C448DF +:106A0000203802900120087168460670206A0490C0 +:106A100029466846FFF752FFEDE7027B032A06D0BE +:106A2000002224235A540B78092B02D003E00420BF +:106A300070470A76CA61027B9300521C0273C150F0 +:106A400003207047F0B50E4615460C462036024628 +:106A500031790120072393B000290CD0012924D0DB +:106A600002292ED0032904D12978042901D12B70C1 +:106A7000002013B0F0BD01203071606800280DD0F7 +:106A8000A1690B7060684860206988606069C860AF +:106A9000206A08621046FFF7C0FFEAE70620287068 +:106AA000206968606069A86009E029780629E0D15A +:106AB0000220307104202870954820386860032037 +:106AC000D7E729780429D4D1A08910280AD9103809 +:106AD00080B2A081A1681023091805A86A6801F096 +:106AE00012F923E010282FD0C2B21020801AA1681A +:106AF0000DAF1190C0190FF018FB11980006000E91 +:106B000006D0401EC1B28020785438460FF06AFB90 +:106B1000626910230DA909A801F0F5F8102309A94D +:106B200005A86A6801F0EFF80320307160680190F1 +:106B300005A80290062069460870206A049029463C +:106B40006846FFF7BBFE94E710232269A168E2E7DD +:106B5000F0B50E460C4620363179012006278FB05D +:106B6000154600290BD0012932D0022905D12978F8 +:106B7000042902D10820107000200FB0F0BD217D43 +:106B800008A8CA07D20F02718807C10F08A80171AF +:106B90006846027041700722801CE1680FF0C5FA58 +:106BA00002A80722013021690FF0BFFA6068059042 +:106BB0000AA8069010236A46A16801F0A4F80120F3 +:106BC000307168460774206A0890294604A820E0BE +:106BD00029780429D1D1062205A8E1690FF0A5FA88 +:106BE00006A806220230A1690FF09FFA0020089043 +:106BF0006068019009A80290102305AA696801F055 +:106C000082F80220307168460770206A0490294695 +:106C10006846FFF753FEB0E770B50D460C462035C9 +:106C2000297901208CB01646002909D0012905D107 +:106C30003178042902D10920107000200CB070BDF9 +:106C40006068019006A802900822E1680FF06DFAD2 +:106C5000082208A8A1680FF068FA01202871062010 +:106C600069460870206A049031466846FFF726FEA0 +:106C7000E4E770B50D460C462035297901208CB02B +:106C80001646002908D00129D8D131780429D5D158 +:106C90000A2010700020D1E76068019006A80290D9 +:106CA0000822A1680FF041FA002008900990012005 +:106CB0002871062069460870206A049031466846AB +:106CC000FFF7FCFDBAE730B50B4620331C790120F5 +:106CD0008BB0002C09D0012C05D11178042902D1E8 +:106CE0000B20107000200BB030BD4868019005A843 +:106CF00002908C6868462578057564784475CC6880 +:106D0000257885756478C47500200690079001E0A9 +:106D10002867010008900120187106236846037057 +:106D2000086A049011466846FFF7C8FDDBE770B5B6 +:106D30000C462034034625790120002D0AD0012D70 +:106D400014D0022D05D111780A2902D10C2010701F +:106D5000002070BD01202071C868052202704A68B9 +:106D60004260F84A8260921CC2600BE015780B2DDD +:106D7000EFD102202071C868042404705268426078 +:106D80008A688260096A016201461846FFF745FE7B +:106D900070BD30B5011D02463132947803258379E8 +:106DA000ED432C4323408371DB070DD04B7954799D +:106DB00023404B710B79127913400B718278C9789B +:106DC0008A4200D9817030BD00224A710A71F5E70C +:106DD000F7B50C4686B00020694626460870203676 +:106DE000317901271E2015461F2977D24B007B449D +:106DF0009B885B009F441E0017023E0256026902F8 +:106E000088029A02D102F5022E03590371037F030F +:106E1000AE03C303CC03F7031A0464049A04AB045F +:106E2000DF04FE0410052A0565059B05C6058305DC +:106E300087058B056069002802D0007813287DD073 +:106E4000A0680590002849D0012168460170206A99 +:106E500004900321684601710A214171E0690290A2 +:106E600020790028EFD0059909780029E7D00C296E +:106E700064D20B000FF0C8FB0CFD1A4B90B5E8FC78 +:106E8000FBFAF9F807FD022828D16069002802D032 +:106E90000078082852D1022168460170206A0490C7 +:106EA00005984178684601710021B9E20620216AFF +:106EB00006F005FB20790728E6D1606900F050FF55 +:106EC00002280CD0606900F04BFF042807D06069ED +:106ED0000028B8D000780128D6D103E01BE2616910 +:106EE0000120087005980079C11F0A2901D30A20E2 +:106EF00050E06169072288706069059930300FF0B1 +:106F000014F90120307161690320087034E007280A +:106F1000BAD16069002896D001780929B4D10599C1 +:106F2000C978890707D1059949790029DFD10599E1 +:106F300089790029DBD105994A7900E04EE20146C2 +:106F400020314B7D9A43D2D1059A8B7D92799A4319 +:106F5000CDD1059A1279D31F0A2BC8D20979914253 +:106F600036D80722C01C05990FF0DFF801203071D8 +:106F700061690A200870032069460870206A04903D +:106F80006069313001906069001D029060691C30B9 +:106F90000390A1E22076F2E311288DD1606900F020 +:106FA000DFFE042804D0606900F0DAFE0B2893D1DC +:106FB0006069059910223730491C0FF0B6F86069F6 +:106FC000017804297CD12421095C8278914201D97D +:106FD0000620DFE70521017003203071684601704B +:106FE000E2E3112894D1606900F0BAFE062804D0CB +:106FF000606900F0B5FE0C288AD1E068002813D043 +:107000002069002810D060690178062910D00D2170 +:1070100001706069059910225730491C0FF085F8FE +:107020006069573009218CE100206946087072E1DF +:10703000072101706069059910224730491C0FF043 +:1070400074F860694730EDE70228F0D1606900F01C +:1070500087FE0028EBD0606900F082FE0128E6D0B0 +:10706000606900F07DFE05E0B1E08DE06CE02AE0B3 +:107070000AE0D6E00828DAD00521684601710598B3 +:1070800041786846417146E11128D0D160690028F5 +:10709000CDD001780E29CAD1C16A4078022810D01B +:1070A0000020142250431430085805991022491C1E +:1070B0000FF03BF80520216A00F040FE0F205EE053 +:1070C000F1E10120EDE70B28B1D160690028AED0D5 +:1070D00001780F29ABD1C16A4078022826D0002060 +:1070E000142250430C300958059842780A70807871 +:1070F00048706069C16A4078022819D000201422C3 +:1071000050431030085805990822C91C0FF00DF89B +:107110000520216A00F012FE60694178022909D039 +:1071200000220832825C5208520073E00120D7E747 +:107130000120E4E70122F4E7012100E00021083109 +:107140004254BCE30267010011289CD16069002809 +:1071500099D00178102996D1C16A4078022811D0BF +:107160000020142250431830085805991022491C59 +:107170000EF0DBFF0520216A00F0E0FD11206169BF +:107180000870B4E30120ECE7082884D16069002886 +:107190009DD00178112997D10599C06A497801706D +:1071A00060690599C06A0622401C891C0EF0BDFF6B +:1071B0000520216A00F0C2FD60694178022904D0EF +:1071C00000220832825CFD2323E00122F9E7112826 +:1071D000BBD160690028BBD001781229B5D1C16A42 +:1071E0004078022819D00020142250431C3008583F +:1071F00005991022491C0EF098FF0520216A00F025 +:107200009DFD60694178022909D000220832825C24 +:10721000FB231A40022991D18EE70120E4E70122E5 +:10722000F4E70720B6E6287801288ED160696968FE +:1072300014221C30F9F7C8FF6069017F002901D0D2 +:107240002176ACE30178032901D0032037E002273F +:10725000C77081794907490F8171017A4907490F40 +:107260000172417A4907490F41726069FFF791FD48 +:10727000377196E228780F28E3D107206946087015 +:10728000216A049191680291694608716169072237 +:10729000C91C02980EF049FF6169042008700020A3 +:1072A0003071BBE028780328CBD1606901780529CB +:1072B000696807D0082247300EF037FF042030718C +:1072C00005206FE208225730F6E728780328B8D166 +:1072D000606901780529696811D008224F300EF0E5 +:1072E00024FF052030716069006A00280AD002205E +:1072F0002870002028716069006AA860F9E00822FF +:107300005F30ECE704204DE22878022899D12879F3 +:10731000002801D0207642E36069A96801626069B3 +:10732000002901D1F949016206200BE228780F28D3 +:1073300087D1A868E0616069017805292BD04730C2 +:1073400007213171E16802220A706269126A4A609B +:10735000886060693030C8606069C01C086162691B +:10736000087D926A400812784000D207D20F10437D +:1073700008756269926A521C8A61FD221040626936 +:10738000D26A1278D207920F104308756069C06AFA +:10739000401CC86153E25730D2E728780828BAD198 +:1073A0006069017805291AD00B2101700720694610 +:1073B0000870206A0490E069029011200871029818 +:1073C0000321017051681022401C0EF0AEFE002116 +:1073D0006846FFF773FA00203071E06187E206210A +:1073E000E3E728780F2896D1072069460870206ABD +:1073F0000490A8680290112008710298042101707D +:1074000061690A78072A0ED0002232710C220A70B4 +:1074100061691022401C47310EF087FE002168464A +:10742000FFF74CFA63E21022401C57310EF07DFE4C +:1074300000216846FFF742FA0A203071E168032014 +:1074400008706069006A48606069573088606069E8 +:107450004730F3E128780828A1D1606969681022D3 +:1074600037300EF035FE002801D0042092E5606927 +:107470000078072817D00A203071E16803200870CF +:107480006069006A486060695730886060694730A9 +:10749000C860206A08620698FFF7BFFA074660696D +:1074A000FFF777FC6BE208207AE1287809289AD167 +:1074B0000B20307161696868897810224018511A70 +:1074C0000EF090FE082069460870206A04906868F3 +:1074D000019060698078087268E129780D29BBD134 +:1074E00061698979C90703D00C20307109203EE019 +:1074F0003071032770E228780E28ADD1606914221C +:10750000291D1C30F9F760FE6069018DC06A417267 +:10751000090A817260698178C06AC1716169CA6A49 +:10752000081D117AC909C9011172437962691943A9 +:107530008378D26A9B079B0F012B00D00023007930 +:107540009B01C00003431943117260694078012810 +:1075500076D0B4E160694178022901D0012100E0D0 +:1075600000210831405CC00707D00E20EAE06946E0 +:107570000870206A1146049019E11320B8E72878B2 +:107580000F2894D1A868E0610F2030710520EEE744 +:10759000287803288BD16069C16A4078022801D01D +:1075A000012000E000201422504310300858082227 +:1075B00069680EF0BAFD10203071E168062022697A +:1075C00008706069406A48606069C36A4078022850 +:1075D00001D0012000E00020142778431030185813 +:1075E000CA6088602BE128780C2886D16069C26A5D +:1075F0004078022801D0012000E0002014214843F7 +:107600000C30105802230932696800F07CFB11200D +:107610003071E168052008706069006A486060693F +:10762000C06A093088603948001F07E128780B28B4 +:10763000A7D161694878CA6A022802D0012001E016 +:1076400059E1002014235843143010588A7869688F +:107650000EF06BFD60694178C26A022901D00121F8 +:1076600000E00021142359431431525881785018F6 +:107670001022511A0EF0B6FD072069460870206AE4 +:107680000490E069029011200871029806210170AF +:107690006169CA6A4978022901D0012100E000210C +:1076A00014235943143151581022401C0EF03DFD53 +:1076B00000216846FFF702F90020E06112206FE028 +:1076C00028780F2891D1072168460170206A04901C +:1076D000906802900B2268460271029801706169FD +:1076E000CA6A4978022901D0012100E0002114234F +:1076F00059430C3151580A78427049788170616958 +:10770000CA6A4978022903D0012102E00867010012 +:10771000002114235943103151580822C01C0EF087 +:1077200004FD00216846FFF7C9F826E76069417843 +:10773000022901D0012100E000210831405C8007CE +:1077400003D5142030710A2011E71620D0E62878DE +:107750000F287AD1A868E061072069460870206A7E +:107760000490E069029011200871029808210170CC +:107770006169CA6A4978022902D0012101E011E158 +:10778000002114235943183151581022401C0EF087 +:10779000CCFC00216846FFF791F80020E06115203D +:1077A00030710A2069460870206A049029466846AC +:1077B000FFF784F82BE028780F2846D10720694688 +:1077C0000870206A0490906802900820087102985E +:1077D0000921017061690622C969097841706169EE +:1077E000801CC969491C0EF0A0FC00216846FFF707 +:1077F00065F8AAE760694178022901D0012200E01A +:1078000000220832805C400703D51720C8E70746EE +:10781000B5E0012953D070E028780F2815D1A86869 +:10782000E06118203071E168052008706069006A25 +:1078300048606069C06A09308860F848C860206A9A +:1078400008620698FFF7E9F8E1E76FE028780B286F +:107850006CD16069C16A4078022801D0012000E043 +:107860000020142250431C300858102269680EF082 +:107870005CFC072069460870206A0490E069029069 +:107880001120087102980A2101706169CA6A497859 +:10789000022901D0012100E00021142359431C31A9 +:1078A00051581022401C0EF040FC00216846FFF7A2 +:1078B00005F80020E0616069407801281DD1192099 +:1078C00016E660694278022A09D000210831411881 +:1078D000097800290DD0CA0703D00E2106E0012146 +:1078E000F4E7890701D5102100E01221017000277B +:1078F00072E0012A01D00D20FAE51C20F8E51D20D8 +:1079000030710B2033E62978102948D1F0E5606901 +:107910000178012943D0082941D00021317100F0BC +:1079200019FA0C2069460870206A049037E028781C +:107930000F2805D01020107003271B2030714BE05A +:10794000072168460170206A0490A868029002210D +:1079500068460171029805210170217E4170002165 +:107960006846FEF7ABFF0B2168460170206A049061 +:1079700029466846FEF7A2FF07461B203071012FFB +:107980000DD029E0012168460170206A049004218D +:1079900068460171217E41710020207612E0207E30 +:1079A00000280FD06169132008701A2030710A2056 +:1079B00069460870206A049029466846FEF77EFFF3 +:1079C000074609E06069002801D01421017068466B +:1079D0000078002800D021E5384609B0F0BDF7B5A1 +:1079E0000F4620373879012686B00C46002804D08F +:1079F000012828D002281CD197E02079012804D042 +:107A0000022811D0032814D10AE0A0684078012888 +:107A10000ED10620216A05F02CFD00287FD10CE054 +:107A2000A1681320087008E0A0684178022901D0FD +:107A3000052674E00078082871D1012038710A20E9 +:107A40006946087033E0089800780F2867D107214D +:107A500068460170206A049008988568029522792A +:107A60000220012A04D0022A29D0032A57D10FE08C +:107A70000646684606710B202870207B00214007CF +:107A8000400F68706846FEF719FFA068067045E071 +:107A900006466846067105202870207B6870002124 +:107AA0006846FEF70BFF3E710B2168460170206AA5 +:107AB000049068460899FEF701FF06462FE06846E5 +:107AC000017101202870207C6870607CC007C00FA5 +:107AD000A870A07C4007400FE870E17C2971C007C6 +:107AE0001FD0207D4007400F6871607D4007400F28 +:107AF000A87100216846FEF7E1FEA068072229462A +:107B000030300EF012FBE068017AA068203001717D +:107B1000A16828798870A16809200870002630467D +:107B20005BE70020A8716871E3E7A1681420087082 +:107B3000012168460170206A0490042168460171A1 +:107B4000217B41710021FEF7B9FEE7E7F0B585B072 +:107B50000F4605460124287B800040198038C66FF7 +:107B60003078411E0A290AD22C498000323140184F +:107B70008038C36F3A463146284698470446002C61 +:107B800001D0012C11D1287B401E0006000E287365 +:107B900001D00324DFE70D2069460870306A0490A5 +:107BA000002101966846FEF789FE032CD3D02046BB +:107BB00005B0F0BD70B515460A4604462946104684 +:107BC000FFF7C4FF0646002C0FD0207814280CD1F4 +:107BD000207E002806D000202870204629460C3040 +:107BE000FFF7B4FF204600F0B5F8304670BD70478F +:107BF00010B5012903D0022901D0052010BD417024 +:107C000000F0A8F8002010BD002809D0027E002A4C +:107C100006D00A4601460C31CCE700000667010099 +:107C20000120704730B5044687B00D46062005F0A8 +:107C300046FC2946052005F042FC2078142805D092 +:107C40000020694608702046FFF7DEFF07B030BD10 +:107C50007FB50E4600216A4611730178092903D0C9 +:107C60000A2903D0002407E0446900E08468002C5E +:107C700002D0217E002912D0154601462846FEF783 +:107C8000CCFE032809D1324629462046FFF792FF51 +:107C90006946097B002900D0042004B070BD254648 +:107CA0000C35EAE700B50023012285B005280CD089 +:107CB000062808D1684602700491022101714371BF +:107CC0000021FEF7FBFD05B000BD6846027004917F +:107CD0000271F4E710B590B00C4605216A461170A8 +:107CE000019022480290001D03900AA96846FFF700 +:107CF000AFFF002805D1102220460B990EF015FA8F +:107D0000002010B010BD30B505E05B1EDBB2CC5CCE +:107D1000D55C6C40C454002BF7D130BD10B50024A5 +:107D200009E00B78521E5B00234303700B78401C64 +:107D3000DC09D2B2491C002AF3D110BD70B50C4643 +:107D4000054605F0BCFB782300222146284605F0B5 +:107D500011FB70BD4178012900D0082101707047E6 +:107D6000002801D0007870470820704700670100A4 +:107D700038B50446002069460870204609F053FDD6 +:107D8000002803D1FBA1A3200EF04DFB204609F0F3 +:107D900099FC002803D1F7A1A8200EF044FB684607 +:107DA000007838BD70B5F84D002428462C77203077 +:107DB0008471C47101F09AF928464038047020306B +:107DC0008473847484772C75AC7170BD10B50C46C7 +:107DD000EE4982888A8042884A8000780870084686 +:107DE0000E38847009F050FC08F0FDFFFFF7DAFF51 +:107DF00020460BF013F8E449A8310846813809F011 +:107E0000ADFEE2480CF021FBE0480A3808F0FEFF26 +:107E1000002803D0D7A1C5200EF005FB01F066F9BC +:107E200010BD7CB50E461D46144601A909F008F8A0 +:107E3000002807D10AF091FB022803D1D248007D27 +:107E4000002801D001207CBD01988030807C09F0A1 +:107E50004DFC00280CD0684609F052FC0028F2D0F6 +:107E6000002C03D009F011FCA04206D200207CBDFA +:107E7000C0A1C7480EF0D7FAF8E7009809F0D8F883 +:107E80003146009809F0DBF8E2B22946009809F083 +:107E9000F0F909F045FC002804D1BD48B5A11E3019 +:107EA0000EF0C1FAB94C00250E3C6068A030417953 +:107EB000002902D045710BF0D8F860688030458306 +:107EC000C0E730B40179002904D0012907D030BCC3 +:107ED00000207047831D42880488022103E0428805 +:107EE0000488831D0121204630BC9AE7F8B51D4661 +:107EF00014460E4607460AF030FB022803D0A2487B +:107F0000007D002823D0A1480E3841684988398077 +:107F100040688030807C09F069FD002804D153203E +:107F200094A1C0000EF07FFA684609F069FD0028B0 +:107F30000DD0009809F0BAF83070022808D0012856 +:107F400006D093488BA167300EF06DFA0020F8BD83 +:107F50002946009809F0A4F92080002804D1552072 +:107F600084A1C0000EF05FFA09F05DFD002804D185 +:107F7000874880A160300EF056FA0120F8BD38B570 +:107F80000446831D821C6946FFF7B0FF00280DD010 +:107F90000020607168460078012808D0022806D0C9 +:107FA000FF2074A101300EF03EFA012038BD20718F +:107FB000FBE7F8B50AF0D1FA744D734C0E3D022878 +:107FC00002D0207D00287DD0207F0026102818D1E7 +:107FD000A079002803D067A16E480EF024FA6868E3 +:107FE00001464030827F92070BD526724988618115 +:107FF000C17F2173018CE181408C20820120A0711E +:108000002677614F203FB87C00285ED168686946BA +:108010008030807C09F007FC002805D0694668782C +:1080200009784018687004E05A4852A119300EF0DF +:10803000FAF9207D00283AD06868418852484038D3 +:10804000806D4088814204D00F204AA1C0010EF00B +:10805000EAF968688030807C09F0C8FC002804D107 +:108060004C4844A124300EF0DEF909F0EEFC002863 +:108070001DD068688030807CFFF77AFE69784018F0 +:10808000687041484038806D4030417A01290DD1F7 +:108090002670696849886180807A20710120B877EC +:1080A000207F102801D0282800D1267726756978EE +:1080B00000290AD06868428833484038C286018760 +:1080C000012000E001E0B8746E700AF029FA00287F +:1080D00005D1207D002802D0A878FAF7F9F8F8BD7C +:1080E000F8B50446FFF765FF274D0026203DA87E22 +:1080F000002808D0667010202070E87EA070287FCD +:10810000E070AE769AE0204F403F3878002808D0E3 +:108110002C22B91C20460EF008F80E2020703E706C +:108120008CE0A87B184F002815D0387F102808D085 +:10813000282806D0002804D0FF200EA1C2300EF05F +:1081400072F90120E070E87BA070287C60700F203D +:108150002070AE7372E00121204609F099FC0028DE +:108160001AD0387D002857D10021204609F090FC14 +:10817000F8BD00007372635C6C6C5F6374726C2E8C +:1081800073302E630000000094090020720000206C +:108190004F02000062070000A97CF8480090F848F0 +:1081A000002910D0017805290DD2491C0170667094 +:1081B0000D202070012028750622A01C00990DF0CA +:1081C000B4FFAE743AE0EE480670B879002812D0D9 +:1081D000387F002804D00120EA4940020EF023F93C +:1081E00066700120E54920700A221431A01C0DF0B0 +:1081F0009CFFBE7122E020460CF083F800281DD1C0 +:10820000A87C002802D0DE480178CEE7A87F0028AD +:1082100002D0387D002801D00020A9E7387F00284F +:1082200003D0D849D8480EF0FEF866700A202070B6 +:1082300006223946A01C0DF078FFAE77012097E7A3 +:108240004EE710B5CD4C343C2178002904D01321E1 +:108250000E2000F052FF10BDC9490088091D08F02A +:10826000EFFD002801D0022007E0C5484068014624 +:1082700020318A79012A02D00C20207105E00022E9 +:108280002271097E21724088E080012060711321F3 +:10829000E1700E21A170207010BDB84810B53438BF +:1082A0000178002904D024210E2000F026FF10BD03 +:1082B000012101702422C2700C220271417110BD93 +:1082C00070B5AE4C0546343C2078002804D03E21E1 +:1082D0000E2000F012FF70BD0AF03FF9002808D10F +:1082E0000AF03EF9002804D1A4480C30007F002891 +:1082F00001D00C2003E0287809F033FD0020207124 +:10830000012060713E21E170207070BD9B4810B566 +:1083100034380178002904D03C210E2000F0EDFE15 +:1083200010BD00210171012141713C22C270017018 +:1083300010BDF8B5914C343C2078002804D03B2186 +:108340000E2000F0DAFE13E70020A0710AF005F914 +:108350008A4E01250C36022802D0307D002840D0FC +:10836000874F694678688030807C09F073FA00286E +:1083700003D1844985480EF056F8307D002806D098 +:10838000A06D4030407A002801D0012600E0002690 +:1083900078688030807C09F029FB002804D17B4874 +:1083A000784908300EF03FF809F04FFB684031463D +:1083B000014316D07968FD2249882181217E400041 +:1083C000490849003143114001432176684600784D +:1083D000002802D00420014301E0FB200140217667 +:1083E000A5710020207165713B20E0702570BFE60B +:1083F00010B5624C343C2078002804D00E21084689 +:1084000000F07BFE10BD5E4906220831A01D0DF074 +:108410008CFE00202071012060710E21E17020701F +:1084200010BD70B5554C0546343C2078002804D06A +:1084300038210E2000F061FE70BD50480C30007FE6 +:10844000002807D00C202071012060713821E170D4 +:10845000207070BD287809F072FC28780CF05BF968 +:108460000020F0E770B5454D0446343D28780028DB +:1084700004D037210E2000F040FE70BD3F480C3084 +:10848000007F002801D00C200AE03D4E2188706852 +:108490004088884203D10AF060F8022807D0022001 +:1084A0002871012068713721E970287070BD7168EA +:1084B0007F2020310876487600208876A2788A715D +:1084C000E278CA7122790A72EAE710B52B4C343C83 +:1084D0002078002804D039210E2000F00EFE10BDB7 +:1084E0000AF03BF8032808D00AF03AF8032804D031 +:1084F00022480C30007F002801D00C2003E01F49E7 +:1085000000202C31C8712071012060713921E17087 +:10851000207010BD70B5194C0646343C20780028F8 +:1085200004D03A210E2000F0E8FD70BD0AF015F8E5 +:10853000032808D00AF014F8032804D00F480C30A0 +:10854000007F002801D00C2011E00C4D2C35E8797B +:1085500008280BD20001001910223146683000F0C3 +:10856000D6FDE879401CE871002000E0072020716A +:10857000012060713A21E170207070BD88090020EF +:108580006400002074810000210200001708000030 +:10859000F8B5FA4E04463078002804D03D210E206C +:1085A00000F0ABFDE4E5F5484030007F002801D045 +:1085B0000C2034E0F24D218868684088884203D15D +:1085C00009F0CBFF022801D0022028E06F68648800 +:1085D000FD883A896800B988401C844218D3E9486C +:1085E00041431046E84A50430DF019FE401EFF215A +:1085F00080B2F531884200D90846844200D2204634 +:10860000691C401C0DF00BFE6D1C6843401E85B2BA +:10861000E620C05D002800D1BD84F58000203071C7 +:10862000012070713D21F1703070A1E5F8B5D34C97 +:1086300005462078002804D035210E2000F05DFD8D +:1086400096E5CE484030007F002801D00C2016E08F +:10865000A878002801D0012804D1A888FF21F5318D +:10866000884201D912200AE0C54F298878684088DD +:10867000884203D109F071FF022807D0022020713F +:10868000012060713521E170207071E57968002664 +:108690000846C0310E70AA884A800122A0300271BB +:1086A000AA78012A00D000220A704079002801D05F +:1086B0000AF0DBFC2671E3E770B5B04C0546207884 +:1086C000002804D030210E2000F017FD55E709F0F6 +:1086D00044FF002804D1A9484030007F002801D081 +:1086E0000C2003E028780AF0E0FB00202071012034 +:1086F00060713021E17020703FE770B59F4C0546F6 +:108700002078002804D033210E2000F0F6FC34E756 +:1087100009F023FF002804D198484030007F00284A +:1087200001D00C2018E02978002911D00A290FD097 +:1087300014290DD01E290BD0282909D0322907D0A1 +:108740004B2905D0642903D0FF2901D0122003E072 +:1087500028460AF023FC002020710120607133219B +:10876000E170207009E770B5844C06462078251D1D +:10877000002804D032210E2000F0BFFCFDE6314677 +:10878000002009F0AEFA2870002805D17C480622A6 +:10879000314608300DF0C9FC012060713221E170D2 +:1087A0002070EAE670B5754C2178002904D031219B +:1087B0000E2000F0A2FCE0E600214156012504292C +:1087C00012D0002910D0081D0ED0001D0CD0001DA5 +:1087D0000AD0001D08D0001D06D00A3004D00A308F +:1087E00002D01220207103E0084606F079FD657181 +:1087F0003120E0702570C0E6FEB5604C0746207859 +:10880000002804D025210E2000F077FCFEBD38881A +:10881000694608F015FB594D01460020083500292E +:1088200004D002212171286028710FE00098009E79 +:108830000A30019060360020B07105222846019967 +:108840000DF073FCB0790028F5D13888E0800E2057 +:10885000A0702520E070012060712070FEBD10B571 +:10886000464C2078002804D005210E2000F045FC5D +:1088700010BD0020207108F008FFE08008F0D1FF53 +:108880002072012060710521E170207010BDF1B5EA +:108890003A4C2034A07B002804D010210F2000F097 +:1088A0002CFC65E4354D4035A8790C2610270028AE +:1088B00016D1287F002813D109F04FFE022824D1B9 +:1088C0002F4800994068098842888A421DD1014694 +:1088D000C0310A7A002A05D04030807F80070DD44D +:1088E000E6730EE05E22125C920707D406220A723B +:1088F000A0304079002801D00AF0B7FB2F77002084 +:10890000E07327740120A07332E40220F8E710B569 +:108910001A480178002904D00F210E2000F0EDFB49 +:1089200010BD00210171FF2181710021C943018126 +:1089300013490E310A7882728A8882814988C181FE +:10894000012141710E2282700F22C270017010BD90 +:1089500010B50A4C2078002804D02B210E2000F0FE +:10896000CCFB10BD0821A01D04F024FB00202071C9 +:10897000012060712B21E170207010BD540900208E +:1089800064000020C40900001027000070B5FA4DF3 +:1089900004462878002804D02A210E2000F0ADFBE0 +:1089A000EBE5F54810222146303800F0B0FBF248E4 +:1089B0001022A118203800F0AAFBEF4830380CF044 +:1089C000BCFBED49102210392C46A81D00F09FFB7E +:1089D000002020710E20A0702A20E070012060711C +:1089E0002070CAE5F8B50546E348E34C40300090F6 +:1089F000007F0C2628272034002801D0E6733EE0B3 +:108A0000A07B002804D028210F2000F076FB04E48E +:108A1000A87805280DD013280BD0142809D01528C4 +:108A200007D01A2805D0292803D03D2801D03B289B +:108A300003D12888D149884201D912201EE009F0CB +:108A40008CFD0228DAD1CE482A88406841889142BC +:108A500013D10146C0310A79002ACFD1AA784A71D0 +:108A600001220A710099A0300F770021E17340794B +:108A7000002804D00AF0F9FA01E00220E07327741C +:108A80000120A0735FE4F8B5BB4F064638783D1D62 +:108A9000002804D017210E2000F02FFB53E43146AC +:108AA000012009F01EF901242870002807D1B248DE +:108AB00006226030314605460DF037FBAC717C7103 +:108AC0001720F8703C703EE470B5AB4C0646207839 +:108AD000002804D00B210E2000F00FFB4DE509F01B +:108AE0003CFD032808D009F03BFD032804D0A24830 +:108AF0004030007F002801D00C2016E03378002B96 +:108B000003D0012B01D012200FE09B4DE035297AD4 +:108B1000082909D22846721C0C3006F097FB287AE7 +:108B2000401C2872002000E00720207101206071A5 +:108B30000B21E170207020E510B58F4C20780028C3 +:108B400004D00A210E2000F0D8FA16E709F005FD3E +:108B5000032808D009F004FD032804D086484030DB +:108B6000007F002801D00C2002E000F0BFFA0020B6 +:108B70002071012060710A21E1702070FDE610B5BE +:108B80000AF032F9002803D07E497F480DF04BFCF3 +:108B900008F04BFD0BF051FC002804D01720794958 +:108BA00040010DF040FC08F0ACFF002804D0B920D3 +:108BB000744980000DF037FC00F098FAFFF7F2F8E6 +:108BC0006D4800210171012141710222C2700170C2 +:108BD000D3E610B5684C2178002904D020210E205E +:108BE00000F08BFAC9E601781F290ED8411C0CD081 +:108BF000002121710278411C104609F08FF80120F4 +:108C000060712021E1702070B7E612202071F6E734 +:108C1000F8B5594C2178002904D01B210E2000F012 +:108C20006CFABFE401216171534E0C212171403671 +:108C3000317F00296FD10078514F0025012804D0E1 +:108C400000284AD01220207165E009F086FC002837 +:108C500003D109F085FC002804D009F07EFC02282D +:108C600022D058E008F08FFF002854D0307D002833 +:108C700051D1786801224580032108F0B4FB78685F +:108C800009F05AF97868923008F001FD002803D104 +:108C90003C493E480DF0C7FB0AF00BF9002839D0DB +:108CA00085203849C00015E009F05AFC002832D16F +:108CB000707F00282FD001282DD004282BD008F059 +:108CC00062FF002827D00AF0F4F8002822D02F48AD +:108CD0002C4918300DF0A7FB1CE009F03EFC0328DE +:108CE00004D009F03DFC03280FD014E000200AF066 +:108CF00005F800280FD12571307D00280BD1786848 +:108D00008030807CFFF734F805E0002009F0F6FFA2 +:108D1000002800D125711B20E0700120207041E463 +:108D200010B5154C2178002904D01A210E2000F02E +:108D3000E4F922E601781F290ED8411C0CD000214D +:108D400021710278411C104608F0FDFF012060717E +:108D50001A21E170207010E612202071F6E770B53C +:108D6000054E044630780C25002811D018210E201D +:108D700000F0C3F9AAE4000054090020FF0E00002F +:108D80006400002074810000D3020000240400006D +:108D900009F0E3FB03285AD009F0E2FB032856D080 +:108DA000E14A107F002852D16079002801D00128C3 +:108DB0002DD1A079002801D0012828D1A07B00283E +:108DC00005D0012803D0022801D003281FD1607BE1 +:108DD00000281CD0C0081AD161880120800381427C +:108DE00002D82388834203D9207901280FD119E0C2 +:108DF0002079002806D0012814D0022805D00328A5 +:108E000005D102E020290BD30CE0A02B0AD2207957 +:108E1000042805D12088202802D36188884201D9FE +:108E2000122514E0207950776079002802D00128BB +:108E300003D00CE0BD4A002105E0BB4A2032907906 +:108E4000002804D00121204608F0CEFE054601206E +:108E5000357170711821F170307037E470B5B24C13 +:108E60000546403C2078002804D02E210E2000F03A +:108E700044F92BE409F071FB0C22022815D1AA4811 +:108E8000007F002811D1A9482B88083841684888FC +:108E900083421AD10846C030037A002B05D1203115 +:108EA000C97E0F2903D0102901D0227103E00521CA +:108EB0000172002020710E20A0702E20E070288802 +:108EC000E08001206071207016E40220F2E770B5A6 +:108ED000954C0546403C2078002804D02D210E20DA +:108EE00000F00BF908E409F038FB0C21022814D13A +:108EF0008D48007F002810D18C4E2A88083E70686B +:108F000043889A4220D1C822125C002A05D13B2214 +:108F1000125C0F2A03D0102A01D021710AE010221E +:108F2000A91CD6300DF001F970680421C03001721F +:108F3000002020710E20A0702D20E0702888E08095 +:108F40000120607120700DE40220F2E710B5017875 +:108F50000B000DF059FB3F9E9E399E9E599E9E9E92 +:108F60009E3C3F9E9E8752559E9E999E9E9E432963 +:108F70009E2D319E9E9E9E359E9E9E955C9E9E47FA +:108F80009E4B4F9E21259E6C6064689E709E7F83E1 +:108F90007C788A8D74919E00801CFFF798FF76E0A4 +:108FA000801CFFF75BFF72E0801CFFF7D8FE6EE0CD +:108FB000801CFFF7B5FE6AE0801CFFF729FE66E023 +:108FC000801CFFF706FE62E0FFF7D9FD5FE0FFF7C8 +:108FD000B3FD5CE0801CFFF777FD58E0801CFFF7D5 +:108FE00052FD54E0801CFFF7FDFC50E0801CFFF7B1 +:108FF000CDFC4CE0FFF7ACFC49E0FFF788FC46E015 +:10900000801CFFF744FC42E0FFF729FC3FE0801C96 +:10901000FFF7F2FB3BE0801CFFF7C4FB37E0801C4E +:10902000FFF7A1FB33E0801CFFF767FB2FE0801CFC +:10903000FFF742FB2BE0801CFFF7F8FA27E0801CCB +:10904000FFF7A6FA23E0801CFFF764FA1FE0FFF7A2 +:109050003CFA1CE0801CFFF705FA18E0801CFFF7C3 +:10906000E0F914E0FFF7C4F911E0FFF762F90EE050 +:10907000801CFFF74BF90AE0801CFFF721F906E09E +:10908000801CFFF70AF902E0801CFFF7DAF80120E4 +:1090900073E4002071E470B52349244C054640393F +:1090A000083C0A460126403260682B000DF0ACFAFD +:1090B00005171A1A04171A000122002108F093F963 +:1090C000616800220846C0310A724A7209F067FFDF +:1090D000002803D016A11B480DF0A5F960E4167511 +:1090E00088655DE4174812A13330F5E70E4900208A +:1090F000C031C8612039087270470B4A203A937E0C +:10910000002B03D1D076117701209076704730B5CF +:10911000134606E0CC18203CE47FD51A44555B1E6C +:10912000DBB2002BF6D130BD940900206C0000208A +:109130007372635C6C6C5F6374726C2E73302E633D +:10914000000000005108000070B5FD4D040008D07B +:10915000012C10D0022C07D0032C05D0F9A17020CF +:1091600007E0F8A1672004E02878012803D0F5A1E2 +:109170006D200DF058F92C7070BD70B5F04D04469F +:1091800010280AD0112C16D028468178122C07D02E +:10919000132C0AD0EBA19F200BE0EAA1942008E059 +:1091A000112908D0E7A1992003E0112903D0E5A1F6 +:1091B0009C200DF038F9AC7070BD10B5E04894B04B +:1091C000007B002819D0172069460870DC4900A8E8 +:1091D00006220D3102300CF0A8FF09A96846F9F704 +:1091E000C2FE0446112805D0002C03D0D5A1BB2017 +:1091F0000DF019F9204614B010BD3220E4E710B587 +:1092000001220023114603F0B5FC10BDFFB595B057 +:109210001D460E460746FFF7F2FF04000AD02078ED +:10922000222804D3A07F8006C00FA84204D10820C2 +:1092300019B0F0BDC748FBE7372168460170478089 +:10924000002D05D00121017146711799817102E04D +:1092500000206946087109A96846F9F784FEA07FD5 +:10926000DF21084069010843A0770020E0E770B5DE +:109270000446084620380D4603000DF0C5F90A06DD +:109280000A11232C334249505761FF20ADA1083009 +:1092900052E02078202851D1FF20AAA10B304BE0CA +:1092A000A7480178032949D08078132846D0207830 +:1092B000242843D0252841D023283FD0FF20A1A136 +:1092C0000E3039E02078222838D0232836D8FF20E5 +:1092D0009CA1153030E0207822282FD0FF2099A1C2 +:1092E000193029E02078222828D0242826D02628C2 +:1092F00024D0272822D0292820D0FF2091A11C305B +:109300001AE02078252819D0FF208EA1233013E001 +:109310002078252812D0FF208AA126300CE0207862 +:1093200025280BD0FF2087A1293005E020782828A8 +:1093300004D0FF2083A12C300DF075F8257070BD8E +:10934000FF2080A12F30F7E730B5834C0B88834A8C +:10935000022801D0934204D09D1FA54225D20228A5 +:1093600002D04D88954203D04D88AD1FA5421CD236 +:109370004C88A34219D88B88FF25F435AB4214D80A +:10938000022802D0C888904205D0C888724D0A3899 +:109390002D1FA84209D2C888904208D0944206D016 +:1093A0005B1C63438000834201DB072030BD00204B +:1093B00030BDF0B56A49884245D36A4A0125AD04FB +:1093C0001368A84201D398423DD30279002A06D0FF +:1093D000082A02D8067B082E05D90720F0BD047B99 +:1093E000002CFAD0F6E7002A06D004688C422AD373 +:1093F000AC4201D39C4226D3002E06D084688C4216 +:1094000021D3AC4201D39C421DD300240CE005685B +:10941000A700ED598D4216D30127BF04BD4201D3E9 +:109420009D4210D3641CE4B2A242F0D80022012570 +:10943000AD040CE084689700E4598C4203D3AC423D +:1094400003D39C4201D21020F0BD521CD2B29642EE +:10945000F0D80020F0BDFFB50022099B002802D003 +:10946000994205DC58E0002902D1002004B0F0BD8B +:109470000920FBE7845C002C12D087187D78112D21 +:1094800043D010DC2B000DF0BFF80A401726262C25 +:109490002C2E2E363640835C002B30D1521CD2B29B +:1094A0008A42F8DBE1E71C2D2FDA123D2B000DF08C +:1094B000ABF8042C2C121A2C022CD9D1BB78039CAB +:1094C000072B237001D25B0701D40A20CEE7029B51 +:1094D00001241B7816E0E343DB0708E0012C08D0E9 +:1094E00013E00620C2E70F2523072D075B19002B89 +:1094F000F4D03046BAE7029B1B789C0701D50B20BD +:10950000B4E702242343029C2370835C521C9A1804 +:10951000D2B28A4202DDABE7192676028A42A9DB83 +:10952000A3E710B504780B46002C1FD001210E4A8A +:10953000012C1ED0022C22D0032C2AD125E00000C1 +:10954000740A00207372635C6761705F636F726599 +:109550002E630000023000007B0C0000FFFF0000C3 +:109560000080010028000020023200000021197054 +:1095700011E019708179890903290AD10BE019706A +:1095800081798909012904D105E019708179890956 +:1095900001D0104610BD411C0622581C0CF0C5FD20 +:1095A000002010BD08B51346002806D0FEA00068B4 +:1095B000009048796A468009105C18700622581C91 +:1095C0000CF0B3FD08BD30B50C46097895B02229E2 +:1095D00002D2082015B030BD282369460B704880A0 +:1095E000132A03D03B2A01D00720F3E708460A716B +:1095F00009A9F9F7B8FC050003D121212046FFF79E +:1096000036FE2846E6E700B595B0232369460B7081 +:109610004880108888805088C880D0884881908889 +:10962000088100208881C88109A96846F9F79BFC58 +:1096300015B000BD70B50C00064610D0FFF7DFFD79 +:10964000050003D1D949DA480CF0EDFEA68028893F +:10965000E0802889208168896081A889A08170BD07 +:1096600070B50E46050003D00021092003F027FF46 +:109670000120D04C022E207324D0032E04D0CC48DD +:10968000CA491E300CF0CFFECA4806210D3003F047 +:1096900091FCA07C8006800EA074FFF78EFDA08B4D +:1096A00000280ED0002D0CD08300012200210920BB +:1096B00003F060FE092804D0BD48BC4928300CF0F6 +:1096C000B2FE70BDBB480321103003F073FCA07CD8 +:1096D00040218006800E0843A074B6480C3002F08A +:1096E00015F9DAE77FB501A9012003F0C3FA0028D4 +:1096F00004D0AF48AD4967300CF095FEAE4E01A8DE +:1097000003F0C6FA050002D0052D4CD048E0029CBB +:10971000A07F01072CD520462230009068462346C2 +:10972000628E80882146343301F07BFA0546A07FA3 +:10973000F7210840A077002D05D0B5422FD09C48D6 +:109740009A49783029E0E17F480889074000C90F2D +:1097500008432021095D4007400FC9000843E07716 +:10976000207828281CD129212046FFF780FD17E00A +:109770004007C4D568462246808821460E32FFF74E +:1097800042FF0546A07FFB210840A077002D07D0AF +:10979000B54204D08648854992300CF044FE00253D +:1097A000284604B070BD0020FBE7F8B5040004D1E2 +:1097B000ED207E4980000CF036FE7220207060683B +:1097C00008250178091F0B000CF01EFF11F90A3D56 +:1097D0005FF83D0EF8F83E3D3D3D3DF986F93D0010 +:1097E00073487249AA3074E087883846FFF707FD4E +:1097F000060004D16E486D49B2300CF014FE60785A +:109800000421284360706B4CA07F0843A07721217E +:109810003046FFF72CFDB07F8007800F012801D173 +:10982000801EA080384602F057FE3846FBF72AFE1D +:109830003846FAF7C6F93946022003F040FEB07FF9 +:10984000EF210840B077F8BD86883046FFF7D7FC97 +:10985000002804D156485549D0300CF0E4FD60682A +:109860008078012804D052485049D2300CF0DBFDFA +:1098700060688179304602F04EFF0028E3D06178BD +:10988000294361706168C880F8BD87883846FFF752 +:10989000B6FC060004D146484449E3300CF0C3FD51 +:1098A00060783946284360706068C088308160689D +:1098B0000089708160684089B081022003F0FFFD5B +:1098C0000020B075FFF70EFF0028DDD001203749DA +:1098D00080020CF0A8FDF8BD80783C2815D0002748 +:1098E000022815D00026002804D031482F49F8302E +:1098F0000CF099FD0021084603F0E1FD002107204E +:1099000003F0DDFD002E05D046E001270026F1E73B +:109910000126EAE76078284360702648817F294362 +:109920008177002F38D160688688304601F055F87D +:109930000546807F6168800889798000012900D010 +:1099400002210843A87760680622C08A28816068DF +:10995000008B68816068408BA8816068C079E87579 +:1099600061682846183008310CF0DFFB6068062279 +:10997000807B68706168A81C0F310CF0D6FBA87F53 +:109980008107890F304602F090FDA87F8007800F85 +:10999000012801D10748868006480178032913D0A1 +:1099A0008078132814D00BE00302FF0144950000D7 +:1099B00013030000740A0020023000000CE00FE0E6 +:1099C000FF20FCA1453084E70120FFF7BDFBF8BD77 +:1099D0001120FFF7D2FBF8BD204601F02AFCF8BDAC +:1099E000607828436070F8BDF7B505460078002719 +:1099F00000090C463E4601287ED00022F14902288B +:109A00007BD0072804D00A2878D0EAA1EE482DE1BF +:109A1000686803780D2B31D006DC042B6FD0072B40 +:109A200036D00A2B6AD106E0122B38D0132B40D047 +:109A3000142BF7D1B2E011270726002C72D08088B2 +:109A4000A0806968FB238979A171E04905468A7F76 +:109A50001A408A77032103F0C5F80421284603F051 +:109A6000C1F80021284603F0BDF80221284603F082 +:109A7000B9F80121284603F0B5F8F9E001270926D5 +:109A8000002CDBD08088A080686880792072EFE0AD +:109A900012270E2680882146FFF7CCFDE8E01A2722 +:109AA0000726002CCAD04088A08068680079A07181 +:109AB000DEE081783C2936D010271E26002CBDD050 +:109AC0008088A0806868C08A20836868C08AE08235 +:109AD0006868008B60836868408BA0836968207D1C +:109AE000497F4008C9074000C90F084320756968CD +:109AF000C007C00F497F03E05FE08AE0ADE01CE0F3 +:109B000049084900084320756968A21DC8790831D1 +:109B1000FFF748FD69682246887B0D320F31FFF759 +:109B200041FD05E074E019270726002C70D0A271D2 +:109B3000A648F722817F11407DE01B272E26002CAE +:109B400066D0A1806968A21D0879491DFFF72AFD2A +:109B500068682030C07A60736868C0780428A07B89 +:109B600019D040084000A073F921084069681F22FD +:109B7000C9788907490F0843A07369684007C97A03 +:109B8000400FC9000843A073696820460F300C31AC +:109B90000CF0CBFA6CE001210843E4E71E270E2607 +:109BA000002C6DD0A1806868E21D407AA0716968C0 +:109BB0008878C91CFFF7F6FC5AE0287A012805D0FE +:109BC000022815D080487BA132384FE01D270E2691 +:109BD000002C55D06888A080A889E080E889208181 +:109BE000288A6081688AA0817848DF22817FA2E785 +:109BF00012270E266888FFF71DFD002C40D06878DC +:109C00004007400F032833D17048FD22817F92E73F +:109C100036E0287A03000CF0F7FC06041010202030 +:109C2000202619270726002C2AD0A1806748A27178 +:109C3000817F4908490081771AE019270726002CFF +:109C40001ED0A180287A012805D00320A0715F488A +:109C5000EF22817F6FE70220F8E721462846029A2B +:109C600001F04BFCFEBD532052A100010CF0DBFBC8 +:109C70000298002C068001D0278066800020FEBD5F +:109C800002980680FAE710B5504894B080781328FF +:109C900002D0082014B010BD22206946087009A91E +:109CA0006846F9F760F904460021072003F007FC35 +:109CB0002046EFE700B5454895B08078122801D0DE +:109CC0000820B5E41E216846017000218170C17032 +:109CD00009A9F9F748F90028F3D10021072003F07A +:109CE000EEFB1120FFF749FA0020A1E400B5374848 +:109CF00095B00078022801D0032818D11B2108A8AC +:109D000001730021817369460BA8F9F72CF900282B +:109D100004D1684640781B2801D0032088E4002144 +:109D2000084603F0CCFB68468078002801D0082064 +:109D30007EE40120FFF708FA002079E4F8B5234C0F +:109D400003000CF061FC0A068017808080804B3590 +:109D50006E80FFF7CBFF00282AD1F7F7E9FD002836 +:109D600026D02221017000210172F7F7C2FDA07FE9 +:109D7000012152E08EB23046FFF741FA050004D1CE +:109D800011480CA12E300CF04EFB287821280FD062 +:109D9000F7F7CEFD00281BD01221017002270772B1 +:109DA00046800020A875F7F7A4FDA07F3843A07770 +:109DB000F8BD00007372635C6761705F636F72650A +:109DC0002E630000FFFF000036050000740A00202B +:109DD000132229463046FFF7F6FBE9E7A578122D56 +:109DE00006D0132D07D0FA49FA480CF01CFBDFE728 +:109DF000FFF760FF01E0FFF746FF0028D8D1F7F733 +:109E000097FD0028D4D022210170122D07D0022105 +:109E10000172F7F76EFDA07F10210843C7E701210B +:109E2000F6E7A07C810901290BD0800904D0E9481C +:109E3000E74922300CF0F7FA03210020FFF710FC6D +:109E4000B6E70221F9E7E348E1492930CDE7F7B564 +:109E500014460D0004D1DF48DD4931300CF0E3FA3F +:109E600028780827012807D002281FD0D948D849C8 +:109E700062300CF0D8FAFEBD0098FFF7C0F906007A +:109E800004D1D448D24938300CF0CDFA0220B07554 +:109E90001030207060783843607007CD083407C4F4 +:109EA000CD482022817F11438177FEBD0098FFF7C6 +:109EB000A6F9060004D1C748C54946300CF0B3FAEC +:109EC000A988C648814208D1EA88824205D1132276 +:109ED00031460098FFF777FBFEBD814202D1E8884A +:109EE000002809D01220207060783843607007CDB8 +:109EF000083407C4002006E07823002202200099DD +:109F000003F038FA0120B075FEBDB34840897047B0 +:109F1000FFB591B01498F8F721FF00285DD1012416 +:109F2000684603218471C9028180002201A920466C +:109F3000FAF719F9002850D16846152184714902B1 +:109F4000818000261C2102A800960CF04DF901200A +:109F50000146684610310170002001466846417094 +:109F60008178F9273940891C21438170017A0225C3 +:109F70002943017212998186C6861F2101870C90A0 +:109F800011980F9001A80B9009AA0BA902A8F9F744 +:109F9000B5FE002821D168468F4E808CF08068463F +:109FA00084718F498180807809AA3840801C4108DB +:109FB0004900684681708586058713A80F900BA914 +:109FC00002A8F9F79BFE002807D16846808C3081F3 +:109FD00031460A311498F8F7D4FE15B0F0BD30B50B +:109FE0000C46804995B08C4241D37F4901229204AE +:109FF0000968944201D38C4239D3203800220125CC +:10A0000003000CF001FB06042F494D535C64002152 +:10A01000082003F02EFA002802D0112015B030BD20 +:10A0200024206946087000A80522A11C02300CF00B +:10A030007CF809A96846F8F796FF050002D0082DBC +:10A040000ED031E0082300221146184603F092F9A1 +:10A05000082829D05F485E49D6300CF0E4F923E0A7 +:10A060000620DBE76068002803D0884201D2102078 +:10A07000D4E73D2168460170218841806188818054 +:10A0800009A9F8F770FF05000ED1606800280BD011 +:10A090006946098D018007E0206801F079FC02E043 +:10A0A000204600F0D8FC05462846B7E73E2007E0EA +:10A0B000857000E0827009A9F8F755FFF3E73420B6 +:10A0C000694608702078C0076846F3D0F0E707209B +:10A0D000A4E730B50C46444995B009688C4201D2DA +:10A0E00010209BE7203803000CF08EFA0504212194 +:10A0F000232132002088FFF782F8002804D000785E +:10A10000222803D2082089E7384887E725216846B6 +:10A1100001702188418009A9F8F725FF050015D1B4 +:10A120000AA905220231A01C0BF0FFFF0EE0062554 +:10A130000CE02068002805D0884201D2102505E0F7 +:10A1400001F01BFC24480025808BA080284665E791 +:10A15000072063E720481330704710B520211E48C0 +:10A160000CF040F80120FEF7EFFF1120FFF705F893 +:10A1700000211948C943818000218176E1218900AD +:10A18000818301460C300D310446F7F751FC12482B +:10A190000722214613300BF0C8FFFFF70EF8002806 +:10A1A00003D00B4912480CF03EF900F0D5FF10BD6A +:10A1B00010B504463C210CF015F8A07F8008800003 +:10A1C000A077202020700020A0752034607010BD82 +:10A1D000B49D00008C050000740A0020FFFF000001 +:10A1E000012A000000800100280000200230000049 +:10A1F000FB0600007047FEB50546FF480C4681424D +:10A2000007D301208004844205D3FC4800688442BF +:10A2100001D21020FEBD002D02D0012D32D126E04A +:10A22000F74908220F4668460BF07FFF3946204663 +:10A23000FFF777F90028EDD1FEF7BFFF060006D043 +:10A240000722694638460BF070FF3046FEBD207885 +:10A25000002801D0012805D1E94807223946C01D50 +:10A260000BF063FF0021092003F029F90FE00978C2 +:10A27000002907D0012905D0022905D0032903D0E0 +:10A28000E048FEBD0720FEBD0120FFF7E9F9DC48EC +:10A290000C3885760020FEBD10B5D8490968884283 +:10A2A00001D2102093E7D64902460C390B7B0D31C1 +:10A2B0001846FFF777F9002089E7FFB599B0054602 +:10A2C000002069460871087208A9087408751446C8 +:10A2D000CA480122C849920400681E46002D05D0D4 +:10A2E0008D420BD3954201D3854207D3002C08D071 +:10A2F0008C4203D3944204D3844202D210201DB076 +:10A30000F0BD2846204318D01F270CAB01AA0097A8 +:10A3100028461A99FFF79FF80028F0D10DAB02AA42 +:10A32000314620460097FFF796F80028E7D16846A7 +:10A33000007AC10703D00A20E1E70720DFE78007A2 +:10A3400005D568460079800701D50B20D7E703AF14 +:10A35000002D0FD01A20694608731A988873294671 +:10A36000F81C1A9A0BF0E1FE0EA903A8F8F7FBFD02 +:10A370000028C4D1002C0ED02021684601738673BA +:10A3800032462146F81C0BF0D0FE0EA903A8F8F7C0 +:10A39000EAFD0028B3D19A4908A8007C0C3948701E +:10A3A0000020ACE770B504460A2020700D46204618 +:10A3B000F8F7D9FD002805D139202070294620461C +:10A3C000F8F7D1FD70BDF7B500260C4605460B2702 +:10A3D0001AE02968B00009580978002903D001293A +:10A3E00001D00720FEBDA170296806220958E01C93 +:10A3F000491C0BF09AFE277020460299F8F7B3FD2E +:10A400000028EFD1761CF6B22879B042E1D80026B8 +:10A410003A270FE0A868B10041581022A01C0BF0A9 +:10A4200084FE277020460299F8F79DFD0028D9D1B7 +:10A43000761CF6B2287BB042ECD80020FEBDF0B509 +:10A44000044671A003C897B06B4B00271591149078 +:10A450009C4211D369480125AD040268AC4201D386 +:10A46000944209D32078012809D16168994203D325 +:10A47000A94204D3914202D2102017B0F0BD604926 +:10A480000C390A78012A0CD18A88614B9A4203D090 +:10A49000002806D0012804D08A7F13079B0F06D11D +:10A4A00001E00820E9E7D30701D1910701D5112088 +:10A4B000E3E7218A574B0A46203A9A4207D30128FC +:10A4C00075D1002973D1628A002A70D111E0022867 +:10A4D00001D0032801D1A02969D3012809D0484A15 +:10A4E0000C3A5278D20704D0628A002A5FD0B42A8C +:10A4F0005DD8002806D0012808D0022804D00328FF +:10A5000055D117E0002518E0022516E0002902D1F8 +:10A51000608A00280CD004256068007800280CD0E0 +:10A52000012809D0022807D0032805D03548A4E720 +:10A530000125F1E7032500E00127207A002806D055 +:10A54000012806D0022806D003287CD105E0002689 +:10A5500004E0012602E0022600E00326002D01D0DF +:10A56000022D14D1002E12D0E068FEF722FF002841 +:10A5700083D123480C384078800702D02148401E00 +:10A580007BE7022D03D1022E5DD0032E5BD0182174 +:10A5900068460170218A4180218A8180857118482E +:10A5A0000C38007B002803D001286FD104E04AE07A +:10A5B00000216846C17102E001206946C871684601 +:10A5C000077221780930012937D006210BF00AFEE5 +:10A5D00069460E74207D8207C107D20F4007C90F5C +:10A5E0005200C00F11438000014314A8405C69462B +:10A5F000C873002827D00FE0008001002800002049 +:10A60000800A002002320000070605040302010050 +:10A61000FFFF0000E13F000009A96846F8F7A3FC2E +:10A62000002884D109A96846FFF7BCFE0028A7D1FD +:10A63000002D0AD0022D08D010E061680622491CC6 +:10A640000BF073FDC4E7072017E7002E06D009AA18 +:10A650006946E068FFF7B7FE002891D11B206946E4 +:10A6600008700120887009A96846F8F77CFC00286A +:10A6700086D108A840791B2819D12B000BF0C4FF04 +:10A680000504040707040A00032001E00FE002208C +:10A69000FEF75AFD012D0CD0608A002809D0002257 +:10A6A00083001146104602F065FE002801D0032009 +:10A6B000E3E60020E1E6F3B5032687B00D46002966 +:10A6C0000AD0FA4885426FD301208004854203D323 +:10A6D000F7480068854267D30798FEF790FD0400AD +:10A6E00005D02078222804D2082009B0F0BDF14816 +:10A6F000FBE7A07F8707BF0F002D05D0294638460E +:10A70000FEF722FE0600F0D139460027EA4801296B +:10A7100007D0022931D0E949E9480BF084FE3046E0 +:10A72000E3E7A27D2946012A02D0827F920701D564 +:10A730001120DAE700291BD108216A46049711820B +:10A740000592418904AADF48FAF7FDF80028CCD128 +:10A750006846008A082801D00320C6E768460188B9 +:10A7600001814188418181888181C188C18102A99B +:10A77000079801F061FF0646D1E7A17D022916D1B5 +:10A78000807F800613D4002D04D0A07F40070CD416 +:10A79000002100E00121079801F08FFF0600BED1E3 +:10A7A000A775002DBBD004E01AE01126B7E7002DF5 +:10A7B00016D02A4621460798FEF725FF064611289F +:10A7C000ADD1A07F4007AAD42046082229460E30EA +:10A7D0000BF0ABFCA07F04210843A07700269EE786 +:10A7E000102082E770B50C460546FEF708FD010013 +:10A7F00004D022462846FEF7E6FE70BDAD4870BD87 +:10A8000000B50146143195B0192901D2810707D04E +:10A8100001461E3104D00A3102D0072015B000BD18 +:10A82000312269460A70887009A96846F8F79BFBCF +:10A83000F4E701B582B00220694608809E4802AB69 +:10A8400000896A460021F9F7E7FE6946098802296E +:10A8500000D003200EBD1CB50021009102216A46E4 +:10A860001180934901900968884201D210201CBDD3 +:10A87000914801899348FAF766F8694609880229E0 +:10A88000F5D003201CBDF0B50E46884985B01746AB +:10A8900005468E4207D386480122920400689642FC +:10A8A00004D3864202D2102005B0F0BD1F2F01D97B +:10A8B0000C20F9E7804C8D4226D3954201D3854286 +:10A8C00022D3E08803A9F9F758FE0028ECD12878B4 +:10A8D00069464873E08803A9F9F730FE0028E3D100 +:10A8E0006946009008780221084369460870497B50 +:10A8F000090703D00821084369460870E0886946C3 +:10A90000F9F7B5FD0028CFD169468F80E08833463E +:10A9100001AA0021F9F780FE69468988B942C3D0AF +:10A920000320C1E71CB50C4600210091019122884B +:10A9300069460A805E4901900968002801D0884272 +:10A9400001D38C4201D210201CBD002801D0002A66 +:10A9500009D059486A46C1885A48F9F7F4FF694650 +:10A96000098821801CBD0C201CBD10B50123FEF7F9 +:10A970004DFC2CE4002310B51A461946FEF746FCA0 +:10A9800025E430B505464A4895B000680C4681423A +:10A9900002D2102015B030BD2846FEF730FC00284A +:10A9A00007D00178222902D3807F800603D40820B3 +:10A9B000F0E74048EEE7132168460170458009A999 +:10A9C000F8F7D1FA0028E5D108AA0A2151567F29C3 +:10A9D00001D02170DEE70520DCE7F8B5012304464D +:10A9E0001A46194602F0C6F8074601231A46022104 +:10A9F000204602F0BFF8064601231A4604212046ED +:10AA000002F0B8F8054601231A460321204602F059 +:10AA1000B1F80446002F03D128492B480BF003FD61 +:10AA2000002E04D1AD20254980000BF0FCFC002D48 +:10AA300004D125482149801C0BF0F5FC002C04D1E1 +:10AA400021481E49C01C0BF0EEFC22213846FEF7BF +:10AA50000EFC3846F8BD10B50446006800280CD03E +:10AA60001249884207D301218904884205D310493D +:10AA70000968884201D2102014E400F071FFA08818 +:10AA80000D4CA083A07E01280DD10021092002F0E9 +:10AA9000F0FC002800D00120A17C8909012915D0F3 +:10AAA0000321FEF7DDFD002006E400000080010028 +:10AAB0002800002002300000740A0020B49D00002D +:10AAC000C6090000FFFF0000B30200000221E8E712 +:10AAD00030B5F74B9A4207D301239B049A4205D322 +:10AAE000F44B1B689A4201D2102030BD1578EB065A +:10AAF0005B0F042B07D85478072C04D39378102BC2 +:10AB000001D8A34201D2072030BDD3785B0702D41D +:10AB100013795B0701D5062030BDC37FAC075B0806 +:10AB20005B00E40F2343C3770878EF2318401378C2 +:10AB30009B06DB0F1B0118430870F12318401378A4 +:10AB4000DB065B0F5B001843087050780873002029 +:10AB500030BD30B500240C70C378DB07DB0F0B7001 +:10AB6000C578AD07ED0F6D002B430B70C5786D07F1 +:10AB7000ED0FAD002B430B7014700179C907C90F9D +:10AB8000117003799B07DB0F5B001943117000798B +:10AB90004007C00F80000143117030BD70B51446EE +:10ABA0000D460646F6F7C4FE002809D0A221017022 +:10ABB000142221460830F6F707FBF6F79AFE70BD1F +:10ABC000132229463046FEF7FEFC70BD70B51446D0 +:10ABD0000E460546F6F7ACFE002809D0222101708A +:10ABE00045802178017261784172F6F782FE70BD6E +:10ABF000132231462846FEF7E6FC70BD10B5AE4C78 +:10AC0000207C00280CD1204621461038FDF762F840 +:10AC1000002803D0A9A1F2200BF005FC012020742C +:10AC200010BD70B594B015460C462C226946189E8E +:10AC30000A704880002B17D00822194601A80BF093 +:10AC400074FA68468581102231460E300BF06DFA99 +:10AC500009A96846F8F787F9002803D1A17F1022D7 +:10AC60001143A17714B070BD002001900290E8E775 +:10AC7000F0B50646008A97B080B20D460190FEF707 +:10AC8000BEFA04468C48317848380746E8370990C0 +:10AC90000B000BF0B9FC0EFCFB48085F8798B8D995 +:10ACA000FAF9F8F7F6FC002301221946019801F0A1 +:10ACB00061FF050004D1FF2080A130300BF0B3FB11 +:10ACC000002C04D1FF207DA131300BF0ACFB387E8D +:10ACD000C00904D078486030C06DA86112E02B2014 +:10ACE000694608720BA902A8F8F73DF9002804D0BC +:10ACF000FF2072A13C300BF096FB74490C980BF0CE +:10AD00008EFAA9617068A862B068E862A07F8007C7 +:10AD1000800F012820780DD0252804D0FF2067A1BE +:10AD20004D300BF080FB324621460198FFF736FF8D +:10AD300017B0F0BD2528F6D0222806D0242804D04C +:10AD4000FF205EA146300BF06EFB25212046FEF76A +:10AD50008EFAE8E7002301221946019801F00AFF64 +:10AD6000060004D1FF2055A158300BF05CFB002CED +:10AD700004D1FF2051A159300BF055FB2078252834 +:10AD800004D03078012108433070D1E702202870C8 +:10AD9000B068A860B068002802D000202871C7E71A +:10ADA0000120FBE72B2069460870434968464C396F +:10ADB000F8F7D9F8002804D0FF2040A178300BF034 +:10ADC00032FB03201BE02A206946087000A81022ED +:10ADD000023071680BF0A9F904A810220230B168A2 +:10ADE0000BF0A3F9344968464C39F8F7BCF8002851 +:10ADF00004D0FF2031A189300BF015FB042028700E +:10AE00000998686094E7B068002804D1FF202BA15E +:10AE100095300BF008FBE07F400704D5FF2027A109 +:10AE200096300BF000FBB06806220A3800903379A8 +:10AE30000421019801F0FBF90028A6D0FF201FA1F2 +:10AE40009B300BF0F0FA73E7002C04D1FF201BA11C +:10AE5000A3300BF0E8FA2046223010220546716834 +:10AE60000BF063F928212046FEF701FAA07F800746 +:10AE7000800F022814D100231A462146009501981C +:10AE800006E04BE1BAE0B0E095E03FE071E05FE161 +:10AE9000FFF7C7FE11281BD029212046FEF7E7F94E +:10AEA000E07F317A4007400FC9000843E0773FE771 +:10AEB0000080010028000020400B00207372635CBA +:10AEC0006761705F7365632E6300000040420F008E +:10AED000A07F000704D5FF20FD49B0300BF0A3FA96 +:10AEE000A07F08210843A0770020608620463430E8 +:10AEF0000BF078F9E07FFD220146C9071040890F69 +:10AF00000843E077307A2034207011E700230122D3 +:10AF10001946019801F02EFE040004D1FF20EC49EF +:10AF2000CD300BF080FA2B2069460872E94902A85F +:10AF3000F8F719F8002804D0FF20E549D2300BF0CB +:10AF400072FAE4488188204621300176090A417668 +:10AF50000E2129702146FC316960017E2974407EF2 +:10AF60006874DC482C30A860103030346C61E860C4 +:10AF7000DEE6002C04D1FF20D549E6300BF053FA71 +:10AF80002078212893D93079012802D0022808D1CD +:10AF900003E0E07F04210843E077387E0121084385 +:10AFA0003876324621460198FFF7F8FD23212046E6 +:10AFB000FEF75DF9BCE601220421019801F01FFCB7 +:10AFC0000028A2D0002301221946019801F0D2FDE9 +:10AFD000040003D1BE49C0480BF025FA0F202870A9 +:10AFE000172028716E34AC60A2E60421019801F0AC +:10AFF00056FC002889D11020287099E600230122F0 +:10B000001946019801F0B6FD050004D18720B0492A +:10B0100080000BF008FA2E462036307E41064DD5D2 +:10B02000A17F8F07BF0FC00713D029468031486F1B +:10B0300000280ED0027CF37DD207D20F5B001A43AA +:10B040000274486F5108E27F4900D207D20F1143C2 +:10B050000174307E000713D52A468032116F002913 +:10B060000ED0087CF37DC007C00F5B001843087446 +:10B07000116FE27F40084000D207D20F10430874DE +:10B08000307E80070BD5F8204259002A07D0012FC7 +:10B0900005D02946307C31311032FEF783FA307EFC +:10B0A000C0060BD5F8204259002A07D0012F05D140 +:10B0B0002946307C31311032FEF774FA0523684698 +:10B0C0000370357E4570834822216038019A0170F3 +:10B0D0004178C908C900C91C417042800372457299 +:10B0E000F6F78EFD2078252809D021280BD07A4844 +:10B0F00077495B300BF097F92078222803D9222179 +:10B100002046FEF7B4F80021019801F06BFD0028FD +:10B1100000D10DE670486E49633092E674686D4D5B +:10B1200020786035092802D00A28F2D10BE0E168C6 +:10B13000002902D02846F7F7E8FE2169002902D04D +:10B140002846F7F7E2FE21462846F7F7DEFEEFE550 +:10B1500061485F49883074E65E4810B504222821B2 +:10B160006030F7F7B9FE5B480024EC30017E4906F9 +:10B17000490E01764038C465FCF739FD55493C312C +:10B1800008461038F6F78BFC52484C30047410BD5A +:10B1900070B50D46FEF733F8040004D14E484C4913 +:10B1A000A7300BF040F9FF21053128460BF01CF8C1 +:10B1B000A07F8007800F01280CD00221284688300C +:10B1C000FCF716FD002804D043484149AC300BF091 +:10B1D0002AF970BD0121F1E70A46014610B5104673 +:10B1E0008830FCF71FFD10BD70B5054611200C46D8 +:10B1F0000870002161702121495D002908D00329D0 +:10B200000ED0042910D034483149C6300BF00BF968 +:10B2100020780009012802D9E87FC008607070BD5D +:10B220000007000F203002E00007000F30302070D0 +:10B23000EEE7F0B504464068082601789BB008297F +:10B240000DD00B2903D00C294BD1012181716068ED +:10B2500087883846FDF7D3FF05004CD147E0478883 +:10B260003846FDF7CCFF050004D1172018494001EE +:10B270000BF0D9F82878212833D0282833D16068FA +:10B2800002210C3000F050FF00282CD0606808210B +:10B29000001D00F049FF002825D02D2168460170CF +:10B2A000478029461022223101A80AF03EFF0FA94B +:10B2B0006846F7F758FE002804D007480449EF30E5 +:10B2C0000BF0B1F8A87F10210843A877292105E0E9 +:10B2D000BCAE0000F40A0020030200002846FDF77F +:10B2E000C6FF1BB0F0BD607830436070F9E7FE49DF +:10B2F000FE480BF098F8A87FEF210840A87729783E +:10B3000021290FD061688A79002A02D08978002922 +:10B3100012D08007800F022849D0F448F249343017 +:10B320000BF081F8FEF7DEF90028DAD0EF48EE499D +:10B330003F300BF078F8D4E7607830436070E87FF6 +:10B34000C00701D0042100E00321212041552878C5 +:10B3500029280BD03946062002F0B1F82878242895 +:10B36000E0D122212846FDF782FFDBE700230122FE +:10B370001946384601F0FEFB040004D1C920DA4921 +:10B3800080000BF050F825212846FDF770FF0D20B6 +:10B3900008A90871204609A98830FCF735FC022865 +:10B3A000C0D00028BED0D148CF491D30B8E7607862 +:10B3B00030436070B6E7F7B58AB015460646FDF72C +:10B3C0001EFF002841D0017822293ED323293CD0FA +:10B3D000C17F490739D4807F8007800F01280DD0B5 +:10B3E000002301220021304601F0C4FB0746C0487B +:10B3F0000290F7F781FD040007D101E00123F0E797 +:10B40000BA48B94959300BF00EF8002F1FD08837D1 +:10B4100067610298F7F770FD07460298F7F76CFD31 +:10B4200009212170266225710B99E760A1602061D6 +:10B4300003A92046FCF70CFC022806D0002804D003 +:10B44000AA48A94975300AF0EEFF0DB0F0BD002002 +:10B4500007466061E4E730B5002387B00546012266 +:10B46000194601F087FB04462846FDF7C8FE007820 +:10B4700022281BD9002C04D19C489B4981300AF01A +:10B48000D2FF0F21684601701721017120466E30EE +:10B49000029069461A30FCF7B7FB022806D0002854 +:10B4A00004D0E520904980000AF0BDFF07B030BD10 +:10B4B00030B5002387B005460122194601F05AFB3A +:10B4C00004462846FDF79BFE00782228EED9002C82 +:10B4D00004D18648844993300AF0A5FF10206946BC +:10B4E000087020468830FCF78FFB0028DED0E9206A +:10B4F0007D4980000AF097FFD8E7F7B50546007848 +:10B500000027000982B00C463E4602287ED007285C +:10B5100002D00A284AD14AE068680178082907D091 +:10B520000B2930D00C292ED070486F49D33060E100 +:10B5300014271A26002C6AD04088A080FDF75FFEF1 +:10B540000090002804D169486749AF300AF06BFFCA +:10B5500000980099C07DA21D1831FEF723F8686895 +:10B5600008228089E081696820461030091D0AF0B0 +:10B57000DCFD207E01210843F92108402076009857 +:10B580004021807F47E018270826002CD3D08088F0 +:10B59000A080FDF734FE050004D1F7205249800059 +:10B5A0000AF041FFA11D2846FFF71EFE23E1002CF3 +:10B5B00001D0288BA080287A01287DD0022804D0D1 +:10B5C00003282FD048494B4813E11C270726002C9D +:10B5D000B1D0A088FDF713FE0090002804D1FD2013 +:10B5E000414980000AF01FFF287B8007800F012857 +:10B5F000A07914D040084000A071FD210840297BAB +:10B600004907C90F49000843A07101E0E3E0DFE00A +:10B6100000988021807F084300998877EBE0012122 +:10B620000843E9E713270B26002C84D0A088FDF7F8 +:10B63000E6FD00900023A0880122194601F09AFA45 +:10B6400005460098002804D12A48274960380AF0A6 +:10B65000EAFE002D04D181202349C0000AF0E3FE58 +:10B660000098807F8007800F012859D0E86A817890 +:10B670008907890F0129A17954D049084900A1718E +:10B680008278FD255207D20F294052001143A17143 +:10B69000E322114002785207D20E1143A171DF223A +:10B6A00011404278D207920E1143A1710021E1713D +:10B6B000C1782172427900E037E00179607AD307DE +:10B6C00040084000DB0F18439307DB0F28405B0066 +:10B6D00018435207FB23D20F1840920010436072A8 +:10B6E000A07A4008400007E0BCAE00000E03000056 +:10B6F000540B002067040000CA07D20F10438A07CA +:10B70000D20F2840520049071043C90F1840890042 +:10B710000843A0720098007823286CD92621AFE056 +:10B72000A86AA4E701221143A9E7297BFE48022960 +:10B7300010D017270C26002C4AD0012911D003293C +:10B740001ED004291FD005291DD0F849F8480AF059 +:10B750006AFE23E019270726002C4CD00121A17195 +:10B7600005E00121A171E17989088900E171017E7B +:10B77000CA094906D201890E49000A4302760DE042 +:10B780000220A07106E0687B0007000F8030A071E6 +:10B79000052918D0E07980088000E071A088FDF7C5 +:10B7A0002EFD05460078212825D0232804D0E04826 +:10B7B000DE490C300AF037FEA088002101F012FAB1 +:10B7C000222128465DE0E07980088000401CE4E703 +:10B7D0000498068015E0002C01D06888A080287AA3 +:10B7E000032828D004280FD005284DD0D048CF49B1 +:10B7F00064300AF018FE0498002C068001D02780DF +:10B800006680002005B0F0BD15270C26002CDFD087 +:10B810000023A0880122194601F0ACF9050004D1EB +:10B82000C348C2492A300AF0FEFD0622A11DA869BC +:10B8300009F0DCF9DFE716270726002CC8D0A0881E +:10B84000FDF7DDFC00900023A0880122194601F0DD +:10B8500091F905460098002801D0002D04D1B44884 +:10B86000B24938300AF0DFFD2878C00601D5022041 +:10B8700000E00120A071009800782328BBD927217F +:10B880000098FDF7F4FCB6E717270C26002C9FD094 +:10B89000A088FDF7B4FC00906D7A002804D1A4487C +:10B8A000A2494B300AF0BFFD0621A01D0AF09AFC08 +:10B8B0000020A071207A032108432072FB21084058 +:10B8C0000099C97FC907490F08432072680692D5BD +:10B8D000E07904210843E071A07AE90740084000BC +:10B8E000C90F0843E17A2A0749084900D20F1143DA +:10B8F000FD22AB07DB0F10405B001843A072E80687 +:10B90000C00F114040000143E17274E710B50446D6 +:10B91000807990B08009012804D04D20834900012E +:10B920000AF081FDFFF76AF90120694608707E4838 +:10B930000AA9A0380190201D0290601C0B90684657 +:10B94000FCF786F9002804D07948784987300AF056 +:10B950006AFD0322601C0B990AF0E7FB10B010BDD2 +:10B9600010B5714CA03C002805D00146102220469D +:10B970000AF0DBFB0120207410BD10B50446FFF770 +:10B980003DF969491022A03920460AF0CEFB10BDCE +:10B9900070B50025644C00281CD06649884207D346 +:10B9A00001218904884205D363490968884201D28C +:10B9B00010250DE0062109F003F9411C07D05A4972 +:10B9C0004039C865207E80210843207600E00725A5 +:10B9D000284670BD207E4006400EF6E7F3B50020F5 +:10B9E00089B00D46029000290AD0524885421CD3E6 +:10B9F00001208004854203D34F480068854214D358 +:10BA00000998FDF7FCFB060003D03078222815D1F9 +:10BA100002E04A480BB0F0BD002D08D1B07FC1094B +:10BA200003D08007800F022801D01020F2E7B07FFA +:10BA3000C10601D4000703D5002D01D00820E9E795 +:10BA40003948007EC00712D1F07F400701D50D2094 +:10BA5000E0E7002201231146099801F08BF8070066 +:10BA600005D0B07F8007800F022802D00BE01120A4 +:10BA7000D0E7002D07D02A4639463046FFF728F890 +:10BA800002900028C6D128488C38F7F735FA040010 +:10BA900003D126492A480AF0C6FC0A2020700998DA +:10BAA000206238468830A060B07FFB218007800F7D +:10BAB000012829D0002D4CD002202071381DE060D3 +:10BAC00038780007400F20743878C006C00F6074C3 +:10BAD000A07C2A788008D2078000D20F1043A0747F +:10BAE0000840F17F01AAC907490F0843A074A8784C +:10BAF000E07469462846FFF72CF8684600792075FF +:10BB000068460078607528E001202071207B2A7843 +:10BB10008008D2078000D20F104320730840297894 +:10BB20008907C90F89000DE0E00B0020BCAE0000C2 +:10BB300053040000008001002800002002300000B3 +:10BB4000630500000843207324213046FDF78FFB76 +:10BB50000BE0032020710520207325213046FDF7DE +:10BB600086FBB07F4006400EB07703A92046FCF765 +:10BB70006FF8022805D0002803D0FD49FD480AF0DF +:10BB800052FC029846E7FFB581B00A9D06461C4666 +:10BB90001746142128460AF027FB0B980021016064 +:10BBA000F8070ED0F44920680968884239D312306A +:10BBB00028602068143068602068A8600B982168AD +:10BBC0000160B80726D56068002803D0EA490968F3 +:10BBD000884226D3029900290AD0FC3600280ED0CC +:10BBE00031461030FDF79DFC00281BD1606810E045 +:10BBF000002816D0E86080366068B0670AE0FEF77B +:10BC0000A9FA0146072230460AF08FFAFEF7F6FF3E +:10BC1000DA48E860780707D5D749A06809688842FC +:10BC200001D21020EEE528610020EBE5FFB5D44AF3 +:10BC30000E4607CA97B002AB07C3002700970197CB +:10BC40001798FDF7DCFA050005D02878262804D0DF +:10BC500008201BB0F0BDCB48FBE700231A4619466D +:10BC6000179800F087FF040004D1C248C049803013 +:10BC70000AF0D9FBA87F8007800F1690012814D006 +:10BC8000022824D0BB48BA4999300AF0CCFB0121E4 +:10BC90000022852E31D01EDC002E26D0812E26D00B +:10BCA000822E26D0832E1ED125E0002EEFD12146F4 +:10BCB0002846199AFEF70CFF0028CAD119988078F7 +:10BCC000009019980078C007C00F0190DFE719981D +:10BCD000002808D1DBE7862E11D0882E11D0892EBE +:10BCE00011D08A2E11D00720B3E710460EE0084687 +:10BCF0000CE002200AE0032008E0052006E0062010 +:10BD000004E0082002E0092000E00A20002222715D +:10BD100001216A461176211D0791002801D020716A +:10BD2000FAE0169801280CD0A66AE06A02220121E6 +:10BD300010900020A0602846173002291AD0012157 +:10BD400019E0E66AA06A1090032030702078FB2387 +:10BD5000C006C00F7070B07801221840009BF370CD +:10BD60008008019B800018430221B0700020707190 +:10BD70003071DEE70021890009190861681C022A78 +:10BD800001D0012100E00021890009190861B07883 +:10BD90008007800F01285ED1109880788007800F7F +:10BDA000012858D110980079844610984079009065 +:10BDB000169801281DD0317908A801747179017590 +:10BDC00008A8027C6046024008A8007D009908404F +:10BDD000139010433FD06C491A98884207D3012131 +:10BDE0008904884215D364490968884211D2102019 +:10BDF0002FE70CAA0DA91998FEF7ABFE08A8007C46 +:10BE000061460840307108A8007D009908407071B3 +:10BE1000D6E720463C3021460090F031169801913B +:10BE2000022834D000211A9B20460C33FFF7ABFECA +:10BE30000028DDD12046503021460090F43116987C +:10BE40000191012825D0002120461A9B139AFFF763 +:10BE50009AFE0028CCD110988078400702D4E87F61 +:10BE6000C0072BD0169902A8012914D0109909787F +:10BE70004900405A21780907490F4900C8408707FF +:10BE8000BF0F2AD0012F14D0022F0FD113E00121B0 +:10BE9000C9E70121D8E721780907490F4900405A2D +:10BEA000109909784900C8408707BF0F032F04D0B5 +:10BEB00004E0022711E001270FE00227169801286D +:10BEC0000BD1B078FB210840E97FC907490F08432F +:10BED000B07020780007400F3070207810224008A2 +:10BEE000400020701099D2434978C907C90E114308 +:10BEF00008402070C00623D4022F21D0012F21D06A +:10BF00000020A061E0612062606220461830A060DD +:10BF1000E87F40084000E877204606A98830FBF714 +:10BF200073FE002806D0022804D06F2010490001BB +:10BF30000AF079FA25212846FDF799F9002088E6CC +:10BF4000032008E020460D211B300AF04BF9204663 +:10BF50001830A060042069460875E87F0121084375 +:10BF6000E87705AA29461798FEF730FED4E70000C7 +:10BF7000BCAE00008E05000028000020400B002011 +:10BF8000606701000230000000800100F0B587B05A +:10BF900015460E0004460DD06A48854207D301209D +:10BFA0008004854206D368480068854202D210208A +:10BFB00007B0F0BD2046FDF722F9070004D038781D +:10BFC000272803D00820F3E76048F1E700231A464A +:10BFD0001946204600F0CEFD040003D15C495D48BF +:10BFE0000AF021FA0020002E05D0022E08D0012EE2 +:10BFF00011D00720DCE701216A461171A06018E02A +:10C00000234618336946A360087110222946184652 +:10C010000AF08BF80DE021461831A16069460871DD +:10C02000A061E061206260620621284608F0C8FD38 +:10C03000A0612078C10714D0400840002070022081 +:10C04000694608702046183002907030FBF7DCFD1E +:10C05000022806D0002804D03E483D4923300AF08B +:10C06000E2F925213846FDF702F90020A0E770B576 +:10C0700094B00D460646002B02D0072014B070BDC8 +:10C08000FDF7BDF8040007D02078222802D3A07F56 +:10C09000400603D40820F1E72C48EFE7002D19D023 +:10C0A0002D216846017046801022294601A80AF019 +:10C0B0003CF8E07F297C4008C9074000C90F0843CD +:10C0C000E077297C40078906400FC90EC900084364 +:10C0D000E07703E02E2168460170468009A9684692 +:10C0E000F6F741FF694609782D2905D1002803D1CB +:10C0F000A17F10221143A177A17FBF221140A17718 +:10C10000BCE710B50C46FDF77AF8002805D00E49BB +:10C1100009688C4203D2102010BD0C4810BD214686 +:10C12000FFF762F8002010BD05E00278401C002AED +:10C1300001D0002070470A46491E89B2002AF4D176 +:10C14000012070470080010028000020023000001C +:10C15000BCAE00000F07000030B50346072903D02E +:10C160000820DA781C7916E00720FAE707290BD0B7 +:10C170005500ED186D79072D01D0401EC0B2521C3C +:10C18000D2B20F2A07D105E05500ED186D79072DC1 +:10C19000F3D0F4E700222546641EE4B2002DE5D179 +:10C1A00030BDFFB581B00C461646114620460A9FA9 +:10C1B0000B9DFFF7D1FF00280AD020790F2803D369 +:10C1C000FEA1A0200AF02FF9A078C00907D019E03D +:10C1D000072E02D0112005B0F0BDFD48FBE7019805 +:10C1E0002880381D6880002068712871EF800498CD +:10C1F00028812846F6F7DFFE002803D1EFA1AD2005 +:10C200000AF011F9E07821794018491CC0B2217177 +:10C210000F2801D30F38C0B2400000194671817950 +:10C22000F12249084900114081710020D3E7FFB590 +:10C2300083B01C4616460F4600231A4602210C9D69 +:10C24000039800F097FC010008D033463A46019568 +:10C2500000940398FFF7A5FF07B0F0BDDC48801EEF +:10C26000FAE7F0B5054616460F4650888DB0002314 +:10C270000122022100F07EFC040003D1CFA1DF20C7 +:10C280000AF0D1F8002069460871A078400603D171 +:10C29000CAA1E3200AF0C7F8042F5ED32A78D0079A +:10C2A000C017401C06D161786B78994255D121782E +:10C2B000090752D00121142A46DA012A42D0122A53 +:10C2C00002D0132A40D128E00C2F3DD1A27852068B +:10C2D000520E012A38D0207800090001401C20703D +:10C2E000687860706846017168792A7901021143A3 +:10C2F00068460181E879AA790102114368464181C3 +:10C30000687A2A7A0102114368468181E87AAA7A1A +:10C31000010211436846C1811AE0062F14D120782A +:10C320000009000120707188012001F0C8F8022185 +:10C3300068460171C91E018168792A790102114399 +:10C3400068461FE0062F0AD06A461279002A1BD0E1 +:10C350007088324601A9FDF77AFD0DB0F0BD207856 +:10C360000009000120707188012001F0A8F8022165 +:10C370006846017168792A79010211436846018192 +:10C380000021C9434181E3E70028E6D0748868466C +:10C3900081766978C176022181830021C18304A856 +:10C3A00005220090062311462046FFF740FF002893 +:10C3B000D3D088A1D6200AF036F8CEE7F7B58CB0F6 +:10C3C00015460C990D98F9F7CEF9C0B2082851D14D +:10C3D000002069468885688800230122022100F038 +:10C3E000C9FB040004D1FF2074A163300AF01BF8DC +:10C3F00001230021E07822790BE046003619767996 +:10C400009E4201D1491CC9B2401CC0B20F2800D1C4 +:10C4100000201646521ED2B2002EEED1002902D1C3 +:10C4200017206946888504AB02330BAA00950C9946 +:10C430000D98F7F73BFC0006000E07D002281BD032 +:10C44000032817D0FF205DA1893011E06846808D58 +:10C4500000280FD002A901910090688804230122CE +:10C460002146FFF79EFE002804D0FF2053A176301E +:10C4700009F0D9FF0FB0F0BD68781021084368704B +:10C48000F8E70020584902464300401CCA520828D9 +:10C49000FAD3704700218170017809090901017000 +:10C4A00000214170C1700171704770B50D460023C5 +:10C4B0000122022100F05EFB040004D1FF203FA115 +:10C4C000CF3009F0B0FFA0786906C009C001490E5D +:10C4D0000843A07070BD704710B50146012000F000 +:10C4E000EEFF10BD3EB58DB2002301220221284689 +:10C4F00000F040FB040004D1FF2030A1E43009F03B +:10C5000092FF20786946000900012070022008701F +:10C5100036488880C88000222846FDF798FC3EBD3A +:10C52000F7B505460078002700090C463E4601286D +:10C5300004D0FF2021A1F33009F075FF287A0328E9 +:10C540000CD041201DA1C00009F06DFF0298002C05 +:10C55000068001D0278066800020FEBDEA89702712 +:10C5600010460A3086B2002C0AD06888A080A889BC +:10C570002081E28020460A30296909F0D6FDE5E7EE +:10C5800002980680E8E7F8B543680246D9799C79B5 +:10C59000090221435C7A1E7A25025C88981D354386 +:10C5A000241FA14238D11B79022B35D1042D34D060 +:10C5B000052D3DD0062D34D0402D19E07372635CFB +:10C5C0006C326361705F636F72652E630000000000 +:10C5D000043000007372635C6C326361705F636F80 +:10C5E00072652E6300000000000C0020FFFF0000B9 +:10C5F00012D3061D0F461446284600F0E9F9082814 +:10C600000AD01120207003202072A581E7812661C5 +:10C610006078082108436070F8BD001DFFF7CEFE6A +:10C62000F8BD031D50880A461946FEF7C4FEF8BD42 +:10C63000001DFFF716FEF8BD70B50D4600238CB047 +:10C6400006461A46022100F095FA040031D02078FF +:10C650000007000F01282ED01220694688746078E8 +:10C660000523801CC874082088822888C8826888AE +:10C670000883A8884883E888888302A90C20019150 +:10C6800000901A4621463046FFF78BFD00280ED158 +:10C69000F02300223146012000F06CFE20780009D2 +:10C6A0000001401C20706078801C607000200CB07D +:10C6B00070BDCD48FBE71120F9E770B50D460023AA +:10C6C0008CB006461A46022100F054FA040006D047 +:10C6D00020780007000F012803D00820E7E7C248B0 +:10C6E000E5E71321684681746178C1740221818273 +:10C6F000C58202A906200523019100901A46214611 +:10C700003046FFF74EFD0028D1D120780009000106 +:10C7100020700020CBE7F3B581B00D460023012245 +:10C720000221019800F026FA00260446002803D1D1 +:10C73000AE49AF4809F077FE2079A8423BD2AC4819 +:10C74000AA49401C09F06FFE35E0E07841000F195E +:10C75000401C7979C0B20091E0700F2801D100200F +:10C76000E0702079401E2071B879C00708D0009889 +:10C770000199042815D09D498220183109F053FEF3 +:10C78000B8790007410F08D0400F019904280CD058 +:10C7900096498F20183109F046FE009807280AD1E3 +:10C7A00007E00846FEF784FEEAE70846FEF753FE78 +:10C7B000F3E7761CF6B228466D1EEDB20028C4D110 +:10C7C0003046FEBD10B500230122022100F0D2F94F +:10C7D000040004D1B5208549800009F024FEE078EA +:10C7E00021794018C0B2E0700F2801D30F38E070F3 +:10C7F00000202071A07880210843A07010BDF8B5FA +:10C8000017460D4600231A46022100F0B3F9040032 +:10C8100005D0002D0CD0002F07D0062006E0072DF4 +:10C8200001D00820F8BD0720F8BD0820A84204D890 +:10C830006F486E49423009F0F6FD29462046FFF761 +:10C840008BFC0646002F28D0002E26D1E0782179D7 +:10C850001CE0420012195379072B03D093791B0770 +:10C860005B0F04D0401CC0B20F280CD00CE040007D +:10C8700000198079F12318406B071B0F1843907142 +:10C8800000290AD104E00020491EC9B20029E0D1E4 +:10C89000574856495A3009F0C6FD3046F8BDF8B53C +:10C8A0000D4600231A46022100F064F9040004D169 +:10C8B0004F484E49683009F0B6FD681E052804D37C +:10C8C0004B484A49693009F0AEFD0F21E2782079E2 +:10C8D000002310E0560036197779AF4206D1B179BE +:10C8E00049084900B1715B1CDBB21146521CD2B23F +:10C8F0000F2A00D100220646401EC0B2002EE9D108 +:10C900000F2905D248000019817901221143817154 +:10C910001846F8BD10B50446402801D2072010BDC6 +:10C9200000F056F8082802D03120000210BD002186 +:10C93000304802E0491C082903D24A00825A002AE2 +:10C94000F8D1082903D049004452002010BD04202A +:10C9500010BD10B5402801D2072010BD00F038F8F6 +:10C96000082805D00021234A40001152084610BD76 +:10C97000052010BDF0B58BB016460C00074607D059 +:10C98000002E05D06188402904D207200BB0F0BDED +:10C990001020FBE72088002801D0172801D90C209F +:10C9A000F4E7084600F014F808280FD0258803A8FB +:10C9B0002A463146023009F0B8FB01A8009062888F +:10C9C0002B4607213846FFF732FCDFE70520DDE77D +:10C9D00001460020074A02E0401C082803D2430019 +:10C9E000D35A8B42F8D1704702300000BCC500001A +:10C9F000AD020000000C0020F8B50546E54C079E8E +:10CA0000069821706270A370E6702071681C42085D +:10CA10005200E14B0021880000198446C261605C2D +:10CA200040008218002D0AD0002005E0664647002D +:10CA3000F669401CF353C0B2665C8642F6D8491CC6 +:10CA4000C9B20529E7D30026D21C9708B000BF0061 +:10CA500000198760304600F042F9A15D761C48431A +:10CA6000C219F6B2052EEFD3501B80B2F8BDF0B557 +:10CA70000546C84F8C460020FF247E5DA9009646DF +:10CA80000346CF190CE0F9695A008A5AC2498A4212 +:10CA900004D1401CC0B2FF2C00D11C465B1CDBB291 +:10CAA0009E42F0D86146002909D100280BD0002D04 +:10CAB00007D0B84949788E4203D2401EC0B2002840 +:10CAC00001D071460C70F0BD70B5B24C8D000023E2 +:10CAD0002D19615C09E0EC695E00A45B844202D11F +:10CAE0001370012070BD5B1CDBB29942F3D80020AB +:10CAF00070BDFEB51C4617460D46060008D0002D39 +:10CB000006D0F01C80088000B04203D01020FEBD8B +:10CB10000E20FEBD002F03D0002C01D0A74201D96A +:10CB20000720FEBD0094234622463946002001948A +:10CB3000FFF762FF2988814207D0814201D2042198 +:10CB400000E0092128800846FEBD009423462246C5 +:10CB5000394630460194FFF74FFF28800020FEBD84 +:10CB600010B5044600F0C5F8002801D0E0B210BDB1 +:10CB7000FF2010BDFFB50546874881B01E460C4614 +:10CB8000854204D0052C02D20398022802D300204B +:10CB900005B0F0BD002769460F7028466A46214659 +:10CBA000FFF792FF00280ED068460178204600F07B +:10CBB000A8F8002EECD00028EAD1284600F099F819 +:10CBC000002809D103E03846002EF6D1E0E7FF2027 +:10CBD00072A15C3009F027FC21462846039A00F038 +:10CBE0009CF8D5E7F8B505460C4600206A4E694624 +:10CBF0006E4F0870B5423BD0052C01D30720F8BD1D +:10CC00000A4621462846FFF75FFF002830D06846D5 +:10CC10000178204600F075F8230009F0F5FC0504C2 +:10CC2000090C11161B0001462846FEF7D5FA15E03F +:10CC3000FDF7E0FA12E001462846FFF74CFC0DE054 +:10CC400001462846F6F7B5FF08E001462846F8F702 +:10CC500012FC03E056A17B2009F0E5FB4D4A684633 +:10CC6000A10000788918C96940000E520020F8BD63 +:10CC70003846F8BD524A1268914201D210207047DE +:10CC8000052801D3072070470872002048727047BA +:10CC9000F8B504464A480068844201D21020F8BD25 +:10CCA000207A3C4A83009B18617A3B4D125C11E06C +:10CCB000DE694F00F65BAE420AD04A1C6272DA6946 +:10CCC0004B00D25A228000F01CF860600020F8BDB2 +:10CCD000491CC9B28A42EBD861720520F8BD0EB575 +:10CCE000384B40000ECB0091029301926946085ADE +:10CCF0000EBD28494978814201D9012070470020A2 +:10CD0000704770B50C460546FFF7E9FF214AA900B8 +:10CD1000891889686043401870BDF8B50C4606460E +:10CD200000206946134608706A4619462046FFF7F8 +:10CD30009EFE002500282BD0164A6846A1000078E8 +:10CD40008918C96940000E52684601782046FFF7ED +:10CD5000D8FF0546230009F057FC0504090C0F1401 +:10CD6000170029463046FEF713FA11E0FDF720FAC6 +:10CD70000EE0FFF78FFB0BE029463046F6F7E0FEAA +:10CD800006E0F8F771FB03E009A1622009F04BFB14 +:10CD90002846F8BD100C0020FFFF00007372635C92 +:10CDA000686F73745F636D2E6300000002300000D3 +:10CDB0007372635C686F73745F636D2E6300000051 +:10CDC000280000206C67010010B5014620220948A8 +:10CDD00009F0ABF907490020C877084610BD06499D +:10CDE000012048610548064A0168914201D10021AD +:10CDF00001607047400C00200005004078000020D2 +:10CE0000BEBAFECA8107C90E002808DA0007000F63 +:10CE100008388008C24A80008018C06904E0800891 +:10CE2000C04A800080180068C8400006800F704724 +:10CE3000BD4948788978884201D3401A02E021220E +:10CE4000511A0818C0B27047B74923314878897819 +:10CE5000884201D3401A02E02122511A0818C0B2B8 +:10CE60007047B149463148788978884201D3401AE1 +:10CE700002E02122511A0818C0B27047A94910B522 +:10CE80000C310868FF22120290430122D2031043A2 +:10CE90000860A54900202331487088702339487004 +:10CEA0008870463148708870A04808F0C8F89F48DC +:10CEB000401C08F0C4F8F5F741FC00F028F910BD5B +:10CEC00020207047B4E770B50C4605460026FFF7F2 +:10CED000AFFF9549A04214D30A46203A00232046CA +:10CEE000641EE4B200280BD08878105C2870887823 +:10CEF0006D1C401CC0B288702128F0D18B70EEE709 +:10CF0000012600F004F9304670BD202070479BE7F1 +:10CF100070B50C4605460026FFF796FF824923317F +:10CF2000A04214D30A46203A00232046641EE4B2ED +:10CF300000280BD08878105C287088786D1C401C05 +:10CF4000C0B288702128F0D18B70EEE7012600F086 +:10CF5000DEF8304670BD202101700020704710B50A +:10CF60000446FFF77EFF2070002010BD70B50C4610 +:10CF70000546FFF776FF6C494631A04215D30A46B5 +:10CF8000203A00232046641EE4B200280BD08878A3 +:10CF9000105C287088786D1C401CC0B288702128F5 +:10CFA000F0D18B70EEE7002400E0614C00F0AFF8A8 +:10CFB000204670BD70B50C460546212904D9FF20D6 +:10CFC0005CA1473009F02FFA55484068103840B24C +:10CFD000FFF718FFC6B20D20FFF714FFC0B286425C +:10CFE00007D2FF2053A14D3009F01DFA01E0F5F7FB +:10CFF000E8FB21462846FFF766FF0028F7D070BD02 +:10D00000F8B507464948484C401E474E007825462B +:10D0100046362335002806D1A9786878212200F009 +:10D020006BF800280ED0A1786078212200F064F817 +:10D03000002814D0B1787078212200F05DF8002823 +:10D0400028D033E038496878C91C0F546878401CF0 +:10D05000C0B26870212829D10020687026E03249CA +:10D06000607820390F546078401CC0B2607021286D +:10D0700001D1002060702D4F7F1E3878002815D018 +:10D08000A1786078212200F037F800280ED0002027 +:10D0900038700BE02449707826310F547078401CAA +:10D0A000C0B27070212801D100207070A978687812 +:10D0B000212200F021F800281DD0A17860782122DB +:10D0C00000F01AF8002816D0B1787078212200F00C +:10D0D00013F800280FD0F5F756FB144807F0B7FFF8 +:10D0E00001214903884203D016A1C12009F09BF910 +:10D0F0000E4807F0C4FFF8BD401C884205D090429E +:10D1000001D1002901D0002070470120704710B5DF +:10D11000064807F09CFF002801D1F5F723FB10BD5E +:10D1200000ED00E000E400E0800C00207D00002025 +:10D13000072000007372635C736F635F72616E64DB +:10D140002E6300007372635C736F635F72616E6461 +:10D150002E6300000C4908784A78401CC0B2904207 +:10D1600000D008707047094A074820BF40BF20BF61 +:10D170004178037843701368002B02D103788B4207 +:10D18000F3D00020704700007F00002000E200E0A4 +:10D19000FEB5F34C07466068FF213E0181552178BA +:10D1A000FF2913D00901083141583246491E08327F +:10D1B00009020192090A805800F0C8F9002802D03B +:10D1C0002478254615E06168207888552770FEBDD3 +:10D1D000E34842680198115828010090083010581F +:10D1E00000F0B4F9002806D1DD482C4641680098CB +:10D1F0000D5CFF2DECD1DA4821014068855547547C +:10D20000FEBD70B5D64A04460020157A53680AE080 +:10D210000201561C9E5DA64203D10C329A588A42E6 +:10D2200004D0401CC0B28542F2D8FF2070BDF8B5D2 +:10D23000CB4F3E7801F013FE0146FF2E68D034013B +:10D24000254678680835405900F080F9022802D94F +:10D25000786840595AE0C2494868025D0A70A11CCA +:10D26000425C002A0CD0521E425441590122D20580 +:10D2700089180902090A41513046FFF789FF30E059 +:10D28000631CC25C0092221D94468258002A10D072 +:10D2900001239B029A420FD99205920D43595703DD +:10D2A000DB191B021B0A43516346C3589A1A920AA0 +:10D2B00009E0FF21C1540AE0435952039A181202AF +:10D2C000120A4251002242543046FFF761FFA4483F +:10D2D0000C344168C26800980959800012580098BF +:10D2E00090479F4C2078FF2812D001F0B8FD0146EE +:10D2F0002078626800010830105800F027F90128F2 +:10D3000096D92078616800010830085801F09AFD2C +:10D31000F8BDF8B51C4615460E460746FF2B03D34D +:10D3200090A1D32009F07FF88D48FF21C7604560A8 +:10D3300004720674017000224270104604E002017B +:10D34000521C401CA954C0B2A042F8D3F8BD70B51D +:10D35000834C06466578207C854203D381A1E62074 +:10D3600009F061F8E068A90046506078401C6070E0 +:10D37000284670BDFFB581B01D46FF2401F06FFD4A +:10D38000774F064679780198814203D875A1F42039 +:10D3900009F049F872480021037A406810E00A0158 +:10D3A0009446521C825CFF2A24D0019FBA4205D1C8 +:10D3B00062460C328758029A97421DD0491CC9B266 +:10D3C0008B42ECD8FF2C17D021014B1C019AC25480 +:10D3D0000B33029AC250039B614F0022012B0ED0E7 +:10D3E0000B1DC25001239B029D4216D9AA05920D26 +:10D3F00008D008E00C46E1E7FF2005B0F0BD0B1DAA +:10D40000C550EFE71A4653039B190E461B02083618 +:10D410001B0AAA1A8351920A09E0002D00D10125A6 +:10D420006B039B191D022D0A0B460833C550891C3E +:10D4300042543D463E782046FFF7AAFE2878B04287 +:10D4400015D001F00CFD014628786A68000108300B +:10D45000105800F07BF8012807D928786968000186 +:10D460000830085801F0EEFC01E0FFF7E0FE0198FB +:10D47000C3E770B50C46054601F0F1FC06462146AF +:10D480002846FFF7BEFEFF2817D0354D0401204681 +:10D49000696808300858314600F058F8012109033E +:10D4A00040186968A41C095D400B002901D089025D +:10D4B0000818002800D1012070BD002070BDF3B510 +:10D4C00081B00F460198FFF79CFEFF282AD0244D1B +:10D4D0002E7869683246344604E0844205D02646F8 +:10D4E0002301CC5CFF2CF8D11CE0FF2C1AD0A64203 +:10D4F0001FD11001085C2870FF2818D001F0AFFC84 +:10D500002A780146120168680832805800F01EF837 +:10D51000012809D92878696800010830085801F005 +:10D5200091FC06E00020FEBDFFF781FE01E001F066 +:10D5300091FC39460198FFF79CFF22016968FF239F +:10D54000541C0B558A5C3301CA54FEBD401A0002BC +:10D550000121000AC905884200D900207047000057 +:10D56000CC0C00207372635C736F635F74696D65CC +:10D57000722E6300F0B500241C4A01211C4B0803E5 +:10D58000546018601B4B1C601B4C20601B480469D6 +:10D59000E443E406E617046910252C430461184CA3 +:10D5A0006160184D2960761C00E020BF1F68002FC5 +:10D5B000FBD0002E03D107691026B743076190689E +:10D5C0008005906801D5104A10436960A160002170 +:10D5D00019600121084A09031160F0BD10B5044625 +:10D5E000FFF7C8FF2060002010BD000000C500400C +:10D5F00080E100E000C1004080E200E000ED00E0DA +:10D6000000C3004000C0004000FCFFFF70B51F4990 +:10D610000A68002A17D000231D4601244A68521CBC +:10D620004A60092A00D34D600E792246B2400E6846 +:10D6300016420AD072B60B6893430B6062B6496813 +:10D640000160002070BD052070BD5B1C092BE5D377 +:10D650000FA1362008F0E7FEF5E70120104980050C +:10D6600008607047EFF31081CA07D20F72B601212C +:10D6700081400648036819430160002A00D162B660 +:10D68000EBE7024800210160416070478400002000 +:10D690007372635C736F635F6576742E6300000062 +:10D6A00000E200E001208107086070470120810747 +:10D6B000486070471048C068C00700D0012070471C +:10D6C0000D488068C00700D0012070470A484069B3 +:10D6D000C00700D0012070470748C069704706495D +:10D6E0008A69D20306D589698907890F814201D1E8 +:10D6F000012070470020704700040040F8B5F84C46 +:10D70000207BE17A88421CD00126F64D0027E07A82 +:10D71000215C14200A4642435019037C052B11D08A +:10D72000037C062B1CD0037C072B28D0437C012BC9 +:10D7300033D0EDA1EF4808F076FE207BE17A8842F5 +:10D74000E5D1F8BD0674E07A0A2807D0E07A401CDB +:10D75000E072491CC8B2AA5802210CE00020F7E789 +:10D760000674E07A0A2808D0E07A401CE072491C6E +:10D77000C8B2AA5803219047DFE70020F6E70674F5 +:10D78000E07A0A2807D0E07A401CE072491CC8B24F +:10D79000AA580821EFE70020F7E74774E07A0A2843 +:10D7A00007D0E07A401CE072491CC8B2AA58072191 +:10D7B000E1E70020F7E770B50024CF4E0620707235 +:10D7C000CE4825464477047738300473C472CC4879 +:10D7D00007F035FCCB480575F572CB49601E8860B3 +:10D7E0007571B570F57035717570C848643905701C +:10D7F00045701420604340180574641CE4B2052C85 +:10D80000F7D30120F5F764F80020F5F761F801205F +:10D81000B071F4F727FDBE48F4F736FDBD4C20701B +:10D82000BD48F4F731FD6070F4F7F2FF70BD10B53C +:10D83000F5F719F8B74C2078F4F744FD6078F4F761 +:10D8400041FDAD4C207A002803D0F4F7CAFD00203A +:10D85000207210BD70B5A84CA079002804D0A2A1F8 +:10D86000AE4808F0E0FD70BDE07A002803D19EA12B +:10D87000AB4808F0D8FD0126A6710025E572607A54 +:10D88000042114225043974A801801749E488168ED +:10D89000491C04D0691E81600120F5F719F80020A9 +:10D8A000F5F716F8F4F7FAFF07F00AFDF5F7FBF8BD +:10D8B0009C480560056001209B49C0030860F5F79E +:10D8C00071F992480078022804D0032804D1E07846 +:10D8D000002801D0A67000E0A570F5F7D0F870BD63 +:10D8E000034680490520142242435218203A127FF1 +:10D8F000002A04D0401E0006000EF4D17047142206 +:10D90000424351180A46803AD366012220390A77E9 +:10D910007047012805D0032805D1002903D1002034 +:10D9200070470029FBD010B4734C00236370774A12 +:10D93000002890700CD002280AD007291AD20800BB +:10D9400078440079001887441505070D0F1113005E +:10D95000D37003E01B2000E03A20D07001206070FB +:10D9600010BC70475820F8E77720F6E79620F4E7D8 +:10D97000B520F2E710BC0020704710B5634840782E +:10D98000F5F798F880B210BD411E1422504310B52F +:10D99000544A8418203C042902D8207F002803D14F +:10D9A00051A1624808F03FFD207F012804D0B32038 +:10D9B0004DA1800008F037FD0020207710BD70B524 +:10D9C0004E4C607F217F884201D1012500E0002577 +:10D9D000F5F709F8F5F76EF8617F227F914201D1E2 +:10D9E000012100E00021A942EBD170BDF7B5074647 +:10D9F000481E84468EB0C0B2142205905043394A66 +:10DA000085180495287C2D1D07282AD1344C002622 +:10DA1000E07A227B824221D0235C059A934201D195 +:10DA2000012601E0002E04D00A2811D0421CA25C7D +:10DA300022540A280ED0401C227BC0B28242EBD175 +:10DA4000002E0BD0207B002806D0207B401E04E057 +:10DA50000022ECE70020EFE70A202073049A01205F +:10DA600010746046244C042813D8142041431D48E8 +:10DA700008182038007F00280BD00498007C01286B +:10DA80000BD00498007C012803D01098807A0128DC +:10DA900007D015A1264808F0C6FC1098807A012806 +:10DAA0006FD104980F4B007C022845D00C4C207B92 +:10DAB0000A2872D0207BE17A401C884203D10AA157 +:10DAC0001C4808F0B0FC049901204874217B05989B +:10DAD0006054207B0A2864D0207B401C20731CE10A +:10DAE000D80D0020E80D00207372635C72656D2E06 +:10DAF00063000000CF0500006C0E0020A00D002088 +:10DB0000780E0020C00D00204C0E00208E0000205A +:10DB10002FD200008C000020FDD600007D02000006 +:10DB20005E02000000F5004080E200E0CB02000051 +:10DB30001503000022030000607A059A0146904216 +:10DB400006D0014614267043C018807C9042F8D15C +:10DB5000627A824208D1617A14225143C918897CC1 +:10DB600061720121A17207E014224243D2181426E7 +:10DB70007143927CC9188A74142206215043C0183C +:10DB800081741098007A062819D201007944097925 +:10DB900049188F440812100E0C0AE07A00288ED023 +:10DBA00091E700209AE700200FE0B4200DE07320F9 +:10DBB0000BE0322009E00A2007E0062005E0FF2004 +:10DBC000FDA1E03008F02FFC0020029010980168C1 +:10DBD0000298081A28601099097A002912D00221A7 +:10DBE000401A0102090A296010980268406810185A +:10DBF0000002000A68601098807A0228109803D00A +:10DC0000007B74E00421EBE7007A002813D00222A5 +:10DC1000029810188446109842686046083016181A +:10DC2000E848029A4078904202D9E278002A04D06B +:10DC30003046083005E00422EAE7029A801A80198B +:10DC40000830627A062A1CD0627A14235A43DE4BCB +:10DC5000D2185268914214D0DC4B0793617A142297 +:10DC60005143D94A89184A688968D21BC91B1202D4 +:10DC70000902120A090A90423AD89A4238D89942BF +:10DC800036D83818801B0002000A286010996044BA +:10DC9000CF4AC9680002000A9446421A01239B0534 +:10DCA00007929A4201D2104614E00A1A09929A4247 +:10DCB00001D207980EE0079A6346624503D9591AC4 +:10DCC0000818401C06E0099A624506D9181A40183F +:10DCD000401C4042002860DC03E0B7A1BD4808F0CA +:10DCE000A2FB286880190002000A686000202872E0 +:10DCF0006868082608300002000A68601098407AB8 +:10DD0000A8721098007A687203280ED200280CD0EE +:10DD1000FFF7D0FC002803D007E0002011B0F0BDD1 +:10DD200002983A210E1A32200290A6480178012961 +:10DD300001D0032909D141780298814205D9E078C0 +:10DD4000002802D10298081A861928689F4AC01B29 +:10DD5000844601026868090AC01B03021B0A029379 +:10DD60008E421AD81346914217D80299994214D874 +:10DD7000617A062915D0667A6146062203920092DE +:10DD80001422914B7243D2189368DB1B8B4216D836 +:10DD90000396967C062EF3D177E0059801F055F9AD +:10DDA000BBE70499022205980A74627A062A00D019 +:10DDB000627A8A7460720120A07211B0F0BD062EE2 +:10DDC00063D000223146944614227F4B4A43D21836 +:10DDD0005368DB1B834229D2917BAB7A99421FD8CF +:10DDE00004980521059C01747B4D287B0A2811D0DD +:10DDF000287BE97A401C884203D16FA1774808F05C +:10DE000012FB287B2C54287B0A2807D0287B401C37 +:10DE1000287382E7E87A0028EFD0F2E70020F7E7DE +:10DE200001218C46917C0629CED102E06046002873 +:10DE30002AD03546009114202A46424362480621E2 +:10DE4000171839741038007B0A28634816D0017BF4 +:10DE5000C07A491C814203D157A1614808F0E3FA16 +:10DE60005D48017B4554017B0A290BD0017B491C8D +:10DE70000173BD7C0098A842DDD106E0C07A00287D +:10DE8000EAD0EDE70021F3E70096049902204E4D19 +:10DE90000874607AB04207D1049900988874059894 +:10DEA00060720120A07221E00398062E0FD0062890 +:10DEB00003D141A14B4808F0B6FA0398142250430D +:10DEC0004019059981740499009888740EE0062819 +:10DED00003D139A1444808F0A6FA0398142250430C +:10DEE000401905998174049906208874012011B0A5 +:10DEF000F0BD70B50D463D4A441900210B46101A7D +:10DF00008B4103D22CA13A4808F08DFA394885425A +:10DF100003DD29A1384808F086FA3848854203DA3B +:10DF200025A1374808F07FFA3648844205DA002CEC +:10DF300001DB204670BD334800E03348201870BD37 +:10DF4000401E70B5C0B2142148431F494418607B7D +:10DF5000062813D201007944097949188F44020C2C +:10DF60000A080604002068E0B42010E073200EE0E8 +:10DF700032200CE00A200AE0062008E0FF200EA173 +:10DF8000E03008F050FA617B0020002955D00221D2 +:10DF90004018616840180002000AF4F78BFD0C2558 +:10DFA0006557124A441900210B46101A8B412FD293 +:10DFB00001A10F482AE000007372635C72656D2E48 +:10DFC000630000008E000020E80D0020FFFF3F00EE +:10DFD000FFFFFF000E070000D80D00200702000021 +:10DFE000C5030000DD030000E3030000FF7F841E83 +:10DFF000F50300000020A107F603000000E05EF832 +:10E00000F70300000080841E00807BE108F00BFA1B +:10E01000FB48854203DDFB49FB4808F004FAFB4856 +:10E02000854203DAF749FA4808F0FDF9F9488442D5 +:10E0300007DA002C03DB204670BD0421A8E7F54871 +:10E0400000E0F548201870BDF0B5064683B0F348EF +:10E050000190457A029534687068001B0702F04809 +:10E060003F0A001B0090062D2DD014202946414365 +:10E07000EC480122081884464168E9489205864622 +:10E08000081B904210D3631A93420DD30246704688 +:10E09000724503D900984018401C05E073450ED91D +:10E0A000411A0819401C404200280CDA60460295CB +:10E0B000857C0198C0790028D5D003B0F0BDD14946 +:10E0C000D94808F0B0F90298854226D01421484377 +:10E0D000D4490123401802908068D1499B058C46A1 +:10E0E000011B8646994210D3221A9A420DD36346E9 +:10E0F000614503D900997144491C06E019466245FF +:10E100002DD9091A0819401C4142002905DD029841 +:10E11000B17A807B814200D37446062D15D0C14967 +:10E120001420454368184268121B1202120ABA42B0 +:10E130000BD2B37A827B934200D38468857C0198AA +:10E14000C0790028B9D1062DEAD13068A042B4D0F8 +:10E15000E0190002000A3460706003B0F0BDA94904 +:10E16000B14808F060F9D8E7F0B5B049044648680E +:10E1700085B0C005C00D1CD0103840B200280CDAA4 +:10E180000207120F083A920892005118C9698007D5 +:10E19000C00EC1400806800F09E08108A44A89002A +:10E1A000891809688007C00EC1400806800F002842 +:10E1B00008D000272078002806D0012804D00020AD +:10E1C00005B0F0BD0127F5E72079062813D201003C +:10E1D0007944097949188F44020C0A080604002082 +:10E1E00018E0B42010E073200EE032200CE00A208A +:10E1F0000AE0062008E0FF208249E03008F013F929 +:10E2000021790020002905D002214618834D002FD6 +:10E2100002D003E00421F8E70020E871694602AA71 +:10E22000A068F4F751FC694608228A56E06801A903 +:10E2300080180122C01C1F2801DA019209E003AAFC +:10E24000F4F742FC6846007B002802D00198401C8D +:10E25000019000990198401808300002000A0190CE +:10E26000881B0002000A0090607969468872009855 +:10E270000390F4F7B8FB009A019B121A181A6D4923 +:10E2800012020002120A000A8A4216D8884214D8E2 +:10E290006846FFF7D9FE00990398814205D0881996 +:10E2A0000002000AF4F706FCA0600120E9790029C9 +:10E2B00086D0002FB0D005B0F0BD0020F6E7F3B552 +:10E2C0008FB05D480C460B9006F0C1FE5B4A0F997B +:10E2D000524F56185A4D203E00280BD05948007D09 +:10E2E000002803D058A15B4808F09DF82078012849 +:10E2F0007ED060E1687F0A280CD0687F297F401CAF +:10E30000884203D150A1544808F08DF820780128A4 +:10E3100004D00CE0287F0028F4D0F7E7F07F002835 +:10E3200003D049A14D4808F07EF80120F077697FBD +:10E330000F9814224A4E51438919087420780228F4 +:10E3400022D0687F14214843861920793072607981 +:10E35000707232460C323146A068F4F7B5FB0C20DF +:10E3600030560F2804DD1F3830733068401C306091 +:10E370000C217156301DE26801905018C01C1F28F6 +:10E3800070DA01200199FDE028494868C005C00DF8 +:10E3900021D0103840B200280CDA0207120F083AD8 +:10E3A000920892005118C9698007C00EC140080642 +:10E3B000800F09E081081E4A8900891809688007D2 +:10E3C000C00EC1400806800F002804D105201EA100 +:10E3D000000208F028F8687F1421484386190021BC +:10E3E000E0686A460691117006A9F4F76DFB00E03B +:10E3F000D7E06A46002010560F2834DD012033E0B4 +:10E400000020A107B8DF0000F603000000E05EF87E +:10E41000F70300000080841E00807BE16C0E00206A +:10E42000FFFFFF00E80D00200E07000000ED00E0F8 +:10E4300000E400E0FFFF3F00780E00209200002083 +:10E44000A00D0020C00D00207372635C72656D2EFC +:10E450006300000011050000EF040000F404000058 +:10E46000E00C002082E0002006994018079002206E +:10E47000B0722079307260797072A068311DC01C52 +:10E4800006911F2801DA012009E0F4F71DFB684618 +:10E490000078002804D0069806990068401C08609F +:10E4A000307A062813D201007944097949188F443B +:10E4B000020C0A08060400200FE0B4200DE07320CF +:10E4C0000BE0322009E00A2007E0062005E0FF20EB +:10E4D000FD49E03007F0A7FF00202179002943D053 +:10E4E00002214018069071680830081807990890B2 +:10E4F00009180698081A0C900020F871F4F773FABE +:10E5000004463060079820180002000AF060787A0C +:10E51000062825D0797A14204143EC480818406831 +:10E520000899029040180002000A0390707A694628 +:10E53000887402A8FFF788FD0299039A091B121B31 +:10E5400009021202E24B090A120A0C98994207D8F2 +:10E55000824205D80299069808180002000A306025 +:10E56000F8790028C8D110E00421BAE704AA01997B +:10E57000F4F7AAFA6846007C002804D001980199B3 +:10E580000068401C08602078B072687F0A2806D0B6 +:10E59000687F401C68770B9806F071FD47E000200B +:10E5A000F8E7F07F002804D0A320CAA1C00007F03C +:10E5B0003AFF0120F077CA490F98087420780228A2 +:10E5C00003D1C4A1C74807F02EFFC54E2079307291 +:10E5D0006079707232460C323146A068F4F774FAF2 +:10E5E0000C2030560F2804DD1F3830733068401C73 +:10E5F00030600C22B256301DE16801908818C01CB2 +:10E600001F2802DA012001990BE003AA0199F4F70F +:10E610005BFA6846007B002804D0019801990068E5 +:10E62000401C08602078B072AD4901200875687FF1 +:10E63000297F884224D07C7A062C23D0F4F7D3F9A2 +:10E6400014214C43A14961180A7C042A18D00A7C81 +:10E65000032A15D04B6889681B1A081A1B0200028E +:10E660009B4A1B0A000A082B0AD31146934207D87B +:10E67000884205D8687F297F884201D0F4F7FFF9E6 +:10E6800011B0F0BD687F297F8842F7D111B0F0BD8D +:10E6900010B50020F4F709F910BD10B50120F4F70A +:10E6A00004F910BDF1B5009802281ED08E4C607A96 +:10E6B000062803D187A18D4807F0B5FE0026A67174 +:10E6C0000125E572607A03211422804F5043C0195E +:10E6D0000174F4F7D9F9009800280BD0012829D04B +:10E6E000032879D07BA1824844E082480078F3F780 +:10E6F000EFFDF8BD8048007F002803D075A17F485A +:10E7000007F091FE65717C4D00202E60F4F7E0F873 +:10E71000A968481C04D0012300221846F4F70EF91A +:10E72000607A617A401CC0B2142251437A580121A8 +:10E730009047F8BD0120F4F7CBF8607900280DD0A0 +:10E740006D488068401C09D0607A617A401CC0B274 +:10E75000142251437A5806219047F8BD6648007F3D +:10E7600001280AD0022812D0032822D0042834D04D +:10E7700058A1634807F057FEF8BD2079002803D060 +:10E780002671F4F786F9E5705B480677F8BD207AC4 +:10E79000002802D1F3F7FCFD2572607A617A401CF3 +:10E7A000C0B2142251437A5800219047524806774C +:10E7B000F8BD514F0123397B78680022411A184671 +:10E7C000F4F7BCF82079002803D02671F4F761F93A +:10E7D000E57002203877F8BD19E0474E217870685F +:10E7E0000123411A00221846F4F7A8F8207A0028DD +:10E7F00002D1F3F7CDFD2572607A617A401CC0B278 +:10E80000142251437A58002190473577F8BD607A39 +:10E81000617A401CC0B2142251437A5805219047B6 +:10E82000F8BD10B5304C607A062803D129A13548CF +:10E8300007F0F9FD607A617A401CC0B2142251439E +:10E84000224A52580421904710BDF0B583B00620EB +:10E850000290F4F7C8F8244C0090617A2A4801909D +:10E86000062920D0617A1420414318480918097CF0 +:10E87000042918D0617A142251430818007C032817 +:10E880007BD0019900980B6849681B1A081A1B0273 +:10E8900000020F4A1B0A000A082B6ED3114693424E +:10E8A0006BD8884269D814488068401C03D009A1FD +:10E8B000164807F0B8FD00206071607A06282CD158 +:10E8C0006078002829D023E0B8DF0000E80D0020A0 +:10E8D000FFFF3F007372635C72656D2E6300000082 +:10E8E000C00D00201E0500006C0E00204F0500002A +:10E8F000A20500008C0000204C0E00205B050000EB +:10E9000096050000A90500005C0E0020E50500004A +:10E91000FE48C178417081780170607A062815D070 +:10E92000607A1421FA4A48438018007C04280DD1EB +:10E93000607A0290607A0121142358438018017490 +:10E94000607A58438018807C6072A172F14D687FB4 +:10E95000297FF14F884233D0F04E287F142148435D +:10E960008019007CC05D0128287F07D048438019AA +:10E97000007CC05D02282FD044E0FDE11421484313 +:10E980008019807A01280AD0287F0221142250435E +:10E990008019007CC155287F0A2808D009E0287F0B +:10E9A0000021142250438019007CC1552AE0002028 +:10E9B00001E0287F401C2877687F297F8842CCD1DE +:10E9C000D74D287D00284CD0287CC15D012928D056 +:10E9D000C05D022830D03AE0287F142148438019D6 +:10E9E000807A012803D0CFA1D14807F01CFD297FF0 +:10E9F00000201422514389198872297F51438919B3 +:10EA0000097CC855287F142148438219287F484330 +:10EA10008019017C0098FEF7E9FF287F0A28C8D1F9 +:10EA2000C5E7A97A012904D00221C1550020287523 +:10EA30000DE00021C1550AE0A87A012803D0B9A150 +:10EA4000BC4807F0F0FC0020A872297CC855287D3E +:10EA5000002806D0297CB24A0098FEF7C7FF0020A4 +:10EA60002875029806281ED014214843A84940184A +:10EA7000017C012917D107210174AF4D287B0A2899 +:10EA80003CD0287BE97A401C884203D1A5A1AB4841 +:10EA900007F0C9FC297B02986854287B0A2831D0EA +:10EAA000287B401C2873607A06287DD0A07A002835 +:10EAB0007BD00020A072617A1420414394480E1844 +:10EAC0009F49B56873680A46F6687C32CB679660E2 +:10EAD00055609C4D697E002916D00226617A142269 +:10EAE0008B4851430818407B06281BD2010079440B +:10EAF000097949188F440A1412100E0CE87A00287C +:10EB0000C4D0C7E70020CDE70426E7E700210FE0E7 +:10EB1000B4210DE073210BE0322109E00A2107E066 +:10EB2000062105E0FF208849E03007F07CFC002149 +:10EB30002973687E022801D0012810D12869009A23 +:10EB40004018821A1202120A3A2A08D932380321CE +:10EB500000026976000A28613220287308E0322911 +:10EB600006D2207A00280AD1F3F712FC012005E032 +:10EB7000207A002803D0F3F734FC00202072634988 +:10EB80000822487820700978012901D0032906D18C +:10EB900001212171297B884201D9421A0832A378C8 +:10EBA000002B00D0921C01E08DE09BE02179002930 +:10EBB00001D1002B5DD09446644A00990092019ADD +:10EBC000176852687F1A511A3F0209023F0A090A60 +:10EBD000BC451BD85D4A974218D8009A914215D877 +:10EBE000297B884223D92B69421A9A1A1202120AE7 +:10EBF000101880190002000A2A616860002914D0E8 +:10EC0000032028770006000E3ED14CE00020207142 +:10EC1000A070297B002925D028694018801900029E +:10EC2000000A6860022028772EE00120E9E781428F +:10EC30000BD92A69511889190902090A6960002843 +:10EC400001D00420DDE70220DBE7002B03D135A152 +:10EC50003F4807F0E8FB286980190002000A686055 +:10EC6000002004E0296989190902090A69602877E6 +:10EC700019E0287B00280FD02969081880190002A4 +:10EC8000000A686002202877286901238119002280 +:10EC90001846F3F753FE09E0286980190002000ABC +:10ECA0006860002028770120F3F712FE607A1421B3 +:10ECB000484317490C2240188256012300206968F6 +:10ECC000F3F73CFE0EE00120F3F702FE0020F3F71D +:10ECD000FFFDF3F7E3FD207A002803D0F3F781FB73 +:10ECE00000202072A078002804D0F3F7D2FE002084 +:10ECF000E070A0706078002804D00448C1784170AA +:10ED000081780170207900282BD023E08E0000202C +:10ED1000E80D0020A00D002091000020E00C002054 +:10ED2000C00D00207372635C72656D2E630000007D +:10ED30000706000023060000D80D0020350600005D +:10ED4000E00D00204C0E0020B8DF0000FFFF3F0068 +:10ED5000870600000020CF49E0700978002900D123 +:10ED60002071CD48017BC07A814203D0CB484078E6 +:10ED7000F3F7AEFA0120E07103B0F0BDF0B5C84C76 +:10ED80000746607A83B0062803D1C6A1C84807F0B9 +:10ED90004AFB607A1421C74E48438019007C03283F +:10EDA00003D0C0A1C44807F03EFBC44DA868401C76 +:10EDB00003D0BCA1C24807F036FB607A1421484357 +:10EDC00081190C20085600216A4600911171C01962 +:10EDD00001AA6946F3F778FE6A46042010560F2808 +:10EDE00001DD012000E0002000994018696840180A +:10EDF0000102090AA9606079002804D001230022D9 +:10EE00001846F3F79BFD03B0F0BD70B5AE4CAD4AAC +:10EE10000B1AA34214D3451AA54211D3934203D926 +:10EE2000101A43185B1C0BE0954204D9511A0818BC +:10EE3000401C434204E0A549A54807F0F4FA00232A +:10EE4000184670BD10B50146012300220220F3F7D9 +:10EE500075FD10BD10B50220F3F73AFD10BD10B5D9 +:10EE6000F3F7C1FD10BDF0B58D4D0446E87A83B0CF +:10EE7000002803D18BA1974807F0D5FA642C4DD315 +:10EE8000954900200246091B824147D39348417FA0 +:10EE9000007F814242D19248007D00283ED1687AAD +:10EEA0001421844F4843854EC519306801AA0019C2 +:10EEB0006946F3F709FE694604200856002802DD7A +:10EEC0000098401C0090A96800986B680A18D21A34 +:10EED0001202844B120A9A4220D8AA7C062A08D031 +:10EEE00014235A43D2195268511A0902090A81425D +:10EEF00014D3B068401C05D00120F3F7E9FC0020D2 +:10EF0000C043B060306800193060A86800994018AC +:10EF10000002000A7061012003B0F0BD002003B0C0 +:10EF2000F0BDF8B50646401EC5B2142061496843DD +:10EF30004418207C002803D15AA16B4807F073FACB +:10EF40006648017F407F81420CD0684A14234B43BE +:10EF50009B181B7CB3420CD00A290CD0491CC9B2A7 +:10EF60008142F3D15E48017D002964D0007CB0422B +:10EF700061D10020F8BD0021F1E7217C052905D0F1 +:10EF8000217C062902D0217C072928D10121217466 +:10EF9000C17A0023027B8A4221D00246565CAE42EF +:10EFA00001D1012301E0002B04D00A2911D04E1C0D +:10EFB000965D56540A290ED0491C167BC9B28E4262 +:10EFC000ECD1002B0BD0117B002906D0117B491E00 +:10EFD00004E00026ECE70021EFE70A211173617CD1 +:10EFE00000292AD06774C17A0023027B8A4224D088 +:10EFF000425CAA4201D1012301E0002B04D00A297E +:10F0000012D04A1C825C42540A290FD0491C027B50 +:10F01000C9B28A42ECD1002B0FD0027B0146002AF4 +:10F0200006D00A7B521E04E00022EBE70021EEE747 +:10F030000A220A7301E018480027217C01299CD18B +:10F04000617C002999D10120F8BD70B505461420D6 +:10F05000184A05216843801801740F4C207B0A2848 +:10F0600011D0207BE17A401C884203D11749204807 +:10F0700007F0D9F9207B2554207B0A2807D0207B74 +:10F08000401C207370BDE07A0028EFD0F2E700202A +:10F09000F7E700008E000020D80D00208C00002033 +:10F0A0006C0E00207372635C72656D2E630000004D +:10F0B000EA060000E80D0020EB0600004C0E0020E0 +:10F0C000EC060000FF7F841E0020A107B8DF0000CF +:10F0D0000E0700002D070000FF1FA107A00D002054 +:10F0E000C00D0020FFFF3F006A070000E00C002079 +:10F0F0000702000070B5FF4D00246C702C70AC61ED +:10F1000000F0CEFC284620304470C473AC6214304A +:10F110002C6305F094FF002804D0FF20F6A14E30A8 +:10F1200007F081F92C7770BD0B23DB4310B5C21AB1 +:10F13000F54998421FD008DC1C3222D00A2A20D080 +:10F14000142A1CD0182A08D117E0083011D004283E +:10F150000DD0082809D00C2805D0FF20E6A1753075 +:10F1600007F061F910BD04200CE000200AE0FC204B +:10F1700008E0F82006E0F42004E0F02002E0EC20B3 +:10F1800000E0D820C86010BD70B50125DF49022617 +:10F190000E60DF490022CA63CD63DE49C96A0907F0 +:10F1A0000ED4DC494031CB6ADB4A53620B6B93626D +:10F1B0004B6BD3628B6B1363C96BD30519435163DC +:10F1C000D14C002826D0012828D0FF20CAA1A13088 +:10F1D00007F029F9D148A063FF200430606325635C +:10F1E00003202061C849962040314860C1491C2055 +:10F1F0000856FFF799FFCB49C9488860C948CA49F2 +:10F2000080304160C9490160C9480660C949102081 +:10F21000486070BDC8486061C84803E0C848606184 +:10F22000C648801FA061D5E770B50C46B14D0146B8 +:10F230000622A81C06F079FF2C7270BDAD48203064 +:10F2400040787047AB4A517010707047F8B504466B +:10F250000D465079117900020843690009190884A4 +:10F260001F461646501C06F0C1FF317800020843C5 +:10F27000A90060502846083001268640002F0ED095 +:10F28000012F04D0FF209CA1E83007F0CCF8206BC0 +:10F29000304301460120A84001432163F8BD206BA3 +:10F2A000B043F6E770B50D460446082904D9FF209F +:10F2B00091A1F93007F0B7F80022A24809E09100C7 +:10F2C000635809180B6053001B191B8C0B62521CEE +:10F2D000D2B2AA42F3D3206B9A494031086070BD84 +:10F2E00010B50446FFF720FF8248047710BD81481F +:10F2F0002030007B704710B5834CC178616206F006 +:10F3000075FF0002E06110BD252808D0262808D02E +:10F31000272808D041000A2807D8091D06E0022145 +:10F3200005E01A2103E0502101E0891DC9B2764AA7 +:10F33000916075494031486170476E4988617047F6 +:10F3400070B5002818D002226A4C784B0320A272B4 +:10F35000F0331860734D72486860002001262075F4 +:10F3600000290BD0012910D002291BD0952062A1C1 +:10F37000800007F058F870BD0122E5E77248012AC5 +:10F3800001D0466070BD066070BD5A48012A006B0E +:10F3900005D00121490508432063696070BD012142 +:10F3A0000905F8E7A069002803D153A1674807F0D1 +:10F3B0003AF8A169A06A40186549886059486549CA +:10F3C0008030816060491031C1600120216BC00331 +:10F3D00001432163686047482030C67370BD08B59B +:10F3E0000C20694608705148002110380161564AC6 +:10F3F000012111610BE000BF00BF00BF00BF00BFD3 +:10F4000000BF00BF00BF6A461178491E11706946EF +:10F410000978002902D001690029ECD068460078FB +:10F42000002804D1494834A1203006F0FCFF08BD73 +:10F43000F8B53E4CF034206886083E48B600416876 +:10F44000C906CD0F10218160002727603549344857 +:10F450008860FFF7C4FF35481038076100F020FBD3 +:10F460002660002D02D0334910204860F8BD10B549 +:10F4700006F0BCFE00022449000AC86310BD2349FF +:10F48000022008602A49086070472049022080391C +:10F4900008607047304908707047164810B534301E +:10F4A00005F0D5FD002804D0284813A15A3006F0F5 +:10F4B000BAFF10BD0F4810B5343005F0E0FD10BDA7 +:10F4C00011494860704770B50A4D0446A86AA042C9 +:10F4D00004D31E4808A16B3006F0A5FF0120287355 +:10F4E0001C49002008392C6148601948446000F02C +:10F4F000DEFA70BD7C0E00207372635C68616C5F25 +:10F500007263732E630000000015004080E100E08C +:10F51000C01F004080000010001700405B06000084 +:10F520000040000400F50140408000401011004000 +:10F5300080E200E000130040060102002500030203 +:10F5400005010300001600400010004047020000C3 +:10F5500040850040488100409700002010B5FF48DA +:10F5600002210173C6210161FD4A00215160806AB8 +:10F57000FC49C630486000F09AFA10BD0121FA48F3 +:10F5800089058160F548026B8A430021026301739B +:10F590007047F64801214160C160F1490020486090 +:10F5A000F0494860ED4988627047F149402008629F +:10F5B000F0490A6802430A607047EE480168402239 +:10F5C00091430160EA49002008627047E9480168F8 +:10F5D000102291430160E849012088617047E749A2 +:10F5E0000020C861E34801681022114301607047A0 +:10F5F000E249CA69012A01D000207047DC4A9268BA +:10F600005206520E524202700020C861012070471B +:10F6100070B5D248D24D017B002902D0696801291A +:10F6200009D00024D5490A69012A06D00023807A2E +:10F63000012804D006E00124F4E74023F7E7CA6874 +:10F64000012A04D000221A43012802D004E020221B +:10F65000F9E74B68012B05D000231343C84A022861 +:10F6600002D007E01023F8E71668012E02D1CE6819 +:10F67000012E04D000261E43022802D007E00826EF +:10F68000F9E71268002A02D1CA68012A04D00022D0 +:10F690003243022802D005E00422F9E7002C01D011 +:10F6A000022300E000231343022807D14868012801 +:10F6B00004D16868012801D0012600E00026B14885 +:10F6C0001E4302681206120E02D04A69012A00D0B7 +:10F6D0000022A24C2034227300680006000E02D0E3 +:10F6E0008869012800D000206073A148006A0028C2 +:10F6F00003D000F0A8FA012800D00020A07300F089 +:10F70000C7F9002068603046F3E670B50C00054686 +:10F7100003D19D499D4806F086FEE00706D0012CE6 +:10F7200004D06D209849C00006F07DFE002D0ED05B +:10F7300002218A4801294172C4728E4809D00229E7 +:10F740000AD0924890491A3006F06DFED1E60121A8 +:10F75000EFE70168042201E001680822114301601B +:10F76000C7E670B57D4C0022E37A990701D54107C1 +:10F7700014D47A49DD062031002D05DA4D7B002DA9 +:10F7800002D08D7B002D09D01D0702D50D78002DEC +:10F7900004D15B0703D54978002900D10122637A9F +:10F7A0007449002B06D00225284010430CD0FFF7E7 +:10F7B0003FFE9EE66C4A76489060086880088000AC +:10F7C000086000F06DF994E6012B07D0022B0ED0F3 +:10F7D0006E486D496B3006F026FE8AE60868042202 +:10F7E0009043086000F05CF90120A07281E608688F +:10F7F00008229043086000F053F9A57279E6574952 +:10F8000008757047F8B5554F544D2037FA7B564C64 +:10F810000021286B002A31D00122D203A26090433C +:10F820002A46544D10632E685A4A102090600020DA +:10F8300028601014A060FFF7D2FD00F029F92E60B7 +:10F84000281460605349102048604448817A4A482F +:10F8500001290DD002290ED04C484FA1801F06F07F +:10F86000E2FD0020F8733D48007D022874D0F8BD09 +:10F8700001210160F5E701214160F2E73A4A906019 +:10F880000E462963FFF7C4FE044636482E754168CC +:10F8900069620068A862AA7A022A0AD16A78002AF4 +:10F8A00007D0334B403B5B681B7813402A789A4360 +:10F8B00008D03E70E20708D0084603F04AFD012157 +:10F8C000A86A09E001223A70F4E7A10601D50221F5 +:10F8D00002E0A10702D5002103F04BFD2448403887 +:10F8E00041680622A81C093106F0F2FB002809D164 +:10F8F0001F48297A403840680078C009814201D108 +:10F90000012000E0002078702046FFF72AFF2648FB +:10F91000007800280DD001284AD002285BD00328A7 +:10F9200078D01DA1214806F07EFDA87A022870D06B +:10F93000A3E0A00701D502F0EDFB200702D50120CE +:10F9400002F020FC600702D5002002F01BFCA0069C +:10F95000EBD502F07CFBE8E793E000007C0E002092 +:10F96000408100404085004000F50140008000409B +:10F9700040150040001200400010004000110040FF +:10F980000014004040160040F8F40000630300003B +:10F9900000400004001300407372635C68616C5F98 +:10F9A0007263732E6300000097000020E6040000DD +:10F9B000A00701D504F0BBFF200702D5012004F009 +:10F9C00021FF600702D5002004F01CFFA006ACD583 +:10F9D00004F0A4FEA9E7A007BF27002802DA3C40F4 +:10F9E000F3F702FB200703D53C400120F3F7FBFAB5 +:10F9F000600703D53C400020F3F7F5FAA00602D5D6 +:10FA00003C40F3F7EFFA60068FD5F3F7EEFA8CE798 +:10FA100000E012E0A00701D5F3F7EAFA200702D5CB +:10FA20000120F3F7E4FA600702D50020F3F7DFFACC +:10FA3000A00690D5F3F7DAFA77E7287B00281CD0E8 +:10FA40001F494E6002281FD0012803D01D491E48BF +:10FA500006F0E9FCA96A2869884204D81A481949BD +:10FA6000401C06F0E0FC2969184841600120296B20 +:10FA700080050143296316494860287D012800D08C +:10FA8000F5E6F3F7C5FAF8BD2969A86A4118EBE76E +:10FA900010480021C160016141604161816170478E +:10FAA0000D480021417281720121C17270470A48DC +:10FAB0000121026B89050A430263054841607047D2 +:10FAC0004081004098F90000FB04000040850040A0 +:10FAD00000F50140001100407C0E00202E4800215E +:10FAE00001704170704770B5064614460D460120FE +:10FAF000F1F758FC28490120284B08709E60DC6013 +:10FB00001D6170BDF8B504460120F1F74BFC224998 +:10FB10000120087021494C60214900264E600321D4 +:10FB2000204D0906A960204F002C0AD0012C03D0DB +:10FB30001EA1412006F077FC3E60032000066860AD +:10FB4000F8BD386001200006F9E710B512480178C9 +:10FB500000290ED00321134A0906916010494A6812 +:10FB60000021002A03D0154A1268427000E041705B +:10FB700001700020F1F716FC10BD0748017800293C +:10FB800007D007484068002802D00C480068C0B27F +:10FB900070474078704700009800002000F5004052 +:10FBA00000F1004000F5014000F200407372635C18 +:10FBB00068616C5F63636D2E6300000000F40040B9 +:10FBC0003A4800210170417010218170704770B572 +:10FBD000064614460D460220F1F7E4FB01203349A6 +:10FBE000334A0870E41E14619660556070BD10B50C +:10FBF0000220F1F7D7FB2D49012008702D48002184 +:10FC000001604160816001202B49C005486010BD42 +:10FC100010B5264C2078002811D001202649C005B7 +:10FC2000886000F034F80021002804D001206070C2 +:10FC30002248006801E061701020A070217000204F +:10FC4000F1F7B0FB10BD10B51848017800290BD0B2 +:10FC500018480068002805D000F019F8002800D0E6 +:10FC6000012010BD022010BD407810BD10B50F4816 +:10FC70000178002909D000F00AF8002803D00F48C5 +:10FC80000068C0B210BD102010BD807810BD0948BA +:10FC90000168002905D04168002902D08068002849 +:10FCA00001D0002070470120704700009A0000201A +:10FCB00000F5004000F1004000F5014000F4004074 +:10FCC000FFB593B0044600201D9E049015981C9D1E +:10FCD0001027082806D0E06901F014F8002809D0A0 +:10FCE0003770CCE028880921384328801F980227E4 +:10FCF000017016E0E169012088710521E269C902FD +:10FD00009180E1698872E169F9480881E169002020 +:10FD10008873288820210843288011211F980427F0 +:10FD200001701F980225801C0390307810900A20E3 +:10FD30003070204618301190F6F76BFC00206FE011 +:10FD40001598102809D1022D07D06846828A049997 +:10FD50000398401A8270110AC1706846C08A1699C9 +:10FD6000884203D9E349097A149106E0884204D114 +:10FD70001099002901D0317021E003990870000A20 +:10FD800048701E980088401BC01B83B2FF20C01B18 +:10FD9000984200D203460398149AC0190CA9009205 +:10FDA000019002912020015D6846C08A0022F6F78A +:10FDB000A5FC3070002806D0C0B2832862D0684607 +:10FDC000C08A208345E00F98002805D0C948006804 +:10FDD00000790A2830D33CE06846008EC119C9B2C8 +:10FDE0000491022D0FD01F99049A4978914203D1B2 +:10FDF0006A46128C824209D0BE480491006801789C +:10FE0000032909D027E008461F994870B9480068BF +:10FE10000178042906D008E000790A281BD20120C5 +:10FE20000F9009E06946C98A8180039904980818EF +:10FE300003900498281885B205AA14991198F6F72A +:10FE4000EBFB002805D11E980088401BB84200DB60 +:10FE500076E7022D0ED01598102807D1049A039941 +:10FE60006846808A891A8870000AC8701E980580C2 +:10FE7000002030709F4800680078032802D00020DE +:10FE800017B0F0BD0220FBE7F8B50446406B002632 +:10FE9000134600282BD0491F8DB2618F2A460832A5 +:10FEA000278F8A18BA4221D89A7840185F781102B1 +:10FEB00039430170090A41701A79DF781102394318 +:10FEC0008170090AC1700571290A41712A46591DBC +:10FED000801D06F02AF9608FAD1D401980B2608741 +:10FEE000626B002110180170417000E00926304655 +:10FEF000F8BD30B50B88048F9C4212D9446BE018D2 +:10FF00004478057824022C430BD0447905792402E7 +:10FF10002C436404640CA41D1B190B80106000208A +:10FF200030BD822030BDF7B588B000256846058217 +:10FF300005275DE00398417802780E021643417967 +:10FF4000027908021043000452D40A980123068063 +:10FF500005A802905B02002200970195304609999E +:10FF6000F6F7CCFB04004AD16846018A0183039866 +:10FF70004179027909021143437802781C02144343 +:10FF8000B4421ED10A041CD44B0401215B0C89032A +:10FF900000950B4301970295C17880780A020243CD +:10FFA00020460999F6F7C6F9040011D1039948795A +:10FFB0000A79000210430122D20310430871000A9B +:10FFC000487103AA06A90898FFF793FF0400CED052 +:10FFD0000399009501970295487809780002084333 +:10FFE00069468B8A00220999F6F7A4F9822C06D17A +:10FFF00003AA04A90898FFF77CFF04009AD068467A +:020000040001F9 +:10000000058209E003984179027909021143490404 +:10001000490C0171090A417103AA04A90898FFF764 +:1000200068FF0028EED0822C02D020460BB0F0BD35 +:100030000020FBE730B50446406B002597B0002850 +:100040000DD00B2268460270228F0281606B0391F3 +:10005000019000216846F3F7E2FA6846057065638F +:100060006587258717B030BDF8B50F460546696B23 +:100070000020069E144600290FD0012B0DD13246D8 +:1000800039462846FFF74FFF002806D1002C04D040 +:1000900032463946284600F044FEF8BD0022028070 +:1000A000C262831D0263C3614263428702872030BC +:1000B0000170704710B50022D24302800420FDF782 +:1000C000FEF910BD10B596B00446FFF7B3FF208EC1 +:1000D000002808D0012069460870E06A01900021DC +:1000E0006846F3F79CFA0020E062206316B010BD6A +:1000F00001280000B40E00200146098800200A07EC +:1001000000D501200A06120F01D002221043CA05B1 +:1001100001D5042210438A0501D510221043490558 +:1001200001D5202108437047FFB5A9B00600329DD4 +:10013000359C2B981F46229016D0007841060FD48C +:100140008106890E1E2909D021884A05520E0BD13D +:100150003A88172A08D3FE4A914205D0C10906D031 +:100160008006800E122802D003202DB0F0BD20465C +:100170002C302690F7492A980872002018AA03907C +:1001800010726A46107404AA0A60339A4A6020AA60 +:10019000908090812298007801908106681C1C90C4 +:1001A000701F1D902B98890EC21C2492224620326B +:1001B0001B92083A401C02920B0006F025FA1FFD24 +:1001C000FD11FD1FFD8EFDFCFDFBFDFAFDF9FDFCA3 +:1001D000FDF8FDFDFDF7FDF6FDFDFDFDFDF5FD0066 +:1001E000032E76D102E018A9087219E303202870C3 +:1001F0001C9917220A7000224A70CFE2052EF0D116 +:100200004178027808021043208320A98880249A2C +:100210005178127809021143618300287ED0884208 +:100220007CD800202072E080401E60840298F6F79F +:10023000F0F905202870A81C0190022000901BAA4C +:100240002A990298F6F7E8F9002868D118A8807C66 +:10025000012803D002206870102002E0012068709D +:1002600002202490002225A91CA8F2F746FD0028B0 +:100270002BD120A8007D2499814226D13A8800996B +:10028000801C511A814220DB10A8C18D0198017099 +:10029000090A417001991CA8891C01910099019AD1 +:1002A000891C009125A9F2F728FD20A8007D01995D +:1002B0001BAA091801910099081880B200902A9988 +:1002C0000298F6F7A9F90028CCD00098022826D089 +:1002D00064E272E018A9087261E2072E6DD34178DA +:1002E0000346027808021043208320A98880249ABC +:1002F0005178127809021143618300280ED0884298 +:100300000CD8012020725879197900020843E08046 +:1003100000202073E06900F0F5FC01E098E0A9E01E +:1003200000280ED1E169012088710521E269C90226 +:100330009180E1698872E16987480881E16900205C +:100340008873F01F60842298C01D60620298F6F7DF +:1003500060F907202870681C00900120019000209F +:1003600010A9C8852FE00198012814D0E069807990 +:10037000012830D000981E38417F007F09020143D8 +:1003800000980170090A41700098801C0090019843 +:10039000801C80B2019010A8C18D00980170090ADC +:1003A00041700098801C09E00AE296E13BE1DFE041 +:1003B00004E29BE077E036E016E2AFE000900198BF +:1003C000801C80B201901BAA2A990298F6F724F9A2 +:1003D000002803D007E010A8818DD1E73988019863 +:1003E000081A0428BFDA0198012843D0E06980790F +:1003F000012804D010A8818D5548814206D110A84B +:10040000818D00980170090A417009E000981E383A +:10041000417F027F0802009910430870000A48706B +:100420000198801CBAE1072E01D0152E76D14178B3 +:10043000027808021043208320A98880249A5178EA +:100440001278090211436183002801D0884201D942 +:1004500001203FE7012020720020E0802073052E5C +:100460000AD01D982299E269C0B2491DF2F71FFC1B +:10047000002801D00A202DE70020C04360841AA87C +:10048000019023A9229802970395009100780023F8 +:100490008206920E20462A99FFF712FC0390208BC9 +:1004A00020A988807BE1032EC0D1402220A98A8127 +:1004B0004178027808021043208320A988802A9975 +:1004C0001EAB1C9A02930192009139880022491EAA +:1004D0008BB21B990978F6F711F918A90872002850 +:1004E00033D10B20287010A8008F3FE0052E9DD13E +:1004F000802220A98A814178027808021043208353 +:10050000249984464A78097812020A43628420A911 +:1005100088801248824202D30720DBE6AFE03F200A +:100520008002024362842A981FAB1C9902930191B6 +:1005300000903888401E83B21B9801786046F6F719 +:10054000DDF818A9087200280CD08328AAD107E08A +:10055000FFFF0000B40E002001280000010200008F +:100560000220B8E00D20287010A8808F401C15E1F3 +:1005700001990C22C9095143C91CB14204D90198FF +:1005800040067CD5002009E1427803781002184328 +:1005900020AA9080844622980078400609D505203C +:1005A0006A46107422980078C00905D000201074A3 +:1005B0001DE106206A46107424981F902A9A009024 +:1005C0000023701A029383B21E9001921B9800229E +:1005D00001786046F5F7AEFE18A908720022694658 +:1005E0000A74832801D102200390229800784006E3 +:1005F0000DD52088C00506D520A9208B8988884282 +:1006000001D100206062002018A90872C6E0FF2115 +:10061000013120A88181808820831E9860841F98E2 +:1006200060621320B8E0052E29D3417802780802D1 +:10063000104320A98880218F002902D0FE4A9142D0 +:1006400006D10A216A4611740121C943218702E0BB +:1006500007216A46117422992A9A491D0192009134 +:1006600001221D990023D203029311438BB22499D6 +:100670004A78097812020A431B99097800E0C9E018 +:10068000F5F758FE18A90872002269460A7401227B +:10069000520220A98A81832808D0002809D0218FFE +:1006A000E54881427ED10020208778E08888208339 +:1006B0004DE7606B002808D031462046229AFFF7AC +:1006C000E3FB18A90872002869D12B463A46304648 +:1006D000229900F056FB039061E02298022E4078A8 +:1006E00001907DD1002801D0012879D108206946E8 +:1006F00008740198087521A800901B9800220178C1 +:100700002046019BFFF7B0FC6946002248758A75B8 +:10071000002802D10198012809D0208F002806D096 +:10072000002008740120800220A988810EE004A81E +:100730003399F2F774FF0390002069460874012092 +:10074000800220A988810398022807D0BB4800684E +:100750008079002805D018A908722BE00198208321 +:100760001DE00398002803D0812018A9087240E0FA +:1007700021A800901B98012201782046019BFFF7D9 +:1007800073FC18A9087220463499FFF753FC18A986 +:10079000087A002803D11920287001203880684683 +:1007A000007C00E03CE0002804D004A83399F2F774 +:1007B00036FF0390039800282ED01AE0062012E599 +:1007C0002078000713D5012E11D109216846017444 +:1007D000A188818204203499FCF771FE082100E091 +:1007E00005E020A88181CDE60198400612D50320BE +:1007F000039020A9208889890843208020A988891E +:100800004005400E04D026992B98086026988680D3 +:100810000398AAE40420E6E418A8007A00280ED081 +:100820000120287022980078687020A88088A8701D +:10083000000AE87018A8007A28710520388020A9DD +:100840002088898988432080E2E7FFB50746A1B068 +:1008500000201C903A7801209040794A7C68104032 +:1008600010AA1087744B22885B1C9A4203D0002880 +:1008700004D0100702D5012025B0F0BD249E002031 +:10088000307023980025028810A8028518A80575E5 +:100890006A4B68461972057404A8186020462C300B +:1008A0001B902A985860249E94463878721C052123 +:1008B000039201282DD0022808D003287DD130785A +:1008C000800980011D303070B889A08038780228F6 +:1008D00004D13078800980011B303070F01C1FAAD1 +:1008E00001900292009110A8008D0022C01E83B2D8 +:1008F0002020015DB889F5F701FF0028DED10398BB +:10090000B9890170090A417010A9888FC01C088537 +:1009100028E1787B18AA10753A7B012A02D0022AB6 +:10092000CCD1FCE022887F231B011A4010AB1A8730 +:10093000802A4AD006DC102A10D0202A0ED0402A65 +:100940000AD124E0FF3A013A65D0FF3A013A79D062 +:10095000FF3AFF3A022A76D00525A2E02078C006A9 +:1009600001D5082000E010201C9004206A46107475 +:10097000002090821AA81DAA1EAB03960192029035 +:1009800000933B8A20461C9AFFF79AF984E0228B59 +:100990003B8A9646934268D10A221C92002839D19C +:1009A000039801906046401E1FAA83B20292202045 +:1009B0000091015D0022704600E0BAE0F5F79EFE6E +:1009C000014618A801750B201AE0228B3B8A964637 +:1009D00093424AD10C221C92002862D103980190C4 +:1009E00060461FAA401E0292009183B22020015D42 +:1009F000628C7046F5F782FE014618A801750D203D +:100A0000307010A8818F491C01850421684601744B +:100A1000218B818245E0238B3A8A9C469A4224D1DD +:100A200012221C9200283CD1606A002813D00022B8 +:100A30006B4607C3638C07E0FEFF0000B40E002086 +:100A400009F800000DE04BE02020015D6046F5F75D +:100A500071FC18A9087513203070012010A90885B1 +:100A60001FE0398A228B914201D00425B6E016217D +:100A70001C91002815D11B98818802682046FFF739 +:100A800003FA18A9087500280BD11B983346016892 +:100A900080881AAA00F075F9054602281BD0042D9B +:100AA00019D01B988088002811D06846007C002847 +:100AB00004D004A82A99F2F7B2FD05460120694640 +:100AC00008741B981B990068059000208880002DF1 +:100AD00048D0052D2ED06846007C032878D07DE0D4 +:100AE00018211C91002806D0388A20832046B96836 +:100AF000FFF7A0FAD5E72046183000902020015DCE +:100B0000237E01222046FFF7AFFA18A908750028B6 +:100B1000ECD119203070012010A90885E6E7208863 +:100B200001214902084010A90887FF38FF38022830 +:100B300006D0052510A92088098F884320804DE024 +:100B4000208F9849884290D116201C90386900283F +:100B500005D06063B88A20870020608702E000200B +:100B6000C043208710A8008F7F21090102468A43D5 +:100B70000DD0782300220420B968FCF7FBFB3878FD +:100B8000A07010A92088098F0843208002E02188E6 +:100B9000814321806846007C002805D08248416856 +:100BA00004A8F2F73CFD054618A8007D002815D0E2 +:100BB0001C98707001203070208BB070000AF070AB +:100BC00018A8007D3071052110A8018506E0FFE717 +:100BD0007548416804A8F2F722FD05467248017A7B +:100BE00020884005400E22D11B98808800281ED006 +:100BF000239A0026138810AA1385249A2A9B6F46ED +:100C00004CC71B9A039412681AABFFF78DFA05467E +:100C100002280CD00120694608741B982A990068A4 +:100C2000059004A8F2F7FBFC05461B98868010A8E7 +:100C3000018D2398018028461EE600B597B0042850 +:100C400007D102206A461070019100216846F2F730 +:100C5000E6FC17B000BD10B5534C037800222168A4 +:100C6000012B02D0022B42D126E00B78002B01D0C1 +:100C7000042B03D10A712268032111702168838833 +:100C80000A79D200921D8B5221680A79D20008326B +:100C90008918C2880A80216803890A79D2000A3239 +:100CA0008B52428920680179C9000C314252216877 +:100CB0000879401C08711EE00A7482888A802168C5 +:100CC000C288CA80226801891181226841895181C4 +:100CD000C1682068C1606168F2F7A1FC0146022882 +:100CE00007D02068007C002802D1002903D0812091 +:100CF00010BD832010BD002010BD406B002800D027 +:100D0000012070478178012909D100880521C90295 +:100D1000884202D0491C884201D10020704705203A +:100D20007047F7B586B00024684615460F468481A3 +:100D300005261AE0049841780278090211432980B7 +:100D4000811D019602940091417902790B021343AF +:100D5000C178827809020A43417800780902084381 +:100D60003946F5F7E7FA002806D104AA03A9069840 +:100D7000FFF7BFF80028DDD0822800D1002009B09D +:100D8000F0BD10B51488844201D2052010BD17248F +:100D90001C701080421E581C491C05F0C6F900202A +:100DA00010BD0000FEFF0000B40E002010B540484A +:100DB00004F04DF9002801D00C2010BDFF211131A5 +:100DC0003C4805F011FA3B4901200870002048809A +:100DD000E03188718874887520310871344804F0D6 +:100DE0004EF9002010BD10B5314804F028F9002854 +:100DF00003D031A1312005F016FBFFF7D7FF002803 +:100E000003D02DA1382005F00EFB10BD10B504460F +:100E1000274804F01CF9002801D00C2010BD2549FA +:100E20000878002807D0002008702148216004F0CD +:100E300026F9002010BD1E4804F021F91F2010BD26 +:100E400070B505460C461A4804F001F9002801D097 +:100E50000C2070BD174A5088A84202D11078002893 +:100E600004D0134804F00BF9122070BD1048226022 +:100E700004F005F9002070BD10B504460C4804F0DC +:100E8000E6F8002801D00C2010BD0A48017800299E +:100E900007D00020C0432080054804F0F0F812205D +:100EA00010BD40882080024804F0E9F8002010BD01 +:100EB0009D000020C00E00207372635C6C6C5F6448 +:100EC000622E630010B5282105F08CF910BD70B5B5 +:100ED000054600780A0700090001120F1043287028 +:100EE0000B0005F091FB07050705070509050B0039 +:100EF000062408E00C2406E0222404E00024F2A1E9 +:100F0000572005F090FA68788009800120436870C6 +:100F100070BD00780007000F704710B50622C01C96 +:100F200005F003F910BD10B50622093005F0FDF8F3 +:100F300010BD0278BF23C9071A40490E0A43027048 +:100F4000704702785206520EC9010A430270704778 +:100F500070B515460E4604461F2A03D9DAA1A8200B +:100F600005F061FA20462A463146093005F0DDF8E1 +:100F70006078AD1D80098001A906890E0843607064 +:100F800070BD70B515460E4604461F2A03D9CEA182 +:100F9000CC2005F048FA20462A463146093005F0B3 +:100FA000C4F86078AD1D80098001A906890E084348 +:100FB000607070BD70B501780907090F03292ED044 +:100FC000052931D1411C827E0C46437E1102194312 +:100FD000037FC27D1D02037EC67E1B021343827DFA +:100FE000407835438006800E22281DD106291BD368 +:100FF0001920C001814217D8FF26F436B54213D814 +:10100000002A11D0082A0FD88A420DD28B420BD861 +:10101000617F227F09021143814207D904E04078B1 +:101020008006800E0C2801D0002070BD012070BD0C +:1010300000210A464254491C2229FBDB704710B5A7 +:1010400002788B07920892009B0F1A430270427835 +:10105000520952014270012908D0022906D0032901 +:1010600005D0FF2098A1EE3005F0DDF910BD01217B +:101070000A43427010BD10B502788B0792089200A7 +:101080009B0F1A43027042785209520142700129A3 +:1010900007D0022905D0032904D08BA18E4805F082 +:1010A000C2F910BD01210A43427010BD00788007CB +:1010B000800F70470278EF23C9071A40C90E0A4310 +:1010C0000270704770B50546C1700B0005F09CFAC0 +:1010D0000E080A0C0E1012120C14141212160C1810 +:1010E0000C2413E0082411E002240FE017240DE083 +:1010F0000D240BE0012409E0092407E0062405E0A3 +:101100007548002470A1A03005F08DF96878400979 +:1011100040012043687070BDC0787047017AC27981 +:10112000080210437047817A427A080210437047E0 +:10113000017BC27A08021043704781794279080224 +:101140001043704700797047817B427B080210434F +:10115000704770B5017AC37909021943431C857A37 +:101160001C46467A2B023343657926792C02344398 +:10117000C21C5A4E00798D1FB54214D8FF25F43594 +:10118000AB4210D800280ED008280CD888420AD2CA +:101190008C4208D8507A117A00020843B11D884267 +:1011A00001D8012070BD002070BD0B4610B5011D97 +:1011B0000522184604F0B9FF10BD817A427A080270 +:1011C0001043704701717047007970470B4610B5A6 +:1011D000011D0822184604F0A8FF10BD027B0A700A +:1011E000407B487070470B46014610B508220E310F +:1011F000184604F09AFF10BD0B46014610B50422B4 +:101200001631184604F091FF10BD10B50822001DDC +:1012100004F08BFF10BD10B504220C3004F085FFE4 +:1012200010BD017170474171090A81717047C17128 +:10123000090A017270470079704781794279080282 +:1012400010437047017AC279080210437047017158 +:101250007047017170470B4610B5011D08221846F2 +:1012600004F063FF10BD10B50822001D04F05DFFFF +:1012700010BD70B515460E4604461B2A03D912A1AF +:10128000174805F0D0F82A463146E01C04F04DFF1F +:101290006078E90640094001C90E0843607070BDDE +:1012A00070B5054640780E46C406E40E1B2C04D9E2 +:1012B0000B4805A10C3005F0B6F82246E91C304673 +:1012C00004F033FF204670BD7372635C756C5F7011 +:1012D00064752E6300000000070200007A0C000015 +:1012E000F7030000C1074008C207C90FD20F511809 +:1012F0004008C207D20F51184008C207D20F511838 +:101300004008C207D20F51184208D007C00F40183A +:101310005208D107C90F0918500840187047002219 +:1013200002808271C271C2720273427382738270D0 +:10133000C270027142714276828303464284203336 +:101340009A7102859A72C2750276C2730274DA7259 +:101350001A739A7319750284FF21603081709A752F +:10136000704770B504460020A083208C1E46484379 +:101370001546114604F061FF2084F000294604F070 +:101380004EFF401C80B20146192269439202E0835D +:10139000914201DD401EE0837D202946000204F0D9 +:1013A0003EFF401CA08470BD70B50546087B0E460C +:1013B000C006C00E08730020A87504463019007AD4 +:1013C000FFF790FF29194874A97D641C0818E4B23E +:1013D000A875052CF2D3C0B2252803D979A18A209B +:1013E00005F021F870BDF8B5044630302646274692 +:1013F0002546C036A03780350090032909D0002942 +:101400001AD0012924D0022902D1A11CFFF7CCFF58 +:10141000F8BD1146FFF783FF002028836883A88367 +:10142000E883288468847871E88538732621085514 +:10143000A08430703071F8BD0020E885B871A188B3 +:1014400023890A460098FFF78CFFA11C0098DDE76E +:101450000020E885B38A328AA1880098FFF781FFCF +:10146000F8BD70B5867D0D460446002E01D0252EB0 +:1014700001D9122070BD002A18D0287EE17D50438A +:101480000818252104F0CBFE0846E1754207520FEB +:10149000C908504B69189A5C097A8A4368D031466A +:1014A00004F0BDFE491CCAB2002007E0002070BD58 +:1014B000002803D02118097C511ACAB22118497C8E +:1014C00091423AD32918097AC943CB07DB17D21ABC +:1014D000521E1206120E35D08B07DB17D21A521E7F +:1014E0001206120E30D04B07DB17D21A521E12060C +:1014F000120E2CD00B07DB17D21A521E1206120E38 +:1015000028D0CB06DB17D21A521E1206120E24D098 +:101510008B06DB17D21A521E1206120E20D04B0673 +:10152000DB17D21A521E1206120E1CD00906C9175A +:10153000511A491E0A06120E18D0401C0528B7DBA6 +:101540001F2070BDC00013E0C000401C10E0C000B0 +:10155000801C0DE0C000C01C0AE0C000001D07E0B8 +:10156000C000401D04E0C000801D01E0C000C01D9F +:1015700020769BE738B505460C466846FEF738F8F6 +:1015800000281ED0694600200856207209216156A5 +:101590000022411A00D5494220356B798B420FDC7D +:1015A000FF2B0DD0A17A491CC9B2A172AB79994227 +:1015B00002D8617A7F2903D160720020A0720122D3 +:1015C000104638BD7372635C6C6C5F7574696C2E09 +:1015D000630000007667010010B5040004D0FF200E +:1015E000FAA1AB3004F01FFFFB4821464143FB4802 +:1015F000FF230918FF330022581C5A544254C81DB7 +:10160000FF30FA3002704270F448001FC378A342E2 +:1016100002D18270FF23C370EF48EF4BC01E081841 +:101620009B1EC91802700A7010BD70B5EB480026E9 +:10163000001F8670FF24C47035462846FFF7CCFF94 +:101640006D1C2D062D0EF8D00020E4490B229201CE +:10165000E14B43435B189B181E74401C0006000EB0 +:10166000F6D0DF48FFF7E4FC0021DD48FFF722FD5C +:101670000121DB48FFF7E3FCDA4804704470847012 +:10168000C4700471447170BDCFE71B20704730B542 +:101690000021D24A0B239B01CF4C4C43A418E418E1 +:1016A000247C002C05D0491C0906090EF4D000202A +:1016B00030BDC94C01254C43A218D21815740170D5 +:1016C000284630BD10B5044600F0D0F900280CD0F3 +:1016D0002046FFF781FFC0490B224C43BF49002041 +:1016E0006118920189180874012010BD10B50446D4 +:1016F00000F0BCF9002802D0BA484471012010BDA6 +:10170000034610B5B748B44940794843B349421835 +:101710001046FF30E130C17F807F04F0D5FF10BD5F +:1017200010B5B048AC4940790F224843AB49401846 +:10173000A949D239095CFF30FF3004F09FFF10BD8A +:1017400010B5044600F092F9002802D0A5480471B3 +:10175000012010BD034610B5A2489F4900794843B7 +:101760009E4942181046FF30E130C17F807F04F06F +:1017700098FF10BD70B59B4C97492079974D484311 +:101780004019C11DFF31F931FF30E130807F0F2258 +:1017900004F064FF002813D020798F494843401992 +:1017A000FF30FF3002300178491C01700178407829 +:1017B000814204D1884885A1773804F034FE0120A5 +:1017C00070BD884884490079484384494018FF30F7 +:1017D000E130C17F807F814201D10120704700202C +:1017E000704770B57F487C49007948437B49401871 +:1017F000FF30E130867FC57F0F242946304604F054 +:1018000026FF002801D0204670BD70066906400EF4 +:10181000490E884201D3401A01E0081A201AC0B2CA +:1018200070BD0F20704770B50C46054600F01EF9DC +:1018300000280ED0002020706748454367482818CC +:10184000FF30FF300230017842788A1A22704170EE +:10185000012070BD70B50C46054600F007F9002860 +:101860000BD05D4845435D482818FF30FF300230FB +:1018700001784078081A2070012070BD5849016035 +:10188000704710B5044600F0F1F8002802D0554822 +:101890000470012010BD5149091FCA78FF2A02D0E7 +:1018A0000021016007E08A784C492439012A02D0DE +:1018B000016001207047002070474848801E017871 +:1018C000012908D001210170464801784348001FD2 +:1018D000C170012070470020704710B5044600F029 +:1018E000C5F8002802D03F484470012010BD3B4994 +:1018F0003C4B091FCA785B789A4206D18A78203916 +:10190000002A02D001600120704700207047334850 +:10191000344A001FC1785278914209D1FF21C17029 +:10192000801C0178002903D000210170012070473C +:101930000020704729482B4A001FC17852789142F5 +:1019400004D18078002801D0002070470120704722 +:1019500010B5044600F08AF8002802D02148C4706F +:10196000012010BD034610B51E481B49C0784843EE +:101970001A494018C21DFF320B21FC328901401860 +:10198000C17B807B04F0A0FE10BD10B51548124944 +:10199000C0784843114940180B2189014118C97B7F +:1019A0000D4AD21E8018062204F068FE10BD0D48B4 +:1019B0000949C0784843094941180B20800108189B +:1019C000C17B807B81420FD1012070477372635CC1 +:1019D000646D5F712E630000D1020000F40F0020DF +:1019E000C51200209E0000200020EEE710B504463E +:1019F00000F03CF8002802D021488470012010BD7E +:101A0000034610B51E481F49807848431E494018B8 +:101A1000C21DFF320B21FC3289014018C17B807B43 +:101A200004F03FFE10BD10B51548164980780B2212 +:101A300048431549920140181249891E41188018DF +:101A4000807B062204F00AFE10BD0D480D49807807 +:101A500048430D4941180B2080010818C17B807B49 +:101A6000814201D10120B0E70020AEE7002805D176 +:101A70000648007C002801D00120A6E70020A4E74A +:101A80009E000020D1020000F40F0020B4120020BC +:101A9000F8B5FF4E0446B079002500280AD0002989 +:101AA0002DD1657010202070F079A070307AE07030 +:101AB000B57124E0F64F203F387A012804D0707ABF +:101AC000012810D00020F8BD002918D1657013201E +:101AD000EF4920701C221639A01C04F026FB0120BF +:101AE000A0713D720BE0002909D165701420E8490E +:101AF000207008220A31A01C04F017FB7572012027 +:101B0000F8BDF8B5E3480178002902D00C2630462C +:101B1000F8BD0026DE4D3446403D2E756E75EE75DF +:101B20002E76AE75294620396E730F464E734037B8 +:101B30007E717F218170687E002804D0FDF73DFD15 +:101B4000FEF766F86C763C72D14884711430FFF76A +:101B5000B9F9CF483C30FFF7B5F9D8E710B5CD4B10 +:101B600000221A70CA4B203B1A711A46603A11665D +:101B7000D065FFF7C6FF002804D0FF20C6A187303C +:101B800004F051FC10BDC2484038007D7047C04988 +:101B900010B54039C87B897B42078307D20FDB0F22 +:101BA000D218C007C00F101840000B0004F02CFD25 +:101BB000050B060B04080F00BB4906E0BB4810BD2F +:101BC000B949083101E0B8490839085A10BDFF2069 +:101BD000B1A1A73004F027FC002010BDAC48B449E7 +:101BE0004038008A48437047F8B5A94C0646407B08 +:101BF000403CE07337791346A773012F26D0308815 +:101C00002082A348B27B203882710546603D29704E +:101C100006221946681C04F088FAB0796873062217 +:101C2000F11DE81D04F081FA607B0126002800D038 +:101C3000667597486038407B002800D0A6753B0049 +:101C400004F0E2FC0506082549084B000020D7E710 +:101C500000211DE08E4801211430FFF738F98C482F +:101C6000E91D1430FFF75FF9687B002807D00128D1 +:101C700007D0FF2088A1EE3004F0D5FB0CE0002156 +:101C800000E0012182481430FFF75BF904E00621EF +:101C90007F481430FFF71BF90020E07520767C4860 +:101CA000691C1430FFF739F9794829781430FFF7A7 +:101CB00040F9774804213C30FFF709F97448691C62 +:101CC0003C30FFF72AF9724829783C30FFF731F9A8 +:101CD00026750020F8BD0221DAE7FF206EA1F8305A +:101CE000CAE770B56A4C0125403C0346257620467C +:101CF0002030007A002801D03A2070BD64480022CC +:101D0000803806789E4206D1E2750622401C04F017 +:101D10000CFAE57500E02276002070BD70B504462F +:101D20005B4D0020403DA87528462246323804F01D +:101D3000FCF92846203844730120A87570BD544929 +:101D400020390871704710B5514C0022403C627533 +:101D5000607302462046123804F0E7F901206075EE +:101D600010BD4B49203948717047F8B500F0A4FB0D +:101D7000474C0025403C607E002804D0FDF71DFC48 +:101D8000FDF746FF6576434F3D70FDF793FBA07B63 +:101D9000012804D00021084601F0A6FAF8BD002170 +:101DA000022001F0A1FA3A4C203C207A002809D008 +:101DB000374881790029F1D11321C17105720121C0 +:101DC0008171F8BD78780028FBD0314E0622803E24 +:101DD000707BE0733078A0753046F11D703004F0F0 +:101DE000A4F930460622711C773004F09EF93C209D +:101DF000A072012020727D70F8BD10B5244C403CCB +:101E0000E17BA07CCA0701D0C2070BD08A070FD59F +:101E100082070DD42620FDF777FAA07C0221084323 +:101E2000A07410BD2520FDF76FFAA07C0121F6E714 +:101E30004907F6D54007F4D42720FDF765FAA07CC2 +:101E40000421ECE770B5134E3078002872D1104CA5 +:101E5000403C207D00286DD0FDF71FFB0025A574B8 +:101E6000E57475702846FDF715FB0020FDF78CF929 +:101E70000D480D38FDF73FFA0B481038FDF7F7FA1B +:101E8000FDF76CFBFFF7B9FFFDF7FFFA012111E049 +:101E900068130020A40000207372635C6C6C5F61A7 +:101EA00064762E63000000008E6701009A8913009B +:101EB000710200000020FDF743FA0F210520FDF715 +:101EC000C1F92646403E3178701CFDF7ADF9A07B84 +:101ED00001280CD004280AD0607D002807D02146B4 +:101EE00012390846627B6630FFF732F86575A07DCF +:101EF000002807D0FE480146427B12399C30FFF78C +:101F000040F8A575306E0178002903D00178001DD6 +:101F1000FDF7C8F9F06D0178002906D0F44A401C9D +:101F2000C732FDF754FE01206076FDF7C3FA0020AA +:101F300070BDFFE70C20FBE7EE494860704770B5C5 +:101F4000050001D0FFF759FFE94C2034E07C002860 +:101F50000AD0A07B012804D19920E749C00004F0F1 +:101F600062FAFFF702FFE3E7002D0DD00221002007 +:101F7000FDF7E6F9DE4840300079032801D001285A +:101F800002D10220FDF73BFCE07D002600280DD0A9 +:101F9000D74D203D2846691C9430FEF7BEFF2846E9 +:101FA000691CBC30FEF7B9FFE6752676D048743060 +:101FB000FDF786FAA07B030004F026FB0504040469 +:101FC0000D04090001210846FDF79FFB03E0CA4903 +:101FD000CA4804F028FAE17BA07C81430120002953 +:101FE00003D1A17B012903D0E074C24908709FE7A7 +:101FF000A674FAE710B5FDF750FABE48007800283D +:1020000018D1BB482030007D002813D00020FFF7F6 +:1020100096FFB74840300079002809D001280FD03A +:10202000022805D003280BD0B349B54804F0FBF9CA +:10203000002010BD00F040FAFDF73CFA0C2010BD66 +:10204000F0F7E6FFF4E7AB49012048707047F8B5B8 +:10205000002400F0E0FF002824D0FF202D30FDF701 +:102060006CF9A44D2878A24F403701281DD00228D2 +:1020700001D0032834D0A2489F496B3004F0D3F933 +:10208000287800280DD0387900280AD0012808D0F7 +:10209000022838D0032836D099489749803004F078 +:1020A000C2F9F8BDFFF761FEF8BD914E2036B07B56 +:1020B000032815D0707E002803D0FDF798FDFDF7AA +:1020C00074FA8B48C430FDF7FBF9B07B012812D0BD +:1020D000042810D0B879012806D0032804D004E0E1 +:1020E0000120FFF72CFFCBE7102421460E200143EF +:1020F0000020FDF70AFB7879012801D1FDF76FFA7E +:1021000002202870BCE728780228CDD10120FDF7F5 +:1021100076FBF8BD70B5764840304079012801D192 +:1021200000F0D4F9724C2034607E002803D0FDF713 +:1021300044FAFDF76DFD00F06EFF00280CD06D4DE8 +:102140002878022804D06E486B49A33004F06BF95C +:10215000A07B012803D006E0FFF707FEE8E6992000 +:102160008000FDF7EAF80120FFF7E9FE2878002853 +:10217000F4D028780128F1D039205F49000104F01B +:1021800052F9D5E6F0B5074689B000200690FDF774 +:10219000AEF800900020019056480078022804D044 +:1021A00057485549F03004F03EF9514D40356879B3 +:1021B000012801D100F08AF94D48C430FEF7A9FE8C +:1021C0004B4E04462036002F70D03046A430FEF728 +:1021D000F1FE0028F8D0FDF731F80028F4D0707E29 +:1021E00000280AD005277F1EFFB2FDF72CFD02282C +:1021F0000FD0012800D0002001903D492046C43175 +:102200000C46643C030004F0FFF906A4A4A40CA44B +:1022100056A4002FE7D177203AA1C00004F003F9BB +:10222000E9E7B07B012841D004283FD0019A00980B +:10223000104304D1A879002801D0022836D168794A +:1022400001281DD1607A00281AD101206072087817 +:1022500006224006C00FA0722548C91C6B3003F04F +:1022600064FF244C224FA07871377F2804D1A92025 +:1022700024A1C00004F0D7F8A07838707F20A070A7 +:102280001B489C30FDF71CF91A480321017028797E +:10229000002860D001280AD002285CD0032806D08C +:1022A000164818A1E03804F0BEF854E051E00120CF +:1022B000FDF7A5FA4FE00E480F462038C978C079DF +:1022C000814230D10A4839792038027A91422AD1A4 +:1022D0007979427A914226D1B979827A914222D192 +:1022E000F979C27A91421ED1397A027B914211E08A +:1022F00008130020A4000020981E0100F60400002E +:10230000DE0200007372635C6C6C5F6164762E6346 +:102310000000000007D13978407B4906C90F81428F +:1023200001D1012100E00021B07B012801D0042867 +:1023300001D100290AD100280BD101990098084346 +:1023400004D1A879002801D0012802D1307E0028CC +:102350001FD001200690707E002803D0FDF72DF9D4 +:10236000FDF756FC0698002802D00120FFF7E7FD94 +:102370005D48017800290AD00178012907D000784A +:10238000032804D095205949C00004F04CF809B046 +:10239000F0BD55480422406855490F3003F0C5FE92 +:1023A000387806224006C10F4F4840680177F91C73 +:1023B0001D3003F0BAFE4C484D4940680322091D08 +:1023C000133003F0B2FE4848494A4068B97D817530 +:1023D0000F3A117ED37D09021943018311468B7E8A +:1023E0004F7E1B023B438380137FD77E1A023A4302 +:1023F000C2808A7F4B7F1102194301813C4905222B +:1024000010310A3003F091FE3948374A1130017912 +:102410005768C906C90EB97600794009F876287A56 +:10242000002809D0A07900283AD11320E0710020BB +:1024300020720120A07133E00020A8727888B08556 +:10244000387FE8732A48394606221D31833803F065 +:102450006CFE27490622F3390878A87508467730BC +:10246000491C03F062FEB888F087F888208038891C +:102470006080F87E20710198002860790BD00121DE +:1024800008436071FDF7F2FB61794000C907C90F8D +:102490000143617102E04008400060710120287230 +:1024A000114C0020207000F007F8FDF703F8012020 +:1024B000616800F019FF4EE710B5FDF76AF8FDF707 +:1024C0005DF8FCF7B5FFFCF7DAFF10BD064810B564 +:1024D000801CFDF78DF8002802D103497F20887009 +:1024E000FDF774F810BD0000A400002004230100D3 +:1024F000DB1300208107C90E002808DA0007000F4F +:1025000008388008F74A80008018C06904E0800815 +:10251000F54A800080180068C8400006800F7047A8 +:1025200010B500F03BFF10BD70B5F04C0546626879 +:10253000002908D0002A04D0FF20EDA10C3003F0C0 +:1025400072FF656070BD002A04D1FF20E8A112303F +:1025500003F069FF0020606070BDE948C07E7047ED +:10256000E7482830C07E704738B5E04C20680168E5 +:102570004978012925D001216846FAF7C9FC684647 +:102580000078E049000203F04AFE2068426AC06811 +:1025900012685118FBF7ADFC2168C860D84A206862 +:1025A00028320321904218D0028B002A15D0012234 +:1025B0004272017200210171021D017F00F0FBFED9 +:1025C00038BD7D21C068C900FBF793FC2168C86055 +:1025D000FFF7DDFA21680861E0E7028B521C0283F5 +:1025E0004172E6E7FFB5C64E85B0706A346805688B +:1025F00060680190306A0390298E0798401A80B273 +:1026000002900898002804D02746383720464830E2 +:1026100002E0371D2846A830009003203871059845 +:10262000002820D001287DD002285ED003287AD04F +:10263000AFA1B54803F0F7FE0898002807D0387915 +:10264000032804D0B048AAA1093003F0ECFEA16A27 +:102650007069FBF74EFCB860616A206A88427DD9D8 +:10266000009801601FE1306A002804D1A648A0A1AB +:102670007A3803F0D8FEA449288B373948434018EC +:10268000069900F0A6FEA0619F49A8883739484303 +:10269000069900F09EFEE061316A9B48891CA162A8 +:1026A0002A8B37384243A069974B121AE63BD2185F +:1026B0005118A162944BAA7D373B5A4340008018C1 +:1026C000FF30193020626062306A081AED21FF384D +:1026D000C90015388842AFD28C49884204D28A4852 +:1026E00083A15D3803F09FFEB6E0874A288B373A16 +:1026F000E16850430818069900F06BFEA06182491A +:10270000A88837394843069900F063FEE061306AD3 +:10271000002804D17C4876A1553803F084FEAE2011 +:10272000405B01E02CE05AE00028288B784AE16801 +:102730001DD050430818A169401AA0622169A06801 +:10274000734A4843A1694018A97D4000514340188D +:10275000FF3017302062A888504300E0A1E0E16913 +:10276000411A6F20C000081A6062A06A34E050432A +:102770000818A169401A3168D63849684018DCE762 +:10278000284680300190C08D002802D0306A002891 +:1027900004D15F4856A1401F03F045FEA8885C495C +:1027A000E3694843C01AA06201999C46CA8D216919 +:1027B000A368521A4B43A169591863465343C91879 +:1027C000AA7D534B49005A438918FF3117312162C2 +:1027D0006F21C900411A6162316A401A35E00898D8 +:1027E000002803D03420005D002878D1A88848490B +:1027F0004843E169401A02994843A0622846803064 +:102800000490C08D0028019829D0002804D03E48AB +:1028100037A1163803F007FE04983D4AC18D02988F +:102820000818E16948434000FF3017302062A8884B +:102830005043411A6F20C000081A606200F0AEFDDC +:1028400000281CD0A16A0398081AED21FF38C9009E +:102850005538884200D3EFE601203871ECE60028B5 +:1028600002D00398002804D1294821A11A3003F08E +:10287000DAFD0198A16AD6380818A062CCE7FBF708 +:102880009EF8726901461046FCF7BFFAA16A081A61 +:10289000ED21FF38C90050388842DCD2012009B050 +:1028A000F0BD0099086000981A4900688035081842 +:1028B000F860298B0798081A00B2002804DD0598F3 +:1028C000022801D0032000E00120787108983870B8 +:1028D0000898002820D03420005D00281CD0022059 +:1028E000DDE7000000ED00E000E400E0B4000020BF +:1028F0007372635C6C6C5F6C6D2E73302E630000C2 +:10290000F413002010270000190500002902000020 +:10291000E20400004B1700000898012148402034D1 +:102920006075317F3A46304600F045FD0020B6E73D +:1029300010B5FE4900280A68516A096807D0126874 +:102940008988FB4BD2695943891A03F068FC10BD92 +:10295000F8B5F64F38680468416A26460D68203697 +:10296000717D00290AD0618E2A8E914206D1407A6B +:10297000012803D1EF49F04803F055FDFBF71FF89C +:10298000014638684069FCF740FAFFF7D1FF2A8E0C +:10299000618E1318994202DB491C618602E0401CDB +:1029A00010186086B07D002806D19C21608E495B9E +:1029B000884201D1401C6086DC480168088B0328EE +:1029C00002D2401C088302E0618E982041532846C1 +:1029D00040300646C1898089081A298E401E401859 +:1029E00087B218E0D148EB7E00685B00406A00794E +:1029F0004100D248415AC05A401881B2207D00237C +:102A0000FFF7F0FD00280FD001280ED0CA48C949B1 +:102A10003A3003F008FD628EB81A00B20028E1DAFD +:102A20000820B07200F010FEF8BD608E401C608679 +:102A3000F1E770B5BD4D002168680162C27E1300E8 +:102A400003F0E2FD045656034A56426A14680268CF +:102A500011700268516000682030407D002808D164 +:102A6000FAF7ADFF69680968096CFCF7CEF9002830 +:102A700018DC6868228E0168498E914206D1214691 +:102A800080318B8B9A1ACA83238605E0891A9E228D +:102A900011530168498E21860268C1681164C168BA +:102AA000416111E068680168098E228E8B1A224606 +:102AB0008032D3830168098E218601680B6CC36064 +:102AC0000B6C4361886C9062204601F0D8FC0028B2 +:102AD0000DD098499A4808E0C1684161FFF7B2F902 +:102AE000002804D096489349801D03F09CFC70BDDB +:102AF000934890490D30F8E710B58C4A0B001268E6 +:102B000003F082FD0906090F1F0C2E2E082B2E0044 +:102B1000FFF78FFF10BD00F068FC10BDFCF772FEE0 +:102B200010BDD07E022806D0D07E032806D0FF201C +:102B30008049A3300EE0FFF70BFF10BDFFF714FD37 +:102B400010BDD07E0228F6D0D07E0328F6D0FF201C +:102B50007849AE3003F067FCF0E7FAF715FF10BDD7 +:102B6000FF207449BC3003F05EFC10BDF3B581B0AA +:102B70000E4601276D4D734C0B0003F045FD090611 +:102B80002F39392F40403939400001216D48FFF776 +:102B9000CBFC31460198FFF7AFFFE07E022826D13B +:102BA00068680568406A0668FAF7E7FEB188604A17 +:102BB0005143EA69891AD639E962B72802D26248D4 +:102BC000081803E0081A6049B7314018E8625F4806 +:102BD000E96A814200D80846E86205E00198FFF7FB +:102BE0008BFFE07E022802D1206820300775FEBDF1 +:102BF0002C600198FFF780FF00202860FEBDFF20B9 +:102C00004C495C3003F00FFCFEBD70B50C46064627 +:102C10000B0003F0F9FC09060D10100D1A1A101024 +:102C20001A00484801212830FFF77EFC2146304633 +:102C3000FFF762FF70BD43483C4D283028603046A6 +:102C4000FFF75AFF0020286070BDFF20394982300D +:102C500003F0E9FB70BDF0B5344C0020216885B06D +:102C600003258D76CA7E0746032A03D0C97E002934 +:102C700029D029E0087F002803D12E49344803F0E9 +:102C8000D2FB2068067F684605714571FAF797FE0A +:102C90000290FF20F53003900121684601706946DB +:102CA0003046FBF70CFB00E020BF2068007FFCF7FC +:102CB00038F90028F8D02068007FFAF765FE206810 +:102CC000077700F072FB012021688F7605B0F0BD18 +:102CD00016490A68907600E020BF0A68D07E002876 +:102CE00003D0D07E937E9842F6D0D07E002803D0C9 +:102CF00000200021917670470120FAE770B5114954 +:102D00000024CA7E094D032A03D02831CA7E032A33 +:102D10002ED12960002827D0012821D00C48054950 +:102D2000973003F080FB0020296813E0B4000020F6 +:102D3000E2040000F0280100F70500009E67010092 +:102D4000A1030000F4130020C4F8FFFF38120000B4 +:102D500072020000086048622860002C08D070BD34 +:102D60000320FFF7B5FF01E0FFF775FF0446DAE740 +:102D70000C2070BDF8B5F94F04461F25E67E3300E0 +:102D800003F042FC042920031B20F548844204D0B0 +:102D9000FF20F449FC3003F046FB02203C60FFF7C3 +:102DA00097FF002805D03968002008604862386025 +:102DB00011E00C25002038600AE00120FFF79EFF9B +:102DC000054603E0E749E84803F02DFB002D02D05B +:102DD000E07EB042D2D1E07E002804D0E248E14952 +:102DE000801D03F020FBF8BD10B5DD48FFF7C2FFE2 +:102DF000DB482830FFF7BEFFD94900205031087565 +:102E0000D649C91F4870D64948610A4628325061E0 +:102E100088769076D1494860086010BD70B5044648 +:102E20000120FFF767FBC5B20B20FFF763FBC0B2C1 +:102E3000854204D0FF20CB49C63003F0F4FA0120CC +:102E4000FFF758FBC5B21820FFF754FBC0B285420C +:102E500004D0FF20C349C73003F0E5FA0420C04383 +:102E6000FFF748FBC5B21920FFF744FBC0B285420B +:102E700004D0FF20BB49C83003F0D5FAB748B849A1 +:102E8000083804700020C87688760A462832D07642 +:102E90009076B24B012408331C711860486250626E +:102EA00008601060FFF7A0FF70BDAC4908310871E1 +:102EB0007047FEB5AA49CA7E08462830A74C002AAA +:102EC00002D1C27E002A03D0C97E022903D005E0C8 +:102ED000A648216006E0C17E002901D00C20FEBD7D +:102EE0002060A348FAF7FCFC216808779B4920681A +:102EF000C91F0160C91C4162007F002804D1AD20B8 +:102F00009849800003F08FFAFAF737FD9949884213 +:102F100000D20846FF30C83086B220680325C57647 +:102F2000FEF735FE21680861FEF758FE00270028ED +:102F300027D0FEF753FE21684A6A10600968012015 +:102F4000087001466846F9F7E3FF684600788A4949 +:102F5000000203F064F90191FAF731FD019971184B +:102F6000FAF7C7FF2168C8602068057245720771CB +:102F7000021D017F00F01FFA2068078300202760F0 +:102F8000FEBDFAF71CFD3146FAF7B3FF2168C860B1 +:102F900008680770096801204870E5E77047F8B5D0 +:102FA0006F4EF17E002904D131462831C97E0029B7 +:102FB00001D00C20F8BD0221F176694C674F5034E6 +:102FC0000837776234600025386025753979C07E0E +:102FD0004A006A4940008A5A085A2B46101881B2A2 +:102FE0002A462846FFF7FEFA002804D0CF205D4984 +:102FF000800003F018FA25610120A5602075658620 +:1030000025865748703085753968088E401E0886B9 +:1030100035830020F8BD10B5504801244068817EFA +:1030200003290CD001684978002906D0006A544968 +:10303000884202D90024FFF706F8204610BD00247C +:10304000FBE74648406802681178491C1170016A24 +:103050000068C26A914204D8007D012801D0012095 +:1030600070470020704700207047F8B53B4C3C4843 +:103070002060416A00680D68002634210E54A621A4 +:10308000495D00294BD1007D032848D1FAF797FC10 +:10309000014620684069FBF7B8FE00283FDDFFF7D6 +:1030A00047FC298E401C4118206802681186006880 +:1030B000018E9C22525B511A09B200292FDD012199 +:1030C0002030817528464030C1898089081A298EB0 +:1030D000401E401887B21BE0496A09794A00274917 +:1030E0008B5A028E007D9446EA7E5200895AC91896 +:1030F00089B201236246FFF775FA00280FD0012834 +:103100000FD002280BD01B481649193803F08BF951 +:1031100021680868028EBA1A12B2002ADCDA266028 +:10312000F8BD20680068018E491C0186F0E7F8B5FB +:103130000A4D00266A680128516A0C6853D1087943 +:103140000E4940000B5A1068077D032F1AD0027DEC +:10315000022A24D0007D012834D044E0B4000020AD +:10316000F4130020F0280100070200006D2B01007D +:103170000B2C0100F6050000102700009E670100DF +:10318000D98213000661106886609C20025BE07E95 +:103190004000085AC01881B2002303201BE02246D9 +:1031A0008032D78D0761E07E928B4000085AC018AC +:1031B00081B200230220FFF715FA6A680121126824 +:1031C00011750AE09C20025BE07E4000085AC0189E +:1031D00081B200230120FFF705FA002803D09C49A3 +:1031E0009C4803F020F9FAF735FB9B480078EFF78D +:1031F0006FF8686806830268218E51860068203067 +:103200008675F8BD38B5944C0021083460680D46C9 +:1032100000684278002A01D045701FE0007800283D +:1032200009D001216846F9F773FE684600788B499A +:10323000000202F0F4FF6068426AC0681268511828 +:10324000FAF757FE01466068C160057103214172BB +:10325000021D017F00F0AFF860680583FAF7FAFA03 +:103260007D480078EFF734F838BD7B4A10B5014649 +:10327000083250680B0003F0C7F9060D1504081753 +:103280000C31012100F0D1F807E00021106800F0B6 +:10329000CCF810BD0120FFF74AFF00210846FFF7D8 +:1032A00043F910BD032116E0416A02680968D36939 +:1032B00093608A886A4B5A430368DA600A46C032D0 +:1032C000D3890B83137B8B75138A8B80538ACB80B6 +:1032D000928A0A8102210068017510BD5D485C492F +:1032E000913003F0A0F810BD70B500280BD05A4CF7 +:1032F000083401280ED002281ED056485449B43054 +:1033000003F091F870BDFFF77DFF00210846FFF73D +:103310000BF970BD6068002501684D7000F045F83C +:103320000320F5F7B8FEFAF795FA4B486560007888 +:10333000EEF7CEFF656070BDFFF764FF606800F0D8 +:1033400034F800210846FFF7EFF80420F5F7A3FE54 +:1033500070BD414908314968CA7E022A08D10A680D +:103360001378002B04D150600968CA6A1018C8622B +:103370007047394A10B50832526800290CD001292B +:1033800007D0022907D033483149D93003F04BF830 +:1033900010BD801E00E0401F106210BD2E48083096 +:1033A0004068002800D0012070470021C176817656 +:1033B00001604162704710B50B46C17E847EA14218 +:1033C00004D011461846FAF77AFF10BDFFF7EDFF5B +:1033D00010BD024610B50020002905D00846504314 +:1033E000204902F01CFF401C10BD1B4810B50830DE +:1033F0004068C07E030003F007F9041515030B15A0 +:1034000001F05EF900280CD00F2017A1800106E022 +:10341000FEF7F0FD002804D0F12013A1800003F096 +:1034200002F810BD10A11448F9E710B504460029B0 +:1034300003D00020FFF77BFE03E007480078EEF79B +:1034400047FF2046FFF7B1FF0020F5F724FE10BD2F +:10345000F028010092060000AC00002010270000B8 +:10346000E204000040420F007372635C6C6C5F6C9E +:103470006D2E73302E630000CB030000F8B5FEF70D +:10348000B0F90446FEF756FAF84E0546706920304A +:10349000407D002809D0012827D002282AD00328FF +:1034A00032D0FF20F2A19A3037E0F0481830FEF712 +:1034B0001EFA002801D003200FE0EC481830FEF778 +:1034C00049F9002804D070695B21095C002908D003 +:1034D000E6481830FEF7D2F90120716920314875AD +:1034E0001DE002212030417519E0E0481830FEF758 +:1034F000C5F914E0DD481830FEF72CF900280ED18C +:10350000FF20DBA18C3008E0D8481830FEF7EFF937 +:10351000002804D1FF20D6A1943002F084FFB069C6 +:10352000F72201781140017072692032937DDB0728 +:103530001B0F1943FB2319400170D37DDB075B0F81 +:1035400019430170577DEF23022F04D0012F07D0BC +:10355000032F07D00CE0012C06D8002D04D007E083 +:103560006D1E2C43002C03D019401023194300E09A +:1035700019400170D17F002916D0517D012913D047 +:10358000BF48FBF79DFFBE480021283001767269D5 +:10359000916ED26E42610161B949B269FCF7A3FA3A +:1035A0000020FCF7AFFA03E0FBF78AFFFCF7CDFA47 +:1035B000B0690078C00606D4F0690078C00602D46D +:1035C000F079002806D0B079002803D101210846FF +:1035D000FCF79BF8032030703079002803D1FBF70B +:1035E000BDFF01203071F8BD70B5A0481C30FEF75A +:1035F000B9F901259D4C002802D00020607002E03E +:1036000065709F48E061606940300078002802D012 +:103610006078002805D0E069FBF752FFFCF795FAC7 +:1036200070BD9748FBF74CFF9548283005766269D6 +:10363000116F526F42610161914AE169FCF753FADF +:103640000120FCF75FFA70BD10B588490023486976 +:1036500002462030C3768377012049239854A03254 +:103660009279002A03D008700021022001E0002195 +:103670000320FFF7FAFD10BD70B57C4C6079C206DF +:103680002046406901468031002A01DA002202E02A +:10369000CA8DCB8BD218CA850246C0321379002B53 +:1036A00005D0034640331D8AC98B69181982617A97 +:1036B000002903D03D2001F051F94AE003462033B0 +:1036C000D97E042945D0217A002913D0480701D496 +:1036D000C80601D51E2030E0080701D53D202CE0AA +:1036E000C80705D1880703D461A1664802F09BFE94 +:1036F0002A2022E04030817D002905D0418A4D1CDE +:103700004582858AA9420FD2517A062902D0117AC0 +:10371000062905D1018B4A1C0283828A914203D279 +:10372000028AC1898A4201D3222006E09A7F8089D9 +:10373000002A0AD088420FD3082001F00FF96069EF +:103740002030C07E042804D006E0062804D33E20A2 +:10375000F3E7FFF779FF70BD0120207000210846D4 +:10376000FFF783FD70BD10B5404840690146203128 +:103770008A7F002A29D0012A27D0022A06D0032ACC +:1037800004D03BA1404802F04EFE10BDC97E032983 +:103790000FD0082919D001464031CA898989511AA8 +:1037A000891E89B2032900D303218030828B5118EE +:1037B00009E0014640318A89032A06D3028EC9896D +:1037C00080305118491C018310BD8030818BFAE78D +:1037D00000B5030002F018FF0604070B0F121217C2 +:1037E00000290ED00FE0891E02290AD90BE0891F9B +:1037F000012906D907E0082903D004E00B390C2978 +:1038000001D8012000BD002000BDFEB505461748C7 +:103810001830FEF740F8002804D11B4814A1D13815 +:1038200002F001FE114CA069FDF702FC0321A06922 +:10383000FDF721FCA069EF220178114001702946B3 +:10384000FDF740FC002601272B0002F0DDFE0E5C98 +:103850005C085C2C6060255C4C5C603C375C60699B +:103860006521095C002911D0062111E0C400002067 +:103870007372635C6C6C5F736C6176652E630000C1 +:1038800090140020430200005C080000C030417921 +:10389000A069FDF797FC3AE060698030417CA0693F +:1038A000FDF7D7FC33E06169A069B831FDF7ADFCE5 +:1038B0006169A0698C31FDF7AEFC28E00621A069A2 +:1038C000FDF7C5FC23E020690178A069FDF7A9FC9C +:1038D00020698188A069FDF7A6FC20694188A0695C +:1038E000FDF7A5FC13E00096019660696030007951 +:1038F000002803D069460878384308706946A069F3 +:10390000FDF7B1FC03E0F949F94802F08CFDFDF741 +:10391000D4FF002804D1F648F449801D02F083FD4D +:103920000C2D06D0072D03D0606940304682877584 +:10393000FEBD606940300683FEBDF0B5ED4CC82089 +:1039400061698DB0405C04280AD0052835D15C201F +:10395000405C00282AD0012060314871022026E016 +:1039600010226846D63101F030F86169102204A8AF +:10397000B03101F02AF8684601F0DFFB08AE8DCEC9 +:10398000616984250E4678360DC66F5000250D6797 +:103990004D67012540267554D74D88318DC5284681 +:1039A0000822093002F0C1FB052000E00D20FFF7DE +:1039B0002CFF61690020C03108720DB0F0BDF8B570 +:1039C000CC481830FDF767FF002848D0C94C207A52 +:1039D000002844D16069C421095C002500290ED06B +:1039E0002030C17E0120FFF7F3FE002807D1606977 +:1039F0002030C17E0420FFF7EBFE002806D060696E +:103A0000C921095C0126062907D00DE06069502113 +:103A10000D526030457102204EE02030C17E0420FE +:103A2000FFF7D6FE002813D0616908462030C27E19 +:103A3000921E130002F0E8FD166262621D6262626D +:103A400060621F6262622843626262626262466210 +:103A500060695E21095CC90702D0C0304572F8BDBB +:103A60000C20FFF7D2FE60694030817F31438177BF +:103A7000F8BD072020E0FDF79AFF0028F8D0606924 +:103A8000403005700B2017E0F9F741FA0C28EFD30E +:103A900060690821B830F9F73BFA002806D0606960 +:103AA00004218C30F9F734FA002804D1C72093A1FF +:103AB000C00002F0B8FC0420FFF7A7FEF8BDFFF736 +:103AC0003CFFF8BD00228A66CA66C6770A4678318E +:103AD000C8C9894878322838D26842632830C8C0BB +:103AE00008220D30091D02F020FB0620FFF78DFE95 +:103AF000606940308575F8BD0920DDE700F036FFCC +:103B0000F8BD70B57B4C3B216069095C08292FD159 +:103B10000146028EC0314B89521C9A4228D1227A2A +:103B2000002A25D10A8A83889A4207D14B8AC58800 +:103B3000AB4203D18B8A0589AB4209D043884B85C0 +:103B40008A854A8ACA858A8A0A860122E6210A5417 +:103B500001221146FDF747FC00210420FFF785FBF9 +:103B600060690021C92211542030C1760321817778 +:103B700070BD70B55F4C60692030C07E172803D0DF +:103B80005EA1624802F04FFC616900220B4640339F +:103B9000DA7608469A75E030867D0B240125002EE2 +:103BA00006D0837C002B14D1C4740275857410E098 +:103BB0001E7F002E07D01A774C88FA235C520276BB +:103BC0000C23837505E04E88FA235E520276057752 +:103BD00084752031CA7670BD70B5464CA0798007D7 +:103BE00036D5207A002833D160692030C17E01208B +:103BF000FFF7EEFD00282BD1A0690126C078002533 +:103C0000030002F001FD0E8585088537465F0A85B1 +:103C1000168526625285032152E060692030C07EFD +:103C2000052804D0394835A1333802F0FCFB60691F +:103C30000CE060692030C07E092804D033482FA1F1 +:103C40002D3802F0F0FB606956210D542030C57606 +:103C500070BD60692030C07E0B2804D02B4827A19E +:103C6000263802F0E0FB60695B210E540C21203005 +:103C7000C17670BD60692030C07E0F2804D0234813 +:103C80001EA11F3802F0CFFB60695B210E5410218A +:103C9000EDE760692030C07E102804D01B4817A1D2 +:103CA000183802F0C0FB12210AE060692030C07EA3 +:103CB000102804D0154811A1123802F0B4FB1421C9 +:103CC0006069D4E7FFF755FF70BD60690146C030F9 +:103CD000027A062A04D14031897F890700D505720E +:103CE000417A0629F0D1457270BD0000703801009C +:103CF000CD070000C4000020B81400207372635C7C +:103D00006C6C5F736C6176652E6300004C0500007F +:103D1000FD49FE4802F087FBE6E710B5FC4C606900 +:103D20002030C17E0020FFF753FD002803D1207A08 +:103D3000012108432072207A002808D1E069FDF7AC +:103D4000EBF961699122505405202031C87610BDED +:103D500010B5EF4C60690146C0314A7A002A06D09E +:103D6000097A062903D0217A012211432172217A8E +:103D7000002928D14030807F800715D4E069FDF705 +:103D80005AFA61694031C877E069FDF756FA61690E +:103D900040310884E069FDF755FA6169022240313B +:103DA0004884887F10438877606900220146C031CB +:103DB0000B7A062B00D10A724030837FDB0702D1D9 +:103DC00006234B72028310BDF8B5D14C60692030D8 +:103DD000C17E0020FFF7FCFC0125002807D16069A7 +:103DE0004030007F002802D1207A28432072207AB8 +:103DF000002830D160690026014640304682857532 +:103E0000B031E069FDF7EFF96169E0698831FDF7EC +:103E1000F3F960690146E030827D0827002A06D068 +:103E2000817C002913D1C774067585740FE04A8818 +:103E3000F8204252FA31E069FDF7C8F96169E0699A +:103E4000FF310331FDF7CAF96069E03087756069B9 +:103E50000F212030C176F8BD10B5AD4C606920301F +:103E6000C17E0020FFF7B4FC002803D1207A012195 +:103E700008432072207A002812D1E069FDF769F921 +:103E800000280ED0E069FDF75FF96169CA2250523F +:103E9000098E00F0D6FD002806D0282000F05EFD37 +:103EA00010BDFFF73AFF10BDE069FDF74BF96169FE +:103EB000C0310873E069FDF740F96169C031C8811C +:103EC000E069FDF72BF96169C0310882E069FDF70F +:103ED0002AF96169C0314882E069FDF729F9616911 +:103EE000D422505208202031C87610BDF8B5884C35 +:103EF000A079C00776D0207A002873D1606920307D +:103F0000C17E0120FFF764FC002863D1E069002531 +:103F1000C178022701260B0002F076FB0D1613086C +:103F2000415A5A445C575A192F545A00FDF74CF91C +:103F30006169C62250543B20475440314D828E75F2 +:103F400048E000F093FD45E0FFF786FF42E060693E +:103F50002030C17E0020FFF73BFC002802D1207AF0 +:103F600030432072207A002834D160690146403104 +:103F70004D828E750B2120300FE0606901462030A4 +:103F8000C27E0C2A02D0227A3A432272227A002A76 +:103F900020D1C57740310E770D21C1761AE0FFF7A9 +:103FA00013FF17E0606901462030C27E122A02D05A +:103FB000227A3A432272227A002A0BD140318D753F +:103FC0001721EAE7FFF7C4FE04E000F00DFD01E071 +:103FD000FFF7A3FE62690023106F516F401C594127 +:103FE00051671067F8BDF8B5494C05466069203047 +:103FF0008079012801D1FBF7E9FA012D14D160691C +:104000004021095C002903D12030C07F002801D065 +:10401000FBF79BFDFBF7BDFAFBF7B0FAFBF708FADD +:10402000FBF72DFAFBF746FA60790225C107012656 +:10403000002901D180070ED560692030817F0029D9 +:1040400002D0032902D006E0867700E085770021C0 +:104050000120FFF70AF960692030817F012903D12F +:104060006179090700D58577607A002803D100F0CF +:1040700027FDFFF7A4FC207900250028606902D005 +:104080008030058403E08030018C491C0184607914 +:10409000C00705D06069AC210D544030858104E033 +:1040A000616940318889401C8881E079002806D008 +:1040B0006169A031087B022806D8401C087360693A +:1040C000A030007B022806D9606901468030058453 +:1040D0004584A0310D7360692030C17E0020FFF758 +:1040E00077FB002804D160692030C07E072855D1B5 +:1040F00060690146C0310A7A062A4FD0497A0629FA +:104100004CD03E21095C05E0FC3C0100BA050000F2 +:10411000C4000020022941D1A030007B00283DD1FD +:10412000FDF74FFB002839D0FDF704FC002835D0FF +:1041300061690A468032508B01282FD90846A03089 +:10414000844646716038C7898389B81E834201DB83 +:10415000012002E0F81A401E80B2138CA789BB42EE +:1041600001D3012302E0FB1A5B1C9BB2984200D9E9 +:104170001846012801D163465D71C0310B78002BD0 +:1041800010D0528C49888A4201D3012102E0891A59 +:10419000491C89B2884205D9084603E061690120BB +:1041A000A0314D7161690A8E803110188883FFF744 +:1041B000DAFAFFF761FAFEF756FF002809D06069C6 +:1041C0000146FF3001300279002A02D14988C180BE +:1041D00006716069A0308571F8BD70B5F84C6069F2 +:1041E0002030407D00283ED0022810D1FDF7C2FAD1 +:1041F000002804D17120F349000102F014F962692A +:104200000023916ED06E491C58419166D06660695A +:10421000002520304575017D012904D10575A1795E +:1042200010221143A171C17C012915D1C574A07957 +:1042300008210843A071FDF76AFB002804D1E5209E +:10424000E049C00002F0EFF860690023816EC26EA1 +:10425000491C5A41C266816660692030817D01290E +:1042600002D0012181753FE585753DE570B5D44CDF +:104270000026E169012508788207920F0420012AAF +:1042800015D0022A13D0032A03D0217A01432172C8 +:104290002AE560780028FBD1606920308574A17917 +:1042A0002943A17122E0C6751EE5C5751CE5497854 +:1042B000CA0624D06278002AEAD1C906C90E1B2991 +:1042C00018D8617901436171FDF75FFB002804D1C3 +:1042D0003B20BC49400102F0A6F860690023016F51 +:1042E000426F491C5A41426701672030C17D012954 +:1042F000DBD1D8E7207A102108432072F4E460690A +:10430000F3E77CB504460020C0436946888001A8D5 +:10431000FCF7B2FD00287AD169468888FCF790FD49 +:10432000002803D0A749A84802F07DF8009801466C +:10433000E030827C0025002A08D0657010212170B1 +:10434000C17CA170017DE170857472E082799C4E20 +:10435000002A13D065700720207008E07169E620FC +:104360008D8445540A22A01CE83101F0DEFE00983D +:10437000E03080790028F1D1A5705AE0827D002AD2 +:1043800038D0827D130002F03FF90D2F2F2F2F2FF1 +:104390002F2F2F112F2F24082F0065700C21217033 +:1043A000017EA17071694988A18010E065700820C4 +:1043B00020707069082240886080201DFA3101F069 +:1043C000B4FEFF2100980331095AA181E0308575C0 +:1043D0002FE065700B212170017EA1707169498801 +:1043E000A180017FA171F2E7774876495D3002F044 +:1043F0001AF81EE0C81DF9300279002A08D01122EF +:1044000065702270811C89886180057111E012E05D +:10441000027A002A0FD012226570FF312270033118 +:1044200004E005720A8962804A89A280027A002A21 +:10443000F7D101207CBD00207CBD614800780128B7 +:1044400001D00C2070470020704770B55C4C0546C9 +:104450002078002804D05C485A49933001F0E3FFEB +:1044600000202561A07201202070FFF7E6FF0028E0 +:1044700004D0554853499E3001F0D5FF34E4F8B5D7 +:104480004F4F3978012901D00C20F8BD0126A62113 +:1044900078610E548030807CFDF752F900282FD0CF +:1044A00078698030807CFDF753FA002828D078693D +:1044B0008030807CFDF7E5F9002821D078698030D4 +:1044C000807CFDF70AFA00281AD0FAF7E6FF78692F +:1044D00000258030408B002827D039481830FDF760 +:1044E000DAF9002821D07869C421095C00291CD0A0 +:1044F0002030C17E0120FFF76BF9002802D014E0C4 +:104500001220F8BD78692030C17E0420FFF760F9E1 +:1045100000280AD1786950210D526030457102207F +:10452000FFF773F97869A03045717869E621095C75 +:10453000002903D1818CC288914200D8C188B981F9 +:1045400001468031CA8B521E93B20A8CD21892B2A5 +:104550000A8494460246A0321479002C02D04D847D +:10456000157102E04C8CE4184C8404464034A78951 +:10457000FF18A7814C8B012C01D8641C4C83002BA5 +:1045800000D015732030C07E0D4C04281ED0507909 +:1045900000281DD0A1898C451AD2FDF712F90028F8 +:1045A00016D060690146C0310A78002A10D08030E8 +:1045B000408C498888420BD3A570E6700AE0000061 +:1045C000C4000020FC3C010081080000A67001E04E +:1045D000A570E5706069A5210D543B21095C062991 +:1045E00001D0072918D1CA21028E095A511A09B2DD +:1045F000002911DB01460522CC310A3001F095FD7E +:10460000012202216069FCF7EEFE6069C9210D54A8 +:104610003B210D546030867160699E210A5A811CCD +:104620003030FCF71EFFA07800283DD16069C02122 +:10463000095C002901D0803045840120FAF7A4FDEF +:1046400060691330FAF713FF60690F30FAF753FE11 +:104650000120FAF71FFF61694020405C002803D168 +:104660003F20405C00280DD00A467831C8C9F9487F +:104670007832D26842632830C8C008220D30091D44 +:1046800001F053FDFAF701FF01210846FAF758FE41 +:1046900060698030806AFAF716FFFEF7A5FF60694F +:1046A0004030007AFAF730FE6571E571A571257228 +:1046B0006572257102202070FAF7FCFE0020F8BD1B +:1046C00010B5E54C2078022801D00C2010BDA07850 +:1046D000002803D00020FFF786FC17E0FAF7DDFE84 +:1046E00000F033F9606920308079012801D1FAF7B0 +:1046F00076FFA07A002809D0012807D0022807D029 +:10470000032805D0D549D64801F08DFE002010BD04 +:10471000EEF77EFCFAE7D0498872704710B5CE4CB0 +:104720002078032804D0CE48CC49293001F07BFE04 +:10473000606901212030827C002A06D00022827428 +:104740000175A27904231A43A271A2691378DB438D +:104750009B0707D1C37C002B04D1C174A07902212F +:104760000843A0711078C00606D4E0690078C0063E +:1047700002D4E07900280CD06078002809D1A07913 +:10478000002806D1FEF75DFC002802D0207A002820 +:1047900003D00120FFF727FC03E0FEF725FF00F020 +:1047A000D4F8207801280DD0A07A00280AD001285A +:1047B00008D0022807D0032805D0A948A7496830A7 +:1047C00001F031FE10BD0120FBF719F810BD10B546 +:1047D000A14C606920308079012812D1FAF7F6FEE9 +:1047E0006169881C3031FCF7C5FE002809D060697A +:1047F000C21D4388F93253812030007E107301209E +:10480000107210BD70B5944C05462078042804D071 +:1048100093489249803001F006FE617910200143EF +:104820006171002D50D0FBF7A8F96178012508438C +:10483000002811D160694021095C00290CD0E16990 +:104840004A78D20608D0097820300907C07DC90F00 +:10485000814201D165724EE0E078002809D0E0691C +:104860004178C90605D10078C00602D4FFF7AFFF32 +:1048700041E0FFF7ACFFE06900784007C10F6069D5 +:104880002030807D814205D0FFF7A7FC60790821A8 +:1048900008436071E06900780007C10F606920304B +:1048A000C07D814201D1FFF7E1FC6079284360714E +:1048B0000020E071A079000704D560692030C07E37 +:1048C000032818D0207A14E0022001436171E079B6 +:1048D000401CC0B2E07101280DD8606940300078FA +:1048E00000280CD05B484078C106C90E052906D2C5 +:1048F000C006002803D00120FFF775FB01E0FEF79A +:10490000BDFD207801280DD0A07A00280AD001280A +:1049100009D0022806D0032805D051484F49E2307B +:1049200001F081FD9FE40120FAF769FF9BE410B5D7 +:1049300049480078042804D049484849EA3001F041 +:1049400072FD0120FFF74FFB10BD10B501210020C3 +:10495000FAF7DBFE40490420087010BD3E494A22A8 +:104960004969505404202031C876704710B53A4C3C +:10497000C8206169405C00281CD0062806D0203180 +:10498000C97E0020FEF724FF002813D0606901468D +:10499000C0310A7A130001F037FE070D0D0D0D0D21 +:1049A0000D050D004030807FC20704D0C043800752 +:1049B00000D1087210BD0C20FEF727FF60690122AC +:1049C0004030817F1143817710BD10B5002A0AD095 +:1049D000002306E0D41A6418203CE47FC4545B1C16 +:1049E000DBB29342F6D310BD7CB51B4C606920301E +:1049F000C17E0020FEF7ECFE0125002802D1207ABE +:104A000028432072207A00281AD16946E069FCF711 +:104A100022FC684600780022C107C90F6846017071 +:104A20006069002902D06030057101E060300271D8 +:104A30006069014640304282857509202031C87680 +:104A40007CBD401A074900B2884201DC00280BDC1B +:104A50000120704790140020C4000020FC3C01009D +:104A6000F4090000FE7F00000020F2E710B5534C6F +:104A700060692030C17E0020FEF7AAFE0028207A5F +:104A800010D000280DD1E069FCF797FB6169CA22BC +:104A90005052098EFFF7D5FF002807D02820FFF7D6 +:104AA0005DFF10BD01210843207210BD6169E069FE +:104AB000CC31FCF77AFB606906212030C17610BD4D +:104AC00010B500F04EF83D4C607940070BD5606999 +:104AD0002030C17E0520FEF77BFE002803D0207A1F +:104AE000082108432072FFF701FA00F018F8FFF7D9 +:104AF00073F8A079C0060FD5207A00280CD1606920 +:104B00002030C17E0B0001F07FFD07070707070774 +:104B1000070507000721C176FEF7F3FF10BD10B5AA +:104B200026488179490715D5017A002912D14069B3 +:104B30003B21095C891E0B0001F066FD07050C0C8A +:104B40000C0D0C0F0C00002256210A54C030807945 +:104B5000FFF704FF10BD012100E00221C0304172C7 +:104B600010BD10B515488179090720D5017A0029B3 +:104B70001DD1406902462032D47EA41E230001F0DC +:104B800043FD13160B1616161616161616161616BF +:104B90001616161616171600562211546030407954 +:104BA000002801D0062000E01620FFF7D7FE10BD38 +:104BB0004030C1768175D17610BD0000C400002060 +:104BC00030B50346002002460DE09C5C2546303D92 +:104BD0000A2D02D30020C04330BD0A256843303877 +:104BE0002018521CD2B28A42EFD330BD70B50D46A8 +:104BF000144608E00A2101F012FB2A193031203A4C +:104C0000641ED177E4B2002CF4D170BD10B500233E +:104C100010E0040A00020443A0B2CC5C4440200629 +:104C2000000F60400407240C44402006C00C604084 +:104C30005B1C9BB29342ECD310BD000010B572B662 +:104C400000F0DCF800280BD0ECF72AFBF8F7EFFDBA +:104C500000F0A5FD6E490020C86288626D490860B9 +:104C600062B6002010BDF3B5002501200007C06A20 +:104C700081B0C0430006000E04D167480068401CA4 +:104C800000D1012572B600F0B9F8002802D062B652 +:104C90000820FEBDECF75AFAECF706FB5F4B604EBE +:104CA00000211A68CA40D2071FD00246CA40D20764 +:104CB00018D14AB2002A07DA1407240F083CA408C6 +:104CC000A400A419E46904E09408564FA400E41970 +:104CD00024689207D20ED4402206920F012A04D0F3 +:104CE000032A02D062B65048FEBD491C2029D8D301 +:104CF0000198030001F088FC14212323232323239C +:104D000023230B0D0F11131F1517191B1D2E002424 +:104D100016E0012414E0022412E0032410E004242D +:104D20000EE008240CE009240AE00A2408E00B2421 +:104D300006E00C2404E0052402E0072400E0062439 +:104D4000F06901210002000AC9070843F061002D43 +:104D500004D009E062B601200003FEBD2C4D3348AB +:104D6000E862ECF7A1FAA8622A49314808603149A3 +:104D700002980860ECF798FA214600F0F7FCF8F783 +:104D80001AFD00F0FDFE00F073FD0198ECF756FAF5 +:104D9000040062B603D0FFF751FF2046FEBD00209D +:104DA000FEBD10B5044600F029F8002800D001200F +:104DB0002070002010BD204908600020704710B509 +:104DC0000C46102808D011280BD012280CD013281C +:104DD0000ED00120086010BD03CC083CFFF743FF54 +:104DE0000AE0FFF72BFF07E02068FFF7DAFF03E098 +:104DF0001149206808600020206010BD05480C495A +:104E00000068884201D101207047002070470000EF +:104E100000050040780000200010001000E100E0D4 +:104E200000ED00E000E400E00110000000190000C7 +:104E3000BEBAFECAE40000200400002010B52038ED +:104E40000C46030001F0E0FB33A6AAAEB2B8BCC02A +:104E5000C5E0DBE41B1F23272C31373C41474D5075 +:104E600054585C606D71656974787C8084888C901E +:104E700094989C9FA2CACFE9F0F3D3D7F80020689A +:104E800000F0DDF8D6E0206800F0E1F8D2E020681C +:104E900000F0F5F8CEE0207840B200F0D7FAC9E093 +:104EA000207840B200F0F5FAC4E02078616840B2A2 +:104EB00000F008FBBEE0207840B200F018FBB9E03B +:104EC000207840B200F023FBB4E02078217940B292 +:104ED00000F02EFBAEE02078616840B200F058FB95 +:104EE000A8E000F064FBA5E0206800F068FBA1E00A +:104EF000207800F07DFB9DE02068F8F72CF899E021 +:104F00002068F8F72CF895E021792068F8F72EF85A +:104F100090E0206800F0E6F98CE0206800F0E7F906 +:104F200088E0207800F0E7F984E000F0F1F981E012 +:104F3000207800F0F3F97DE0207800F005FA79E0C0 +:104F4000206800F01EFA75E0206800F020FA71E099 +:104F5000206800F022FA6DE0206800F023FA69E092 +:104F6000206800F025FA65E0206800F027FA61E08B +:104F7000206800F028FA5DE00846ECF7FFF859E0F9 +:104F8000EDF719FA56E0EDF746FA53E02068EDF731 +:104F90004EFA4FE0206800F0E1F84BE0206800F0A6 +:104FA000E9F847E0206800F0F0F843E02078A268D4 +:104FB000616800F0F5F83DE0207800F006F939E08E +:104FC000207800F017F935E02078616800F027F9C3 +:104FD00030E02078616800F03AF92BE02179207800 +:104FE00000F016FC26E0206800F06BF822E0206854 +:104FF000F8F70CFB1EE02068F8F7F0FA1AE007CC8F +:105000000C3C00F0FFFC15E0206800F052FD11E0C0 +:1050100003CC083C00F07DFD0CE0206800F06EFF42 +:1050200008E009E003E0FFE700F080FF02E020680D +:1050300000F0B8FF206010BD0120086010BD002105 +:105040000170084670470146002008707047EFF372 +:105050001081C907C90F72B60278012A01D0012256 +:1050600000E0002201230370002900D162B6002A6B +:1050700001D000207047012040037047E7E7EFF3BD +:105080001081C907C90F72B600220270002900D131 +:1050900062B600207047F2E710B52848FFF7CFFF4F +:1050A000002803D026A11D2001F0BDF92348401C93 +:1050B000FFF7C5FF002803D021A1212001F0B3F99B +:1050C00010BDF1B5224D6F6801261C48FFF7BFFFE8 +:1050D0001A4C002803D10026601CFFF7D0FF1D4AA0 +:1050E0001D490120506000BF00BF00BF00BF00BFCE +:1050F00000230B604B60009B6B60106000BF00BF23 +:1051000000BF00BF00BF0868002802D1486800281F +:10511000F9D048680028E4D1002E04D06F60601CEC +:10512000FFF795FF07E0601CFFF791FF0028D3D140 +:105130000248FFF7A4FF0020F8BDC2E7E800002006 +:105140007372635C736F635F6563622E630000005C +:1051500000E5004000E0004000E100405A495B4BA0 +:105160000A685B499A42096801D18904890C016087 +:10517000002070475449554B0A6855499A4201D15D +:105180008004800C4860002070474F494F4B0A68EC +:105190004F499A4201D18004800C886000207047FA +:1051A00030B5494B494D1C684A4BAC4202D01028DF +:1051B00002D203E00E2801D3184630BDC300444894 +:1051C000181801614261002030BD3F493F4B0A6819 +:1051D0004049491C9A4202D0042802D203E0022826 +:1051E00001D3084670473C4A0121C0008018016085 +:1051F000002070473449354B0A683649491C9A42A9 +:1052000002D0042802D203E0022801D308467047E6 +:10521000314A0121C000801841600020704770B5FC +:10522000294A2C4B14682D4E284D82005B1C921984 +:10523000AC4203D0042803D2116006E0022801D357 +:10524000184670BD8804800C1060002070BD70B5D9 +:105250001D4A204B1468214E1C4D82005B1C921984 +:10526000AC4203D0042803D2106806E0022801D320 +:10527000184670BD10688004800C0860002070BD66 +:1052800010B5134A164890600E200021C3009B18E9 +:1052900019615961401C1028F8D300200F4A05E01D +:1052A000022803D383009B18196005E083009B1834 +:1052B0001C68A404A40C1C60401C0428F0D310BD7E +:1052C000034907488860704778000020BEBAFECACC +:1052D00000F501400820000000F0014000F8014006 +:1052E00000C0FFFF47490968016000207047454939 +:1052F0000860002070470121434A002803D001289C +:1053000003D042487047916300E0D16300207047AA +:105310003F49012008603D48801C704704223D4BF6 +:105320003B49002805D05A600869012210430861F2 +:1053300008E008694008400008619A60324900208E +:10534000C03188600020704731490622002808D00B +:10535000012809D002280DD003280FD02B48401C6B +:1053600070470869904302E008699043801C086117 +:105370000020704708699043001DF8E70869104352 +:10538000F5E723494A6A02434A62002070472049F0 +:105390004A6A82434A62002070471D49496A016097 +:1053A000002070471A49CA690243CA610020704749 +:1053B0001749CA698243CA61002070471449C96904 +:1053C0000160002070471249024600204031002A47 +:1053D00003D0012A01D0072070478A6370470D4926 +:1053E0000420886008490020C03188600A480168AC +:1053F0008022090A0902114301600849012008605E +:1054000070470000000400404000004004200000FD +:10541000000500400003004000E400E000E100E07F +:105420008107C90E002808DA0007000F0838800835 +:10543000814A80008018C06904E080087F4A8000AB +:1054400080180068C8400006800F704710B50446F9 +:1054500000F0DBF8002813D02046FFF7E1FFC0B2D0 +:1054600000F0E1F800280DD07549E2060B78D20E65 +:1054700001209040002B08D04A681043486006E0A5 +:10548000704810BD6F48401C10BD6F490860002077 +:1054900010BD10B5044600F0B8F800280BD06849DC +:1054A000E2060B78D20E01209040002B05D04A680E +:1054B00082434A6004E0634810BD6349803108605C +:1054C000002010BD70B50D46044600F09EF800287F +:1054D0000BD05E480068E206D20E012191400840E0 +:1054E00000D001202860002070BD564870BD10B566 +:1054F000044600F08AF8002807D0E106C90E012012 +:10550000884052490860002010BD4E4810BD10B5BB +:10551000044600F07AF8002808D0E106C90E012000 +:1055200088404A4980310860002010BD454810BDC0 +:1055300070B50D46044600F068F8002819D02846DA +:1055400000F071F8002816D0A007C10EFF228A4093 +:10555000A807000E8840002C10DA2107090F08392F +:105560008B0835499B005B18D96991430143D96188 +:105570000CE0344870BD3348401C70BDA3082F496F +:105580009B005B181968914301431960002070BDAE +:1055900070B50C46054600F038F8002805D02846BE +:1055A000FFF73EFF2070002070BD264870BDBFF39E +:1055B0004F8F21492648C860BFF34F8FFEE770B573 +:1055C0001F4C05462178012000290ED1207072B6AB +:1055D00000F0F4F81C4E803631688143616000F0C1 +:1055E000EDF8C043306062B600202870002070BD26 +:1055F00013490A78002A06D0002804D1124A4868C4 +:105600001060002008700020704710B50446202864 +:1056100007DA00F0D3F80121A140084201D10120AE +:1056200010BD002010BD012803D0032801D00020A8 +:10563000704701207047000000ED00E000E400E04A +:10564000EC0000200120000000E100E000E200E0AA +:105650000400FA05F8B50446800700250126002855 +:1056600004DA5848C563C66302208443E00404D5C5 +:105670005548C563C66380148443600003D553480E +:10568000456080058443E00504D55148C563C66381 +:1056900080158443A00404D54E48C563C6634014F6 +:1056A000844360042704C00FF90F884203D04AA145 +:1056B000612000F0B8FEB80F0AD04C49CD634C48C9 +:1056C000C563C563CE63C663C6630320800384439A +:1056D00020050AD5474FFD632F20EBF765FDFE63DC +:1056E0002F20EBF761FDF8148443FFF7C9FD424812 +:1056F000044203D038A18D2000F095FEF8BDF0B52E +:1057000000210A46FF230446CC40E4072AD04CB2CD +:10571000E606F60E0125B540384E3560384E356048 +:10572000002C11DA25072D0F083DAE08354DB600C7 +:105730007719FD69A407E60E1C46B440A54314463C +:10574000B4402543FD610DE0A6082F4DB600761943 +:105750003568A407E70E1C46BC40A5431446BC4070 +:1057600025433560491C2029CDD3F0BD70B5274CA9 +:105770000D462060FFF76EFF2068FFF7C0FF284648 +:10578000ECF7EAFEFFF788FCF7F778FBFFF778FD08 +:10579000FFF725FEECF766FD00F06AF870BD10B566 +:1057A0001A4C2068FFF756FF2068FFF7A8FFFFF7A5 +:1057B00067FDECF74BFF0020206010BD1348006828 +:1057C00070470000C01F0040C0CF004000E501400E +:1057D000C08F0040C0DF00407372635C736F635F13 +:1057E000636F6E6669672E6300000000C0EF0040C3 +:1057F000C0FF0040C0BF0040FEFF0FFC80E100E0A2 +:1058000080E200E000ED00E000E400E0F4000020B1 +:1058100070B5002402460D4620462146002A1ED0BF +:10582000012A04D0022A04D0032A1ED103E0012059 +:1058300002E0022013E003202B0000F0E5FE071633 +:105840000507090B0D0F1600012108E0022106E0F3 +:10585000032104E0042102E0052100E00621F8F71D +:1058600058F8002801D0204670BD0724FBE700004F +:10587000B348002101708170704770B5B14D0123AC +:105880006B60B14B1C68002CFCD0002407E00E6854 +:1058900006601E68002EFCD0001D091D641C944289 +:1058A000F5D30020686018680028FCD070BD70B582 +:1058B000A34C0E466178884203D0A4A16F2000F06B +:1058C000B2FD0325330000F09FFE09520624245246 +:1058D0005252524952002078022803D09BA17320D3 +:1058E00000F0A1FD2570A078022802D0012804D084 +:1058F00008E0A06800F0D2FB04E02046083007C8AA +:10590000FFF7BBFF0020A070F7F7A4FF0420207072 +:1059100070BDF8F754F801466068F9F776FA064664 +:105920002078022803D089A1872000F07CFD8B4AD3 +:105930008B498C48964205D86269032A02D2521CD0 +:10594000626102E0864207D84D71801BC8608449BD +:105950006078F8F7B4FC70BD032003E0A07800285D +:10596000FAD10220F7F77EFE00F0E1F870BD77A1D2 +:10597000B12000F058FD70BD70B50546F8F71FF86E +:105980006F4C60602078012803D070A1B82000F02F +:105990004AFD73490220087000220A718D600422BA +:1059A0004A71704ACA6020706078F8F788FC70BD50 +:1059B00010B5634CA078002802D12078002801D0CF +:1059C000112010BD6848F7F78BFF607060780028E1 +:1059D00004D0012020700020606110BD032010BDA4 +:1059E00010B50124020B64040121604BA04202D2D5 +:1059F0009140186802E0203A58689140084000D071 +:105A0000012010BDF8B50E46910005464F19144609 +:105A10003F1F009100F053FB009980028919091F74 +:105A2000B14201D2012200E00022002C03D0FF216C +:105A300001318C4201D90920F8BD4D498D4219D35D +:105A4000AF4217D3854205D2874203D2284630435E +:105A5000800701D01020F8BD8E420BD3002A09D157 +:105A60002846FFF7BDFF002804D13846FFF7B8FFEE +:105A7000002801D00F20F8BD3E483F490068884209 +:105A800005D0224631462846FFF7F7FE0FE0FFF724 +:105A90008FFF0028EFD12A480121C660856004618C +:105AA00081702046302148431830FFF765FF002001 +:105AB000F8BD10B504462E48800A84420BD300F08E +:105AC000FEFAA04201D8102010BDA0020446FFF744 +:105AD00087FF002801D00F2010BD26482649006806 +:105AE000884203D0204600F0D9FA0AE0FFF760FFB1 +:105AF0000028F1D112480221846081701F48FFF70D +:105B00003BFF002010BD1A48010B01208840401EB9 +:105B1000704700B50B460246FFF7F5FF104201D073 +:105B20000F2000BD114802604360002000BD10B589 +:105B3000034C6078F7F728FF00202070A07010BD9C +:105B4000F800002000E5014000E401407372635C4E +:105B5000736F635F666C6173682E6300307500005D +:105B6000E0140020D0FB0100AF5801000006004007 +:105B70000080010078000020BEBAFECA3A5600003C +:105B8000F74805218170002101704170C17081606A +:105B9000704710B5F3490A78022A07D0CA6810186E +:105BA000C860C8689638F9F7E9F810BD8A68101817 +:105BB00088608868F6E70378EB49EC4A002B02D04E +:105BC000012B10D014E00379002B01D0012B0FD151 +:105BD0004379002B01D0012B0AD18368643B8B42AF +:105BE00006D2C06810E00379002B03D0012B01D04E +:105BF000002070474379002B01D0012BF8D1C368F6 +:105C0000643B8B42F4D280689042F1D80120704707 +:105C1000F8B504460226F8F740FD0068002803D0D6 +:105C2000D3A1BD2000F0FFFB0127CD4D002C08D0F3 +:105C30002078002817D0012805D0022811D0032889 +:105C400013D02F710DE06068C82808D3F9F70BF95D +:105C5000002804D06068FFF79CFF012603E00026BF +:105C600001E000F0F9F93046F8BD28780028F8D1B5 +:105C70006068FFF7A0FF0028E3D060680078002884 +:105C800026D0A878042803D0B9A1F72000F0CBFBD8 +:105C9000B44F0020387060680079012800D00020DF +:105CA000387160684079002837D0042078716068C6 +:105CB0008168E868F8F71DF9B8606068C0689630D8 +:105CC000F8600320A870A749E878F8F7F8FAC8E761 +:105CD000A4480221017061680979012919D00021C5 +:105CE000017161684979002915D004214171616809 +:105CF0008968963181606168C968C160C068984CE4 +:105D000014346060F7F75BFE20606F700220A870AB +:105D1000A7E70321E4E70321E8E70320C6E7F8B596 +:105D20008F4C0D46E178884204D0FF2090A11930B5 +:105D300000F079FB28468A4F00250126143703001E +:105D400000F062FC090612375A7C8D97C4A0C4008B +:105D5000A078032807D0A078022804D0FF2084A1CF +:105D60001D3000F060FBF8BDA078032807D0A078B4 +:105D7000022804D0FF207EA1213000F054FB042033 +:105D8000A07025712078002810D1FFF702FFE0787D +:105D9000F8F7D6F8E0607D49886A7D4A02402261C2 +:105DA0007B4AD24310408862002050E000F054F952 +:105DB000F8BDA078032807D0A078022804D0FF20DF +:105DC0006BA1423000F02FFB2078002802D000F0B9 +:105DD0004FF9F8BDA07803281FD104202AE0091A42 +:105DE0006048C1600146E078F8F769FAF8BD042020 +:105DF000F7F738FCA570F8BDA078032807D0A07885 +:105E0000022804D0FF205AA1633000F00CFB207858 +:105E10000028DCD1A07803280BD0F7F7D0FD01468D +:105E20003868F8F7F2FF0028E1DB79688142DEDBB1 +:105E3000D5E70520F7F716FCA670F8BDA078042872 +:105E400004D0FF204AA1843000F0EDFA0220A168BE +:105E50008847FFF7DDFEFF260546BD3642E0A07805 +:105E6000042804D0FF2042A1893000F0DCFA012090 +:105E7000EDE7A078042899D0FF203DA18E3000F0F6 +:105E8000D2FA93E7A07804280AD06078002802D0DC +:105E9000A078022804D0FF2035A1933000F0C3FA87 +:105EA0002078002893D12079002804D00620F7F725 +:105EB000D9FB2571C0E76078002805D02949E07832 +:105EC000F8F7FDF96570F8BD0720B3E7FF2028A1BA +:105ED000AE3046E7002D0AD0012D06D024A1304671 +:105EE00000F0A1FA022DF5D1F8BD042000E0032056 +:105EF000A1688847FFF78CFE0546F3E770B50500FB +:105F000005D0174CA078052803D0112070BD1020B3 +:105F100070BD2048F7F7E4FCE070E078002803D07B +:105F2000A5600020A07070BD032070BD10B50C48A6 +:105F30000178002901D0112010BD817805292BD0CE +:105F4000817801292AD08178002927D00121017088 +:105F50008178012922D0807800281FD020E000001D +:105F600010010020F01400203D860100FF1FA10752 +:105F70007372635C736F635F726164696F5F74698E +:105F80006D65736C6F742E630000000000050040A7 +:105F9000028100001F5D01000F2010BD00F068F8B5 +:105FA000002010BDF8B5394E0446B078002801D065 +:105FB00001280DD1002C0DD02046FFF7FCFD002854 +:105FC0000AD02078324D002808D0B078012823D09C +:105FD0000F20F8BD1020F8BD0720F8BD02272F7054 +:105FE0002079012814D0002028716079002811D070 +:105FF00004206871A0689630A860E068E860E868EE +:10600000224C14346060F7F7DAFC2060B77019E0B6 +:106010000320E9E70320ECE700202870207901281D +:1060200016D0002028716079002813D004206871F0 +:10603000A168F068F7F75DFFA860E0689630E86057 +:106040000320B0701249F078F8F739F90020F8BD54 +:106050000320E7E70320EAE710B50E48816A0E4AFD +:1060600011400A4A126911438162F7F7F3FB10BD30 +:1060700010B5064CE078F7F787FC0820F7F7F2FA3E +:106080000520A07000202070607010BD100100205D +:10609000F014002000050040FD7EFFFF0A4A0221A7 +:1060A00051600A490B68002BFCD0906008680028FA +:1060B000FCD00020506008680028FCD07047012008 +:1060C000000740697047000000E5014000E401401E +:1060D000034610B50B439B070FD1042A0DD308C804 +:1060E00010C9121FA342F8D018BA21BA884201D9A8 +:1060F000012010BD0020C04310BD002A03D0D307EB +:1061000003D0521C07E0002010BD03780C78401C1F +:10611000491C1B1B07D103780C78401C491C1B1B16 +:1061200001D1921EF1D1184610BDF8B5042A2CD326 +:10613000830712D00B78491C0370401C521E830742 +:106140000BD00B78491C0370401C521E830704D0EF +:106150000B78491C0370401C521E8B079B0F05D007 +:10616000C91ADF002023DE1B08C90AE0EBF72CF870 +:10617000F8BD1D4608C9FD401C46B4402C4310C064 +:10618000121F042AF5D2F308C91A521EF0D40B7854 +:10619000491C0370401C521EEAD40B78491C037042 +:1061A000401C012AE4D409780170F8BD01E004C064 +:1061B000091F0429FBD28B0701D50280801CC90767 +:1061C00000D00270704700290BD0C30702D00270C4 +:1061D000401C491E022904D3830702D50280801C7B +:1061E000891EE3E70022EEE70022DFE70378C278AA +:1061F0001946437812061B0219438378C0781B04A2 +:10620000194311430902090A000608437047020AAC +:1062100008704A70020C8A70020ECA707047002221 +:1062200003098B4273D3030A8B4258D3030B8B426F +:106230003CD3030C8B4221D312E003460B437FD4A3 +:10624000002243088B4274D303098B425FD3030AB5 +:106250008B4244D3030B8B4228D3030C8B420DD3C8 +:10626000FF22090212BA030C8B4202D31212090256 +:1062700065D0030B8B4219D300E0090AC30B8B4294 +:1062800001D3CB03C01A5241830B8B4201D38B0342 +:10629000C01A5241430B8B4201D34B03C01A5241E7 +:1062A000030B8B4201D30B03C01A5241C30A8B422A +:1062B00001D3CB02C01A5241830A8B4201D38B0215 +:1062C000C01A5241430A8B4201D34B02C01A5241B9 +:1062D000030A8B4201D30B02C01A5241CDD2C3092B +:1062E0008B4201D3CB01C01A524183098B4201D3A7 +:1062F0008B01C01A524143098B4201D34B01C01A92 +:10630000524103098B4201D30B01C01A5241C30809 +:106310008B4201D3CB00C01A524183088B4201D378 +:106320008B00C01A524143088B4201D34B00C01A64 +:106330005241411A00D201465241104670475DE079 +:10634000CA0F00D04942031000D3404253400022FC +:106350009C4603098B422DD3030A8B4212D3FC22A5 +:10636000890112BA030A8B420CD3890192118B4224 +:1063700008D3890192118B4204D389013AD092113A +:1063800000E08909C3098B4201D3CB01C01A5241F5 +:1063900083098B4201D38B01C01A524143098B42BE +:1063A00001D34B01C01A524103098B4201D30B01A7 +:1063B000C01A5241C3088B4201D3CB00C01A5241CC +:1063C00083088B4201D38B00C01A5241D9D24308B3 +:1063D0008B4201D34B00C01A5241411A00D20146F0 +:1063E000634652415B10104601D34042002B00D55A +:1063F0004942704763465B1000D3404201B500201C +:10640000C046C04602BD70477047704710B500F0E7 +:106410003BF810BD012308CB134B1860134B1960D8 +:10642000134B1A607047134A134B13607246053AB8 +:10643000F0E7114A0F4B1B689A420ED10D4B00201A +:10644000186001980D4B04B598470CBC9E46024657 +:10645000029800990A4B1B68184706980599094B42 +:106460001B68DB6818470000340100203801002059 +:106470003C0100202C010020EFBEADDEC9CD0000A4 +:10648000E4000020040000201D481E497047FFF76B +:10649000FBFFEAF753FE00BD01200007C06AC0B24F +:1064A000FF2804D1184819490968884202D01848C1 +:1064B00018490160184819490968884203D1184AE7 +:1064C00013605B68184700BD20BFFDE71248134901 +:1064D000096888420ED1134B18680B498842F3D0E3 +:1064E00080F308881049884204DD104802680221C0 +:1064F0000A4302600E4880470E4880470E48004716 +:106500000015002000150020FFFFFFFF0010001005 +:106510002C050040080000000010000000000020D2 +:10652000040000200080010000200020240500401D +:10653000DFCD000099640100156401001348704527 +:1065400002D1EFF3098101E0EFF308818869023895 +:106550000078102814DB202810DB2B280BDB0C4ADA +:1065600012680C4B9A4203D1602804DB0A4A104798 +:10657000022008607047094A10470000084A104787 +:10658000084A12682C32126810470000FDFFFFFF16 +:1065900078000020BEBAFECAAD1200003D4E0100D8 +:1065A000BF4D0100040000200D4B0E4908470E4B63 +:1065B0000C4908470D4B0B4908470D4B0949084743 +:1065C0000C4B084908470C4B064908470B4B05493B +:1065D00008470B4B034908470A4B0249084700008C +:1065E00079250000192200009D2B00003F2A0000A1 +:1065F000ED2900009F270000B912000013140000CD +:10660000012B00000F23000030B47446641E25786F +:10661000641CAB4200D21D46635D5B00E31830BCD6 +:10662000184703B5684600784006400E401C884273 +:1066300005D269460878401CC0B208700CBD684697 +:106640000078000601D500200CBD80200CBD414023 +:10665000802901D0002070470120704737B50878A5 +:106660000C4669460978884206D020781146FFF723 +:10667000D8FF207001203EBD00203EBD37B5044646 +:106680000078154669460979FFF7E1FF002801D037 +:1066900000203EBD20782946FFF7C3FF207001206F +:1066A0003EBD0FB568460179007881420AD0684640 +:1066B000007922214006400E4843801818600120CE +:1066C00004B000BD0020FBE77FB5684601791C4699 +:1066D00015460078FFF7BBFF002802D0002004B069 +:1066E00070BD6846007822214006400E484340199C +:1066F00020600120F3E70000FFFFFFFF0000FFFF25 +:106700000100030000000100000000000000000084 +:1067100000000000000000008700000000000000F2 +:10672000000000000000000000000001020304005F +:106730000D0E0F100000000033690000516B0000C7 +:10674000196C0000736C0000C76C00002F6D000016 +:106750008D690000456A0000D16D0000DF790000FE +:10676000100110013A0200001A02000004013C006E +:10677000230044000E0001020408102040805555FB +:1067800055D6BE898E0000007006120DB4130000AD +:1067900014035A06A00900006004F208840DF401F5 +:1067A000FA00960064004B0032001E001400000046 +:1067B000E067010008000020100000000411000044 +:1067C000F0670100180000202801000004110000FB +:1067D0001869010040010020C013000020110000D2 +:1067E0000249022208681042FCD0704700E200E033 +:1067F0000000000000000000000000000000000099 +:106800000000000000000000000000000000000088 +:106810000000000000000000000000000000000078 +:10682000000000000100010054000020FB349B5FC9 +:106830008000008000100000000000000000000048 +:106840000000000000000000000000000000000048 +:106850000000000001000000000000000000000037 +:106860000000000000000000000000000000000028 +:106870000000000000000000000000000000000018 +:106880000000000000000000000000000000000008 +:1068900000000000000000000000000000000000F8 +:1068A00000000000000000000000000000000000E8 +:1068B00000000000000000000000000000000000D8 +:1068C00000000000000000000000000000000000C8 +:1068D00000000000000000000000000000000000B8 +:1068E00000000000000000000000000000000000A8 +:1068F0000000000000000000000000000000000098 +:106900000000000000000000196401000000000009 +:0869100000000000000000007F +:108000000040002069410200A5410200A741020092 +:108010000000000000000000000000000000000060 +:10802000000000000000000000000000A941020064 +:108030000000000000000000AB410200AD41020062 +:10804000AF41020025DD010059440200AF410200AA +:10805000AF4102000000000065450200AF41020090 +:10806000AF41020001420200E1480200AF410200BC +:10807000AF410200AF410200AF410200AF41020038 +:10808000AF410200AF410200AF410200AF41020028 +:10809000AF4102008D3B0200213D0200AF410200D2 +:1080A000AF410200AF4102000000000000000000EC +:1080B00000000000000000000000000000000000C0 +:1080C000054B0648033310B51B1A062B03D9044B86 +:1080D000002B00D0984710BDC8200020C8200020E9 +:1080E000000000000648074910B5091A8910CB0F97 +:1080F0005918491003D0044B002B00D0984710BDED +:10810000C8200020C82000200000000010B5074C47 +:108110002378002B09D1FFF7D3FF054B002B02D0AA +:10812000044800E000BF0123237010BDE0200020C0 +:10813000000000006C510300094B10B5002B03D068 +:108140000849094800E000BF08480368002B02D135 +:10815000FFF7C8FF10BD064B002BF9D09847F7E793 +:1081600000000000E42000206C510300C820002023 +:1081700000000000164B002B00D1144B9D464022FE +:1081800092029A1A924600218B460F461348144ACF +:10819000121A1AF089FE0F4B002B00D098470E4B95 +:1081A000002B00D098470020002104000D000D484E +:1081B000002802D00C4800E000BF14F0DFFF2000D0 +:1081C00029001AF008FC14F0C3FFC04600000800A4 +:1081D000004000200000000000000000C820002037 +:1081E000B8290020000000000000000010B50400C5 +:1081F000034B41600360080017F0A2FB200010BD94 +:108200006835030070B50500082002F0C3F8041EAD +:1082100005D0044B45600360280017F091FB200057 +:1082200070BDC046683503001FB50C00416803A847 +:1082300003F002FC002362420193009303A9034868 +:1082400004F0C8FE03A817F0F2F91FBDC4220020F5 +:1082500030B585B00C00416803A8150003F0ECFBB5 +:1082600000236242009303A90195044804F0B2FE82 +:1082700003A817F0DCF905B030BDC046C4220020C9 +:1082800030B585B00D00416802A8140003F0D4FB9E +:1082900002A903A817F0D8F900230193FF3B22009D +:1082A00003A9009305482B0004F050FF03A817F022 +:1082B000BEF902A817F0BBF905B030BDC4220020FA +:1082C00010B50AB2FF2301B2014803F0CDFB10BD87 +:1082D00038230020F8B5FF2304000D00161E9E422F +:1082E0000CDC00239A4209DDFF339A4206D0094F85 +:1082F000380018F0D5F8012807D133002AB2DBB2D4 +:1083000021B2054803F0B0FBF8BD0121380018F098 +:10831000A9F8F2E7C42200203823002010B50AB2E1 +:10832000002301B2014803F09FFB10BD3823002059 +:1083300010B50AB201B2034803F0ACFBC317181A18 +:10834000C00F10BD3823002010B5024818F0AAF85D +:1083500010BDC046C422002010B50100014804F041 +:1083600023FF10BDC422002010B5024804F07AFD9E +:1083700010BDC046C422002010B5C1B2014818F09B +:1083800071F810BDC422002010B5024818F088F81A +:1083900010BDC046C4220020030010B50448002BC5 +:1083A00002D018F0C3F801E018F0C5F810BDC046BF +:1083B000C422002037B50C4901A818F0C6F801A85E +:1083C00003F04AFB050001A817F031F9082001F07D +:1083D000E1FF041E02D02900FFF708FF280017F074 +:1083E000B9FA20003EBDC046C4220020F8B5040002 +:1083F0000E00082809D1E425134F6D007859036851 +:10840000DB699847022819DD03E00300093B012BD3 +:1084100006D93200102321001B2002F085FAF8BD96 +:10842000E425094F6D0078590368DB6998470528F2 +:10843000EFDC7859082103689B6903E0042178592F +:1084400003689B699847E4E7D4210020E423064AA7 +:108450005B0010B50400D05817F07BFB001B4342B3 +:108460005841C0B210BDC046D4210020030010B551 +:108470000948012B02D0022B03D1084817F077FBE3 +:1084800005E000201A2B05D1054818F07CFB431E9F +:108490009841C0B210BDC0463C2300206423002098 +:1084A0008C230020F7B5E422214B5200985817F096 +:1084B00021FB0FF0DBFEE4221D4B52000400985814 +:1084C0000D0017F01EFB0FF0D1FEE422184B5200F6 +:1084D000060098580F0017F01BFB0FF0C7FE220094 +:1084E000009001912B00200029000FF09BF8320032 +:1084F0003B0004000D00300039000FF093F802003B +:108500000B00200029000EF03DF9009A019B0D00A0 +:108510000400190010000FF085F802000B00200085 +:1085200029000EF02FF911F08FFB0FF069FEFEBD50 +:10853000D4210020030010B50020032B1BD8180005 +:108540000CF04AFF02091017E4230B4A5B00D058D5 +:1085500017F0D0FA0FE0E423074A5B00D05817F079 +:10856000D0FA08E0E423044A5B00D05817F0D0FAB0 +:1085700001E0FFF797FF10BDD421002010B502489D +:1085800017F0EFFF10BDC046C4220020E62310B54F +:10859000024A5B00D05804F0BFF810BDD42100207F +:1085A00010B5024818F011FD10BDC046B4230020DC +:1085B00010B5002808D001280DD1E423074A5B003C +:1085C000D05803F00FFE07E0E423044A5B00D058C4 +:1085D00003F0F2FD00E0002010BDC046D4210020D1 +:1085E00070B5E624134D64000600285917F02CFBE3 +:1085F000002802D1285903F091FF0020032E17D83C +:1086000030000CF0E9FE02060A0E285917F08FFB25 +:108610000AE0285917F092FB06E0285917F095FB5D +:1086200002E0285917F046FBFA2189000CF068FF98 +:1086300070BDC046D4210020E62310B5024A5B007D +:10864000D05803F06BFF10BDD4210020E423044A6E +:108650005B0010B50100D05802689269904710BDC8 +:10866000D421002013B50423C25E811D684603F0A7 +:1086700085F902236A4601A8084905F09FFF019881 +:108680000223C15E043015F009FA040001A816F0B7 +:1086900011FF684616F00EFF200016BDD8210020FD +:1086A00013B50E4C200018F090FB021E05D10100FE +:1086B0000B4815F0F3F904000EE00023210001A897 +:1086C00018F0C6FB01980223C15E043015F0E6F9EC +:1086D000040001A816F0EEFE200016BDD8210020EF +:1086E000184E030037B50D000423C25E811D01A89A +:1086F00003F044F9094C01A90022200005F090FD87 +:1087000001A816F0D7FE2A0010230121202002F034 +:108710000BF90021200005F0CFFE37BDD821002045 +:1087200007B500280DD00423C25E811D01A803F007 +:1087300025F9022201A9034818F081FB01A816F0CF +:10874000B9FE07BDD821002010B5002806D00100D1 +:10875000426808310223024805F03EFE10BDC046C3 +:10876000D821002070B5051E00DC4025290000201E +:1087700000F0CEF8060008364268310004000223FB +:10878000054805F0BBFE0100854203D0300000F033 +:10879000BFF80400200070BDD82100200C4B10B59C +:1087A0000C00984206D00B4B984207D119230B704E +:1087B000183B0AE018230B70173B06E000F09EFF01 +:1087C000031E02D0837B23700123180010BDC04616 +:1087D000E9030000EA030000F0B585B002AB9E1D7E +:1087E0000F0031000192FFF7D9FF0C4C002807D091 +:1087F00002ABDD1D29003800FFF7D0FF002805D1AE +:108800000199200005F08CFC05B0F0BD002200218C +:10881000AA567156200005F0D5FFF1E7D8210020B7 +:1088200010B5064C19221821200005F0CBFFE121DC +:108830002000490205F074FC10BDC046D82100207C +:1088400010B50100014805F0A1FF10BDD82100209E +:1088500010B50100014805F01FFD10BDD821002012 +:1088600010B5034B0A000100186815F008F910BD97 +:10887000FC200020F7B50700134E009135680192E7 +:10888000002D0BD06B68BB4203D1AB68009A9342BA +:1088900001D02D68F4E7019BEB6014E010201AF082 +:1088A000AEFA0400102229001AF0FEFA2000336804 +:1088B0000C302360009B0121A360019B6760E36093 +:1088C00001F03AFE3460F7BDFC20002070B50600D0 +:1088D0000D1E02DA1AF028FB05000B48002D12D0FD +:1088E000E81D01F057FD041E01D0084B0360A58070 +:1088F000002E04D0A01D2A0031001AF0B7FA002380 +:1089000020006519AB7170BD1C360300B036030042 +:1089100070B506000D1E0B4813DD0800083001F08D +:1089200039FD041E01D0084B03602000656008304B +:108930002A00311E02D01AF099FA01E01AF0B4FAB6 +:10894000200070BDE0350300EC350300014B1860DA +:108950007047C04604200020F7B5050001260F49E6 +:108960000B6801912C000020DF0FBC4661469F0977 +:108970004F405F4019095A084F409B087B405340C5 +:10898000DB0713431A004000324010436408EBD168 +:108990008542E7D3019A1360FEBDC0460420002043 +:1089A000004870471C360300F7B504000D0000288E +:1089B0000AD0154B002922D008009C4223D0124B2C +:1089C00020009D4204D11EE0104C0029F7D1250063 +:1089D000A688AF880020F119FFF778FF030006335F +:1089E0000090A11D3200180001931AF03FFA019B7C +:1089F000A91D98193A001AF039FA009803E0034DBE +:108A000028009C42E4D1FEBD1C36030098350300CB +:108A1000F0B5040085B002912378202B01D10134F8 +:108A2000FAE72B3B5A425341E41823782D2B03D10C +:108A300001340022394B01E00022394B00920193AE +:108A40002378302B04D1202263781343782B03D072 +:108A50000025002600272BE010220299200014F0A8 +:108A600093FC0FF003FC009A019B4DE01A00303A92 +:108A70000392092A20D800222A4B300039000EF038 +:108A8000D1FD06000F0003980FF0F0FB32003B0011 +:108A90000DF078FE06000F00002D08D00098019917 +:108AA0000022204B0EF09AF900900191012501342B +:108AB0002378002BDAD10EE0002D01D12E2BF5D03A +:108AC00020229343452B06D02378202B01D101345B +:108AD000FAE7002B1ED1009801993B0032000EF0FE +:108AE000A1FD237806000F00002B10D00A22029966 +:108AF000601C14F049FC0B49020000200CF084FEBD +:108B000002000B00300039000EF08CFD04E0029BE7 +:108B10001C6001E00020044905B0F0BD0000F0BF7A +:108B20000000F03F000024400000F87F70B50B000B +:108B300004000D48002A15DDA588002903DA6B180A +:108B4000D943C9170B40E91A8A4203DB06480029BA +:108B500001DC07E0110000209D4201D90634E01835 +:108B6000FFF7B4FE70BDC0461C36030070B50A00A6 +:108B700005000C000600002902D10120002D4CD078 +:108B8000630026495B0D59181D2908D91E2931D1CA +:108B9000002E2FD1224B9A422CD122483DE014299D +:108BA0000EDC002E26D120481B182000984021D131 +:108BB0008020E302000618431F23591AC84010E022 +:108BC0001A481B182800984014D18020E3020006A0 +:108BD00018431F235B1AD8403423591A2B00CB406B +:108BE00018430123002A02DA4042984000E0400086 +:108BF000184312D123002A00280021000FF0E0FAC8 +:108C000003000E20002B08D1023801F0C3FB00281E +:108C100001D0074B03604560846070BD01FCFFFF1D +:108C20000000D0C1010000800DFCFFFFEDFBFFFF45 +:108C300040360300F0B5851D85B0060003A9280065 +:108C4000FFF7E6FE0400B088039B28180F0083425C +:108C50003AD10022002320000CF04EFD002835D12F +:108C600001236A46D37101227E00760852421A4BD4 +:108C7000200031000FF0A4FA00280AD10122164B7F +:108C80005242200031000CF051FD002801D16B460A +:108C9000D871802300225B032000310001250FF0F2 +:108CA0008FFA002809D1802300225B0320003100C5 +:108CB0000CF028FD002800D1051C01235D406B4607 +:108CC000DB79EDB2AB4201D30024044F2000390020 +:108CD000FFF74CFF05B0F0BDFFFFEF7F0000F87F0E +:108CE00010B514F059FF041E05480E2C07D0E307F9 +:108CF00002D4044801F024FD601014F0D3FE10BD2E +:108D00001C36030071030000064B10B5984203D8CF +:108D100001234000184303E00FF0EAFAFFF726FFB3 +:108D200010BDC046FFFFFF3FF0B5002385B0140023 +:108D3000002206000D000CF0E5FC002805D02D23D4 +:108D4000237080231B06ED1801340022002330001D +:108D500029000CF0D1FC002802D0302323707BE0E6 +:108D60003000290010F076FE0FF04AFA3C4A070066 +:108D70003C4B300029000CF0E3FC00281AD03A4AA2 +:108D80003A4B300029000CF0BDFC002812D0002F17 +:108D900020DD3A00002036490CF036FD0B000200C1 +:108DA000290030000EF01AF87B1C06000D0001931C +:108DB000012712E03A0000202D490CF025FD0B00A0 +:108DC0000200290030000EF009F8012306000D0012 +:108DD000019302E001231F00019300230293290065 +:108DE00030000FF00DFA03003033237003900FF0C2 +:108DF0003DFA02000B00300029000EF08DFE1C4BE6 +:108E000000220EF00FFC019B0600013B0D000193B8 +:108E1000002B01D0013402E02E2363700234039B47 +:108E2000029A1343DAD0130001330293102BD6DDDC +:108E3000019B002BD3DC013C2378302BFBD02E3B55 +:108E40005A425341E41A012F06D06523A11C6370D6 +:108E5000380001F061FF01E00023637005B0F0BD50 +:108E60008DEDB5A0F7C6B03E50EFE2D6E41A4B4404 +:108E700000002440012070B54042FFF76DFD040062 +:108E80000D48FFF769FD060020000FF031FA0022BF +:108E90000A4B0EF0C7FB040030000D000FF028FA5B +:108EA000074A084B0DF09AFF02000B002000290032 +:108EB0000DF068FC70BDC046FFFFFF000000F03DF4 +:108EC0000000E0DFFFFF6F43024B1B68588CC000BF +:108ED0007047C046B0210020134B70B51B680600D8 +:108EE0005A6A0D00002399005458B44203D101334B +:108EF0009B009B5816E0002C01D00233F3E714F0DE +:108F0000A8FE2B0000280DD023009A00825896421C +:108F100003D101339B001B5804E0002A01D0023327 +:108F2000F3E72B00180070BDB021002070B50500DC +:108F30000C00160000290CDB8388994209DAA40092 +:108F40002C19E368002B09D00B21064815F0B5FF5A +:108F500004E00A21034815F0B0FFF0E72800E660BE +:108F600070BDC04686030000031E03D0024A904233 +:108F700000D10023180070471C3603001C4BF7B5C6 +:108F80001B680600DA6A131D0193136852685D1EA0 +:108F9000904215D3174A9B18019A9B009B58984200 +:108FA0000ED8002358194008019982005258964261 +:108FB0001CD003D9431C9D42F4D216E0451EFAE7AB +:108FC00000277C196408019AA3003100985814F016 +:108FD00073FD002801D1200008E0002803DA671C97 +:108FE000AF42EED901E0651EFAE70020FEBDC046A3 +:108FF000B0210020FFFFFF3F044B10B51B6801317B +:10900000DB6A8900C95814F045FE10BDB02100206C +:10901000044B10B51B680131DB6A8900C95814F094 +:1090200048FE10BDB0210020014B18687047C046B3 +:10903000AC21002010B5040014F019FD002808D060 +:10904000201E1CD0012302201C4218D10E2C09D155 +:1090500015E00122236804209343DA78F92A0ED11F +:1090600098780CE01800422C09D018000A2C06D081 +:109070000420062C03D0024801F062FB042010BD3E +:109080002103000010B5041E0E2C19D0002817D0A3 +:1090900014F0EDFC002805D0200000F017F80FF0C8 +:1090A000E5F80FE02000FFF7C5FF022802D1606855 +:1090B000A16807E0032803D12000FFF7BBFDE2E72A +:1090C0000020014910BDC0460000F87FF7B501241B +:1090D000204201D020415CE0830703D58011431E6C +:1090E000984156E0002801D1002052E0FFF7CAFF66 +:1090F0006B46060001224D006D080F00DC715242E4 +:10910000244B300029000FF05BF800280AD101221F +:10911000204B5242300029000CF008FB002801D1FE +:109120006B46D871802300225B03300029000124A4 +:109130000FF046F8002809D1802300225B0330009D +:1091400029000CF0DFFA002800D1041C01235C4048 +:109150006B46DB79E4B2A342C6D23000390010F08E +:10916000F5F800220C4B10F085FB002200230400D0 +:109170000D000CF0C7FA002807D0200029000022BB +:10918000054B0DF0FFFA04000D00200029000CF043 +:1091900099FBFEBDFFFFEF7F0000F04110B5FFF728 +:1091A00071FF0022034B0DF0EDFA0FF007FDFFF702 +:1091B000DDFC10BD0000E03F70B5040014F057FC6A +:1091C00000280BD00A2C29D0002C27D00E2C25D01B +:1091D000062C23D0601E441EA04120E02000FFF793 +:1091E00029FF032803D10E4B9C4215D116E002281B +:1091F00012D12000FFF746FF02000B0004000D0013 +:109200000EF0DEFF002809D10022002320002900F3 +:109210000CF072FA002801D1012000E0002070BD9E +:109220001C36030070B590B00400FFF703FF030085 +:109230002000032B55D0022B40D1E30704D560104A +:10924000694601F069FD33E00E2C01D1264848E063 +:109250002000FFF717FF01224E0076080D00524252 +:10926000224B310004000EF0ABFF002813D1012285 +:109270001E4B5242200031000CF04EFA00280AD159 +:1092800000230022200029000CF03CFA031E18489D +:1092900027D1184825E022002B00200029000EF0DD +:1092A0008FFF0028D2D16A4620002900FFF73CFD3D +:1092B000012168464942FFF709FB12E00E48052BE1 +:1092C0000FD00E48002C0CD00D480A2C09D00648AF +:1092D0000E2C06D00B48422C03D00B48062C00D095 +:1092E0000A4810B070BDC046E0360300FFFFEF7FB4 +:1092F000A4350300303603000C370300803603002A +:1093000024360300B435030098350300703603009B +:1093100010B50400FFF78EFE042812D1200014F0CF +:10932000A6FB002810D1012322689A431300DB8A90 +:10933000928A1B041343054A934205D020009847A4 +:1093400002E02000FFF76EFF10BDC0461193010040 +:1093500010B5FFF76FFE05280ED80CF03DF812038C +:109360000507090B08480DE008480BE0084809E02C +:10937000084807E0084805E0084801F0E1F9002046 +:1093800000E0074810BDC046FC360300A0360300CD +:10939000EC36030090360300D035030022030000B2 +:1093A000C035030010B5062805D0FFF743FEF523AE +:1093B0009B00C01800E0024801F0C2F910BDC04691 +:1093C000DD03000070B50400436800205900FFF77A +:1093D0007DFA0F262200094D6168131B0132994264 +:1093E0000ADDD1795B000911695CC3189971D179E3 +:1093F0003140695CD971EFE770BDC0464445030058 +:1094000070B50E00084C094D2369626828001A6087 +:10941000012119F0A0FA3100280019F09CFAE36844 +:1094200062681A6070BDC04600210020182100202B +:10943000F7B50E00134D144C01921F006A682B699A +:1094400003211A60200019F086FA0021200019F08B +:1094500082FA310A200019F07EFAF1B2200019F0E8 +:109460007AFA0026B3B2BB4207D20021200019F0DD +:1094700072FA019B98550136F4E7EB686A681A6046 +:10948000F7BDC0460021002018210020012313B59C +:109490000C4C5B42009316221833152120000AF071 +:1094A000DFFD094A0949200019F0A2FC084C1822E6 +:1094B0000021200019F0F8FC0121200019F00CFB1C +:1094C00013BDC046182100200020002025E802001E +:1094D0000021002070B50E4C200004F06BFC051E2E +:1094E00003D02B2001F092FC0FE00A4E3378002BC2 +:1094F0000BD100F09FFCC1B2200004F047FC062114 +:10950000200004F0B7FB01233370280070BDC04673 +:1095100020250020DE28002030B587B004000D0093 +:10952000FFF7D8FF031E0ED1AAB2A1B202A816F00F +:109530005BF8082204A9684619F098FC029A039B7C +:10954000024817F0F0FB07B030BDC04640250020B0 +:1095500037B5FFF7BFFF002802D00021080014E054 +:109560000B4901A804F038FD0A4C01A9200016F0AF +:10957000B4F901A816F070F9200016F0D1F9050031 +:10958000200016F0D0F901002800FFF7C1F93EBD18 +:10959000382500203421002010B50400FFF79AFF81 +:1095A000002807D1002C05D021006268083102484C +:1095B00004F032FD10BDC0463825002037B5FFF756 +:1095C00089FF011E01D0002010E001A816F076F9F5 +:1095D000074C01A9200016F08FF9050001A816F02C +:1095E0003BF9002DEFD1200016F0A0F93EBDC0469A +:1095F0003421002010B50400FFF76CFF002803D1D0 +:10960000E1B2024804F0C2FB10BDC0462025002094 +:1096100010B50400FFF75EFF002803D121000248C7 +:1096200004F028FB10BDC0462025002010B5054CD5 +:10963000200016F03AF9044A0449200019F0D8FB3A +:1096400010BDC046342100200020002059F802003F +:1096500010B5024B186800F093F910BD38210020B6 +:1096600010B5044C0449206800F0CEF9206800F0E1 +:10967000DDF910BD38210020FFFF000010B5034BBD +:109680000100186800F0C0F910BDC0463821002064 +:1096900010B5024B186800F0E3F910BD3821002026 +:1096A00007B5009313000A0001000248006800F0AB +:1096B0002FFA07BD3821002010B5034B01001868B0 +:1096C00000F092F910BDC0463821002007B5009384 +:1096D00013000A0001000248006815F09FFA07BD58 +:1096E0003821002007B5009313000A00010002484A +:1096F000006800F057FA07BD38210020C31F002082 +:10970000122B02D8014A9B0098587047203703005B +:10971000014B98687047C046C820002010B50C0067 +:10972000FFF7ECFF002805D0FA22034BD2002100FE +:1097300004F0D6F910BDC046DC05000010B5FFF7F7 +:10974000DDFF014B186010BD4021002070B5154CA5 +:10975000060023680D00002B02D10720FFF7EEFF63 +:10976000002E04DC0021206804F028F90CE08021A0 +:109770002068890004F022F931000B480BF0C0FE8C +:109780000100206804F0D8F9002D09DD280001F05F +:10979000A9FE0021206804F011F9052019F014FA3F +:1097A00070BDC0464021002040420F00F7B50400C4 +:1097B00008000E00170015F0EEF8020005000097F3 +:1097C000330008326100024803F0F8FC2800FEBDB7 +:1097D0008C220020130007B50A00400000934B685C +:1097E00008320100014803F0F9FC0EBD8C22002074 +:1097F00037B5094C2368002B0CD11C2019F0FFFA57 +:10980000012305005B4200931622183315210AF04C +:1098100027FC256020683EBD3C210020F0B5164C99 +:109820000700206885B00D001600002804D00368EA +:109830009B689847002323603800FFF75FFF837B16 +:1098400028000393FFF75AFF857B3000FFF756FF90 +:10985000867B1C2019F0D3FA694607000120097B9A +:109860004042009073B26AB249B238000AF0F8FB85 +:10987000276005B0F0BDC0463C21002010B5074C64 +:109880000022200008210AF027FC054920000AF0E8 +:109890002FFC044BDA685B68136010BD4421002084 +:1098A00040420F006021002010B50A4C6420E3689C +:1098B00062681A6019F088F92369626864201A6086 +:1098C00019F082F9E368626864201A6019F07CF983 +:1098D00010BDC04678210020074B10B51A695B689F +:1098E000064C13606268236905481A6019F033F862 +:1098F000E36862681A6010BD942100206021002096 +:1099000044210020074B10B5DA685B68064C1360F1 +:109910006268236905481A6019F01DF8E3686268F7 +:109920001A6010BD942100206021002044210020F5 +:10993000F7B50E0000270F4B0192DA685B680E4CFA +:109940001360626823691A600B0A0093019B9F42AF +:109950000BD00A4D0099280018F0FDFFFF212800C8 +:10996000314018F0F8FF0137F0E7E36862681A60E9 +:10997000F7BDC04694210020602100204421002032 +:10998000012330B55B428BB01622040000931521F1 +:10999000183303A80AF064FB002103A818F0DBFFCA +:1099A0000F4D104928000BF0F9F8FE212800890519 +:1099B0000BF086F82000FFF761FF2000FFF774FF2F +:1099C000200015F031F811212000FFF785FF7820E5 +:1099D00019F0FAF829212000FFF77EFF0BB030BD07 +:1099E000DF2800200AD7A33C10B508000CF044FE85 +:1099F00003490CF0BBF9011C02480BF061F810BDE3 +:109A000000002041DF28002037B5A02300220D00F0 +:109A1000040000931100203B15F0B0F82900024A21 +:109A20002000FFF785FF37BD44520000F8B5A0269F +:109A300005000024360227004137FF372100FF22AE +:109A4000280014F0DBFF611C044A2800023414F0E3 +:109A5000D5FFBC42F2D1B442EDD1F8BDFFFF00000A +:109A6000A022F0B5244C9200A5440400FF2104A8D4 +:109A700019F01AFA214D40212868FFF7C1FC802314 +:109A800000222000002400931100203315F076F806 +:109A90000395A023092503989B0004AA21000068D0 +:109AA000FFF7C6FC164B174EDA685B6813607268E6 +:109AB00033691A6002ABED18134F6B1E197838002A +:109AC00018F049FF2978380018F045FF0F4B02AA1B +:109AD00002359B189D42EFD1F36872681A60A0238B +:109AE0009B00E418A023A4B21B029C42D1D1A52361 +:109AF0009B009D44F0BDC0466CFDFFFF90210020FF +:109B000094210020602100204421002089020000CF +:109B1000F0B587B00C001E005B1A694615005A1C90 +:109B200002AF5200BB60D31DDB08DB00CB1A9D46A1 +:109B300002AB7860FF211800FB6019F0B5F9BB6A31 +:109B40002A00009321003300786815F017F8BB6AEB +:109B50009D421DD20026104BFC68DA685B681360DA +:109B60000E4B1A695B681360BB689E420AD021786D +:109B70000B4818F0F0FE6178094818F0ECFE013649 +:109B80000234F1E7054B0135DA685B681360DEE704 +:109B9000BD4605B0F0BDC0469421002060210020E4 +:109BA00044210020F7B50F4D0700ED1813001400F5 +:109BB0000C33019100930026802232412B781A4207 +:109BC00006D0019B220099193800089B15F00FF868 +:109BD0000136072EF0D1009B013401359C42EAD1B9 +:109BE000F7BDC04655450300012313B50F4C5B423A +:109BF000009316221833152120000AF031FA0C4A7E +:109C00000C49200019F0F4F812210B4814F0E9FE79 +:109C100014210A4814F0E5FE1021094814F0E1FE71 +:109C2000022108480AF0ECFE13BDC0464421002082 +:109C30000020002025E80200782100209421002047 +:109C400060210020DF280020024B40001B6818180C +:109C50007047C046B0210020030010B50420002B3F +:109C600011D058003F2B0EDD074A934205DC05203A +:109C7000032158430BF044FC05E0581C034BFF3014 +:109C8000984200D9024810BDFF010000FEFF00000D +:109C9000FFFF0000012370B50A6805009A4313898D +:109CA0000E00042B02D00D4800F04AFD3000002DBC +:109CB00012D0A8000C3000F06DFB041E01D0084B40 +:109CC00003602000B368AAB2A580A36092000C30A4 +:109CD000002119F0E9F8200070BDC046850300009E +:109CE0009C3703000B4B026970B505009A4203D004 +:109CF000E220800000F024FD288800F04BFB041EC9 +:109D000000D005602A88201D043A002119F0CCF803 +:109D1000200070BD23ED02001C4BF7B505000E1EA0 +:109D20009E4232D8C488A14223D92000FFF794FF75 +:109D3000071EB74200DA3700B80001F0E5FCA300C7 +:109D400000900193002C03D01A00296819F08EF8B6 +:109D50000099019B8C463A1B634418009200002135 +:109D600019F0A2F8286801F005FD009BEF802B6038 +:109D70000AE08288914207D22B68521A880092002A +:109D80001818002119F090F8AE80F7BDFFFF000011 +:109D9000084B70B505000C001600994208D883885E +:109DA000994202D30131FFF7B7FF2B68A400E650B8 +:109DB00070BDC046FEFF0000C38870B505000C00F2 +:109DC00016008B4206D8084B99420BD8013189B254 +:109DD00014F0C8FF2A68A3009E50AB889C4201D3B0 +:109DE0000134AC8070BDC046FEFF0000034B036031 +:109DF00000234360038143817047C0466C370300F2 +:109E0000024B0360002343607047C046CC37030019 +:109E1000044B03600023436003814381C3600382DA +:109E200043827047FC370300014B1B681869704779 +:109E3000B0210020014B1B6898697047B0210020B9 +:109E4000014B1B68188C7047B0210020F8B50268E0 +:109E5000164B06009A4200D0FEE74368144D188C5A +:109E60002B60800015F0B0F804002B68114F1A8C9D +:109E700000219200386019F017F827602C680E4B0B +:109E800022689A4203D1B36822699A4200D0FEE761 +:109E900000F08EFC2B6820001C6B002340301A0061 +:109EA0001900A04715F016F9F8BDC0461042000091 +:109EB000B0210020AC210020708E3B9210B50248EA +:109EC000FFF7C4FF10BDC0466030030070B5060048 +:109ED0000C2000F05FFA041E05D00D4B0360002338 +:109EE000436003814381300014F0FBFE094B98422C +:109EF0000BD13589002D08D0201D290014F05EFFFC +:109F0000AA007168606818F0B1FF200070BDC046FB +:109F10006C370300FC370300014B58887047C0467C +:109F2000C8200020014B98687047C046C820002018 +:109F3000074B1B68002B09D01A0008328242F8D860 +:109F4000596852189042F4D2012000E0180070477E +:109F5000BC210020032370B5046805009C43A30FB7 +:109F6000002C03D10C4800F0EBFB04E0002B02D0E6 +:109F70002503AD0B03E02800E36998470500002D99 +:109F800003D0F62D05D9002C03DBD420800000F08F +:109F9000D7FB280070BDC04651030000104A70B5C1 +:109FA00091880600013910688B00C3180D0010005D +:109FB0006A1C0FD01C00043B5A68B24208D18D4283 +:109FC00002D114F0C1FE09E014F0BEFE206005E0ED +:109FD000013DEDE7D220800000F0B2FB70BDC0462D +:109FE000B4210020FA2010B5800001F08DFBF82389 +:109FF0009B0043600F4B83600F4B1A68C2600200E6 +:10A0000008321A6000230D4A83611368002B01D0C7 +:10A01000984205D20360106007E0904203D313001A +:10A020001A68002AF9D1026018600130044BFF3031 +:10A03000186010BDE0030080D0210020BC2100206A +:10A04000C421002010B5041F2368DB0702D508488F +:10A0500000F076FB2000FFF76BFF002802D10448D8 +:10A0600000F06EFB012322681343236010BDC0463D +:10A070004F03000010B5040014F05FFF002816D154 +:10A0800023680B4A134212D1DB78F92B0FD1200041 +:10A09000FFF74EFF002802D1064800F051FB0123D4 +:10A0A0002268210013432360034814F051FF10BDC0 +:10A0B000030000404F030000C8210020F8B506004F +:10A0C0000F000025BD421FD0AB00F458200014F053 +:10A0D00034FF002816D123680C4A134212D1DB78D2 +:10A0E000F92B0FD12000FFF723FF002802D10848E9 +:10A0F00000F026FB0123226821001343236005485A +:10A1000014F026FF0135DDE7F8BDC046030000402E +:10A110004F030000C821002010B5040014F00DFF0B +:10A12000002827D12368144A134223D1DB78F92B66 +:10A1300020D12000FFF7FCFE002802D10F4800F0DC +:10A14000FFFA012223681A432260032293439B698A +:10A15000002B01D020009847032409488388002B56 +:10A1600008D014F0F1FD0368A3439B69002BF4D0E1 +:10A170009847F2E710BDC046030000404F030000BF +:10A18000C8210020F0B56F4C87B0237806009B07EC +:10A1900003D5D220800000F0D3FA022223780125D3 +:10A1A000134323700024684B1A689F880192A742CA +:10A1B0000ED9019AA300D058284205D00300AB4322 +:10A1C00058881A8800041043FFF7A6FF0134EEE711 +:10A1D000300000F017FB5D4E3368002B11D05C4B54 +:10A1E0001B685C8DFFF72CFE33680026051BA4005E +:10A1F0001C19B54205D0B300E058FFF78DFF0136BA +:10A20000F7E70024534B1D68534B1E78A64205D92F +:10A21000A300E858FFF780FF0134F7E700231F0091 +:10A220004E4A019313604E4A02931668002E61D085 +:10A230003400736808349B089A00A2180492FF182F +:10A24000049BA34254D901222368134203D11A0F5D +:10A250002500062A1BD10122934323602000FFF72B +:10A2600079FE850065192C00EAE7012213421CD112 +:10A270001A0F062A19D08022D20513420BD02800CB +:10A28000FFF768FE049B80002D18AB420DD92B68A8 +:10A29000002BEADAF3E7DB78F92B02D0314800F043 +:10A2A0004FFA280014F040FDE9E72B1B9B100393A5 +:10A2B000039A019B94466344019393001A00FF2183 +:10A2C0002000059318F0F0FD8023059A1B06134328 +:10A2D0002360039B012BC6DD00236360029B002BE0 +:10A2E00002D11E4B1C6001E0029B5C600294BAE745 +:10A2F00036689BE71C490B68002B13D0019B9C0818 +:10A30000164B1A683300002A0CD010680003800B2B +:10A310001B189C4204D21B1B9B00D3180B6001E04E +:10A320005268F0E70A21019ABB0092004A43934227 +:10A3300001D3FFF757FE0221024A13788B431370B3 +:10A3400007B0F0BDE1280020B4210020AC2100209E +:10A35000B0210020C0210020E2280020D0210020D0 +:10A36000BC21002049030000C421002070B5041F57 +:10A37000236805005B0F032B02D0054800F0E0F9CD +:10A38000802322681B0613432800236070BDC0464B +:10A3900049030000F0B5C31C9B1085B00293F6235F +:10A3A0009B00984202DD162000F0CAF93C4B3D4E5E +:10A3B0005B68DB0569D13378DB0766D4012233782B +:10A3C0001343337000F010FA002805D04368002BC7 +:10A3D00002D1354800F0B4F900270022334B019236 +:10A3E0001D680393002D3FD0002F03D1304B1B6815 +:10A3F0009D423BD8280014F0A0FD002802D02D4833 +:10A4000000F09EF92C68002C02DB2B4800F098F934 +:10A41000029B2403A40BE41A6B6822D40BD0802087 +:10A42000029AA10092000006AA1801431160012CB3 +:10A4300001D053601300019A002A01D0536001E05B +:10A44000039A136000222A60934222D05B689342F1 +:10A450001FD01B0D93421CD1D420800000F070F956 +:10A4600017E001951D00BDE7002F03D10020FFF785 +:10A4700089FE08E0012F02D1FFF7B4FD03E0D320ED +:10A48000800000F05DF90137A7E70C4800F058F9AB +:10A4900094E70122280033789343337005B0F0BD70 +:10A4A00000ED00E0E12800204E030000D021002054 +:10A4B000C4210020510300004B0300009203000060 +:10A4C000184B70B55B6806000D00DB0502D016481E +:10A4D00000F036F900F088F9144B04001D60144BAD +:10A4E000751BAD101D701D0000280AD00C2014F043 +:10A4F0006BFD63680360A3684360E3688360E060AA +:10A500000AE0102014F060FD0A4B04001B68036091 +:10A510000023C36000F070F90023A6602B702000B8 +:10A52000636070BD00ED00E092030000C0210020D8 +:10A53000E2280020AC21002070B50C1E0ED00129AD +:10A5400007DD013C0AD3051D0121FFF7F5FF2800B7 +:10A55000F7E701210143024814F0FAFC70BDC04640 +:10A56000B421002010B5040014F0E7FC002803D14A +:10A570002100024814F0ECFC10BDC046B4210020BC +:10A580000023044A13609380D380034A13609380AE +:10A59000D3807047B4210020C82100201FB50C00D3 +:10A5A000010003A801F048FA002203A90092130059 +:10A5B0000194034802F00EFD03A815F038F81FBD02 +:10A5C000C422002037B50C1E00DC0124124D0028E7 +:10A5D00002D08288002A07D1280015F0B1FF05209B +:10A5E000604300F07FFF15E0012A0DD0811D12B2FB +:10A5F00001A801F0C3F9220001A9280002F046FDDC +:10A6000001A814F057FF05E0052281796243280074 +:10A6100002F0BEFC37BDC046C422002010B502487F +:10A6200015F029F810BDC046382300201FB50C00D6 +:10A63000010003A801F000FA002322000193009317 +:10A6400003A90533034802F081FD03A814F0EFFFCE +:10A650001FBDC046C42200201FB5010002A801F0A2 +:10A66000EBF902A903A814F0EFFF002203A901925D +:10A6700000921300054802F0ADFC03A814F0D7FFC8 +:10A6800002A814F0D4FF05B000BDC046C4220020CB +:10A69000034B10B51B681C6B00231A00A04710BDAC +:10A6A000B0210020044B10B51B681C6B00231A005E +:10A6B0001900A04710BDC046B02100207FB505009D +:10A6C00000902D0C0191029284B2102269460F482D +:10A6D000039318F0CBFB29002000FEF7C1F8060019 +:10A6E000280013F03FFA0500002E03D00100F068A7 +:10A6F000FFF7CEFF00212000FEF7B2F8002803D0BC +:10A700002900C068FFF7C4FF7FBDC046C8200020F5 +:10A7100010B50A00010003480223043003F05CFE78 +:10A7200010BDC046D421002010B50400034B0360C7 +:10A73000403014F0BFFE200010BDC0463438030086 +:10A7400010B50400034818F034FA200000F05EFB56 +:10A7500010BDC046E093040010B500F035FC03487E +:10A7600000F008FCFEF7F2F810BDC046FFFFFF7FC7 +:10A7700010B5041E06D0FFF7F5FE034A210003487A +:10A7800014F093FD10BDC046E9F20200AFF00200E4 +:10A7900010B5041E06D0FFF7E5FE034A210003486A +:10A7A00014F083FD10BDC046A3F00200A5A6010071 +:10A7B00010B5044800F09EF9042000F021FBFFF7DB +:10A7C000CBFF10BDD4210020054B10B51C68FEF74F +:10A7D0007BFB044BE4182018800A800210BDC046A1 +:10A7E000B0210020FF030000024B1B68181E00D0A0 +:10A7F000D86D704758250020014B1B68D8657047FD +:10A8000058250020F0B5264B87B01A680393002A1C +:10A8100005D1012000F078FF059005983BE000206D +:10A8200000F034FC0090800000F06EFF019000F01A +:10A830002DFC009B834203D0CB208000FFF780FFDC +:10A840000027009B9F4225DA019ABB00D458E36D94 +:10A850001E1D002B04D10137F3E7B668002EFAD095 +:10A86000039B35681A68944203D0636CE16B5B1AF2 +:10A87000ED1873680293944205D0E26B636C9B1AE7 +:10A88000029AD3180293029B9D42E6D201CDFFF7B4 +:10A8900043FCF8E7019800F06DFF07B0F0BDC0463B +:10A8A0005825002010B5064C200000F06BF8054A32 +:10A8B0000549200018F09CFA044814F08AFE10BDE7 +:10A8C000D421002000200020D1A80100C8200020B1 +:10A8D000CA23144A9B0010B5C2501C330400C01890 +:10A8E00014F0E8FDD0239B00E01814F0E3FD2000F5 +:10A8F0009130FF3001F08CFC20006930FF3001F016 +:10A9000087FC2000F03002F091F92000D03002F0F6 +:10A9100083FE2000643009F01BFB201DFFF704FFBD +:10A92000200010BDD03C0300F0B585B005000E003E +:10A9300017000393FDF794FF002818D1283018F072 +:10A940005EFA6B4604009B89A9B20093B2B20B4B2E +:10A9500014F04FFD0A482100D03002F0E5FD002838 +:10A9600005D0200014F05CFD200018F05AFA3A00DF +:10A9700031002800FDF77EFF05B0F0BDBDA6010047 +:10A98000D42100201423F0B5040093B019220093C1 +:10A990001821043003F0CEFB230025002600643389 +:10A9A0001800B43513211093B83609F0DDFA2800E9 +:10A9B00016F0B3FA00221E21300015F0E6FD20004B +:10A9C000D03002F049FE2300F033474A0621180038 +:10A9D000119302F04FF920000027012369301A007B +:10A9E00000971121FF3001F08FFC2000913000977B +:10A9F000012302221A21FF3001F086FC2000B93029 +:10AA0000022201211A23FF3002F0E6FE300001F09D +:10AA1000E3F9E4235B00E050300001F0D1FCE623D1 +:10AA20005B00E0500100E42220005200D130119B75 +:10AA3000A2580095FF3002F02DF82000E1302900E7 +:10AA40001C22FF3004F080F8192320000F93013BF3 +:10AA50000E93013B0D93013B0C93013B0B93013B88 +:10AA60000A93013B0993013B0893013B0793013B88 +:10AA70000693013B0593013B0493013B0393013B88 +:10AA80000293013B0193F930013B08220093072117 +:10AA9000013BFF3015F09AFDCA239B00E018290006 +:10AAA00005F012F9D3239B00E0181D2103F0C0F834 +:10AAB000DD239B00E75010982770032117F09FFEBD +:10AAC00023002200200009499C33A0321C60116041 +:10AAD0005760074A80305A610221012209F0F4FDD3 +:10AAE000200013B0F0BDC0463C380300F9F002006E +:10AAF000E5F002000123F0B5057891B007001D4094 +:10AB000000D0DFE00300D0331800049300F0AAFB6C +:10AB100000F05AFA282018F072F90400103014F0EE +:10AB200058FD694B65802380182018F068F90600ED +:10AB3000664B80C603901022290030000E930F95BB +:10AB400018F0B2F908220EA9300018F08FF9604B06 +:10AB5000039AE56053611223A260A38025626562B7 +:10AB60002100049802F0E0FC002805D0200014F039 +:10AB700057FC200018F055F901223B785549134342 +:10AB80003B703B00B4331800059316F0CCF95249E2 +:10AB90000390059816F0C7F900260690642000F08F +:10ABA000A1FC340035003B006933FF3318000793E4 +:10ABB00014F0DDFF002803D1039B002B0DD109E029 +:10ABC00038009130FF3014F0D2FF0028F4D0182D57 +:10ABD00003DDF1E7069B002B70D03800653021B211 +:10ABE000FF2332B2FF3000F03FFF322000F07AFC4A +:10ABF000631CDCB20135052C02D10024731CDEB2CB +:10AC0000039B192D02D0002B02D1CCE7002B03D0DF +:10AC10003049059803F02CFF039818F002F90698C4 +:10AC200018F0FFF82D492E4800F040FDDD239B0071 +:10AC3000FB580893002B38D100F0AEF801000AA8A9 +:10AC400000F08CFE14F0DDFA089014F0DAFA6B468E +:10AC50000990198C0CA814F049FC099B0DA8190C3B +:10AC600014F044FC0DAA0CA90BA814F08FFC0DA83D +:10AC700014F020FC0CA814F01DFCCA200123800055 +:10AC80000BAA0AA900933818049B05F071F80BA8C9 +:10AC900014F010FC0AA814F00DFCCC239B00FB5808 +:10ACA0000893DD23089A9B00FA50CA2339009B00C1 +:10ACB000079AF031F81805F055FA74E70749094882 +:10ACC00000F0F4FC11B0F0BDFD0300006DF10200D6 +:10ACD0002DF10200FF4903000A4A03000020002072 +:10ACE000001C00200800002010B5041E0DD018F034 +:10ACF0001BF9230001382018834208D21A78017802 +:10AD00000138197042700133F6E7024800E0002074 +:10AD100010BDC04617FCFFFFF0B585B001900C1EBA +:10AD200028D00027C217161A56407D1C63190293BB +:10AD30003000013B0A2103930AF0C8FCCB17C91865 +:10AD40005940039B3031197030000A210AF0D8FBBA +:10AD5000061E01D02F00E8E7019B002B03DA2D230C +:10AD6000029ABD1C1370002620006655FFF7BCFF39 +:10AD7000300000E0014805B0F0BDC04617FCFFFF01 +:10AD8000BFF34F8F024A034BDA60BFF34F8FFEE7EA +:10AD90000400FA0500ED00E0F0B58DB005AF192212 +:10ADA0001549380018F062F80022144B05245A7136 +:10ADB00080225205566E01222500019402920393CF +:10ADC000019930000AF098FB080002990AF00EFB86 +:10ADD000019B03996B430193029B361A6B430293C9 +:10ADE000631E2C1B6C433C19225C1C1ECA54E7D109 +:10ADF00008000DB0F0BDC0461A4A0300E328002049 +:10AE0000014B18607047C0464C250020F0B595B046 +:10AE10001822002106000EA818F046F813210EA8EB +:10AE200017F043FE03210EA817F0EAFE01224A4B59 +:10AE300000921B68002B01D0DBB200930123474A2C +:10AE4000002109A809F0D2FE454B9E4200D90026F8 +:10AE500072B6444B1022002105A81D6818F024F892 +:10AE6000414B64213000059305240AF049FB6043FF +:10AE70005030281806900A2130000AF041FB0A21C0 +:10AE80000AF024FC614350316918079130000A210F +:10AE90000AF01CFC4C43210050316C1880260894A9 +:10AEA0000024B601009B002B3CD004AD0027032CEE +:10AEB00002D180260024B6016B682C4A02936300FD +:10AEC0000133D318002201921021581E007801414D +:10AED000039119788C4660460299095C03980142F7 +:10AEE00004D00120904001990143019101320633C1 +:10AEF000092AE9D1019B2A68D9431D4B0901194050 +:10AF0000029B934203D1312F01DC002100E0314349 +:10AF100009A817F0CEFEFA23139A0F99DB001068E8 +:10AF2000014201D1FFF72CFF013B002BF7D1FA239F +:10AF3000013401377600E4B25B009F42B7D104359B +:10AF400008ABAB42B2D1044B1B68002BAAD0009BCC +:10AF5000013BDBB20093A5E74C250020F0FF000089 +:10AF6000E703000008200020694A0300334A030079 +:10AF7000F01F0000F7B500281FDD0126104C421E0F +:10AF80002368019415000020DF0FBC4664469F092A +:10AF900067405F401C09590867409B087B404B4055 +:10AFA000DB070B4319004000314008436D08EBD12B +:10AFB0008242E7D3019A136000E00248FEBDC0461A +:10AFC0005025002017FCFFFFF8B50023144C236028 +:10AFD00014F009F92500002808D00421200014F0FD +:10AFE000FEF800281BD00F4B236018E00122A12798 +:10AFF00004210D4B0D4E1A602368FF000B4A706050 +:10B00000944662465268084C002AFAD0E2591B0264 +:10B01000013913430029F1D12B6001236360F8BD8E +:10B0200050250020ED5EBC0B00D00040FCD000405D +:10B03000F0B585B01F000AAB1B8806000291150011 +:10B040000393002F1AD0282017F0D9FE6B46040076 +:10B050001989039BAAB200933B0014F0CAF9336824 +:10B0600021005B6830009847002808D0200014F0C9 +:10B07000D7F9200017F0D5FE024800E0024805B0DD +:10B08000F0BDC04616FCFFFF17FCFFFF1FB50023F5 +:10B090000190039372B60E4B03A91A6801A814F02D +:10B0A000BCF80C4B03A91A6801A814F0B6F80A4BB7 +:10B0B00003A91A6801A814F0B0F862B6019B002B2E +:10B0C00002D0064A12681A60039B581C05B000BDE6 +:10B0D0008025002078250020742500208825002068 +:10B0E0000B4B70B51C68002C11D0656D00F0F2FBA5 +:10B0F000A36C002903D1834201D92C00F3E720007F +:10B1000014F0BCF80349200014F0A5F8F5E770BD71 +:10B110007825002080250020F0B5040093B0079327 +:10B12000230C0293294B04901C68294B05911E683F +:10B13000069285B20027002E46D0002C30D0636DD9 +:10B1400024480393A36C9AB21B0C99B2854216D182 +:10B150002148824213D1002B04D0029B994201D096 +:10B16000039CEAE7002F01D00127F9E7200014F043 +:10B1700085F81A49200014F06EF80137F0E7002A2C +:10B1800001D09542ECD1002B02D0029B9942E7D12D +:10B19000200014F073F81149200014F05CF8DFE788 +:10B1A0000F4BEB18012B0FD91023029A00932900A3 +:10B1B0000C4B08A814F01DF9336808A99B683000EF +:10B1C000984708A814F02CF913B0F0BD742500209E +:10B1D00084250020FE030000FF03000080250020DE +:10B1E00002FCFFFF19B1010010B572B60B4B1C68D1 +:10B1F000002C03D0200014F041F808E062B6602073 +:10B2000017F0FDFD60220021040017F04DFE002321 +:10B21000034A2000E364E263E36510BD5425002087 +:10B2200000400020094B10B51C68E36CDB070AD511 +:10B23000FFF7DAFF064B1860002804D0E36DC36502 +:10B240000023E3650400200010BDC04658250020FF +:10B250007C250020024B1878012318407047C04617 +:10B26000E9280020F7B50600FFF7F4FF051E33D1EB +:10B270001A4C2660FFF7B8FF194B1A49186013F0F3 +:10B28000EAFFFFF7B1FF184B1860184B4363184BE8 +:10B290008363206800280ED0C027164E2A00330092 +:10B2A00015490097FFF7C4FE009733002A001349A1 +:10B2B0002068FFF7BDFE0C2017F0A1FD002383805E +:10B2C00083710F4B03600F4B836000F01BFB012168 +:10B2D0000D4A13780B431370F7BDC0468425002038 +:10B2E000582500208025002088250020FC3F0020D4 +:10B2F00011F3020019B10100FF030000FE0300007A +:10B300005C380300E1B00100E9280020F7B5060031 +:10B310000D0017000193002801D1002015E000293D +:10B32000FBD0FFF761FF041EF7D0084B019A43637F +:10B33000066045608760064B002A00D0054B200060 +:10B34000A363054913F087FF2000FEBDFC3F0020EA +:10B35000DBF20200F9F2020080250020F8B50500BA +:10B36000EFF30884C36B006C1C1B6B6C1B1A9C42B4 +:10B3700010D91F23084F20343E689C433D600028AD +:10B3800001D000F0F7F9200000F0BEF92864201881 +:10B3900068643E60F8BDC04658250020024B18681E +:10B3A000434258417047C04680250020002310B515 +:10B3B00004499C006258002A01D00133F9E760502B +:10B3C000100010BD5C250020002310B5044A990030 +:10B3D0008C58844201D00133F9E70020885010BD19 +:10B3E0005C25002010B50024074BE058002802D04F +:10B3F00003685B6898470434182CF5D1034B1B682D +:10B40000002B00D120BF10BD5C250020802500202E +:10B41000F8B5FFF71FFF002856D02C4E34683500D2 +:10B42000E36CDA0718D502273B43E364284B1D6819 +:10B430000423EA6C28001343EB64636BEB63FFF7B0 +:10B440008DFF2800696C05F00EFD3068C36C3B422F +:10B450003AD005F042FD37E01E4F1F4E3A68002AF1 +:10B4600001D1326808E0216DB94205D1616D002932 +:10B4700000D11100296000E02A602A6831688A4200 +:10B4800008D11B0706D52C60FFF7ACFF3B68002BEB +:10B49000FAD02B6029688C4216D03368994204D1C7 +:10B4A0000E4B4B630E4B8B6305E09C4203D1002295 +:10B4B0004B6C100006E02000FFF750FF20002968C9 +:10B4C000626C4B6C05F08EFCF8BDC0465825002020 +:10B4D0007C2500208025002088250020FC3F0020BE +:10B4E00011F3020070B50500FFF7B4FE002803D188 +:10B4F000280017F069FB0FE0FFF794FE040000F04E +:10B50000E9F92818A064200013F0B8FE03492000D0 +:10B5100013F0A1FEFFF77CFF70BDC0467825002028 +:10B52000F7B51A4D06002B680F00002B03D0FFF76C +:10B5300091FE002801D1164827E0FFF773FE154B56 +:10B54000041E1B689C4208D0200013F097FE12498D +:10B55000200013F080FEFFF75BFF3B043343A3643E +:10B56000200013F08BFE20000C4913F074FE0C4BEE +:10B570000020F318012B08D9C02300933A00094B8F +:10B5800031002868FFF754FD0020FEBD842500200F +:10B5900016FCFFFF58250020802500207425002080 +:10B5A00002FCFFFF19B1010070B5FFF753FE002840 +:10B5B0001FD0104D286813F061FE00220E4E346833 +:10B5C000002C10D0636D002B0AD1032A08DDA26D78 +:10B5D000206C536500F0CEF8200000F0CBF802E0BC +:10B5E00001321C00ECE73100286813F034FEFFF74D +:10B5F0000FFF70BD5825002054250020F7B5070027 +:10B600000D00002830D0FFF725FE00282ED0194E5F +:10B610003068C36C5B0703D1C36D0193002B06D068 +:10B62000154A2900380013F040FE00241FE00224D0 +:10B6300005F03BFC3268D36C1C4003D003218B43E4 +:10B64000D364F2E701210B43D3642800B847336881 +:10B650000120DA6CDC6511008143D964530706D5FB +:10B66000280013F041FE02E0044C00E0044C2000EE +:10B67000FEBDC04658250020E9F2020017FCFFFF7E +:10B6800016FCFFFF020010B5014B12CB12C210BD19 +:10B690008C250020034A044B12681A607E225A60EF +:10B6A0007047C046082000208C25002070B5124E3F +:10B6B00005003278022A1AD081421AD90C1A072CB6 +:10B6C00017D9080003232843034012D172B60B4850 +:10B6D000D2001550821851608022A408120614432B +:10B6E0002C6032780132327062B6180002E00448F1 +:10B6F00000E0044870BDC046EA28002094250020E0 +:10B7000013FCFFFF17FCFFFF70B5051E24D0134A82 +:10B71000134E13781400002B0CD1124912483370C9 +:10B72000FFF7C4FF114B984202D11E20FFF76EFBBA +:10B7300001232370002433789C4209DA0C49E3008A +:10B74000C918280013F0EAFD002805D10134F2E7FA +:10B750001420FFF75BFB002070BDC046EB280020E3 +:10B76000EA28002000380020B829002017FCFFFF3D +:10B770009425002070B500281FD0104B10491C786C +:10B780000023A34216DADA005558A84210D98A18C5 +:10B79000526890420CD2041F2368002B02DC1E204A +:10B7A000FFF734FB802322681B061343236004E069 +:10B7B0000133E6E71E20FFF729FB70BDEA280020D1 +:10B7C0009425002070B5051E15DD0C4B0C4E1A6833 +:10B7D0001C00002A02D0306817F073F8FA212560A7 +:10B7E00000243068074B89008361C462694317F005 +:10B7F00070F8200000E0044870BDC046D425002049 +:10B80000A4250020B1B8010017FCFFFFF8B5114FC7 +:10B8100006003D68002D0AD1302017F0F0FA040030 +:10B8200008F0C6FB0C4BA5612360E5623C600B4D44 +:10B830002B68002B09D1102017F0E1FA040016F054 +:10B84000C0FF20002C6016F096FF3000FFF7BAFF13 +:10B85000F8BDC046A425002080400300D02500206C +:10B86000014B18687047C046D425002070B50D4CB8 +:10B870002368002B03D00C4B1B68002B02D1062041 +:10B88000FFF7C4FF206816F08DFF02000749C317B9 +:10B890000D684E685219734120680A604B6016F0BB +:10B8A00087FF70BDD0250020A4250020D8200020CF +:10B8B00010B5FFF7DBFF0024054BE058002802D04D +:10B8C00003681B6898470434282CF5D110BDC04686 +:10B8D000A825002010B5FFF7C9FFFA22034B9200FC +:10B8E00018685968002309F06FFF10BDD8200020A8 +:10B8F00010B5FFF7BBFF024B1868596810BDC04672 +:10B90000D82000200B4B10B51B680400002B03D07F +:10B91000094B1B68002B02D10620FFF777FF00239D +:10B92000064A99008858002801D00133F9E78C5065 +:10B9300010BDC046D0250020A4250020A825002049 +:10B94000002310B5044A99008C58844201D0013379 +:10B95000F9E70020885010BDA825002010B504008C +:10B96000002902D00B78002B02D1034B236001E0A9 +:10B9700013F0A7FD200010BD6C380300F8B50500DA +:10B980000E00140000290AD00B78002B07D0002AE3 +:10B9900005D0080097B217F0C7FA874202D90B4BBF +:10B9A0002B6010E0601DFFF7AFFE286013F0C1FFB1 +:10B9B0002868220047803100043017F057FA2B68BE +:10B9C0001C19002323712800F8BDC0466C38030001 +:10B9D000014B03607047C0466C38030010B5054842 +:10B9E000054C206013F0ACFF044A0549200017F015 +:10B9F000FFF910BD6C380300D8250020002000207E +:10BA0000B5F40200084B73B51C680500002C0AD081 +:10BA10000100266808310822684617F027FA0CCD85 +:10BA200031682000884773BDDC250020014B03608E +:10BA30007047C0467438030010B50400002902D1D5 +:10BA4000044B036003E00160080013F079FF20005D +:10BA500010BDC046743803000300024A00681A6033 +:10BA60007047C0467438030030B50468608881426E +:10BA700006DAA588AA4203DA002901DB002A01DAE6 +:10BA8000034804E04243601880188371002030BDF1 +:10BA900017FCFFFF10B500684388994206DA8488D6 +:10BAA000A24203DA002901DB002A01DA034803E09D +:10BAB0005A4343189B18987910BDC04617FCFFFFE6 +:10BAC000F0B5070085B00E001D00002921DD002A19 +:10BAD0001FDD002B1DD00468638803938B4200DDBB +:10BAE0000391A3880293934200DD0292002306345F +:10BAF0000193019B029A93420DDA29002000039AD8 +:10BB000017F0B4F93B68AD195B88E418019B013369 +:10BB1000EEE7024800E0002005B0F0BD17FCFFFF93 +:10BB2000F8B504000D0016001F00002901DB002AF3 +:10BB300002DA0D4B236016E0100048430630FFF791 +:10BB4000E3FD206013F0F5FE23685D809E80002FEA +:10BB500006D03B00320029002000FFF7B1FF02E0D1 +:10BB6000200013F088FDF8BD74380300F7B5050018 +:10BB70000C1E05D000200F0006000190010015E00A +:10BB8000224B03603FE03022524294469C4462467E +:10BB9000092A14D90A2B0DD1019B361801330193C0 +:10BBA000B14200DA31000020060001373B78002B5B +:10BBB000E9D106E00028F8D001360020F5E70120A1 +:10BBC000F3E76A46928809B212B22800FFF7A8FF8D +:10BBD0002B680A26991D01235B422078002812D089 +:10BBE0000200303A092A06D8DA43D21713407343C9 +:10BBF0001B18303B05E0002B03DB0B7001230131E8 +:10BC00005B420134E9E72800FEBDC04674380300FA +:10BC1000F0B5040087B004A815001E000F00FFF760 +:10BC200031FD23685A88954208DA9B88B34205DDC6 +:10BC30001F2F03D9059B00939F4201DD18482DE07B +:10BC4000052300217B430093049B0193009B019AF1 +:10BC5000CB18A03BD35C0022029373189C46531967 +:10BC6000276803937888834202DABB889C4507DB08 +:10BC70000132052AF3D101310529E7D100200DE079 +:10BC8000634658435319FB18102717411B18029895 +:10BC90000740781E87417F429F71E9E707B0F0BDFA +:10BCA00017FCFFFFF7B5036806009C1D5B880D00BD +:10BCB0005A1A0192002918DD0027994202DB13F07D +:10BCC000DAFC14E033689B889F4210DA6119019A0C +:10BCD000200017F0CBF8019B2900E01813F0AEFC10 +:10BCE000336801375B88E418ECE7024800E0002085 +:10BCF000FEBDC04617FCFFFF10B50548054C20608F +:10BD000013F01EFE044A0549200017F071F810BD1B +:10BD100074380300E0250020002000202FF60200E8 +:10BD200010B5054C0121200013F0C8FD034A044959 +:10BD3000200017F05DF810BDE42500200020002051 +:10BD400059F802000388074A10B50120934208D031 +:10BD5000834202D00020DB0703D41E20FFF756F8F1 +:10BD6000002010BDFFFF00000048704716FCFFFFD9 +:10BD700010B53220FFF74AF8004810BD16FCFFFF4F +:10BD80008280142210B5134C028108340200002373 +:10BD90000460416204000221303283718172C36009 +:10BDA000036143618361C36103623634137053706E +:10BDB000227843868A43F1310A408386227002004A +:10BDC00040321370021DD387013343878387C387B3 +:10BDD00010BDC04694380300F0B5544F97B03B688F +:10BDE00006000593002B00D094E006AC0B331C2218 +:10BDF0002121200001F028FD0EAD0B231D22222160 +:10BE00000AA801F021FD0B231B222321280001F0A9 +:10BE10001BFD082016F0F3FF0122059B1100049082 +:10BE200015F003FC3A21300015F023F900281CD04E +:10BE3000A38812ADAB80A3795C20AB713C4B12930D +:10BE4000A3681493237B2B73637B6B73A37BAB730C +:10BE500016F0D5FF04230193363300932A00049B88 +:10BE60003100040003F00AFA53E03221300015F0EB +:10BE70002EF900281CD0A38812ADAB80A3795C20DA +:10BE8000AB712B4B1293A3681493237B2B73637BAF +:10BE90006B73A37BAB7316F0B2FF042301932E33B5 +:10BEA00000932A00049B3100040003F08BFB30E078 +:10BEB0003C21300015F0C6F8002822D0AB8812AC27 +:10BEC000A380AB79A420A371194B1293AB68149390 +:10BED0002B7B23736B7B6373AB7BA37316F08FFF9A +:10BEE000052305000293013B0193383300932200A0 +:10BEF000049B310003F0E0F80E4B3D6044351D60BB +:10BF000008E0442016F07BFF042204990400FFF7A8 +:10BF100037FF3C60074B054C1868002802D02168A9 +:10BF200013F0A5FE206817B0F0BDC046E82500203C +:10BF300084380300EC250020F0B56049C56885B061 +:10BF40008D4206DA030036331A78022313400BD1F0 +:10BF500017E0C82200235200954212DD0300363359 +:10BF60001A78002392070CD4012306001F003636EE +:10BF700032785408A7433C0002279C40BA4322432E +:10BF8000327004698C4205DA0200363212785207A8 +:10BF900009D415E0C8225200944211DD0200363265 +:10BFA000127852070CD406000122363633789F08E7 +:10BFB000BA439700042293431A0001233A43327094 +:10BFC000426901920200019E40328E4205DA010070 +:10BFD0003631097809070AD415E0C821019E4900C5 +:10BFE0008E4210DD01003631097809070BD40600B6 +:10BFF000012136363378DF08B9430827C900BB432F +:10C000000B43337001E0002B18D01378032B15D8A5 +:10C010000133DBB21370012B03D10021031DD9873B +:10C020000CE0042B0AD102000121363213780430CF +:10C030000B4313700023C3870B333CE01378029348 +:10C04000002B1BD006000127011DCB8F3636013394 +:10C050009BB2CB8703963678BC46374008D01D2B61 +:10C060000CD963469E43039B1E700023CB8704E0DC +:10C07000092B03D9029BCF87013B137013F0A2FC5D +:10C080000F4A0723904216D90E49043B8D4212DB1A +:10C09000C8220133920095420DDC023B8C420ADB40 +:10C0A000013B944207DC01980433884203DB0133EF +:10C0B000904200DC0023180005B0F0BD70FEFFFFC9 +:10C0C000FF700200E0FCFFFFF0B5040089B0C0681B +:10C0D0000CF0CCF80090019120690CF0C7F80690A4 +:10C0E000079160690CF0C2F80200029080200006FF +:10C0F0000B180391009801990DF062FA0CF084F985 +:10C10000E0620CF02DF906000F000DF02FF80490FE +:10C110000591300039000CF007FD049A059B0600DC +:10C120000F00009801990BF07DFA32000090019108 +:10C130003B00029803990BF075FA02000B0000987F +:10C1400001990BF0E9FC02000B00069807990DF02D +:10C1500037FA0CF059F90022051C002302980399C4 +:10C1600009F0E4FA002801D1A56219E00021281C99 +:10C1700009F016FB0D4E002801D10D4F00E00D4FC8 +:10C18000281C0CF0EDF802000B00300039000BF019 +:10C19000C3FC32003B000AF0F5FA0CF035F9A0625E +:10C1A0000222A3791343A37109B0F0BDEA2E4454CF +:10C1B000FB21F9BFFB21F93F10B513F0B0FC064994 +:10C1C00009F09EFF0CF0CCF8044A054B0AF006FE7D +:10C1D0000CF016F810BDC0460000B443EA2E4454DB +:10C1E000FB21194010B513F0A7FC064909F088FFA0 +:10C1F0000CF0B6F8044A054B0AF0F0FD0CF000F81C +:10C2000010BDC0460000B443EA2E4454FB2119403F +:10C2100010B50400034B08330360FFF791FB2000C7 +:10C2200010BDC046C838030070B5C369C2681B683A +:10C230008AB00400451D1A4250D0EB7F002B01D07C +:10C24000013BEB77EB7F082B0DD90122A379134239 +:10C2500009D11343A371A188130006A813F0C4F9F0 +:10C26000FFF738FB2062EB7F012B26D80123A27950 +:10C270001A4222D00025A188A571022202A813F03B +:10C28000B3F9A31DDE7F012E17D1FFF723FB2B008F +:10C29000226A801A994100900191019BA188AB42CA +:10C2A00003D1174B009A9A4202D90123042201E0DC +:10C2B0003300032206A813F097F90323A279134051 +:10C2C000012B1AD1FFF706FB0023226A801A99413D +:10C2D000994208D10B4B984205D80EE0EB7F0B2B0F +:10C2E000B0D80133ADE70222A379A1881343A3712B +:10C2F0000332012306A813F077F90AB070BDC046D7 +:10C30000E7030000DB050000F0B5070000250E0084 +:10C3100085B002930AAB1B7808370393104B0400D7 +:10C320000833036001928580857129001822380046 +:10C3300016F0BAFD039A3100380016F0BBFB6B46CD +:10C340006A469B88127AA380A31DE671DA77631D83 +:10C3500025622000DD77FFF7D5FA200005B0F0BD9B +:10C36000C83803000048704716FCFFFF10B53320A3 +:10C37000FEF74CFD004810BD16FCFFFF002310B572 +:10C380000400838083710D48216408302060802080 +:10C39000C000A061E0612062E3602000236163616E +:10C3A0006362A362E36223636363A363E36363641F +:10C3B000110013F022FC200010BDC046E03803003D +:10C3C000F0B5534F97B03B6806000593002B00D0A3 +:10C3D00094E00B331C22212106A80AAC01F034FAA8 +:10C3E0000EAD0B231D222221200001F02DFA0B237C +:10C3F0001B222321280001F027FA082016F0FFFC59 +:10C400000122059B1100049015F00FF91D21300049 +:10C4100014F046FE00281CD0A38812ADAB80A3798F +:10C420006020AB713B4B1293A3681493237B2B7357 +:10C43000637B6B73A37BAB7316F0E1FC0523019365 +:10C44000183300932A00049B3100040002F0EAFF35 +:10C4500053E03C21300014F051FE00281CD0A3888A +:10C4600012ADAB80A3796020AB712A4B1293A36805 +:10C470001493237B2B73637B6B73A37BAB7316F0DB +:10C48000BEFC05230193373300932A00049B31003F +:10C49000040003F039F930E03C21300014F0D2FD03 +:10C4A000002822D0AB8812ACA380AB79A420A37162 +:10C4B000184B1293AB6814932B7B23736B7B6373C2 +:10C4C000AB7BA37316F09BFC052305000293013B95 +:10C4D0000193383300932200049B310002F0ECFDFD +:10C4E0000D4B1D6044353D6008E0482016F087FC88 +:10C4F000052204990400FFF741FF3C60064B1A68CF +:10C50000034B002A01D019684A64186817B0F0BDBF +:10C51000EC25002084380300E82500207FB50426A0 +:10C52000040080793040051E18D123682000DB69A3 +:10C530009847200013F08CFBA37903223343A371A7 +:10C54000A1880123684613F04FF8A37928001A0048 +:10C55000B243A2719B0702D4024800E0024804B033 +:10C5600070BDC04614FCFFFF15FCFFFFF0B50400D2 +:10C570008BB0406C13F0E0FA061C606C13F0CFFA3D +:10C5800002222100051C07A813F073FB08980AF08B +:10C5900073F8041C09980AF06FF80090301C0BF037 +:10C5A000DFFE06000F000CF0E1FD0BF02DFF39005F +:10C5B000019030000CF0B8FA0BF026FF0290281C16 +:10C5C0000BF0CEFE06000F000CF0D0FD0BF01CFFB0 +:10C5D0003900039030000CF0A7FA06000F00009815 +:10C5E000019909F08DFD0299051C201C09F088FDB8 +:10C5F000011C281C09F098FE0BF0B2FE0490059176 +:10C6000007980AF039F83900051C30000BF0FCFEE1 +:10C61000011C281C09F074FD0399051C201C09F05D +:10C620006FFD019909F06CFD011C281C09F028FA26 +:10C630000399041C009809F063FD029909F060FD5C +:10C64000011C201C09F01CFA0BF08AFE049A059BC1 +:10C650000CF0B6FF00220E4B0AF0E4FF0D4A0E4B21 +:10C660000AF0BCFB0BF0D0FE011C0C4809F05CFE8C +:10C670000021041C09F080F8002804D0201C08497F +:10C6800009F0FEF9041C201C09F0D4FF0BB0F0BD2A +:10C6900000807640EA2E4454FB2119400000B44249 +:10C6A0000000B44330B585B00122010001A813F0A9 +:10C6B000E0FA029809F0E0FF0BF052FE04000D00D2 +:10C6C000019809F0D9FF0BF04BFE22002B000CF073 +:10C6D00077FF00220C4B0AF0A5FF0C4A0C4B0AF026 +:10C6E0007DFB0BF091FE0021041C09F045F80028A9 +:10C6F00004D0201C074909F0C3F9041C201C09F0D0 +:10C7000099FF05B030BDC04600806640EA2E445413 +:10C71000FB2109400000B44310B5837904005A0797 +:10C720000DD49B0701D4FFF7F9FE636C2000002BAA +:10C7300002D0FFF71BFF03E0FFF7B4FF00E0014862 +:10C7400010BDC04615FCFFFF82B0F0B50400EBB091 +:10C7500064207193709216F037FA05220EA811002A +:10C7600012F092FF98490FA8FFF700FA00239625D0 +:10C770001A001FA86D001A50C1180C334A608A6055 +:10C78000AB42F8D11922002111A816F08DFBA06848 +:10C7900013F088FE00260990FF21A06800F004FD38 +:10C7A0008A4FA06800F05EFB07960896874A3BB266 +:10C7B000934202D0864A934212DAA06813F0C0FE78 +:10C7C000A568844918A8FFF7C9F8782218A9280095 +:10C7D00000F032FC18A812F06DFE7C4F002606E037 +:10C7E000002F01D00F2E02D1A06800F03BFB0322E6 +:10C7F000089B606801331A40089213F07BF905002A +:10C80000606813F07EF90022734B06929D4210DBA4 +:10C81000013206922A00C8320BDB04220692AA22B9 +:10C820009200954205DC03220692C82D01DC013AF4 +:10C83000069200220492984210DB01230493030025 +:10C84000C8330BDB04230493AA239B00984205DC26 +:10C8500003230493C82801DC013B04930EA812F0C3 +:10C860000AFF002511ABEB5C012B08D15B496B0083 +:10C87000CA185278C95C0EA8FF23FFF7F5F80135F6 +:10C88000192DEFD16B4610229A5E6B460EA8182127 +:10C89000595E089BFFF7E8F83BB2002B01DB0F2E37 +:10C8A00007D90023A068009374301A000EA912F073 +:10C8B000F8FE00230593059B484A5B00995C0698A7 +:10C8C000814227D1D3185B78049A934222D12C223B +:10C8D00006AB9B18059A9B5C012B1BD00C23079A77 +:10C8E000216853431D0000220AA813F0C2F91FAAB1 +:10C8F0002B0094460AAA634423CA23C32C2206AB06 +:10C9000005999B182B3A5A54079B0133DBB20793C6 +:10C91000731CDEB2059B01330593192BCBD1642028 +:10C9200016F052F93B00643B9FB2079B182B00D8CE +:10C930003CE71A001FA918A813F008FC6A461BABB5 +:10C9400023CB23C21B6813601899199A1A9B20687D +:10C9500013F064F9E568002D0CD0214910A8FEF70A +:10C96000FDFF1C2318AA10A9280014F00FFB10A823 +:10C9700012F0A0FDA06813F0E3FD0FA910A8A568B0 +:10C9800012F062FE0022174B009210A901932800BA +:10C99000130000F0D1FA10A812F049FEFA2080002E +:10C9A00016F012F9A06813F0CBFD0999A06800F009 +:10C9B000FBFB0FA812F03BFE0EA812F038FE6BB086 +:10C9C000F0BC08BC02B018477B4C03008C3C000054 +:10C9D000D18AFFFFC04C030058FDFFFF494C030004 +:10C9E000D54C0300DC050000F0B587B001930EAB19 +:10C9F0001B88060003930D9B0D000093019B029280 +:10CA00000C9F002B3DD0002F02D1009BDB0738D5B7 +:10CA1000282016F0F4F90400103012F0DAFD6B460D +:10CA20001B8918202580638016F0E9F90497070018 +:10CA30000500009B10220593019B002108C73800C8 +:10CA400016F032FA082204A9380016F00FFA0E4B3D +:10CA500002226B6100230399E360236263623368FF +:10CA60000A43A560A2805B68210030009847002837 +:10CA700008D0200012F0D4FC200016F0D2F90348B0 +:10CA800000E0034807B0F0BD59FD020016FCFFFFAF +:10CA900017FCFFFF70B58CB08360109B0160426093 +:10CAA000C36004001849180014F03DFA051E14D0A4 +:10CAB00001001C22103105A816F0D8F96A4608AB0F +:10CAC00043CB43C21B68136020680599069A079BF5 +:10CAD00013F0A4F8280016F0A4F90C4B18680028ED +:10CAE0000ED00B4A05AB059200220692C03202928C +:10CAF0006A4622CB22C2230003220521FFF774FFDE +:10CB000020000CB070BDC046D54C0300DC250020D1 +:10CB100049C70100F0B5040085B0637A9C46002B3C +:10CB200003D1200013F02FFB69E0A37A266F019355 +:10CB30001023019AF35600259B1801229A402900E0 +:10CB4000F36802920393039B9D4231DAB368019A22 +:10CB50006B439B1872695B00E77AD3181A78587890 +:10CB6000E379012F04D15F1E3F1A10003A000EE056 +:10CB7000022F05D15F1EBA1A277A013F381A06E044 +:10CB8000032F04D1277A013FBF1A020038005B004F +:10CB90004343606F8218D3189B79634500DD634679 +:10CBA000627B1A4202D00123AB4019430135CAE728 +:10CBB0001123C943F356606C994023691940029BC5 +:10CBC000194316F076F8A37B072B18D8627B581C04 +:10CBD000520062730B499A00A073022B03D8885845 +:10CBE00015F0E7FF99E7084B2000236300236363F8 +:10CBF000064B8958E4622364143015F06AFE05B0D0 +:10CC0000F0BDC0462439030015CB010073010300B9 +:10CC100010B50400044B036015F053FE200007F02C +:10CC2000DDF9200010BDC0468040030010B50400AF +:10CC30000E4B08330360FEF783FE2000743012F0C1 +:10CC4000F6FC2000603012F0F2FC2000583012F0A8 +:10CC500031FC2000503012F02DFC2000044B143029 +:10CC60006361FFF7D5FF200010BDC0460C390300FB +:10CC70006C400300F8B500250400324B8580083372 +:10CC800003608571143016000F0007F091F9200041 +:10CC90002D4BE562636125645030FEF799FE20005C +:10CCA0005830FEF795FE20006030FEF7BFFE2000F2 +:10CCB0000423F25E33682667590009B2743012F01B +:10CCC000E3FC3378226FE37173680126237210232B +:10CCD000E572A572A7802561D356916859188B42D9 +:10CCE00004DA3000984001330543F8E711230120AE +:10CCF000D356D16859188B4206DA02009A40266949 +:10CD0000013332432261F6E7142016F078F82269E5 +:10CD100000212A430123060007F068FFFF22627208 +:10CD2000220000230125483266646573A3732373D0 +:10CD300020001370A366FEF7E5FDA37920002B43C6 +:10CD4000A371F8BD0C3903006C400300F0B5437AC1 +:10CD500085B00400002B03D1200013F014FA66E024 +:10CD60000122837A11009C461023066F0025F3569A +:10CD700003926344994001912900F3680293029B56 +:10CD80009D422CDAB36872696B4363445B00E77AB7 +:10CD9000D3181A785878E379012F04D15F1E3F1A0F +:10CDA00010003A000EE0022F05D15F1EBA1A277A52 +:10CDB000013F381A06E0032F04D1277A013FBF1A3A +:10CDC000020038005B004343606F8218D3189B79E0 +:10CDD000002B02D0039BAB4019430135CFE7112351 +:10CDE000C943F356606C994023691940019B19436C +:10CDF00015F05FFF667AB31EDBB2FC2B14D8FEF78A +:10CE00002FFD0C4B0500236300230B4863630B4B82 +:10CE1000FF21E4622364704308F072FB2900414360 +:10CE20002000143015F055FD637A012B94D905B01C +:10CE3000F0BDC04687010300B60300007301030084 +:10CE40001FB5012381881A00684612F0CDFB01232B +:10CE500003491A00684612F0C7FB05B000BDC04682 +:10CE6000FE0300001FB5030048331A780400002AAF +:10CE70000DD000221A70012381881A00684612F032 +:10CE8000B3FB012304491A00684612F0ADFB2000F1 +:10CE9000743012F0F0FB1FBDFF03000010B54830E6 +:10CEA0000378002B06D00378012B03D00121024820 +:10CEB00012F00AFA10BDC046FF03000010B50121B0 +:10CEC0000400062012F000FA064B984209D1230014 +:10CED00048331A78002A04D01B78012B01D020BFD8 +:10CEE000F5E710BD16FCFFFF70B50500141E09DB49 +:10CEF000060048363378002B06D03378012B03D058 +:10CF00000B4813E00B4811E0002328001A0074308E +:10CF1000FEF77EFE0020844207D02B004A331C809F +:10CF200007234C352880337000E0200070BDC046D8 +:10CF300012FCFFFF17FCFFFF73B5079C0500002CD8 +:10CF400009DB060048363078002806D03078012802 +:10CF500003D00D4816E00D4814E006981BB2C0B28D +:10CF60000090280012B2743012F09BFB0020844223 +:10CF700007D02B004A331C8007234C3528803370A0 +:10CF800000E0200076BDC04612FCFFFF17FCFFFF4B +:10CF9000F8B505000F00161E13DBFFF77FFF2B000F +:10CFA00048331C78E4B2002C0DD13200390028003F +:10CFB000FFF79AFF301E07D02800FFF77FFF200001 +:10CFC00002E0024800E00248F8BDC04617FCFFFF3F +:10CFD00011FCFFFFF0B587B00D9E05000F00029217 +:10CFE0000393002E1EDBFFF759FF2B0048331C78FC +:10CFF000E4B2002C18D1390005A812F025FB0C9BD7 +:10D00000029A009305A9039B01962800FFF794FF5D +:10D0100005A812F00CFB301E07D02800FFF74EFFCA +:10D02000200002E0024800E0024807B0F0BDC04620 +:10D0300017FCFFFF11FCFFFFF8B50400171E09DD08 +:10D04000060048363378002B06D03378012B03D006 +:10D050000C4816E00C4814E02200E3795632013BFC +:10D06000137023000025200054331D80503012F02F +:10D070007EFA23004A331F80022328004C34258087 +:10D080003370F8BD12FCFFFF17FCFFFFF7B505007A +:10D090000F00161E18DDFFF701FF2B00483318782C +:10D0A000C4B2002C12D1390001A812F058FA320093 +:10D0B00001A92800FFF7C0FF01A812F0FBF9280022 +:10D0C000FFF7FCFE200002E0014800E00148FEBD41 +:10D0D00017FCFFFF11FCFFFFF8B50400161E09DD69 +:10D0E000070048373A78002A06D03A78012A03D058 +:10D0F000144826E0144824E05D42069BFF3301D12A +:10D100006B1D00E0069B22009BB26432138023005B +:10D11000200066331D70603012F09EFA220000235A +:10D120006C3213709D4200D0B3B222004A32138099 +:10D13000079B00205A1E9341013E4C340533268044 +:10D140003B70F8BD12FCFFFF17FCFFFFF0B587B086 +:10D1500005000F00161E03931DDDFFF79FFE2B0039 +:10D1600048331C78E4B2002C17D1390005A812F01E +:10D170006BFA0D9B320001930C9B05A900932800CC +:10D18000039BFFF7A9FF05A812F051FA2800FFF74B +:10D1900095FE200002E0024800E0024807B0F0BD22 +:10D1A00017FCFFFF11FCFFFFFF2902D8417200208E +:10D1B00000E001487047C04617FCFFFF13B50400AC +:10D1C00004A800780090200015F0E7FB002801D1AA +:10D1D000207500E0004816BD0EFCFFFF13B50400EB +:10D1E00004A800780090200015F0BFFB002801D1B2 +:10D1F000207500E0004816BD0EFCFFFF7FB50D0056 +:10D2000011000F226A4404001E1E117015D0089BE5 +:10D21000002B12DD012329000093FFF7DFFF002818 +:10D2200001D007480AE00090089B32002900200046 +:10D23000FFF7C4FF002801D0F3E7024804B070BD37 +:10D240000EFCFFFF17FCFFFF30B5040087B0057B25 +:10D25000006C08F033F8A02200210E4BAD00D20084 +:10D26000285199500C4A14319950636C6846597C86 +:10D27000237BC91849B211F0B4FB039B019A032127 +:10D280001A60207B0130C0B208F036F9217307B074 +:10D2900030BDC046007000400405000082B070B58B +:10D2A0000400002588B00C920D93636C9A68954237 +:10D2B0000ADA197C02A8491949B211F092FB069BBF +:10D2C000039A01351A60F0E75D7C237B02A8ED1814 +:10D2D0006DB2290011F085FB039A059B01921A603B +:10D2E0000021182202A815F0DFFD02A80022290063 +:10D2F00015F0E0FB206C002801D015F092FD08200D +:10D3000015F07DFD2900060007F0B0FF094B200055 +:10D31000E3620023FA212363074B2664A462E363DC +:10D320001030090115F0D5FA08B070BC08BC02B085 +:10D330001847C04649D20100E1060300F0B50400D9 +:10D340000E00150085B000930CAB1B8810300193C4 +:10D3500012F03FF926806580182015F050FD070077 +:10D3600002AE33003D000AAA03CA03C3009B102289 +:10D3700008C50021280015F097FD3100082228007B +:10D3800015F074FD064B02227B61200000230199F9 +:10D39000A7600A43E360A2802362636205B0F0BD28 +:10D3A000F506030070B50500040010350E003022AC +:10D3B00086B00021280015F077FD280006F0F8FD62 +:10D3C0000023194A66642261184AA3621668E3635F +:10D3D000237323606360A3609E421FD0144A2820F9 +:10D3E0000492059315F00BFDC02305006A460293D5 +:10D3F00004AB03CB03C22300062102222800FFF75F +:10D400009DFF336829005B6830009847002805D0ED +:10D41000280012F005F8280015F003FD0023200075 +:10D42000236406B070BDC0466C400300DC250020BC +:10D430009DD2010030B5134B91B01D680400002D42 +:10D4400017D0114B6A4604930023059310330293BF +:10D4500004AB03CB03C223000222062106A8FFF778 +:10D460006DFF2B6806A99B682800984706A811F055 +:10D47000D7FF2000054B10302361FFF7C9FB2000C8 +:10D4800011B030BDDC2500209DD201006C400300AE +:10D49000F7B507000D1E27D000230226046901936B +:10D4A000002C1DD0AA88A3885340334216D13242A3 +:10D4B00003D1AB88334207D010E0A968A06814F00C +:10D4C00099F8002804D1F4E7A368AA68934205D12B +:10D4D0002B88002B0AD022889A4207D0646ADFE7A3 +:10D4E000019B2000002B1ADC0D4818E06B88002BF4 +:10D4F00002D062889A42F1D1EB68E268934201D08F +:10D50000002BEBD17B68002B01D020009847A3882B +:10D51000044A1343A380019B01330193DEE7FEBD60 +:10D5200017FCFFFF0080FFFFF0B5060085B00D1E61 +:10D530005CD001270469002C1DD00221AA88002399 +:10D540000A4202D0A3885B083B40226829688A42CD +:10D5500057D1002B0AD0A968A06814F04BF8002816 +:10D560004FD0EB68E26893424BD141E0A368AA68D0 +:10D57000934246D1F5E731692A880F000B1E0CD182 +:10D58000356101232149684612F02EF820003AE067 +:10D59000586A1F00002812D0030018889042F7D361 +:10D5A00018003B000488944209D147886C88A74240 +:10D5B00005D8446A0300002C01D02000F2E799420C +:10D5C0000AD10888824204D306D14C8868888442F4 +:10D5D00002D96962356102E0596A69625D620123BC +:10D5E0000A49684612F000F800200CE008480AE0FA +:10D5F000A3881AB2002A02DA5B045B0CA3800548F8 +:10D6000001E0646A97E705B0F0BDC046FD03000085 +:10D6100017FCFFFF16FCFFFF064B10B51A000400B5 +:10D6200008322C33026083600830FDF7CDFE200005 +:10D6300010BDC0464439030008B4024B9C4608386C +:10D6400008BC604719D6010008B4024B9C46083854 +:10D6500008BC6047810703000C4A002311002C32EC +:10D66000083110B543608381837382600361436135 +:10D670008361C383016004000830FDF797FE044B0B +:10D680001A68002A00D11C60200010BD4439030034 +:10D69000DC250020F7B50E00012504690192002C5D +:10D6A00037D0238832889A4201D0002B26D1638854 +:10D6B00072889A4201D0002B20D1FDF7CBFD0123C7 +:10D6C000002806D0A288BF331340C03B5A425341C2 +:10D6D000DBB2019A934210D1A7883BB2002B0CDB3E +:10D6E00010223100A01815F0C1FB40231F4207D1C2 +:10D6F000FDF7B0FD002803D006E00025646ACEE700 +:10D70000200013F046F8F9E721000348FDF776FF03 +:10D71000F4E72800FEBDC0469307030008B4024B9F +:10D720009C46083808BC60471D090300F0B587B067 +:10D7300001930EAB1B88060003930D9B0D00009315 +:10D74000019B02920C9F002B3DD0002F02D1009B29 +:10D75000DB0738D5282015F052FB0400103011F0FB +:10D7600038FF6B461B8918202580638015F047FB26 +:10D77000049707000500009B10220593019B0021E0 +:10D7800008C7380015F090FB082204A9380015F0EE +:10D790006DFB0E4B02226B6100230399E360236251 +:10D7A000636233680A43A560A2805B682100300091 +:10D7B0009847002808D0200011F032FE200015F014 +:10D7C00030FB034800E0034807B0F0BD49090300FF +:10D7D00016FCFFFF17FCFFFFF0B504001600002544 +:10D7E0008380164A164B857102602181468105733C +:10D7F000186889B08C46A8421DD0124A059504923B +:10D80000C02202926A4604AB82CB82C261462300E8 +:10D810002A00FFF78BFF0B4A094B0692C0221868BB +:10D8200002926A4606AB079582CB82C223002A0089 +:10D830003100FFF77BFF200009B0F0BD88390300FD +:10D84000DC250020730A030030B500240373012394 +:10D85000034D84710560818082734373846030BDA1 +:10D860008438030070B583790400DB0702D5806833 +:10D8700015F0D7FAA3799B0702D5A06815F0D1FA65 +:10D88000A3795B0707D5A0230021144ADB00D15000 +:10D89000A06815F0C6FAA3791B0708D5A568002D66 +:10D8A00005D0280013F01DFF280015F0BAFAA3795F +:10D8B000DB0605D5A068002802D00368DB6898471E +:10D8C0006023A2791A4205D0A068002802D003681C +:10D8D0005B6898470023A360A37170BD007000408F +:10D8E000F7B50222037B04000F00134225D0012963 +:10D8F00025D88579154016D1FFF7B4FF182015F00B +:10D900007EFAA37B182229000600019315F0CCFAB9 +:10D910006B4604213000595615F0DEF80222A37937 +:10D92000A6601343A371A3685A68002F03D0DB6875 +:10D930001A60002004E01B69FAE7024800E0024890 +:10D94000FEBDC04616FCFFFF17FCFFFFF7B5012721 +:10D95000037B04003B422CD0612385791D4018D104 +:10D96000FFF780FF182015F04AFAA37B18220093D6 +:10D97000637B29000600019315F096FA6B4600219F +:10D98000019A5956300015F095F8A379A6603B43EB +:10D99000A3716023A2791A4203D0A06814F028FF73 +:10D9A00008E0A268536950681B681840431E9841FC +:10D9B00000E00148FEBDC04616FCFFFF70B5037BCA +:10D9C00004000D001B0713D50B4B994212D813F01E +:10D9D000EBF80300002083420DD1280008F04CFE34 +:10D9E000064908F0C3F9011CA06803F09FFA02E0A1 +:10D9F000034800E0034870BDFF03000000C07F44FF +:10DA000016FCFFFF17FCFFFF70B50425037B040025 +:10DA10002B4214D083792B420DD1FFF723FF08202E +:10DA200015F0EDF90E210600615607F01FFCA379F1 +:10DA3000A6602B43A371A06807F040FC00E00148FA +:10DA400070BDC04616FCFFFFF7B50127037B04003D +:10DA50003B4219D0102385791D4011D1FFF702FFF9 +:10DA6000282015F0CCF90E21A2883B0061560095C4 +:10DA70000600FEF749FC1022A379A6601343A371A8 +:10DA8000A06812F074F800E00048FEBD16FCFFFF2D +:10DA900070B5037B05000E001B0713D5002913DBAF +:10DAA00013F082F8041E11D1A86803F053FA094953 +:10DAB000884202D0A86803F053FA3100A86806F043 +:10DAC00043FF04E0044C02E0044C00E0002420008A +:10DAD00070BDC046204E000016FCFFFF17FCFFFF84 +:10DAE000F8B51400027B070012071CD500291CDBC7 +:10DAF000002C1ADD002B18DDB42900DDB421FA2634 +:10DB0000B600714365100800B4215D1B07F0F8FCF6 +:10DB1000754360433100281807F0F2FC010038001B +:10DB2000FFF7B6FF02E0024800E00248F8BDC04639 +:10DB300016FCFFFF17FCFFFF10B583791B0703D509 +:10DB4000806803F00DFA00E0004810BD16FCFFFFEE +:10DB500010B50124837941731C4004D0806815F00E +:10DB60004FF8002007E06022134203D0806814F0D1 +:10DB700046FEF6E7004810BD16FCFFFFF8B560232F +:10DB8000867904000D001E4025D1FFF76BFE58205A +:10DB900015F035F90E210700615601F04BF83800F9 +:10DBA000A760617B14F02BFE0122A068104B114F7F +:10DBB000436204628662476311001C3006F084FDF4 +:10DBC000A0680D4B8463C3630664C76401221C30E4 +:10DBD000022106F079FD6022A3799343403A012D9A +:10DBE00002D0022D01D1402213430020A371F8BDC1 +:10DBF0002B0C0300950B03004F0C030010B5030022 +:10DC0000032911D8080007F0E7FB0B0202061800F1 +:10DC1000FFF7B4FF02E01800FFF716FF002004E052 +:10DC2000180013F026F8F9E7004810BD17FCFFFFB5 +:10DC300070B5040000250D4B0E00083385808571FA +:10DC400003602100183013F04BF820002100203031 +:10DC500013F088F8064BA680A571E5712572E56082 +:10DC60002561656120001C6070BDC04698390300C5 +:10DC7000F0250020072906D8044B054A5956054BC4 +:10DC80000020D15000E004487047C046674E0300B2 +:10DC9000001000400C05000017FCFFFF8379DB0734 +:10DCA00002D5C160002000E00048704716FCFFFF6D +:10DCB0008379DB0701D5C06800E001487047C046A2 +:10DCC00016FCFFFF70B545690400002D21D0037AD2 +:10DCD000032B20D8FFF7ECFFA8622C2015F08FF85B +:10DCE0002C220021050015F0DFF800236269536241 +:10DCF0002369002B01D1226105E0596A002901D076 +:10DD00000B00FAE75A62237A65610133237200201F +:10DD100002E0024800E0024870BDC04617FCFFFF69 +:10DD200013FCFFFF154B70B55A68154D002A03D040 +:10DD300000225A600132AA601B69114E002B1CD0D0 +:10DD400000210E4B0F4C19618023DB00F358012B8F +:10DD50000ED1A923DB00F15820684942FFF79EFF4E +:10DD60002068FFF7AFFF23685A69074BF25002E0C3 +:10DD70002068FFF793FF0123AB6070BDFC100040EB +:10DD800000100040F02500200405000070B50500DB +:10DD90000C0011F028FA002804D1034B034AEC715F +:10DDA000D45000E0024870BD24050000001000407F +:10DDB00016FCFFFFF8B5837905000020DB076FD460 +:10DDC00011F011FA002868D16E69002E08D12C30AC +:10DDD00015F015F804002C22310015F065F86C617F +:10DDE0006B69002B5BD000222E4B01215A608022F0 +:10DDF000D20511605A68002AFCD006222A4B2B4C0F +:10DE00009A562B4B0026E2500722043BE25008337F +:10DE1000E650284A284B2800E250E979FFF7B6FF80 +:10DE200001220821254B2648E6500433E250254BB9 +:10DE3000254FE1500433E050022324482350244866 +:10DE40002750244F043827501827234827506F693C +:10DE500022482750C1208000215021498538FF38B1 +:10DE60000B500B608021890063587138FF380343E1 +:10DE700063501C4B5E6062605A68002AFCD000242C +:10DE80000126184B28001C61084B9E60FDF78EFA96 +:10DE9000AB7920003343AB7102E0134800E0134834 +:10DEA000F8BDC046FC000040674E03000010004073 +:10DEB0000C050000746962751C0500002C0500004B +:10DEC0002000040214050000FFFF000034050000DC +:10DED0003C0500002110010054050000040500006D +:10DEE00000E100E0FC10004016FCFFFF13FCFFFF08 +:10DEF00003000069002809D00221054AD167426A5F +:10DF00001A611A7A013A1A72024B19607047C046B8 +:10DF100004E100E000E100E070B504000D0011F044 +:10DF200062F9002845D1002D45D02B78232B42D80B +:10DF300002220121214BDA67214B224A58611161EB +:10DF40005A692049002AFBD01F4A1D488D500025E0 +:10DF500045600120086011005A68002AFCD00020AA +:10DF6000174A1061174A013090601869154A002855 +:10DF7000FBD06069505000201149486101211161B6 +:10DF80005A69002AFCD000210D4A51600D4A013126 +:10DF900051605A68002AFCD000200122C021084BA1 +:10DFA00049001861074B9A60084B92185A501A6042 +:10DFB00002E0074800E0074870BDC04604E100E009 +:10DFC000FC100040001000400405000000E100E0EB +:10DFD00016FCFFFF17FCFFFF37B54C680500002C4F +:10DFE00003D10C4911F03FFC12E0636A01A84B60B9 +:10DFF0002278211D033AA36A11F069FC200014F075 +:10E0000010FF01A9280011F02EFC01A811F024FC3A +:10E0100028003EBDE425002030B505008DB0002964 +:10E0200011D0232A0FD801ACD31C00202370012368 +:10E03000A07002A86370E37014F018FF2100286834 +:10E04000FFF76AFF00E001480DB030BD17FCFFFF8D +:10E05000F0B585B0040014F076FC204B1B785B070C +:10E060003AD50025236CC6B20227DF5FBD420EDA27 +:10E07000200029B2403011F09FFA864205D10123D9 +:10E0800020211A00684611F0AFFA0135EEE72500AD +:10E0900023004E3528884C331978013007F016FBE1 +:10E0A000230050331B8889B28B420FD02B88A26C7F +:10E0B000D654636C2980002B0EDB2A8893420BD147 +:10E0C00001235B4263640222023301E00123032245 +:10E0D0002021684611F088FA05B0F0BDEC28002038 +:10E0E0000121024A13780B4313707047EC2800207B +:10E0F0000221024A13780B4313707047EC2800206A +:10E100000121024A13788B4313707047EC280020DA +:10E110000221024A13788B4313707047EC280020C9 +:10E1200010B5002903DB024B196014F0F8FB10BD99 +:10E13000F425002070B504001E0004AB1D7805F026 +:10E1400085FF20000E4B40302360FDF741FC23008B +:10E1500001364C33013522001E701D730023E1216E +:10E160004E32A3646365138053809381D381013B56 +:10E17000200063644902FFF7D3FF200070BDC04652 +:10E180003438030070B50500141E012C10D00300B4 +:10E190004E331888023B4018197807F097FA6964E3 +:10E1A0000025022C05D12100202011F08DF800E07F +:10E1B000014D280070BDC04617FCFFFF70B505007B +:10E1C00004000A005035002907D103004E331B8894 +:10E1D0002A889A4212D111481FE0012906D1010074 +:10E1E0002A884E310B889A42FCD007E0022905D1DB +:10E1F00003004E331B88298899420AD0A36C2888D3 +:10E200004C341E5C2178013007F060FA3000298020 +:10E2100003E00121FFF7B6FFF0E770BD0CFCFFFF44 +:10E2200070B5151E012D0AD0403011F0A0F9002460 +:10E23000022D05D10121202011F046F800E0014C0B +:10E24000200070BD17FCFFFFF8B5114D04002B78BE +:10E250001B0705D5012112F0ECFD606DFDF78AFA70 +:10E26000082723002E785833BE432E701878FDF708 +:10E270004BFA6065002808D0230000205A335C3434 +:10E280003E4318802E70208000E00248F8BDC04652 +:10E29000EC28002013FCFFFF70B50B4B05001B782A +:10E2A0000C009B070ED4FFF723FF2B0001345833DB +:10E2B0001C702800FFF7C8FF04002800FFF728FFA4 +:10E2C000200000E0014870BDEC2800200DFCFFFF9D +:10E2D000F0B5060007005C365A3733883A8885B0B7 +:10E2E00004009A421ED0104B1B781B071AD53388A6 +:10E2F000426DD15C14F02BFB230030885833197821 +:10E30000013007F0E3F93B888DB2AB4209D10749F0 +:10E3100001230222684611F067F90121200012F062 +:10E3200088FD358005B0F0BDEC280020FF0300001B +:10E3300073B50D0006A9040009780430002A01D144 +:10E34000DE070DD5002D0BD00C34260018244C43CD +:10E350003419A360044B626025606361012200E010 +:10E36000002206F0ABF873BD8F0D0300F0B5070077 +:10E370000400002589B00391049205935A37049B49 +:10E380009D4213DA23003E8858331978701C07F039 +:10E390009DF923005C331B8889B2994206D0039B08 +:10E3A000626D5B5D013593553980E8E7059B012B74 +:10E3B00003D002210648FDF7B3F8012320000093A3 +:10E3C000044A00232100FFF7B3FF280009B0F0BD85 +:10E3D000FF030000D1E20100F7B5194C1F002378BC +:10E3E0000500019116009B0725D4002A25DD002990 +:10E3F00023D0FFF77DFE23781B0701D5002407E01B +:10E400002800FFF721FF0028F8D017E0A6420DDD15 +:10E41000019B321B191928003B00FFF7A7FF3900A9 +:10E420002418280012F0F5FC002FEFD12800FFF788 +:10E430006FFE200002E0034800E00348FEBDC04636 +:10E44000EC2800200DFCFFFF17FCFFFFF0B5174E76 +:10E4500087B0337805005B0705D5002112F0E9FC91 +:10E46000A86CFDF787F904273378BB4303936B4609 +:10E470001B7B33702B004C331878FDF745F9A864EB +:10E48000002810D02B0000244E331C805C80039B9E +:10E4900028001F433770064A009423002900FFF725 +:10E4A00047FF200000E0034807B0F0BDEC28002043 +:10E4B00051E0010013FCFFFF70B50E4C05002378FE +:10E4C0000E00DB0714D4FFF70BFE23785B0709D59A +:10E4D00031002800FFF772FE04002800FFF710FE4D +:10E4E000200006E02800FFF7B1FF0028F0D000E090 +:10E4F000014870BDEC2800200DFCFFFFF7B52C4C47 +:10E500000193237805000F001600DB074DD4FFF7B9 +:10E51000E7FD23785B0703D5019B1C1E0AD011E0A1 +:10E520002800FFF793FF0028F6D03FE0B44237DA27 +:10E530003855013400212800FFF740FE1D4B98425A +:10E54000F4D12DE0019B012B0AD13C00E31BB34227 +:10E550001BDA01212800FFF731FE20700134F5E7B6 +:10E56000019B0024022B1BD1280012F031FC8642B3 +:10E5700007DD280012F02CFC019A311A2800FFF761 +:10E5800001FE3C00E31B9E4203DCF443E4173440ED +:10E5900006E002212800FFF711FE20700134F1E7A8 +:10E5A0002800FFF7ADFD200000E00348FEBDC04697 +:10E5B000EC2800200CFCFFFF0DFCFFFFF0B58BB03A +:10E5C00002AF7B60704BB8601B780C001500DA0757 +:10E5D0002CD45B0708D40800FFF738FF011E03D0D6 +:10E5E000B86810F083FFCAE02000FFF779FD230030 +:10E5F00050331B88FB603B6101235B427B6126003B +:10E600004E3633883A699A4203D07B69013300D190 +:10E6100097E07B68012B21D07B68022B2FD07B6990 +:10E62000002B50DA2000FFF76BFDB868FDF7D0F93A +:10E63000A5E0138839699942FBD00026A36C5B5C86 +:10E640007B602B6802229B5E9E420DDB23003869B3 +:10E650004C331978013007F039F839617B6901339F +:10E66000DDD122004E32E4E731B2280010F0A4FFE1 +:10E670007B68834201D13B697B610136E1E77B69BD +:10E680000133CCD11C232900F81810F068FF1C239B +:10E690007A68F9182000FFF7C3FD1C23F81810F062 +:10E6A00009FF3388013B7B611C23F818FDF790F9C3 +:10E6B0001C232000F918403010F059FF1C23F818D3 +:10E6C00010F0F8FEABE76B46FA687B607B699D1A39 +:10E6D000934205DA23004C331D787B69AD1AED189F +:10E6E0002B0069460833DB08DB00CB1A9D4602AEDF +:10E6F0006A1C0021300014F0D7FB23004C333B612F +:10E700001A78BB8A20000193FB680093A16C330048 +:10E7100012F047FB230050337B6118883B690130BE +:10E720001978401906F0D2FF7B6920001980FFF7A5 +:10E73000E7FC2AB23100B868FDF720F97B689D46F6 +:10E740001DE00026A36C3A699B5C3B602B680222AB +:10E750009B5E9E420ADA31B2280010F02DFF3B6822 +:10E76000834201D13B697B610136EFE723003869C1 +:10E770004C331978013006F0A9FF39613FE7BD46F7 +:10E78000B86809B0F0BDC046EC28002070B50B4B4E +:10E7900005001B780C00DB070ED4FFF7A1FC2B0053 +:10E7A00001344C331C702800FFF750FE0400280091 +:10E7B000FFF7A6FC200000E0014870BDEC28002017 +:10E7C0000DFCFFFF70B5224B86B01B7804000D00D6 +:10E7D00016009B0701D01F4837E0FFF789FC200097 +:10E7E000FFF77EFC200012F003FB002803DD01216F +:10E7F000200012F01EFB0021200012F01AFB29005D +:10E800000025201D320005F0BBFD20000095124AB6 +:10E810002B002100FFF78CFD200012F0E9FAA8423E +:10E8200007DD01230D4A009321002B002000FFF794 +:10E830007FFD0B4B20001968FFF772FC2000FFF7EB +:10E840005FFC2000FFF764FC002006B070BDC046EE +:10E85000EC2800200DFCFFFF51E00100D1E2010097 +:10E86000F4250020F7B580277F053D697C690822E3 +:10E87000113C6C4306002100684614F0F7FA104B77 +:10E88000009A9A4219D000930023019379693000CD +:10E890001339694312F002FB019A0099300012F01B +:10E8A00015FB2100300012F0F9FA7969AB08133931 +:10E8B00069432200300012F0FBFA0198FEBDC04609 +:10E8C000FECA0000F0B50D00ABB00D920021302261 +:10E8D000060012A80B9314F0E7FA280014F024FBAA +:10E8E000431C0C93102B00DDB6E00B9B202B00D9B2 +:10E8F000B2E02900300012F016FB071E29D12900D2 +:10E900000C9A12A814F0B2FA0D990B9A16A814F0EA +:10E91000ADFA80235B051F695A693000113A7A43CA +:10E920005D690D92FFF79EFF0D9B30220833002199 +:10E9300004001EA80F9314F0B7FA29001339794385 +:10E94000300012F0ABFA0F9B0B9300230C930E9345 +:10E9500035E010300B9A0D9914F079FA0400380064 +:10E9600014F05FFA002C7AD0C9E70B9930221EA868 +:10E9700014F07CFA12A91EA814F0CCFA002822D1B7 +:10E980003849300022001091119412F09FFA6A4623 +:10E990000B9B099315AB23CB23C223CB23C223CBE1 +:10E9A00023C23000149B1299139A12F09DFA01238E +:10E9B0000E930B9B30330B930C9B01330C930C9BEE +:10E9C000A342D2DB10E06A460B9B099321AB23CB19 +:10E9D00023C223CB23C223CB23C230001E991F9A0C +:10E9E000209B12F081FAE4E7E5433021ED17254042 +:10E9F0004D430F9B5D190E9B002B1BD1B81E06F0DB +:10EA0000F5FC84422AD017490134300022001091CD +:10EA1000119412F05BFA6A46099515AB23CB23C219 +:10EA200023CB23C223CB23C230001299139A149B09 +:10EA300012F05AFA0D99300012F030FA80235B057B +:10EA400059690C2363431339023379430D9A30001B +:10EA500012F02EFA002402E0034C00E0034C2000E8 +:10EA60002BB0F0BDFECA000017FCFFFF13FCFFFF38 +:10EA70008023F0B55B051A6995B002925A69059139 +:10EA80000299113A51435C69029B133C05000391C2 +:10EA90005C43FFF7E7FE061E4ED00027039B3022A3 +:10EAA00008330021083408A8019314F0FDF921006F +:10EAB000280012F0F3F90497B74220DA01993022C6 +:10EAC00008A814F0D3F9059908A814F023FA00282F +:10EAD00009D11B49721E28000691079212F0F6F91F +:10EAE0000123049306E022000C230199280012F070 +:10EAF000DFF93034019B013730330193DCE7049BAD +:10EB0000002B05D10E493200280012F0DFF913E086 +:10EB10000399280012F0C2F980235B0559690C2380 +:10EB2000029A13394A437343110028000233039AAF +:10EB300012F0BEF9002000E0024815B0F0BDC0465A +:10EB4000FECA00000CFCFFFF70B50400A280FA2290 +:10EB5000002308000C49920008312160A371606114 +:10EB6000E260A3606382094912F0DDF9051E09D055 +:10EB70000100200010310222123014F077F9280031 +:10EB800014F04FF9200070BDB0390300E04C0300D1 +:10EB900030B50225837987B004002B4204D1FCF7FD +:10EBA00005FCA3792B43A371200012F000FA002882 +:10EBB0002DD06B46DD1C280012F0F0F92B78002BCD +:10EBC00003D001A812F0E8F90FE00122114B1A60FE +:10EBD000114A5368002BFCD000220F4B5A600F4B98 +:10EBE00001321B6801930B4B5A600322019BD9171A +:10EBF0000A40D3189B102382FCF76CFEE368A188BF +:10EC000018180123A0601A0002A810F0EDFC0020E3 +:10EC100007B030BD00C00040FCC0004008C5004047 +:10EC200010B50400024B036005F092F9200010BDFE +:10EC3000D039030010B5040005F096F9034B00220B +:10EC40002360002320002265636510BDD0390300D6 +:10EC5000022802D10122014B1A707047ED280020D2 +:10EC600070B5064C05002378002B04D1044802F04F +:10EC70003BFE01232370280070BDC046EE28002013 +:10EC800051EC010070B50C0010F0ADFA002811D065 +:10EC9000164B0022A50A1C001A70280012F0B4F9C5 +:10ECA000002803D00A2013F08FFFF6E72378002B0B +:10ECB000FCD019E0022180250D4B0E4AED00995041 +:10ECC00080205959C0000029FAD0A121084DC9005F +:10ECD0006C5019580029FCD000200549885080212B +:10ECE000C9005A58002AFCD070BDC046ED2800204B +:10ECF00000E0014004050000F8B50C0015001E00FE +:10ED000010F071FA002812D0194B00221F001A705F +:10ED100032002900200012F075F9002803D00A20E3 +:10ED200013F052FFF4E73B78002BFCD01EE00121EA +:10ED3000104A114B944699508021C9005A58002A14 +:10ED4000FCD080270022FF008021C900964207DD09 +:10ED5000910068586050D9590029FCD00132F3E77E +:10ED6000002260461A505A58002AFCD0F8BDC0460E +:10ED7000ED2800200405000000E00140F0B589B056 +:10ED80000E9D06000F000592002D05D18022520530 +:10ED90005569314AAD18AD02AC05A40D57D1BA0A78 +:10EDA00092020192BA05920D0292D218049205992C +:10EDB0003A00300012F02AF900280AD1FF24032279 +:10EDC0003900049BA4000433934321400393019D25 +:10EDD00014E0002D3BD029003000FFF753FF8023C3 +:10EDE000019A5B0029003000FFF786FF019930008F +:10EDF000FFF748FF80232100DB00039300230793E4 +:10EE0000039B8B4225DD0322029B0A40D2009942DC +:10EE100007DB049B994204DA059B02981B1A5B5C92 +:10EE200000E06B5C93400327079A4C1C1343079345 +:10EE3000274001D02100E3E7019B89108900591880 +:10EE400007AA01233000FFF757FF0797F2E70348AF +:10EE500000E0002009B0F0BDEDFF3F0017FCFFFF10 +:10EE600008B4024B9C46443808BC60472910030094 +:10EE7000F8B5FA230189DB0004005943324812F047 +:10EE8000CFFBFA21890006F0B1FA304F2081A17A38 +:10EE9000380012F0C5FB23002600250022894C33E0 +:10EEA000A072A0361A808C35317800232A22286877 +:10EEB00011F073FB002801D0254844E031781F236E +:10EEC0005B22286811F069FB0028F5D131782023F6 +:10EED0005C22286811F061FB0028EDD13178012314 +:10EEE0002C22286811F059FB0028E5D13178012344 +:10EEF0002D22286811F051FB0028DDD13178012343 +:10EF00002E22286811F049FB0028D5D1A17A3800BB +:10EF100012F081FB3178C3B20E22286811F03DFB5C +:10EF20000028C9D1FA2321899B005943064812F0D1 +:10EF300072FB01231843C3B231782A22286811F0EA +:10EF40002CFB0028B8D1F8BD983A0300183A03000A +:10EF50000EFCFFFF08B4024B9C46443808BC6047D7 +:10EF600071EE0100074B10B51A00040008323C3363 +:10EF700002604364443010F00EFE200010F01BFDD0 +:10EF8000200010BD383A030008B4024B9C464438B8 +:10EF900008BC604765EF010008B4024B9C4644384A +:10EFA00008BC604733100300F0B5042583798BB0AB +:10EFB00004002B4204D1FCF7F9F9A3792B43A37188 +:10EFC00020009030FEF7C2FC061E66D12300A0335D +:10EFD000197820000C2307AD00938C302B00012200 +:10EFE0000068FEF70BF9002801D02E4E56E00A23E8 +:10EFF00004AA9B182A785A706A781A700022995EBF +:10F00000AA785A70EA781A7000201A5E039228795A +:10F0100058706879187000201F5EA8795870E879D8 +:10F0200018700022985E0490287A5870687A1870D8 +:10F030000022985E0590A87A5870E87A18701F2010 +:10F0400000229B5E039A9C46A37A52425A4359433C +:10F05000D5177B430540AA185211A261DF17CA17C2 +:10F0600002403840C3185B11236264235118059A8B +:10F070005B4253434911A3676423E1616146049AEB +:10F0800020005A434B43E267221DD36710F004FD72 +:10F090002000443010F086FD00E0002630000BB068 +:10F0A000F0BDC0460EFCFFFF08B4024B9C4644383E +:10F0B00008BC6047A9EF0100F7B51E00040008ABCB +:10F0C0001B881500019309AB00911A8831000AAB27 +:10F0D0001F88FCF755FE20003A0031004430FDF750 +:10F0E0004DF9134B20001A003C33636423000832AF +:10F0F0002260009A8C331A60AB8890308380AB79A1 +:10F100006A4683710B4B92880360AB68032183606E +:10F110002B7B03736B7B4373AB7B83732300A03325 +:10F120001A80FEF715FD2000FFF7A2FE2000FEBDAD +:10F13000383A030084380300F8B5FA260189B6008E +:10F1400004007143264812F06BFA310006F04EF9C4 +:10F15000244F2081A17A380012F062FA2500A072B3 +:10F160005835297800232A22606C11F016FA0028FD +:10F1700001D01D4832E0297810232B22606C11F059 +:10F180000CFA0028F5D1297801232D22606C11F0AA +:10F1900004FA0028EDD1297801232E22606C11F0A9 +:10F1A000FCF90028E5D1A17A380012F034FA297868 +:10F1B000C3B20E22606C11F0F0F90028D9D1218978 +:10F1C0000748714312F027FA01231843C3B2297884 +:10F1D0002A22606C11F0E1F90028CAD1F8BDC046BE +:10F1E000343B0300E03A03000EFCFFFF10B50400BF +:10F1F000034B0833036010F0DEFB200010BDC04657 +:10F20000003B03007FB50425837904002B4204D121 +:10F21000FCF7CCF8A3792B43A37120004830FEF70C +:10F2200095FB051E24D1230058331978062302AE1E +:10F23000009301223300606CFDF7E0FF002801D04D +:10F240000D4D16E0042302200022A17AF356305619 +:10F25000B2564B43C0004A4340424143DB00236265 +:10F260002368D200A161E2619B6A2000984700E018 +:10F270000025280004B070BD0EFCFFFFF8B50400A7 +:10F28000150006AA168807AA0F0012881900FCF7B5 +:10F2900077FD0F4B6764083323602300AA88483347 +:10F2A0009A80AA7920009A710A4AA264AA68226503 +:10F2B0002A7B1A736A7B5A73AA7B9A730023A37101 +:10F2C000230058331E80FFF737FF2000F8BDC046EB +:10F2D000003B03008438030010B50400034B0833DF +:10F2E000036010F058FC200010BDC0463C3B0300FA +:10F2F00070B50825837986B004002B4204D1FCF751 +:10F3000055F8A3792B43A37120004C30FEF71EFB68 +:10F31000002830D023005C331978062304AE009314 +:10F3200001223300A06CFDF769FF051E01D01348D0 +:10F3300021E00E2332786B445A70727820001A70E4 +:10F340000022995E64224A43A263B2785A70F2782E +:10F350001A700022995E64225242514361633179EE +:10F3600059707179197000215B5E5A432368E2631A +:10F370001B6A9847280006B070BDC0460EFCFFFF10 +:10F38000F0B507005C3787B00400397800231022FD +:10F39000806C11F002F90326002807D01F483AE0DC +:10F3A0002B78334211D06420FCF79CF80F2502AB78 +:10F3B000ED180123397808220093A06C2B00FDF78B +:10F3C0001DFF164B9842EBD1E8E7FA252189144E30 +:10F3D000AD006943300012F023F9290006F006F869 +:10F3E00020813978A0231122A06C11F0D6F80028D2 +:10F3F000D4D1A36C21890393694330003F7812F084 +:10F400000AF901231843C3B210223900039811F0FE +:10F41000C4F80028C2D107B0F0BDC0460EFCFFFF03 +:10F42000C03B0300F8B50400150006AA168807AA19 +:10F430000F0012881900FCF7A1FF0D4BA7640833D9 +:10F4400023602300AA884C339A80AA7920009A71FD +:10F45000084AE264AA6862652A7B1A736A7B5A7357 +:10F46000AA7B1E829A73FFF78BFF2000F8BDC0466F +:10F470003C3B030084380300F7B5FA250189204F8F +:10F48000AD0004006943380012F0CAF8290005F005 +:10F49000ADFFA17A20811B4812F0C2F82600636CF0 +:10F4A000A07200932189583633786943380001935C +:10F4B00012F0B1F807231843C3B220220199009833 +:10F4C00011F06BF8002801D00F4818E031781023B4 +:10F4D0002222606C11F061F80028F5D1A17A094868 +:10F4E000656C377812F097F880235B421843C3B2FB +:10F4F00023223900280011F050F80028E4D1FEBD85 +:10F500006C3C0300443C03000EFCFFFF10B50400FC +:10F51000034B0833036010F04EFA200010BDC046C4 +:10F52000C83B0300F0B50425837985B004002B4265 +:10F5300004D1FBF73BFFA3792B43A3712000483094 +:10F54000FEF704FA002838D0230058331978062330 +:10F5500002AE0093A8223300606CFDF74FFE051E3B +:10F5600001D0174829E01F210023F25ED3170B407A +:10F570009A18521193B20222B75E3380FA170A40EA +:10F58000D7197F11BAB20427F05F1BB2C7173940F1 +:10F590000818401181B2A07A5B424343728012B2D4 +:10F5A000B180524209B242434843E361236820627A +:10F5B000A2619B6A20009847280005B0F0BDC046B4 +:10F5C0000EFCFFFFF8B50400150006AA168807AA6E +:10F5D0000F0012881900FCF7D3FB0F4B6764083348 +:10F5E00023602300AA8848339A80AA7920009A7160 +:10F5F0000A4AA264AA6822652A7B1A736A7B5A7334 +:10F60000AA7B9A730023A371230058331E80FFF74F +:10F6100033FF2000F8BDC046C83B03008438030018 +:10F62000F7B5FA2504000189134EAD006943300097 +:10F6300011F0F6FF290005F0D9FE2700A36C208108 +:10F6400000935C373B7881B269433000019311F03D +:10F65000E2FF6022C3B20199009810F09EFF0028DB +:10F6600001D0064807E0397801236222A06C10F02F +:10F6700094FF0028F5D1FEBDC03C03000EFCFFFF47 +:10F6800010B50400034B0833036010F084FA200027 +:10F6900010BDC046743C03007FB508258379040083 +:10F6A0002B4204D1FBF782FEA3792B43A3712000E8 +:10F6B0004C30FEF74BF9002822D023005C33197838 +:10F6C000062302AE0093E8223300A06CFDF796FDFE +:10F6D000051E01D00B4813E00223F25E96235B4225 +:10F6E0005A4362630021725E20005343A3630423E4 +:10F6F000F25E96235343E36323681B6A984728000E +:10F7000004B070BD0EFCFFFFF8B50400150006AA9A +:10F71000168807AA0F0012881900FCF72FFE0D4B60 +:10F72000A764083323602300AA884C339A80AA79FF +:10F7300020009A71084AE264AA6862652A7B1A73FB +:10F740006A7B5A73AA7B1E829A73FFF769FF2000B7 +:10F75000F8BDC046743C03008438030010B50400B3 +:10F76000054B083303601C300FF0A4FE2000183056 +:10F770000FF0A0FE200010BDC83C0300FF23F0B531 +:10F780002B4C8DB023700023050069460088009340 +:10F7900003F028FC002802D16B469B782370254E8D +:10F7A0003368DB68002B06D1002328881A00190073 +:10F7B00011F0AFFC3AE02378032BF5D81E4901A8DD +:10F7C000FCF7CCF8336801A9DE6804A80FF0C7FE87 +:10F7D00004A9300011F0D4FB060004A80FF06AFE63 +:10F7E000371E1ED031002022103104A813F03EFB3A +:10F7F000300013F016FB217804ABC9005918082219 +:10F8000002A813F033FB28880123082202A911F073 +:10F8100080FC0127002804D12888084A0C2111F017 +:10F8200076FC01A80FF046FE002FBDD00DB0F0BD54 +:10F8300090200020F82500206B4D0300FFFF000002 +:10F84000F0B5837991B004005B071BD5FCF742F853 +:10F8500000232269801A9941994203D1F423FF338E +:10F8600098420FD9A068002808D0364B1D8801F0B7 +:10F870004FFC036815221B6A290098470422A379CC +:10F880009343A371A3799B075AD52F4D2B68DB684F +:10F89000002B51D02D4B1A780193032A4CD8294BB9 +:10F8A0002B491B8804A80093FCF758F82B6804A97F +:10F8B000DE6808A80FF053FE08A9300011F060FBC5 +:10F8C000070008A80FF0F6FD02AB9E1D08233200CA +:10F8D000338006A9073B009811F01DFC002F08D0CB +:10F8E00039002022103108A813F0C0FA380013F0B4 +:10F8F00098FA019B32881B7806A9DE0008AB9E1996 +:10F90000300013F0A4FA002813D0082206A9300012 +:10F9100013F0ACFA2B6804A9DD6805A80FF01FFEF0 +:10F92000202308AA05A9280011F030FB05A80FF034 +:10F93000C1FD04A80FF0BEFD0222A3799343A37179 +:10F9400011B0F0BD90280020F82500209020002064 +:10F950006B4D0300F7B5040000250192C77FAF424D +:10F9600054D966197078884202D1152927D804E045 +:10F97000605D2D180135EDB2F1E701228A4026487D +:10F9800002421CD0D91901201F2943DCE119371884 +:10F99000B94210D80021C8B2834205D9019A701823 +:10F9A000575C01318770F6E7625D9A186255E27F15 +:10F9B0009B18E37728E00878C8540139E8E7655DCB +:10F9C000013DEDB2AB4209D10021C8B283421BD93F +:10F9D000019A7018545C01318470F6E7FF187F1BA0 +:10F9E00001201F2F16DC0227A81C7F4236187F1B20 +:10F9F000E07F2218964203D23078F0550136F7E7BF +:10FA0000451B023DE57701E0002003E0019A20005C +:10FA100011F0CBFBFEBDC046FC002000F0B585B068 +:10FA200001930AAB1E880BAB1B78451C02930EABEF +:10FA30001B78040003930B78170003704B8A102285 +:10FA400043820131280013F011FA6B469B8826830C +:10FA500063836B461B7B002623776B4601221B7A50 +:10FA60006761E683EB77A31CDA770C9B0C25636256 +:10FA7000230020000D9A28331A705E709E702A00B1 +:10FA800031002C3013F010FA2000074BE663A3631B +:10FA90002A003100403013F007FA2000034B26659E +:10FAA000E36405B0F0BDC0462D1103001F11030033 +:10FAB00070B50D0001F02CFB04000368002D02D18D +:10FAC0005B69984708E09B689847854204D22368A1 +:10FAD00020009B6898470500FA208000684302498F +:10FAE00005F084FCE08070BD71020000F0B50700F5 +:10FAF0001600A1B002C704006B4918A81D0011F040 +:10FB000086FB331E03D0300013F00EFA83B20122BD +:10FB10000492002203920292023201920093320078 +:10FB200018A93800FFF77AFF23006049583318A856 +:10FB3000079311F06CFB2B1E03D0280013F0F4F98F +:10FB400083B20122049200220392029202320192B5 +:10FB500000932A0018A90798FFF760FF2300544973 +:10FB6000AC3318A8089311F052FB269B002B03D04E +:10FB7000180013F0D9F983B20122049200220392F3 +:10FB80000292023201920093269A18A90898FFF770 +:10FB900045FF631CFF33474918A8099311F037FB51 +:10FBA000279B002B03D0180013F0BEF983B201226B +:10FBB00004920022601C039202920232019200938E +:10FBC000279A18A9FF30FFF729FF23005533FF3389 +:10FBD000394918A8099311F01AFB289B002B03D070 +:10FBE000180013F0A1F983B20122049200220392BB +:10FBF0000292023201920093289A18A90998FFF7FD +:10FC00000DFF2300A933FF332C4918A80A9311F0E4 +:10FC1000FEFA299B002B03D0180013F085F983B25C +:10FC200001220492002218AD039202920232019244 +:10FC30000093299A29000A98FFF7F0FE204B1B78C1 +:10FC40000B93002B2DD1079B12971393089B0DAF9D +:10FC50001493631CFF331593099B1A4916930A9B4F +:10FC60003800179311F0D3FA1D2149203B78102258 +:10FC70002B707B8A12AE6B8206ABC918C01813F0CA +:10FC8000F5F806232B756B469B8D2068AB83AE6120 +:10FC900001F04EFA036829001B6898470122084BBF +:10FCA0001A70200021B0F0BD292A0000242A00008B +:10FCB000252A0000272A0000262A0000282A000002 +:10FCC000EF2800200A18000070B5002504000B4B37 +:10FCD0008580083385710360C1601830FBF778FEBA +:10FCE00020001C30FBF774FE0123621CD377044A0A +:10FCF000A560656120001460A37170BDC83C03005D +:10FD0000F8250020FA2130B585B005000123022234 +:10FD1000890068460FF068FC074C2068002809D06D +:10FD200011F0BFFA2988054B2268198002219379C6 +:10FD30000B43937105B030BDF825002090280020BA +:10FD400010B50C1E072C0BD8806801F0E1F9054BAB +:10FD5000195703685B6C9847002802D0024800E0FE +:10FD6000024810BD674E030016FCFFFF17FCFFFFA3 +:10FD7000F0B5A54C0D00A544040004939AAB1B7884 +:10FD8000A24909A805930792FBF7E8FD2000290086 +:10FD90001C300FF0ECFBC020800001F09BFD082020 +:10FDA00013F02DF80700002101F07AF915AD0021BC +:10FDB000A7600C220EA813F077F82B000EAA43CAF6 +:10FDC00043C3934B2900EB60002338002B6111F0F3 +:10FDD00091FCA06801F09CF90C22002106902800FB +:10FDE00013F062F8142013F00AF88A4B2A001593D6 +:10FDF0000300C2CAC2C3884B069EC3600023A43658 +:10FE000003613368002B00D003613060A06801F00B +:10FE10008FF90C2200210600280013F045F8142069 +:10FE200012F0EDFF7D4B1593030086CD86C37C4B0E +:10FE3000C36000230361336B002B00D00361306388 +:10FE4000A06801F065F915AD0C220021060028001C +:10FE500013F02AF8142012F0D2FF724B9836159343 +:10FE6000030086CD86C3704BC360002303613368F3 +:10FE7000002B00D003613060012004AB1B7C04AA7E +:10FE8000034308A9137411F048F9A06801F060F960 +:10FE9000036866495B6A9847A06801F059F90368EE +:10FEA00063499B699847A06801F052F900220368F2 +:10FEB00000921D6805990323A847059B002B0AD0D3 +:10FEC000200011F0F7F9032805DDA06801F040F9E2 +:10FED0000368DB6898470EA811F05EF92F2004AB89 +:10FEE000C01811F059F9362004ABC01811F054F9BC +:10FEF0003D20042504ABC01811F04EF90EAB0A9357 +:10FF0000A06804AB5D7701F023F903680AA91B69B7 +:10FF10009847A06801F0FCF803680AA95B6D984750 +:10FF2000A06801F0F5F803680021DB6D9847A06830 +:10FF300001F0EEF8036802219B6D9847062120002E +:10FF4000FFF7FEFE182012F05AFFA16800F062FAD7 +:10FF5000542012F054FF049AA16800F053FD354B71 +:10FF6000354A1B68A1680393344B15A81B680CAE77 +:10FF70000293334B00271B680193079B1B685B1997 +:10FF80000093304B12681B68FFF7B0FD302012F071 +:10FF900036FF049AA16800F0FBFAA06801F0B8F8F7 +:10FFA000036831009B6A98470823A0683380DB18F8 +:10FFB0007380B78001F0ACF803683100DB6A9847C2 +:10FFC0002900A06811F02FF9099A09219378A068F7 +:10FFD000521911F03BF9A06801F09AF8322107712B +:10FFE000A068FFF765FD04AB1B7FBB4204D0A0688F +:10FFF00001F08EF811F001F909A80FF05BFA9523D2 +:020000040002F8 +:100000009B009D44F0BDC046ACFDFFFF774D030053 +:100010003B11030005FD0100491103007DF70100BC +:100020005711030085110300651103004900020008 +:100030007D00020000260020FC250020102000206A +:10004000042600200C20002013B506226846FBF78A +:1000500095FC094B1C68002C0AD0694601A80FF0DA +:100060007EFA200001A911F046F901A80FF022FA4A +:1000700068460FF01FFA13BDF8250020002373B562 +:1000800001AE0C0031000500019302F0ABFF002827 +:1000900002D1B278064B1A70064B1868002806D0B9 +:1000A00061426141044BC9B21D8011F02CF973BD4E +:1000B00090200020F82500209028002030B5284C02 +:1000C000A9B06A220D000DA8210012F0CFFE0DA9E3 +:1000D00003A8FBF7B1FC03A906A80FF0B5FA0123AA +:1000E0000193013BFF3B00930533FF33642206A9D4 +:1000F0002800FDF72BF806A80FF099FA2100192225 +:100100006A3106A812F0B2FE05220024110006ABE7 +:1001100004A80FF0C0FA04A905A80FF095FA0194FD +:1001200000942300220005A92800FCF753FF05A82E +:100130000FF07DFA21002800FDF736F80534052080 +:10014000FBF7D0F9FF2CF5D1FA208000FBF7CAF9B4 +:1001500004A80FF06CFA03A80FF069FA29B030BDBB +:10016000E84C0300F0B5954B95B005921A6808234A +:1001700004000291D16C06A80B43D3649049FBF7AD +:10018000EDFB904907A8FBF7E9FB220000250DAE27 +:1001900030001C3206A90FF0F9F907AA310008A8AF +:1001A0000FF0F4F930000FF085F9631CDD77A068DB +:1001B00000F0AEFF03680BAF5B699847300010F0AA +:1001C000EBFF2B2004ABC01810F0E6FF322004AB8D +:1001D000C01810F0E1FF392004ABC01810F0DCFFAC +:1001E0000B960426A0687E713D7100F091FF0368B4 +:1001F00039005B6D9847A06800F08AFF036829000A +:100200009B6D9847A06811F03BF80621A06811F09B +:100210000AF8089A09219378A068921911F016F843 +:10022000A06800F075FFC8210571A068FFF740FCC9 +:10023000A06800F06DFFFF270581A06800F068FF4F +:1002400010F0DBFF0298FCF70DFE2000FBF7AEF884 +:1002500002992000FFF732FF0299200011F066F8A2 +:10026000039504966369DB0735D5574909A8FBF761 +:100270007DFC09A90AA80FF0E7F900220AA91300DA +:10028000019200920298FCF7A5FE0AA80FF0CFF9A0 +:10029000039B002B01D1043F00E00437282F03DD2E +:1002A0000023FE2F06DC06E0029810F049F9012336 +:1002B000002F00DC039305980FF059FC002806D0AE +:1002C000012362699A431300049A1343636109A8E6 +:1002D0000FF0ADF900256369049A13422AD0FF217B +:1002E0000298FCF761FF0025A36902229B5E9D42F4 +:1002F0001BDA200029B218300FF05EF9002301004C +:1003000002981A007430FBF783FCC8208000FBF7CA +:10031000E9F8029810F014F9C820FBF7E3F802227C +:100320006369134201D10135DEE7FA208000FBF753 +:10033000D9F8002502226369134233D008261E40F3 +:100340001AD0224909A8FBF711FC09A90AA80FF045 +:100350007BF900220AA90192009213000298FCF78F +:1003600039FE0AA80FF063F91948FBF7BBF809A892 +:100370000FF05DF9174D15E0174909A8FBF7F6FBDB +:1003800009A90AA80FF060F9330032000AA9019602 +:1003900000960298FCF71EFE0AA80FF048F909A87B +:1003A0000FF045F96420FBF79DF80C4B01359D4299 +:1003B00000DC57E70EF029FF54E7C046582500201F +:1003C000854D0300954D0300974D0300DC4D030060 +:1003D000983A00008C0A0000194E03008B0A0000B6 +:1003E00073B50B4E05003100C06810F09CFD041E73 +:1003F0000AD16B46DA1D107004233100E868FEF75D +:1004000061FA200012F00DFD0EF0FFFE73BDC04634 +:10041000FF490300F0B505000024574BA9B008338D +:1004200003600391A96021000BAB1A1901345170CC +:10043000102CFAD1012251481A701A1B013C015D9F +:100440005174002CF9D19A7B597B12020A4329007E +:1004500045270C31029125211B7813AE337002AB76 +:10046000FF18C91872823800102212F0FFFC029B9C +:1004700002AA73610123338333770933FB771DAB02 +:100480001C706D239B181C706E2321009B187483B5 +:100490000C22F4831EA81C70746212F005FD384B08 +:1004A0000C22B3632100F46323A812F0FDFC354B4A +:1004B0000222F364462302A95B18DA77220034652E +:1004C0002C73059606AF3B1901345A70102CFAD1E3 +:1004D00001232D493B703B1B013C0A5D5A74002CE3 +:1004E000F9D111212520BB7B7A7B1B020BAE134374 +:1004F0003A78738202ABC9183270C018102212F019 +:10050000B5FC01230398337505ABB361B48300F0E8 +:100510000FFE036831001B68984713ABDB8BA8689C +:10052000AB8200F005FE03680094A98A029ADE6897 +:100530000123B047A86800F0FBFD0290142012F0E0 +:100540005EFC06000C22210012F0AEFC30000123FC +:100550003461082220C039000793069412F086FC0B +:100560000A4BF360029B9B69002B00D0336128008B +:10057000029B9E6129B0F0BDE03C03007F4E03006A +:100580002D1103001F1103006F4E0300951303008C +:10059000F0B500260400764BDDB0083303608160BF +:1005A000C260868086713200724947A810F092FFBF +:1005B0002300143308931223012501930E3B049565 +:1005C0000093089A330047A9039602961DA8FFF7E7 +:1005D00025FA3200684947A810F07CFF0C2322005E +:1005E0000193083B15AF10320495009347A93300DF +:1005F0000396029632A8FFF711FA32005F493800DD +:1006000010F068FF23001C33099308230193043B77 +:10061000390004950093099A33000396029647A87F +:10062000FFF7FCF932005649380010F053FF542010 +:1006300012F0E5FB230018330793122301930E3BBE +:10064000390004950093079A3300039602960690AA +:10065000FFF7E4F9069B0822A3624A4B0AA90A9312 +:10066000069B0B961800DC62303012F0FFFB069AF6 +:10067000454B268293631300668229331D702369DC +:100680000422E3610999079812F0F0FB042207990C +:10069000089812F0EBFB6622022304A95218D377C4 +:1006A000BA225218D377872252005218D377069A6B +:1006B0003649D218D3771DAB0C9332AB0D9347ABB1 +:1006C0000E93069B3200A68510A80F9310F002FF30 +:1006D00030223121452004AB9B181B7812323B702D +:1006E00004AB9B181B88323A7B8204ABC918C01834 +:1006F00012F0BCFB04230CADA0683B75BD61BE834A +:1007000000F016FD036839001B689847822204AB8D +:100710009B181B885432238404AB9B181B885432CB +:10072000A38404AB9B181B88A068638400F000FDC1 +:100730000700142012F063FB05000C22310012F0B8 +:10074000B3FB2800124B2E61082210C010A9109391 +:10075000119612F08BFB0F4BEB60BB69B34200D0DC +:100760002B61BD612000FAF721FE20005DB0F0BDD5 +:10077000EC3C03009F4E0300CF4E0300BF4E03002E +:100780008F4E0300A714030013140300AF4E0300A1 +:10079000010802003D140300F0B504000E0015002E +:1007A00085B000930CAB1B88103001930EF011FF45 +:1007B00026806580182012F022FB070002AE33006D +:1007C0003D000AAA03CA03C3009B102208C50021EA +:1007D000280012F069FB31000822280012F046FBC5 +:1007E000064B02227B61200000230199A7600A4387 +:1007F000E360A2802362636205B0F0BD671403006A +:10080000F0B50B898DB00593CB68050004934B8838 +:10081000828C9A420ED1049C059B049A1B1BD31810 +:10082000032B39DD62882188012308A80EF0DCFE45 +:100830000434F1E7428C9A422ED1049C059B049A21 +:100840001B1BD318032B27DD2388282006936388DE +:10085000EF680793114B08930023099312F0CFFA26 +:10086000C0236A460600029308AB03CB03C22B00E9 +:100870000699079A3000FFF78FFF3B6831005B68ED +:1008800038009847002805D030000EF0C9FD300030 +:1008900012F0C7FA0434D1E70DB0F0BD27150300FC +:1008A00070B5040090B0806810F038FE022301009B +:1008B00019401AD1A38D002B17D00D4B6A46049313 +:1008C0001023E568A1850591029304AB41CB41C299 +:1008D0000A00230006A8FFF75FFF2B6806A99B68A4 +:1008E0002800984706A80EF09BFD10B070BDC046CA +:1008F0002715030082B0F0B587B0040003A80D935C +:100900000C92FEF7ADF90CAB5D88022D34D0FF2DB3 +:1009100062D0012D64D104A810F0FFFA334904A875 +:1009200010F001FB05AE071E06D12B0032002F4947 +:1009300004A83570FDF7C6FF380012F072FA256D75 +:10094000AB0503D1290003A8FEF79CF92200102370 +:10095000290003A80C32FEF7CFF902222449300007 +:1009600012F084FA206800F0E3FB0368218932006A +:100970005C690223A04733E02200256D1023290083 +:100980000C3203A8FEF7B8F980235B01EC18802530 +:100990006D056B69174A9B189B029C4212D2164B3D +:1009A00022689A420CD1154B62689A4208D1002302 +:1009B00005AA13702100009303A80133FEF7DEF9A6 +:1009C0000834E6E705A810F0A8FA084905A8FEF7DC +:1009D0004FF80EF01AFC03E0094B1868FFF700FD12 +:1009E00007B0F0BC08BC02B01847C0460A4A030072 +:1009F000DF4E0300EDFF3F00EF401104BBA22FB814 +:100A0000F8250020F0B500250400030021604260B5 +:100A10002A00A9B04C338572C5721D7002AB0091DB +:100A20000565DD700BAF7B1901355A70102DFAD1B9 +:100A3000012365493B707B1B013D4A5D5A74002DC3 +:100A4000F9D12521BB7B7A7B1B0213AE1343738242 +:100A500002ABC91845233A7802A81B183270180057 +:100A6000102212F003FA012202AB033364217361F6 +:100A700014237283327702AA5218137033831DAB8A +:100A80001D706D2302AA9B181D706E2329009B18F0 +:100A9000F5830C221EA81D70756212F005FA4B4BEF +:100AA0000C22B3632900F56323A812F0FDF9484B2B +:100AB00002A9F364462302225B182900DA77356520 +:100AC000039606AB5A1901355170102DFAD1012247 +:100AD00040481A705A1B013D415D5174002DF9D1F7 +:100AE0009A7B597B12020A43252011211B787A82B6 +:100AF0003B7002AB1022C918C01812F0B7F90123DD +:100B000000983B7503ABBB61BD8300F011FB03682C +:100B100039001B689847F38B2068238100F008FB9D +:100B20000700142012F06BF906000C22290012F0C5 +:100B3000BBF93000284B3561082210C004A904938A +:100B4000059512F093F9254BF360BB69002B00D09B +:100B50003361BE6163682820019312F050F90500EB +:100B600010300EF036FD002624236E802B801820D6 +:100B700012F045F907001A4B10C7009010223100FF +:100B800038000693079612F08FF9082206A938005C +:100B900012F06CF9134B009AEE6053611223AB8094 +:100BA000019BAA601B682E626E625B682900019837 +:100BB0009847B04205D028000EF032FC280012F011 +:100BC00030F9200029B0F0BDE34E03002D110300E1 +:100BD0001F110300F34E0300B10C02006115030066 +:100BE000F50802008B1503007FB5CB78827A0400EC +:100BF0000D00934226D006D2D31A07210022DD0F22 +:100C00009942554104E09B1A0125F82B00DC002590 +:100C1000EDB2002D49D1022224496846891812F00C +:100C200025F9206800F084FA036821895E696A4624 +:100C30000223B047E37A0433DBB2E372A3724C348D +:100C4000257032E006000133837223004C36307881 +:100C50000C33000118180431102212F007F9337810 +:100C6000012B16D0002B0DD0032B1CD101232421E6 +:100C70001A0068460EF0B8FC00233370E37A0433A0 +:100C8000E37212E06B78AA781B02134323650123F9 +:100C90000AE06B781A06AB781B041343226D1343EA +:100CA0002365022300E0013333707FBDDF4E030074 +:100CB000F0B54A88038997B007009A4200D08DE0CA +:100CC0000B89002B00D189E0CD682C78022C00D153 +:100CD0007EE008D8002C0BD0012C00D07EE029004B +:100CE000FFF782FF7AE0EE2C52D0FF2C68D075E03F +:100CF00006A800F089F9142101AE34706B7806AAB9 +:100D000073706B780E204B43D3189B6868441B0E9E +:100D1000B3706B784B43D3189B681B0CF3706B78E4 +:100D20004B43D3189B681B0A33716B784B43D31822 +:100D30009B6873716B784B43D318DB681B0EB371E0 +:100D40006B784B43D318DB681B0CF3716B784B4308 +:100D5000D318DB681B0A33726B784B43D318DB68FC +:100D600073726B78594351181031082212F07EF8D3 +:100D7000386800F0DDF9036839895D6932001223B3 +:100D8000A8473B004C33BC72FC721C703C6525E0EC +:100D900006AD03220021280012F086F801236B70B3 +:100DA0000F4B2C70186810F0F2FAA870386800F039 +:100DB000BFF9036839895C692A000323A0470DE065 +:100DC0006B78002B04D0012B08D10EF01EFA05E041 +:100DD00001232200242106A80EF006FC17B0F0BD66 +:100DE000F8250020002815D0006041608260C360B3 +:100DF000046145618661C761444604624C464462B1 +:100E0000544684625C46C462644604636E4646632C +:100E100074468463002A06D0C46B043C043A2568F7 +:100E20001560B442F9D18C6BA6464E6BB546002BCB +:100E300006D0CC6B043C043B1D682560B442F9D15C +:100E40000C6BA446CC6AA3468C6AA2464C6AA146A7 +:100E50000C6AA046CF698E694D690C69CB688A68B7 +:100E6000086849687047006041608260C36004613F +:100E700045618661C761444604624C4644625446FB +:100E800084625C46C462644604636E46466374468C +:100E90008463C46B043C043925680D60B442F9D105 +:100EA000C76986694569046970470060416082606E +:100EB000C360046145618661C761444604624C4673 +:100EC0004462544684625C46C462644604636C4671 +:100ED00044637446846304697047846BA646446B1C +:100EE000A546046BA446C46AA346846AA246446A23 +:100EF000A146046AA046C769866945690469C36852 +:100F000082680068416870470CC8074810B51B1814 +:100F1000DB00D3181800934205D31C688C4202D31F +:100F20001800083BF7E710BDFFFFFF1F70B50D1C51 +:100F300006000021281C04F01FFC041E06D130000E +:100F4000291C03F0BDFD7560200000E0004870BD65 +:100F500017FCFFFF014B18687047C04614200020A3 +:100F600070B504000D0003F0BFFD61682000FFF7BD +:100F7000DDFF024B00201D6070BDC0461420002024 +:100F8000F8B51B4C0500A3059B0D03D08022D200B1 +:100F9000A418E41A80235B05164A5B6916499B185E +:100FA0001648174A174E9B029C421FD22768974249 +:100FB00018D167688F4215D1A768874212D1E768B8 +:100FC000B7420FD12800210008221031243011F03F +:100FD0004DFF2800210038301831082211F046FF5B +:100FE0002C6303E08027FF00E419DDE7F8BDC0466D +:100FF00078510300EDFF3F00C615A841C49866C9AB +:10100000708E3B9275EE5197F8B5002307000400EF +:101010000370061D40370025300035707560B560DF +:101020000C3008222900143611F03EFFBE42F2D1E6 +:101030002278032A09D01423C02153434902E3181C +:1010400001329D60D96022701D712178124B0329F5 +:101050000AD01422C0204A434002A21801319060F5 +:10106000D3602170012111718022D20099189B0553 +:1010700022789B0DC91A032A09D014235343E3187D +:10108000996006490132D960227002221A7120004B +:10109000FFF776FF2000F8BD78510300FFBB030087 +:1010A000002370B504000160436099420AD1064DE7 +:1010B0002B68002B02D110F04FFD286023689B00A5 +:1010C000EB586360200070BD1426002070B5002826 +:1010D0000DD10C4C2668002E07D1083011F08FFE80 +:1010E00005003100FFF7DCFF2560206808E00122E1 +:1010F000054906480B68134002D1026043600A604C +:1011000070BDC04608260020182600200C260020AE +:10111000436810B50400002B02D1044811F09CFC78 +:10112000606803681B69984710BDC046034F030001 +:10113000436810B50400002B02D1044811F08CFC68 +:10114000606803689B69984710BDC046034F030061 +:10115000436810B50400002B02D1044811F07CFC58 +:10116000606803685B6A984710BDC046034F030080 +:1011700000487047FFFF0000F0B597B00593036883 +:1011800007AD1B680491039311002B00060091C961 +:1011900091C30024D36821000C220CA8EB602C61C1 +:1011A00011F082FE21000B4B10940F9311AB1C70B9 +:1011B0001A1901345170102CFAD100225A8201936D +:1011C000059B2A00009304990CAB3000039CA047B8 +:1011D00017B0F0BD41180300FC3070B5046C050079 +:1011E000002C0DD1242011F00AFE064B44608361CF +:1011F000054B8460C46004614461C4610360286479 +:10120000286C70BDD83D0300C03E0300FC3070B5B3 +:10121000C56B0600002D16D1342011F0F0FD04003E +:101220003422290011F040FE084BA5606360084B92 +:1012300065612361074B2562E361074BE562A362A9 +:10124000064BF4632360F06B70BDC046083E03009C +:10125000F83D0300683E0300783E0300883E03002B +:101260007FB503791548002B26D0154D154C2B78EA +:101270002000002B20D102AE300010F0BEFA002872 +:1012800014D17388592B11D13378B288D91F012911 +:1012900002D800920C4A01E000920C4A2021200062 +:1012A0000BF0AEFF01232B70200005E0202208493F +:1012B000200011F040FEF7E704B070BD264F030098 +:1012C000F0280020F1280020404F03005D4F03006C +:1012D000824F030010B50400024B08C010F01FFB42 +:1012E000200010BD783E030010B50400024B08C07A +:1012F00010F015FB200010BD183E030010B50400CF +:10130000024B08C010F00BFB200010BD083E03008C +:1013100010B50400024B08C010F001FB200010BD06 +:10132000F83D030010B50400024B08C010F0F7FAB6 +:10133000200010BDE83D030010B50400024B08C0BA +:1013400010F0EDFA200010BD283E030010B5040097 +:10135000024B08C010F0E3FA200010BDD83D030096 +:1013600010B50400024B08C010F0D9FA200010BDDF +:101370002C3D030010B50400024B08C010F0CFFA5A +:10138000200010BD1C3D030010B50400024B08C036 +:1013900010F0C5FA200010BD0C3D030010B504008C +:1013A000024B08C010F0BBFA200010BD3C3D03000A +:1013B00010B50400024B08C010F0B1FA200010BDB7 +:1013C000683E0300FC3070B5046C0500002C0DD1A4 +:1013D000242011F014FD064B44608361054B8460AA +:1013E000C46004614461C46103602864286C70BDFA +:1013F000D83D0300C03E0300104B10B50833036016 +:101400000F4B0400C36080230E4A5B00C250C0181B +:10141000FBF7FEFB20000C4BB830E360FFF7BEFF8C +:101420002000AC30FFF79CFF2000A030FFF7A2FFA8 +:1014300020006C30FFF7A8FF200010BDEC3E030039 +:10144000343F03006C4003004C3D0300F0B5050041 +:10145000040087B0AC356B68AB60AE68002E08D076 +:10146000F368210030009847AB68002BF3D01B696C +:10147000F2E72000B03010F052FA2200FC2358327C +:10148000117820000B40137023005C331E700A306B +:1014900010F059FB2000343010F055FB2000643070 +:1014A00010F03DFA2000983010F039FA200001AD1C +:1014B000A43010F034FA31000C22280011F0F4FCB2 +:1014C00023002A006C3383CA83C3094BE667A367F2 +:1014D0000C223100280011F0E7FC2300803307CDF7 +:1014E00007C33000034A90341A60266007B0F0BD8D +:1014F0002518030017180300454AF0B50600C2601E +:10150000A022444B163608330360010000234282B8 +:101510000400320085B00371836003748382353127 +:101520001370013200259142FAD1802780222000D9 +:10153000D201BF001100F57737842B0000953830B9 +:1015400000F020FF23002100403303931A002B00FA +:101550005F311370013200258A42FAD1039B2200C9 +:10156000DD77230060331F80FC2364321178200074 +:101570000B401370230068331D70274B2900E3666E +:1015800025670C22783011F08FFC23002700883368 +:101590001D60224B0837FB67843729000C22380076 +:1015A00011F082FC1E4B1F4AFB602300A0333D61FB +:1015B0001A601D4A5D60DA601C4A1D619A61DD6136 +:1015C000300010F0C0FA039810F0BDFA184B601C00 +:1015D000E3602300C4331D705D709D70FF3002F026 +:1015E000E7FC8C235B00E55023001933FF335D617A +:1015F0008023104A5B00E250230001222000FE33CA +:1016000052425A86023B9D63DD631D6405B0F0BD06 +:101610004C3D0300EC3E03000C3D03002518030085 +:10162000171803001C3D03002C3D03003C3D030044 +:10163000343F03006C40030070B5074C2368002B57 +:1016400007D1A020400011F0DAFB0500FFF754FF9E +:101650002560206870BDC0461C26002070B50C2295 +:101660000D000021040011F01FFC00232361024B38 +:1016700025602000E36070BD3318030070B50025BD +:101680000400264B05710360254B45718360254B93 +:10169000C5604361244B85610362244B4562C3628C +:1016A000234B05638363C56329004430FFF7D6FFEE +:1016B000200029005830FFF7D1FF200029006C30AE +:1016C000FFF7CCFF1B4B220023602300F83280334E +:1016D00020C39342FCD126001D00E936FF362800C6 +:1016E00008220021083511F0DFFBAE42F7D18E222F +:1016F000330000209200A11801C300229942FBD1BF +:101700008E239B00E2540C490C4B6118E3181A809D +:1017100002339942FBD1200070BDC046383E030021 +:10172000E83D0300F83D0300083E0300183E0300B7 +:10173000283E0300C03F0300620200003A0200009E +:1017400010B5040002F01CF8034B1B68002B01D0FD +:101750002000984710BDC04620260020F0B58DB06F +:10176000050001F07FFA0020FFF766FF036807001D +:101770001B6998473B6804009B69380098473B68A1 +:1017800006005B6A380098470300288810380B2849 +:1017900000D997E003F020FE063D9696965A96965D +:1017A00096619673AF882000390010F0EEFB22009E +:1017B0006B7B583201931378A879190002231943DF +:1017C00006AB11701F80012306AA9370D07013001E +:1017D0006A461279E91D9A722B000622163307A871 +:1017E0000B9311F043FB29000B2006AB06220E31B0 +:1017F000C01811F03BFB94346368A360A068002814 +:1018000060D0C36806A99847A368002BF4D01B6971 +:10181000F3E720002E49AF8810F0B7FB220002202A +:1018200058321378A9798343137006AB1F809970DF +:10183000A0346368A360A068002843D0C36806A9E9 +:101840009847A368002BF4D01B69F3E75B69A91DD7 +:10185000002B37D0A888984734E0636EAF79002B0F +:1018600030D0A366A06E00282CD0C36839009847FA +:10187000A36E002B01D1636EF3E71B69F1E7012230 +:10188000AB7BE91D1A4001925A07920FDB080292C6 +:1018900006A806226F7B049311F0E8FA6A461279D3 +:1018A00006ABDA716A46127A9F711A726A46127C26 +:1018B00020005A722B000F3309938C348030236838 +:1018C00006A998472900300010F052FC0DB0F0BD79 +:1018D000FFFF00000723D72802D9024B186000231E +:1018E0001800704724260020014B18607047C0463E +:1018F000202600201FB5A3238022DB00D205D35869 +:101900000820DB0700D405301E4B48221E4902F098 +:10191000C3F900280AD080B2002807D1BFF34F8F47 +:101920001A4A1B4BDA60BFF34F8FFEE702AC082266 +:101930000021200011F0B8FA01232370154B20007C +:101940001B68636010F080F9002801D0072017E0C1 +:10195000684610F077F90028F8D1694610F070F960 +:101960000028F3D10C4802F0C7F980B2002807D153 +:101970000A4802F0CBF980B2002801D100F080FCC7 +:1019800004B010BD4F1C0300282600200400FA05F7 +:1019900000ED00E0242600205D1702004117020040 +:1019A00080B2002807D1BFF34F8F034A034BDA60A0 +:1019B000BFF34F8FFEE770470400FA0500ED00E02B +:1019C00070B500200C00FFF737FE03685B6A98478C +:1019D0002378142B17D002D8132B05D03FE0152BFA +:1019E00018D0222B35D03AE064680122A378190080 +:1019F0005D0811402A404568DB065B0F002D2ED0A4 +:101A00002088A8472BE08368002B28D06268917853 +:101A100010881CE06468A27813091207120F012ACB +:101A200002D0022A08D00DE0013BDBB20021022BDC +:101A300009D80C4AD15C06E00421012B03D0013106 +:101A4000022B00D00021C368002B08D020889847C3 +:101A500005E00369002B02D06268108898470020D7 +:101A600070BDC0468A4F0300014B18787047C046CE +:101A700012290020F0B51E002F4B87B00092019371 +:101A80001A78002305000C009A4252D101F0AAFEF8 +:101A9000002801D00B234CE0002E0ED003A92220F9 +:101AA000039610F0DCF8002807D00623082840D061 +:101AB00011384342434104333BE0002302AA1000A3 +:101AC000137000F093FE011EE4D101261B4F354038 +:101AD0003A783440B2432A436300022514000720B9 +:101AE000009AAC4302401C431C23AA409C4314436D +:101AF0003C7003AC0C22200011F0D6F90920104BE9 +:101B00003900039302AB0522C018257111F0AEF91C +:101B100021000C4800F0D6FE002807D00723042837 +:101B200007D0013B082804D0053302E0019B1E705A +:101B30000300180007B0F0BD1229002091200020FA +:101B4000C11902001129002010B5074800F084FFD8 +:101B50000023984206D00733042803D0013B08280D +:101B600000D00533180010BD11290020002373B5E3 +:101B700001930F4B01AD1B780E0029002B7001F073 +:101B800031FA041E04D0042305280FD007330DE0DA +:101B90003100280000F0D0FE2300002806D00723E3 +:101BA000042803D0013B082800D00533180076BD77 +:101BB0001129002073B5104C0E00050005222100EC +:101BC000684611F053F9012E06D0022E11D10122E0 +:101BD00023781343B34303E002222378B3439343B0 +:101BE00069462800237010F038F8031E02D00B233A +:101BF00000E00223180076BD91200020094B10B5AB +:101C00001A7801000923002A09D0074800F0CCFE09 +:101C10000023984203D003330E2800D0033318006A +:101C200010BDC0461229002011290020024B0B6074 +:101C3000092313607047C0468D4F030010B50400A0 +:101C40000020FFF7F9FC03681B6998470300F33392 +:101C50001C7086235B00C05003000021044AFC3343 +:101C60005A61044A99615A62F43010F032FE10BD94 +:101C70004D1E03005F1E0300012110B5044A080039 +:101C800001F094FF031E00D00B23180010BDC046C6 +:101C90003D1C0200F0B593B0019000200C00FFF74E +:101CA000CBFC03685B6A9847FFF7DEFE06AB0028B3 +:101CB0000DD000221A7105AA0692082218001A7384 +:101CC0000AAA9A60FFF79AFF002802D052E0187122 +:101CD000187300231F0023732371019BBA331B78F1 +:101CE000BB4246D907237B43019AD218BB321278F4 +:101CF000022A31D1002506AE337BAB4236D907200C +:101D00007843AB000293019BAA001818089BBB30D4 +:101D100099580FF0A6FF00281BD0B368AA009A5864 +:101D2000237BA1689B005A50237B01332373337BB1 +:101D30005A1E954208D01049B2685B189B009B5808 +:101D400003930399029BD15006AA137B013B1373A3 +:101D50000CE00135EDB2CEE701992279CB1821686C +:101D6000BB33920053502379013323717B1CDFB2C4 +:101D7000B3E7002013B0F0BDFFFFFF3FF0B59DB00B +:101D80001F006B4605001A70581C0622229E02ACEA +:101D900011F06CF8002F07D03B8823807B8863808C +:101DA000BB88A380FB8806E032232380DB18638096 +:101DB000F533A780FF33E3800CAB04A9049314AB85 +:101DC0008B602F000023B9370B710B733B78002B0E +:101DD00017D101203B78022708A903405A000B784D +:101DE000BB4304AF4F601343002E10D0B27983433E +:101DF000024013430B7033880B8173884B81B38887 +:101E000011E02800FFF746FF0028E2D029E02A0071 +:101E1000323212788343024013430B70AB8D0B8137 +:101E2000EB8D4B812B8E220068468B810FF047FF94 +:101E300003000020834214D00630082B11D005D8AF +:101E40000130042B0DD0834208D109E00520112B6D +:101E500007D0054A934203D0102B01D00B2000E09D +:101E600004201DB0F0BDC04602320000F0B50A7873 +:101E700004009BB00D000220012A42D04B88032AA7 +:101E800004D1A03B10009BB21F4A03E00320203B7B +:101E90001E4A9BB2934234D8AA881D4B03209A4213 +:101EA0002FD80AAB009312AB02936A460023260098 +:101EB00013711373B8363378002B05D069462000B0 +:101EC000FFF7E8FE00281CD104AF182200213800DB +:101ED00010F0EAFF2B7838003B7033783B726B468A +:101EE000FB606B883B82AB887B820FF0D2FE0200E6 +:101EF0000320002A05D101211000583423780B4318 +:101F000023701BB0F0BDC046603F0000E03F000002 +:101F1000FF3F000013B504680093A46813000A0093 +:101F20000149A04716BDC046FFFF000037B506AC0B +:101F30002578046801950093246913000A0001497B +:101F4000A0473EBDFFFF0000F0B589B00193070038 +:101F50000FAB0D0016000021082202A81C7810F01B +:101F6000A3FF0EAB1B8802AA1380019B0393002CD6 +:101F700006D03100280010F010F8002841D154E0BC +:101F80003B007A79F833A2423DD908331900083969 +:101F90000988B14208D130222034A400E35901332A +:101FA000DB7F134202D12EE00134ECE70222002055 +:101FB000DB06DB0F04ACD31AA370019B2680E36021 +:101FC0000EABA3601A4BA0809D4207D1FFF734FBF4 +:101FD00003681B6998470FF0DBFF0500210028000C +:101FE0000FF0DFFF80B200281FD011281CD013D8BB +:101FF000082817D002AA310028000FF0CEFF0028D1 +:1020000012D0032011E002AA310028000FF0C5FF12 +:102010000028F6D1063008E0064B984204D0064B63 +:102020009842E7D1062000E0052009B0F0BDC04687 +:10203000FFFF00000330000001340000F0B5050090 +:1020400097B008002E240B9100F046F904ABE41879 +:102050001090220010A901200FF09DFF002801D050 +:102060000320D4E023880B9A0A9093830B9B0A9A4F +:102070001B7D934250D96B791D2B01D90720C6E0F7 +:102080000B9B9B690C930A9B0C9A9B009C58636961 +:10209000002B46D1638B002B43D1631CDB7F022BCB +:1020A0003FD134E06979A31C1F31C9006918621C53 +:1020B000DB7FD27F089121002A3109780020079127 +:1020C00021002931097806910D9905910C99049107 +:1020D000217F0391218B0291618B019161690091B4 +:1020E00010A910F086F90028BAD16B7907001A0000 +:1020F000203292001F335451DB005B5BE3836B792A +:1021000001336B71230028331B78BB4237D80A9800 +:102110000130C3B20A93A9E72B79002001332B7158 +:1021200075E0200000F0D8F8002610900D960C966F +:10213000230028331B78B342B4D9626AB3009F5896 +:10214000342204AB9B1800221A700023002111AA2C +:10215000D21801335170102BF8D1462204AB9B18D2 +:102160002C4A11A938001A800FF09EFF002803D0D6 +:102170007B690C937B8B0D93731CDEB2D8E78E23A7 +:102180009B00EB5C132B00D978E7626ABB009E587A +:102190000023180011A90B70CA1801335070102BBE +:1021A000FAD11C4B30004B820FF07EFF0C900028C0 +:1021B0002AD1300000F090F88E229200AA5C738B36 +:1021C0001D32FF325200AA1802320292327F109062 +:1021D0000192328B10A9009272690C9810F0E5F907 +:1021E000002800D03CE78E238E219B00EA5C89000A +:1021F000531CDBB26B541D337A32FF3392005B0009 +:102200005651EB185B88F383781CC7B27AE717B096 +:10221000F0BDC0460129000070B505000FF0C1FCFB +:10222000041E1CD1280078222100803010F03CFED2 +:102230002800E93050222100FF3010F035FE280040 +:1022400008222100F83010F02FFE064B2822E81853 +:10225000210010F029FE8E239B00EC5400E00624A0 +:10226000200070BD3A0200000B68002B01D1036012 +:1022700002E0024B03600023436070474D1C0300E3 +:102280001FB502AC08220021200010F00DFE28230B +:1022900023806933FF336380E380803B01A8FF3BE9 +:1022A00005220C49037010F085F880B200280FD188 +:1022B0008020800010F07AF880B2002808D1200039 +:1022C00010F076F880B2002802D110F06DF880B2DC +:1022D00004B010BD964F0300F0B5438A87B0029357 +:1022E000037804000126002B3ED0244B24491A68B1 +:1022F0000393112301929C4600228519019B93426E +:1023000014D0674600235743CF19981E012803D9DC +:10231000FE5CE85C864207D10133102BF5D1112316 +:102320005A4389180E7C1FE00132E7E7280010F0BD +:1023300049F8237807000600002B01D1123425004C +:10234000019B042B10D011245C430D4B10221C194F +:102350002900200010F08AFD0023A370E370019B88 +:10236000039A01332774136005AB9E705888029B53 +:1023700000040343180007B0F0BDC04670260020DB +:1023800013290020F7B5FA26B6007143009308AB75 +:102390001B780400080015491700019303F026F884 +:1023A00085B2300025807843104903F01FF86B4652 +:1023B0001B8880B2A3806B461B796080A371032DBC +:1023C00001D80423238080232288DB019A4200D98C +:1023D0002380032801D80422628062889A4202D9AD +:1023E0008023DB0163802000FEBDC0467102000037 +:1023F000F0B58BB004AB9C1D0E230C220390019111 +:1024000023804B7806A95343234AD3181889220006 +:10241000032310F007F900283AD11827019B1F4D1C +:102420005B7826885F4300933B000833EB1832004B +:1024300006A91800029310F00AFD2C0000280DD107 +:102440000C22009B5343144AD318997A0223194053 +:102450001ED1E819182210F027FD19E0E819436889 +:102460000F4F002B00D10F4F18250322009B06A908 +:102470006B43E250E3185E603200029810F0F6FC05 +:10248000019B2A0059780398694338236118B8479B +:1024900000200BB0F0BDC046922800203827002055 +:1024A000F53902007D390200F0B585B004000E0058 +:1024B00002AA8178214801F03BFA00283CD10C2384 +:1024C00061781F4A4B43D3189B7A01921D4F5B06DC +:1024D00005D4022E03D01C4F012E00D01B4F1C250B +:1024E000A1781B4B69432A00591802A80023B8475A +:1024F000002813D1022E1FD00C234021627802A89D +:102500005343019AD3189A7A8A439A726178114B8D +:1025100069432A0059182B00B84701E0022E0BD05E +:102520000C232278210053430B4A02A8D3189B7A2C +:102530000A4A9B009B58984705B0F0BD60270020D1 +:1025400092280020F53902007D3902002926030077 +:10255000742600201C27002050270020F83F03008D +:10256000F7B518220190437826485A4381184C68E1 +:10257000254F002C0FD00C2159437918897A4DB280 +:10258000002D07DA490605D415000835A6B245190D +:10259000145802E00024260025000C225343FB18A7 +:1025A000188932002300290010F03AF80B2816D1C0 +:1025B0000C22019B29005B785343FB1818893200D9 +:1025C000012310F02DF80C21019B104A5B784B433E +:1025D000FF18388910F022F8002806D111E00028F1 +:1025E00000D00B48012C0CD1EDE70222094BC31897 +:1025F000934305D0082803D0112801D0002000E023 +:102600000348FEBD3827002092280020FFFF00006D +:1026100041800000FECFFFFFF8B50700487818247E +:1026200003006343084D0E00E818220038233900E8 +:1026300001F01CFA002806D173785C432C196368FA +:10264000013300D16060F8BD3827002070B51C242C +:1026500044430D4E05003019062234190021113073 +:1026600010F022FC10220021200010F01DFCFF239E +:102670002374A376013BFF3B23830233AB40034A21 +:1026800011689943116070BD742600205C270020FA +:1026900037B581B205006A46074801F049F9041EC2 +:1026A00008D15421684601F02DFA041E02D12800F9 +:1026B000FFF7CCFF20003EBD60270020F0B51D00D5 +:1026C000434B93B01B6801900F001600002B7CD089 +:1026D000189B542B79D8FF22002403AB5A709A70B0 +:1026E000DA701C7002AB1C74189B0B950A93A1B294 +:1026F00004AA384801F01CF9002809D1082204A9CD +:10270000019810F0A4FB002802D103AB9C7002E0FA +:102710000134062CEBD103ACA178FF2955D0032F4F +:102720000AD1189A06AB542A01D1343A00E040226B +:102730001A701A7803213AE0274BEB1AA72B10D80E +:10274000264B002E04D101228A40186810423CD04A +:1027500001228A40196891432022196006AB1A7041 +:1027600020E01F4BEB1A1B2B09D8202206AB1A7056 +:10277000002363700CAB0B9318230A9312E01948E3 +:102780002D1A172D21D8302302AA13740023637049 +:102790000133E370144B997A0223194002D11822B5 +:1027A00010F082FB06AB022F0CD101211A780A43EC +:1027B0001A7009AB0793064B32001B6806A920006C +:1027C000984702E01A780221F1E713B0F0BDC04645 +:1027D0005027002060270020742600205C2700205E +:1027E0001C2700203827002092280020F0B5040084 +:1027F00085B0002852D000252A4B2B481D605D7201 +:102800009D7201238372023B072229000381C37258 +:1028100010F04AFB18222900244810F045FB28003C +:102820000135FFF713FF062DF9D154236A46204FD7 +:102830009380204B39006846D580009301F014F84E +:1028400000282CD101231C4D24782B70002C1BD187 +:102850001C27A1B202AA164801F06AF8061E0CD184 +:102860003B00634315481C22C01802A9330001F045 +:10287000FDF8002804D02E7011E000232B700EE02C +:102880000134062CE5D10AE06B466A469B88D18864 +:102890003800594389B201F035F900E0084805B025 +:1028A000F0BDC04650270020922800203827002085 +:1028B00060270020BD260200572900207426002032 +:1028C0000E800000F8B5174B06001B780F00002B98 +:1028D00022D0002822D0002920D00B68002B1DD048 +:1028E000114D2C68002C1BD12800053108C0052291 +:1028F00010F0BCFA3B790220AB72012304212A7A42 +:102900009A4302438A432A72EA79134303438B436F +:10291000EB712000347004E0044802E0044800E059 +:102920000448F8BD572900205027002008800000E7 +:102930000E80000004800000154B1B78002B22D075 +:1029400000281ED000291CD00378002B1BD1114B6E +:102950001B68002B17D04278002A16D10E4B9B7AA9 +:10296000012B12D02420184003D0012310000B703B +:102970000CE05BB2002B02DA02230B7006E0087059 +:1029800004E0064802E0064800E006487047C046FA +:102990005729002050270020922800200E80000098 +:1029A0000880000010800000254BF0B51B78002B3C +:1029B00026D0002822D0002920D00B68002B1DD063 +:1029C0008B68002B1AD00378002B19D11D4A12688E +:1029D000002A15D01C0018001B4A10321B4DEF7A3C +:1029E0009F420FD1AF7A02252F420BD001331C3208 +:1029F000062BF3D108710C7300201FE014481DE072 +:102A000014481BE00F7BBC420CD20325977A2F4061 +:102A1000022F07D1133DAC46944466468D68A7004B +:102A20007E5101340F79B842E0D20225977A2F42C5 +:102A3000DCD10D6887007A510130D7E7F0BDC04680 +:102A400057290020502700207426002092280020BB +:102A50000E80000008800000104B70B51B78002B22 +:102A60001AD0002816D00478002C15D10C4B1B6806 +:102A7000002B11D020001C252B006343094AD318DA +:102A80009B7EFF2B02D02000FFF702FE0134062CB4 +:102A9000F2D102E0044800E0044870BD572900204C +:102AA00050270020742600200E80000008800000BF +:102AB0000048704791800000194A0300127810B551 +:102AC0000800002A28D0002B24D0002922D01C780E +:102AD000002C21D1134A1268002A1DD09978FF29B1 +:102AE0000AD15978FF2919D00C2359430E4B591894 +:102AF0008B7A9B0712D508E01C2359430B4B5918BE +:102B000002238C7E1C4009D11031072210F0AEF94F +:102B1000200004E0064802E0064800E0064810BD38 +:102B200057290020502700209228002074260020DA +:102B30000E8000000880000005800000F0B5244BE6 +:102B40008BB01B7806000C00002B3CD0002838D03E +:102B5000002936D00278002A35D11E4B1B68002B85 +:102B600031D08378052B30D81C256B431A49CB18FC +:102B70009B7EFF2B29D0E260837803AF6B43CB1899 +:102B80002361164B6261A26063602760817801AAAD +:102B9000134800F0CDFE002818D12B002A0001A90F +:102BA000380000F063FF002810D1E060B378606166 +:102BB0005D43094BA0605D19084B25616360276088 +:102BC00004E0084802E0084800E008480BB0F0BD07 +:102BD0005729002050270020742600205829002063 +:102BE000602700200E800000088000001080000098 +:102BF00013B5040081786A460B4800F099FE00285E +:102C000010D11C226078094B5043694618181300F4 +:102C100000F02CFF064B074A9B7A21009B009B5833 +:102C20006846984713BDC046602700201C27002037 +:102C3000502700200840030070B5050000241C2622 +:102C40003300634306492800C9180FF071FD0028BE +:102C500004D10134062CF3D1FF3000E0200070BD18 +:102C600074260020FF23F0B5BD4A8FB0127805000E +:102C70000393002A00D1AEE1BA4A116801920029FB +:102C800000D1A8E104AF7B70BB70FB70031D0693FD +:102C90002A23002602AA938203883E70B24C102B8E +:102CA0000AD0A67AB2075ED58288B0498A4207D098 +:102CB0002189914257D103E0A37ADB0705D48AE149 +:102CC000E27ABA7000227A704DE0112302AA1373DF +:102CD0007E7083880635238102230722A372290090 +:102CE000200010F0C3F82800FFF7A6FF0390FF288C +:102CF0002DD11C2070439E4B10301818072229003C +:102D000010F0A5F8002801D1039620E00136062E28 +:102D1000EFD102E0EB7903423DD10022019B05ACEB +:102D20001B682100380098472378122B00D052E10D +:102D30008D48837A012B00D14DE101238372023B40 +:102D40000381C3720722002110F0AEF843E108218D +:102D5000A27A039B0A43DBB2E372A2723800BB7013 +:102D6000FFF746FFD9E7172B46D101220420142490 +:102D7000019B01995B7A864393434B727A4B05A979 +:102D80000C709E72AC791900002CC3D0D87AFFF772 +:102D90007FFCAA79C2E7BB78FF2BBED00820064390 +:102DA000E87A8E72800706D51C205843704C201894 +:102DB000847E94438476CA7AFF2AAED01C22087897 +:102DC0006B4C5A4302280AD0A41820000722103066 +:102DD00010F04CF80222A37E9343A37607E0012172 +:102DE000A318644A528A1A839A7E8A439A760121EA +:102DF0003800FFF759FB90E7172B00D9A0E0132B01 +:102E000059D102AA137304231E43A672A81DFFF70B +:102E100013FF0390FF2802D0C0B2B870E072E37ACB +:102E2000FF2B21D10026E33B18007043504A1018B5 +:102E3000827EFF2A13D12378022B07D0FD23F83A94 +:102E400083762100103010F011F801E0FE23837624 +:102E500003AB1E70039BDBB2BB70E37211E0013663 +:102E6000062EE1D1444C0DE01623444802AA137308 +:102E700000210E22083010F017F84022A37A1343E5 +:102E8000A37200240021384B0B91DA7A1C235343A0 +:102E9000374A0D91D3180C93364B09910893019B37 +:102EA0000A911A1DA88808AB0FF0B4FB002800D0C7 +:102EB00091E0220032E7142B26D1E37AFF2B18D1C0 +:102EC0001C2200239446E98962465A432848821806 +:102ED000128B8A420AD1082203931643DBB2E372B3 +:102EE000A6723800BB70FFF783FE02E00133062BA9 +:102EF000EAD1E37A1F49FF2B00D10021A8880023E3 +:102F00001B4A0FF089FB66E0112B64D102233200CB +:102F10009A431300A272320707D55BB2002B0BDA7B +:102F200000213800FFF7C0FA06E0B878FF2803D088 +:102F3000FFF78CFBFF23BB701023A372023302E068 +:102F40001C2B03D1132302AA1373E6E6522B19D1CB +:102F5000019B0B4A9B7A38009B009B5898473AE0AC +:102F6000572900205027002092280020FFFF000052 +:102F7000742600201C2700204380000038270020F2 +:102F8000E83F0300182B26D1AB79112B14D133075E +:102F900012D512480E22002108300FF085FF1623AB +:102FA00002AA137302224A331E43019BA6725B7A64 +:102FB0001343019A5372B0E680235B421E4302AA78 +:102FC00095331373019BA6729B7A054A9B009B580D +:102FD00038009847A1E60FB0F0BDC0463827002062 +:102FE000E83F030030B5002912D00A78002A11D139 +:102FF0000A4B1B68002B0DD0FF23094C8B702589D1 +:10300000FA3B854207D14A70E37A8B70130002E0E5 +:10301000044B00E0044B180030BDC0465027002090 +:10302000922800200E8000000880000010B5064B9A +:10303000586980235B05421C04D0196989B202F0EB +:10304000D5F900E0586910BD00100010034B10B511 +:103050001B78034A9B009B58984710BD6F2900209E +:10306000184003000B0037B50C24020018009D68BF +:1030700009786C43044D08302D680095034D1B6999 +:103080006459A04737BDC046B02700209C270020C8 +:10309000802252051169142210B50E4889B20378B6 +:1030A0005343C3181A69501EDA881B898018C01848 +:1030B00002F09CF9084B02001B6801209A4207D8D5 +:1030C00000209A4204D1054B1B6858425841C0B2B7 +:1030D00010BDC046682700209427002098270020B4 +:1030E000082310B5034A116899431160FFF7AEFF3A +:1030F00010BDC046A8270020094A10B5136819075B +:103100000AD4990702D501210B4313600222054B13 +:103110001A70FFF79BFF01E0FFF7E2FF10BDC0460A +:10312000A82700206F290020064B10B51B681B073D +:1031300005D40122044B1A70FFF788FF01E0FFF766 +:10314000CFFF10BDA82700206F29002010B5002850 +:1031500014D0112805D10823094A11680B431360C4 +:103160000CE01423074A1178594351180431FFF732 +:1031700079FF0422044B1A7000F092F810BDC0468B +:10318000A82700206827002070290020F8B5142304 +:103190008025124A6D051478114E5C432B69141971 +:1031A000E2889BB2278920699A420ED92B6961690E +:1031B0009BB2D31A2A69381892B2C918C01892085B +:1031C0000FF050FA2B699BB205E09208381861693C +:1031D0000FF048FAE3883360F8BDC0466827002046 +:1031E000BC27002070B58025094B6D052A691C6835 +:1031F000631E94B25C43FFF719FF2B69411E9BB21B +:103200005943044B20001A680FF02CFA70BDC046D9 +:1032100094270020B8270020142270B580260E497C +:1032200076050B785343CB181A89DC881B69A418E0 +:103230003169E418200089B202F05EF90D00FFF751 +:10324000F5FE3369411E9BB25943044B49191A6874 +:1032500020000FF007FA70BD682700209827002093 +:1032600010B5FFF7E3FE8022074C52051369116980 +:10327000126924689BB292B289B201389208614304 +:1032800058430FF0EFF910BD9427002010B5034B01 +:1032900018680FF0E5F9FFF759FF10BD94270020DB +:1032A000F0B52B4B85B0187803284ED802F094F86F +:1032B000020E114B0023274A1360274A1360274B45 +:1032C0005B78002B41D000F0F9F83EE0FFF75EFF9D +:1032D0003BE0234C802723687F0501930123019A5B +:1032E0009A431423226002921C4A3969157889B2E4 +:1032F0005D4355192B691800039302F077F8194BB9 +:10330000039A18603969EB880600501E181889B2B4 +:1033100002F06CF8864203D10223029A134303E0C1 +:103320000323019A9A43130023600F4B1A680F4B33 +:10333000002A03D121680232114200D000221A7003 +:10334000FFF784FE01E0FFF7A1FF05B0F0BDC04626 +:1033500070290020B4270020BC2700206827002007 +:10336000A827002094270020B82700206F290020DC +:103370001422F0B580254B494B480B7885B0534358 +:10338000CB18DF68083A7A4382181489508952684A +:1033900060436D05821829691C890192DA881E69CB +:1033A00013199B19009300230292404A89B21360BB +:1033B000300002F0A1F83D4B2A00039300290BD105 +:1033C0002B6902999BB2994208D0019B00998B42CC +:1033D0004FD1002C59D101E0022F08D111693000E2 +:1033E00089B202F003F8324B186003233BE02969ED +:1033F000301989B202F080F82E4B89081960009AC2 +:10340000019B296993422DD089B2009802F074F88B +:10341000002927D080246B4664052169988889B2E9 +:103420001F8801F0E3FF26690500B1B2380001F002 +:10343000DDFFADB280B2854208D16B466A469B88FB +:1034400012889B1A039A9B0813600BE02369216979 +:10345000380089B29CB202F04FF889B2641A039B1B +:10346000A4081C600223144A1370FFF719FF05B06B +:10347000F0BD022FB2D02969301989B202F03CF8B0 +:103480000C4B890819602969BEE7022FA6D029696B +:10349000301989B202F030F8064B890819602B699F +:1034A000E0E7C046682700209C27002098270020DE +:1034B00094270020B827002070290020142210B57E +:1034C0000A490B785343CB18D988094A1B791160F4 +:1034D000032B08D0042B06D0012B06D1054A13700C +:1034E000FFF7DEFE01E0FFF743FF10BD6827002075 +:1034F000B027002070290020F7B5124D01936E7897 +:1035000008AC27880424022E1AD02C78A419012C88 +:1035100000DD023C14235C432C19626122002071FF +:103520000C3209C909C26B469B882781E3800024BD +:10353000054B01361B786E70A34201D1FFF7BEFF29 +:103540002000FEBD682700207029002070B51424DB +:10355000114D00202978614369180431FFF782FD7D +:1035600023000022012029784B43EB181A71DA80DE +:10357000D8601A615A611A816B780918013B6B7027 +:10358000CBB2022B01D02B7000E02A70034B1A70D3 +:10359000FFF786FE70BDC046682700207029002016 +:1035A000142210B507490B785343CB181B79042B11 +:1035B00002D0FFF7CBFF04E00122034B1A70FFF7A4 +:1035C0006FFE10BD6827002070290020F8B5082480 +:1035D0001D4F3D682C4022D180235B0519691B4B90 +:1035E0001E68002E1ED01422194889B20378534356 +:1035F000C3181A69501EDA881B898018C01801F098 +:10360000F5FE144B1B6898420CD1134B1C60012330 +:103610001D43124B3D601C70FFF718FD13E0FFF7D0 +:103620005FFD10E0FFF734FD002804D000220A4BB4 +:103630001A60023202E0002E03D00322074B1A70F8 +:10364000EAE7FFF7ADFFF8BDA82700209827002084 +:103650006827002094270020B82700206F29002029 +:10366000054B10B51B681B0702D4FFF799FF01E05B +:10367000FFF736FD10BDC046A827002070B5154DD8 +:103680002C68230723D4144A136801331360134BA7 +:1036900004221B68002B04D1FFF7FAFC002802D09B +:1036A00002220F4B0CE00F4B1B68002B0CD00121AA +:1036B00022000B4B0A4002D10C432C6000E0032295 +:1036C0001A70FFF7C3FC04E0FFF76AFF01E0FFF7A1 +:1036D00007FD70BDA827002094270020B8270020F0 +:1036E0006F290020982700201E4B10B51B78022B55 +:1036F00030D0032B19D0012B32D108211A4A13687C +:103700000B4222D1142319490A785A43184B8A18BC +:103710001968D3885B1A9BB2D380002B02D1FFF7C4 +:1037200015FF1DE0FFF732FD1AE008210E4A13686D +:103730000B420AD10F4A136801331360FFF7A8FC4C +:10374000002804D1FFF72CFF0AE08B431360FFF73A +:10375000A7FD05E0084B094A1B789B009B5898473A +:1037600010BDC04670290020A8270020682700202F +:10377000BC270020942700206F2900202C40030044 +:1037800070B5144C042522781300AB4321D00228D5 +:103790001DD003281DD1104B1B681B0717D40F49E0 +:1037A0000B6801330B60032B04D0022A0CD1FFF706 +:1037B0004DFC0EE014230A4A0D201178594351188C +:1037C0000431FFF74FFC2570FFF76AFD01E0FFF7BA +:1037D0008BFF70BD70290020A8270020B42700208F +:1037E0006827002010B501220024164B1C705C7065 +:1037F0001C71DC80DA601C615C611C811C765C835E +:103800001A625C629C629C830F4B1C80FFF70EFC6B +:10381000802304225B051B6902389BB258430B4B83 +:1038200018600B4B20001C600A4B1C601C815C81E3 +:10383000094B1C70094B1C60094B1C60094B1A603A +:1038400010BDC046682700209E280020AC2700201D +:10385000942700209C27002070290020B4270020F6 +:10386000BC270020A8270020F7B504222C4B040019 +:103870001B680E000820134251D00630002C4ED099 +:1038800000294CD02368002B49D080277F053A6956 +:10389000A38892B2934201D9072040E00F2BFBD9B5 +:1038A000E288002AF8D01F4953430D685B19009342 +:1038B000FFF7BCFB3B6901389BB25843194B01939E +:1038C000009B8342E8D8A3889C469B07E4D1164B13 +:1038D00004201F88012F22D00C237B43134A206829 +:1038E000D118985063468020376075604D600B8119 +:1038F000E288400503694A810169046960465043D2 +:103900009BB2C018013889B201F0FAFDA4B260433D +:1039100045190020019B01371D60034B1F80FEBD30 +:10392000A8270020AC2700209E2800209C270020EC +:10393000104B30B51C680823640719D506330028DE +:1039400016D0002A14D00368002B10D10A4D2C6821 +:10395000002C0CD02C8940686143091868894443C5 +:1039600068682418A14202D21360516000E0072366 +:10397000180030BDA82700209C270020F0B50400C7 +:103980001A4885B0056808206D072DD50630002936 +:103990002AD0002C28D025680738002D24D1144DBA +:1039A0002E68002E20D0666803962E896F896D6878 +:1039B0007743BC46039F6544AF4215D2002A13D01B +:1039C000964211D3D518AE420EDB032509302942A9 +:1039D0000AD12B4208D12F4206D100930F38130091 +:1039E0000A002100FFF788FD05B0F0BDA8270020E0 +:1039F0009C270020F0B504001A4885B0056808200F +:103A00006D072DD5063000292AD0002C28D0256836 +:103A10000738002D24D1144D2E68002E20D0666862 +:103A200003962E896F896D687743BC46039F654472 +:103A3000AF4215D2002A13D0964211D3D518AE4208 +:103A40000EDB0325093029420AD12B4208D12F422F +:103A500006D100930C3813000A002100FFF74CFD3B +:103A600005B0F0BDA82700209C270020F0B5170066 +:103A7000224A85B0126802900E009C460824530723 +:103A800039D50634002936D0002834D00C68002CF3 +:103A90002ED11B4D2A68002A2AD04A6868892989B4 +:103AA0006B684843C018824222D2002F20D0B9420E +:103AB0001ED36346F81881421ADB0321029B0B4296 +:103AC00018D163460B4215D11140039112D16244C3 +:103AD000110002983A000FF0C9F90C2332680097E0 +:103AE00053430221ED58039A029B3000A84702E09D +:103AF000072400E01024200005B0F0BDA827002016 +:103B00009C270020F0B51F4B85B01B6805000E00F8 +:103B100008245B0733D50634002830D00368073CFF +:103B2000002B2CD1184B1A68002A28D01A89476814 +:103B3000029258685B8953431B1803939F421ED21D +:103B40000934BB071BD1381A110001F0D5FC093C20 +:103B5000002914D10299300001F0CEFC89B200296D +:103B60000DD1002E0BD0039AF3199A4207D30022ED +:103B70003300009229000320FFF7BEFC0400200060 +:103B800005B0F0BDA82700209C2700200120054A91 +:103B900010B513785840044B10701B68002B00D0F0 +:103BA000984710BD71290020C02700200C4B70B52C +:103BB000050015200C001A600EF06EFD00280ED1D5 +:103BC000290015300EF06AFD002808D115300EF0DE +:103BD00061FD002803D1210003300EF061FD70BDAE +:103BE000C0270020F0B5274B85B01B78002B47D0AD +:103BF000254D264E2B6834685A425341DBB2009360 +:103C000063425C41E4B2009B002B37D103A80EF065 +:103C10004BFD05280AD0002804D000221100FDF732 +:103C2000BFFE05E003982B68984701E0012300934D +:103C3000002C1FD1164B03A91B8801240B80154BA8 +:103C40001B68180001930EF035FD071E052F0BD0E1 +:103C5000002805D000221100FDF7A2FE002403E099 +:103C60000198336898473C00009B002BCED0002C75 +:103C7000C9D005E0009B002BC8D001E0002CD9D0B2 +:103C800005B0F0BD72290020C8270020CC270020F5 +:103C9000A0280020C427002070B5040007200029B8 +:103CA00013D08D0711D109480160094920000A800D +:103CB000084A094913600EF0F9FC002805D10122D9 +:103CC000064B16301A700EF0EDFC70BDC4270020B4 +:103CD000A0280020D0270020B92603007229002048 +:103CE00010B50EF0E5FC03005A1E9341014ADBB209 +:103CF000137010BD722900200E23002802D0024B41 +:103D00001860002318007047CC2700200E230028DD +:103D100002D0024B1860002318007047C82700200B +:103D2000074B10B51B68002B07D09847002806D01A +:103D300000221100FDF734FE01E0FFF753FF10BD34 +:103D4000D0270020F0B50E788FB0002E00D097E07D +:103D5000514C02AB9A1D2100082305881380343191 +:103D6000073B28000EF0AEFC4C4B1B689847B12077 +:103D70000EF0AAFC002803D032003100FDF710FE3F +:103D80000EF0A4FC002803D000221100FDF708FE6D +:103D9000434E70690EF09CFC0196002803D000226F +:103DA0001100FDF7FDFD00233E4E28003100049375 +:103DB000FFF718F9051E4CD108A93A48FEF7BEFED8 +:103DC000071E33D10C9D07222900200010310FF06F +:103DD0004DF829001022E01D0FF048F82000089D42 +:103DE0001122290018300FF041F8200029002A3054 +:103DF00012310A220FF03AF820000EF06BFC002876 +:103E000003D03A003900FDF7CBFD012300240493D1 +:103E10000333069305A904AB224807930594FEF7E4 +:103E200047FEA04215D02200210010E02100300002 +:103E3000FEF742FE002803D02A002900FDF7B0FD5E +:103E400020000EF047FC002803D000221100FDF7EF +:103E5000A7FD8021C022144BC90352009950196854 +:103E600001200023114C02009A40114200D0E26769 +:103E70000133202BF7D1019B586900F04BF809E082 +:103E80000322012100F014F8002803D000221100C1 +:103E9000FDF786FD0FB0F0BDA228002018200020FD +:103EA000001000107329002000E100E004E100E0B0 +:103EB000F0B5060087B00E20002E22D03788124BB6 +:103EC00006389F421DD0114B1B78002B19D0104D86 +:103ED000102369706846032102ACC180AA700021DA +:103EE0001A0020002B700EF0DFFF338A21002380A0 +:103EF0000123A3706B4638000633A360E5600EF023 +:103F000038FC07B0F0BDC046FFFF00007729002055 +:103F100078290020F0B50300186880F308885868F5 +:103F2000FF2464B2EFF30585002D01D1A6460047BA +:103F3000251C061C21273FBAF0B4002400250026CA +:103F40000027F0B4F92040B20047C046F0BDC0469B +:103F500010B50400034B083303601C3000F0ACFBC9 +:103F6000200010BD4040030070B5050004000E4B5A +:103F70000E00083308C52800182200210EF094FF17 +:103F8000002320003100E36123626363A363E364E1 +:103F9000064A23001C3000F05FFB280031000EF0C1 +:103FA00084FD200070BDC046404003002928030066 +:103FB000084B10B508330360002343608360C3607F +:103FC000040000F0C5F8044920610EF08AFD2000CD +:103FD00010BDC046504003003F28030010B5040048 +:103FE000034B083303600EF037FC200010BDC046C1 +:103FF0005040030010B50400044B03600EF061FC58 +:104000002000FFF7EBFF200010BDC04680400300FA +:104010000C4B70B50360002343608360C360036290 +:1040200043628363962304009B01051DC36328003C +:1040300000F0A6F928002200034900F033FA20001E +:1040400070BDC04694400300EF28030010B5040083 +:10405000FFF7DEFF014B2000236010BDA4400300EA +:10406000F7B50027040008A8C7570E4800250830F8 +:104070002060082020610C48261D6560A56025731E +:104080006561A0610097300000F05EFF2B003000FA +:104090006269216900F0DEFE3000A16900F012FFC4 +:1040A0002000FEBDAC40030040420F0070B5094D3A +:1040B00004002B6883420BD0061D4269016900236E +:1040C000300000F0C7FEA169300000F0FBFE2C605C +:1040D00070BDC046D42700204261002210B5034BBA +:1040E00001611A60FFF7E2FF10BDC046D42700202F +:1040F000002210B5024B81611A60FFF7D7FF10BD97 +:10410000D427002070B504000D00160000211022F5 +:104110000EF0CAFE054B320023612900200000F09A +:10412000F1FD034B20001C6070BDC046A08601005D +:10413000D827002070B5054D04002B68834203D0BA +:10414000016900F099FD2C6070BDC046D8270020A1 +:1041500000487047D440030010B502480EF0CAFC76 +:1041600010BDC046D44003000848026803210A433A +:1041700002600749074A084B9B1A03DD043BC858F5 +:10418000D050FBDC05488047054800472405004027 +:104190007851030000200020C82000201D53020099 +:1041A00075810100FEE7FEE7FEE7FEE7FEE7FEE7BA +:1041B00001230E4A10B5936480230D499B00CB6701 +:1041C0000C491400086D0C4A002804D00020086532 +:1041D00011680131116009490B60A923DB001068E7 +:1041E000E358010C9BB20004184310BD009000403E +:1041F00004E100E0FC900040E827002000E100E03E +:10420000F8B50F4C636C002B0FD000270D4E676480 +:104210003378BB4209D00C4B1D68FFF7C9FF2D1A3C +:10422000BD4202DC3770FFF797FF236D002B06D0ED +:10423000064A1368013313600022014B1A65F8BD6A +:10424000FC90004080290020E4270020E82700207F +:104250001B4970B50C78002C30D10120194B1A4A3B +:10426000586054608024E405206050680028FCD029 +:1042700000220124042515481A500C30DC601D5022 +:1042800008381A501248C2251A50C12280209200C4 +:10429000000398508020400298500E48AD004659C7 +:1042A0000D4A3240C0263602324342518022893DB7 +:1042B0009200FF3D425102601C600C7070BDC04610 +:1042C0007F29002000900040FC0000400405000011 +:1042D0004C05000000E100E0FF00FFFF044B10B5BB +:1042E0001B78002B01D1FFF7B3FFFFF761FF10BD73 +:1042F0007F290020104B70B51B780400002B01D1E2 +:10430000FFF7A6FF0D4D0E4E2B78002B02D0336821 +:104310009C4210D0FFF74CFF201A0A2803DCFFF75D +:1043200047FF0A30040001232B70A823054A34609C +:10433000DB00A4B2D45070BD7F290020802900206A +:10434000E427002000900040012310B50A4ADC0059 +:10435000A4588C4207DD013BDB00D3185A68016882 +:10436000064BCA5007E00133112BF0D180210268BF +:10437000024B4905D15010BDDC400300240500006C +:10438000F8B50F000121254BB9400360A023244C50 +:10439000DB0516001A5905000A4380211A511A59E3 +:1043A00009060A430121B1401A511A598A4396213C +:1043B0001A511A598901520052081A51FFF7C4FFC5 +:1043C000002204202B6817495A506C39585001219B +:1043D000996019601900FC31CA6013495A506A602B +:1043E00014391F325A5011495F5009185A501E5142 +:1043F0007B1C03D0032138000EF015FC731C03D086 +:10440000032130000EF00FFC0122094B29001A6035 +:10441000084807320EF02AFDF8BDC04600200040D3 +:10442000140500006C0500001C0500000C050000D0 +:10443000EC270020AC290020962310B5DB00994220 +:1044400002DDFFF781FF04E09E210268014BC902F3 +:10445000D15010BD24050000C1230E4A9B00D15845 +:1044600010B5090603D50C49096A002908D1D358AB +:104470005B070DD5084B0021DB68002B01D107E05D +:104480000121064B1868002802D0054B1B6898478D +:1044900010BDC04600200040FC200040F027002056 +:1044A000F4270020034B1960436803499B005A50CE +:1044B0007047C046F4270020F027002000681F4BFB +:1044C00070B5C3185C4263415B00002A1BD0002911 +:1044D00003D0012905D1802100E00421C1229200EE +:1044E00081505CB2FF23C025E600B3401449AD0003 +:1044F0004A599A431000C0220123B240A34002430C +:104500004A510B6018E0002908D0012914D1C222B9 +:104510008024920084508258920806E0C22204212E +:104520009200815082580339D209914304D001226C +:104530009A401300034AD36770BDC04600E0FFBF36 +:1045400000E100E004E100E003681A00FC32106AB8 +:104550000128FCD100201062014AC9B2995070476D +:104560001C050000F7B5A223A022DB00D205D3581A +:10457000BE220193314B5200995800295DD0C121D0 +:1045800089005958002958DA0024E025C0269C509B +:10459000ED00B6022A4BA700F85800284AD0294B54 +:1045A000E35C002B30D0019B0121E3400B4212D091 +:1045B0002300A022C133FF339B00D2059B589B03ED +:1045C0009B0F032B07D0204B1B68E3400B4202D00C +:1045D0001E4B1B6817E0019B0122E340134213D1DD +:1045E0002300A021C133FF339B00C9055B589B0307 +:1045F0009B0F032B08D1164B1B68E340134203D0DB +:104600000221124B1B689847A023DB05FB185A595F +:1046100032420FD059590F4A0A405A51019AE2408A +:10462000D20702D55A59324303E080215A598902F0 +:104630000A435A5101341F2CACD1F7BD0060004031 +:10464000FC2700208129002078280020F82700205E +:104650007C280020FFFFFCFF30B5040008004D1C43 +:104660001CD00F482160BE24026000200D4A640067 +:1046700010510D4C8D002B5101240C4B5C54C12169 +:10468000802389001B065350094A0A4B5458234083 +:10469000C0242404234353504023136030BDC0463C +:1046A000F827002000600040FC270020812900201E +:1046B00000E100E0FFFF00FF00210368014A9B00CA +:1046C00099507047FC27002070B5A024E0250068B1 +:1046D000E40583001B19ED005E59204C34405C5109 +:1046E0001F4D0124002A0ED0A14204D181402A6826 +:1046F0001143296015E0022913D18440194A116839 +:104700000C4314600DE0012904D181402A688A43DA +:104710002A6006E0022904D1844012490A68A243B3 +:104720000A602A680121C2400A4204D10D4A126877 +:10473000C2400A4211D0A222A021D200C905895844 +:10474000F132C140FF32C90702D59958C02001E0BB +:104750008020995880020143995070BDFFFFFCFFF3 +:10476000782800207C28002000220B4B9A56824299 +:104770000AD001229A56824208D002229A56FF237A +:10478000824207D1022002E0002000E00120034B1A +:104790001870C3B258B2704797200020A02900209B +:1047A0000022134B30B59A56824209D001229A5604 +:1047B000824207D002229A560221824217D102E099 +:1047C000002100E001210A0045320A4C0A48FF326C +:1047D00092001450012215004800441CA54082405C +:1047E000A120064C2A43C0002250FF225A5430BD5B +:1047F00097200020031F02000060004000F00140ED +:104800000022F8B5124F0600BA563B00114D013296 +:1048100009D00122BA56013207D00222BA5602202C +:10482000013207D102E0002000E001201E54287070 +:10483000C0B20BE028780321013000F047FF0C00E4 +:1048400078562970FFF7ACFF3E55E0B240B2F8BD94 +:1048500097200020A0290020012370B51E0002002F +:10486000A0258640C132FF32ED0592005351134A14 +:104870000002AE50A226124A4C001043114A890091 +:104880008D18F600E4B2A851C046C046C0460E4896 +:10489000E20012180D482B6015500D48091891516F +:1048A0000C490D485550043950501900E2189140F8 +:1048B000A3400A4A0B4304498B5070BD0C0500000D +:1048C000030013000060004000F0014014050000E8 +:1048D00040A100401C0500004CA100400405000060 +:1048E000A820012110B5124A124B1488C00059604B +:1048F0001C50548810481C509088A922D20098500F +:104900008022082092009850802009320003FF3254 +:1049100098500A4A1078A222D2009850084A10886B +:10492000084A985000221960FC331A6510BDC04631 +:104930008A20002000A000404405000096200020AE +:10494000882000204C05000070B5012545570E0059 +:104950002800FFF709FF0400431C0ED12800FFF7D1 +:104960004FFF030051331D49FF331D4A9B000400D4 +:104970009950C1B22800FFF76FFF64B2194BA20033 +:10498000D6503200184B64001B78043BDA40174BBA +:10499000E252002E03D0164B1B689E420ED3280015 +:1049A000FFF7FEFE0123A022AB40D205002E02D06D +:1049B000A121C90000E00F4953500EE072B600215A +:1049C0000D4A074B11658021C122090392009950BD +:1049D0000A49053AFF3A995062B670BDFFFF0000E0 +:1049E00000A0004080280020962000208A2000207F +:1049F0001C2000200C050000FCA00040080800005E +:104A0000F8B5254B06001A780D00002A28D101219F +:104A1000224B234859601A5019502248C2271A5075 +:104A200004301A50204ABF001078A222D2009850B9 +:104A300080220820920098501C4A10881C4A9850E6 +:104A40001C48C259944664461B4A22408024E40311 +:104A50002243C2518022D200026019600E4B1970AD +:104A60002800FFF781FE0400431C0ED12800FFF749 +:104A7000C7FE030051331149FF33084A9B0004006D +:104A80009950C1B22800FFF7E7FE7570347030000E +:104A90000021FFF759FFF8BDA129002000A0004028 +:104AA000FC0F000004050000962000208820002054 +:104AB0004C05000000E100E0FFFF00FFFFFF0000E9 +:104AC000084B70B50D1C0400186801F01DFE291C70 +:104AD00001F016FB01F0AEFD01002000FFF734FFEE +:104AE00070BDC0461C200020F0B5254B85B01F6866 +:104AF0000D001A008F4240D0802104234902A942B0 +:104B00000ED3092B39DC15602A001E4903AE0B7049 +:104B1000043BDA401C4B00241A80FF23337007E06B +:104B2000132B2AD049000133E9E70134032C24D0A8 +:104B3000164B6200D25A164B9A42F6D0154BA20081 +:104B4000E35C7370144BD05801F0DEFD0090280038 +:104B500001F092FD0190380001F0D6FD011C019892 +:104B600001F004F9011C009801F0CAFA00F092FE6D +:104B700001003000FFF7E8FED7E705B0F0BDC04602 +:104B80001C20002096200020882000208A20002061 +:104B9000FFFF0000972000208028002010B50400AF +:104BA000081C054901F0ACFA01F044FD01002000A9 +:104BB000FFF79AFF10BDC0460024744901704B1CDA +:104BC0000AD001238B404360044BC360044B036154 +:104BD000044B4361044B83607047C0460805005096 +:104BE0000C05005010050050140500500261064AE3 +:104BF00010B54260054A01738260054A19000260DF +:104C00000EF033F810BDC0460405005010050050EA +:104C1000000700500368074A9950074AFC33196A95 +:104C2000002904D1013A002AF9D1012001E0002035 +:104C3000186270471C050000A186010010B50368CA +:104C4000002A03D0802202209200985001221C00EA +:104C50001A62084AFC34E068002804D1013A002AAC +:104C6000F9D1012005E00020A322E060D2009B588A +:104C70000B7010BDA186010010B50B4C02680B4BE8 +:104C8000A14204DC0A498160CC2149040AE0094CB4 +:104C9000A14203DC08498160802102E0074981606C +:104CA000CD21C904D15010BD8FD0030024050000D0 +:104CB000A08601007F1A060090D00300801A06002B +:104CC00070B504001000A025C026C130FF30F600EA +:104CD000ED05800046510800C130FF30800046518C +:104CE000A1252068ED004251054A8150190020009D +:104CF000FFF7C2FFA02305212268DB00D15070BD61 +:104D00000C050000F8B50E001500040000F074FA60 +:104D10002648F2B203780100DBB2012B06D14778B6 +:104D2000974203D18778E8B2874211D02048EFB28A +:104D30000378012B05D14378934202D18078B842A1 +:104D400011D00878002806D101230B704A708F70AB +:104D50006373184B15E0164B1978002907D1013100 +:104D600019705A709F7002236373134B09E0134844 +:104D70000DF072FE0023FC222360657126719362A0 +:104D8000FFDE19000022FC312360657126718A6202 +:104D9000A021C9005A500A4920005A5001325A50E5 +:104DA0002A003100074BFFF78BFFF8BDA229002036 +:104DB000A629002000300040004000409C4F030026 +:104DC000FC0F0000A0860100036800221900FC31DE +:104DD00010B58A62A021C9005A5006495A500132C2 +:104DE0005A5005220421825641568368FFF768FF16 +:104DF00010BDC046FC0F0000036800211A00FC3201 +:104E000010B5916001315961074B9168002904D1B7 +:104E1000013B002BF9D1012004E000240473FFF7CB +:104E2000D3FF200010BDC046A1860100036810B565 +:104E30001900FC318A6A0020012A08D1044C1C594F +:104E400088625A610238A40701D40120404210BD93 +:104E5000C404000070B51D00A02304001600DB0090 +:104E6000002D03D000224068C25001E00268D550F6 +:104E7000082902D010480DF0EFFD032E0AD83000AB +:104E800000F0AAFA0B020406022307E0042305E05F +:104E9000062303E009480DF0DFFD0023A0220848A7 +:104EA000D200002D03D061680B50022302E021687C +:104EB0000B5001238B5070BDAD4F0300C64F030054 +:104EC00054050000036810B55A1C2ED0A022002003 +:104ED000164CD20098501000154AA14202DC8021E5 +:104EE00089041FE0134CA14202DC8021C90419E0AF +:104EF000114CA14202DC8021090513E00F4CA142B4 +:104F000002DC802149050DE00D4CA14202DC80212C +:104F1000890507E00B4CA14202DC8021C90501E0B4 +:104F200080210906995001221A5010BD8FD003002C +:104F3000240500001FA107003F420F007F841E00D0 +:104F4000FF083D00FF117A00F7B5009308AB1B780E +:104F500005005BB20F0016000193013329D1624BAB +:104F60001A78022A10D15978FAB291420CD1997864 +:104F7000F2B2914208D1DA786B461B789A4203D19B +:104F800001235A4C03723BE0594A1378DBB2022BDF +:104F90000FD15078F9B288420BD19078F1B28842A3 +:104FA00007D1D1786A461278914202D12B72514CC6 +:104FB00026E04F4B1A78002A0BD10232F9B21A7050 +:104FC0005970F1B29970694609782A72D970494CC2 +:104FD00013E0454B1A78002A0CD102321A70FAB24B +:104FE0005A70F2B29A706A461278404CDA70012315 +:104FF0002B7202E040480DF02FFD019B01332ED1B2 +:105000000123002201205B426B6039003B4B2C6086 +:10501000E250E050A023C131FF31DB058900C850C8 +:10502000374967500099C131FF318900C850A1212B +:105030000098C90060503100C131FF318900CA5069 +:10504000A223DB00E650FC342800E26013000821B4 +:10505000FFF700FF2B492800FFF734FF42E0012350 +:1050600000225B422B60254B6C60E25001232349F8 +:1050700038006350A021C130FF30C9058000425084 +:105080003000C130FF30800042500098C130FF3006 +:10509000800042500198C130FF3080004250A22170 +:1050A000C900675016490098665004396050164987 +:1050B000019860502100FC318A60CA62A721C900B2 +:1050C0006350103163501148114960501149124822 +:1050D00060508021042089006050F939FF39280090 +:1050E000FFF7B8FEF7BDC046A229002000300040FF +:1050F000A629002000400040D74F0300FC0F00000D +:105100000C05000040420F0014050000AB290020F0 +:105110004405000034050000AA29002003681A0095 +:10512000FC32D0680028FCD105481950D16801290B +:10513000FCD10021D160A322D20098587047C0460C +:105140001C050000A023F0B5284FDB00FA5885B0FD +:1051500001920022A024FA50E023254AE405DB0056 +:10516000E658E2507833E15801250291E250A1233C +:105170008022DB00D205E2500420E5500DF015FE40 +:10518000A222D200A35803979B0F2B4205D0A3580D +:1051900013242B4202D0012018E01324A02501275C +:1051A000ED05013C002C10D0124B0420EF500DF007 +:1051B000FCFDA123DB00EF5004200DF0F6FDA2233F +:1051C000DB00EB585B00ECD5E5E72000A023E022F4 +:1051D0000299DB05D2009E5078329950A023039AA1 +:1051E0000199DB00D15005B0F0BDC0460040004041 +:1051F0000D0600000C050000A023E021134ADB058A +:10520000C90010B55A5078315A50114B002219007C +:10521000FC31CA600A62A1211E20C9005A500D4A01 +:105220000D4C9850CC200D4A40049850A2200C4AB6 +:10523000C00014500B4C0C48145001205050A022B8 +:105240000521D2009950FFF77DFF10BD0C0600002C +:10525000004000400C0500003841004024050000DB +:1052600000F001401C4000401405000070B50E0025 +:105270000F4C05002100300000F040F821002860AC +:105280000023CB565A1C05D09E4201D18B6802E008 +:105290000C31F5E70023A0210120064AC9002B713B +:1052A00050506A211B020B430349535070BDC04646 +:1052B0006441030000700040040500000C4B0D4ADF +:1052C00010B50D499C582140995001799C5809020C +:1052D0002143995080200122C0001A6019581142C0 +:1052E000FCD1A123024ADB00D05880B210BDC046D9 +:1052F0000070004004050000FF00FFFF10B504002F +:10530000431C07D00DF068FD0400431C02D1024885 +:105310000DF0A2FB200010BD0A500300234A10B577 +:1053200013781100012B19D1214B1B681B0715D1D4 +:10533000204BE0241A68F0231000184022420BD1C1 +:105340001D4A12681A4209D11C4A1D4B1A6080225C +:105350001C4B12021A6001E03028F1D00B68DBB25E +:10536000012B0DD1124A1268120709D1F021114AFE +:1053700012680A40402A03D10F4A12680A420DD02F +:105380008022A3230021D205DB00D1500E4B99606F +:10539000013191609A68002AFCD005E0C122802189 +:1053A000D200C9058B50EBE710BDC046E00F00F0FE +:1053B000E40F00F0E80F00F0EC0F00F0DFFF07C093 +:1053C00004050040186C0040FC000040014B1868C8 +:1053D0007047C0468C28002002B471464908490035 +:1053E000095C49008E4402BC7047C0460022430855 +:1053F0008B4274D303098B425FD3030A8B4244D39D +:10540000030B8B4228D3030C8B420DD3FF220902DE +:1054100012BA030C8B4202D31212090265D0030B9D +:105420008B4219D300E0090AC30B8B4201D3CB0393 +:10543000C01A5241830B8B4201D38B03C01A5241D5 +:10544000430B8B4201D34B03C01A5241030B8B42D7 +:1054500001D30B03C01A5241C30A8B4201D3CB02C2 +:10546000C01A5241830A8B4201D38B02C01A5241A7 +:10547000430A8B4201D34B02C01A5241030A8B42AA +:1054800001D30B02C01A5241CDD2C3098B4201D3C2 +:10549000CB01C01A524183098B4201D38B01C01A40 +:1054A000524143098B4201D34B01C01A52410309B7 +:1054B0008B4201D30B01C01A5241C3088B4201D366 +:1054C000CB00C01A524183088B4201D38B00C01A13 +:1054D000524143088B4201D34B00C01A5241411A3A +:1054E00000D20146524110467047FFE701B5002047 +:1054F00000F0F0F802BDC0460029F7D076E770470B +:1055000003460B437FD4002243088B4274D3030924 +:105510008B425FD3030A8B4244D3030B8B4228D3C5 +:10552000030C8B420DD3FF22090212BA030C8B42EB +:1055300002D31212090265D0030B8B4219D300E08B +:10554000090AC30B8B4201D3CB03C01A5241830B10 +:105550008B4201D38B03C01A5241430B8B4201D3C0 +:105560004B03C01A5241030B8B4201D30B03C01AE9 +:105570005241C30A8B4201D3CB02C01A5241830A63 +:105580008B4201D38B02C01A5241430A8B4201D392 +:105590004B02C01A5241030A8B4201D30B02C01ABC +:1055A0005241CDD2C3098B4201D3CB01C01A524123 +:1055B00083098B4201D38B01C01A524143098B42AC +:1055C00001D34B01C01A524103098B4201D30B0195 +:1055D000C01A5241C3088B4201D3CB00C01A5241BA +:1055E00083088B4201D38B00C01A524143088B427F +:1055F00001D34B00C01A5241411A00D20146524118 +:10560000104670475DE0CA0F00D04942031000D336 +:105610004042534000229C4603098B422DD3030A8B +:105620008B4212D3FC22890112BA030A8B420CD39B +:10563000890192118B4208D3890192118B4204D3C4 +:1056400089013AD0921100E08909C3098B4201D344 +:10565000CB01C01A524183098B4201D38B01C01A7E +:10566000524143098B4201D34B01C01A52410309F5 +:105670008B4201D30B01C01A5241C3088B4201D3A4 +:10568000CB00C01A524183088B4201D38B00C01A51 +:105690005241D9D243088B4201D34B00C01A524128 +:1056A000411A00D20146634652415B10104601D3B5 +:1056B0004042002B00D54942704763465B1000D33F +:1056C000404201B5002000F005F802BD0029F8D0E5 +:1056D00016E770477047C0468446101C62468C46E9 +:1056E000191C634600E0C0461FB501F031FF0028D9 +:1056F00001D40021C8421FBD10B501F085FE404213 +:10570000013010BD10B501F023FF002801DB00209F +:1057100010BD012010BDC04610B501F019FF0028D2 +:1057200001DD002010BD012010BDC04610B501F004 +:10573000ABFE002801DC002010BD012010BDC046DA +:1057400010B501F0A1FE002801DA002010BD0120F3 +:1057500010BDC0468446081C6146FFE71FB500F037 +:105760008BFC002801D40021C8421FBD10B500F0F9 +:1057700017FC4042013010BD10B500F07DFC002840 +:1057800001DB002010BD012010BDC04610B500F0A7 +:1057900073FC002801DD002010BD012010BDC046B3 +:1057A00010B500F025FC002801DC002010BD012010 +:1057B00010BDC04610B500F01BFC002801DA002027 +:1057C00010BD012010BDC046002B11D1002A0FD101 +:1057D000002900D1002802D00021C943081C07B4C9 +:1057E000024802A14018029003BDC046E9FEFFFF37 +:1057F00003B4684601B5029800F082F8019B9E460A +:1058000002B00CBC7047C0461300F0B545464E468A +:1058100057469146D2179B185340E0B404000D0040 +:105820009846DB0730D506000F0001239A46434611 +:105830005B08984618D022002B002000290001F0B8 +:10584000F1FE5346424604000D001342EFD00B0018 +:1058500002003900300001F0E5FE43465B08060017 +:105860000F009846002BE6D14B4630003900002B44 +:1058700005DA32003B000020054901F0AFFA1CBCFC +:1058800090469946A246F0BD0026014FCDE7C0469E +:105890000000F03F9E2110B5C905041CFFF78AFFE8 +:1058A000002803D1201C00F0C5FE10BD9E21201C45 +:1058B000C90500F039FD00F0BDFE80231B069C46A3 +:1058C0006044F2E770B500220C4B04000D00FFF7B6 +:1058D00037FF002804D12000290002F091FC70BDA0 +:1058E000064B00222000290002F016F902F088FC85 +:1058F00080231B069C466044F1E7C0460000E0415F +:10590000F0B54D46564644465F46F0B4924683B0E5 +:1059100004000D0099468B422FD82CD049465046A2 +:1059200002F01CFE29000600200002F017FE331AC8 +:105930009846203B9B4600D574E053465A46934018 +:105940001F005346424693401E00AF4229D826D03E +:105950005B46A41BBD41002B00DA79E00022002346 +:105960000092019301235A4693400193012342463A +:105970009340009319E08242D0D900220023009284 +:1059800001930C9B002B01D01C605D600098019975 +:1059900003B03CBC90469946A246AB46F0BDA3423C +:1059A000D6D900220023009201934346002BE8D071 +:1059B000FB0772081A4346467B080EE0AB4201D152 +:1059C000A2420CD8A41A9D41012024196D41002146 +:1059D000013E24184D41002E06D0AB42EED9013EC7 +:1059E00024196D41002EF8D15B46009801990019E9 +:1059F0006941002B22DB2B005A46D3402A00444643 +:105A0000E2401C005B461500002B2CDB26009E406C +:105A1000330026004746BE403200801A994100906C +:105A20000191AEE7424620239B1A5246DA40414696 +:105A300013004A468A4017001F4382E7424620234C +:105A40009B1A2A0046469A402300F3401343D5E7A9 +:105A50004246202300219B1A00220091019201223C +:105A6000DA40019282E74246202326009B1ADE405C +:105A70002F00B446974066463B003343C9E7C04613 +:105A8000F8B54A02430244004E00C50F240E280018 +:105A90009B09360EC90F92098D4259D0A01B0028D0 +:105AA00000DC8DE0002E1AD1002A00D079E05A07E0 +:105AB00004D00F221A40042A00D004335A0138D5EA +:105AC0000134FF2C00D189E028009B015B0AE4B27D +:105AD0005B02E4055B0A2343C0071843F8BDFF2CB3 +:105AE000E5D08021C9040A431B2800DD89E01600A7 +:105AF0002021C640081A8240511E8A4132439B1A17 +:105B00005A0114D59B019E09300002F009FD0538A9 +:105B10008640844265DC041B330020200134E340CE +:105B2000041BA640721E964100243343BFE75A0768 +:105B3000BFD1DF082800FF2C2FD1002F00D187E034 +:105B40008022D20313003B435B025B0AFF24BFE7C2 +:105B5000A11B002949DD002E29D0FF2CA7D08026CB +:105B6000F60432431B2900DD8DE017002026CF40CC +:105B7000711A8A40511E8A413A439B185A01D6D560 +:105B80000134FF2C64D0012276491A405B080B4097 +:105B900013438CE7031ECAD100207B025B0AE4B2E8 +:105BA00096E701380028AAD0FF2C9DD17FE7002A74 +:105BB00000D17CE701390029DFD0FF2CD2D176E774 +:105BC000002820D1601CC0B2012853DD80279E1A16 +:105BD000FF0437402FD0D61A0D0095E72800002388 +:105BE00076E7614B241A334061E700294DD1611CEF +:105BF000CEB2012E2FDDFF292AD09B185B080C00A6 +:105C000055E701227BE7002C1BD1002B5BD0C04362 +:105C100000280CD0FF2E7ED01B2800DD92E01D0056 +:105C20002024C540201A8340581E83412B43D31A99 +:105C300034000D0064E7002E00D065E7002000244A +:105C4000ABE7FF2E67D08024E40440422343E3E720 +:105C5000FF2400233CE7002C61D1002B7ED0002ADA +:105C600000D124E79B185A0100D460E73E4A0C009B +:105C700013401CE7002C1ED1002B2FD1002A66D028 +:105C800013000D0013E7012277E7002C1FD1002B32 +:105C90005AD0C94300290BD0FF2E50D01B295FDCFE +:105CA0001F002024CF40611A8B40591E8B413B437B +:105CB0009B18340062E7002B1CD1002A4AD0130045 +:105CC0000D00FF24F3E6130034000D00EFE6FF2E75 +:105CD00035D08024E40449422343DFE7002A00D181 +:105CE000E5E68027981AFF04074000D152E7D31A4F +:105CF0000D00DCE6FF24002A00D1D8E68020DB0876 +:105D0000C003034204D0D208024201D113000D00A7 +:105D1000DB00FF24CBE61300FF240D00C7E6002BB9 +:105D20000DD0FF24002A00D1C1E68021DB08C90381 +:105D30000B42EDD0D2080A42EAD11300E8E7130083 +:105D4000FF24B4E6012372E713003400AFE6002716 +:105D5000002022E780270020FF03F1E61300A6E6DB +:105D60000123A5E7FFFFFF7DFFFFFFFBF0B55646D0 +:105D700044465F464D46F0B444024600C70F83B028 +:105D80008846650A360EBA463DD0FF2E22D0002343 +:105D9000EC00802599469B46ED0425437F3E434613 +:105DA0005C025800DB0F640A000E984636D0FF28CC +:105DB00030D080230021E400DB041C437F38301AFC +:105DC0000190484642460843724E800030587A405F +:105DD00013008746002D44D108239946063B9B4675 +:105DE000DDE70122FF2000241A406402C305640A93 +:105DF000D2071C431443200003B03CBC9046994694 +:105E0000A246AB46F0BD002D20D104239946033BAA +:105E10009B46C4E7002C17D1022102E0002C0AD1D6 +:105E20000121321A01924A4643460A435A489200D7 +:105E300082587B409746200002F072FB431F763069 +:105E40009C4040420021BAE70321B8E7280002F055 +:105E500067FB431F9D4000237630464299469B4690 +:105E60009DE70C239946093B9B4698E78024002236 +:105E7000E403FF20B9E70024C2468B465A46534646 +:105E8000022AAED0032A7DD0012A31D1012200207E +:105E90001A400024A9E70122101A1B2856DD1A40D7 +:105EA00000200024A1E78023DB031D424BD1802387 +:105EB000DB032B435C02640A3A00FF2095E76D0187 +:105EC0006001854230D2019A0024013A01921B22DE +:105ED0000127290064006D00002901DBA84201D8D8 +:105EE0002D1A3C43013A002AF3D16A1E95412C43F6 +:105EF00001987F300028CEDD620704D00F222240B7 +:105F0000042A00D00434220103D5244A0198144005 +:105F10008030FE2800DD64E70122A401640AC0B2DB +:105F20001A4062E72C00A9E72D1A1A220124CFE7B4 +:105F30006B02BCD500248023DB031C436402640A8B +:105F40004246FF2051E71C42B3D1F4E72100202252 +:105F5000C140101A8440621E94410C43620704D071 +:105F60000F222240042A00D00434620104D5012209 +:105F700001201A40002438E70122A401640A1A40D3 +:105F8000002032E78023DB031C436402640A52468C +:105F9000FF202AE7B8410300F8410300FFFFFFF7A5 +:105FA000430270B542004C005D0AC30F4802120E56 +:105FB000460A240EC90FFF2A0FD0FF2C11D0012052 +:105FC000A24200D070BDB542FCD18B420DD0002A58 +:105FD000F8D12800431E9841F4E70120002DF1D1AB +:105FE000EBE70120002EEDD1E9E70020EAE7C0460B +:105FF0004302F0B542005D0AC30F4802440A48005C +:10600000120E000EC90FFF2A1FD0FF2822D0002A2F +:1060100009D16E426E4100280FD1002C0DD1002015 +:10602000002D09D005E0002801D1002C01D08B42C1 +:1060300013D0584201231843F0BD002EF7D0484238 +:106040004141012049420843F6E7002DDDD00220FE +:106050004042F1E7002CDAD0F9E78242E9DC04DBC8 +:10606000A542E6D80020A542E6D25842434101208D +:106070005B421843E0E7C0464302F0B542004C00E3 +:106080005E0AC30F4802120E450A240EC90FFF2AEA +:1060900017D0FF2C19D0002A0BD170427041002C70 +:1060A00017D0002807D04842414101204942084307 +:1060B000F0BD002C13D08B4214D05842012318435A +:1060C000F6E70220002EF3D1E3E70220002DEFD106 +:1060D000E1E7002DE5D10020002EE9D0EDE7002D0D +:1060E000E9D1EAE7A242E8DC04DBAE42E5D80020D1 +:1060F000AE42DDD25842434101205B421843D7E70C +:10610000F0B557464E4645464300E0B44602884641 +:10611000760A1F0EC40F002F47D0FF2F25D0002373 +:1061200080259A469946F600ED042E437F3F43466C +:1061300042465D02D20F5B006D0A1B0E904640D0B6 +:10614000FF2B39D080220020ED00D20415437F3B85 +:10615000FB1842465746591C62408C4607430F2F96 +:106160005CD86F49BF00C9598F46002E45D108231E +:106170009A46063B9946DAE7424602282DD0032884 +:1061800000D1C3E0012800D0A2E000250026024093 +:10619000D4B27602ED05760A2E43E407264330009A +:1061A0001CBC90469946A246F0BD002E1AD104238D +:1061B0009A46033B9946BAE72A00511E8A41901C31 +:1061C000C6E70120002DC3D0280002F0A9F9431F23 +:1061D00076309D4043420020BAE70124FF25144059 +:1061E0000026D6E7300002F09BF9431F9E400023B3 +:1061F000763047429A46994699E70C239A46093BDE +:10620000994694E780260024F603FF25C1E7350070 +:106210004846B2E7350022004846AEE72904090C9B +:106220000800370C3604360C2C0C79437043674356 +:106230007443060C64183619B14203D9802149020F +:10624000884647440004000C310409188D01681E7B +:106250008541890E2943350CED19AD010D43290106 +:1062600004D5012369081D4063460D4319007F31A1 +:10627000002925DD680704D00F202840042800D01D +:106280000435280103D5274980330D401900FE2924 +:10629000A3DC0124AD016E0A1440CDB279E7802061 +:1062A000C003064207D0054205D128434602760ABC +:1062B0004446FF256DE706437602760AFF2568E728 +:1062C0000124611A1B2905DD14400025002660E722 +:1062D0006346CBE72E002023CE40591A8D406B1E1B +:1062E0009D412E43730704D00F233340042B00D06D +:1062F0000436730104D5012401251440002648E723 +:106300000124B601760A1440002542E780260124C4 +:10631000F6032E437602760A1440FF2539E7C0467D +:1063200038420300FFFFFFF7F8B54A024E00430270 +:106330004400240EC50F9B09360EC90F9209FF2E8B +:1063400000D183E001204140A01BA9425CD000287D +:1063500000DC95E0002E1CD1002A00D081E05A0715 +:1063600004D00F221A40042A00D004335A013BD52E +:106370000134FF2C00D191E001209B015B0AE4B2C3 +:1063800005405B02E4055B0AED0723432B4318003D +:10639000F8BDFF2CE3D08021C9040A431B2800DD8F +:1063A00090E016002021C640081A8240511E8A4102 +:1063B00032439B1A5A0115D59B019E09300002F009 +:1063C000AFF80538864084426CDC041B3300202083 +:1063D0000134E340041BA640721E9641002433435F +:1063E000BDE70D005A07BCD1DF0801231D40FF2C7B +:1063F00033D1002F00D190E08022D20313003B4321 +:106400005B025B0AFF24BCE700284FDD002E2ED084 +:10641000FF2CA4D08025ED042A431B2800DD97E043 +:1064200016002025C640281A8240501E8241324361 +:106430009B185A01D5D50134FF2C6DD001227B4821 +:106440001A405B08034013430D0088E7002A00D080 +:106450007AE777E7031EC5D100257B025B0AE4B229 +:106460008FE701380028A4D0FF2C97D177E7002AC6 +:1064700000D174E701380028DAD0FF2CCDD16EE7C7 +:10648000002821D1601CC0B2012858DD80279E1A47 +:10649000FF0437402FD0D61A0D008FE701231D408F +:1064A00000236EE7624B241A334058E7002851D18D +:1064B000601CC6B2012E33DDFF282DD09B185B086F +:1064C00004004CE7012274E7002C1AD0FF2E1FD0E5 +:1064D0008024E404404223431B2800DD96E01D0095 +:1064E0002024C540201A8340581E83412B43D31AD1 +:1064F00034000D005EE7002E00D05FE70025002489 +:10650000ABE7002B44D0C0430028F0D0FF2EE3D1EE +:106510001300FF240D0022E70D00FF24002330E7C5 +:10652000002C5DD1002B7DD0002A00D117E79B18ED +:106530005A0100D456E73E4A040013400FE7002CEE +:106540001ED1002B2FD1002A65D013000D0006E7C5 +:1065500001226DE7002C1FD1002B59D0C043002829 +:106560000BD0FF2E4FD01B285EDC1D002024C54021 +:10657000201A8340581E83412B439B18340058E750 +:10658000002B1CD1002A49D013000D00FF24E6E6A1 +:10659000130034000D00E2E6FF2E34D08024E40422 +:1065A00040422343DFE7002A00D1D8E68027981A2B +:1065B000FF04074000D14DE7D31A0D00CFE6FF24BA +:1065C000002A00D1CBE68020DB08C003034204D0C0 +:1065D000D208024201D113000D00DB00FF24BEE609 +:1065E000002B10D0FF24002A00D1B8E68020DB0861 +:1065F000C003034203D0D208024200D11300DB00E3 +:106600000D00FF24ABE61300FF24A8E601236EE78C +:1066100013003400A3E6002700251EE7802700258D +:10662000FF03E9E613009AE60123A6E7FFFFFF7DDB +:10663000FFFFFFFB4302590A4300C20F1B0E00205D +:106640007E2B0EDD9D2B0DDC802000040143952B5D +:106650000BDC9620C31AD9400B005842002A00D107 +:1066600018007047034BD018FBE7963B99400B008E +:10667000F3E7C046FFFFFF7F70B5002830D0C31797 +:10668000C5185D40C40F280001F04AFF9E231B1A65 +:10669000962B0DDC9622D21A95406A02520AD8B285 +:1066A0005202C005520AE40702432243100070BDA3 +:1066B000992B19DC9922D21A9540124A2A4069076F +:1066C00004D00F210D40042D00D00432510103D518 +:1066D0000C4B1A409F231B1A9201520AD8B2DFE7D3 +:1066E000002400200022DBE705222E00121AB92127 +:1066F000D6402A00C91A8A40551EAA4135001543C2 +:10670000DBE7C046FFFFFFFB70B5041E28D001F099 +:1067100007FF9E231B1A962B0ADC9622D21A94405E +:106720006202520AD8B25202520AC005104370BD2A +:10673000992B18DC9922D21A9440114A2240610701 +:1067400004D00F210C40042C00D00432510103D599 +:106750000B4B1A409F231B1A9201520AD8B2E2E750 +:1067600000200022DFE705222500121AB921D540BA +:106770002200C91A8A40541EA2412C001443DCE7AF +:10678000FFFFFFFBF8B556465F464D464446F0B462 +:106790000F00FD0FAA4609037C002E005F00450F85 +:1067A000490A7F0D2943C5001803BC46400A570F0C +:1067B000640DDB0F3843D2009A4500D1AAE066464B +:1067C000A61B002E00DCFFE06346002B39D103003E +:1067D000134300D0D9E06B0709D00F232B40042BC3 +:1067E00005D02B1DAB42AD416D4249191D000B0276 +:1067F00000D482E0CA4B01349C4200D1FEE00A0082 +:106800005646C84BED081A4050076405520205432E +:10681000120B640D002112030B0D1B056405120BF6 +:106820001A436308C04CF60714401C436400640814 +:106830003443280021003CBC90469946A246AB4612 +:10684000F8BDB74B9C42C6D080231B041843382E9A +:1068500000DDEBE01F2E00DD1EE120239B1B9C468C +:1068600003006746BB40984613004746F3403B434E +:106870006746BA40571EBA4113430200F240EB1A72 +:106880009D42B6411D008A1A7642911B0B0231D5FA +:106890004A02560A002E00D1B4E0300001F040FE5A +:1068A0000300083B1F2B00DDB5E020222900D21A8F +:1068B000D1409E400A009D4032439C4200DDB1E041 +:1068C0001C1B631C1F2B00DDD5E0202114002800B9 +:1068D000C91A8C40D8408D400443DA40681E854177 +:1068E00011002543002476E74146314300D134E2CC +:1068F000310045466B0700D06FE756464807ED0864 +:10690000C9080543864B9C4235D00A036405120B27 +:10691000640D7FE76346E31A9B46002B00DC8BE0A7 +:106920006746002F3CD07E4FBC4200D153E7802702 +:106930003F0438435B46382B00DCF7E00243501E2F +:1069400082410020D2B253194218AB4289411D0046 +:10695000494289180B02CDD5714B01349C4200D1BC +:106960003DE101206F4A6B080A4028401843D507D3 +:10697000054351082FE72B000B4300D1CBE18023C7 +:106980001B030B431A03120B44E7013E002E6DD18B +:10699000AE1AB5429B41091A5B42C91A350075E728 +:1069A0000700174300D116E701235B429C46E344EE +:1069B0005B46002B00D0E0E0AA18AA429B410918D0 +:1069C0005B4259181500C5E7002E75D1661C760587 +:1069D000760D012E00DCF3E0AE1AB0464545BF410E +:1069E0000E1A7F42F61B370200D48FE0551BAA42D5 +:1069F000B641411A76428E1B9A464BE75646002214 +:106A0000002507E7280001F08BFD20300300083B3C +:106A10001F2B00DC49E72A002838824000259C42D1 +:106A200000DC4DE73F49E41A1140D4E60243501E12 +:106A30008241D3B2002222E7002B00D0F3E0631C96 +:106A40009C465B055B0D012B00DC9FE0344B9C45B5 +:106A500000D1C3E0AA180918AA4280414042411857 +:106A6000CD075208154349086446B4E62C4B9C42B6 +:106A700000D0ECE6AFE611001F3CE1400C00202BFB +:106A800000D17FE04021CB1A9A4015436A1E954100 +:106A90000021254300242DE733000700203BDF4081 +:106AA0003B00202E70D04027BE1BB0400243501E3A +:106AB000824113430022E2E6002C4FD0184CA4453B +:106AC00000D1ABE08024240476422143382E00DD3F +:106AD000DFE01F2E00DD43E12027BC1BA1460C0098 +:106AE0004F46BC40A0462C004746F4403C434F462E +:106AF000BD406F1EBD41F1402C43151BAA4292417F +:106B0000411A5242891A64469A46BFE641464546B2 +:106B1000314300D0BEE6002600240025F2E6C04640 +:106B2000FF070000FFFF7FFFFFFF0F801F2B59DCD7 +:106B30002027FF1ABC46070063469F405B46B946C4 +:106B40001700DF40B8464F4643461F4363469A400E +:106B5000531E9A415B463A43D840F4E60C002C435E +:106B60005CD0F643002E55D1551BAA42A441411AD0 +:106B70006442091B9A46644688E6964FBC4200D0A0 +:106B8000D8E628E6002280E700208FE70B002B43A1 +:106B9000002C00D0C2E0002B00D101E10300134320 +:106BA00000D118E6AB18AB42B6410918764271180D +:106BB0000A0200D409E1884A1D00114064460AE631 +:106BC000002C5BD10E002E4300D08AE0010011435F +:106BD00000D1C2E0010015009A46FCE564460021A0 +:106BE00000258FE620235B429C46DC446346070079 +:106BF000DF405B46BC46202B00D1ACE040235F4623 +:106C0000DB1B98400243501E8241634613431A0027 +:106C1000002098E66F4CA44500D057E7010015000E +:106C200064469A46D7E5002C39D10C002C436ED02F +:106C3000DB43002B1AD0674CA44568D0382B00DD0D +:106C4000A4E01F2B00DDAEE020240F00E41AA740D3 +:106C5000B9462F00DF40B846A3464F464446274377 +:106C60005C46A5406C1EA541D9403D43AD189542F8 +:106C70009B4109185B42591864466BE60C002C4393 +:106C800015D1010011437BD0010015009A46514CEB +:106C9000A1E50D43691E8D410021ECB22DE74D4C5D +:106CA000A44534D0802424045B422143C6E7040079 +:106CB00014434ED0ED084C072C438025C9082D0302 +:106CC000294208D0C6082E4205D1D20841071143F7 +:106CD0000C009A463100620FC900E50011433D4C9B +:106CE00079E50600164300D175E5AE1AB046454574 +:106CF000BF410E1A7F42F61B370200D4F4E5551B44 +:106D0000AA42B641411A7642891B9A4663E50100C0 +:106D1000150064465FE5002200257BE5002B3BD093 +:106D20000300134315D0ED084B072B438025C908FA +:106D30002D03294207D0C4082C4204D141070B007F +:106D40002100D2081343C9005A0F1143DD00214C22 +:106D500041E5204C3FE5002054E700260025D1E521 +:106D600034000F00203CE7403C00202E2BD0402771 +:106D7000BE1BB1400D43691E8D4100212C43BCE672 +:106D8000802100260903134C0025BBE50D43691E35 +:106D90008D410021EDB269E7010015000D4C1AE5A7 +:106DA0000100150017E51C000F00203CE7403C00E7 +:106DB000202B0CD04027FB1A99400D43691E8D41B2 +:106DC0000021254352E70021D4E71D0092E5002170 +:106DD000F3E7C046FF070000FFFF7FFFF0B5564610 +:106DE0004D4644465F46F0B41D000E034C00CB0FE9 +:106DF00087B0070092468146360B640D98466AD0EC +:106E00006D4B9C4235D08022430F12041343F60091 +:106E10001E43C3009946694B00279C4600236444E7 +:106E200002932B0368001B0BED0F51469B46400D50 +:106E3000009500D178E0604B98426CD05B46DA0058 +:106E40004B0F802109040B4313439B465346D90043 +:106E50005A4B9C46002360444246201A6A409246A0 +:106E600001901F430F2F00D9B0E05548BF00C05913 +:106E70008746374300D088E000239946023308272D +:106E800000260293CDE74346B34649460093029B52 +:106E9000009A9246022B00D0BFE100215346012206 +:106EA000002689461A40444B002136030C0D240568 +:106EB000360B2643434C1B0526401E437600D20763 +:106EC000760816434846310007B03CBC90469946C8 +:106ED000A246AB46F0BD330003434FD0002E00D195 +:106EE000BCE1300001F01CFB03000B3B1C2B00DD60 +:106EF000ADE11D220100D31A08393A008F408E40BF +:106F0000DA40B9461643304B00279C4600236044C4 +:106F10004442029385E753465A4613432CD100233B +:106F200000219B46023397E70B4320D05B46002BA2 +:106F300000D19EE1584601F0F3FA03000B3B1C2BF5 +:106F400000DD8FE102005946083A91408B461D2131 +:106F5000CB1A5146D9400B0059460B4351469B462C +:106F60009140194B9C4660444042002374E7002343 +:106F700000219B4601336FE703236DE70023994609 +:106F800001330427002602934BE703230C270293C7 +:106F900047E70122D51A382D00DCB0E153461A40EC +:106FA00000210023002689467EE70023802699469B +:106FB00000223603004B77E7FF07000001FCFFFFCC +:106FC00078420300FFFF0F80F30300005E4500D905 +:106FD00072E100D16DE1019B4D46013B019300231D +:106FE000340002935B461E020B0E1E430B020393FA +:106FF000330C994633041B0C494620000093FEF7DE +:10700000F5F9009B370043430600494620009846A7 +:10701000FEF772FA2C0C09040C43A04509D9E419B7 +:10702000731EA74200D95CE1A04500D859E1023E99 +:10703000E4194346E41A49462000FEF7D7F9030055 +:10704000009A80465343494620009B46FEF754FA77 +:107050002A040904120C0A4393450DD94346D21958 +:10706000013B974200D93AE1934500D837E102232A +:107070005B429C46D219E0445B46D21A4346360432 +:1070800033439B460399180C0B0C1D000593090410 +:107090005B46090C0C001B041B0C44430491594330 +:1070A0006B4368431B190D0CEB189C4203D98024D9 +:1070B0006402A44660441C0C09041B04090C20183B +:1070C0005D18824200D2DEE000D1D7E0161A029BA2 +:1070D0009C465D1BAC459B415B42F61AB74200D112 +:1070E00006E149463000FEF781F9009B0400434366 +:1070F000494630009846FEF7FFF92E0C09040E436E +:10710000B04509D9F619631EB74200D9F3E0B0457E +:1071100000D8F0E0023CF6194346F31A494618003D +:107120000293FEF763F9009B060043434946029829 +:107130009846FEF7E1F92D0409042D0C0D43A845EE +:1071400009D9ED19731EAF4200D9D6E0A84500D881 +:10715000D3E0023EED192404210043463143049E4E +:10716000059A3000ED1A0B040C0C1B0C58436643B7 +:10717000534354439A19030C9B189E4203D980220F +:107180005202944664441A0C00041B04000C1419A7 +:107190001B18A54250D34DD001231943964A019B99 +:1071A00094466344002B00DCF3E64A0709D00F2223 +:1071B0000A40042A05D00A1D8A42894149428B446B +:1071C00011005A46D20108D55A468C4B1A409346B4 +:1071D0008022D2009446019B6344894A934200DD99 +:1071E0005BE65A46C9085007084356025146012239 +:1071F0005B058146360B5B0D0A4055E680231B0379 +:107200001E4211D05A461A420ED15E461E43360324 +:10721000360B2A0089467B4B46E6032B00D1E1E082 +:10722000012BBBD11A40BBE61E433603360B424648 +:10723000744B39E6002BB1D07D194A1EAF4252D9AA +:107240001100A542A8D1039A9A42A5D1A6E703004E +:107250003E00283B9E400023994654E601F060F929 +:10726000203041E603005246283B9A4000219346D5 +:1072700077E6504601F054F920305EE6029B002686 +:10728000AB4200D323E7039E0299B446614488468B +:10729000B045B6415B467642F619B218013B029101 +:1072A000974213D290424FD800D18EE0161A9B46D7 +:1072B0000DE7894500D28EE674084B46F607350087 +:1072C0005B081D434B46DB0702938BE69742EDD1EB +:1072D0000399029CA142E5D93E1A9B46F7E69846DF +:1072E000CAE61E00A5E6AC423ED874D0110053E7B2 +:1072F0000121494252E71C000EE71E002BE71F2D1B +:107300003CDC20230A0058465B1B9840EA40994029 +:107310000243481E81415E461143EE404B0709D0AF +:107320000F230B40042B05D00B00191D99429B41E4 +:107330005B42F61833023CD55346012200211A4025 +:10734000002601238946AFE502235B429C46039C4D +:10735000E344A446029B63449846A045B641764266 +:10736000F6190293B218B1E603988A1E41008142D1 +:10737000B6417642F619AD19039161E71F225242D8 +:10738000D31A5A46DA401300202D29D040225846FD +:10739000551BA8400143481E814107200B4318405C +:1073A0000026002809D00F2200261A401900042ABE +:1073B000BBD10B0070077602360BDB0803439946FE +:1073C000012253461A4000236EE502998D42BBD834 +:1073D0009B4600267BE603989842C5D3110032E70E +:1073E0000020D7E780265B4636031E433603360B64 +:1073F000009A8946034B57E5FF030000FFFFFFFE9D +:10740000FE070000FF070000F0B55F4656464D46F8 +:107410004446F0B41F035C00DB0F9A46194B0E0381 +:107420004D00C90F8046360B6D0D8B4691463F0BC4 +:10743000640D9D4219D0134B9C421BD00123A542E1 +:1074400006D018003CBC90469946A246AB46F0BD1B +:10745000BE42F6D1C845F4D1D34510D0002DF0D1AD +:10746000304303005A1E9341EBE7310001230143EF +:10747000E7D1E0E73A430123002AE2D1DEE7002327 +:10748000DFE7C046FF070000F0B55F4644465646BA +:107490004D46F0B41F033C0B2C4F0E034D00A3468A +:1074A0005C008446360B6D0DC90F9046640DDB0FF2 +:1074B000BD422BD0254FBC422ED0002D0ED13043E3 +:1074C0000700814678427841002C17D15F463A4345 +:1074D00014D14B460020002B0AD006E0002C02D12C +:1074E0005846024301D099421AD00123484218431A +:1074F0003CBC90469946A246AB46F0BD0028F2D06F +:1075000058425841012240421043F1E737000743F7 +:10751000D0D002204042EBE75F461743CDD0F8E7DA +:10752000A542E2DC05DB5E45DFD808D000205E45E1 +:10753000DED248424841012340421843D8E7C445BF +:10754000D3D80020C445F4D3D2E7C046FF070000DB +:10755000F0B55F464D4644465646F0B41C03240B36 +:10756000A4462F4C0F034D005E00C90F80463F0B11 +:107570006D0D8B469146760DDB0FA54220D0284C31 +:10758000A64222D0002D12D1384344424441002E5D +:1075900020D0002C0DD05C42634101245B421C438F +:1075A00020003CBC90469946A246AB46F0BD002E5A +:1075B00017D05B4519D05B465C4201231C43EFE7C3 +:1075C000390002240143EBD1D9E76146022411437B +:1075D000E6D1D7E761460A43DBD100240028DFD09B +:1075E000E9E761460A43E4D1E5E7B54203DD01225C +:1075F0005C421443D4E7B542CDDB6745DBD809D004 +:1076000000246745CCD259464C426141012449428D +:107610000C43C5E7C845CED80024C845F3D3BFE71F +:10762000FF070000F0B55F4656464D464446F0B4AD +:107630000D0399464E002B0B87B0070092468046FB +:107640009B46760DCC0F002E69D06D4B9E4235D0F7 +:107650005B468022DD001204430F13432B439B46FD +:10766000C3009846674B00279C460023664401935D +:107670004A4615035000D20F53462D0B400D91463C +:1076800000D176E05E4A90426CD080225B0F1204FB +:1076900013435C4AED0094461D4353460022DB0031 +:1076A000604449463618701C6140029017430F2F02 +:1076B00000D9AFE05448BF00C759BF465B461F43DF +:1076C00000D088E000239B469846023308270193A8 +:1076D000CEE74946022A6AD0032A00D109E2012AEC +:1076E00000D0BBE111400022002300259046CCB21F +:1076F00000212D030A0D12052D0B1543434A1B05CE +:1077000015401D436D00E4076D08254340462900E0 +:1077100007B03CBC90469946A246AB46F0BD034339 +:1077200052D05B46002B00D18AE1584600F0F8FEAB +:1077300003000B3B1C2B00DD7BE11D22D31A3A001A +:1077400001005D46DA4008398D4013008F402B431D +:107750009B46B8462E4B00279C4600236044464279 +:10776000019385E752462A432CD1002500230222AB +:1077700097E752462A4321D0002D00D154E128003A +:1077800000F0CEFE03000B3B1C2B00DD46E11D216B +:10779000CB1A51460200D9405346083A95409340CF +:1077A0000D431B4A944660444042002279E701247D +:1077B00000220C40124B0025904699E7002500233B +:1077C00001226EE703226CE700239B4698460133B3 +:1077D000042701934CE703230C27019348E7002378 +:1077E0008025984600242D03054B81E75D464346DE +:1077F000019A6FE75D4643462100019A6AE7C04659 +:10780000FF07000001FCFFFFB8420300FFFF0F80ED +:10781000F30300004246120C91461A0C944642466D +:1078200017044A461B041B0C5A43604690464A46BE +:1078300042431000039262461C003F0C7A437C4393 +:1078400042440192220C9246019A5244904506D934 +:107850008246802040028046C24450460390100C6D +:10786000049048462404240C1204121905922A0C90 +:107870002D042D0C68432C00824648467C4350431F +:107880008146200C8046574357444744BA4503D9A4 +:10789000802040028046C144380C3F04B84648442A +:1078A0002404240C01900498A044404404905846B9 +:1078B000000C814658460404200C824607004846C6 +:1078C0005F434C46434360466043644683465046AC +:1078D0004443380C8446E4186444A34203D980230B +:1078E0005B029C46E34448463F04230C3F0C2404BF +:1078F000E419574668436F4384464D465046554306 +:107900004243380C814662444A445B44944503D95F +:10791000802040028446654403983F0483460498CF +:107920003F0C8446E344C3458041404282461004F4 +:1079300084460198674484466744A344BC46A345F3 +:10794000A4419946D44464428742BF41D445804112 +:10795000E144A04699459B417F424042C8440743C9 +:10796000120CBA18A045A4415F423B006442234375 +:10797000D71843467D19DB0D6D021D435B465A0245 +:10798000059B1A43531E9A415B46DB0D1A4343463F +:107990005B021343EA0107D501225C08134023432D +:1079A000EA07029E13436D08574AB218002A4BDDBE +:1079B000580709D00F201840042805D0181D9842F8 +:1079C0009B415B42ED180300E80104D54F4A154086 +:1079D0008022D200B2184E48824200DDE7E6012440 +:1079E000DB08680718436D02530580462D0B5B0DBD +:1079F0000C407DE6802259461203114208D0154200 +:107A000006D115432D0398462D0B4C46414B6FE68E +:107A10005D4615432D032D0B3E4B69E6030055468D +:107A2000283B9D400023BCE6504600F079FD203005 +:107A3000A8E60300283B9F400023BB46984689E602 +:107A400000F06EFD203073E60124A61A382E07DD03 +:107A500000220C4000230025904649E6029EA3E741 +:107A60001F2E20DC20222C001800921BF040944096 +:107A700093400443581E83411C43F540630709D0DB +:107A80000F232340042B05D023001C1D9C42924150 +:107A90005242AD182B021FD5012400220C400123B5 +:107AA0000025904624E61F202C004042821AD44034 +:107AB000202E1CD04022961BB5402B43581E8341DC +:107AC0000720234318400025002809D00F22002555 +:107AD0001A401C00042AD8D1230068076D022D0B20 +:107AE0000124DB08034398460C40002300E60025F0 +:107AF000E3E780220124120315432D0398462D0B42 +:107B00000C40044BF4E5C046FF030000FFFFFFFEFE +:107B1000FE070000FF070000F0B557464E464546F9 +:107B2000E0B40E001100F20F9246C500420F180398 +:107B300037037400400A4E0F7F0A3043CF4E17437D +:107B40005A00640D520DDB0FC900B24200D1E5E0CE +:107B500001267340A61AB446534500D1AFE0002E6B +:107B600000DC0DE1002A3AD103000B4300D0E4E031 +:107B70006B0709D00F232B40042B05D02B1DAB42E4 +:107B8000AD416D427F191D003B0200D488E0BB4B24 +:107B900001349C4200D110E13A00B94B51461A40E1 +:107BA00001235007ED08520264050543120B640DD2 +:107BB0000B400021280012030D0D120B64052D054A +:107BC00015436208AF4CDB072C4014436400640883 +:107BD0001C4321001CBC90469946A246F0BDA74B11 +:107BE0009C42C5D080231B0418436346382B00DD1C +:107BF000FDE01F2B00DD30E1624620239B1A0200CE +:107C00009A40664690460A009940F24046464B1E0E +:107C100099413243114363460200DA40691A8D42AA +:107C20009B410D00BA1A5B42D71A3B0235D57A0246 +:107C3000530A98464346002B00D1C4E0404600F06A +:107C40006FFC0300083B1F2B00DDC5E0202229004C +:107C5000D21A4746D1409F400A009D403A439C4279 +:107C600000DDC0E01C1B631C1F2B00DDE4E02021B5 +:107C700014002800C91AD8408C408D400443DA40D3 +:107C8000681E854117002543002471E7424663467C +:107C90001A4300D14CE2674645466B0700D069E7BE +:107CA000012351467807ED08FA080B400543734954 +:107CB0008C4238D012036405120B640D79E7002E54 +:107CC00000DC9AE0002A47D06C4A944200D14FE78A +:107CD0008022120410436246382A00DC08E1014386 +:107CE000481E81410022C9B24919D219A942BF4197 +:107CF0000D007F42BF183A0200D442E15F4A0134CE +:107D0000944200D14EE101205D4A69083A40284082 +:107D10000843D507054357089A4629E706000E434E +:107D200000D017E714E72900114300D1F9E18021C1 +:107D300009030A431203120B3BE701235B429846F7 +:107D4000C4446346002B72D1691A8D429B413F1A8D +:107D50005B42FF1A0D0068E702000A4300D107E703 +:107D6000012252429046C4446246002A00D0E6E016 +:107D70006918A942B6413F187642F7190D00BAE7D3 +:107D8000002E00D080E0621C5205520D012A00DC5A +:107D9000F9E06A1A91464D45B6413A1A7642921B6D +:107DA0009046120200D499E04D1BA9428941C71B9D +:107DB00049427A1A90469A463CE7524601230025EA +:107DC00013400022F5E6280000F0AAFB2030030053 +:107DD000083B1F2B00DC39E72A00283882400025A9 +:107DE0009C4200DC3EE7264FE41A1740C0E6014300 +:107DF000481E81410022C9B210E7002E00D0F1E0F8 +:107E0000621C94465205520D012A00DCA0E01B4A78 +:107E1000944500D1C5E06918A94292413F185242E9 +:107E2000D2194908D5070D4357086446A0E6134BFD +:107E30009C4200D0D9E69BE611001F3CE1400C00BB +:107E4000202B00D180E04021CB1A9A4015436A1EB6 +:107E500095410027254300241FE763460200203B8D +:107E6000DA406346202B71D0402366469B1B984026 +:107E70000143481E814111430022CFE6FF07000065 +:107E8000FFFF7FFFFFFF0F80002C48D0CA4CA242AB +:107E900000D1A2E07442A1468024240427434C462A +:107EA000382C00DDDBE01F2C00DD44E14E462024B1 +:107EB000A41B3E00A640A246B0464C462E00E6401B +:107EC000B4464646644626435446A5406C1EA5412A +:107ED00034002C434D46EF400D1B28E04A464346F4 +:107EE0004D461A4300D0A5E6002300240025DEE617 +:107EF0001F2A5ADC66462022921B060096409146B5 +:107F0000B04662460E00D640424616434A4691406D +:107F10004A1E9141020060463143C240E4E63C0003 +:107F20002C435AD0F443A146002C52D14D1BA942F8 +:107F30008941C71B49427F1A14009A4675E69E4A3A +:107F4000944200D0C7E613E600227FE700208FE7C7 +:107F5000002C00D0C8E03B002B4300D10FE1030010 +:107F60000B4300D104E66918A9429B413F185B42CC +:107F7000DF193B0200D41AE1904B0D001F4064460C +:107F8000F6E59A4689E63A002A43002C5CD1002A9D +:107F900075D102000A4300D1CAE007000D009A46DD +:107FA000E6E564460022002581E662460600203AA6 +:107FB000D6406246B046202A00D1B7E0402266464D +:107FC000921B904001434246481E814111430022CA +:107FD0008AE6794CA24200D061E707000D00140048 +:107FE0009A46C5E5002C41D13C002C4378D0F4439F +:107FF000A146002C20D0704CA24271D04C46382CA7 +:1080000000DDB2E01F2C00DDBCE02026341BA246C0 +:108010003C005646B4404E46A0462C00F440A446D0 +:10802000444666463443A4465446A54064466E1E04 +:10803000B54125434C46E7406D188D4289413F18B4 +:108040004942CF19140056E6002A2FD102000A43F4 +:1080500000D184E007000D009A46574C88E53D4367 +:108060006F1EBD41ECB200270D1B60E7524CA242CF +:1080700036D0744280263604A1463743BEE702005C +:108080000A4300D174E56A1A90464545B6413A1A4A +:108090007642921B9446120200D4F7E54D1BA9428A +:1080A0008941C71B49427F1A9A4661E502000A438B +:1080B0003AD0ED087C072C438025FA082D032A428C +:1080C00008D0C7082F4205D145072C003A009A4630 +:1080D000C9080C43670FD200E5001743364C47E54B +:1080E00007000D00140043E53A002A4343D0020084 +:1080F0000A4319D0ED087C072C438025FA082D038C +:108100002A4207D0C6082E4204D147073C0032005D +:10811000C9080C43D700620FE50017439A46264C66 +:1081200026E50022002544E5234C21E5002049E70F +:1081300000230025BBE54C463E00203CE6404C4673 +:10814000B446202C31D040244E46A61BB7403D43B8 +:108150006C1EA54164462C4300270D1BE7E68022D8 +:1081600000231203144C0025A1E53D436F1EBD41C1 +:108170000027EDB260E707000D000F4CF8E40700A0 +:108180000D00F5E44E463C00203EF440A0464C462F +:10819000202C0ED040244E46A41BA7403D436F1E0A +:1081A000BD4144460027254346E70027CFE70D00A1 +:1081B00073E50027F2E7C046FF070000FFFF7FFFDF +:1081C00070B50E4E0C031D0349005B00240B490DD6 +:1081D0002D0B5B0DB14204D0084900208B4208D022 +:1081E00070BD04430120002CFAD1044900208B42C9 +:1081F000F6D115432800451EA841F1E7FF0700000E +:108200000B0330B5134D1A0B4B005B0DC90F002447 +:10821000AB4211DD104CA34210DC802464032243E6 +:108220000E4CE41A1F2C0CDD0D48C31ADA40130063 +:108230005C42002900D11C00200030BD094BCC1845 +:10824000FAE7E040084CA44663449A401300034315 +:10825000EEE7C046FE0300001D04000033040000EA +:1082600013040000FFFFFF7FEDFBFFFF70B5002848 +:1082700030D0C317C4185C40C50F200000F050F97F +:10828000174B184A1B1AD21A1F2A18DD164AD21A7F +:108290009440002224035B05240B5B0D0021100099 +:1082A00024030A0D1205240B1443104A1B05144025 +:1082B0001C436400ED0764082C43210070BD2100BD +:1082C00091400A000B21081AC4405B052403240BCB +:1082D0005B0DE3E70025002300240022DEE7C04613 +:1082E0001E0400003304000013040000FFFF0F8091 +:1082F00070B5051E28D000F013F9154B154A1B1A4E +:10830000D21A1F2A16DD2C00134A0025D21A9440D7 +:108310005A052403240B520D002124030B0D240BBA +:108320001B0523430D4C1205234013435B0028001B +:10833000590870BD0B212C00081AC4409540240335 +:108340005A05240B520DE7E700220024E4E7C0465B +:108350001E0400003304000013040000FFFF0F8020 +:108360004200120E511C4302C9B270B55D0AC40F1F +:10837000012915DDE02189008C466D071B0B624445 +:10838000002128000D0D2D052B431C4D52052B40BF +:10839000520813435B00E4075B082343190070BDD8 +:1083A000002A15D1002D1FD0280000F0B9F80A28A6 +:1083B0001DDC0B232A001B1ADA40130002001532C1 +:1083C00095400F4A1B03121A52051B0B520DD7E79B +:1083D000002D06D080221B0B120313436D07094AA0 +:1083E000CEE7084A0023CBE700220023C8E70300BA +:1083F0000B3B9D402B000025E3E7C046FFFF0F80AD +:1084000089030000FF0700004B0070B55E0D0C03F0 +:10841000751C640A420F6D052243C90FC4006D0D1F +:10842000012D2ADD3B4BF318FE2B1ADC002B42DD1D +:108430008001451EA841D2001043620F024350073D +:1084400004D00F201040042800D004328020C00443 +:10845000104021D00133FF2B03D09201520ADBB22E +:1084600001E0FF2300225202520ADB0513435B00A6 +:10847000C9075B080B43180070BD002E07D01443DA +:10848000EFD08020D20080040243FF23D7E72243AD +:108490000023002A03D00522D208FF2B03D052026A +:1084A000520ADBB2DFE7002A32D08020C003024349 +:1084B0005202520AD7E71800173014DB802000045C +:1084C00002431E20C01A1F280FDC2500124BF31890 +:1084D0009D406E1EB5419A402B0013432200C240BE +:1084E0001A430023ABE70023D5E702256D42EB1AC0 +:1084F0001500DD40202809D0084BF3189A4014439A +:10850000621E9441220000232A4398E70022F6E7E6 +:108510000022A8E780FCFFFF82FCFFFFA2FCFFFF18 +:108520001C2101231B04984201D3000C10391B0AA3 +:10853000984201D3000A08391B09984201D3000967 +:10854000043902A2105C40187047C04604030202BE +:1085500001010101000000000000000010B5002929 +:1085600003D1FFF7DDFF203002E0081CFFF7D8FF42 +:1085700010BDC046F0B54746494A4B0080B40600DE +:108580000F0088465B0893424BDC464A93420FDC5F +:10859000454A464BFEF7F6F8454B0022FDF7C6F874 +:1085A0003B00002854D03000190004BC9046F0BDB8 +:1085B000404A93423CDC8022D205934248DD00F0E1 +:1085C000F9FA320004000D003B0030003900FFF7DB +:1085D00029F80022364BFEF7D5F803F0EBF902003C +:1085E0000B0020002900FEF7CDF802000B00002050 +:1085F0002F49FEF7F3FB220006000F002B0020009E +:108600002900FEF7BFF802000B0030003900FEF72A +:10861000B9F802F063FC43460600002B14DD0B00A2 +:10862000C1E70B000200FEF7ADF806000B00BAE749 +:1086300000F0C0FA02F052FC1F4B204AFEF7A2F8ED +:1086400043460600002BEADC80231B06CB18AAE772 +:1086500032003B0030003900FEF7E4FF04000D005B +:108660003000390000F0A6FA002206000F00104B7F +:1086700020002900FEF786F803F09CF900220C4B3D +:10868000FEF780F802000B0020002900FEF7A6FB91 +:1086900032003B00FEF776F800F028FBBBE7C0464F +:1086A000FFFFEF7FFFFF2F3E9C7500883CE4377E85 +:1086B0000000F03F0000B041422EE63FEF39FAFEE5 +:1086C000F8B556464D4644465F46A54BF0B44E00BD +:1086D000804689468A4676089E420CDDA14B9E4222 +:1086E00000DDA0E000D19BE05346002B00DCE3E07E +:1086F0009D4B9E4A9FE09E4B9E4200DDB1E09D4B0C +:108700009E4200DC9FE001235B429B4642464B4673 +:1087100040464946FEF786FF02000B0006000F00A8 +:10872000FEF780FF04000D00934A944BFEF77AFF9A +:10873000934A944BFEF726F822002B00FEF772FFB7 +:10874000914A924BFEF71EF822002B00FEF76AFFBB +:108750008F4A904BFEF716F822002B00FEF762FFBF +:108760008D4A8E4BFEF70EF822002B00FEF75AFFC3 +:108770008B4A8C4BFEF706F832003B00FEF752FFA7 +:10878000894A8A4B06000F0020002900FEF74AFFA5 +:10879000874A884BFFF7C0F922002B00FEF742FF03 +:1087A000854A864BFFF7B8F922002B00FEF73AFF07 +:1087B000834A844BFFF7B0F922002B00FEF732FF0B +:1087C000814A824BFFF7A8F922002B00FEF72AFF0F +:1087D0000B0059460200013100D170E059463000CB +:1087E000CC003900FDF7CEFF42464B46FEF71AFF9C +:1087F000774D784B2D191C1922686368FFF78CF9A7 +:1088000042464B46FFF788F902000B00286869686A +:10881000FFF782F953460A00002B48DB03000AE009 +:10882000002800D160E742464B4640464946FDF7E6 +:10883000A9FF03000A00180011003CBC90469946AD +:10884000A246AB46F8BD644A644BFDF79BFF00228D +:10885000634BFCF76BFF002800D154E743464A46C0 +:10886000E9E700F0A7F95F4B04000D009E4237DCFA +:108870005D4B9E425DDC02000B00FDF783FF002292 +:10888000574BFFF749F9802306000F000022DB0554 +:1088900020002900FDF776FF0B00020039003000B0 +:1088A000FEF79CFA0023804689469B462EE78022ED +:1088B000120603008A18BEE72B4B4C4ABBE7300078 +:1088C0003900FDF75FFF42464B46FEF7ABFE020064 +:1088D0000B0040464946FFF71FF903000A00AAE7CC +:1088E000434B9E421ADC0022424BFFF715F900224F +:1088F00006000F003F4B20002900FEF793FE0022E8 +:10890000374BFDF73FFF0B00020039003000FEF748 +:1089100065FA0223804689469B46F7E60B00020073 +:1089200035490020FEF75AFA0323804689469B46C4 +:10893000ECE600222A4BFFF7EFF8002206000F00BA +:10894000274B20002900FDF71DFF0B000200390016 +:108950003000FEF743FA0123804689469B46D5E660 +:10896000FFFF0F440000F07F182D4454FB21F93F16 +:10897000FFFFDB3FFFFF1F3E11DA22E33AAD903FDE +:10898000EB0D76244B7BA93F513DD0A0660DB13F46 +:108990006E204CC5CD45B73FFF8300922449C23FAE +:1089A0000D5555555555D53F2F6C6A2C44B4A2BF73 +:1089B0009AFDDE522DDEAD3F6D9A74AFF2B0B33F3B +:1089C000711623FEC671BC3FC4EB98999999C93FB3 +:1089D000C8340300A83403009C7500883CE4377E4B +:1089E0000000F03FFFFFF23FFFFFE53FFB21F9BF33 +:1089F000FF7F03400000F83F0000F0BF444AF8B595 +:108A0000564692464B005B0D9A4444465F464D469F +:108A10005246F0B4884605000C000E000700132AE9 +:108A200027DC002A59DB52463A4B134199460B008A +:108A30004A461340034316D0374A384BFDF7A2FE8F +:108A400000220023FCF772FE00280AD0002C04DD6F +:108A5000802352465B031341984446464B46002709 +:108A60009E43380031003CBC90469946A246AB4636 +:108A7000F8BD5246332A08DD8023DB009A45F2D147 +:108A800002000B00FDF77EFEEDE7254A9446012229 +:108A900063445242DA4093460242E4D01E4A1F4BDE +:108AA000FDF770FE00220023FCF740FE0028D8D01E +:108AB000002C0CDD5346142B26D0342352460127BC +:108AC0009B1A9F407F19AF429B415B4298445B4693 +:108AD00046469F4338003100C5E70F4A0F4BFDF76C +:108AE00051FE00220023FCF721FE0028B9D0002C03 +:108AF00006DB2C4300270026002CB2D0094EB0E73D +:108B0000802600273606ACE7133B9C46E044DEE7B0 +:108B100001FCFFFFFFFF0F009C7500883CE4377EDF +:108B2000EDFBFFFF0000F03F30B5204A4B0087B05F +:108B30005B0893421CDD1E4A934205DD02000B00D8 +:108B4000FEF7EAFF07B030BD02AA02F05DFC032386 +:108B50001840049A059B012818D002280DD000283F +:108B60001ED0029803990124009403F07FFDE9E7E9 +:108B70000022002303F014F8E4E70298039903F0BD +:108B80000FF880231B069C466144DBE700900298A7 +:108B9000039903F06BFD80231B069C466144D1E7DB +:108BA0000298039902F0FCFFCCE7C046FB21E93FA5 +:108BB000FFFFEF7F49004B0819007047454AF8B5A1 +:108BC000564692464B005B0D9A444D465F464446DE +:108BD0005246F0B4894605000C000E000700132A27 +:108BE00022DC002A47DB52463B4B134198460B00E0 +:108BF00042461340034311D0384A394BFDF7C2FDBA +:108C000000220023FCF792FD002805D0002C41DB58 +:108C10004E46434600279E43380031003CBC9046F8 +:108C20009946A246AB46F8BD5246332A08DD80235A +:108C3000DB009A45F2D102000B00FDF7A3FDEDE742 +:108C4000284A9446012263445242DA409346024243 +:108C5000E4D0224A224BFDF795FD00220023FCF7C9 +:108C600065FD0028D8D0002C1ADB5B464E469F439A +:108C700038003100D2E7194A194BFDF783FD002275 +:108C80000023FCF753FD0028C6D0002C16DB00277C +:108C90000026C1E7802352465B0313419944B7E79E +:108CA0005346142B12D03423524601279B1A9F405F +:108CB0007F19AF429B415B429944D6E76400640848 +:108CC00025430027002DA7D0074EA5E7133B9C4660 +:108CD000E144CAE701FCFFFFFFFF0F009C7500881D +:108CE0003CE4377EEDFBFFFF0000F0BFF0B54F46E0 +:108CF0004646C0B4CA4A8BB004000D000B1E934216 +:108D000012DCC84A4E00760896421BDD0022C64B94 +:108D1000FCF7F2FC002800D181E0002200230020B3 +:108D2000C249FEF75BF808E0C14A914236DD2200F5 +:108D30002B0020002900FDF725FD0BB00CBC904650 +:108D40009946F0BDBB4A964274DDBB4A94466344E3 +:108D5000934200D98FE00022B84B20002900FDF794 +:108D600011FDB74A0B15914699444B4680460F00BA +:108D70000E00002B00DCD7E122002B00FEF7CCFE1A +:108D800002000B000020AD49FEF7C6FE42463B0044 +:108D9000FEF724F84446029003910BE0A94A93425F +:108DA000D9DDA74A1E0091461B15994400220023D5 +:108DB0000292039333031B0B9846A34B984500DDA7 +:108DC000EDE042469D4B20001A43110000229B4BD0 +:108DD000FEF7A2FE04000D0000229C4B06000F00CF +:108DE000FEF720FC22002B00FEF71CFC0B0002000B +:108DF00004920593009201934346002B49D100222F +:108E0000002320002900FCF777FC002800D1D5E0E2 +:108E10004B46002B00D06BE1002000218DE72200A3 +:108E20002B0020002900FEF777FE02000B00FDF763 +:108E3000D5FF82E70022864BFDF7A4FC0022002329 +:108E4000FCF774FC002805D0824B200029009E42CC +:108E500000DC72E722002B0020002900FEF7E2FB75 +:108E600000227A4BFEF7DEFB02000B0020002900F7 +:108E7000FEF752FE61E70022744BFEF7D3FB2B0096 +:108E80002200FEF7CFFB002326002F00994600901A +:108E9000019180230022DB0530003900FDF772FCD0 +:108EA00002000B0030003900FDF798FF02000B00B4 +:108EB00004900591FEF7B6FB04000D00664A674B6F +:108EC000FEF7B0FB664A674BFDF75CFC22002B0007 +:108ED000FEF7A8FB644A654BFDF754FC22002B000B +:108EE000FEF7A0FB624A634BFDF74CFC22002B000F +:108EF000FEF798FB604A614BFDF744FC22002B0013 +:108F0000FEF790FB5E4A5F4BFDF73CFC22002B0016 +:108F1000FEF788FB5C4A5D4BFDF734FC2B0022001A +:108F2000FEF780FB4B4604000D00002B62D0484644 +:108F3000FFF79CF9564A574B06900791FEF772FBD4 +:108F4000009A019B0890099120002900FDF71AFC66 +:108F5000049A059BFEF766FB4F4A04000D00069835 +:108F600007994E4BFEF75EFB029A039BFDF70AFC46 +:108F700002000B0020002900FDF704FC02000B009A +:108F800000980199FEF7C8FD32003B00FEF7C4FDD2 +:108F900002000B0008980999FEF7BEFDCDE60123FB +:108FA00042469C46294BE1441A4380231100424625 +:108FB0005B039B1A9B102000984607E7384A334B07 +:108FC00020002900FEF72EFB02000B0000201B49A9 +:108FD000FEF7A2FD049A059BFEF724FB4B46060014 +:108FE0000F00002B5ED102000B0020002900FEF7CD +:108FF00093FDA2E6009A019BFDF7C4FB049A059B32 +:10900000FEF710FB02000B0000980199FEF784FDAB +:1090100002000B0030003900FEF77EFD8DE6C046F1 +:109020007982DA3FFFFFEF3F0000F0BF000050C33E +:10903000FFFFEF7FFFFF1F3E3C412D400000F03F50 +:1090400001FCFFFFFFFF3F439DA006000000E03F43 +:1090500000005043FFFF8F3C44523EDF12F1C23FFD +:109060009FC678D0099AC33FDE03CB966446C73FBC +:10907000AF788E1DC571CC3F599322942449D23FBD +:1090800004FA97999999D93F935555555555E53F08 +:109090000000E0FE422EE63F763C7935EF39EA3DAE +:1090A000555555554846FFF7E1F8254A254B0090A0 +:1090B0000191FEF7B7FA244A0490059100980199AE +:1090C000224BFEF7AFFA029A039BFDF75BFB02000F +:1090D0000B0030003900FEF71FFD22002B00FEF7C9 +:1090E0001BFD02000B0004980599FEF715FD24E610 +:1090F0004846FFF7BBF8144A144B04000D00FEF776 +:1091000091FA029A039BFDF73DFB0D4A06000F0002 +:109110000C4B20002900FEF785FA02000B003000FE +:109120003900FDF72FFB08E60022094BFEF7F4FC9F +:1091300002000B0020002900FEF7EEFC26E6C046E8 +:109140000000E0FE422EE63F763C7935EF39EA3DFD +:109150000000F03F10B500F0F1FB024A024BFDF7B2 +:109160003DFE10BDEF39FAFE422EE63F30B5214AF2 +:109170004B0087B05B0893421EDD1F4A934205DD1A +:1091800002000B00FEF7C8FC07B030BD02AA02F0D7 +:109190003BF903231840049A059B01281ED002289E +:1091A00011D000281FD00298039902F0F9FC802307 +:1091B0001B069C466144E7E700230022009300233E +:1091C00003F054FAE0E7012402980399009403F0B5 +:1091D0004DFA80231B069C466144D5E7029803990B +:1091E00002F0DEFCD0E7012402980399009403F01A +:1091F0003DFAC9E7FB21E93FFFFFEF7F30B5134A96 +:109200004B0087B05B08934218DD114A934205DD9D +:1092100002000B00FEF780FC07B030BD02AA02F08E +:10922000F3F8049A059B0221400008400139081A0E +:1092300000900298039903F0C9FAEDE70123002298 +:109240000093002303F0C2FAE6E7C046FB21E93FA2 +:10925000FFFFEF7F384AF8B54B0005000C000E0009 +:109260005B0893420EDD02000B0000203349002C06 +:1092700036DBFDF7B3FD314B0022FDF783FA030027 +:109280001800F8BD2E4A934209DD00202B49030047 +:10929000002EF5DA8022120694466144F0E7294A4E +:1092A000934225DD284A93422CDDFFF783FC020020 +:1092B0000B00FDF767FA03F04FFC80230022DB056B +:1092C000FDF760FA0B0080210200C9050020FDF7C0 +:1092D00085FD02000B0000201849FEF71DFCD6E7B3 +:1092E000FDF77CFD154B0022FEF716FC0300C7E7D7 +:1092F0000022124BFDF746FA23002A00FEF792F9EE +:109300000300BDE7FFF756FCC02300221B06FEF753 +:1093100089F903F021FC80231B06CF18802300224B +:10932000DB050400FDF72EFA02000B0020003900D7 +:10933000FDF754FDABE7C046FFFFEF7F0000F03FB5 +:10934000FFFF3540FFFF7F3CFFFFEF3F4B00134A1D +:109350005B0D9A1870B5132A0ADCCB0FDB07002AC5 +:1093600019DB0F480024104181432000194370BDD0 +:10937000332A08DD8023DB009A42F8D102000B007B +:10938000FDF700FAF3E7074A94460122634452428C +:10939000DA409043EBE700201900E8E701FCFFFF0B +:1093A000FFFF0F00EDFBFFFFF0B5474680B48CB028 +:1093B00004000D0000F0A4FC244B060098461B7826 +:1093C0000F005BB2013305D02000290003F006FE38 +:1093D000002805D1300039000CB004BC9046F0BD27 +:1093E00020002900FFF7E6FB0022194BFCF79EF94D +:1093F0000028EFD001230293164B17480393002354 +:10940000069407950A930494059503F017FE4346C6 +:109410001B78089009915BB2022B0BD002A803F0D5 +:109420000BFE002806D00A9B0193002B07D1089E53 +:10943000099FCFE703F086FE21230360F3E703F0E3 +:1094400081FE0A9B01930360F1E7C0469A20002049 +:109450000000F03FF842030028430300F0B5474600 +:1094600080B48CB004000D0000F040FE244B0600D8 +:1094700098461B780F005BB201330DD02000290005 +:1094800003F0ACFD002807D000221E4B200029006D +:10949000FCF738F9002805D1300039000CB004BCC5 +:1094A0009046F0BD01230293174B00220393002343 +:1094B0000A9300231000190006940795049405955B +:1094C000FDF78CFC43461B78089009915BB2022B98 +:1094D0000BD002A803F0B0FD002806D00A9B019330 +:1094E000002B07D1089E099FD6E703F02BFE21230E +:1094F0000360F3E703F026FE0A9B01930360F1E7A4 +:109500009A2000200000F03F00430300F0B54746DA +:1095100080B48CB004000D0000F070FE244B0600F7 +:1095200098461B780F005BB2013305D0200029005C +:1095300003F054FD002805D1300039000CB004BC04 +:109540009046F0BD20002900FFF734FB0022194BA4 +:10955000FCF7ECF80028EFD001230293164B1748D4 +:1095600003930023069407950A930494059503F04A +:1095700065FD43461B78089009915BB2022B0BD026 +:1095800002A803F059FD002806D00A9B0193002B86 +:1095900007D1089E099FCFE703F0D4FD2123036084 +:1095A000F3E703F0CFFD0A9B01930360F1E7C046A8 +:1095B0009A2000200000F03F0843030028430300E6 +:1095C00010B501F001F810BDF0B5474680B48CB07D +:1095D00004000D0001F0B4F8314B060098461B78EA +:1095E0000F005BB2013305D02000290003F0F6FC28 +:1095F000002805D1300039000CB004BC9046F0BD05 +:1096000020002900FFF7D6FA0022264B0090019196 +:10961000FCF796F80028EDD0009801990022214B24 +:10962000FCF784F802AE00282BD0012302931E4BD6 +:10963000002273600023336200231000190034619C +:109640007561B460F560FDF7C9FB43461B78B061F6 +:10965000F1615BB2022B0AD0300003F0EDFC002870 +:1096600005D0336A002B07D1F769B669C2E703F06A +:1096700069FD21230360F4E703F064FD336A0360AE +:10968000F2E702230293084B306273603461756124 +:10969000B460F5600022002320002900D3E7C04613 +:1096A0009A2000200000F03F10430300F0B5474629 +:1096B00080B48CB004000D0001F0CAF8264B0600FF +:1096C00098461B780F005BB2013305D020002900BB +:1096D00003F084FC002805D1300039000CB004BC34 +:1096E0009046F0BD20002900FFF764FA1B4A1C4B8E +:1096F000FCF71CF80028EFD003230293194B0694C3 +:109700000795039300230A9343461B780494059519 +:10971000002B10D1E022144B12060892099302A8E4 +:1097200003F08AFC00280CD00A9B0193002B0DD17A +:10973000089E099FD0E700200C4908900991022B50 +:10974000EDD103F0FFFC22230360EDE703F0FAFC08 +:109750000A9B01930360EBE79A2000207DF8B98F04 +:10976000CE33864018430300FFFFEF470000F07F31 +:10977000F0B546464F46C0B48BB004000D0001F072 +:1097800011F9344B060098461B780F005BB2013389 +:1097900038D02000290003F017FC002832D02E4AD0 +:1097A0002E4B20002900FBF7C1FF8146002830D155 +:1097B0002B4A2C4B20002900FBF7A4FF002821D0C6 +:1097C00004230093284B002201934B460893002367 +:1097D0000692079343461B786E465BB20494059548 +:1097E00002940395022B2FD0300003F025FC0028B3 +:1097F0002AD0336A002B03D003F0A4FC336A036041 +:10980000F769B669300039000BB00CBC9046994638 +:10981000F0BD03230093144B6E460193002308937D +:1098200043461B780494059502940395002B05D1BB +:10983000E0220E4B120606920793D5E700200C4952 +:1098400006900791022BCFD103F07CFC222303600A +:10985000CFE7C0469A200020EF39FAFE422E86401C +:1098600051302DD5104987C020430300FFFFEF473B +:109870000000F07FF0B5474680B48CB01D000600B4 +:109880000F00140001F000FA2A4B00900191984655 +:109890001B785BB2013305D02000290003F09EFB4A +:1098A000002805D1009801990CB004BC9046F0BD89 +:1098B0003000390003F092FB0028F3D0002200238F +:1098C00020002900FBF718FF0028EBD001230293AA +:1098D000194B06940795039300230A9343461C787B +:1098E00004960597002C16D00022002310001900C2 +:1098F000FDF774FA08900991022C0ED103F022FCB6 +:10990000212303600A9B0093002B0CD1089B099C28 +:1099100000930194C6E70896099702A803F08CFB10 +:109920000028EFD1EAE703F00DFC0A9B00930360E7 +:10993000ECE7C0469A20002024430300F0B54746D8 +:1099400080B48CB004000D0001F0C8FA0F000021B3 +:1099500006003B4B3200595698463B00013111D06E +:109960002000290003F03AFB32003B00002809D018 +:109970000022002320002900FBF7D8FE32003B0024 +:10998000002805D0100019000CB004BC9046F0BDB2 +:109990002C4B0A90039343461E7804940595069435 +:1099A0000795002E18D1E022274B12060892099342 +:1099B0002000002200232900FBF79EFE00282BD068 +:1099C0000223029302A803F037FB00281DD103F005 +:1099D000B9FB2223036018E000221C4B20000892F0 +:1099E0000993290000220023FBF786FE00281BD1E3 +:1099F00001230293022E11D103F0A4FB2123036063 +:109A0000134803F01BFB089009910A9B0193002B5C +:109A10000FD1089A099BB5E70123029302A803F02E +:109A20000BFB0028ECD1E7E702230293022ECED0F5 +:109A3000C8E703F087FB0A9B01930360E9E7C04690 +:109A40009A2000202C430300FFFFEFC70000F0FF27 +:109A500028430300F0B5474680B48CB004000D00E5 +:109A600001F03EFC394B060098461B780F005BB2B4 +:109A700001330DD02000290003F0B0FA002807D0F0 +:109A80000022002320002900FBF746FE002805D114 +:109A9000300039000CB004BC9046F0BD2C4B04944F +:109AA0000595039300230A9343461E780694079571 +:109AB000002E18D1E022274B1206089209932000AD +:109AC000002200232900FBF717FE00282BD00223D9 +:109AD000029302A803F0B0FA00281DD103F032FB74 +:109AE0002223036018E000221B4B200008920993F8 +:109AF000290000220023FBF7FFFD00281BD10123D2 +:109B00000293022E11D103F01DFB212303601348A1 +:109B100003F094FA089009910A9B0193002B0FD14E +:109B2000089E099FB4E70123029302A803F084FA78 +:109B30000028ECD1E7E702230293022ECED0C8E73B +:109B400003F000FB0A9B01930360E9E79A200020E1 +:109B500030430300FFFFEFC70000F0FF284303007E +:109B6000F0B546464F46C0B48DB006000F0001F078 +:109B700051FE2F4B040098461B780D005BB2013359 +:109B800007D003F021FA81464B4620002900002B24 +:109B900004D00DB00CBC90469946F0BD39003000A1 +:109BA00003F012FA290003002000002BF1D0032358 +:109BB0000293204B0696079703934B460A9343461E +:109BC0001C78049605970022002330003900002CF1 +:109BD00014D1FBF7ABFDE0221206002823D0164B70 +:109BE0000892099302A803F027FA002810D00A9BD4 +:109BF0000193002B11D108980999CAE7FBF796FD4C +:109C00000022002811D00D4B08920993022CE9D1B3 +:109C100003F098FA22230360E9E703F093FA0A9B22 +:109C200001930360E7E7064BDAE7064BECE7C04633 +:109C30009A20002038430300FFFFEF470000F07F29 +:109C4000FFFFEFC70000F0FFF0B5474680B48CB0CF +:109C500004000D0001F0AEFE274B060098461B786D +:109C60000F005BB201330DD02000290003F0B6F9DC +:109C7000002807D00022002320002900FBF742FD26 +:109C8000002805D1300039000CB004BC9046F0BD6E +:109C900001230293194B06940795039300230A931B +:109CA0004346049405951C78002C0FD10023002412 +:109CB0000893099402A803F0BFF9002810D00A9B6A +:109CC0000193002B11D1089E099FDBE7002200239E +:109CD00010001900FDF782F808900991022CE9D1D3 +:109CE00003F030FA21230360E9E703F02BFA0A9B23 +:109CF00001930360E7E7C0469A2000204043030039 +:109D0000F0B5DB4A4B0085B007000E005B089342BC +:109D10000CDDD84A94466344034300D0ACE00029EC +:109D200000DC25E10020002105B0F0BDD24A9342BD +:109D300000DC9BE0002900DA1DE102000B0000209E +:109D4000CE49FDF7E9FE0022CD4BFDF76BFC040088 +:109D50000D0001F02FFECB4A0F0000900191CA4B7D +:109D600020002900FDF75EFCC84AC94BFCF70AFD3C +:109D700022002B00FDF756FCC64AC74BFDF7CCFE70 +:109D800022002B00FDF74EFCC44AC54BFCF7FAFC41 +:109D900022002B00FDF746FCC24AC34BFDF7BCFE78 +:109DA00022002B00FDF73EFCC04AC14BFCF7EAFC49 +:109DB00022002B00FDF736FCBE4A02900391BE4BF9 +:109DC00020002900FDF72EFCBC4ABD4BFDF7A4FE88 +:109DD00022002B00FDF726FCBA4ABB4BFCF7D2FC55 +:109DE00022002B00FDF71EFCB84AB94BFDF794FE8C +:109DF00022002B00FDF716FC0022A04BFCF7C2FC52 +:109E000002000B0002980399FCF7E8FF009A019BFF +:109E1000FDF708FC00260290039132003B00300061 +:109E20003900FDF7FFFB02000B0020002900FDF7C1 +:109E300073FE320004000D00009801993B00FCF70E +:109E4000A1FC02000B0020002900FCF7C7FF020064 +:109E50000B0002980399FCF795FC32003B00FCF7DD +:109E600091FC02000B00FCF78DFC5DE7994A9342E0 +:109E70000BDC9948994957E702000B00FDF74CFEAF +:109E800002000B00FCF7AAFF4EE702000B00FDF7F3 +:109E9000C9FB04000D007B4A7B4BFDF7C3FB7B4AEB +:109EA0007B4BFCF76FFC22002B00FDF7BBFB794AD4 +:109EB000794BFDF731FE22002B00FDF7B3FB774A0B +:109EC000774BFCF75FFC22002B00FDF7ABFB754ADC +:109ED000754BFDF721FE22002B00FDF7A3FB734A13 +:109EE000734BFCF74FFC22002B00FDF79BFB714AE4 +:109EF00000900191704B20002900FDF793FB6F4A01 +:109F00006F4BFDF709FE22002B00FDF78BFB6D4A1E +:109F10006D4BFCF737FC22002B00FDF783FB6B4AEF +:109F20006B4BFDF7F9FD22002B00FDF77BFB0022B8 +:109F3000524BFCF727FC02000B0000980199FCF73C +:109F40004DFF3A003300FDF76DFB02000B00644843 +:109F50006449FDF7E1FD02000B0038003100FDF718 +:109F6000DBFD02000B005C485C49FDF7D5FDDBE63C +:109F700059485D49D8E60022404BFCF703FC00221B +:109F80003F4BFDF74FFB04000D003E4A3E4BFDF7F3 +:109F900049FB3E4A3E4BFCF7F5FB22002B00FDF748 +:109FA00041FB3C4A3C4BFDF7B7FD22002B00FDF77F +:109FB00039FB3A4A3A4BFCF7E5FB22002B00FDF750 +:109FC00031FB384A384BFDF7A7FD22002B00FDF787 +:109FD00029FB364A364BFCF7D5FB22002B00FDF758 +:109FE00021FB009001912000290001F0E3FC314A9F +:109FF00006000F00304B20002900FDF713FB2F4A0D +:10A000002F4BFDF789FD22002B00FDF70BFB2D4A9E +:10A010002D4BFCF7B7FB22002B00FDF703FB2B4A6F +:10A020002B4BFDF779FD22002B00FDF7FBFA0022F8 +:10A03000124BFCF7A7FB02000B0000980199FCF7FC +:10A04000CDFE32003B00FDF7EDFA254A254BFDF72A +:10A0500063FD32003B00FCF795FB02000B00FCF7B0 +:10A0600091FB02000B001C481F49FDF755FD5BE604 +:10A07000FFFFEF3F000010C0FFFFDF3F0000F03F99 +:10A080000000E03F09F7FD0DE13D023F88B2017598 +:10A09000E0EF493F3B8F68B52882A43F5544880EC6 +:10A0A00055C1C93F7D6FEB0312D6D43F5555555569 +:10A0B0005555C53F82922EB1C5B8B33F59018D1B8E +:10A0C0006C06E63FC88A599CE52A00404B2D8A1C45 +:10A0D000273A03400000603C182D4454FB21F93F0F +:10A0E000075C143326A6913CFB210940F0B53C4A9D +:10A0F00083B005000C1E944236DD3A4A914208DDD9 +:10A10000394A91423CDD02000B00FCF73BFB03B0F7 +:10A11000F0BD364A8A1802432FD08022D2059142E0 +:10A1200035DC0022324BFDF7F7FC02000B00040087 +:10A130000D00FCF727FB220006000F002B0020007B +:10A140002900FDF76FFA02000B0030003900FCF720 +:10A1500019FB01F02FFC02000B0020002900FCF786 +:10A1600011FBFEF7C3FDD2E702000B00FDF7D4FCA4 +:10A1700002000B00FCF732FEC9E700200021C6E711 +:10A1800000F0ACFE1B4A1C4BFCF7FCFABFE70200D8 +:10A190000B00FDF747FA0022154BFDF7BDFC01F05F +:10A1A00009FC2A0006000F00230028002100FCF70C +:10A1B000E9FA3200009001913B0028002100FCF7F1 +:10A1C000E1FA02000B0000200949FCF707FE02003B +:10A1D0000B0000980199FDF79FFC00F07FFE96E7C9 +:10A1E000FFFFEF3FFFFFAF41FFFFEF7F000010C019 +:10A1F0000000F03FEF39FAFE422EE63FF0B5574639 +:10A200004E464B005B089A46C0B4CD4B87B0060063 +:10A210000F0089469A4512DDCA4B5344034322D0AE +:10A2200002000B00FDF778FC0B000200FCF7D6FDE6 +:10A230000300180007B00CBC91469A46F0BDC24B13 +:10A240009A4524DCC14B9A4500DD0CE1C04AC14B64 +:10A25000FCF798FA0022C04BFBF768FA002816D0EA +:10A2600033003900E5E7BD4ABD4BFDF7DBF9BD4AD8 +:10A2700004000D00BC4B30003900FDF7D3F90B0092 +:10A28000020029002000FCF77DFA0300D1E730002E +:10A290003900FEF78FFC02000B000020AE49FDF7ED +:10A2A0003BFC0022B14BFDF7BDF904000D00B04AA4 +:10A2B000B04BFDF7B7F9B04AB04BFCF763FA220098 +:10A2C0002B00FDF7AFF9AE4AAE4BFDF725FC22009F +:10A2D0002B00FDF7A7F9AC4AAC4BFCF753FA220070 +:10A2E0002B00FDF79FF9AA4AAA4BFDF715FC2200A7 +:10A2F0002B00FDF797F9A84AA84BFCF743FA220078 +:10A300002B00FDF78FF9A64A02900391A54B200080 +:10A310002900FDF787F9A44AA44BFDF7FDFB2200B5 +:10A320002B00FDF77FF9A24AA24BFCF72BFA220083 +:10A330002B00FDF777F9A04AA04BFDF7EDFB2200BB +:10A340002B00FDF76FF9844B0022FCF71BFA0490F9 +:10A3500005912000290001F02DFB994B06000F000C +:10A360009A4563DC0B000298039900220092019346 +:10A37000049A059BFCF732FD3200029003913B00EA +:10A3800030003900FCF7FEF902000B000298039937 +:10A39000FDF748F9029003910098019902000B0023 +:10A3A000FDF740F902000B0020002900FDF7B4FB87 +:10A3B000009A019B04000D0030003900FCF7E2F91F +:10A3C00002000B0020002900FCF708FD02000B0032 +:10A3D000FCF7D8F902000B0062486349FDF79CFBCB +:10A3E00002000B0002980399FDF796FB04000D0094 +:10A3F0000098019902000B00FCF7C4F902000B0061 +:10A4000056487049FDF788FB02000B002000290028 +:10A41000FDF782FB02000B0050486A49FDF77CFB08 +:10A420004B46002B00DC84E0030002E7049A059B06 +:10A4300002980399FCF7D2FC32003B00FDF7F2F8DA +:10A4400032003B00FCF79EF902000B00FCF79AF982 +:10A45000444A454BFDF760FB02000B003F48404972 +:10A46000FDF75AFBDCE702000B00FDF7DBF8040008 +:10A470000D003F4A3F4BFDF7D5F83F4A3F4BFCF7F5 +:10A4800081F922002B00FDF7CDF83D4A3D4BFDF749 +:10A4900043FB22002B00FDF7C5F83B4A3B4BFCF782 +:10A4A00071F922002B00FDF7BDF8394A394BFDF751 +:10A4B00033FB22002B00FDF7B5F8374A374BFCF78A +:10A4C00061F922002B00FDF7ADF8354A00900191AB +:10A4D000344B20002900FDF7A5F8334A334BFDF734 +:10A4E0001BFB22002B00FDF79DF8314A314BFCF796 +:10A4F00049F922002B00FDF795F82F4A2F4BFDF765 +:10A500000BFB22002B00FDF78DF80022124BFCF70D +:10A5100039F902000B0000980199FCF75FFC32004A +:10A520003B00FDF77FF83B003200FCF72BF90300FE +:10A530007FE68022120694460300614479E6C04615 +:10A54000FFFFEF3F000010C0FFFFDF3FFFFF3F3E78 +:10A550009C7500883CE4377E0000F03F182D445481 +:10A56000FB21F93F075C143326A6913C0000E03F35 +:10A5700009F7FD0DE13D023F88B20175E0EF493F6B +:10A580003B8F68B52882A43F5544880E55C1C93F0A +:10A590007D6FEB0312D6D43F555555555555C53FE4 +:10A5A00082922EB1C5B8B33F59018D1B6C06E63FB0 +:10A5B000C88A599CE52A00404B2D8A1C273A034043 +:10A5C0003233EF3FFB21E93FF8B515004F464646D1 +:10A5D0005A001C006B42C0B42B434B4F5208DB0F98 +:10A5E00088461343BB423AD84B005B0899464E4617 +:10A5F00043420343DB0F3343BB4230D8434BE318A2 +:10A600002B4343D00226A3171E40CB0F1E434B46BD +:10A6100003432ED013002B4332D0BA4241D0B94568 +:10A620002ED04B469A1A12153C2A32DC002C55DBF0 +:10A630002A002300FCF7D2FBFEF7BCFAFEF740F835 +:10A64000012E46D0022E39D0002E0ED0304A314B8A +:10A65000FDF762FA304A314BFDF75EFA05E0020081 +:10A660000B0028002100FCF78DF80CBC90469946A1 +:10A67000F8BD022E10D0032EF7D127482849F4E761 +:10A6800043462548002B0ADB2649EEE7FEF718F87B +:10A69000EBE721482349D3E71F482049E5E7224952 +:10A6A000E3E791451FD0022EF6D0032EE5D000201F +:10A6B0000021012ED9D180210906D6E7144A154B75 +:10A6C000FDF72AFA02000B0013481449FDF724FA9B +:10A6D000CBE7802424060B191900C6E73C32A7DA21 +:10A6E00000200021ACE7022E06D0032E09D00A4834 +:10A6F000012E04D00D49B8E70D480E49B5E70E49C3 +:10A70000B3E70B480D49B0E70000F07F000010C030 +:10A71000075C143326A6A13C182D4454FB210940A4 +:10A72000FB2109C0FB21F93FFB21F9BFFB21E93FD8 +:10A73000D221337F7CD90240FB21E9BF7CD902C002 +:10A74000F0B5474680B443424E0003433A4A760888 +:10A75000DB0F82B004000D000700884633439342AC +:10A7600014D8964242D0354B9E4219DC344A354BC0 +:10A77000FCF708F800220023FAF7D8FF2900002888 +:10A780003AD0380002B004BC9046F0BD02000B0085 +:10A79000FDF7C2F902000B00FCF720FB0700F0E711 +:10A7A000294B351E9D4228DD330002003100FBF7A6 +:10A7B000E9FF220006000F002B0000201E49FDF7D4 +:10A7C000ABF902000B0030003900FCF707FBFEF785 +:10A7D0008DFA1E4B0022FCF725FF43460700002B95 +:10A7E000CFDA80231B069C466144CAE7002200237F +:10A7F000FCF7F4FA0700C4E7350022002B00200024 +:10A800002900FBF7BFFF22002B0006000F00FCF71A +:10A8100009FF2200009001912B0000200649FDF75E +:10A820007BF902000B0000980199FCF7D7FA32007F +:10A830003B00FBF7A7FFCAE70000F03FFFFF2F3EFA +:10A840009C7500883CE4377EFFFFDF3F0000E03F5F +:10A85000F0B54B005E08474B83B09E4218DC464B78 +:10A860009E421FDD454B9E425EDD454B9E4200DC15 +:10A8700075E0444B9E4242DD434B9E423CD0434AEE +:10A88000434B10001900FCF7CDFE04000D0005E05D +:10A8900002000B00FCF7C6FE04000D00200029009A +:10A8A00003B0F0BDFEF786F902F056F9394B0022ED +:10A8B00000900191FBF766FF374B04000D009E42AC +:10A8C000ECDD009A019B10001900FCF7ABFE2200A2 +:10A8D0002B0006000F0020002900FBF753FF0200A9 +:10A8E0000B0030003900FCF779FA0022294BFBF706 +:10A8F00049FF04000D00D1E7284B9842BFD8FEF76E +:10A9000059F90022264BFCF78DFE00F04BF80400AD +:10A910000D000022224BFCF785FE22002B00FCF7E5 +:10A9200081FE04000D00B9E7FEF744F900F03AF8A3 +:10A9300000221B4B04000D00FCF774FE22002B00CC +:10A9400006000F0000201649FCF748FA02000B0031 +:10A9500030003900FBF716FF04000D009EE7FEF7FC +:10A9600029F900F01FF800220D4BFCF75BFE0400F4 +:10A970000D0093E7FFFFEF7F422ED63FFFFF3540EC +:10A98000412E8640CD338640CE3386409C7500886C +:10A990003CE4377E0000F03FFFFF7F3C7DF8B98F3D +:10A9A0000000E03FF0B5574680B44B000E00CC0FDE +:10A9B000954984B007005B088B420ED993498B42BE +:10A9C00000D884E03203120B024300D0F7E03100DC +:10A9D000002C78D00020002175E08D4A934200D9E8 +:10A9E000B6E08C4A934200D8CAE000239A463A0067 +:10A9F000330038003100FCF715FE04000D00864AD4 +:10AA0000864BFCF70FFE864A864BFDF785F8220041 +:10AA10002B00FCF707FE844A844BFBF7B3FE2200B1 +:10AA20002B00FCF7FFFD824A824BFDF775F82200F0 +:10AA30002B00FCF7F7FD804A804BFBF7A3FE2200BA +:10AA40002B00FCF7EFFD02000B0038003100FDF792 +:10AA500063F8534604000D000200002B00D1B4E05F +:10AA60000B0038003100FCF7DDFD0F0080210600EF +:10AA700022002B000020C905FDF74EF802000B0054 +:10AA800030003900FCF7AAF902000B000298039984 +:10AA9000FDF742F8009A019BFDF73EF80B0002001B +:10AAA00067490020FDF738F8664B9A4500DB7AE0ED +:10AAB000FA24A4005444240563181900B823002282 +:10AAC0005B04FCF7AFFD04B004BC9246F0BD5E4AE7 +:10AAD0005E4B3100FAF72AFE002869D15C4A5D4BD3 +:10AAE00038003100FAF70EFE002800D072E75A4B0A +:10AAF000E4001C19594A5A4B38003100FCF792FD0A +:10AB000022686368FBF73EFEFDF77AFB8246FDF79D +:10AB1000ADFB544A544B04000D00FCF783FD0200CA +:10AB20000B0038003100FCF7F7FF504A009001910C +:10AB30004F4B20002900FCF775FD02900391029A0B +:10AB4000039B00980199FCF7E7FF07000E004EE712 +:10AB5000484A9342CBD8484BE5005B191A685B68BA +:10AB60003100FCF7D9FF454B009001915D192A682F +:10AB70006B680292039301231B1B1B1B9A46DEE7A3 +:10AB80003F4A404B3100FBF7FDFD00222C4BFAF70A +:10AB9000CDFD002800D128E70022294B38003100E4 +:10ABA000FBF7F0FD8FE754462405631819008AE788 +:10ABB000334A344B10001900FCF734FD83E70200E0 +:10ABC00033003100FBF7DEFD7DE70B00380031007C +:10ABD000FCF728FD8023009001910022DB05200076 +:10ABE0002900FCF799FF02000B0000980199FCF77F +:10ABF000F5F83A003300FCF78FFF02000B0000204D +:10AC00000F49FCF789FF5EE7412E8640FFFFEF7F8B +:10AC1000422ED63FFFFF2F3ED0A4BE726937663E5C +:10AC2000F16BD2C541BDBB3E2CDE25AF6A56113F4C +:10AC300093BDBE166CC1663F3E5555555555C53F33 +:10AC40000000F03F03FCFFFFEF39FAFE422E864082 +:10AC500051302DD5104987C0E8340300FE822B65A2 +:10AC60004715F73F0000E0FE422EE63F763C79357F +:10AC7000EF39EA3DB1A2F03F08350300F834030094 +:10AC80009C7500883CE4377EF8B5564644465F46DE +:10AC90004D4698465B005B08F0B41E0082460400F7 +:10ACA00015001700164326D0CE0FF607B3464E40C8 +:10ACB000B146804EB1451EDC56421643F60F1E4388 +:10ACC000B4467D4EB44516D8994504DC84461ADB5B +:10ACD000904218D35FD0794989451BDC4946002949 +:10ACE00000D0AAE056467649002E18DD01397600DC +:10ACF000002EFBDC13E04346FCF794FC02000B0043 +:10AD0000FCF76CF8844660463CBC90469946A246E7 +:10AD1000AB46F8BD6B4E4946B44609156144674ED3 +:10AD2000B3420ADC002B00D09EE0654E002D07DD0B +:10AD3000013E6D00002DFBDC02E0624E1D15AE19D8 +:10AD4000614DA94267DB4846050380202D0B400377 +:10AD500005435D4886424FDB434680221B031B0BA5 +:10AD600052031343881BEA1A00281DD0BC428941B4 +:10AD70004942521A09D41100E41B21430BD0E50FBC +:10AD80005200551964000138EDE7E10F6A005518CB +:10AD900064000138E7E75B46DE0F4C4BF6009E1976 +:10ADA000336871689C46AEE7BC429B415B42D21A55 +:10ADB0006CD4E41B13002343EDD0404B18009A429F +:10ADC00006DCE10F53005A186400013E8242F8DDB0 +:10ADD0003D498E424FDA891B142959DC202023007B +:10ADE0001400401ACB4084401C4313000B415A46C8 +:10ADF0001A431100A44686E7801B84461F282DDCD9 +:10AE000020273F1A1000F840070060468340824028 +:10AE10003B431700A6E76C1AA4461F2C18DC20251C +:10AE20002D1B0400EC404D46A2466446A540544606 +:10AE300025436446A04004008BE74946CE022249E0 +:10AE4000002E00DC6BE701397600002EFBDC66E7A4 +:10AE50001F4C641AA040002405007AE71C4B002711 +:10AE60009B1B9A4013007DE7174EDD02013E6D00EB +:10AE7000002DFBDC64E7174BA446D3185A46134356 +:10AE8000154AB5182D052B4319003CE72A0091E718 +:10AE90001F2908DC23002020CB40411A8A401400DF +:10AEA0001C435B46A3E70A4B9B1B1A415B461400FD +:10AEB0009DE7C046FFFFEF7F0000F07FFFFF0F0020 +:10AEC000EDFBFFFF01FCFFFF02FCFFFF1835030055 +:10AED000E2FBFFFF0000F0FFFF030000F0B5574664 +:10AEE0004E464546E0B4DA4A88B00B1E934255DC24 +:10AEF0004A005208024300D1EFE0002900DA79E16C +:10AF0000D44B0022FCF78EFB3625D34C0B006D4250 +:10AF1000A34247DC1A151B031B0B9846CF4C80231A +:10AF2000A446CF4C5B0344442340CE4C62445219A8 +:10AF30005C4045461B1599462543CA4B2900914460 +:10AF40000022FCF7E9FD434602331B0306000F0015 +:10AF50001B0B0022022B2FDC0023FAF7CDFB00286D +:10AF600000D1C1E04B46002B00D14CE14846FDF733 +:10AF70007DF9BD4ABD4B04000D00FCF753FBBC4AF4 +:10AF800006000F00BB4B20002900FCF74BFB020022 +:10AF90000B0030003900FBF7F5FB07E0AE4C002555 +:10AFA000A342B7DD02000B00FBF7ECFB08B01CBCB2 +:10AFB00090469946A246F0BD8023DB05FBF7E2FBF5 +:10AFC00002000B0030003900FBF708FF0400484680 +:10AFD0000D00FDF74BF92200029003912B00200099 +:10AFE000290004940595FCF71DFB04000D00A24BFD +:10AFF000020043449A460B0000940195FCF712FBB3 +:10B0000004000D009D4A9E4BFCF70CFB9D4A9E4B95 +:10B01000FBF7B8FB22002B00FCF704FB9B4A9C4B80 +:10B02000FBF7B0FB22002B00FCF7FCFA994A9A4B85 +:10B03000FBF7A8FB009A019BFCF7F4FA974A0090F3 +:10B040000191974B20002900FCF7ECFA954A964BAA +:10B05000FBF798FB22002B00FCF7E4FA934A944B91 +:10B06000FBF790FB22002B00FCF7DCFA0B00020040 +:10B0700000980199FBF786FB0D0041468D4B0400BB +:10B080005B1A51460B43002B54DD00228A4B3000E3 +:10B090003900FCF7C7FA32003B00FCF7C3FA4B4615 +:10B0A0000A00010000910192002B72D113002900C7 +:10B0B00002002000FBF766FB049A059BFCF7B2FA3E +:10B0C00002000B0000980199FCF726FD02000B001E +:10B0D00030003900FCF720FD68E700220023002043 +:10B0E0007649FBF77BFE61E7754A764B3000390005 +:10B0F000FCF798FA02000B0000206F49FCF70CFDEA +:10B10000320004000D003B0030003900FCF78AFAE1 +:10B110000B00020029002000FCF784FA4B460400D3 +:10B120000D00002B72D102000B0030003900FCF73B +:10B13000F3FC3BE74B46002B00D1C5E00298039996 +:10B14000494A4A4BFCF76EFA2200009001912B000D +:10B1500030003900FCF7E0FC049A059BFCF762FA2A +:10B16000434A04000D0002980399424BFCF75AFA37 +:10B1700002000B0020002900FCF7CEFC32003B004F +:10B18000FCF7CAFC02000B0000980199FCF7C4FC14 +:10B190000CE7354A354B02980399FCF743FA009ABD +:10B1A000019B0690079120002900FBF7EBFA049A17 +:10B1B000059BFCF737FA2E4A04000D00029803990C +:10B1C0002C4BFCF72FFA02000B0020002900FBF7A4 +:10B1D000D9FA02000B0000980199FCF79DFC32009F +:10B1E0003B00FCF799FC02000B0006980799FCF75E +:10B1F00093FCDBE602000B00FCF78EFC0022002330 +:10B20000FBF7ECFDD2E600200021CFE64846FDF733 +:10B210002DF8154A154B00900191FCF703FA144ADA +:10B220000290039100980199124BFCF7FBF9020080 +:10B230000B0020002900FCF76FFC32003B00FCF7FC +:10B240006BFC02000B0002980399FCF765FCADE66D +:10B25000FFFF0F0000005043FFFFEF7F01FCFFFFE7 +:10B26000645F09000000F03F0000E0FE422EE63F70 +:10B27000763C7935EF39EA3D86EBF9FF44523EDF03 +:10B2800012F1C23FDE03CB966446C73F5993229426 +:10B290002449D23F935555555555E53F9FC678D023 +:10B2A000099AC33FAF788E1DC571CC3F04FA9799B8 +:10B2B0009999D93F51B806000000E03F000050C303 +:10B2C000555555555555D53F22002B0030003900B6 +:10B2D000FCF722FC049A059BFCF7A4F9F6E6C046AD +:10B2E000F0B54F464646C0B43B4A83B004000D005B +:10B2F0000B1E93421CDC4A00520802435BD000291B +:10B3000060DB0022354BFCF78DF936220D000B0077 +:10B310003349040052428B420EDD22002B002000F4 +:10B320002900FBF72FFA03B00CBC90469946F0BDFC +:10B330002B4900228B42F0DC2A4918158C466044C8 +:10B340008218D10F89461B034A441B0B10009846F4 +:10B35000FCF78CFF4A46244B06009B1A42461B050D +:10B360001A430F0020001100FFF7B8FD1F4A040028 +:10B370000D001F4B30003900FCF754F91D4A0090B6 +:10B3800001911D4B20002900FCF74CF902000B0035 +:10B3900000980199FBF7F6F9184A04000D00184BC4 +:10B3A00030003900FCF73EF902000B0020002900B4 +:10B3B000FBF7E8F9B7E70022002300201149FBF76B +:10B3C0000DFDB0E702000B00FCF7A6FB00220023F6 +:10B3D000FBF704FDA7E7C046FFFF0F000000504346 +:10B3E000FFFFEF7F01FCFFFFFF030000362BF11191 +:10B3F000F3FE593D0EE526157BCBDB3F00609F50E9 +:10B400001344D33F000050C3F0B54E46574645465F +:10B41000E0B4DC4B4E0090B01700894676089E429F +:10B4200000DC81E0D84B9E4220DCD84A002900DCB9 +:10B4300089E1D74BFCF770FBD54B04000D009E4211 +:10B4400000D18AE0D34AD44BFCF766FB02000B0024 +:10B4500020003A607B602900FCF75EFBCD4ACE4BB2 +:10B46000FCF75AFBB860F960012066E0CB4B9E42C6 +:10B4700000DC8DE0CA4B9E4265DCCA4932158A4623 +:10B48000924453461B05F51A29000400FCF7B8FE48 +:10B49000FCF7ECFE02000B00200029000A920B933F +:10B4A000FCF73AFB0022C04BFCF7BCF8029003917A +:10B4B000FCF7A6FEFCF7DAFE04000D0002000B000C +:10B4C000029803990C940D95FCF726FB0022B64BCD +:10B4D000FCF7A8F8002200230E900F91FAF70CF960 +:10B4E000002800D14CE10023002220002900FAF7B7 +:10B4F00003F90222431E9841131AAC4A3900019203 +:10B5000002220AA80092524600F064FC4B46002B2F +:10B5100013DA8022120694467B68404263447B60C3 +:10B52000FB686344FB6008E002000B003A607B604C +:10B53000002200230020BA60FB6010B01CBC9046C3 +:10B540009946A246F0BD02000B00FCF7E5FAB86090 +:10B55000F960386079600020EFE7D3228E4B520506 +:10B56000FCF7DAFA924A934B04000D00FCF7D4FA88 +:10B5700002000B0020003A607B602900FCF7CCFA47 +:10B580008B4A8C4BFCF7C8FAB860F9600120D4E70D +:10B59000FDF710FB884A894B04000D00FCF742F8C8 +:10B5A0000022874BFBF7EEF8FCF72AFE8046FCF7FB +:10B5B0005DFE764A764B06900791FCF733F8020061 +:10B5C0000B0020002900FCF7A7FA734B02900391AF +:10B5D000069807996F4AFCF725F8434604000D00CA +:10B5E000049405951F2B30DC013B764A9B009B5849 +:10B5F0009E422AD002000B0002980399FCF78CFAB5 +:10B6000002000B0005000C003A607B600298039971 +:10B610002A002300FCF780FA049A059BFCF77CFAC9 +:10B6200006000B003200BA60FB604B464046002B20 +:10B6300000DB82E780231B069C46644461443D6036 +:10B640007C60BE60F960404277E7049A059B0298EF +:10B650000399FCF761FA0B0002003A607B604B0033 +:10B6600036155B0D05000C00F31A102BCEDD069885 +:10B670000799D322484B5205FBF7D4FF04000D0075 +:10B6800002000B0002980399FCF746FA02000B0037 +:10B690000298039908920993FCF73EFA22002B00C6 +:10B6A000FCF73AFA04000D0006980799404A414B0E +:10B6B000FBF7B8FF22002B00FCF72EFA02000B006C +:10B6C0000490059108980999FCF726FA02000B00EE +:10B6D0003A607B604B005B0DF61A0500089A099BE7 +:10B6E0000C0002920393312E90DD06980799B82240 +:10B6F000304B9205FBF796FF04000D0002000B0093 +:10B7000002980399FCF708FA0A000100130002915D +:10B710000392020008980999FCF7FEF922002B0019 +:10B72000FCF7FAF904000D0006980799264A274B02 +:10B73000FBF778FF22002B00FCF7EEF902000B006C +:10B740000492059358E7124BFBF71CF8104B0400CA +:10B750000D009E423CD00F4A0F4BFBF713F802003E +:10B760000B0020003A607B602900FCF7D5F9094AFC +:10B77000094BFBF707F8B860F96001204042DCE6AE +:10B780000323BAE6FB21E93F7BD902400000405485 +:10B79000FB21F93F3163621A61B4D03DFB2139418D +:10B7A000FFFFEF7FEAFBFFFF00007041C84303008B +:10B7B0007370032E8A19A33B83C8C96D305FE43FC1 +:10B7C0000000E03F48430300C14920259A837B39AC +:10B7D000D3220D4B5205FAF7D5FF0C4A0C4B04004F +:10B7E0000D00FAF7CFFF02000B0020003A607B60EB +:10B7F0002900FCF791F9054A054BFAF7C3FFB86039 +:10B80000F9600120404298E661B4D03D7370032E88 +:10B810008A19A33BF0B54B005C08594B85B0070073 +:10B820000E009C421DDC002930DB0022554B0092AB +:10B830000193554B9C4219DC544B9C4200DD73E054 +:10B84000534A544B38003100FAF79CFF524B002208 +:10B85000F9F76CFF310003003800002B1BD005B056 +:10B86000F0BD02000B00FAF78DFFF8E74B4B9C424E +:10B8700078DD4B4B9C4240DD4A4B9C423AD0444AD7 +:10B88000444B38003100FBF7CDFEE8E70022464B81 +:10B8900000920193CDE738003100FDF78BF901F0FC +:10B8A0005BF906000F0032003B0030003900FAF768 +:10B8B00069FF320004000D003B0030003900FBF747 +:10B8C000B1FE002202900391334B30003900FAF7A9 +:10B8D00059FF02000B0002980399FBF77FFA020060 +:10B8E0000B0020002900FCF717F9009A019BFBF7D9 +:10B8F00099FEB4E72D4B9F42C1D838003100FDF7C7 +:10B9000059F900221F4BFBF78DFEFFF74BF806009D +:10B910000F0002000B0000980199FBF783FE320034 +:10B920003B00FBF77FFE9AE738003100FDF742F954 +:10B9300001F012F91E4B06000F009C42B3DD0022FD +:10B94000154BFAF71FFF02000B0030003900FBF720 +:10B9500045FA32003B00FAF715FF009A019BFBF70E +:10B9600061FE7CE738003100FDF724F9FFF71AF893 +:10B9700002000B0000980199FBF754FE6FE7C046E8 +:10B98000FFFFEF7F0000E03FFFFF3540FFFF2F3E4E +:10B990003374AC3C1F7BAC7F0000F03F412E8640EF +:10B9A000CD338640CE3386400000E0BF7DF8B98FAE +:10B9B000FFFFEF3FF0B556464D4644465F46754B98 +:10B9C000F0B40A000D00190083B0060004002940FD +:10B9D000994200D1BAE0002D00DC94E02D1500D191 +:10B9E000A3E06D4B12039C468023120B5B0365445E +:10B9F0001A43EB0700D581E06B109846E30F9B18C4 +:10BA00009B18802216210026002764009203B81894 +:10BA1000984202DC87181B1AB618E00F5B00013948 +:10BA20001B18640052080029F1D1002201929446AB +:10BA3000802212062020914609E09F4241D0E10F6A +:10BA4000C9180138CB186400520800281ED061467E +:10BA500051189F42F1DA8D18AC46CD0FED07BA466A +:10BA60004D4539D0DB1B8C42BF417F42DB1B641A42 +:10BA7000019901388B46934459460191E10FC91849 +:10BA80005746CB18640052080028E0D123432BD13D +:10BA9000019B5B08414972108C466244F10702D554 +:10BAA000802109060B43414609058D181E002F0011 +:10BAB0003000390003B03CBC90469946A246AB46E4 +:10BAC000F0BDA1420ED88D18AC46CD0FED074D4507 +:10BAD00048D09A460023CAE76546002DC2DB7D1C8C +:10BAE000AA46BFE73B00AAE7019B01333ED0019A7B +:10BAF00001239446134063445B08CBE7E30F5200F5 +:10BB00009A18640078E76B005B0803432F00002B52 +:10BB1000CED00025002A31D1E20A153D6405002A65 +:10BB2000FAD080235B031A4223D1802000234003F4 +:10BB300000E00B005200591C0242FAD02020401AAB +:10BB4000ED1A2300C3408C401A434AE702002B0041 +:10BB50002900FBF767FD32002B00FAF713FE060001 +:10BB60000F00A5E76546002DB3DBB8E701360023DB +:10BB700090E7012320205B420021E1E73B00020027 +:10BB80003900FBF7C9FF02000B00FBF727F906009D +:10BB90000F008DE70000F07F01FCFFFF0000E03F99 +:10BBA000F0B54F464646C0B487B000920193754B3E +:10BBB0004F00814688467F089F4263DCFCF720FBEC +:10BBC000002800D1DAE04A46434648464146FBF7A2 +:10BBD00029FD04000D006C4A6C4BFBF723FD6C4AF9 +:10BBE0006C4BFAF7CFFD22002B00FBF71BFD6A4AD6 +:10BBF0006A4BFBF791FF22002B00FBF713FD684A0D +:10BC0000684BFAF7BFFD22002B00FBF70BFD664ADD +:10BC1000664BFBF781FF22002B00FBF703FD644A14 +:10BC2000644BFAF7AFFD22002B00FBF7FBFC029000 +:10BC300003910022604B20002900FBF7F3FC029ADD +:10BC4000039B06000F0020002900FBF7EBFC009A85 +:10BC5000019B04000D0048464146FBF7E3FC02004F +:10BC60000B0020002900FBF757FF02000B003000FB +:10BC70003900FBF751FF02000B0000204F49FBF792 +:10BC80004BFF70E002000B00FBF7CCFC04000D0042 +:10BC90003D4A3E4BFBF7C6FC3D4A3E4BFAF772FD70 +:10BCA00022002B00FBF7BEFC3B4A3C4BFBF734FF6A +:10BCB00022002B00FBF7B6FC394A3A4BFAF762FD3B +:10BCC00022002B00FBF7AEFC374A384BFBF724FF72 +:10BCD00022002B00FBF7A6FC354A364BFAF752FD43 +:10BCE0002B002200FBF79EFC354B029003919F42F4 +:10BCF0009FDD344B00229F423ADC334900207B1801 +:10BD00002E4916001F00FBF707FF04900591002243 +:10BD1000294B20002900FBF785FC32003B00FBF794 +:10BD2000FBFE029A039B06000F0020002900FBF790 +:10BD300079FC009A019B04000D0048464146FBF740 +:10BD400071FC02000B0020002900FBF7E5FE020059 +:10BD50000B0030003900FBF7DFFE02000B000498F7 +:10BD60000599FBF7D9FE07B00CBC90469946F0BD8B +:10BD7000164B002604920593154FC8E700200F4983 +:10BD8000F1E7C046FFFF3F3ED43888BEE9FAA8BDC0 +:10BD9000C4B1B4BD9EEE213EAD529C804F7E923E1A +:10BDA0009015CB19A001FA3E7751C1166CC1563FD0 +:10BDB0004C5555555555A53F0000E03F0000F03F5C +:10BDC0003233D33F0000E93F0000E0FF0000E73FCF +:10BDD0000000D23FF0B556464D4644465F46F0B4AB +:10BDE0008E4CA544099119001400A89A0B938C4B12 +:10BDF0009200D2580B000290013BE01E18211D005A +:10BE0000160008920093F9F77BFBC3430200DB178F +:10BE10001A401300110001330E929A009B1ADB00A6 +:10BE20001B1906934C1B761918D4A99BA5009C4698 +:10BE3000361926AF6544013607E02868FCF716FA84 +:10BE4000013403C70435B44208D0002CF5DA0020D1 +:10BE50000021013403C70435B442F6D1089B002BFE +:10BE600001DA00F0F9FB76AB19008B4626AA914661 +:10BE7000089A0A930132D2009344029A9A46904655 +:10BE8000009BDB00994408339844009B002B00DAA8 +:10BE9000B5E14C4600260027029D2268636803CD69 +:10BEA000FBF7C0FB02000B0030003900FAF76AFC18 +:10BEB000083C06000F004545EFD15346C0C39A46E3 +:10BEC00008239C46E144DA45DFD10899554A0B0026 +:10BED000944663449B0012A884461A000298624468 +:10BEE00083460D920B9A0433D200634493440F931C +:10BEF0000591059A0A98D30019000C938C4603000B +:10BF000063441E685F68002A34DD12AB9946130053 +:10BF1000454A804694466344DB00984474AB9A4695 +:10BF20000022424B30003900FBF77CFBFCF768F93C +:10BF3000FCF79CF900223E4B04000D00FBF772FB5E +:10BF400002000B0030003900FBF7E6FDFCF758F962 +:10BF50004B4601C39946434620001A685B68290096 +:10BF6000FAF710FC08235B429C46E04406000F00F1 +:10BF7000D045D5D1069B30001A003900994601F012 +:10BF800063F8FF2300229B0504000D00FBF74AFB2A +:10BF9000FCF714FE0022274BFBF744FB02000B00CA +:10BFA00020002900FBF7B8FD04000D00FCF728F97C +:10BFB0008046FCF75BF902000B0020002900FBF72C +:10BFC000ABFD4C4606000F00002C00DCF8E0059BA2 +:10BFD00018205A1E920012AB9B58001B19000141F9 +:10BFE000884481405B1A12A98B501722121B1341FF +:10BFF0000793079B002B4BDD01239C46059BE044E8 +:10C00000002B00DCF2E280251096119712AB002184 +:10C01000002409486D04059F19E0C04684FDFFFF18 +:10C02000D0440300FEFFFF3FFFFFFF1F0000703EF4 +:10C030000000704100002040FFFFFF00002A02D0F6 +:10C04000AA1A1A600134013104338F4209DD1A68DB +:10C05000002CF3D0821A01311A60012404338F427C +:10C06000F5DC109E119F069B002B0EDD012B00D1ED +:10C07000B1E0022B09D1059B12A95A1E920012AB06 +:10C080009B5810939B029B0A8B50079B022B7ED0E0 +:10C090000023002230003900F9F72EFB059B002811 +:10C0A00000D16BE208995A1E914210DCBF490F98EB +:10C0B0008C4612A963448C4600219B0063441C6893 +:10C0C000043B21438342FAD1002900D0B5E0089B0C +:10C0D00012AA013B9B00D358002B00D084E201221E +:10C0E0000D9B043B596801320029FAD005990B00D9 +:10C0F0008C46013362440792934242DC0E9A944686 +:10C10000A99A634492460B9A9B00944626AA9046AD +:10C110009A44059B0A9A6344DB0098440C9B94461E +:10C120009946079BE144DB00634405935346186836 +:10C13000FCF79CF8434618605960009B002B23DBFA +:10C14000444600260027029D2268636803CDFBF762 +:10C1500069FA02000B0030003900FAF713FB083CC3 +:10C1600006000F005D45EFD14B469E60DF60042363 +:10C170009C460433E2449C46059BE144E0449945D7 +:10C18000D4D1079B0593B4E600260027ECE73200E4 +:10C190003B0000208649FBF7BFFC06000F00002C87 +:10C1A00000D175E7069A0020814900F04DFF02009A +:10C1B0000B0030003900FBF7AFFC06000F0067E70B +:10C1C000069B002B12D1059B12AA013B9B00D55860 +:10C1D000EB1507930DE7059B12A95A1E920012ABAF +:10C1E0009B5810935B025B0A8B504EE70022714B09 +:10C1F000F9F7A6FA00280ED10023079348E7534623 +:10C2000000260027C0C39A4608239C46E144DA452D +:10C2100000D03AE659E601239C4601330793059B7B +:10C22000E044002B00DDEEE632003B0000206049D8 +:10C23000FBF772FC06000F002AE743460B93069BB0 +:10C2400012A8183B190006939300C3580092002BC4 +:10C250000FD156481300844612A8634484469B00BD +:10C260006344043B5868013A18390028F9D0009219 +:10C270000691069A00204E4900F0E6FE009B04005D +:10C280000D00002B00DAB3E112AA94469F00DB00F8 +:10C2900067449C460A9A05936244934616003868A0 +:10C2A000FBF7E4FF22002B00FBF7BCF9424B3060A8 +:10C2B0007160002220002900FBF7B4F9083E74AB3E +:10C2C00004000D00043FB342E9D100239A464EAB6F +:10C2D0000293089B99464B4600260027002B21DB42 +:10C2E0008020364B5D469846C0053549002600271C +:10C2F000002408E008239C460835E044A24511DBF1 +:10C300004346186859682A686B68FBF78BF9020086 +:10C310000B0030003900FAF735FA013406000F003F +:10C32000A145E7DA029A53469446DB0063441E6057 +:10C330005F6001239C46093BE2449C4674ABE344A6 +:10C340009B45C8D1029B9946A89B022B00DD82E049 +:10C35000002B37DC1DD1059B00254B441E0000241B +:10C360003268736828002100FAF70CFA009B050078 +:10C370000C00083E5A1E0092F2D2079B002B03D0FD +:10C3800080231B069C4664442A00230009990A6006 +:10C390004B6007200B9B18409F239B009D443CBC97 +:10C3A00090469946A246AB46F0BDC046FFFFFF3F10 +:10C3B0000000F03F0000E03F0000703E2835030021 +:10C3C000FB21F93F059B00204B441E0000214CAF90 +:10C3D00032687368083EFAF7D5F9BE42F8D1079B78 +:10C3E000002B24D08023099A1B06CB1810605360C1 +:10C3F0000B0002004E984F99FBF78EFB009B002B21 +:10C400000BDD012450AD0CCDFAF7BCF9009B0134D3 +:10C41000A342F8DA079B002B03D080231B069C461F +:10C4200061440B00020009998A60CB60B1E7020009 +:10C430000B00099C226063600B0002004E984F992C +:10C44000FBF76AFB009B002BDBDC0B000200099969 +:10C450008A60CB609DE7A89B032B9AD1009B002BA1 +:10C4600000DCE3E07E4A059B94464B441E685F680F +:10C47000009B63449A46DB004B4498464CAB9B467A +:10C4800043465C681B681800210032003B000290A4 +:10C490000391FAF777F904000D0002000B000298EF +:10C4A0000399FBF739FB3B003200FAF76BF943467F +:10C4B0009860D9601C605D6008235B429C46E04444 +:10C4C00026002F00C345DBD1009B012B00DCADE033 +:10C4D000059BC8464B441E685F685346DB009B467D +:10C4E000D844434630005C681B68390000930194CF +:10C4F0001A002300FAF746F904000D0002000B00B1 +:10C5000000980199FBF708FB3B003200FAF73AF973 +:10C5100043469860D9601C605D6008235B429C467E +:10C52000E04426002F00C145DBD15D4600270024F2 +:10C5300008354D4450AE2A686B6838002100FAF780 +:10C5400021F9083D07000C00AE42F4D1079B002BF7 +:10C5500071D08021099A4E9B090613604B468C4688 +:10C560005B686444634453604B469B681761936007 +:10C570004B46DB6854616344D3600AE799464346FF +:10C580000B93069B30005A42390000F05DFD0022FB +:10C59000344B04000D00F9F7D3F8002832D0324BA9 +:10C5A000002220002900FBF73DF8FBF729FE4A4650 +:10C5B00006009700FBF75AFE00222A4BFBF732F8E1 +:10C5C00002000B0020002900FBF7A6FAFBF718FE7B +:10C5D00012AAD0514A46069B0132183300920693A4 +:10C5E000930012AAD65044E601227FE500243AE5E2 +:10C5F000A89B022B14DC002B0FDC00D0C9E6002521 +:10C600000024BAE64B46200029009E00FBF7F8FD07 +:10C6100012AB98514B4600932BE600200021DEE63A +:10C620004EAB9946A89B032B00D0B2E6079B002790 +:10C630000024002B8DD14E9A4F9B09990A604B60C4 +:10C640004B469A68DB68009201938A60CB603A009F +:10C6500023000A614B619CE676AB0A9335E4C04641 +:10C66000FFFFFF1F000070410000703EF0B54F4615 +:10C670004646C0B487B000920193464A4B008146BB +:10C6800088465B08934205DCFBF7BAFD4146031E72 +:10C69000484666D04A46434648464146FAF7C2FFF6 +:10C6A00004000D0002000B0048464146FAF7BAFFAD +:10C6B000394A3A4B06000F0020002900FAF7B2FF72 +:10C6C000374A384BFBF728FA22002B00FAF7AAFF6B +:10C6D000354A364BFAF756F822002B00FAF7A2FF3C +:10C6E000334A344BFBF718FA22002B00FAF79AFF73 +:10C6F000314B324AFAF746F80E9B02900391002B19 +:10C7000034D00098019900222D4BFAF78BFF029A42 +:10C71000039B0490059130003900FAF783FF020073 +:10C720000B0004980599FBF7F7F922002B00FAF7A4 +:10C7300079FF009A019BFBF7EFF9224A04000D00F4 +:10C74000214B30003900FAF76DFF02000B0020008A +:10C750002900FAF717F802000B0048464146FBF79C +:10C76000DBF907B00CBC90469946F0BD02000B0007 +:10C7700020002900FAF756FF124A134BFBF7CCF9B9 +:10C7800032003B00FAF74EFF4A464346F9F7FAFFFC +:10C79000E7E7C046FFFF3F3E7CD5CF5A3AD9E53D9B +:10C7A000EB9C2B8AE6E55A3E7DFEB157E31DC73E62 +:10C7B000D561C119A0012A3F1111813FA6F81011BE +:10C7C0000000E03F495555555555C53FF0B55F460A +:10C7D00056464D464446F0B489B000934B005B0882 +:10C7E0009A46BB4B8146884602928B469A4516DC98 +:10C7F000FBF706FD00282FD14B4652461A43129BE9 +:10C800000133134300D148E1129B012B00D15BE1BE +:10C810004A4643460020AF49FAF7E0FAF8E0AE4B4B +:10C820009A4519DD002900DA42E14A464346AB4801 +:10C83000AB49FBF771F904000D00029A009BA9486F +:10C84000A949FBF769F92B002200F9F79BFF0023A8 +:10C8500081468846029300934A46434648464146ED +:10C86000FAF7E0FE02000B0006000F00FAF7DAFE0E +:10C87000320004000D003B0048464146FAF7D2FE64 +:10C880009A4A049005919A4B20002900FAF7CAFEB3 +:10C89000984A994BF9F776FF22002B00FAF7C2FE6F +:10C8A000964A974BF9F76EFF22002B00FAF7BAFE73 +:10C8B000944A954BF9F766FF22002B00FAF7B2FE77 +:10C8C000924A934BF9F75EFF22002B00FAF7AAFE7B +:10C8D000904A914BF9F756FF32003B00FAF7A2FE5F +:10C8E0008E4A069007918E4B20002900FAF79AFE97 +:10C8F0008C4A8D4BF9F746FF22002B00FAF792FE87 +:10C900008A4A8B4BF9F73EFF22002B00FAF78AFE8A +:10C91000884A894BF9F736FF22002B00FAF782FE8E +:10C92000864A874BF9F72EFF22002B00FAF77AFE92 +:10C93000844A854BF9F726FF02000B0006980799F9 +:10C94000F9F720FF049A059BFAF76CFE029D009C04 +:10C950002A002300F9F716FF32003B00FAF762FEC7 +:10C9600002000B0028002100F9F70CFF04000D0065 +:10C9700004980599754A764BFAF754FE22002B006D +:10C98000F9F700FF0B000200414648460092019370 +:10C99000F9F7F8FE504B04000D009A453FDC129B5E +:10C9A000012B35D00F0002000B0000204949FAF797 +:10C9B00015FA00260D00029003914A4643463000C6 +:10C9C0003900FBF7A9F8002402000B000098019938 +:10C9D000FBF7A2F822002B00FAF724FE22000090B9 +:10C9E00001912B0030003900FAF71CFE0022594B50 +:10C9F000F9F7C8FE02000B0000980199F9F7C2FE92 +:10CA0000029A039BFAF70EFE22002B00F9F7BAFEFA +:10CA100009B03CBC90469946A246AB46F0BD129880 +:10CA2000FBF724FC220006000F002B002000290049 +:10CA3000FAF7F8FD3200029003913B002000290034 +:10CA4000F9F7A0FE02000B0002980399FAF7C6F965 +:10CA5000009A019BFBF760F802000B004846414634 +:10CA6000FBF75AF802000B00F9F78CFE02000B00EE +:10CA700030003900FBF750F85B460400981702239A +:10CA80001840013B181A0D00FBF7F0FB02000B00E9 +:10CA900020002900FAF7C6FDBAE748464146FCF7F0 +:10CAA00089F802000B0000202A49FAF797F9AFE74E +:10CAB0008022802112069446009B0906414463446B +:10CAC000814688460093B0E648464146A0E7C04606 +:10CAD000FFFF2F3E0000F0BF2794E53F182D445480 +:10CAE000FB21E93F075C143326A6813CD47ABF744E +:10CAF000702AFB3EE9A7F0320FB8123F68108D1A7A +:10CB0000F726303F1583E0FEC8DB573F93846EE97C +:10CB1000E326823FFE41B31BBAA1AB3F735360DBF8 +:10CB2000CB75F3BEA69237A0887E143F0165F2F262 +:10CB3000D844433F280356C9226D6D3F37D606843B +:10CB4000F464963F7AFE10111111C13F635555559B +:10CB50005555D53F0000F03FF0B54E464546574687 +:10CB6000E0B4DF4ACC0F4B0084B081468846E4072E +:10CB70005B0893424FD9DB4A934200D9F9E0002C7D +:10CB800000D17AE1D84AD94B48464146F9F7FAFD37 +:10CB900000220023F8F7B6FD002800D0F4E0D44AC4 +:10CBA000D44B48464146FAF73DFD02000B000020F9 +:10CBB000D149F9F7E7FDFBF723FB8246FBF756FB6C +:10CBC000CE4ACF4B06000F00FAF72CFD02000B00F7 +:10CBD00048464146FAF7A0FFCA4A04000D0030005B +:10CBE0003900C94BFAF71EFD06000F0032003B006A +:10CBF00020002900FAF790FF02000B0081468846CA +:10CC000020002900FAF788FF32003B00FAF784FF82 +:10CC10000290039109E0BD4A934200D9DBE0002273 +:10CC20009246BB4A934200D805E10022B94B4846E0 +:10CC30004146FAF7F7FC04000D0002000B004846DD +:10CC40004146FAF7EFFC06000F00B34AB34BFAF780 +:10CC5000E9FCB34AB34BF9F795FD32003B00FAF714 +:10CC6000E1FCB14AB14BFAF757FF32003B00FAF74B +:10CC7000D9FCAF4AAF4BF9F785FD32003B00FAF71C +:10CC8000D1FCAD4AAD4BFAF747FF32003B00FAF753 +:10CC9000C9FC0022AA4BF9F775FD00900191020032 +:10CCA0000B0020002900FAF7BDFC02000B00002059 +:10CCB000A449FAF731FF02000B0004000D000098B0 +:10CCC0000199FAF729FF2200009001912B004846B4 +:10CCD0004146FAF7A7FC02000B0000209A49FAF738 +:10CCE0001BFF02000B0000980199FAF777F83B0050 +:10CCF0003200FAF797FC5346002B48D0029C039D64 +:10CD000022002B00FAF708FF4A464346FAF78AFC4E +:10CD100022002B00FAF700FF3B003200FAF7FCFE7E +:10CD2000534604000D00013300D1B1E05346012BFE +:10CD300000D187E053460133392B5ED85346132B7D +:10CD400000DCB4E081490022C91A0B05200029004B +:10CD5000F9F718FD02000B0048464146FAF7DCFEE1 +:10CD6000774B0022F9F70EFD53461B055D1829008D +:10CD70001DE0774A934220D90903090B014300D0F3 +:10CD800013E14146002C12D0002072490FE002004E +:10CD90000B0048464146FAF745FC32003B00FAF7E3 +:10CDA000BBFE02000B0048464146FAF7B5FE04B050 +:10CDB0001CBC90469946A246F0BD674A674BF8F7FF +:10CDC000B5FC002800D1DAE6654A664B1000190070 +:10CDD000FAF728FCEBE7644A934200D9CAE0474AD5 +:10CDE000474B002C1ED0F9F7CDFC01235B42040019 +:10CDF0000D009A46434E5D4FF8E64A464346FAF721 +:10CE00008BFE02000B0000204D49FAF785FE5446C8 +:10CE100002002005431819001000494B0022FAF7C0 +:10CE20007BFEC4E7FAF778FE012304000D009A4662 +:10CE3000344E354FDAE64A4A4A4BF9F7A3FC020072 +:10CE40000B00ACE700224A4B48464146F8F75AFC33 +:10CE5000002800D19AE000222E4B48464146F9F7BF +:10CE600091FC02000B0020002900FAF755FEC023B8 +:10CE700000221B06FAF7D6FB99E71D4A1D4B4846D0 +:10CE80004146FAF7CFFB02000B000020214990E653 +:10CE900002000B0048464146FAF73EFE00221D4BB9 +:10CEA000FAF7C0FB00221B4BFAF736FE7FE7802320 +:10CEB00052469B031341224A0026D71A4A4643464C +:10CEC000FAF72AFE02000B0030003900FAF724FEC0 +:10CED00054460200200543181900100067E7C046B9 +:10CEE00079684340412E864059F3F8C21F6EA50170 +:10CEF000FE822B654715F73F0000E0BF0000E0FE13 +:10CF0000422EE63F763C7935EF39EA3D422ED63F58 +:10CF1000FFFF8F3C0000E03F2DC3096EB7FD8ABEC6 +:10CF20003952E686CACFD03EB7DBAA9E19CE143F4F +:10CF30008555FE19A0015A3FF41011111111A13F9E +:10CF40000000F03F0000084000001840FF03000010 +:10CF5000FFFFEF7F0000F0BFEF39FAFE422E864060 +:10CF60009C7500883CE4377EB1A2F03FEF39EABD02 +:10CF70000000D0BF104A114BFAF754FB02000B001F +:10CF80000020002C00D013E60D4912E622002B00F1 +:10CF900048464146FAF7C0FD02000B00F9F7F2FBE4 +:10CFA0000022084BF9F7EEFB01E702004346414639 +:10CFB000F9F7E8FBFBE6C046FE822B654715F73F15 +:10CFC0000000E03F0000F03F034B48009C46400853 +:10CFD0006044C00F7047C046000010800A00030084 +:10CFE000024330B50220002A00D130BD8022120653 +:10CFF000914216D00C4A0D4C8A180420A242F4D952 +:10D000000B4A8A18A242F0D90A4A4900490803206B +:10D010009142EAD9064A00209142E6D1584258414D +:10D02000E3E7002BE1D0EFE70000F0FFFFFFDF7F39 +:10D030000000F07FFFFF0F00002070470020014933 +:10D040007047C0460000F87F4B0070B55B0D1400C0 +:10D050000A00002B1AD14B005B08034315D00022B5 +:10D06000224BFAF7DFFA224B0A009C4222DB4B00EC +:10D070005B0D363B1F4DE318AB4220DC002B0DDD72 +:10D080001D4C1B0522401A43110070BD1B4DAB42C5 +:10D09000F0D102000B00F9F775FBF6E71D003535FE +:10D0A00018DA174B02009C420ADC0B00154816499F +:10D0B00000F032F8134A144BFAF7B4FAE5E702002D +:10D0C0000B001248124900F027F8104A104BFAF7EB +:10D0D000A9FADAE7084C363322401B05134319003E +:10D0E00000220C4BFAF79EFACFE7C04600005043EF +:10D0F000B03CFFFFFE070000FFFF0F80FF070000AE +:10D1000050C3000059F3F8C21F6EA5019C7500883A +:10D110003CE4377E0000903C30B54A00DB0FDB0773 +:10D1200052081A43110030BD70B5054C05001300BC +:10D13000201E04D00A000220290000E000BF70BDBC +:10D1400000000000014B18687047C0468020002096 +:10D15000084B10B50400002B02D0002100E000BFF6 +:10D16000054B1868836A002B00D09847200005F013 +:10D170003AFCC04600000000404503000E4B70B56D +:10D1800000251E000D4CE41AA410A54204D0AB00EB +:10D19000F35898470135F8E705F04EFF084B002596 +:10D1A0001E00084CE41AA410A54204D0AB00F358AA +:10D1B00098470135F8E770BD9C2000209C20002096 +:10D1C0009C200020C420002010B5034B01001868EB +:10D1D00005F072FE10BDC04680200020002370B50F +:10D1E000064C050008001100236000F063FB431C9F +:10D1F00003D12368002B00D02B6070BDB429002020 +:10D200000CB430B5164B9DB00C1E1D6804DA8B2390 +:10D2100001202B6040421DE0822302A99B008B81EC +:10D220000023029008619C4200D0631E8B604B611A +:10D2300001235B42CB81209A21AB2800019300F0AF +:10D2400011F9431C01DA8B232B60002C02D0002340 +:10D25000029A13701DB030BC08BC02B01847C0461B +:10D2600080200020F0B51E00454B87B01B6801925E +:10D27000029308220B00059003911C7802995D1C13 +:10D2800009194878104001D02B00F6E72D2C04D165 +:10D290009D1C5C780123009304E000902B2C01D1AD +:10D2A0005C789D1C002E02D0102E0AD162E0302C3A +:10D2B0005ED120222B789343582B54D110266C78C2 +:10D2C0000235009F31007B1E9F412E4BFF18380016 +:10D2D000F8F712F9380004913100F8F787F80023C5 +:10D2E0000322070094461800029A1219517804226A +:10D2F000114201D0303C07E06246114017D037227E +:10D30000012900D02032A41AA64210DD5A1C0BD0ED +:10D31000B84207D802D1049B9C4203DC704301232E +:10D32000201801E001235B422C780135DCE75A1C10 +:10D330000BD10098059A431E9841124BC018222326 +:10D340001360019B002B0AD117E0009A002A00D03D +:10D350004042019A002A10D0039A002B00D06A1E86 +:10D36000019B1A6009E03024002EAAD10826A8E704 +:10D370000A26A6E7302C9CD0A3E707B0F0BDC04634 +:10D3800084200020FFFFFF7F10B513000A0001007A +:10D3900002480068FFF766FF10BDC04680200020ED +:10D3A000F0B58E6885B007000C00039201939E4291 +:10D3B00043D890238A89DB001A423ED003250969AD +:10D3C000236801985B1A029363695D43EB0F5D1953 +:10D3D000029B6D1001331B18AB4200D91D00530591 +:10D3E00010D52900380001F0F4FF061E14D0029A6F +:10D3F000216905F03BFDA289194B1340802213439C +:10D40000A38112E02A00380001F0EDFF061E0CD1C6 +:10D410002169380001F0E2FF0C23402201203B602B +:10D42000A38940421343A38117E0029B2661F618AB +:10D4300026606561019EED1AA560019BB34200D292 +:10D440001E0032000399206805F019FD0020A36832 +:10D450009B1BA36023689E19266005B0F0BDC046E3 +:10D460007FFBFFFFF0B59FB0029005938B890F0003 +:10D4700016001B0610D50B69002B0DD1402101F0C1 +:10D48000A8FF38603861002804D10C23029A0138C3 +:10D490001360D8E040237B61002306AD6B6120332D +:10D4A0006B761033AB7634002378002B03D1A31BAB +:10D4B000049312D003E0252BF9D00134F4E7A31B29 +:10D4C000320039000298FFF76BFF431C00D1B4E033 +:10D4D0006A69049B944663446B612378002B00D1F6 +:10D4E000ABE00122002352426A6002A95432521872 +:10D4F00001342B60EB60AB601370AB65534E217849 +:10D500000522300005F098FC002807D00123801B7D +:10D5100083402A68013413432B60EFE72B68DA0657 +:10D5200004D55322202102A8121811701A0704D51D +:10D5300053222B2102A81218117022782A2A03D014 +:10D54000099B00200A210EE0059A111D1268059121 +:10D55000002A01DB099204E05242EA6002221343EE +:10D560002B6001340BE02278303A092A04D84B436F +:10D5700001349B180120F6E7002800D00993237896 +:10D580002E2B1ED163782A2B0AD1059B02341A1D3B +:10D590001B680592002B01DA01235B42079310E020 +:10D5A00000230A201A0001346B60217830390929E0 +:10D5B00004D84243013452180123F6E7002B00D06F +:10D5C0000792234E21780322300005F035FC002815 +:10D5D00006D04023801B83402A68013413432B600C +:10D5E000217806221B48661C297605F025FC0028B8 +:10D5F00012D0194B002B06D10722059B073393430A +:10D600000833059314E005AB00933A00134B29004F +:10D61000029800E000BF07E005AB00933A000F4B13 +:10D620002900029800F01CF80390039B013304D0FA +:10D630006B69039A9B186B6135E7BB890B985B0696 +:10D6400001D5012040421FB0F0BDC0464951030042 +:10D650004F5103005351030000000000A1D302000A +:10D66000F0B58BB006920A004332079305900492FE +:10D670000A7E0C00109B6E2A00D1ABE011D8632A01 +:10D6800022D009D8002A00D1B5E0582A00D0C5E040 +:10D6900045310A70814A4FE0642A1DD0692A1BD0A7 +:10D6A000BCE0732A00D1AAE009D86F2A29D0702AD9 +:10D6B00000D0B3E0202209680A43226037E0752ACF +:10D6C0001FD0782A33D0A9E00E001A684236111D07 +:10D6D000196013683370A4E021681A68080606D43C +:10D6E000490604D5111D19600023D55E02E0111D05 +:10D6F00019601568002D3BDA2D23049A6D421370D2 +:10D7000036E021681A68080606D4490604D515686B +:10D71000111D1960ADB202E0111D196015685F4B53 +:10D72000227E039308276F2A1DD00A271BE02200C0 +:10D730007821453211705A4A19680392081D2268EF +:10D7400018600D68100602D4500600D5ADB2D3079C +:10D7500002D520231A4322601027002D03D1202355 +:10D7600022689A4322602300002243331A7002E0A9 +:10D770000A274A4B03936368A360002B09DB04224A +:10D78000216891432160002D05D1049E002B11D00A +:10D790007BE0002D79D0049E28003900F7F7ACFE1D +:10D7A000039B013E5B5C280033703900F7F71EFED7 +:10D7B000051EF1D1082F09D12368DB0706D5636860 +:10D7C0002269934202DC3023013E3370049B9B1B91 +:10D7D00023612BE009681A68080607D4490605D5B5 +:10D7E000111D19601368A28A1A8004E0111D1960C6 +:10D7F000136862691A600023049E236116E01A68A8 +:10D80000111D1960166800216268300005F014FBD4 +:10D81000002801D0801B6060636803E02600423668 +:10D820003270012323610023049A1370079B09AA15 +:10D8300000932100069B059805F090FB431C02D144 +:10D840000120404227E02369320006990598079D90 +:10D85000A847431CF4D0236800259B070FD4099BDD +:10D86000E068984217DA180015E022000123193207 +:10D8700006990598079EB047431CE1D00135E3683F +:10D88000099A9B1A9D42F0DBE9E72600039B42368A +:10D890001B7833708EE70BB0F0BDC0465A510300C1 +:10D8A0004445030058220120014B40421A60704752 +:10D8B000B429002058220120014B40421A607047D1 +:10D8C000B429002070470220704710B5406802F06C +:10D8D00041F810BD704713B50400406802F02CF801 +:10D8E000002811D061686846EEF7A6F8694601A8DD +:10D8F00001F0A5FF01A8EEF7AFF8606001A801F004 +:10D9000096FE684601F093FE13BD10B5EAF77AFC67 +:10D9100010BD052310B55943EAF786FC10BD13B5B9 +:10D920000400FFF7D8FF616801A8EEF785F801A8A9 +:10D9300001F0A1FE01A801F07AFE13BDF7B50700C2 +:10D9400015001E000C00FFF7C6FF796801A8EEF76E +:10D9500073F8F3B22AB221B201A8EEF785F801A854 +:10D9600001F065FEF7BD37B515000C00416801A850 +:10D97000EEF762F82AB221B201A8EEF78BF80400A4 +:10D9800001A801F054FEE043C01720403EBD4368AB +:10D990005888704743689888704710B55C1EA3414B +:10D9A0005B42DBB2FFF7CAFF10BD10B5FFF7DBFF2C +:10D9B000C317181AC00F10BD052310B55943EAF755 +:10D9C00047FC10BD10B50A0010230321ECF7ACFF93 +:10D9D00010BD70B504000D00EBF790FE002807D0D5 +:10D9E000F0F732F810232A0003212000ECF79CFF07 +:10D9F00070BD70B504000D00EBF780FE002807D065 +:10DA0000F0F722F810232A0002212000ECF78CFF07 +:10DA100070BD10B5EBF772FE031E04D0F0F714F8DA +:10DA2000431E9841C3B2180010BD10B5EDF752FF68 +:10DA300010BD10B5EDF75CFF10BD704780880A304F +:10DA40008010704770470630704780887047828822 +:10DA5000030000208A4201D3063358187047032080 +:10DA6000704740680B3080087047808870470123FA +:10DA7000820702D143425841C3B2180070470028C0 +:10DA80000BD043688B4201D0002B04D183689342B2 +:10DA900003D0002B01D00068F1E7704710B5EAF71A +:10DAA00015FF10BD07B5002201AB1A8001211870C7 +:10DAB0001800EAF70BFF0EBD030030B500208B42C3 +:10DAC00014D08D1D9A888988981D914200D9110023 +:10DAD0000022835CAC5CA34204D0A3429B410120A2 +:10DAE000184303E001328A42F3D9002030BD808818 +:10DAF0007047F7B5002821D000291FD087888E886D +:10DB0000002A1BDB9219974218D3851D2C008B1D10 +:10DB100001938B7900933B1BEB18B3420ED3237810 +:10DB2000009A934208D132000199200005F08FF944 +:10DB3000002801D1601B03E00134ECE701204042E2 +:10DB4000FEBD10B5FFF7D5FF0130431E984110BD53 +:10DB500043425841C0B2704710B5FAF701FCEBF7E9 +:10DB600005F810BD430010B55A10904202D10120B3 +:10DB7000184303E0FAF77AFBEAF7F8FF10BD030059 +:10DB800010B50E20002906DB9A88914203DA591855 +:10DB90008879FFF7E7FF10BD10B50E23002802D0EB +:10DBA000FFF7EDFF0300180010BD4223002800D14D +:10DBB000383B180070470023062806D0033342285C +:10DBC00003D0023B0A2800D003001800704710B5AC +:10DBD000EBF750F9EAF7CAFF10BD4843704710B59C +:10DBE000F7F78EFC10BD10B50C20ECF7D3FB041E2C +:10DBF00001D0ECF7FBF8200010BD0089704710B58C +:10DC0000043001F0DBF810BD10B50A000430818843 +:10DC1000ECF7D2F810BD10B5043001F0DAF810BD01 +:10DC200002890023914202D243688900CB58180030 +:10DC3000704710B50430ECF7BFF810BD10B50430D4 +:10DC400001F0D5F810BD10B5043001F0EEF810BDAC +:10DC5000704700207047406870474160704710B5BA +:10DC60000820ECF797FB041E01D0ECF7C9F8200060 +:10DC700010BD10B5ECF764FD10BD431E9841704710 +:10DC800010B51420ECF786FB041E01D0ECF7C0F8A9 +:10DC9000200010BD10B5040001F0E8F80023984200 +:10DCA00005DB228A904202D2E3688000C358180044 +:10DCB00010BDF8B504000F001600250001F0D6F8DD +:10DCC0000C35011E05DA2189201D3A00ECF774F8A5 +:10DCD000218A32002800ECF76FF8F8BD704710B5C4 +:10DCE000EBF7F4F910BD70B50D00EBF7EFF9040098 +:10DCF0002800EBF7EBF984402000FFF733FF70BDFD +:10DD000070B50D00EBF7E2F904002800EBF7DEF93F +:10DD100004412000FFF726FF70BD70B50D00EBF742 +:10DD2000D5F904002800EBF7D1F96040FFF71AFF9E +:10DD300070BD70B50D00EBF7C9F904002800EBF7D2 +:10DD4000C5F92043FFF70EFF70BD10B5EBF7BEF924 +:10DD5000C043FFF707FF10BD70B50D00EBF7B6F934 +:10DD600004002800EBF7B2F92040FFF7FBFE70BD7E +:10DD700070B50D00EBF7AAF904002800EBF7A6F93F +:10DD8000C4402000EAF7C0FF70BD10B5EBF77AF988 +:10DD9000FAF73AFB10BDD0B50C0001002143002377 +:10DDA000890720D1032A05D12100FFF785FE4342D0 +:10DDB000434117E0022A12D1EBF764F90600200074 +:10DDC0000F00EBF75FF902000B003000390001246F +:10DDD000F7F792FC002800D1041CE3B203E0031B18 +:10DDE00058424341DBB21800D0BD70B50E00EBF7CE +:10DDF00049F9040030000D00EBF744F902000B0074 +:10DE000020002900F8F7BEFCEAF7B0FE70BD70B53F +:10DE10000E00EBF737F9040030000D00EBF732F994 +:10DE200002000B0020002900F9F776FEEAF79EFEBB +:10DE300070BD0B000340D0B50C00DB070DD5C3133C +:10DE40000133012B09D8CB130133012B05D84C101A +:10DE500040106043FFF786FE0EE0EBF713F9060073 +:10DE600020000F00EBF70EF902000B003000390024 +:10DE7000F9F7D8FBEAF77AFED0BD70B50E00EBF7E4 +:10DE800001F9040030000D00EBF7FCF802000B0074 +:10DE900020002900F8F7A2FFEAF768FE70BDF8B588 +:10DEA00001230C00184211D019420FD04B100DD095 +:10DEB000EBF70CF905002000EBF708F9010028004A +:10DEC000F7F704FC0800FFF74DFE0EE0EBF7DAF879 +:10DED000060020000F00EBF7D5F802000B00300021 +:10DEE0003900FBF7C7FCEAF741FEF8BD70B50E003C +:10DEF000EBF7C8F8040030000D00EBF7E7F8290055 +:10DF000002002000F7F780FCEAF730FE70BD012325 +:10DF1000F7B50E00184201D0194236D1EBF7B2F82E +:10DF2000040030000D00EBF7ADF806000F00020012 +:10DF30000B0020002900F7F7F9FB002805D022008C +:10DF40002B0034003D0016001F0032003B00200073 +:10DF50002900F7F7D1FB002802D02000290011E0AA +:10DF6000EAF788FF2200009001912B003000390071 +:10DF7000F9F7D2FD009A019BF9F754FB22002B0020 +:10DF8000F8F700FCEAF7F2FD11E044104910A14255 +:10DF900009DB201E884203D0081BEAF7DDFC2018AD +:10DFA000FFF7E0FD03E023000C001900F1E7FEBDE0 +:10DFB00010B5EBF767F8FBF7C1FCEAF7D7FD10BD2A +:10DFC00010B5EBF75FF8FBF745FDEAF7CFFD10BDA5 +:10DFD00010B5EBF757F8FAF7F1FDEAF7C7FD10BDFA +:10DFE00010B5EBF74FF8FAF709FDEAF7BFFD10BDE2 +:10DFF00010B5EBF747F8FBF7A9F9EAF7B7FD10BD45 +:10E0000070B504000D000E2801D1002016E00E2985 +:10E01000FBD0012318008C4210D00B401C42F4D1DD +:10E020002000EBF707F806002800EBF703F886421C +:10E03000EBD1320029002000FFF7ADFE70BD10B516 +:10E04000FFF7DEFF4223002800D1383B180010BD47 +:10E0500010B5FFF7D5FF4223002800D0383B180049 +:10E0600010BDF7B504000D000E2801D1002051E0CD +:10E070000E29FBD0FFF79FFD06002800FFF79BFD50 +:10E0800001230190019A1800964243D02B401C4274 +:10E09000ECD12000EAF7CEFF009007002800EAF755 +:10E0A000C9FF0300032F01D1022803D0032815D193 +:10E0B000022F29D12000EAF7E5FF060028000F0013 +:10E0C000EAF7E0FF02000B00300039000124F7F707 +:10E0D00013FB002800D1041CE0B21BE0012F09D083 +:10E0E000012801D0019500E00223009A2600934206 +:10E0F000BCD103E0012809D102230093009A0199C1 +:10E100003000FFF748FE05E0012FEBD1022234007A +:10E110000092E7E7FEBD10B5FFF7A3FF10BD10B5F5 +:10E12000FFF79FFF4223002800D1383B180010BDA5 +:10E1300010B5FFF796FF4223002800D0383B1800A7 +:10E1400010BDF8B50F00002446680589AC420AD21C +:10E15000A3003900F058FFF784FF002801D0200009 +:10E1600003E00134F2E701204042F8BD10B500227F +:10E170000400FFF7E6FF01000020814203DB201DC1 +:10E1800000F035FE012010BD10B50123422805D056 +:10E1900000230A2802D0EBF70FF80300180010BD87 +:10E1A000F8B504000E000E2801D102202FE00E2940 +:10E1B000FBD0EAF73FFF05003000EAF73BFF032DF5 +:10E1C00006D1032804D131002000FFF775FC33E0AD +:10E1D0000020B44230D02000EAF754FF04003000A1 +:10E1E0000D00EAF74FFF220006000F002B00200071 +:10E1F0002900F9F7E5FF0028D7D132003B003000B5 +:10E200003900F9F7DDFF002803D0CEE701204042B6 +:10E2100012E032003B0020002900F7F773FA0028D3 +:10E22000F4D13B00320020002900F7F77FFA431EAB +:10E230009841012340421840F8BD10B501230C005D +:10E240001C40044004D0884200DB0023D8B206E022 +:10E25000FFF7A6FF030020009A1C00D0D80F10BDC6 +:10E260000B00034010B5DB0703D5884205DC4220D4 +:10E2700008E0FFF795FF831C01D10A2002E0002887 +:10E28000FBDCF4E710BD0B00034010B5DB0703D542 +:10E29000884205DA422008E0FFF782FF831C01D1A3 +:10E2A0000A2002E00028FBDAF4E710BD0B0003406F +:10E2B00010B5DB0703D5884205DB422004E0FFF7F9 +:10E2C0006FFF0028F9DA0A2010BD0B00034010B5DB +:10E2D000DB0703D5884205DD422004E0FFF760FF3D +:10E2E0000028F9DC0A2010BDE42010B58000ECF70E +:10E2F00027FA10BD70B50E00EAF7C4FE0400300026 +:10E300000D00EAF7BFFE02000B0020002900FBF71A +:10E3100057F9EAF72BFC70BD10B5EAF7B3FEFAF730 +:10E320006DFFEAF723FC10BD10B5EAF7ABFEFAF774 +:10E330001DFFEAF71BFC10BD10B5EAF7A3FEFAF7C4 +:10E34000F3FBEAF713FC10BD10B5EAF79BFEFAF7F2 +:10E35000B7F9EAF70BFC10BD10B5EAF793FEFBF72F +:10E36000D5F8EAF703FC10BD10B5EAF78BFEFBF712 +:10E370001BF8EAF7FBFB10BD10B5EAF783FEFBF7CD +:10E3800063FCEAF7F3FB10BD10B5029C94421FDB5F +:10E39000002B09D00B0080185C1A94421BDA1C7801 +:10E3A000013804700133F7E7042A06D10323034040 +:10E3B0000BD10A68026018000EE0022A05D1012381 +:10E3C000034002D10A88028005E004F04FFD02E01C +:10E3D0000120404200E0002010BD10B504000800FC +:10E3E0000299914205DA002104F05EFD01204042CD +:10E3F00020E0002B09D00300A418191A914218DA62 +:10E40000013C217819700133F7E7042A05D1032371 +:10E4100023400BD12268026006E0022A06D10123C4 +:10E42000234003D122880280180003E0210004F079 +:10E430001DFD002010BD08307047031E07D00023CB +:10E44000994204DB4268914201DA41180B7A1800C4 +:10E450007047002806D0002904DB4368994201DA9E +:10E4600041180A72704710B5FFF7E7FF10BD10B5ED +:10E47000FFF7EFFF10BD70B50C001600002B1CDB82 +:10E4800000291ADB41688C4217DC5268091BD21A3A +:10E490008A4200DD0A00002A0FDB3500083586427B +:10E4A00004D1E918281904F0EAFC04E00830001946 +:10E4B000E91804F0DBFC002001E00120404270BDBF +:10E4C0004068704710B5002A0EDB4468A2420BDC9E +:10E4D000002B00DA2300A41A9C4200DD1C00083047 +:10E4E0008018220004F0E0FC10BD436810B51C1E2B +:10E4F0008C4200DD0C00002A00DA1A00191B914240 +:10E5000000DD110008300019EAF702FA10BD70B5FD +:10E510000D00002B01DA43689B1A002A2EDB4468A9 +:10E520009918A1422ADC8A4228DC002B26D06900F7 +:10E5300024D059428D4201DDAB4206DC002201238A +:10E5400011005B42FFF7BEFF18E008308618002D6F +:10E5500009DA6C425A193100301904F090FC22009B +:10E560000021300008E05C1B71192200300004F02B +:10E5700086FC2A000021301904F096FC70BD0300CF +:10E5800010B508305968FFF789FA10BD70B504005E +:10E59000160008001D1E01DA63689D1A002E2BDB91 +:10E5A0006268AB19934227DC9E4225DC002D23D004 +:10E5B000430021D0002801DA2B02C0182900F7F708 +:10E5C00085F8002900DA49192200083292195118F9 +:10E5D0000B0055199A420FD014781E780132501E44 +:10E5E0000670581C1C70854202D108000300F1E738 +:10E5F0009142FBD10100F9E770BD012307B55B42F1 +:10E6000000930023FFF737FF07BD10B5010000207E +:10E61000EAF77EF910BD10B581880630EAF778F97F +:10E6200010BD30B50400501E85B00D000F2869D80C +:10E63000F6F7D2FE080C14141C25252E2E37203B8D +:10E64000404F475C1800FFF74AFB03E01800FFF754 +:10E6500046FBC0B2002D55DD207053E01800FFF7D7 +:10E660003EFB02A908800023009518E01800FFF780 +:10E6700036FB02E01800EAF729FD02901EE01800C0 +:10E68000FFF72DFB012302A908701A00009536E060 +:10E690001800FFF724FB012302A90880009502223D +:10E6A0002DE01800FFF71BFB02E01800EAF70EFD53 +:10E6B00002900AE01800FFF768FB02900095002323 +:10E6C00005E01800FFF761FB02900123009504228A +:10E6D00014E01800EAF7D6FC02900391072D11DD33 +:10E6E000082202A9200004F0C1FB0BE01800EAF7A1 +:10E6F000C9FC0123082202900391009502A9200081 +:10E70000FFF742FE05B030BD10B50C00002A06DB55 +:10E7100041680830891A80182200FFF782FF10BD77 +:10E7200030B5013A050085B000200F2A68D81000E6 +:10E7300002AC0091F6F750FE080B1517191D26299B +:10E74000323A1B424C584E5A0023012213E0002358 +:10E75000012221002800FFF740FE2078FFF702FA8F +:10E760004EE0002312E0002319E000231FE0002305 +:10E7700025E001231A0021002800FFF72EFE0020CB +:10E780002056EBE701231A00E3E7012302222100D0 +:10E790002800FFF722FE0023E05EDFE701230222CC +:10E7A00021002800FFF719FE2088D7E70123042263 +:10E7B00021002800FFF711FE0298CFE70123042271 +:10E7C00021002800FFF709FE0298EAF79DFA17E0FA +:10E7D000002300E00123042221002800FFF7FDFDB3 +:10E7E0000298FFF7B9F90BE0002300E001232100B4 +:10E7F00008222800FFF7F1FD02980399EAF7B6F91D +:10E8000005B030BD10B5002A03DA0020FFF7AAF9E1 +:10E8100007E0436808309B1A80180A001900FFF7C8 +:10E820007FFF10BD704710B5040004F0FAFA200015 +:10E8300010BD10B50400EAF74DFE002807D11023E3 +:10E84000220001211D30ECF76FF8EAF781FE10BDC0 +:10E8500010B5EAF753FF10BD10B5EAF74FFF0028D7 +:10E8600001D0EFF773F810BD10B50C00EAF746FFC2 +:10E87000002802D02100EFF733F810BD10B5EAF7F9 +:10E880003DFF002801D0EFF7BFF810BD10B50C0018 +:10E89000EAF734FF002802D02100EFF78FF810BD0F +:10E8A00010B50C00EAF72AFF002802D02100EFF78C +:10E8B00043F910BD70B504000D001600EAF71EFF05 +:10E8C000002808D00221EFF799F91023320029001F +:10E8D0002000ECF729F870BDF0B585B00C001500EC +:10E8E000EAF70CFF061E01D1002030E0EDF700F83A +:10E8F00000900191043C67426741EC173000EFF74C +:10E9000025F8B8420BD0ECF7F3FF009A019B801A70 +:10E910009941A142E8D8F1D18542EFD2E4E7ECF782 +:10E92000E7FF03903000EFF711F8B8420BD1ECF796 +:10E93000DFFF009A019B801A9941A142D4D8F1D1FE +:10E940008542EFD2D0E7ECF7D3FF039BC01A05B0A6 +:10E95000F0BD10B50C00EAF7D1FE002802D021006E +:10E96000EFF796F810BD10B50124002903D002344A +:10E97000012900D00024EAF7C1FE002802D02100BE +:10E98000EFF7E6F810BD10B50C00EAF7B7FE21006E +:10E99000EFF734F910BD10B501000020E9F7B8FF1A +:10E9A00010BD10B50400EAF723FF036821001B68BF +:10E9B000984710BD10B50400EAF71AFF2100F5F7DB +:10E9C00097FB10BD70B50D000400EAF711FF2A0097 +:10E9D0002100F5F781FB70BD10B5EBF76FFA002051 +:10E9E00010BD70B504000D001822002104F05CFA7F +:10E9F0002900200004F070F8200070BD70B50400FC +:10EA00000E001500090AC9B2EAF766FFF1B220004C +:10EA1000EAF762FF290A2000C9B2EAF773FFE9B2F8 +:10EA20002000EAF76FFF70BD10B50400FE21EAF781 +:10EA300053FFFE212000EAF74FFFEF212000EAF705 +:10EA40004BFFB3212000EAF747FF03212000EAF73C +:10EA500059FFB6212000EAF73FFF01212000EAF725 +:10EA600051FFA3212000EAF737FF11212000EAF728 +:10EA700049FF21212000EAF72FFF36212000EAF785 +:10EA80002BFFD0212000EAF73DFF3A212000EAF7D2 +:10EA900023FF05212000EAF735FFB4212000EAF723 +:10EAA0001BFF21212000EAF72DFFF0212000EAF7CB +:10EAB00013FF31212000EAF725FF26212000EAF785 +:10EAC00021FF28212000EAF71DFF00212000EAF79E +:10EAD00019FF2C212000EAF715FF0C212000EAF78E +:10EAE00011FF0C212000EAF70DFF15212000EAF7A5 +:10EAF00009FF15212000EAF705FF0F212000EAF7A2 +:10EB000001FFF1212000EAF7E7FE0E212000EAF7DD +:10EB1000F9FE12212000EAF7F5FE13212000EAF7A2 +:10EB2000F1FE00212000EAF7EDFE0A212000EAF7BD +:10EB3000E9FE0D212000EAF7E5FE0D212000EAF7AD +:10EB4000E1FE14212000EAF7DDFE13212000EAF7A0 +:10EB5000D9FE0F212000EAF7D5FEFE212000EAF7BA +:10EB6000BBFEFF212000EAF7B7FE11212000EAF7E3 +:10EB7000B3FE29212000EAF7AFFE10BDF8B50F0063 +:10EB800004001E0015002A21EAF7A6FE390A20001B +:10EB9000C9B2EAF7B7FEF9B22000EAF7B3FE310ACC +:10EBA0002000013EC9B2EAF7ADFEF1B22000EAF75B +:10EBB000A9FE20002B21EAF78FFE290A2000C9B206 +:10EBC000EAF7A0FEE9B22000EAF79CFE069B2000CF +:10EBD000190AC9B2EAF796FE069B20005D1EE9B24B +:10EBE000EAF790FE2C212000EAF776FEF8BD37B553 +:10EBF00004001D00501C4B1C00902000FFF7BEFFBE +:10EC0000290A2000C9B2EAF77DFEE9B22000EAF73E +:10EC100079FE29212000EAF75FFE37BDF0B5170025 +:10EC200085B00A9C0290019103930D1B019BE31A8E +:10EC30005B199C420EDD3E1BE31B9B199C4207DDCA +:10EC40003200039B29000298FFF7D1FF0136F3E75A +:10EC50000135EBE705B0F0BD70477047704770476E +:10EC6000704710B5EAF70EFAFAF774FAE9F77EFF83 +:10EC700010BD10B5EAF706FAFAF77AFDE9F776FF64 +:10EC800010BD10B5EAF7FEF9FAF7E4FAE9F76EFFFE +:10EC900010BD10B5EAF7F6F9FAF762FFE9F766FF7B +:10ECA00010BD10B5EAF7EEF9FAF700FDE9F75EFFDF +:10ECB00010BD10B5EAF7E6F9FAF786FCE9F756FF5A +:10ECC00010BD10B5EAF7DEF9F9F754FCE9F74EFF8D +:10ECD00010BD10B5EAF7D6F9FAF7C0FBE9F746FF21 +:10ECE00010BD0323020003400020834208D182426A +:10ECF00006D0106801229043C278F92A00D018008B +:10ED000070470023438103814360704700234381A0 +:10ED10000381436043820382C3607047704770473A +:10ED200070477047704770470123026810B59A43D7 +:10ED300013005B8A128A1B041343984710BD10B559 +:10ED4000FFF7F2FF10BD704783880200181E08D03D +:10ED5000013B9BB2938012689B00D3180022186875 +:10ED60001A607047F8B5C688050030000F00EAF752 +:10ED700073FF041C80B2B84200D23C1CA4B2A6426D +:10ED800014D2A00000F013F9EA880600002A03D08C +:10ED90009200296804F06AF8E8880021221A8000AD +:10EDA0009200301804F080F82E60EC80F8BDC38823 +:10EDB00010B58B4201D8FFF7D5FF10BDC38870B5E1 +:10EDC00004000D008B4202D28188FFF7F0FFA5807E +:10EDD00070BD83880200181E08D0013B9BB293804F +:10EDE00012689B00D318002218681A607047F8B5A3 +:10EDF0008388040000208B4216D927688E00B8193A +:10EE00004A1C0568934206D9013B5A1A311D9200EB +:10EE1000791804F034F800212800A3882268013B07 +:10EE20009BB2A3809B009950F8BDF8B50D00818876 +:10EE300004001600A94214D9013189B2FFF7B7FFC7 +:10EE4000A288681C23688000071F521BD919181854 +:10EE5000920004F014F82368DE51A3880133A380E4 +:10EE600002E02900EAF7A8FFF8BD7047F7B5068968 +:10EE700047680020B04205D28300FB588B421AD06D +:10EE80000130F7E700248B1D8D880193B4420CD22A +:10EE9000A300F9588B889D420AD106312A000198B7 +:10EEA00003F0D5FF002803D104E00120404202E036 +:10EEB0000134EBE72000FEBD704710B5EBF740FCD6 +:10EEC00010BD10B5FFF70DFF002804D000890638EB +:10EED00043425841C0B210BD10B5EBF759FC10BD0C +:10EEE00010B500F092F910BD10B503F062FE10BD30 +:10EEF0001FB5D3B28AB281B2684600F075FB05B087 +:10EF000000BD10B5002B00D11033EBF70DFD10BD87 +:10EF100010B5EBF741FF01214942FEF7BFFD10BDDF +:10EF200010B500F06EF910BD704710B5002803D081 +:10EF30008188063000F0D2F810BD0123820705D188 +:10EF4000002803D0000F43425841C3B21800704755 +:10EF500010B50A008188EAF71BFF10BD0122036883 +:10EF6000934318888010704770B504680500002C22 +:10EF700006D02000EBF766F8A9882000EBF79EF892 +:10EF800070BD10B5002811D0C468002C09D02368CA +:10EF9000436063688360A368C3602000EBF7E6F911 +:10EFA00004E0EBF7E3F92000EBF726FC10BD0323A8 +:10EFB0000330984310B5041D2000EBF7EBF98023D4 +:10EFC000DB051C4310C010BD10B5031E08D0FFF7B1 +:10EFD000EEFF8023021F11689B050B4313600300A3 +:10EFE000180010BD10B50400FFF7A7FF002802D1DC +:10EFF0002000EAF7D3FF10BD10B50430FFF7B4FFCF +:10F0000010BD10B581880C30EBF758F810BD10B565 +:10F010004068EBF72FF810BD10B504000430FFF77F +:10F02000A3FF20000C30FFF79FFF10BD012210B599 +:10F0300008C89343198804398908EBF73FF810BDD5 +:10F0400003207047808880000F30800870470220BE +:10F0500070470520704710B5EBF78AFB10BD10B55F +:10F06000ECF740FA10BD7047704770477047704723 +:10F07000704710B5040003F0D4FE200010BD10B599 +:10F08000040003F0CEFE200010BD10B5040003F014 +:10F09000C8FE200010BD10B5040003F0C2FE200021 +:10F0A00010BD10B5FFF79EFFECF77EFA10BD10B54E +:10F0B00004002000EBF7F6FA1420ECF713FAF8E757 +:10F0C00010B50400EBF730FB200003F0AAFE20008F +:10F0D00010BD704710B5ECF767FA10BD10B5EBF72F +:10F0E00017FB10BD10B518C96210E10701D5815892 +:10F0F000CB588018984710BD70B5DD24A4000500DA +:10F100000059002804D002F00CFB836D9B0702D449 +:10F1100000F07BF870BD2859F1F7FAFF036813215E +:10F120005B6A9847642003F04FFDF1E782B030B589 +:10F1300085B008920500082202A8099303F096FE04 +:10F14000039B029C5810DB0701D52B581C592D1826 +:10F150000AA90822684603F089FE089A099B28003C +:10F16000A04705B030BC08BC02B0184782B01FB53C +:10F17000040006920793120C1A2A14D00AD8042A03 +:10F1800023D0052A27D1E6235B00C15801A800F04F +:10F1900083FD20E01B2A18D01C2A1CD1E130FF304F +:10F1A000EFF7F6FC17E06930FF30002100F0DCFCDF +:10F1B00020009130FF30002100F0D6FC2000B93053 +:10F1C000FF30012101F0DDFC05E0E4235B00E158A4 +:10F1D00001A800F081FC1FBC08BC02B018473ADF50 +:10F1E000704712DF704713B56B46DC1D002320000B +:10F1F0002370FFF7F6FF2078013843425841C0B230 +:10F2000016BD80235B05586E704710B5EBF7B8FD4F +:10F2100010B58368984710BD704770B506000D00A3 +:10F22000141E11D0936D002B02D01E20EBF7EEFDC3 +:10F230002B683268002A02D0111D31601460646DA1 +:10F240000133002CF5D12B6070BD10B5040003F024 +:10F25000E8FD200010BD72B601650B68002B03D1DC +:10F2600043658365086007E05A6D002A01D01300EA +:10F27000FAE758658365426562B67047036D002BF7 +:10F2800012D072B6826D436D002A01D0536501E041 +:10F29000026D1360436D002B01D0826D9A650023CF +:10F2A00043658365036562B6704770B504000E0060 +:10F2B0001500EBF7CFFF002805D00123320029000D +:10F2C0002000ECF723F870BD10B5ECF729F9041E07 +:10F2D00001D1ECF79DF8200010BD10B50C0080475F +:10F2E000A047ECF761F910BD10B5EBF7B3FF0028AC +:10F2F00001D0ECF759F910BD70B5140003001000EF +:10F300000D0098472000A8472000FFF7EDFF70BDD3 +:10F3100010B5ECF767F8ECF77BF8FAE70300F0B507 +:10F320008208980702D1181E01D137E00132541C1F +:10F3300072B6802621C93606A84217D20368002B70 +:10F3400011DA5B005B08990041180F68002F08DA9A +:10F35000A94206D231007F007F08DB191943016002 +:10F36000F1E7A34205D29B00C018E5E762B6002092 +:10F3700014E00232934203D992008218954204D8D5 +:10F3800003685B005B08036006E080211B1B090625 +:10F39000043A0B431360046062B60430F0BD70B5EC +:10F3A000040008000E00ECF7AFF90500002C0ED0A9 +:10F3B00000280CD0231F1A689200B24200DD3200F0 +:10F3C0002100280003F052FD2000ECF7D3F92800BB +:10F3D00070BD10B50800ECF797F910BD10B5080026 +:10F3E000ECF7C8F910BD10B508001100FFF7D7FF02 +:10F3F00010BDF7B51D0008AB1B88040010301600C7 +:10F400000F00019300F0E5F86A46002392882780F8 +:10F410006680A5602000E360A28063622362FEBD77 +:10F4200010B5838804009B0702D5806803F0F9FCBF +:10F43000200010BD82B030B5046A87B00B93050080 +:10F440000A920123002C14D110220AA902A803F069 +:10F450000DFD182003F0D3FC0400082204A968461F +:10F4600003F004FD029A039B200000F0CDF82C620B +:10F470001BE02269002A02D001331400F9E7092BAE +:10F4800013DC10220AA902A803F0F0FC182003F0F4 +:10F49000B6FC0500082204A9684603F0E7FC029ABE +:10F4A000039B280000F0B0F8256107B030BC08BC11 +:10F4B00002B0184710B50400006800F04BFA2000B5 +:10F4C00010BD70B5060008000D0003F02DFD04000E +:10F4D0000530ECF719F9306000F02BFA306829009C +:10F4E0004480621C043003F0C1FC70BD1FB50400F1 +:10F4F000080001A9EBF710FC200001A9FFF7E1FFCC +:10F50000200004B010BDF8B50B68170002241C5F82 +:10F510001368050002229B5E0E00E418601DECF7E4 +:10F52000F3F8286000F005FA286831684480022367 +:10F53000CA5E0430043103F099FC2B683968181D49 +:10F54000336802229B5EC0180223CA5E043103F0B6 +:10F550008DFC2B6828001C1900232371F8BD10B501 +:10F5600004000868206000F0EBF9200010BD70B5C1 +:10F570000B68040000680D00984205D000F0EAF91D +:10F580002868206000F0DCF9200070BD70B51368B9 +:10F5900004005D880868002D01D1206004E04088E7 +:10F5A000002804D11800236000F0CAF902E020000E +:10F5B000FFF7A9FF200070BD0023994207DB026816 +:10F5C0000223D05E0023884201DD51180B79180018 +:10F5D0007047002310B5038043800400ECF788F9DE +:10F5E000A060E160200010BD70B501804280040081 +:10F5F0001D00ECF77DF9A060E160002D02D0200035 +:10F60000ECF700FA200070BD82B010B5040003933F +:10F610000292FFF7DEFF102202A9200003F026FC71 +:10F6200000232000236110BC08BC02B0184710B5AD +:10F630000400006800F08EF9200010BD10B50A002B +:10F64000002103F031FC10BD10B5040008682060F3 +:10F6500000F076F9200010BD70B50B68040000685A +:10F660000D00984205D000F075F92868206000F080 +:10F6700067F9200070BD10B50068418883880630A6 +:10F680005943FFF7DBFF10BD10B504000023ECF772 +:10F6900047FA200010BD10B50400ECF741FA200035 +:10F6A00010BDF0B587B004910CA909780700059149 +:10F6B000016800200391498801918A4277DA039911 +:10F6C00089888B4273DA049C2468A44664881519DF +:10F6D000029485426BDD6446A4881E19864266DD6D +:10F6E000002A03DA00952800019D03E00198029D9D +:10F6F000801A0090A84200DD0095002B03DA8E42AC +:10F7000005DD0E0003E0CE1AA64200DD26006046AD +:10F710000024D117554206302940A34202DA029C48 +:10F7200064425C43641804190398111C0630002AD3 +:10F7300000DA0021002509B2AB4201DD019D5D43E5 +:10F74000059B69184518002B27D000221000B242F3 +:10F750002DDA002300998B4206DAE15C002901D002 +:10F76000E95401300133F5E7049B01321B68019332 +:10F770005B88E4183B685B88ED18E8E72100280007 +:10F78000009A03F073FB049B1B6802935B88E418E8 +:10F790003B685B88ED18019B01330193019BB342E9 +:10F7A000ECDBF043009BC01730404343180007B028 +:10F7B000F0BDF0B587B000AF09687B613B6BB86006 +:10F7C0003961D418786B7B6949881B188C4201DA3F +:10F7D000002C00DC0C0038698688B34202DA002B6A +:10F7E00000DD1E003300684663430733DB08DB009F +:10F7F000C31A9D4678697B6041433B69891806338B +:10F800005D186B46FB607B699E420EDD290022007D +:10F81000F86803F02BFB3B695B88ED18FB689B19CC +:10F82000FB607B6901337B61EDE7B86832B221B2DE +:10F830007B68ECF775F9BD46B86807B0F0BD10B548 +:10F840000400096804200A5E8B1D0220095E200066 +:10F85000ECF766F9200010BD10B50400006800F058 +:10F8600079F8200010BD10B504000868206000F091 +:10F8700067F8200010BDF8B5D443E4171440070022 +:10F8800020000C301E000D00EBF73EFF386000F04A +:10F8900050F83B681C7238684660002D04D009306F +:10F8A0002200290003F0E2FAF8BD002310B504009D +:10F8B0001A001900FFF7DFFF200010BD002310B56C +:10F8C00004000A001900FFF7D6FF200010BD10B594 +:10F8D0000400FFF7D0FF200010BD70B50B680400D6 +:10F8E00000680D00984205D000F034F828682060C8 +:10F8F00000F026F8200070BD0368096810B50120EB +:10F900008B420CD01C7A0A7A0020A24207D109331C +:10F910001800093103F09BFA43425841C0B210BDB0 +:10F920000068093070470368187A704703685868A0 +:10F93000704703230380704710B5ECF703FA10BD3E +:10F9400010B50400ECF7FEF9002802D12388023339 +:10F95000238010BD10B50400ECF7F4F9002809D19C +:10F960002388023B9BB2012B01D0238002E02000C0 +:10F97000EBF700FF10BD036870B5040001811B6A3E +:10F980009847236805005B6920009847208128007C +:10F9900070BD00897047036870B5040081721B6AEE +:10F9A000984723680500DB6920009847A07228006B +:10F9B00070BD807A7047704710B5040003F031FACB +:10F9C000200010BD0C300EC80800524348435B4372 +:10F9D0008018C01870477FB50400FFF7F3FF2500BB +:10F9E0009023060031351B0498422AD9638F002BDF +:10F9F00007D1013308221B216846FFF7F5FD0123DB +:10FA0000638790239B049E4219D9A38F002B07D1B3 +:10FA1000013309221B216846FFF7E6FD0123A38776 +:10FA20008023DB049E420AD9E38F002B07D10133E8 +:10FA30000A221B216846FFF7D7FD0123E387002335 +:10FA40002B702B78042B02D801332B7003E000239A +:10FA5000E387A38763872000ECF76EFA021E0B2A68 +:10FA600013D02300A18E3033814204D11A78042AA6 +:10FA700004D8013201E00022A0861A70A28E618EA5 +:10FA8000914208D01B78042B05D9628601231B21E3 +:10FA90006846FFF7A9FD7FBD30B50400036A8BB04F +:10FAA000009302AD416A8269C369280001F000FE3B +:10FAB00023000C3307CD07C30222A3792000934310 +:10FAC000A371FFF788FF0123A1881A0006A8FFF79A +:10FAD0008BFD00200BB030BD70B50C0005000B682D +:10FAE00008005B6A984721002B000C3115C915C32B +:10FAF000280070BD10B5040003685B6A9847E06891 +:10FB000010BD10B5040003685B6A9847206910BDFA +:10FB100010B5040003685B6A9847606910BD10B5B2 +:10FB2000040003685B6A9847A3799B0702D420000E +:10FB3000ECF7CAFAA06A10BD10B5040003685B6A4E +:10FB40009847A3799B0702D42000ECF7BDFAE06A3E +:10FB500010BD408E704710B50400ECF759FB200033 +:10FB600003F05FF9200010BD0630C1777047012314 +:10FB7000807918407047036870B5040001811B69E3 +:10FB80009847236805009B6920009847208128003A +:10FB900070BD00897047704710B5040003F041F94B +:10FBA000200010BD30B50400436BC26801699A1A89 +:10FBB00083698BB05A43836B92125B1AC1694263AB +:10FBC0004B439B128363C16B406902AD091A206AE3 +:10FBD00041438912E16300912800216C01F068FD26 +:10FBE0002300283307CD07C30123A1881A0006A8E4 +:10FBF000FFF7FAFC00200BB030BD002310B5837175 +:10FC0000643303810368040081801B6998470222E2 +:10FC1000A3799343013A1343A37110BD84B030B567 +:10FC2000069303000491059204AC0C3326CC26C342 +:10FC300026CC26C322681A6002228379134383717B +:10FC400030BC08BC04B018470223807918407047C4 +:10FC500080220023D2008261C26102620222C3605C +:10FC600003614361436283799343837170474164C5 +:10FC7000704773B50C00050016000B680800DB69BF +:10FC80009847E36B280001960093626BA36B216C8D +:10FC900001F0CFFC280076BD70B50C0005000B68A4 +:10FCA0000800DB69984721002B00283115C915C3CE +:10FCB000280070BDF0B587B0010003A8FFF7ECFF86 +:10FCC0000398F8F7D3FA040004980D00F8F7CEFA79 +:10FCD000060005980F00F8F7C9FA2200009001917C +:10FCE0002B0020002900F7F79DFC320004000D00D6 +:10FCF0003B0030003900F7F795FC02000B002000B4 +:10FD00002900F6F73FFD009A019B04000D0010004A +:10FD10001900F7F787FC02000B0020002900F6F716 +:10FD200031FDF9F791FFF8F76BFA07B0F0BD10B5A8 +:10FD300004000368DB699847A06A10BD10B5040091 +:10FD40000368DB699847E06A10BD10B504000368DA +:10FD5000DB699847206B10BD82B030B585B0089242 +:10FD60000500082202A8099303F080F8039B029C77 +:10FD70005810DB0701D52B581C592D180AA9082249 +:10FD8000684603F073F8089A099B2800A04705B05D +:10FD900030BC08BC02B01847F8B50A6803680E000A +:10FDA0000700981AF6F768FC72687B68051C981AB9 +:10FDB000F6F762FCBB68041CB068181AF6F75CFC26 +:10FDC000291C061C281CF6F79BF9211C051C201C6D +:10FDD000F6F796F9011C281CF5F752FE311C041C9D +:10FDE000301CF6F78DF9011C201CF5F749FEF8BD13 +:10FDF000F0B585B0019002910392FFF7CDFF012786 +:10FE0000041C061C039B9F4217DA0C217943029BBA +:10FE100001985918FFF7C0FF051C011C201CF5F7BD +:10FE2000BFFC002800D02C1C291C301CF5F7A4FCBA +:10FE3000002800D02E1C0137E4E7211C301CF6F707 +:10FE400073FA05B0F0BDF0B58BB009938023DB00E9 +:10FE50000025C36003614361002304000C27079160 +:10FE6000089205604560856085610293119B9D4203 +:10FE700018DA39006943109B07A85918FFF78CFF5F +:10FE8000F8F76EFAF9F7E0FEF8F7BAF9F6F7F4FBCF +:10FE9000061C011C0298F5F76FFC002800D00296A2 +:10FEA0000135E3E700260023109D05930196009697 +:10FEB000371C059B119A93425EDA290007A8FFF7C9 +:10FEC0006BFFF8F74DFAF9F7BFFEF8F79DFA011C42 +:10FED00003900298F5F74AFFFE218905F6F724FA08 +:10FEE0000490381CF6F7A6FB07000498F6F7A2FB6F +:10FEF000874200DA07003800F6F7BEFB2B68079A46 +:10FF0000071C981AF6F7B8FB0399F5F72FFF400086 +:10FF100004994008F6F7F4F8011C0098F5F7B0FDD5 +:10FF2000089B00900693069A6B68981AF6F7A4FB54 +:10FF30000399F5F71BFF400004994008F6F7E0F835 +:10FF4000011C0198F5F79CFDAB68019009980C35F0 +:10FF5000181AF6F791FB0399F5F708FF400004998A +:10FF60004008F6F7CDF8011C301CF5F789FD059B1C +:10FF7000061C013305939CE70099081CF6F7C0F8AE +:10FF80000199051C081CF6F7BBF8011C281CF5F7A5 +:10FF900077FD311C051C301CF6F7B2F8011C281C3B +:10FFA000F5F76EFDF8F7DCF9F9F74EFEF8F72CFAE5 +:10FFB000051C011C0098F5F7D9FE391CF6F7A0F8CE +:10FFC000FE218905F5F75CFD8921C905F6F798F84A +:10FFD000F6F730FB291CE0600198F5F7C7FE391CE5 +:10FFE000F6F78EF8FE218905F5F74AFD8921C90546 +:10FFF000F6F786F8F6F71EFB291C2061301CF5F792 +:020000040003F7 +:10000000B5FE391CF6F77CF8FE218905F5F738FDB9 +:100010008921C905F6F774F8F6F70CFB079B6061B8 +:100020002360089B029800936360099BA360F6F726 +:1000300001FBA06120000BB0F0BDF0B5002504006D +:1000400017000B002E0028002A0091B00791BA4239 +:1000500008DA1968013240185968761899680C3323 +:100060006D18F4E73900F5F74BFA390020603000DD +:10007000F5F746FA390060602800F5F741FA3A00D2 +:10008000A06007992000FFF7B3FE00260DAB089093 +:10009000069605960393C8235B420493C8235B42EC +:1000A0000293C8235B4201932200039B23CA23C30C +:1000B0002268049B9446039A6344136062681D009F +:1000C0009446029B039A63445360A2680993944642 +:1000D000019B039A6344936007993A0003980A933B +:1000E000FFF786FE0B90011C0898F5F759FB0028D6 +:1000F00005D0099B0A9E06930B9B05950893019BCF +:10010000C83301931A00C8235B009A42CCD1029BEA +:10011000C83302939342C4D1049B029AC833049318 +:100120009342BBD1059B2268934206D16368069A2D +:10013000934202D1A368B34205D0059BA660236019 +:10014000069B6360A7E7200011B0F0BD70B5040006 +:100150000D00160086B003A8FFF76FFF2000019680 +:1001600000950399049A059BFFF76DFE200006B0E9 +:1001700070BD10B518C96210E10701D58158CB5880 +:100180008018984710BD10B50021406C02F091FD19 +:1001900010BD10B50400ECF749FD200002F041FE4F +:1001A000200010BD10B50400ECF732FD200002F075 +:1001B00038FE200010BD70B5050004007435012123 +:1001C0002800EBF76FFD2200563213780133DBB2C3 +:1001D0001370E17901318B4225D100232600137081 +:1001E000226D54360221525E33882021934205DA73 +:1001F000200019B25030FFF7DFF90100E279002347 +:100200002800EBF705FD226D33880221525E9342F0 +:1002100007DD2300002248331A702000ECF710FE9F +:1002200001E00133338070BD70B505000600826DBA +:100230005C350221525E2B880400743620219342E3 +:1002400004DA19B25830FFF7B7F901000023300083 +:100250001A00EBF7DDFCA26D2B880221525E93425F +:1002600007DD2300002248331A702000ECF7E8FD78 +:1002700001E001332B8070BD73B50400060025003A +:10028000743630006435FFF7F6F90023EA5E21008A +:100290000023603100933000FFF703FA002804D1F7 +:1002A00023006C331B78002B04D1230066331B78AA +:1002B000002B07D12300002248331A702000ECF7EE +:1002C000BFFD06E02A885BB29B182B8001236C34AB +:1002D000237073BDF0B506000021050004006636EA +:1002E000006E7156408864350023EA5E4B1D1B1A70 +:1002F000200085B06C3003909A4202DC0378002B1A +:1003000024D127007437002A04DD494209B238009D +:10031000EBF7C8FC0023EA5E210000236031009364 +:100320003800FFF7BEF90023F356002B05D1220059 +:10033000483213702000ECF783FD0123039A1370F9 +:1003400000222B88B256D3182B800DE025004835AB +:100350002B78062B03D120007430FFF78CF9002393 +:1003600020002B70ECF76CFD05B0F0BD70B50500FA +:1003700048352B780400002B33D0EBF771FA2300BB +:100380004C331A881018220080B218804A32128822 +:10039000824226D800221A802B78022B02D120001C +:1003A000FFF709FF2B78032B02D12000FFF73CFF5A +:1003B0002B78042B02D12000FFF75EFF2B78052B52 +:1003C0000BD02B78062B08D02B78072B09D10023D4 +:1003D00020002B70ECF734FD03E02000FFF77AFFDC +:1003E000F2E770BD1FB5036F827A9B68040001338A +:1003F0009A4207D18188012302226846FFF7F4F868 +:10040000002306E0ECF7A2FC2000FFF7AFFFA37A81 +:100410000133A3721FBD10B583790400DB0720D51B +:10042000027B022A02D1FFF7DDFF1AE0837A016F17 +:100430000133DBB2837289688B4201D1002383725E +:10044000002A02D12000ECF781FC237B012B05D18F +:10045000637300232000A373ECF75CFB2000FFF71D +:1004600085FF10BD70B504000D1E022D06D1EBF7FF +:10047000F7F9052802D00520EBF7A4F9237B022B1E +:100480000CD1022D0AD0A66E002E05D03000ECF75C +:10049000D1FF300002F0C5FC0023A366257370BDB8 +:1004A000007B7047407A7047F0B5837987B00400CD +:1004B0000D00DB0702D5002902D035E0002933D03A +:1004C000102100220127206F41568368CB188B42F0 +:1004D00004DD3E008E4001313243F8E71121002354 +:1004E00001274156C0680818884204DD3E008E404E +:1004F00001313343F8E71A43002D08D001230021CE +:1005000001A8F4F773FB0122A37913430BE02B003E +:10051000290001A8F4F76AFB290001A802F093FB67 +:100520000122A3799343A37107B0F0BD10B5012157 +:10053000FFF7BAFF10BD10B50021FFF7B5FF10BDE2 +:1005400010B57430FFF797F810BD052313B501936C +:1005500000930023040074311A00FFF72AF92000E9 +:1005600016BD70B5037B0400022B0AD00221FFF7F1 +:1005700079FF482002F043FC0500216FECF712FFE1 +:10058000A566A06E00F0D6F870BD10B50400F3F7B4 +:10059000B9FD00232000237510BD1FB503AC6370A7 +:1005A00000232270009322000233ECF717FE04B000 +:1005B00010BD1FB50F2401236C4400932300ECF7FA +:1005C0001DFE002800D1207804B010BD70B50400D5 +:1005D00016001D0003220F23EDF736F9200031002D +:1005E0000F2302221030EDF72FF9200029000F23EE +:1005F00001222030EDF728F9200004990F2304226E +:100600003030EDF721F9200005990F230522403005 +:10061000EDF71AF9200006990B2311225030EDF75F +:1006200013F9200007990B230C226030EDF70CF929 +:100630000B2320001A0008997030EDF705F920000F +:1006400009990B2312228030EDF7FEF820000A9959 +:100650000B230A229030EDF7F7F820000B990F23B7 +:100660000622A030EDF7F0F820000C990B231A2297 +:10067000B030EDF7E9F820000D990B231422C030BB +:10068000EDF7E2F820000E990B231722D030EDF79A +:10069000DBF820000F990B231622E030EDF7D4F899 +:1006A000200010990B231522F030EDF7CDF8601CD7 +:1006B00011990B231022FF30EDF7C6F820001130FE +:1006C00012990B230022FF30EDF7BEF820002130F5 +:1006D0000B231E221399FF30EDF7B6F8200070BDF2 +:1006E00010B518C96210E10701D58158CB588018A0 +:1006F000984710BD82B030B585B008920500082239 +:1007000002A8099302F0B2FB039B029C5810DB077E +:1007100001D52B581C592D180AA90822684602F049 +:10072000A5FB089A099B2800A04705B030BC08BC6F +:1007300002B018470368426803219A18836810B50D +:10074000D018F4F7DDFEA92352215B00FF311A0017 +:10075000884204DC083AFF3A904200DD0200FF20A4 +:1007600008219B1A5843FF31F4F7CAFE10BD0069F7 +:10077000002904DD002802D00139406AF8E77047FB +:1007800010B50400ECF748FF200002F04AFB2000FF +:1007900010BDF7B5838804005A070FD59A0648D4D0 +:1007A000DA060BD5010008221831684602F05EFB1C +:1007B000226963692000FEF73DFE3AE0042202262A +:1007C00001271343A380A38833420BD021000822C2 +:1007D0001831684602F04AFB22696369A06800F09C +:1007E000F4FE10E03B4208D0E368206900936169A1 +:1007F000A269E369A568A84705E020696169A26963 +:10080000E369A568A8471022A38813420ED0256A81 +:10081000002D0BD02900A01802F028FB2B6928001E +:10082000236202F0FEFAEAF7F3FDCCE704229343D9 +:10083000A380F7BD030072B64069002807D00269A3 +:100840005A61002A00D19A61DA8B013ADA8362B6E2 +:100850007047F7B5002507002E000469002C1BD057 +:10086000A288636A11B2002914DA04210A4211D164 +:10087000002E01D13B6100E07362636A20000193A6 +:10088000FEF7CEFD200002F0CCFA34000135260040 +:10089000019CE3E70193FAE72800FEBD70B5012251 +:1008A00086B004000D008669ECF7F4FE002827D11D +:1008B000E38B092B24D82900102202A802F0D6FAD3 +:1008C000182002F09CFA050004A90822684602F0EC +:1008D000CDFA029A039B2800FEF796FE72B6002E10 +:1008E00003D1636965612B6102E033692B61356176 +:1008F0002B69002B00D1A561E38B0133E38362B642 +:1009000006B070BD82B010B502A902920393FFF742 +:10091000C5FF002010BC08BC02B0184770B5050028 +:10092000FFF797FF2800FFF785FF041E0BD001009B +:1009300000222800ECF7AEFE200002F072FAEAF77F +:100940002DFD0028EED170BD82B030B585B0089283 +:100950000500082202A8099302F088FA039B029C72 +:100960005810DB0701D52B581C592D180AA908224D +:10097000684602F07BFA089A099B2800A04705B058 +:1009800030BC08BC02B01847028903008A4202D179 +:100990008079012305E0428900208A4202D19879BA +:1009A000022318407047028903008A4202D18079ED +:1009B000042305E0428900208A4202D19879082365 +:1009C00018407047028903008A4202D180791023BF +:1009D00005E0428900208A4202D1987920231840FC +:1009E0007047038910B58B4207D183790124002A0F +:1009F00001D0234300E0A343837143898B4207D195 +:100A000083790221002A01D00B4300E08B438371DC +:100A100010BD038910B58B4207D183790424002AC5 +:100A200001D0234300E0A343837143898B4207D164 +:100A300083790821002A01D00B4300E08B438371A6 +:100A400010BD038910B58B4207D183791024002A89 +:100A500001D0234300E0A343837143898B4207D134 +:100A600083792021002A01D00B4300E08B4383715E +:100A700010BD82B0F0B589B00E920F93078995B280 +:100A80000400BD4200D147890EAB5E88022E23D000 +:100A9000052E0FD0012E6FD1290020003200FFF764 +:100AA000A0FF39002000FFF76FFF002864D0A18865 +:100AB00033000CE0290020000122FFF7AAFF3900D3 +:100AC0002000FFF770FF002856D00123A1883200D4 +:100AD00004A8FEF789FD4FE039002000FFF754FF1E +:100AE000002815D03200A18801236846FEF77CFD5E +:100AF00029002000FFF757FFA68800282DD03900D5 +:100B00002000FFF750FF002827D00123042226E011 +:100B100029002000FFF756FF00280ED1267B012E6A +:100B20000BD129002000FFF73EFF002821D0330021 +:100B30000422290004A8FEF757FD29002000002206 +:100B4000FFF74FFF290020000022FFF762FF00227D +:100B500029002000FFF775FF0EE00123032231007A +:100B600004A8FEF741FD012239002000FFF769FFCC +:100B7000E3E733000322DCE709B0F0BC08BC02B0B5 +:100B800018470173704703238079184003384342A4 +:100B90005841704710B518C96210E10701D5815856 +:100BA000CB588018984710BD70B5837904001B0797 +:100BB00006D5806800F09BFD0E23E35683420FD0DC +:100BC0002000ECF74FFE082002F019F90E216156C3 +:100BD000050000F080FD0822A379A5601343A371EE +:100BE000002070BDD0B5040086B08AB20023818891 +:100BF00002A8FEF7F9FC049E059FA06800F0FFF92B +:100C000003000B430AD0049A059B00920193121A29 +:100C10008B4102A804920593EAF7F4FE32003B00F0 +:100C2000A06800F0E9F906B0D0BD1FB583790400D3 +:100C30005B0602D50521FFF7D5FFA3799B0605D5F5 +:100C4000A188012302226846FEF7CEFC1FBD1FB516 +:100C5000837904005B0602D50421FFF7C3FFA37963 +:100C60009B0605D5A188012303226846FEF7BCFC3C +:100C70001FBD702310B582791A4201D0ECF7F2FD46 +:100C8000002010BD704710B5040002F0CAF8200023 +:100C900010BD30B5040085B02569002D1ED0EA785E +:100CA000012A06D0022A09D12000203000F05EF887 +:100CB0000AE02000183000F017F805E092B2012396 +:100CC0001E216846FEF790FC23699D42E4D1200076 +:100CD000EDF70EF9280002F0A4F8DDE705B030BD0D +:100CE00000230160436070471FB504000068EDF702 +:100CF000FFF80023626843629A4201D160600BE012 +:100D0000516A002902D001330A00F9E7032B02DD02 +:100D100002F087F806E0506201231D211A006846A0 +:100D2000FEF762FC1FBD82B070B58CB011930378E2 +:100D30001092002B11D1132201A90A708B70123A64 +:100D400002334A70CB7010AC02AB64CC64C31A009F +:100D5000236813604068EDF7DFF80CB070BC08BC86 +:100D600002B01847002341600370704770B504005B +:100D70004068EDF7BDF80123050023700430EAF761 +:100D800041FE00232800237002F04BF870BD10B51F +:100D900018C96210E10701D58158CB5880189847CF +:100DA00010BDF8B50E001C00150006AA108807AA91 +:100DB0001788B84208D0335C290023700130F4F75B +:100DC00085FC013488B2F4E7F8BD4C3000787047F8 +:100DD0000300020050334E321B8811888B4204D925 +:100DE0001188023A1078401800E01088C01A704745 +:100DF000020003005C325A3311881B88994205D9DE +:100E00001188043A1078C318581A01E01088181A8B +:100E1000704710B50400012905D12000FFF7E8FF55 +:100E20000028FADC04E0022902D10020EAF75AFB8C +:100E300010BD10B504300022F3F740FB10BD10B513 +:100E40000968130002240A5F0431EDF7C5FA10BDEA +:100E5000F7B5150000AF7B602B000E006946083324 +:100E6000DB08DB00CB1A9D460132002104006846F6 +:100E700002F01AF87B682A0069463000EDF73EFB65 +:100E8000002803DC2000EAF7A3FD04E002B2694673 +:100E90002000EAF773FDBD462000FEBD13B50C002F +:100EA00001A8EDF7DDFE210001A8EDF7EBFE13BD73 +:100EB00073B50D0014001E0001A8EDF7D1FE33003C +:100EC0002A00210001A8EDF717FF73BD07B50192B5 +:100ED000802200915205136952696946133A5A43B8 +:100EE0000223FFF7E5FF07BD84B010B5049280220E +:100EF000039105935205116953695269113B133AE5 +:100F00004A4359430F9B5B1AD21803A90C23FFF7DE +:100F1000CFFF10BC08BC04B0184710B50400EDF7B3 +:100F2000A1FC200010BD8023F7B55B051A695D693F +:100F30000191113D5543EDF795FC061E1FD0302061 +:100F400001F05DFF302200210400002701F0ACFF1A +:100F50000835B7420DDA29003022200001F086FF63 +:100F60002100019801F0D6FF002802D0303501376A +:100F7000EFE72000B74202D101F053FF0020FEBD91 +:100F800010B509680431FFF7CEFF10BD10B5096830 +:100F90000431EDF797FC10BD52DF704712DF704748 +:100FA000704710B5040001F03CFF200010BD10B5E3 +:100FB0000400EAF78FFC0022A46801238A4202D1D0 +:100FC000844200D91300180010BD10B50400EDF7DD +:100FD000DFFD1022A35E1222A05E181A10BD10B50C +:100FE000EDF7D6FD10BD10B50400EDF719FE200099 +:100FF00001F017FF200010BD026543657047416D89 +:10100000006D704729DF704728DF7047002030B53A +:101010001C1A002C06DD155C0C5C0130AC43F7D0CB +:10102000012000E0002030BD10B503685B6A9847DE +:1010300010BD10B50400EDF795FF200001F0F1FEA2 +:10104000200010BD10B5C9B20D22FFF7B2FAC738A3 +:101050004342584110BD10B503685B6A984710BD04 +:1010600010B50400EEF7C2F8200001F0DAFE20000F +:1010700010BD10B5C9B20D22FFF79BFA5A38434292 +:10108000584110BD10B50368DB69984710BD10B515 +:101090000400EEF721F9200001F0C3FE200010BD8E +:1010A00010B5C9B20722FFF784FAC4384342584149 +:1010B00010BD10B503685B6A984710BD10B50400F9 +:1010C000EEF724FA200001F0ACFE200010BD10B5B0 +:1010D000C9B20F22FFF76DFA33384342584110BDB1 +:1010E00010B50368DB69984710BD10B50400EEF732 +:1010F000C7FA200001F095FE200010BD10B5C9B25E +:101100004F22FFF756FA40384342584110BDA7DF3F +:101110007047A9DF7047AADF704768DF704710B5D6 +:101120000368002B01D00800984710BD10B5036874 +:10113000002B01D00800984710BD10B50368002BA4 +:1011400001D00800984710BD10B50368002B01D0EE +:101150000800984710BD10B50368002B01D00800A7 +:10116000984710BD10B50368002B01D008009847C0 +:1011700010BD10B50400EEF7F1FA200001F051FEA9 +:10118000200010BD1FB50123FA211A00890068460E +:10119000FEF72AFA05B000BD0022431C0270C11DF3 +:1011A0001A7001338B42FBD1704770B51D000E00E1 +:1011B0001100C27F0400931C5B1901201F2B12DC5D +:1011C0002B18A354E37F2A001B18DBB2E377E65405 +:1011D000E07F0130C0B2E077201801F047FE002028 +:1011E000E37FED18E57770BD0200010010B50368DC +:1011F00034320A319B6F984710BD10B50400FFF7D9 +:10120000F3FF2368211DDB6F2000984710BD10B548 +:10121000002204000270431C11341A700133A342EF +:10122000FBD1418210BD37B50D00EFF771FF6B4662 +:10123000DA1D0123040019000A301570EEF78AFB4D +:10124000002802D12000FFF7CFFF3EBDF8B50D000A +:1012500016001F00EFF75CFF0400092D03D103689F +:1012600031005B6B984720003B00320029000A30B8 +:10127000EEF770FB002802D12000FFF7B5FFF8BDA4 +:1012800070B5EFF745FF05000A3504001F22002165 +:10129000280001F009FE00232000EB77FFF7A4FFF0 +:1012A00070BD806810B5002803D0EFF731FFFFF75D +:1012B000A4FF10BD70B58AB003AD06002800FFF78B +:1012C0006BFF13206844FFF767FF1A206844FFF79D +:1012D00063FF21206844FFF75FFF042301ACB0687F +:1012E00063710195EFF734FF036821001B6998478C +:1012F000A0790AB070BD10B504001830FEF737F9B8 +:101300000123636110BD022370B5436104000D0029 +:10131000EAF7E0FA2061002D07D008236269134341 +:1013200004226361A3791343A37170BD8023F0B5D8 +:101330005B0585B008005F6E0291FFF701F901239C +:1013400004240525019329003800F4F7D5F8080096 +:101350000199F4F74BF80523052200265D43019B14 +:10136000039053433F1A0193039B01339E420ADAD1 +:10137000042302989A1B12B221B2FB337430EAF7AD +:1013800073FB0136F0E7013CDDD205B0F0BD013062 +:10139000C07F704737B504680D00002C0ED0011DCA +:1013A0000822684601F062FD019A009B5010D207A6 +:1013B00001D52258D35820182900984737BD10B5B9 +:1013C0004A88838A90B00C009A4219D10B89002B6D +:1013D00016D0CB681B78012B12D18068EFF798FEEE +:1013E000036815215B6A9847FA20800001F0ECFB46 +:1013F000238804A80380002301A90B70F2F7A2FC44 +:1014000010B010BD704710B5040001F00AFD2000B7 +:1014100010BD37B504680D00002C0ED0011D082248 +:10142000684601F023FD019A009B5010D20701D5B8 +:101430002258D35820182900984737BD37B504687B +:101440000D00002C0ED0011D0822684601F00EFD93 +:10145000019A009B5010D20701D52258D35820186A +:101460002900984737BD82B030B585B00892050095 +:10147000082202A8099301F0F9FC039B029C581072 +:10148000DB0701D52B581C592D180AA908226846DC +:1014900001F0ECFC089A099B2800A04705B030BC7D +:1014A00008BC02B0184713B5836A4A88DB8B040076 +:1014B0009A420ED1838D013383858068EFF738FE21 +:1014C000A36A2200D98B0023046800931832E468D1 +:1014D000A04713BD70B504000130250003000026AD +:1014E00011351E7001339D42FBD10023638201330D +:1014F0002370002A08D10B001033994207D0013B1A +:101500001A7802700130F8E7102201F0B8FCA37BD2 +:10151000627B1B0213432000638270BD10B500F094 +:1015200000F9806D10BD82B010B50400806803938F +:101530000292FFF7F3FF83070ED502AB1A88A0686B +:10154000A2825B88E382EFF7F3FD22000368218C1F +:1015500014325C690423A04710BC08BC02B01847D1 +:1015600037B504680D00002C0ED0011D0822684616 +:1015700001F07CFC019A009B5010D20701D5225843 +:10158000D35820182900984737BD82B030B585B0B0 +:1015900008920500082202A8099301F067FC039B4A +:1015A000029C5810DB0701D52B581C592D180AA98D +:1015B0000822684601F05AFC089A099B2800A047B7 +:1015C00005B030BC08BC02B0184782B073B5040047 +:1015D000061D069208A908226846079301F046FCFA +:1015E00065693100069A079B2068A84773BC08BC50 +:1015F00002B01847026810B594460A680023944563 +:1016000007D104310430102201F021FC4342434150 +:10161000DBB2180010BD10B5EFF776FC406810BDC6 +:1016200010B5EFF771FC006810BD017042704360A7 +:10163000704782B0F0B505920200069308AB1B78A4 +:1016400005ACE0CCE0C2002B2ED04A78002A05D0B1 +:10165000069A52424260079A524282604A68022ABF +:1016600008D0032A0DD0012A10D1026841685242E5 +:10167000016004E0026852420260426852424260E5 +:1016800004E042680168524202604160012B04D0CC +:10169000022B09D143685B4202E0426803680260A2 +:1016A000436083685B428360F0BC08BC02B01847AB +:1016B00082B037B50400180007930B7806920193A7 +:1016C000089B009303002000FFF7B3FF20003EBCFF +:1016D00008BC02B0184710B50400F3F791F92000D8 +:1016E00010BD10B5040001F085FA200010BD40784F +:1016F00040B2704702000B00F0B5126889B0019249 +:1017000003AA15001E004068016809688C4692CE45 +:1017100092C5DB680199D36000231361E04709B0EB +:10172000F0BD10B5EFF7F4FC10BD022070470220A9 +:101730007047002070470020704702207047022049 +:101740007047022070470220704702207047022035 +:101750007047022070470220704702207047022025 +:101760007047022070470220704702207047002314 +:1017700013607047002070470220704702207047B6 +:1017800002207047022070470220704700207047F7 +:1017900000207047002070470220704702207047E9 +:1017A0004160704781607047C16070470161704758 +:1017B0004161704702207047022070470220704745 +:1017C00002207047022070470220704702207047B5 +:1017D00002207047002070470220704702207047A7 +:1017E0000020704770470220704702207047704702 +:1017F0000220704700207047704766DF704748DF5F +:101800007047007970470C3070470C30704710B546 +:10181000FFF7F5FF10BD10B50368002B01D00800DD +:10182000984710BD10B50368002B01D008009847F9 +:1018300010BD10B50368002B01D00800984710BDFB +:1018400010B50368002B01D00800984710BD08238D +:10185000F0B597B002AA137106AA029202AA1373F6 +:1018600010000EAB04930C00F0F7C8F90023061E1D +:101870009E4202D02371A37136E00500072702AB18 +:101880001B7BA37102AB1B79AB4213D96379AB42CB +:1018900001D8257128E03800684323681818029B96 +:1018A0000193019AAB0099580135072201F0DEFA45 +:1018B000EDB2E7E725710727002502AB21791B7BF5 +:1018C0006918AB420FD9637999420CDA79432368DE +:1018D0005918049B0193019AAB009858013500F008 +:1018E000C4F9EDB2E9E72171300017B0F0BD10B5D1 +:1018F000F0F72AF910BD10B508001100F0F75AF9F9 +:1019000010BD10B508001100F0F730F910BD10B58A +:10191000080011001A00029BF0F7ACF810BD70B57A +:1019200004000068002804D0056901F07AFA280054 +:10193000F8E7206070BD10B50400EFF7CBFC200085 +:1019400001F06FFA200010BD10B50400EFF7CCFCD9 +:10195000200001F066FA200010BD10B50400EFF77A +:10196000CDFC200001F05DFA200010BD10B5040090 +:10197000EFF7CEFC200001F054FA200010BD10B5A6 +:101980000400EFF7CFFC200001F04BFA200010BD5F +:1019900010B50400EFF7D0FC200001F042FA20005F +:1019A00010BD10B50400EFF7D1FC200001F039FAAA +:1019B000200010BD70B50400E3692362256A002D84 +:1019C00008D0EB68210028009847236A002BF3D049 +:1019D0001B69F2E720001C30FFF7A1FF28006560BB +:1019E000A560E5602561656170BD10B5FFF7E2FF98 +:1019F000002800D0062010BD10B50400EFF7B0FCA1 +:101A0000200001F00EFA200010BD10B50400EFF721 +:101A1000B1FC200001F005FA200010BD10B5040053 +:101A2000EFF7B2FC200001F0FCF9200010BD10B56A +:101A30000400EFF7B3FC200001F0F3F9200010BD23 +:101A400010B50400EFF7B4FC200001F0EAF9200023 +:101A500010BD70B50400E36A2363256B002D08D028 +:101A6000EB68210028009847236B002BF3D01B69FB +:101A7000F2E720002C30FFF752FF20000830FFF77C +:101A80004EFF20001430FFF74AFF20002030FFF700 +:101A900046FF280070BD70B5037904000920002BB3 +:101AA00020D0F2F71DF903000520002B1AD12500E4 +:101AB000FC35A86B002803D1286C002806D10AE069 +:101AC00003685B6A98470028F6D00BE003689B6ABE +:101AD0009847002806D120000C3000F043FA002877 +:101AE00000D1207170BDF7B5037907000E00140016 +:101AF000002B08D008220021684601F0D5F90A25FC +:101B00006B461D710CE0EFF7F5FE05000C20002D73 +:101B10000FD1012308223B712900684601F0C4F966 +:101B20003000EFF7D3FAE368009069462000984749 +:101B30002800FEBD10B50400EFF75EFC200001F0A8 +:101B400070F9200010BD10B51F220021040001F023 +:101B5000ABF90023E37710BD10B50020EFF76CFD63 +:101B600010BDFC30836B70B50400002B07D19920A9 +:101B7000800001F044F90500EFF780FDA563A06B3C +:101B800070BDFC30836B70B50400002B07D1992029 +:101B9000800001F034F90500EFF770FDA563A06B3C +:101BA00070BDF0B5040087B0E36B2364266C002E93 +:101BB00008D0F368210030009847236C002BF3D045 +:101BC0001B69F2E720003C30FFF7A9FE20002671D8 +:101BD00066710C30FFF7A3FE20001830FFF79FFE60 +:101BE00020002430FFF79BFE200001AD3030FFF7CE +:101BF00096FE31002800EFF731FD23002A00443320 +:101C000083CA83C3EB683100236566652800EFF75C +:101C100025FD23002A00583383CA83C3EB683100B3 +:101C20006366A6662800EFF719FD23002A006C33CF +:101C300083CA83C33000EB68E667A36707B0F0BDD3 +:101C400070DF704771DF704760DF7047704710B515 +:101C5000F1F7C8FF002010BD70477EDF704768DFD6 +:101C6000704710B500F064FD10BD022310B50B7075 +:101C70008C330B713F3B4B712D338B714A1C0431FC +:101C800000F02DFD10BD70DF704771DF704772DF0F +:101C9000704773DF704774DF704775DF704776DF1A +:101CA000704777DF704778DF704779DF70477ADFFA +:101CB00070477BDF70477CDF70477DDF704788DFD0 +:101CC00070471420704764207047A020800170473F +:101CD00010B50400FFF7DFFF0323002806D123001F +:101CE000012158331A788A431A700300180010BD76 +:101CF00003000800FC21583310B51C7821401970EE +:101D00003B218A4200D02839FFF7C9FF03005A1E41 +:101D1000934103205B42184010BD030010B5FE3311 +:101D20000A00D98C03681B6A984710BD10B50800DB +:101D3000FFF7BFFF03005A1E934103205B42184088 +:101D400010BD10B50800FFF7B2FF03005A1E934103 +:101D500003205B42184010BD080010B51100FFF7CA +:101D60009CFF031E00D00323180010BD13B50C0008 +:101D70001100012C06D86B460622581C01F076F89B +:101D8000002005E0A31E012B01D9032007E001205C +:101D90006B4669461C70FFF776FF0028F5D116BD2B +:101DA00037B568460D001400FFF76FFF03230028C6 +:101DB0000DD1002D02D06B461B782B70231E06D050 +:101DC0006B460622591C200001F050F80023180031 +:101DD0003EBD080010B51100FFF76FFF031E00D0D5 +:101DE0000323180010BD10B50800FFF75CFF031EA9 +:101DF00000D00323180010BD10B50800FFF755FFF1 +:101E0000031E00D00323180010BD10B50800FFF713 +:101E100048FF0023984203D00533112800D0023B2D +:101E2000180010BD08207047B830017000207047BE +:101E3000B93001700020704702207047B830007838 +:101E40007047B930007870470020704702000300E7 +:101E500010B5F33211786C309B6F984710BD10B5F8 +:101E600018C96210E10701D58158CB5880189847EE +:101E700010BD112337B5080001AC23700D0001F02F +:101E800053F8290082B22000FFF715FF031E00D08F +:101E9000032318003EBDF8B506000D0000240727F7 +:101EA0003300BA331B78A3420ED96B79A3420BD906 +:101EB000390061432B68072258187118BB3101346F +:101EC00000F0D4FFE4B2EBE72C710020F8BD10B5B0 +:101ED0000C00C97F01201F290ED8002901D1032041 +:101EE0000AE0D37F2000FFF7D2FE0028F7D1208C34 +:101EF000FFF7D9FE0028F2D110BDF8B5036807003E +:101F0000DB6C0D000C7998470323844228D800230A +:101F100007212879DAB2904208D90A005A432C687E +:101F20000133125D032AF5D1042319E03E00002499 +:101F3000BA3634702B79A34211D9072319003078AF +:101F4000614358432B6838185918BB30072200F0FA +:101F50008DFF3378013401333370E4B2EAE70023B4 +:101F60001800F8BD10B50400EFF770FA00280AD188 +:101F700023000122FE335242DA84BA34463B187001 +:101F80005870207000E0062010BDFE30C1847047FC +:101F9000FE30C08C7047A0DF7047A4DF7047A5DF1C +:101FA0007047A6DF7047A8DF7047F7B50D00160031 +:101FB0000021082268461F00089C00F075FF6A4651 +:101FC00023883100280013800197FFF7E8FF0323DF +:101FD000002803D16B461B88238003001800FEBD38 +:101FE00070B586B015006A4600200E00941DD3809F +:101FF000EFF722FB03681B699847FFF7C9FF01232E +:1020000002A98B7000230E808B80CD608C60FFF75F +:10201000C8FF83B2181E00D0052006B070BDF8B509 +:10202000040000200D001600EFF706FB03681B6993 +:1020300098472368DF69FFF7ABFF330001002A00F0 +:102040002000B847F8BDF0B5D48B02001E00002375 +:10205000457985B0F8329D4223D908321700083FF0 +:102060003F88A74210D11F33DB00C3180E249A8883 +:1020700002236C442380036803AD00949F682B0007 +:10208000B847021E02D00DE00133E4E723880620A2 +:10209000022B07D12B8810009B0703D0012333703C +:1020A00000E0042005B0F0BD10B50278002A09D187 +:1020B0000C781300002C13D1438A488A1B1A58420B +:1020C00043410CE00023012A0AD10A78012A07D1F2 +:1020D000013101300F3200F0BAFE43424341DBB21E +:1020E000180010BD70B504000D006368A360A068FF +:1020F000002807D0C36829009847A368002BF4D0B4 +:102100001B69F3E770BD10B5C368984710BD30B5C3 +:10211000150087B004290ED0052917D0032925D131 +:1021200044300100040004A8F0F79EF8049B002B43 +:1021300018D1059B14E05830010004006846F0F700 +:1021400093F8009B002B0DD1019B09E06C3001003E +:10215000040002A8F0F788F8029B002B02D1039B31 +:10216000DB0703D529002000FFF7CDFF07B030BD06 +:10217000F0B50B888FB005000C00502B0ED004D8A2 +:10218000012B25D0182B32D00CE1522B2FD03FD36E +:10219000532B00D006E1CE88052146E00200002343 +:1021A000CE884179FC3299423ED908321000083875 +:1021B0000088B0420AD1302120339B005A59531C69 +:1021C000DB7F0B4200D0D2E02E392EE00133EAE76C +:1021D0000C7AEB682B612869002800D1E2E0C36823 +:1021E000210098472B69002BF3D01B69F2E7A388E5 +:1021F0000AAE33802B6B6B63686B002800D1D1E093 +:10220000C368310098476B6B002BF3D01B69F2E772 +:102210008B79012B05D0022B00D0C3E00E8907215A +:1022200003E00E89062100E002212B0000206A79DC +:10223000F83300900098824200D8B3E008331800C9 +:1022400008380088B04214D1062958D0072913D085 +:102250003200022900D096E0A3880AA90B804E80A4 +:10226000237A0B71A38BCB80E38B20340B81CC6062 +:1022700040E000980130DCE71022002102A800F0C5 +:1022800013FEA38802AA13805680E38B06AF9380C7 +:10229000238C0021D38023001022223338000193A5 +:1022A000049300F001FE02233B70009B20339B004F +:1022B0005B591A002A3211780022914206D0180088 +:1022C00002A9DB6C4030984702AB9A89A08839009C +:1022D000BA80FFF768FEBB88002B63D1A3880AA9E8 +:1022E0000B804E80A37A0B71E38BCB80238C0B8108 +:1022F000019BCB6028001430FFF7F4FE52E006AFDC +:1023000010220021380000F0CFFDA3887E803B80A2 +:10231000A38B0AAE102200213000BB8000F0C4FD68 +:1023200001233370009B20339B005B591A00293234 +:1023300011780022914205D0180039002C309B6B97 +:102340009847BA89B280BB89002B0BD1BA68002AA2 +:1023500008D00121B3790B43B371BB883381FB886B +:10236000F2607381A0883100FFF71DFE1AE0A11C06 +:10237000C97F0134E07F09020843990607D503218C +:10238000840704D5D28B2800FFF7C1FE0AE00421A0 +:10239000DB06F7D50123010019400B0059425941D2 +:1023A0000331EFE70FB0F0BD77DF704778DF70479C +:1023B0007ADF70477CDF7047A2DF7047A3DF70478A +:1023C00063DF704710B586B06B46DC1D00232370B9 +:1023D000C15C02AA99540133102BF9D121001000DD +:1023E000FFF7EEFF0023984200D12378180006B0D3 +:1023F00010BDF0B51600302497B000931CAB04CB91 +:1024000001901B88029103931EAB1B8834400493F8 +:102410001FAB1B78059321AB1F8822AB1B7806935B +:1024200023AB1B780793002C33D00322002108A88C +:1024300000F03AFD0125022308AA937010212A001A +:1024400008A80A430270009A0D33501E08AA527859 +:102450009A43042818D8F2F7BFFF0305070C1100B0 +:10246000012107E001210AE001210A431340302243 +:1024700008E002210A431340102203E002210A432C +:1024800013402022134302E02A4313400B4308AABF +:1024900053700FAD1C220021280000F005FD621EC4 +:1024A000944108AB644223402E706B61002F05D02D +:1024B000209B002B02D06B602F816F8109AC03221F +:1024C0000021200000F0F0FC0120069B079A034049 +:1024D0000240DB001101DBB20B431A00059B0340F5 +:1024E0001800022313430343A37032231E421FD05C +:1024F000009B581E04281BD80F2223789343F2F721 +:102500006BFF0305070C1100012107E001210AE020 +:1025100001210B431340302208E002210B431340FA +:10252000102203E002210B431340202213432370A7 +:102530000C231E421FD00098013804281BD80F22FC +:1025400063789343F2F748FF0305070C110001215C +:1025500007E001210AE001210B431340302208E08B +:1025600002210B431340102203E002210B431340CE +:102570002022134363700AAD14220021280000F0CA +:1025800093FC029B2A000A936B469B890FA92B811F +:102590006B461B8A0198AB811C9B6C602B61249B52 +:1025A000FFF70AFF80B217B0F0BDF0B589B0009315 +:1025B0000EAB1B8805000F001600019303220FAB22 +:1025C000002102A81C7800F06FFC012302221C40AD +:1025D000144302AA94701900102202A811430200A9 +:1025E00003AC0170517020001422002100F05CFC4B +:1025F00002AB63606B461B88109A23816B469B88F5 +:10260000210028000397A3812661FFF7D7FE80B23F +:1026100009B0F0BD7FDF704782DF7047A7DF7047EA +:10262000A9DF7047AADF704700207047002070477D +:102630000020704710B5EFF7DBFE10BD10B5EFF7C7 +:102640008FFF10BD10B5EFF7E7FF10BD00207047FA +:1026500000207047002070470020704729DF704736 +:1026600028DF704710B5FFF7F9FFF0F76FFD10BDD9 +:1026700010B5F0F7DBFC80225205136911699BB29B +:102680000138584389B2F2F7B1FEFFF7E9FFF0F7DE +:102690005DFD10BD2EDF704732DF704733DF7047BE +:1026A0004CDF70472EDF704751DF704710DF7047F7 +:1026B00011DF704761DF704710B508001100FFF7A8 +:1026C000CBFA10BDAADF704744DF704711DF7047B7 +:1026D00013DF704700DF704770474DDF704730B53C +:1026E00000230D0014008DB06946C21AD27B5A54E3 +:1026F0000133102BF8D100210D2204A800F0D4FBE7 +:102700006A462B786846D3776B789377AB785377A4 +:10271000FFF7E3FF2F236B441B7823702E236B44BA +:102720001B7863702D236B441B78A3700DB030BDF4 +:1027300030B50378040085B00D000020022B16D1BF +:10274000611C032201A800F091FB211D032203A8B4 +:1027500000F08CFB02AA03A92800FFF7C0FF0322A8 +:1027600002A901A800F073FB43425841C0B205B072 +:1027700030BDA6DF7047036810B50400002B05D1FB +:10278000C06800F011FA01236060236010BD10B52D +:1027900004000068002804D0E06800F005FA6368CF +:1027A000C01A10BD10B58468FFF7F1FF201810BDE6 +:1027B00010B50400C06800F0F7F900236060A36062 +:1027C00010BD002310B50360436083600400F1F77F +:1027D000BFFCE0602000FFF7EBFF200010BD10B54C +:1027E0000400F1F7B5FB200000F01BFB200010BD3A +:1027F000836980681B681840431E9841704710B574 +:10280000043000F0FDF910BD436910B50100002B44 +:1028100004D10368002B06D0984704E00068002824 +:1028200001D00431984710BD10B5012903D0022909 +:1028300004D1383000E02030FFF7E6FF10BD10B5BE +:1028400003689B68984710BD10B50A000300011D7E +:10285000006900F071F910BD10B5011D006900F0AC +:1028600087F910BDC36A10B50100002B04D183693C +:10287000002B06D0984704E08069002801D01C3165 +:10288000984710BD10B50400F1F7B4FB200000F02C +:10289000C8FA200010BD10B50400436842699918B9 +:1028A000FFF7D2FFE36A002B04D1A369002B07D006 +:1028B000984705E0A069002802D021001C31984704 +:1028C00010BD10B50400FFF7C7FF0023A361E3624A +:1028D00010BD70B50D000400FFF7BEFF65612069F3 +:1028E00000F062F929182000FFF7AEFF70BD182331 +:1028F0004A1C5A438218926810B55943002A05D1E0 +:102900004118CB68002B09D0984707E04318DB68D3 +:10291000002B03D0411810311800904710BD70B53E +:102920000D0004000430F1F787FDE56370BD10B5BC +:10293000043000F052F910BD10B50C000430F1F76E +:1029400003FE200010BD10B5FFF7F1FF10BD10B55C +:10295000FFF7F2FF10BD70B50D000400F1F7A6FB04 +:102960002900201DF2F7DAFB70BDF0B585B01C0020 +:102970000AAB0600039117001D78F1F7DBFB01237A +:102980005D40009523003A000399300000F0DCF927 +:10299000201A441EA04105B0F0BDF0B585B01C0062 +:1029A0000AAB0600039117001D78F1F7C3FB012362 +:1029B0005D40009523003A000399300000F081F952 +:1029C000201A441EA04105B0F0BD10B50120FAF751 +:1029D000BFFB7047704710B5FFF7FCFFFFF7F9FF2B +:1029E000FBF7FAFF10BD10B5002801D000F001F888 +:1029F000FEE700B59BB0032102A800F06DF80221AC +:102A000008A800F069F801210EA800F065F810216F +:102A100014A800F061F8059B039A96201A60099AA1 +:102A20000C9B1A600F9A129B1A60159A179B0192C1 +:102A30001A6000F0C9F8069B039A96201A60099A5A +:102A40000B9B1A600F9A119B01921A60159A189BA2 +:102A50001A6000F0B9F8DEE70FB4012010B5FAF7FC +:102A600077FB70B50D0004001600F2F7A7F86B1C99 +:102A700007D00021200000F0C9F83100200000F04C +:102A8000BFF870BD70B5436804000D00002A01D086 +:102A9000C26800E0026913602000012100F0B6F86E +:102AA0002900200000F0ACF870BD10B50322FFF73C +:102AB000D8FF10BD10B5FFF7D4FF10BD70B50D00E5 +:102AC00004001600F2F77AF86B1C04D032000021E3 +:102AD0002000FFF7D7FF70BD10B50022FFF7EEFF13 +:102AE00010BD70B504000D0003681B68984763684B +:102AF0001D6070BD036870B5DB68040098476368AB +:102B00005A682368002A02D19B68984713E05B68E3 +:102B10001568984763682D1A5A68002D07DC91687C +:102B200059601B68002BEAD050689847E7E7236894 +:102B300010681B69984770BD70B50D0072B64B6088 +:102B4000002346680A607468002C05D02168511A79 +:102B500002D42300A468F7E7002B05D10368756051 +:102B60001B691000984700E09D60AC6062B670BDC4 +:102B700010B572B6426853688B420CD19B685360A3 +:102B80000268002B02D1936898470BE0126918681D +:102B9000904707E01300002B04D09A689142F9D1C6 +:102BA0008A689A6062B610BD10B503685B68984782 +:102BB00010BD70B50400F1F791FB0500F1F78EFB35 +:102BC000401BA042FAD370BDFA2310B59B005843B6 +:102BD000FFF7EFFF10BD7047704703681A00FC3223 +:102BE000D1680129FCD10021D160A322D2009858DC +:102BF000C0B2704710B5407840B2F1F7D1FD10BDBA +:102C000010B5007840B200F00EF810BD002901D0D8 +:102C1000012907D10023A022C356D205C133FF33B7 +:102C20009B0099507047A0238000DB05C018E0236B +:102C300010B50C24DB00C2588900A243C250C25810 +:102C40001143C15010BDF8B505000E000024012746 +:102C50003B00A3402A691A4203D060B23100FFF75B +:102C6000E2FF01341F2CF3D1F8BD30B5002903D0A9 +:102C700001291DD1002311E001220C0013008B401B +:102C800005691D4203D005688B00EB181C600131FB +:102C90001F29F3D10CE001331F2B09D00A009A4001 +:102CA00004691442F7D004689A00A2181160F2E790 +:102CB00030BD4268006913685940014059401160B5 +:102CC0007047F7B50192B1221F0003684910D20086 +:102CD00099508021012289005A50190000240600D1 +:102CE000FC31CC601A607D1E019BAC4213DA1919CD +:102CF00000223000F1F7A2FF00280AD03000F2F7DE +:102D000095F807003000F2F75FF83D1E1ADB25004A +:102D100018E00134E7E7591901223000F1F78EFF7E +:102D2000002803D03000F2F74FF80BE0089B3D007D +:102D3000002B07D03368FC339A68002AFCD00022AD +:102D40003D009A602800FEBDF8B51700B1221D00B5 +:102D50000368D200491099508022002492009C50B0 +:102D6000012206009A60AC4211DA395D3000F1F7B9 +:102D700051FF002809D03000F2F726F83000F2F7B2 +:102D800055F8031E0FDB23000DE00134EBE7069B33 +:102D9000002B04D03000F2F72FF8002801D12B00CF +:102DA00001E001235B421800F8BD82B00190C046EB +:102DB000C046C046C046C046C046C046C046C046E3 +:102DC000C046C046C046C046C046019B013B019379 +:102DD000002BECD102B070470023CB565A1C05D013 +:102DE000834201D1486802E00C31F5E718007047D2 +:102DF0000B0010B501001800FAF796F910BD10B5D8 +:102E0000041E00D101342000E8F77EFC002807D121 +:102E1000F2F7DCFA002801D100F007F88047F2E76A +:102E200010BD10B5E8F7A6FC10BD10B50620FAF7E6 +:102E3000CBF90120FFF7D7FDC9B28218904204D028 +:102E400003788B4202D00130F8E70020704730B59C +:102E50000024A24208D0035D651C0C5DA34201D092 +:102E6000181B02E02C00F4E7002030BD002310B551 +:102E70009A4203D0CC5CC4540133F9E710BD10B5BD +:102E8000884202D98B18984201D3002305E09B1A8F +:102E9000013A08D3995C8154FAE7934203D0CC5CA1 +:102EA000C4540133F9E710BD03008218934202D0E5 +:102EB00019700133FAE7704770B504000D1E1F2D1D +:102EC00004D916230360012040421EE0426C002A10 +:102ED00004D08B00D2181368002B08D1200000F01A +:102EE00015F82A0001002000FAF778F90DE000201B +:102EF000012B0AD0591C03D117332360013004E0A1 +:102F00000024280014609847200070BD10B5FAF71F +:102F1000C9FC10BD02780B78002A03D001300131C2 +:102F20009A42F7D0D01A70470023C25C0133002ABE +:102F3000FBD1581E7047030030B5002A0DD00C7825 +:102F400001335D1E013A2C700131002CF5D19A1825 +:102F50009A4202D01C700133FAE730BDF7B5170072 +:102F600001938A680B6900900C00934200DA130009 +:102F700022003B6043321278002A01D001333B60CB +:102F800023689B0602D53B6802333B600625236815 +:102F90001D401ED0230043331B785A1E93412268E4 +:102FA00092061CD53020E1184331087021005A1CCC +:102FB00045310978A2184332023311700FE0220024 +:102FC0000123193201990098089EB047431C0ED086 +:102FD0000135E3683A689B1A9D42F0DBDAE722008C +:102FE000019943320098089DA847431C02D1012053 +:102FF000404220E006232068E1683A68034000254B +:10300000042B03D18D1AEB43DB171D40A368226903 +:10301000934201DD9B1AED180027BD420AD0220021 +:1030200001231A3201990098089EB047431CDED054 +:103030000137F2E70020FEBDF8B5C046F8BC08BC79 +:103040009E467047F8B5C046F8BC08BC9E4670471F +:103050000000000000000000000000000000000070 +:10306000104200000054030081901D135C738E7E9B +:103070003FED0200C3EE0200CD9E0100C9A7010092 +:10308000D3F00200959C0100299E0100359E0100AD +:10309000C98E0100419E0100E59C0100B9EE0200CD +:1030A00011930100D98E0100DFDC0200CD900100F8 +:1030B000859001008BDD02006D8B010059DB020061 +:1030C00065DB0200098D0100ABDB020063E002005A +:1030D00001E00200A5930100E9E2020059EC0200C0 +:1030E0005BEC0200B0360300EC3503004036030011 +:1030F0009C37030023ED020047ED02002DF0020093 +:103100005DEF020061EC02005DEC02005FEC02008A +:1031100025920100B991010089E10200B9DA0200AB +:10312000E7DB0200FBDB0200FFDB020009DC020040 +:1031300017DC020021DC020033DC02003DDC02006F +:1031400047DC020043E102006DE10200A1890100B9 +:10315000A5DA020099DB0200E18C0100A9890100D7 +:10316000EFDA0200358C01002D8B0100F3DA02004A +:1031700043DB020051DB020017E10200EBDD02003D +:103180000FDE020033DE02007BDE02009FDE020063 +:10319000E7DC020071DD020001DD02001BDD020040 +:1031A00033DD02004BDD020059DD02003BE202008C +:1031B00061E2020087E20200ADE20200CBE202001F +:1031C0001FE1020031E102003FE0020051E0020095 +:1031D000EDDE0200CFDB02000FDF0200B1DF0200F4 +:1031E000C1DF0200D1DF0200E1DF0200F1DF0200F7 +:1031F0009D910100DBDB0200DFDB0200499C010046 +:10320000C98E010051DC0200D98E010057DC02009A +:103210005BDC02005FDC02002D8F010073DC02002A +:10322000698F01007BDC020081DC020095DC02007A +:103230007D8F0100F98F0100B3DC020011900100C5 +:1032400029900100DDDC020035900100519301005E +:1032500083EF0200C1A40100856702000557020048 +:103260002D570200197B0200DD6D02002576020059 +:10327000C9A70100058201000BD9020029820100C3 +:103280005182010013D90200818201001FD902007E +:103290003DD9020067D902008FD9020095D90200FA +:1032A0009BD90200ABD90200B9D902009DA501004B +:1032B000C5A501001DA601002DA6010059A601000B +:1032C00057F002005FF00200C5D90200ED83010053 +:1032D0004D840100D3D90200F3D902006D840100AE +:1032E00013DA0200358501007D8501008D8501001E +:1032F000A1850100B1850100E18501002BDA020002 +:1033000033DA0200398601004D860100D9EE020051 +:10331000E1EE0200E9EE0200F1EE020003EF02002E +:10332000199F0100259F010011EF020021EF02000B +:1033300029EF02002BEF0200C1820100D5820100BB +:103340001D8301003183010049830100598301007D +:103350006983010079830100898301009983010059 +:10336000B583010051E8020059E8020069E8020053 +:103370007DE802008DE80200A1E80200B5E8020045 +:1033800011970100D9E802001D97010053E90200DE +:103390003D9701004D97010067E9020087E90200AF +:1033A00097E90200AD970100D5970100A3E902005B +:1033B000B5E90200C5E902001D980100658601001B +:1033C000A1860100E58601002187010049870100EF +:1033D00065870100D987010021880100418801002B +:1033E0005188010037E402003BE4020053E402008C +:1033F00067E402006FE4020009E7020005E802004A +:10340000C1E40200C5E40200EBE402000FE50200A3 +:103410007FE50200C59301008DE50200FBE5020097 +:103420000BE6020017E6020063EC020073EC0200F8 +:1034300083EC020093EC0200A3EC0200B3EC020068 +:10344000C3EC0200D3EC0200F5E2020019E3020033 +:1034500029E3020039E3020049E3020059E30200D4 +:1034600069E3020079E3020019950100519501001A +:103470009995010033E80200BD950100F595010022 +:103480001196010051960100619601007D960100A0 +:1034900091960100A1960100B9960100CD96010018 +:1034A000E596010000000000E2652F227F2B7A3CA8 +:1034B000075C143326A6813CBDCBF07A8807703CAC +:1034C000075C143326A6913C4FBB610567ACDD3F1A +:1034D000182D4454FB21E93F9BF681D20B73EF3F3B +:1034E000182D4454FB21F93F000000000000E03F8C +:1034F000000000000000E0BF763C7935EF39EA3D7E +:10350000763C7935EF39EABD0000E0FE422EE63F19 +:103510000000E0FE422EE6BF0000000000000000B8 +:10352000000000000000008000000040FB21F93F87 +:10353000000000002D44743E000000809846F83CD6 +:103540000000006051CC783B00000080831BF03904 +:103550000000004020257A38000000802282E336F7 +:10356000000000001DF36935080004F900000000A8 +:103570000900000000000000CBD80200D5D80200EE +:10358000C5D80200C7D802000000000000000000FB +:103590000000000000000000B036030004006E755B +:1035A0006C6C0000B036030009002D496E66696E30 +:1035B00069747900B0360300040074727565000008 +:1035C000B03603000900756E646566696E65640057 +:1035D000B0360300080066756E6374696F6E000094 +:1035E000EC3503000000000000000000080004F9B2 +:1035F0000000000003000000000000003BDA0200B1 +:10360000119301000000000063DA020000000000D6 +:10361000000000000000000000000000B0360300C1 +:1036200000000000B0360300050066616C736500A1 +:10363000B03603000800496E66696E69747900004F +:103640000C0002F900000000020000000000000071 +:103650003BDA020011930100000000005FDA020073 +:10366000000000000000000000000000000000005A +:10367000B036030008005B4F626A6563745D00004A +:10368000B03603000900756E646566696E65640096 +:10369000B036030006006F626A65637400000000C4 +:1036A000B036030006006E756D62657200000000A2 +:1036B000080003F900000000010000000000000005 +:1036C0003BDA02001193010045DA02003DDA020004 +:1036D00047DA02006BDA02004BDA02004FDA02002E +:1036E000B036030003004E614E00000040505854B5 +:1036F000403A737472696E6700000000B0360300D0 +:103700000700626F6F6C65616E000000B0360300E9 +:103710000A005B46756E6374696F6E5D00000000A1 +:10372000CC230020DC230020EC230020FC230020FD +:103730000C2400201C2400202C2400203C240020E9 +:103740004C2400205C2400206C2400207C240020D9 +:103750008C2400209C240020AC240020BC240020C9 +:10376000CC240020DC240020EC2400200C0004F9F0 +:1037700000000000060000000000000003ED020051 +:103780006BEE0200F9EF020041F0020000000000C1 +:103790000000000000000000000000000C0004F920 +:1037A0000000000004000000000000001FED020007 +:1037B00021ED020003F0020045F0020000000000CD +:1037C000000000000000000000000000080004F9F4 +:1037D00000000000070000000000000027ED0200CC +:1037E00025ED02000FF002004FF002000000000083 +:1037F000000000000000000000000000140004F9B8 +:103800000000000008000000000000000DED0200B4 +:103810001DED020019F0020053F00200000000004C +:103820000000000000000000000000000000000098 +:103830000000000029A70100C1F0020005000000FF +:103840000500000003000000090000000D04000056 +:10385000C9490300000000000000000011F202004E +:103860006BF0020019F202004BF20200FFFF0000B1 +:1038700000000000FFFF0100010000000000000048 +:103880000000000069F002006BF0020071F002001D +:1038900073F00200000000000000000069F0020068 +:1038A0006BF00200B7F90200B9F9020077F90200E3 +:1038B00093F9020097F90200B3F9020069BD010013 +:1038C00071BD010099FA0200000000000000000034 +:1038D00029C201006BF0020011C2010057FB020077 +:1038E000000000000000000069F002006BF0020020 +:1038F00097FB020099FB020065C3010077FB020001 +:1039000093FB02006DC30100A5FB02000000000054 +:1039100000000000170403006BF002002DCC010032 +:1039200093010300010000001700000046000000A2 +:10393000A30000005F010000D6020000C4050000E3 +:10394000A00B0000000000000000000005090300BB +:1039500029D5010091D401006F07030019D6010099 +:10396000810703001D090300F8FFFFFF00000000AE +:1039700069F002001DD7010039D6010049D60100C7 +:10398000000000000000000069F002006BF002007F +:103990006FF002007FF00200000000000000000055 +:1039A00069F00200930C0300850C0300870C0300F0 +:1039B000000000000000000069F00200DF0F0300BB +:1039C000A10F0300A30F030000000000000000008F +:1039D00021EC0100E70F0300C40900000000000013 +:1039E00088130000080000001027000010000000ED +:1039F000204E000018000000803801002000000068 +:103A0000007102002800000000E204003000000005 +:103A10000088130038000000203A03000300000073 +:103A2000020000000000000004000000010000008F +:103A3000080000000200000000000000000000007C +:103A400069F002002910030065EF01003310030044 +:103A500077F9020093F9020097F90200B3F9020026 +:103A600071EE0100A9EF010099FA0200BCFFFFFF0F +:103A70000000000069F0020061EE010089EF010022 +:103A800099EF010055EF010077FB020093FB020064 +:103A9000A9F00100A5FB0200D839030008000000CE +:103AA000E204000000000000C4090000080000005B +:103AB000881300001000000010270000180000000C +:103AC000204E000020000000803801002800000087 +:103AD000007102003000000000C40900380000003E +:103AE000E83A0300030000000200000000000000AC +:103AF00004000000010000000800000002000000B7 +:103B0000000000000000000069F0020057100300F0 +:103B1000EDF101006110030077F9020093F9020052 +:103B200097F90200B3F9020039F1010005F2010032 +:103B300099FA0200A03A030008000000000000000B +:103B40000000000069F0020085100300D9F20100B6 +:103B50008F10030081F3010077FB020093FB02004A +:103B6000F1F20100A5FB0200D430000000000000CB +:103B7000A86100002000000050C3000040000000C9 +:103B8000A086010060000000400D030080000000DE +:103B9000801A06008800000000350C00900000002C +:103BA000006A1800B000000000D43000D00000000F +:103BB00000A86100F00000000050C300F800000001 +:103BC000683B03000B000000000000000000000044 +:103BD00069F00200B31003000DF50100BD100300F1 +:103BE00077F9020093F9020097F90200B3F9020095 +:103BF00079F4010025F5010099FA0200690200003C +:103C000080000000E802000090000000C4090000ED +:103C10007000000088130000600000001027000002 +:103C200050000000204E000040000000409C0000BA +:103C300030000000A08601002000000040420F007C +:103C4000100000004C3C03000400000002000000D3 +:103C50000000000004000000100000000800000048 +:103C6000200000001000000030000000FC3B0300BA +:103C700009000000000000000000000069F00200E0 +:103C8000E110030081F60100EB10030021F60100B2 +:103C900077FB020093FB020099F60100A5FB0200EE +:103CA000102700000C000000204E0000080000005B +:103CB00050C3000004000000A086010000000000C6 +:103CC000A03C030004000000000000000000000011 +:103CD00069F0020041F801005DF701007311030073 +:103CE0000000000000000000BF13030000000000FF +:103CF0000000000069F00200A108020005140300A2 +:103D000007140300000000000000000089130200F7 +:103D10001D1A0300000000000000000075130200DF +:103D20000B1A0300000000000000000061130200F5 +:103D3000F919030000000000000000009D130200BC +:103D40002F1A030000000000000000002B170300E2 +:103D50002F170300331703003717030071110200F8 +:103D60003B1703003F1703004317030047170300E7 +:103D70004B1703004F170300531703005717030097 +:103D80005B1703005F170300631703006717030047 +:103D90006B1703006F1703007517030079170300F3 +:103DA0007D1703008117030085170300891703009F +:103DB0008D1703009117030095170300991703004F +:103DC0009D170300CB290300CB2903004D140200EB +:103DD00000000000000000004D130200A3190300C2 +:103DE0000000000000000000251302007F190300FE +:103DF0000000000000000000111302006D19030014 +:103E00000000000000000000FD1202005B1903002A +:103E10000000000000000000E91202004919030040 +:103E20000000000000000000391302009119030097 +:103E30000000000000000000B5170300B9170300E0 +:103E4000BD170300C1170300C5170300C9170300FE +:103E5000CD170300D1170300D5170300A31B0300E0 +:103E60000000000000000000B1130200411A03002E +:103E70000000000000000000D51202003719030006 +:103E80000000000000000000D917030079110200B3 +:103E9000DD170300E1170300E5170300E717030030 +:103EA000EB170300EF170300F1170300F5170300EA +:103EB000F9170300531A030000000000000000007F +:103EC0000F19030003190300F7180300EF1803008C +:103ED0004F180300A1170300A5170300A91703003B +:103EE000AD170300B1170300EB1903000000000039 +:103EF00000000000E71A030003180300971A0300EC +:103F000061120200071803000B180300831B030053 +:103F1000631B03000D120200C5130200D911020039 +:103F20000F180300F9130200351B03000000000006 +:103F3000000000006D1D0300A11D0300C31C030051 +:103F4000C71C0300CB1C0300D11C03003F17030058 +:103F50007D1D0200F11C03001B1D03002D1D03002D +:103F6000431D0300591D0300731E0300D31D0300EE +:103F7000E71D0300F91D03000B1E03002D1C0200AA +:103F8000251E0300971E0300FB1E0300291E0300CD +:103F9000311E0300391E03003D1E0300431E0300B3 +:103FA000491E030099170300791C0200CF1E03006D +:103FB0006D1E0200651F03000000000000000000ED +:103FC0003D200200151F0200AB1F03002D1F020041 +:103FD000491F0200E11F03001F20030047200300C8 +:103FE000D51703001922020059260300612502009B +:103FF000312603003D26030051260300F123020071 +:1040000055260300352603004D260300192602001D +:104010002D260300452603007126030061320200AD +:104020008D32020019320200E5310200293102000E +:10403000F93002007D36020061360200CD35020003 +:104040000000000000000000513F0200DF270300D5 +:104050000000000000000000000000000000000060 +:10406000CB2903000000000000000000F53F020023 +:104070008528030065280300000000000000000000 +:1040800011CC0100A50103009728030000000000E7 +:104090000000000067F0020097F00200000000003E +:1040A000000000006DF002008BF002000000000034 +:1040B000000000005729030025E8020027E802005D +:1040C00051420200DD420200D72B0300D92B03002E +:1040D000F5420200C0400300DC270020B0040000CD +:1040E00000F004006009000000D00900C0120000C8 +:1040F00000B0130080250000005027004038000069 +:1041000000003B00004B000000A04E00807000004B +:1041100000F07500127A0000000080000096000098 +:1041200000509D0000E1000000F0EB00002C0100B9 +:1041300000903A0100C2010000E0D70100840300B2 +:1041400000B0AF0390D00300000000040008070097 +:1041500000705F0700100E00A4DFBE0E40420F008B +:10416000000000100100000000700040040000008A +:104170000200000000700040080000000300000082 +:1041800000700040100000000400000000700040BB +:10419000200000000500000000700040400000000A +:1041A000060000000070004080000000FF000000DA +:1041B000FFFFFFFF00000000BE5E0200E25D0200A4 +:1041C000A05E0200785E0200A05E02006C5E02004B +:1041D000A05E0200785E0200E25D0200E25D020085 +:1041E0006C5E0200785E0200245F0200245F020021 +:1041F000245F0200A65E0200E25D0200E25D0200B2 +:104200008C5E0200765E02008C5E02006C5E020034 +:104210008C5E0200765E0200E25D0200E25D02005A +:104220006C5E0200765E0200245F0200245F0200E2 +:10423000245F0200305F02001C6202007A6102000B +:104240007A610200786102000E6202000E620200D2 +:1042500004620200786102000E6202000462020041 +:104260000E62020078610200146202001462020011 +:10427000146202009E620200CC6F02009A6E02007D +:10428000A06F0200906E0200A06F0200AA6F0200F1 +:10429000A06F0200906E02009A6E02009A6E0200F9 +:1042A000AA6F0200906E0200866E0200866E020007 +:1042B000866E0200FC71020014780200D4760200BF +:1042C000D4760200D2760200EC770200EC7702008E +:1042D000DE770200D2760200EC770200DE77020081 +:1042E000EC770200D2760200F4770200F477020045 +:1042F000F4770200F479020061636F73000000003C +:1043000061636F73680000006173696E00000000F4 +:104310006174616E68000000636F736800000000E4 +:1043200065787000666D6F64000000006C6F670058 +:104330006C6F67313000000073696E680000000028 +:104340007371727400000000FB21F93FFB210940EA +:104350007CD91240FB2119407A6A1F407CD9224047 +:10436000BBFD2540FB2129403A462C407A6A2F406C +:104370005C4731407CD932409C6B3440BBFD3540BA +:10438000DB8F3740FB2139401BB43A403A463C4072 +:104390005AD83D407A6A3F404C7E40405C4741409D +:1043A0006C1042407CD942408CA243409C6B4440FC +:1043B000AC344540BBFD4540CBC64640DB8F474053 +:1043C000EB584840FB21494083F9A200444E6E005F +:1043D000FC291500D1572700DD34F50062DBC00051 +:1043E0003C999500419043006351FE00BBDEAB0059 +:1043F000B761C5003A6E2400D24D42004906E00084 +:1044000009EA2E001C92D100EB1DFE0029B11C0010 +:10441000E83EA700F535820044BB2E009CE98400ED +:10442000B4267000417E5F00D69139005383390075 +:104430009CF439008B5F840028F9BD00F81F3B0015 +:10444000DEFF97000F980500112FEF000A5A8B002E +:104450006D1F6D00CF7E360009CB2700464FB70099 +:104460009E663F002DEA5F00BA277500E5EBC700A6 +:104470003D7BF100F739070092528A00FB6BEA009E +:104480001FB15F00085D8D00300356007BFC4600C5 +:10449000F0AB6B0020BCCF0036F49A00E3A91D00FE +:1044A0005E619100081BE60085996500A0145F001D +:1044B0008D40680080D8FF0027734D00060631004C +:1044C000CA561500C9A873007BE260006B8CC0005F +:1044D00002000000030000000400000006000000CD +:1044E00000000000000000000000000000000000CC +:1044F00000000000000000000000000000000000BC +:1045000000000000000000000000000000000000AB +:10451000000000000000000000000000000000009B +:10452000000000000000000000000000000000008B +:10453000000000000000000000000000000000007B +:10454000202000203031323334353637383961623B +:1045500063646566000000000000000000000000C9 +:1045600000001010101010000010000000006C4837 +:10457000480000000000000000001414287C287C83 +:10458000285050000000103840403848701010008B +:1045900000002050200C70081408000000000000EB +:1045A00018202054483400000000101010100000A3 +:1045B000000000000000080810101010101008087B +:1045C0000000202010101010101020200000107C7F +:1045D0001028280000000000000000101010FE103D +:1045E0001010000000000000000000001810302033 +:1045F0000000000000007C0000000000000000003F +:104600000000000030300000000004040808101012 +:104610002020400000003844444444444438000012 +:104620000000301010101010107C00000000384402 +:1046300004081020447C00000000384404180404DE +:104640004438000000000C141424447E040E0000C2 +:1046500000003C20203804044438000000001C20E6 +:10466000407844444438000000007C4404080808B2 +:10467000101000000000384444384444443800001E +:104680000000384444443C0408700000000000006E +:10469000303000003030000000000000181800002A +:1046A000183020000000000C10608060100C00002A +:1046B00000000000007C007C00000000000000C042 +:1046C0002018041820C0000000000018240408105E +:1046D00000300000003844444C54544C40443800EE +:1046E000000030102828287C44EE00000000F84428 +:1046F0004478444444F8000000003C4440404040BA +:10470000443800000000F0484444444448F00000AD +:104710000000FC445070504044FC000000007E2229 +:10472000283828202070000000003C4440404E44BF +:10473000443800000000EE44447C444444EE000051 +:1047400000007C1010101010107C000000003C08CD +:1047500008084848483000000000EE4448507048BF +:1047600044E600000000702020202024247C00006B +:104770000000EE6C6C54544444EE00000000EE6403 +:10478000645454544CEC0000000038444444444405 +:1047900044380000000078242424382020700000D1 +:1047A000000038444444444444381C000000F844A9 +:1047B0004444784844E200000000344C403804048B +:1047C000645800000000FE92101010101038000015 +:1047D0000000EE4444444444443800000000EE44E9 +:1047E00044282828101000000000EE44445454547B +:1047F000542800000000C6442810102844C60000B9 +:104800000000EE44282810101038000000007C44FE +:1048100008101020447C00000000382020202020B8 +:104820002020203800004020202010100808080018 +:1048300000003808080808080808083800001010A8 +:1048400028440000000000000000000000000000FC +:1048500000000000FE001008000000000000000042 +:104860000000000038443C44443E00000000C040CA +:104870005864444444F80000000000003C444040B8 +:104880004438000000000C04344C4444443E000012 +:104890000000000038447C40403C000000001C2028 +:1048A0007C202020207C000000000000364C444486 +:1048B000443C04380000C0405864444444EE0000C6 +:1048C0000000100070101010107C0000000010009C +:1048D00078080808080808700000C0405C4870505C +:1048E00048DC00000000301010101010107C000098 +:1048F00000000000E854545454FE00000000000082 +:10490000D864444444EE00000000000038444444AD +:104910004438000000000000D8644444447840E07B +:1049200000000000364C4444443C040E00000000EB +:104930006C302020207C0000000000003C44380443 +:1049400044780000000000207C202020221C000071 +:1049500000000000CC4444444C360000000000003D +:10496000EE4444282810000000000000EE44545497 +:104970005428000000000000CC48303048CC000033 +:1049800000000000EE4424281810107800000000F9 +:104990007C481020447C00000000081010101020FB +:1049A000101010080000101010101010101010003F +:1049B000000020101010100810101020000000003F +:1049C000000024580000000000000004020204025D +:1049D00000000204040400020200040403010000B9 +:1049E00001030303000101020303040201010301A7 +:1049F000040301000300000401010200000302524D +:104A000065626F6F744D6F646500666C61736849B1 +:104A10006E636F6D706C657465007A76677074751F +:104A20006F6965617A76677074756F6965617A76AA +:104A3000677074000004020204020000020404040F +:104A4000000202000404030100000103030300014B +:104A50000102030304020101030104030100030036 +:104A60000004010102000003021B1B000E110000E4 +:104A700000000008080800080A4A4000000A5FEA2F +:104A80005FEA0ED92ED36E19324489330C924C92C0 +:104A90004D0808000000048808080408048484887D +:104AA000000A448A4000048EC4800000000488008C +:104AB000000EC000000000080001224488100C9283 +:104AC00052524C048C84848E1C824C901E1EC24414 +:104AD000924C06CA525FE21FF01EC13E02448ED1C4 +:104AE0002E1FE24488100ED12ED12E0ED12EC48856 +:104AF0000008000800000480048802448804820042 +:104B00000EC00EC008048244880ED126C0040ED107 +:104B100035B36C0C925ED2521C925C925C0ED0103B +:104B2000100E1C9252525C1ED01C901E1ED01C9067 +:104B3000100ED013712E12525ED2521C8808081C1F +:104B40001FE242524C1254981492101010101E1171 +:104B50003B75B131113935B3710C9252524C1C92E4 +:104B60005C90100C92524C861C925C92510ED00CB0 +:104B7000825C1FE4848484125252524C1131312AD7 +:104B800044113135BB7112524C9252112A44848423 +:104B90001EC488101E0EC808080E10080482410E9C +:104BA000C242424E048A400000000000001F080478 +:104BB000800000000ED2524F10101C925C000ED0EC +:104BC000100E02424ED24E0C925C900E06C81C880B +:104BD000080ED24EC24C10101C9252080008080851 +:104BE000024002424C10149814920808080806006B +:104BF0001B75B131001C925252000C92524C001C99 +:104C0000925C90000ED24EC2000ED010100006C86A +:104C1000049808080EC807001252524F0011312A9A +:104C20004400113135BB00124C8C9200112A44987B +:104C3000001EC4881E06C48C84860808080808184C +:104C4000080C881800000C836000000100020003BB +:104C5000000400000101010201030104010002013E +:104C6000020202030204020003010302030303041D +:104C70000300040104020403040404302C3235351B +:104C80002C302C3235352C300A302C3235352C3046 +:104C90002C3235352C300A302C302C302C302C3046 +:104CA0000A3235352C302C302C302C3235350A3048 +:104CB0002C3235352C3235352C3235352C300A0036 +:104CC00054494C5420544F2046494C4C2053435295 +:104CD00045454E2000636F6D7061737343616C00D6 +:104CE00074656D7043616C00FFFF14000500FFFFE9 +:104CF000FFFFFFFFFFFFFFFFFFFF00FFFFFF0000C1 +:104D000000FFFFFFFFFFFFFFFF00FFFFFF000000AE +:104D1000FF0000000000FFFF00FFFFFF000000FF9A +:104D200000000000000000000000FFFFFFFFFFFF89 +:104D3000FF00FFFFFF000000FF0000000000FFFF7A +:104D4000FFFFFFFFFFFFFFFFFFFF00FFFFFF000070 +:104D500000FF0000FFFF00FF00FF00FF00FFFFFF5C +:104D600000FF00FF00FF0000FFFF00626C65537949 +:104D700073417474727300424243206D6963726FB1 +:104D80003A62697400424243206D6963726F3A620D +:104D90006974205B005D00302C302C3235352C30AE +:104DA0002C300A302C3235352C302C302C300A3255 +:104DB00035352C3235352C3235352C3235352C32D3 +:104DC00035350A302C3235352C302C302C300A3029 +:104DD0002C302C3235352C302C300A00302C302C35 +:104DE000302C302C300A302C302C302C302C3235FA +:104DF000350A302C302C302C3235352C300A3235F7 +:104E0000352C302C3235352C302C300A302C3235C4 +:104E1000352C302C302C300A003235352C302C30EB +:104E20002C302C3235350A302C3235352C302C32A2 +:104E300035352C300A302C302C3235352C302C3096 +:104E40000A302C3235352C302C3235352C300A32A4 +:104E500035352C302C302C302C3235350A00322EA2 +:104E6000312E312D2D6700E2ECF0F4F8FC0004E95E +:104E70005D93B0251D470AA062FA1922DFA9A8E9AF +:104E80005D93B1251D470AA062FA1922DFA9A8E99E +:104E90005DB84C251D470AA062FA1922DFA9A8E9CE +:104EA0005D9775251D470AA062FA1922DFA9A8E9B6 +:104EB0005D93AF251D470AA062FA1922DFA9A8E970 +:104EC0005D23C4251D470AA062FA1922DFA9A8E9BB +:104ED0005D5404251D470AA062FA1922DFA9A80122 +:104EE000FF01AAE97D3B10251D470AA062FA19229D +:104EF000DFA9A8E97DD91D251D470AA062FA19225C +:104F0000DFA9A86261642068616E646C6520746FBB +:104F100020756E6465726C79696E67207472616E5B +:104F200073706F727400494E495449414C495A415B +:104F300054494F4E5F494E434F4D504C45544500E8 +:104F40004E6F7264696320424C45342E3120766581 +:104F5000723A25752066773A25303478004E6F72A4 +:104F600064696320287370656320756E6B6E6F775C +:104F70006E29207665723A25752066773A25303499 +:104F80007800756E6B6E6F776E00010203D8E2ECED +:104F9000F0F4F8FC00046E52463578004E6F206144 +:104FA0007661696C61626C6520493243004F6E6CBA +:104FB000792038626974732053504920737570707A +:104FC0006F727465640053504920666F726D61742E +:104FD000206572726F72004E6F20617661696C613C +:104FE000626C652053504900636F756C64206E6F6E +:104FF000742070696E6F75740070696E6D617020D9 +:105000006D69732D6D617463680070696E6D617098 +:10501000206E6F7420666F756E6420666F722070EC +:1050200065726970686572616C0070696E6D61703F +:10503000206E6F7420666F756E6420666F722066D6 +:10504000756E6374696F6E00002020202020202080 +:105050002020282828282820202020202020202028 +:105060002020202020202020208810101010101038 +:105070001010101010101010100404040404040484 +:10508000040404101010101010104141414141411E +:105090000101010101010101010101010101010100 +:1050A0000101010110101010101042424242424210 +:1050B00002020202020202020202020202020202D0 +:1050C0000202020210101010200000000000000078 +:1050D00000000000000000000000000000000000D0 +:1050E00000000000000000000000000000000000C0 +:1050F00000000000000000000000000000000000B0 +:10510000000000000000000000000000000000009F +:10511000000000000000000000000000000000008F +:10512000000000000000000000000000000000007F +:10513000000000000000000000000000000000006F +:10514000000000000000000000232D302B2000682C +:105150006C4C006566674546470030313233343564 +:1051600036373839414243444546000000000000CC +:105170000430FE7F0100000000000000A10D0C00C3 +:105180006E4A0300774D03005E4E0300204E000080 +:10519000D9260300204E000000000000E044030078 +:1051A000004503002045030000000000000000004F +:1051B0000000000000000000AB4F030000000000F2 +:1051C00000000000000000000000000000000000DF +:1051D00000000000000000000000000000000000CF +:1051E00000000000000000000000000000000000BF +:1051F00000000000000000002020002048500300B4 +:10520000204EFFFF00000000FF0F1010070004FFFA +:1052100000000100398101008D9401002D960100EC +:10522000E99B010081A50100A5A8010095B6010038 +:10523000DDB90100F9BC010021BD01000D810100B3 +:10524000000000000000000000000000000000005E +:10525000000000000000000000000000000000004E +:10526000000000000000000000000000000000003E +:10527000000000000000000000000000000000002E +:10528000000000000000000000000000000000001E +:10529000000000000000000000000000000000000E +:1052A00000000000000000000000000000000000FE +:1052B00000000000000000000000000000000000EE +:1052C00000000000000000000000000000000000DE +:1052D00000000000000000000000000000000000CE +:1052E00000000000000000000000000000000000BE +:1052F00000000000000000000000000000000000AE +:10530000000000000000000000000000000000009D +:10531000000000000000000000000000000000008D +:10532000000000000000000000000000000000007D +:10533000000000000000000000000000000000006D +:10534000000000000000000000000000000000005D +:10535000000000000000000000000000000000004D +:10536000000000000000000000000000000000003D +:10537000000000000000000000000000000000002D +:10538000000000000000000000000000000000001D +:10539000000000000000000000000000000000000D +:1053A00000000000000000000000000000000000FD +:1053B00000000000000000000000000000000000ED +:1053C00000000000000000000000000000000000DD +:1053D00000000000000000000000000000000000CD +:1053E00000000000000000000000000000000000BD +:1053F00000000000000000000000000000000000AD +:10540000708E3B92C615A841C49866C975EE519737 +:1054100081901D135C738E7E823CDC229FB40FB2A0 +:1054200004007D01BC5F030000000100B05F0300C9 +:105430006B5A0300E45F030000000000000000005E +:105440009C370300000000004D54030000B501200C +:105450003768786003203768B86005203768F860DF +:105460006F467760E4F7F4F81F20C0026F4677605C +:10547000E4F704F93F2001B400F0ECF801B0034672 +:10548000032001B4012001B408B4292001B479201B +:1054900001B4A12001B400F0E1F806B00F20000231 +:1054A000C13001B400F0D6F801B00346092001B4C0 +:1054B000032001B408B4112001B4472001B429200D +:1054C00001B400F0CBF806B07B4801B400F0C2F89C +:1054D00001B001B4FA200002D33001B4152001B4A8 +:1054E000652001B400F090F804B03F2001B400F052 +:1054F000B1F801B001B4714801B4AB2001B401208E +:1055000001B400F003F804B000BD000000B50020B5 +:1055100001B401B401B401B401B401B401B401B4E3 +:10552000099800900A980190192002900F2003908A +:105530000B9801B400F0DDFB6F467760F8F7D7FAFF +:1055400001B000F088FC0490012005900120059036 +:105550000598049900F08BFC53D00B9801B4069881 +:1055600001B400F0CCFB6F467760F8F715FB02B092 +:10557000412100F02EFC0690069801B4039801B476 +:10558000019800996F467760F8F753FC02B00790D6 +:105590000098039900F00DFC01210902413100F04F +:1055A0007AFC06D0099800900198029900F001FC5D +:1055B00001900198029900F0FCFB012109020131E0 +:1055C00000F069FC03D0099800900A9801900098B7 +:1055D00001B4029801B4099801B40F9801B400F025 +:1055E0009CFB6F467760E4F77DF804B00098039960 +:1055F00000F0DFFB00900598032100F0DAFB059036 +:10560000A6E708B000BD000000B5002001B401B459 +:105610000398009004980190039801B4059801B490 +:10562000079801B46F467760E3F7BAF901B400F068 +:1056300094FB6F467760E3F7B7F902B001B40EBC94 +:10564000069801B402B404B408B4FFF75FFF04B0D5 +:1056500002B000BD00B5019800BD000000B50020FB +:1056600001B401B401B401B4012000900798019085 +:10567000079801B403216F467760F8F734FB01B057 +:105680000146072000F0A5FB029001200390099835 +:10569000032100F03CFC00D1F8E00098019900F0F3 +:1056A0000EFC00D1F1E0009803900398019900F0FE +:1056B00006FC05D1AAE000003FF00100C85F03002E +:1056C0000598009900F075FB01B40798049900F063 +:1056D00070FB01B40A9801B400F046FB01236F4649 +:1056E0007760E3F7F3FF03B00598009900F071FBD2 +:1056F00001B40798049900F05CFB01B40A9801B466 +:1057000000F032FB01236F467760E3F7DFFF03B061 +:105710000598039900F05DFB01B40798019900F02A +:1057200048FB01B40A9801B400F01EFB01236F4648 +:105730007760E3F7CBFF03B00598039900F049FBCE +:1057400001B40798019900F044FB01B40A9801B430 +:1057500000F00AFB01236F467760E3F7B7FF03B061 +:105760000598009900F035FB01B40798049900F002 +:1057700030FB01B40A9801B400F0F6FA01236F4639 +:105780007760E3F7A3FF03B00598009900F011FBE1 +:1057900001B40798049900F01CFB01B40A9801B405 +:1057A00000F0E2FA01236F467760E3F78FFF03B062 +:1057B0000598039900F0FDFA01B40798019900F0EB +:1057C00008FB01B40A9801B400F0CEFA01236F4639 +:1057D0007760E3F77BFF03B00598039900F0E9FADF +:1057E00001B40798019900F0E4FA01B40A9801B4F1 +:1057F00000F0BAFA01236F467760E3F767FF03B062 +:105800000398032100F0D5FA03904EE70298012196 +:1058100000F02DFB15D0029801B4019801B4009955 +:1058200009206F467760F8F704FB01B00D2100F006 +:10583000C0FA01B40198009900F0BBFA02B00290DE +:105840001DE0029801B40198029900F0C2FA01B477 +:10585000009909206F467760F8F7EBFA01B001462E +:10586000152000F0A6FA01B40198009900F0A1FA01 +:1058700002B002900198032100F0ABFA0190009869 +:10588000032100F096FA009007E7ECE000980199F8 +:1058900000F015FB00D1E6E00598009900F089FAC8 +:1058A00001B40798029900F084FA01B40A9801B48F +:1058B0000D9801B400F031FA6F467760E3F706FF08 +:1058C00004B00598009900F084FA01B40798029991 +:1058D00000F06FFA01B40A9801B40D9801B400F019 +:1058E0001CFA6F467760E3F7F1FE04B00598019962 +:1058F00000F06FFA01B40798019900F05AFA01B468 +:105900000A9801B40D9801B400F007FA6F46776069 +:10591000E3F7DCFE04B00598019900F05AFA01B4EF +:105920000798019900F055FA01B40A9801B40D984E +:1059300001B400F0F2F96F467760E3F7C7FE04B0F8 +:105940000598009900F045FA01B40798029900F013 +:1059500040FA01B40A9801B40D9801B400F0DDF9E1 +:105960006F467760E3F7B2FE04B00598009900F047 +:1059700020FA01B40798029900F02BFA01B40A98B2 +:1059800001B40D9801B400F0C8F96F467760E3F7F1 +:105990009DFE04B00598019900F00BFA01B4079838 +:1059A000019900F016FA01B40A9801B40D9801B4F7 +:1059B00000F0B3F96F467760E3F788FE04B005980E +:1059C000019900F0F6F901B40798019900F0F1F996 +:1059D00001B40A9801B40D9801B400F09EF96F4625 +:1059E0007760E3F773FE04B00298012100F03FFAFC +:1059F00015D0029801B4019801B4009909206F46AE +:105A00007760F8F716FA01B00D2100F0D2F901B471 +:105A10000198009900F0CDF902B002901DE00298C3 +:105A200001B40198029900F0D4F901B40099092059 +:105A30006F467760F8F7FDF901B00146152000F0D8 +:105A4000B8F901B40198009900F0B3F902B00290DE +:105A50000198032100F0BDF901900098032100F0A6 +:105A6000A8F9009012E704B000BDF0B50C46154649 +:105A70001E46074600F090F96846F0B46946E4F720 +:105A80001FFD06463D46A86803248047074604B02C +:105A90003046F9F776FA3846F0BD82070ED1002875 +:105AA0000CD003681A89012A00D170471F6A002FA1 +:105AB00004D001B50124B847009000E001B56F465D +:105AC0007760E3F7AFFB02BD84071FD100281DD02C +:105AD00003681C89032C19D1491007D34468A142DB +:105AE00016D24418207A400001307047490005B5AD +:105AF00008466F467760F8F7F2F8014605BC6F4636 +:105B00007760F8F78DF84000013000BDE3F74AFCFC +:105B10000120704784071CD100281AD003681C8913 +:105B2000062C16D1491006D30489A14213D289004C +:105B3000446860587047490005B508466F4677606D +:105B4000F8F7CDF8014605BC6F467760F8F768F8BE +:105B500000BDE3F727FC0020704784071BD1002815 +:105B600019D003681C89032C15D1491005D344684A +:105B7000A14212D2441822727047490005B5084666 +:105B80006F467760F8F7ABF8014605BC6F46776063 +:105B9000F8F74FF800BDE3F705FC00B5F6E784071A +:105BA0001CD100281AD003681C89062C16D1491074 +:105BB00006D30489A14213D2890044686250704719 +:105BC000490005B508466F467760F8F788F8014642 +:105BD00005BC6F467760F8F72CF800BDE3F7E2FBF1 +:105BE00000B5F6E7840737D1002835D003681C8953 +:105BF000082C05D100B56F467760F8F74BF800BD6B +:105C00001C4601B50846E3F7B9F90146009823465A +:105C100000F002F801B000BDDA6817001CD04F4355 +:105C2000D7407F005B68DB191A88D75A8F420BD0A8 +:105C300002331A88D75A8F4206D002331A88D75AAD +:105C40008F4201D0002070479B185A68D70701D0B7 +:105C500001241047805870476F467760E3F7A2FB36 +:105C60006F467760F8F740FB84073AD1002838D0B8 +:105C700003681C89082C05D100B56F467760F8F7DA +:105C800018F800BD1C4605B50846E3F777F901464C +:105C90000098234600F002F802B000BDDA68170051 +:105CA0001FD04F43D7407F005B68DB191A88D75A53 +:105CB0008F4209D002331A88D75A8F4204D0023358 +:105CC0001A88D75A8F4210D19B185A68D70705D027 +:105CD0001F898F4209D1DA6802241047019B835043 +:105CE00070476F467760E3F75DFB6F467760F8F7C4 +:105CF000FBFA00B50198FFF7D0FE019000BD00B59A +:105D00000298FFF7CAFE029001B40298401002D236 +:105D1000400000F096F8014601BD00B5049840101F +:105D200002D2400000F08DF801B40498401002D275 +:105D3000400000F086F801B40498401002D2400000 +:105D400000F07FF801B40498401002D2400000F047 +:105D500078F8034604BC02BC01BD00B50298FFF709 +:105D60009CFE0290019900BD00B50398401002D23C +:105D7000400000F066F801B40398401002D24000E1 +:105D800000F05FF801B40398401002D2400000F028 +:105D900058F8024602BC01BD820706D1002804D093 +:105DA00003681A89042A00D170476F467760E3F7C9 +:105DB000F9FAC20706D0CA0704D04A1E821801D6D3 +:105DC0001000F04703B56F467760F8F70EF802B0A1 +:105DD00000BDC20706D0CA0704D04A1E821A01D6E7 +:105DE0001000F04703B56F467760F8F710F802B07F +:105DF00000BDC20703D0CA0701D00840F04703B571 +:105E00006F467760F7F7A8FF02B000BDC20703D066 +:105E1000CA0701D00843F04703B56F467760F7F72C +:105E200088FF02B000BDC20704D0CA0702D04840B4 +:105E3000401CF04703B56F467760F7F76EFF02B07E +:105E400000BD401000D3F047400000B56F467760BA +:105E5000F7F745FF00BD42005110884201D1501CA8 +:105E6000F04700B56F467760F7F77CFE00BDC207CC +:105E700007D0CA0705D0401A01DB00207047012077 +:105E8000704703B56F467760F8F7FDF9F8F77CF9CE +:105E9000002802B000BDC20707D0CA0705D0401ACB +:105EA00001DC002070470120704703B56F46776022 +:105EB000F8F70BFAF8F768F9002802B000BDC2073E +:105EC00007D0CA0705D0401A01DD00207047012025 +:105ED000704703B56F467760F8F7C2F9F8F754F9E1 +:105EE000002802B000BDC20707D0CA0705D0401A7B +:105EF00001DA002070470120704703B56F467760D4 +:105F0000F8F7D4F9F8F740F9002802B000BDC2074D +:105F100007D0CA0705D0401A01D0002070470120E1 +:105F2000704703B56F467760F8F7F9F8F8F72CF982 +:105F3000002802B000BDC20707D0CA0705D0401A2A +:105F400001D0002070470120704703B56F4677608D +:105F5000F8F775F8F8F718F9002802B000BDC20785 +:105F600007D0CA0705D0401A01D100207047012090 +:105F7000704703B56F467760F8F7DAF8F8F704F979 +:105F8000002802B000BDC20707D0CA0705D0401ADA +:105F900001D1002070470120704703B56F4677603C +:105FA000F8F756F8F8F7F0F8002802B000BD000046 +:105FB00001000000C05F03000000000000000000BE +:105FC000B036030000000000B0360300150057652E +:105FD0006C636F6D6520746F204D637566726965C3 +:105FE0006E642000000000000000000000000000BF +:10C00000903C002061DC030073DC030075DC03005E +:10C010000000000000000000000000000000000020 +:10C0200000000000000000000000000069C10300E3 +:10C03000000000000000000079DC03007BDC03004E +:10C040007DDC03007DDC03007DDC03007DDC030080 +:10C050007DDC0300000000007DDC03007DDC0300CC +:10C060007DDC03007DDC03007DDC03007DDC030060 +:10C070007DDC03007DDC03007DDC03007DDC030050 +:10C080007DDC0300B3D703007DDC03007DDC03000F +:10C09000C9D703007DDC0300A9F303007DDC0300A6 +:10C0A0007DDC03007DDC03000000000000000000D8 +:10C0B0000000000000000000000000000000000080 +:10C0C00000F002F800F040F80CA030C8083824183E +:10C0D0002D18A246671EAB4654465D46AC4201D1C0 +:10C0E00000F032F87E460F3E0FCCB64601263342B2 +:10C0F00000D0FB1AA246AB46334318476C3600000B +:10C100008C360000103A02D378C878C1FAD85207AA +:10C1100001D330C830C101D504680C6070470000FD +:10C120000023002400250026103A01D378C1FBD853 +:10C13000520700D330C100D50B6070471FB5C04611 +:10C14000C0461FBD10B510BD03F091FA1146FFF7B0 +:10C15000F5FF00F0D3F803F0A9FA03B4FFF7F2FFFC +:10C1600003BC03F0ADFA00000648704502D1EFF3BE +:10C17000098101E0EFF30881886902380078024AFA +:10C1800010470000FDFFFFFF95D40300401E00BFD5 +:10C1900000BF00BF00BF00BF00BF00BF00BF00BFA7 +:10C1A00000BF00BF00BFF1D170470000401E00BFBC +:10C1B00000BF00BF00BF00BF00BF00BF00BF00BF87 +:10C1C00000BF00BF00BFF1D170470000401E00BF9C +:10C1D00000BF00BF00BF00BF00BF00BF00BF00BF67 +:10C1E00000BF00BF00BFF1D170470000056885F3B4 +:10C1F000088846680A4AEFF305839A42304602D11E +:10C20000084CA6463047074C064D0646064FF0B48C +:10C21000034C034D024E024FF0B4044800470000A7 +:10C2200000000000FFFFFFFF00000021F9FFFFFFFB +:10C2300070B505460C46164602E00FCC0FC5103E01 +:10C24000102EFAD2082E02D303CC03C5083E042ECA +:10C2500007D301CC01C5361F03E021782970641C87 +:10C260006D1C761EF9D270BD0A4610B501466648AF +:10C2700003F012F810BD10B502F026FC10BD10B589 +:10C28000624C86B01ECC03946C460EC4002807D0C6 +:10C29000684618DF002803D00022114602F0FCFF98 +:10C2A0000F20800313DF002803D00022114602F084 +:10C2B000F3FF574B48225749092003F051F8002853 +:10C2C00003D00022114602F0E7FF00200490059001 +:10C2D00001206946087404A860DF002803D000220A +:10C2E000114602F0D9FF4C4803F056F8002803D05D +:10C2F0000022114602F0D0FF06B010BD08B5474835 +:10C30000C169B12943D0002445480F214069890300 +:10C31000884204D000221146104602F0BDFF0120E1 +:10C320000007006901218902884204D000221146D9 +:10C33000104602F0B1FF3B4800903B4B0522032121 +:10C34000002001F068FA002803D00022114602F014 +:10C35000A3FF00F015FC00F058FC012500281AD0BE +:10C3600000F062FC002803D00022114602F094FF86 +:10C3700020466840FFF783FF00F038F800F07AFCB1 +:10C3800000280ED00022114602F086FF09E00124A9 +:10C390000021C161B8E720466840FFF770FF00F058 +:10C3A00025F803252D03002C04D1A86800F03EFBDE +:10C3B000002807D100F0F5FB002803D00022114629 +:10C3C00002F06AFFA86800F031FB002806D000F0F8 +:10C3D0001CFC002802D1A86800F0EFFBBFF34F8FD0 +:10C3E00013491248C860BFF34F8FFEE7094A10B5E2 +:10C3F00048321421082002F0B9FE002803D00022A0 +:10C40000114602F049FF10BDEFBEADDEE8F60300B5 +:10C41000C7F203002C2B002077C203000005004068 +:10C42000001000104BDC0300EC2800200400FA058B +:10C4300000ED00E070B5FF4C1E46A06815460229CD +:10C4400002D0042916D108E0052813D1A369002BD6 +:10C4500010D03246294604200BE002280AD1F648C3 +:10C46000406880470320A060A369002B02D03246B9 +:10C4700029469847280003D00022114602F00CFFFD +:10C4800070BD4CB5EB4E0120307005200195009435 +:10C4900000F006FB4CBD10B5E64C2078002801D01A +:10C4A000082010BD206901F0A2FA002803D0002264 +:10C4B000114602F0F1FE0F2100228904206901F0EB +:10C4C00059FA040003D00022114602F0E5FE20468E +:10C4D00010BDD84910B5D7481C3141610221816097 +:10C4E000C1681C3002F007FD002803D0002211466D +:10C4F00002F0D2FE10BD00B589B01822CF4902A8C3 +:10C50000FFF796FE069807990090019102A80FC8C0 +:10C5100000F0C6FA09B000BD00B5C64987B0498829 +:10C520006A4611810321090389680691C2490120E5 +:10C5300050394A6803928A680492C9680591069A3C +:10C540000091019202A90EC900F0AAFA002007B0DA +:10C5500000BD10B588B0182102A802F0C5FF002464 +:10C56000B4480294408869468881B3480799503896 +:10C57000C06806900191009003A90EC9204600F002 +:10C580008FFA204608B010BD00B5AA4987B0498887 +:10C590006A461181A849032050394A6803928A6883 +:10C5A0000492C9680591069A0091019202A90EC9E8 +:10C5B00000F076FA0020CAE73EB5A04A6B46183272 +:10C5C00007CA07C39B4D00246C7029466C801C3140 +:10C5D000684602F044FC002801D0AC603EBD032058 +:10C5E0009449000380681C3148609248944A0021B5 +:10C5F000103001F063F9002803D00022114602F048 +:10C600004BFE0F2100228904286901F0B3F90028AC +:10C6100003D00022114602F03FFE01206C60A860AA +:10C6200000203EBD83498861704770B542688248EA +:10C630001468536891685038D26804604360C260DF +:10C6400081600078440701D5840705D19C0703D198 +:10C650008C0701D1940701D0062070BD5B189A1891 +:10C66000744D0F239B02EA60994207D80321090306 +:10C6700089687723DB02591A914201D20C2070BDE0 +:10C680006D4C7049216070496160C10701D06F48ED +:10C6900004E0800701D56E4800E06E48A060A868FD +:10C6A000012802D00826304670BDFFF7F4FE0600D0 +:10C6B000FAD12168E8688847F5E770B5050004D02D +:10C6C000287A800703D0102070BD0E2070BD594C11 +:10C6D000A068032805D0042801D0052803D008202D +:10C6E00070BD0520A0606868E168860060688019F8 +:10C6F000884204D90020C04360600C2070BDFFF761 +:10C70000CAFE0028FAD1A96832466368606902F05F +:10C71000C2FB0028F2D1616889196160E268914228 +:10C72000ECD0092070BD10B5424C0820616800298A +:10C7300000D010BDA1680429FBD13F486178403882 +:10C7400002F010FC002802D00021617010BD05210C +:10C75000A16010BDF8B5374C0746A068032804D087 +:10C76000042804D008252846F8BD0420A06060688D +:10C77000002801D00820F8BDFFF78DFE0500FAD192 +:10C780007868860060788119402901D90920F8BDB0 +:10C79000294AB968403A1018324602F046FE6078DD +:10C7A00080196070DFE710B5224CA068052813D10E +:10C7B000E168606888420FD10620A060FFF76BFE39 +:10C7C000002808D16069E168406802F005FC002893 +:10C7D00001D10721A16010BD082010BD10B515487A +:10C7E0008168072901D0082010BD006901F0FFF819 +:10C7F000002803D00022114602F04EFD0E4880684A +:10C80000804710BD1CB506200195009400F048F942 +:10C810001CBDF8B51C4617460D46064600F0CEF87E +:10C8200000282AD00120000385421AD9291B301B79 +:10C83000234611E000280020142D0020F8F6030004 +:10C8400083C40300D3C40300F7C4030019C5030065 +:10C8500089C5030053C503001A46FFF7DAFF002815 +:10C860000BD13A462946304600F0B3F8002804D1EF +:10C870003A462946304600F0A1F8F8BDF0B589B037 +:10C88000684600F00BFA049800282AD00121090319 +:10C89000079A4018904226D9501A45081046049A23 +:10C8A0000C468718024668001618001908900320E5 +:10C8B00000038068049988420DD261190846042259 +:10C8C00000F087F800280CD121460422084600F029 +:10C8D00080F8002805D1BA1B2B4630460899FFF78F +:10C8E00098FF09B0F0BD049A079800F072F8F8E7D5 +:10C8F00000B58DB004A800F0D1F9099800280DD03A +:10C90000089800280CD008990B9840180190002135 +:10C910000998009180080290684618DF0DB000BDAC +:10C92000032000038068F1E700B58DB004A800F093 +:10C93000B5F909980028F1D0089800280ED0089978 +:10C940000B984018032100910F2102908903099848 +:10C95000019180080390684618DFDFE70320000399 +:10C960008068EFE730B591B0684600F097F9049819 +:10C97000002814D001210903079A4018904214D9C5 +:10C98000501A43081046049A5C0082180019611876 +:10C9900003242403A468049DAC4202D20E2011B0EB +:10C9A00030BD121AFFF735FFF9E703200CAB07C3C0 +:10C9B000049880080F900CA818DFF0E71FB5032338 +:10C9C00001909008039000930291684618DF04B02C +:10C9D00010BD1FB5012301909008039000930291B0 +:10C9E000684618DFF3E7000010B5BB480368012B69 +:10C9F00002D1022900D10160100003D000221146AB +:10CA000002F04AFC10BD10B5B34C48DF002803D03B +:10CA10000022114602F040FC02F0FCFB20680228D4 +:10CA200003D0032801D00428EFD110BD38B5006829 +:10CA3000401C19D00024684600F058F9009801689D +:10CA4000012910D1818800290AD0C1680320000380 +:10CA50008068002202F0CEFA00998988814201D1D3 +:10CA6000012400E00024204638BD10B504469A4851 +:10CA70002021001D02F0B9F9002803D00022114640 +:10CA800002F00AFC9448002320222146001D02F0F7 +:10CA90001BF9002803D00022114602F0FDFB10BD57 +:10CAA0000FB4F8B5684600F021F96846818B069D01 +:10CAB0000122894CFF238948002D13D0012D17D066 +:10CAC000032D2BD00021022D37D02A46052D46D02C +:10CAD000042D4ED0062A01D104202060F8BC08BCE9 +:10CAE00004B0184781800A9983600260C16010E039 +:10CAF0008180099D089949190A9D4919C160A5219C +:10CB000083600160089901610999856141610B9910 +:10CB1000C16122607148FFF7A8FFDFE700990B6849 +:10CB200003608B888380C968C160AA2181600899ED +:10CB30000161099941610A990BE0009D2E68A52EBB +:10CB400009D00660AE888680ED68C56001618360AB +:10CB500041618161DDE781800360C160F6E700F03B +:10CB600085F9002803D00022114602F095FB03202E +:10CB7000B3E781800360C160009989688160C9E77B +:10CB80000EB557480090202001900120029002F03D +:10CB900001F8002804D150496846091D02F023F825 +:10CBA0000EBD10B5FFF708FD002805D100F02FFBE2 +:10CBB0000446FFF728FF204610BD70B511DF00289E +:10CBC00003D00022114602F067FB464900200B68A3 +:10CBD000444C012180340A4682401A4204D0C506E2 +:10CBE000ED0E0A46AA402260401C2028F3D30324FD +:10CBF0002403A06813DF002803D00022114602F0AE +:10CC00004BFBA06802F0F2F970BD08B5684600F071 +:10CC10006DF800980168A52904D08068AA2801D081 +:10CC2000002008BD012008BD10B5FFF79BFE0028BD +:10CC300003D1FFF779FE00281BD0642001F0F2FD3C +:10CC4000FFF71CFE002803D00022114602F024FB4F +:10CC5000FFF788FE002803D00022114602F01CFBDB +:10CC6000FFF746FE040003D00022114602F014FB39 +:10CC7000204610BD00B589B018221B4902A8FFF755 +:10CC8000D7FA069807990090019102A80FC8FFF7FC +:10CC900007FFFFF7B8FE002009B000BD10B50E4930 +:10CCA00088B0044600232022091D684602F04FF890 +:10CCB0000098206068468088A0800398E060029811 +:10CCC000A06004982061059860610698A0610798AB +:10CCD000E06108B010BD000024280020202D0020B5 +:10CCE000E9C9030000E100E01CF70300014901600D +:10CCF0007047000000FC030008280CD004DC00286A +:10CD000007D006280FD108E00B280AD00C280AD13A +:10CD100005E001207047022070470320704704207F +:10CD20007047042901D0062070470520704770B570 +:10CD300015460A46032823D0042820D1FE4C00299A +:10CD400006D0E088FD49884219D0132176DF10E033 +:10CD5000284602F0A3F9002803D00022114602F071 +:10CD60009BFAE069A8420AD101220321F44801F0AC +:10CD700003F8002803D00022114602F08DFA70BD9E +:10CD800001211046FFF7B8FF02460121EEE7F0B59A +:10CD9000054608790E4685B081070CD0032211465E +:10CDA000284600F0E9FF002803D00022114602F0D7 +:10CDB00073FA05B0F0BDE0490090183102F047F970 +:10CDC000010011D1DC4CB168009AA06902F02DFB82 +:10CDD000009802F097F9010006D120466946183004 +:10CDE00002F09CF9010003D0284600F0AFFAE0E71A +:10CDF00004200190009880080290A069039001A887 +:10CE0000FFF75BFC07000BD0092F10D0A06902F0E0 +:10CE100045F9010002D0284600F098FA3946E3E7C8 +:10CE20003079616940186061A069E061C1E73079DB +:10CE300061694118616160780028BAD06089401E3C +:10CE40000004000C6081B4D1284601F0E9F8002804 +:10CE500003D00022114602F01FFA20896081A8E762 +:10CE600010B50022114602F017FA10BD10B5B24CF1 +:10CE700001202070E088B149884208D0132176DF74 +:10CE8000002810D00022114602F006FA0BE0A0782C +:10CE9000002808D074DF002803D00022114602F0D9 +:10CEA000FBF90020A07001F034FC002803D0002220 +:10CEB000114602F0F1F9002010BD70B50D6804466E +:10CEC00001209D4A2B0002F002FC0A2B304306137E +:10CED00020575C466012FFF766FC0421FFF70CFF49 +:10CEE000024604212EE00022114602F0D5F970BD61 +:10CEF000FFF7BCFF002803D00022114602F0CCF956 +:10CF0000FFF76CFC002808D170BDFFF7AFFF0028C9 +:10CF100003D00022114602F0BFF9FFF773FC70BD89 +:10CF2000106188680078107170BD022010618868F7 +:10CF300000780128F8D1FFF7F6FB0221FFF7DCFEAD +:10CF400002460221204600F017FF0028CBD170BD19 +:10CF50000320106170BD12692046012A06D0022A02 +:10CF600007D0032AF6D1FFF712FF70BD00F001FAD7 +:10CF700070BD00F03BFA70BD507088881081508100 +:10CF800070BD00205070108170BD2046516901F0C5 +:10CF900010F8DAE710B5044669488EB08179684622 +:10CFA000817068490180342101A802F09DFA0220B5 +:10CFB000019000216846417284720121018205902E +:10CFC000002101A801F03FFA002803D000221146F9 +:10CFD00002F062F90EB010BDF0B5574C8BB0A078DE +:10CFE00000283AD156481821183802F07DFA204618 +:10CFF000534CC078183C00250126002837D027461E +:10D00000483700950195029510226946F81D039551 +:10D0100002F0DEF9002822D0F81D08900997684632 +:10D02000067509A804906846067708A806900420AB +:10D03000FFF7B0FF25700220207204A8E0602820CE +:10D0400020823F486582183873DF002803D0002211 +:10D05000114602F021F9384886700BB0F0BD05206A +:10D06000FFF798FF2670676025722582E9E70620A2 +:10D07000FFF790FF257065602572E0E770B52E4CD4 +:10D0800001880022E588A6B017290AD01EDC1129E4 +:10D090003FD008DC022977D0102902D18088E080B7 +:10D0A000A27026B070BD264C30342646183613299F +:10D0B00051D01429F5D1C289638D00219A4200D143 +:10D0C000314600238088E21D82DF1BE0512970D0A9 +:10D0D0000EDC18296CD01929E3D180790028E0D121 +:10D0E000A270E068401EE0604FD0FFF775FFD8E700 +:10D0F000522976D05529D4D180790028D1D1132155 +:10D10000284676DF0028CCD00022114602F0C4F871 +:10D11000C7E78020694688803220E060012301AAA9 +:10D1200006A92846AADF002803D00022114602F0F3 +:10D13000B3F82078002807E030280020FFFF000027 +:10D14000582D00203015000001D1FFF745FF0020C9 +:10D15000C043E080A5E70722C14910A802F065F9A5 +:10D160001022E11D0CA802F060F91C22314612A821 +:10D1700002F05BF90CA80A9012A8099006ABB94A14 +:10D18000852128467FDFBDE70DE01822B64906A8B5 +:10D19000FFF74EF80A980B990090019106A80FC866 +:10D1A000FFF77EFC7DE70021284667DFAAE700E065 +:10D1B00017E0817900299AD0807A042803D00628C4 +:10D1C00001D0052893D1022909D0012069460872AF +:10D1D000FF208330888102A92846A8DF92E7022039 +:10D1E000F4E700F08DF88DE710B5044601F0C2FABF +:10D1F0009B482146303800F09AFE2046FFF73EFF5C +:10D2000010BD10B50022114602F046F810BD30B531 +:10D21000944D87B00024203D2C7094482C6102F07E +:10D22000B3F800286AD19248FFF7FCF901F000FF3B +:10D23000002863D18A4800F059F9002801D1012063 +:10D24000E87011206946087207228AA102A87CDFD3 +:10D25000002803D00022114602F01EF800940C2191 +:10D2600068460194018018214180FF21848091311A +:10D27000C1807ADF002803D00022114602F00CF8AA +:10D2800004206946009408807C4801907C48029004 +:10D290007348303800F00BFE002803D000221146FE +:10D2A00001F0FAFF1C21684602F01EF97548019052 +:10D2B0000120800302900094032168460173C48119 +:10D2C0000474714806900594684601F0FEF9002840 +:10D2D00003D00022114601F0DFFF6249E122087805 +:10D2E0004008400010400C30DF221040087007203A +:10D2F000487010208870FFF76FFE002007B030BD27 +:10D3000070B5584C614D203CE088A84201D10820FE +:10D3100070BDE178002914D051490123082234312D +:10D32000A9DF0028F4D12A460C21E088A7DF58495C +:10D33000884204D0082802D0891C8842E8D1002005 +:10D3400070BD00231A461946A9DF70BD10B50A4604 +:10D35000044603211046FFF7CFFC02460321204676 +:10D3600000F00AFD002803D00022114601F094FFCE +:10D3700010BD30B5054687B00020009001900290A6 +:10D38000039038486A46203800791070364A0C3AC3 +:10D3900010689268049068460692059008790C28F7 +:10D3A00006D003221BE00022114601F075FFA5E71D +:10D3B0008C68204600F049F80190201D00F045F8E7 +:10D3C00002902046083000F040F8039004A8FFF7D0 +:10D3D0002CF9002892D00121FFF78EFC0246012192 +:10D3E000284600F0C9FC0028DDD187E7FEB50446D9 +:10D3F000087982070ED08207920F04239B1A00221D +:10D40000154604E08E683554401CC0B2521C9A4246 +:10D41000F8D308710120009088680290087980088C +:10D4200001906846FFF796F900280DD00221FFF71A +:10D4300063FC02460221204600F09EFC002803D037 +:10D440000022114601F028FFFEBD10B5044602F08F +:10D450004DF80002E178000A0906084310BD0000FB +:10D46000882D00205028002040F70300E9D1030058 +:10D470002FCD03004466755461726700BBCE030074 +:10D4800003D20300CD0C000061CE0300FFFF0000BB +:10D490000230000010B50C46002802D001200860C0 +:10D4A00010BD2168002911D01C48421A814212D0B7 +:10D4B0003C2A0DD23C303C3101220B7803701346DC +:10D4C000491E401E521C3C2BF7D904E00E200BE0F5 +:10D4D0003C2201F0AAFF00223C21104801F08AFD05 +:10D4E0000E49891E08800020206010BD70B50546D9 +:10D4F00000223C21094801F07DFD084CA41E218832 +:10D50000884201D00B2070BD3C220449284601F01E +:10D510008CFF2088401C2080002070BD823F0020AE +:10D520008307FF22DB0E9A408907090E99400028E5 +:10D530000BDA0007000F08388308FA489B001B1815 +:10D54000D86990430843D86170478308F6489B0028 +:10D550001B181868904308431860704770B5012481 +:10D56000F24960040860F24940108860F04940398F +:10D570008860F04D6C602F20FEF708FEAC60EE4D29 +:10D5800000242F206C61FEF701FE2C7170BDF0B5F8 +:10D59000E94F2821BC6841430D1939694A1C09D05B +:10D5A00028224A431619AB68B268934204D8D21AAB +:10D5B000B26069623861F0BD0A4602E00A46796AE3 +:10D5C0009B1B4E1C0BD028264E433719BE689E422B +:10D5D000F4D328264E433619B768FF1AB760AB60FC +:10D5E000696228214A4311194862F0BD70B5D24CD6 +:10D5F0002269A5681346114606E0814207D00A4613 +:10D60000282671434919496A4E1CF6D170BD002E77 +:10D61000FCD08A420CD1282043435819406A20612B +:10D62000401C05D1C34B01209860002363616071E9 +:10D63000282041434819282381685A43406A5219D7 +:10D640005062421CE2D0282250434019826851188F +:10D65000816070BDF8B5B84C2569681C35D0B748F5 +:10D66000002640686169401A07023F0A19E0282035 +:10D670004543A0682A189068B84214D8A3693F1A95 +:10D680008619556A002B09D0116AD069984700287D +:10D6900007D00022114601F0FFFD02E0D169106AB7 +:10D6A0008847681CE3D1A178E078814206D1401C0C +:10D6B000C0B2E070022801D10020E0709E4900064F +:10D6C000800D1C310E5000F0BAF9F8BDF8B50446D3 +:10D6D000994800270169009146785CE09648F1007E +:10D6E000C2688D1851E0601C07D0934A28209268C8 +:10D6F000604321468018446A24E028781821414379 +:10D700006A68401CC0B252182870A978884200D1BB +:10D710002F70894B516828209B684843C0181368B4 +:10D72000012B34D1037E002B31D19368C360D368C1 +:10D73000036113694361526902627F4A5279002A88 +:10D7400000D0C7607C4BC2685B6996469C46D31A82 +:10D750001A027B4B120A9A4202D20369D21808E0DD +:10D76000724663469A1A12020369120A934202D958 +:10D770009A1A826000E08760C76001220761027622 +:10D78000921E42620846FFF702FF601CABD1287868 +:10D7900069788842A7D13046761EF6B200289DD11E +:10D7A000654801690098814201D00120F8BD002040 +:10D7B000F8BD64490020086048608860C86061491D +:10D7C00040390860486045E7FEB50020C0435A4D27 +:10D7D00002906869019068462E6900F035F90746A5 +:10D7E00000F04FF90446002F08D002AA01990098D2 +:10D7F00000F08FF90298FFF769FF06E00298FFF743 +:10D8000065FF002801D1002C02D0304600F0AAF9B3 +:10D8100000206871FEBDFFB59807002481B01E4648 +:10D8200015460F4600280BD1002E09D0FFF796FEB3 +:10D8300041490A9888610F70324600208E6008E0E6 +:10D84000072005B0F0BD28234343D4509B181C7615 +:10D85000401CB842F7DB28204743BB19032048701F +:10D860000F461846CB6019461830002218232E4662 +:10D870005E43D3005B181C705C709D70586030185C +:10D88000521C032AF5DB0020C0433861BC70FC70D9 +:10D8900001242D482405046003211420FFF740FED5 +:10D8A000224880380460254C0198A0600321112093 +:10D8B000FFF736FE606878610020C2E770B51E4C45 +:10D8C000A568002D06D0002A06D0002804D0002329 +:10D8D000247809E0082070BD072070BD28265E432B +:10D8E000AE59002E04D05B1CA342F7DB042070BDB0 +:10D8F000282401265C432E516419E26161600360B3 +:10D90000002070BD07494868C005C00D2CD01038F4 +:10D910001CD50207120F083A920892005118C969E3 +:10D9200019E0000000ED00E000E400E080E100E02C +:10D93000401301400010014058280020001501400C +:10D94000FFFF7F004011014080E200E08108B14A02 +:10D950008900891809688007C00EC1400806800F39 +:10D96000012803D0032803D002207047002070470D +:10D9700001207047FEB50446A748174682680D4649 +:10D98000002A0CD001788C4201D2052D01D207204B +:10D99000FEBD2146282359435358012B01D00820AE +:10D9A000FEBD8818406801281DD00026FFF7AAFF99 +:10D9B000C00099490190C9684018694600F018F9FB +:10D9C000002812D001214460016094494968083060 +:10D9D000E2C091490198C96841180098487000F068 +:10D9E0002EF80020FEBD2E46E0E70420FEBDF8B56F +:10D9F000894D0446A868002809D029788C4201D3B3 +:10DA00000720F8BD282161434058012801D0082093 +:10DA1000F8BDFFF777FFC600E8686946301800F0E8 +:10DA2000E7F8002809D0022112C0E86831180098F0 +:10DA3000487000F004F80020F8BD0420F8BD012073 +:10DA4000774900050860704710B5734900238A784C +:10DA5000CC78A24212D0521CD2B28A70022A00D1D3 +:10DA60008B708A786C4B92001C339A58026048691C +:10DA700010180002000A4861012010BD0360002058 +:10DA800010BDF8B5644801690091457833E06248FB +:10DA9000E900C0680E1834782AE0182060437168E5 +:10DAA000641C0818B178E4B2A14200D100240168D6 +:10DAB000022902D003291BD113E0574A40682821CC +:10DAC000926841438F18397E002911D0FFF78EFDEF +:10DAD000002038760CE028277843C0180276406A88 +:10DAE00003E04D4900228B680869471CF3D10861A7 +:10DAF0007078A042D1D128466D1EEDB20028C6D163 +:10DB0000454801690098814201D00120F8BD0020FC +:10DB1000F8BDF7B5404C0025A76823691EE0282111 +:10DB20005943C9198E68864202D9301A886017E0B5 +:10DB3000801B751900268E600E764E699C464B6AD6 +:10DB4000B646002E0AD0019E76193602360ACE60FD +:10DB500076460E6116684E6261461160591CDED130 +:10DB60002361FEBDF8B52C4801694A1C3DD028222E +:10DB70005143826889188E6828494C684769007942 +:10DB8000E11B0D022D0AED1C002815D10120254AAC +:10DB900000045060234A403A5060214940008031DF +:10DBA0000860214908602149012008602F20FEF704 +:10DBB000EDFA194901200871B54200D23546E8193D +:10DBC00000021649000A4031086014494968001BE8 +:10DBD000091B0902090A0002C91C000A814203D973 +:10DBE00001200F4940040860F8BDFFF7B7FCF8BDFD +:10DBF00042788378521C934200D1002203789342EA +:10DC000001D1002070470A604168407818225043D3 +:10DC10000818704700E400E0582800200015014073 +:10DC200000E200E04013014000E100E0001001408C +:10DC300010B50446082904D000221146104601F010 +:10DC40002BFB21686068884710BD1CB501910090CE +:10DC5000024A0821684601F09DFA1CBD31DC030030 +:10DC60000A48026803210A430260094880470948BC +:10DC70000047FEE7FEE7FEE7FEE7FEE7FEE70000FF +:10DC800005480649064A074B704700002405004036 +:10DC9000A9DC0300C1C0030090300020903C0020AC +:10DCA0009034002090340020F8B500F035F82B4E69 +:10DCB000002804D02A4870602A49F01388612A4855 +:10DCC0000124018CC9B201290DD1818C09070AD127 +:10DCD000018D0906090F042905D1808D0006000F6A +:10DCE00001D1224884600027B461214D6F60A805EE +:10DCF0008460686800280ED1C820FEF757FA1D48D6 +:10DD00007F1C8742F5D30020B0610120800784602A +:10DD100068680028FCD0F8BD1348018CC9B20129FD +:10DD200017D1818C090714D1018D09060A0F03D17F +:10DD3000828D1206120F0ED0090F012903D1828D98 +:10DD40001206120F07D0032903D1808D0006000FA1 +:10DD500001D00020704701207047000000050040FE +:10DD6000DFFF07C0006C0040C00F00F0000600405D +:10DD7000000100408813000030B585B0002822D093 +:10DD80000388FE4CA34220D0FD4B1B78002B1CD0F7 +:10DD9000FB4B10255B1C1D705970002401259A70E7 +:10DDA000032269460A820094019402940394028A31 +:10DDB0000A808D708C8004A90291039300886946C3 +:10DDC000A6DF05B030BD0E20FBE70820F9E7F0B56F +:10DDD0008BB004460227684607730026099687849D +:10DDE000C68408A80A900D46A18A208809AAA5DF42 +:10DDF000002804D0E16A00291AD0884718E0684654 +:10DE0000008CC007C00F13D068460682208803A983 +:10DE1000A8DF002813D1A97E28461B3001220B0061 +:10DE200001F055FC09430F1B202224263E28430005 +:10DE3000FF20FE3069460882208803A9A8DF0BB0C6 +:10DE4000F0BD00960AE0062219E069460A710290C8 +:10DE500022E0204690470020F1E700922B8B022B16 +:10DE6000F3D2F0E700971DE003201AE0042018E049 +:10DE7000052016E0298B032905D20322082120461C +:10DE8000FFF77AFFDBE74178027808021043694622 +:10DE9000888003D006200090A26ADAE70720FAE71C +:10DEA000092000906946A26AD3E70322E7E730B56C +:10DEB00085B00D46040038D0002D36D068680028A3 +:10DEC00033D00020C043AF4B20800FCB049301AB75 +:10DED00007C3AD4869460880891C01A863DF002894 +:10DEE00022D1221D69460120A0DF00281CD16846EE +:10DEF0008078A071204600F0CEF8002814D120468A +:10DF000000F055F900280FD12946204600F002F90B +:10DF1000002809D16868A062A868002800D0E062E3 +:10DF200097490120087000204BE70E2049E73EB5D5 +:10DF3000002828D0002926D0826A002A23D00A8807 +:10DF4000102A21D0112A30D0502A1FD0512A1AD19C +:10DF500004460846891D0A78022A14D14A88238A71 +:10DF60009A4210D1807A04280DD006280BD00528BB +:10DF700009D0891C2046FFF72AFF002803D0E16A58 +:10DF8000002900D088473EBD898810E0CA880389EF +:10DF90009A42F8D1082200928A7F6B461A7120318A +:10DFA0000291826A694690473EBD0021C9430180C3 +:10DFB0003EBDF0B585B00A4605002DD028886F49D2 +:10DFC00088422BD06E480078002827D06C4C102057 +:10DFD000641C2070072060700127A7700321684629 +:10DFE00001820026E11C104600F04CF8014668460C +:10DFF000008A0918684601820096019602960396E7 +:10E00000298A01808770868004A80394029028885A +:10E010006946A6DF05B0F0BD0E20FBE70820F9E752 +:10E02000F0B585B00A46050028D0288853498842B3 +:10E0300026D053480078002822D0514C1120641C6F +:10E0400020700127684607820026611C104600F0F8 +:10E0500019F801466846008A091868460182009648 +:10E06000019602960396298A01808770868004A80B +:10E070000394029028886946A6DFCBE70E20C9E703 +:10E080000820C7E70870020A4A70020C8A70000E66 +:10E09000C8700420704730B58FB005461C21684613 +:10E0A00001F022FA6946087804210843694608709D +:10E0B000002401940394049405940694A87908A973 +:10E0C000887031486946801C0884601C00070794EA +:10E0D000000F0C77103048778A7FF9200240921C9D +:10E0E000E7200240012002438A77142109A801F0A9 +:10E0F000FBF908A8099007A80A9069468C851420A6 +:10E10000CC8508860D942B46A888083309AAA2DF7F +:10E110000FB030BDF0B58FB00F4605461C216846E4 +:10E1200001F0E2F9684601780226314301700024CB +:10E1300001940394049405940694A97908A8817025 +:10E1400011496846091D0184601C0107090F10313F +:10E150006846079401770020014668464177817F31 +:10E16000F9200140891CE720014001200143684655 +:10E170008177142109A801F0B7F907E0FFFF00003B +:10E180008028002058F703003015000008A80990E7 +:10E1900007A80A9068468685C48506860D972B4693 +:10E1A000A888203309AA6946A2DF0FB0F0BD30B5B8 +:10E1B0008FB005461C21684601F096F9694608783B +:10E1C0000821084310221043694608700024019476 +:10E1D0000394049405940694A87908A988701448B7 +:10E1E00069460884601C00070794000F0C77103004 +:10E1F0004877887FF9210840801CF72108401043A8 +:10E200000121084369468877142109A801F06CF9B7 +:10E2100008A8099007A80A9069468C851720CC8524 +:10E2200008860D942B46A888103309AAA2DF6FE751 +:10E2300031150000FFB583B0074600200C9C8646D0 +:10E24000267805463AE07868A90041180A886846A9 +:10E2500082804988C1800022694601A865DF0028C4 +:10E2600010D1684601780598814226D17046002871 +:10E2700001D0002200E002222078891841181F29CD +:10E2800002D90C2007B0F0BD7146002908D1401C0E +:10E29000C0B2411C069B049A21701A540120864684 +:10E2A000217806980A18694601A865DF0028E9D197 +:10E2B000694620780978401820706D1C3888A8427B +:10E2C000C1DC7046002804D020780699801B401ECF +:10E2D00088550020D6E7F8B51546069C1E46074629 +:10E2E00002220094FFF7A6FF002806D13346102231 +:10E2F000294638460094FFF79DFFF8BDF7B582B078 +:10E3000000260546167000681446002805D02846E9 +:10E31000039900F0CAF8060008D1687900281ED0D9 +:10E320002078039F001D1F2802D90C2005B0F0BDE6 +:10E33000684679DF0028F9D121780322481C207033 +:10E340007A5421781922481C20707A542078C119F7 +:10E350006846008800F0A4F8217840182070A87959 +:10E360000223002810D02078039A411C21701354F6 +:10E3700020780399471C012227700A542078AA7933 +:10E38000471C039927700A54A868002815D000215B +:10E39000415620788C460246C01C03991F28C4D8D9 +:10E3A000501C20708B5422780A23501C20708B54F0 +:10E3B00020786246431C23700A54A889002809D09B +:10E3C00028460094062202210C30039BFFF783FFAE +:10E3D0000600ABD1A88A002809D02846009407225D +:10E3E00003211430039BFFF776FF06009ED1A88B14 +:10E3F000002809D028460094152214211C30039BC4 +:10E40000FFF769FF060091D1686A002805D022460F +:10E41000039900F07FF8060088D1A86A002805D08B +:10E420002246039900F0B5F8060084D13020405D03 +:10E43000002806D022462846039900F0DCF80600A2 +:10E44000C7D1304672E770B50C4692B000216A46DB +:10E45000117007251171002809D0817949070CD561 +:10E4600002A9FFF74BFF002808D102AE00E000260A +:10E47000002C0ED0A079002802D0284612B070BD22 +:10E4800001AA0AA92046FFF739FF0028F6D10AAAF7 +:10E4900000E00022684603790178304672DFEDE73C +:10E4A0000870000A487002207047F8B514780746D3 +:10E4B000A01C15460E461F2803D83879801C1F283B +:10E4C00001D90C20F8BD1D20001B80B2694686468C +:10E4D00008803019801C7DDF0028F3D138680228BD +:10E4E00005D168460088704501D8092107E03879D0 +:10E4F0000821002801D0704501D968460088421CD7 +:10E500003255641CE2B2B1542978801C0818287076 +:10E510000020F8BDF8B50D4611780646881D144652 +:10E520001F2801D90C20F8BD33880720062BFAD309 +:10E530001927FF01BB4202D94D4A9342F3D1728899 +:10E54000062AF0D3BA4202D9494FBA42EBD1484F1A +:10E55000BB4203D0BA4201D09342E4D8481C052202 +:10E5600020706A5420781222411C21702A5420788D +:10E5700041193088FFF794FF21784018C0B220700D +:10E5800041197088FFF78CFF217840182070002017 +:10E59000F8BD70B5054600790E46801C1446C0B221 +:10E5A0001178821C8A181F2A01D90C2070BD0A46D6 +:10E5B000491C401C2170B0542078FF22411C21705E +:10E5C0003254207881192888FFF76AFF2178401893 +:10E5D000C0B22070AA88002A09D0A968002908D0F2 +:10E5E000801900F022FF207829794018207000203F +:10E5F00070BD072070BDF7B582B002981446C06A9E +:10E600000F46002832D0029800252030009028E0E4 +:10E610000298C16A0C2068430E18217830794A1C90 +:10E62000C01C2270785421781622481C20707A541D +:10E630002078C1193088FFF733FF21784018C0B225 +:10E640002070B288002A09D0B16800290ED0C01904 +:10E6500000F0EBFE20783179401820706D1C009896 +:10E66000EDB2007CA842D3D800205FE607205DE62B +:10E67000FFFF000038B56749674A488890420FD0CD +:10E680004A78664C521CD2B24A70237B934208D31C +:10E69000083175DF002803D0A169002900D0884720 +:10E6A00038BD00254D70217C002907D03B2176DF45 +:10E6B000002803D0A169002900D08847616900299A +:10E6C000EED068460095884738BD70B505460146CE +:10E6D0001C225248FDF7ACFD4E4C002626702968DE +:10E6E000002907D00822A01800F09FFE204608301D +:10E6F0007ADF02E0474808307BDF002808D1401E5F +:10E70000608044486670464A0021001DFFF7D6F835 +:10E7100070BD10B53F484068FFF769F910BDF8B506 +:10E720003C48103000F069F800263A4D3B4C002878 +:10E7300006D06169002919D001200090684614E0D4 +:10E740002878002804D0616900290FD00096F5E7E9 +:10E75000687800280CD0A16800226868FFF70AF9E1 +:10E76000002803D0A169002900D088472E70F8BD89 +:10E770006168F1E7F8B5294C02880027254DE68944 +:10E78000102A18D029464968112A21D0122A2DD0E2 +:10E79000502A0FD1801D0288B2420BD1028B022A6F +:10E7A00008D1C27E837E10021843C007C00F13D069 +:10E7B000FFF7B5FFF8BD818869800146154808223A +:10E7C0001631103000F031FE6F70002EF0D0F8BD21 +:10E7D0000020C04368806F700846FFF708F90028E2 +:10E7E000F5D0A1690029F2D08847F8BD811D0948FC +:10E7F0000822103000F019FEDAE741880548083099 +:10E800000288914204D34088814201D80120704798 +:10E810000020704788280020FFFF0000C42D002042 +:10E8200075E6030031B5054C04E0401E009020461B +:10E83000FDF7CCFC00980028F7D138BDE7030000B5 +:10E8400018225043FE4A0021801801718160416105 +:10E85000012281610261C1607047FFB581B0F94C4E +:10E86000049B039A054626691A4303200092002E52 +:10E8700003D1002A0ED0012222612769039A0126C2 +:10E88000360792003B0000F022FF072707162940B9 +:10E89000526127000222EFE77069326992B2504359 +:10E8A000326933691204920C9BB2594329DF002864 +:10E8B00012D102210FE0084628DF00280CD103996D +:10E8C000002901D0032106E00499002916D12978F6 +:10E8D000042946D017E0216105B0F0BD70693269A6 +:10E8E00092B25043326993B24B4301461846039AA1 +:10E8F00029DF0028F0D10499002901D00421EAE79A +:10E900002978042920D00521E5E773693069366943 +:10E9100080B2434368681B189B18B6B24E43301848 +:10E9200080181946049A29DF0028E9D0D4E7306915 +:10E9300080B24843696880188A08696929DF00281D +:10E94000CAD1009900290CD00621C4E77069316949 +:10E9500089B24843316989B200F0D9FD28DF002827 +:10E96000BAD10721B7E7F8B5B54918230A780F20BF +:10E970005A435418241DB34922782669CF68022AC5 +:10E980001BD001252D07042A2AD0052A5BD128692E +:10E9900081B2304600F0BBFD0146A36828699A1990 +:10E9A00080B24843101A82086068181886192869CE +:10E9B0004B1C80B25843801B34E0B8026268616926 +:10E9C000121A0918A3683018181801239B029A42DA +:10E9D00002D2920829DF31E0FF22013229DF2DE047 +:10E9E000E268974914205043F4314018001D0BC8C9 +:10E9F000B04203D160685943814218D0022A16D030 +:10EA0000286981B2304600F082FD0146286980B253 +:10EA10004843301A820828694B1C80B25843636807 +:10EA20009B19C01A83082046FFF717FF06E02869E4 +:10EA300081B2304600F06BFDC01928DF002802D1FA +:10EA40007F4901228A70F8BDF8B57D4C069E657835 +:10EA50000A2D1DD027787D19EDB20A2D01D30A3D6C +:10EA6000EDB218277D432D192871AA6103C9EE6004 +:10EA7000AB6069612861A1780020002904D1FFF70B +:10EA800072FF112800D100206178491C6170F8BD27 +:10EA90000420F8BD38B50246694818230178594367 +:10EAA000081803690179022B0AD014246343644CCB +:10EAB000F434E4588368009383691030A04738BD6C +:10EAC000604B14331C68F5E7F8B55D4B9978012964 +:10EAD00014D100255B499D700A69082A05D00228D7 +:10EAE0000FD003280AD10D2006E0022807D00D70B0 +:10EAF00000F025FA002801D0FFF7CCFFF8BD0D612A +:10EB0000F6E74F48182403784E496343CC68181839 +:10EB1000641C001DCC600378022B05D14668A1025D +:10EB2000B14201D3012700E00027052B01D1072ABC +:10EB300003D00021042B02D003E00121FAE7072AC9 +:10EB400003D00026042B02D007E00126FAE7406834 +:10EB5000A302834201D3002A1AD00020314301438B +:10EB60003943C5D0374E28463561FFF793FF344C03 +:10EB70002078FFF765FEF5606078401E60702078B1 +:10EB8000401CC0B220700A28B2D30A382070AFE708 +:10EB90000120E3E770B500252A4C2948E56025618E +:10EBA0000570457085702E463046FFF749FE761C8D +:10EBB0000A2EF9D3012212076560516928461269AD +:10EBC000491E92B25143E560A1601D49F4310D60C8 +:10EBD0008D600D61CD601B4914310D60888001216D +:10EBE0002170206170BDF8B5164A044610780E46B3 +:10EBF000002830D0002C30D0002E2ED020680028E5 +:10EC00002BD0012000076768016989B28F4228D89C +:10EC1000102F26D3A168002923D095687943436932 +:10EC20004A19006980B243439A421AD8012000076A +:10EC3000006980B2814212D901200007006903E017 +:10EC4000E02D0020A028002080B2394600F05FFCB3 +:10EC5000002906D103E00820F8BD0E20F8BDB80752 +:10EC600001D00720F8BDBD49486801281CD00F46D7 +:10EC70001421BB4A21C641438E1875602368535046 +:10EC80006168B160A168F160A268616800235143C6 +:10EC9000012212075B1C14699BB2A4B28C4205D2FC +:10ECA0001469A4B2091B02E00420F8BD0021146914 +:10ECB000A4B265191469A4B28C42EBD9BD60401CA2 +:10ECC000336178600020F8BDF8B50446A3481E46BD +:10ECD000007815460F46002807D0002F07D0002CDB +:10ECE00005D02068002817D103E00820F8BD0E20C9 +:10ECF000F8BD9B48016800290ED0C2688168406851 +:10ED00004A4310186268904206D9002D04D0A942E7 +:10ED100002D3A819884201D90720F8BD384600F06F +:10ED200008F9002811D0304600F003F900280CD073 +:10ED3000606800F0FEF8002807D02B463A462146CE +:10ED400002200096FFF780FEF8BD1020F8BDFFB549 +:10ED5000824881B000781F4616460D46002808D02C +:10ED6000002D08D00198002805D02868002817D168 +:10ED700003E00820B0E50E20AEE5794C20680028BD +:10ED80000ED0E168A0686268414389186A689142C0 +:10ED900006D9002E04D0B04202D3F119814201D924 +:10EDA000072099E5019800F0C4F800281BD03846E8 +:10EDB00000F0BFF8002816D0686800F0BAF8002804 +:10EDC00011D068683246C119019800F02EFB0096F8 +:10EDD0002868142148432458002203212846019B17 +:10EDE000A047002078E5102076E5F8B505465B4899 +:10EDF0000F460078002805D0002D05D0286800288F +:10EE000021D103E00820F8BD0E20F8BD544C0026A7 +:10EE10002068002817D0A168E0684843616841185D +:10EE2000686881420FD900F084F800280DD0296865 +:10EE300014225143091968684A688968801A00F0E9 +:10EE400066FB002903D00720F8BD1020F8BD3B4623 +:10EE50000022294604200096FFF7F6FDF8BD3F4A40 +:10EE60001278002A0DD000280DD000290BD002689E +:10EE7000002A08D0394A14321368002B05D0042028 +:10EE80007047082070470E20704702230B6000680F +:10EE9000106000207047F8B5044630481E460078E0 +:10EEA00017460D46002807D0002D07D0002C05D0AE +:10EEB000206802281BD103E00820F8BD0E20F8BD11 +:10EEC000264814300068002811D0084600F031F8B8 +:10EED00000280ED0304600F02CF8002809D03B4620 +:10EEE0002A46214602200096FFF7AEFDF8BD072016 +:10EEF000F8BD1020F8BD08B5184A1278002A05D0D0 +:10EF0000002805D00268022A11D103E0082008BDBC +:10EF10000E2008BD114A14321268002A07D00B4691 +:10EF20000022014604200092FFF78EFD08BD072055 +:10EF300008BD800701D000207047012070470849B4 +:10EF400010B5F43949780020002906D0FFF70BFDF1 +:10EF5000002802D0112800D1002010BDA0280020D8 +:10EF6000D42E002070B500250C290ED3044643187A +:10EF7000008941000919581A0A38C2B21748022AF2 +:10EF8000027002D30A318B4201D2092070BD1448AD +:10EF900000F04BFA134914480A88824202D02388B1 +:10EFA000934217D14988814202D06088884211D1AA +:10EFB0000D4A0323521E20891B03A8420AD9690067 +:10EFC00009194989914203D09E896D1CB142F4D13F +:10EFD000002070BD0B2070BD00207047BC280020B1 +:10EFE000E82E002080100010FFFF000010B5FDF794 +:10EFF000FDF810BD10B50446002A02D0108800228A +:10F0000010E00A48FBE7030A00020343A05C5840F3 +:10F0100003061B0F43401803584083B21806C00C68 +:10F020005840521C8A42EED310BD0000FFFF000082 +:10F030004B48002101704C484A4A02608160C1601F +:10F04000016108224161426081610846704710B544 +:10F0500000291DD000220A60434A5368002B1BD0B0 +:10F06000202817D85B1E5360D0682423401CD06032 +:10F07000106914684343E3180B60012383409169CE +:10F08000401C19434007400F91611061002010BDE2 +:10F090000E2010BD0C2010BD042010BDF0B5324A6A +:10F0A0000646916800292BD057691020791A490724 +:10F0B000490F14680B4624254D436519B54206D106 +:10F0C000012495698C4065400020956104E0491C4D +:10F0D0004907490F8F42EED1491C4E07760F9569BB +:10F0E00001210C469C402B4623420AD19368002BF9 +:10F0F00007D05B1E936053685B1C53603346F0E798 +:10F100000420F0BD184A2423117C1268491E4907C7 +:10F11000490F5943203150500020704770B50028E6 +:10F120001AD0002918D0104AD368002B16D05B1EC5 +:10F13000D360936824265B1C9360536915681C4652 +:10F140007343EE1820330660E858641C08606007BB +:10F15000400F5061002070BD0E2070BD042070BDB6 +:10F16000BD280020F42E00201430002030B5CB0044 +:10F1700008339DB293070024002B01D0072030BD37 +:10F180003B4B9A605219DA605C701C705880998011 +:10F19000002030BDF7B5364C0E466088814237D826 +:10F1A000344F00F069F822786078A188884201DA4B +:10F1B000401C00E00020C0B2904202D100F062F892 +:10F1C00024E065786078884201DA401C00E0002085 +:10F1D000607000F057F8BD4218D0A068EF000299A7 +:10F1E000C151009900290CD0002E0AD06088324607 +:10F1F0004543E068281800F018F9A06838188680A0 +:10F2000002E00021381881800020FEBD0420FEBDF0 +:10F210000920FEBD0EB504E068468188029A009878 +:10F22000904702AA01A9684600F003F80028F3D02D +:10F230000EBD70B50E4B05241D785E78AE4215D01C +:10F240001D781C789E88B44201DA641C00E000241A +:10F250001C705C88DE686C43A41904609B68E8003D +:10F26000C418A4880C80185800241060204670BD73 +:10F27000C4280020FFFF000072B606480168491C40 +:10F280000160704703490868401E086000D162B6FB +:10F2900070470000D4280020BFF34F8F0349024875 +:10F2A000C860BFF34F8FFEE70400FA0500ED00E0F1 +:10F2B00010B5002904D0002211461046FFF7ECFFDC +:10F2C00000F010F810BD10B50021024A0846FFF703 +:10F2D00061FF10BDB1F2030010B508461146FCF7FE +:10F2E000C3FF10BDF8B5384C2078002837D020690E +:10F2F000002807D00026E068002805D00025002E51 +:10F3000004D013E00126F6E70125F8E7684651DF4F +:10F31000052806D0002806D000221146FFF7BCFFC2 +:10F3200004E0012602E0216900988847002D12D1EF +:10F33000608869460880A06861DF052806D000283B +:10F3400006D000221146FFF7A7FF04E0012502E0E6 +:10F35000E168A0688847002ED8D0002DCFD0F8BD36 +:10F3600070B5002901D08C0701D0072070BD164C64 +:10F370000125A16062801549636010DF0028F5D186 +:10F38000257016202EDF70BD002803D00E49C860FE +:10F39000002070470E207047002803D00A490861FA +:10F3A000002070470E20704710B5074840680028BD +:10F3B00007D08047002803D000221146FFF76CFFDA +:10F3C00010BDFFF78FFF10BDD8280020D9F2030031 +:10F3D000034610B50B439B070FD1042A0DD308C871 +:10F3E00010C9121FA342F8D018BA21BA884201D915 +:10F3F000012010BD0020C04310BD002A03D0D30758 +:10F4000003D0521C07E0002010BD03780C78401C8C +:10F41000491C1B1B07D103780C78401C491C1B1B83 +:10F4200001D1921EF1D1184610BDF8B5042A2CD393 +:10F43000830712D00B78491C0370401C521E8307AF +:10F440000BD00B78491C0370401C521E830704D05C +:10F450000B78491C0370401C521E8B079B0F05D074 +:10F46000C91ADF002023DE1B08C90AE0FCF7E0FE12 +:10F47000F8BD1D4608C9FD401C46B4402C4310C0D1 +:10F48000121F042AF5D2F308C91A521EF0D40B78C1 +:10F49000491C0370401C521EEAD40B78491C0370AF +:10F4A000401C521EE4D409780170F8BD01E004C08C +:10F4B000091F0429FBD28B0701D50280801CC907D4 +:10F4C00000D00270704700290BD0C30702D0027031 +:10F4D000401C491E022904D3830702D50280801CE8 +:10F4E000891EE3E70022EEE70022DFE70378C27817 +:10F4F0001946437812061B0219438378C0781B040F +:10F50000194311430902090A000608437047002203 +:10F5100003098B422CD3030A8B4211D300239C4650 +:10F520004EE003460B433CD4002243088B4231D3C8 +:10F5300003098B421CD3030A8B4201D394463FE05C +:10F54000C3098B4201D3CB01C01A524183098B42BC +:10F5500001D38B01C01A524143098B4201D34B01A5 +:10F56000C01A524103098B4201D30B01C01A524108 +:10F57000C3088B4201D3CB00C01A524183088B428F +:10F5800001D38B00C01A524143088B4201D34B0078 +:10F59000C01A5241411A00D20146524110467047EA +:10F5A0005DE0CA0F00D04942031000D340425340EF +:10F5B00000229C4603098B422DD3030A8B4212D3AF +:10F5C000FC22890112BA030A8B420CD389019211E1 +:10F5D0008B4208D3890192118B4204D389013AD01E +:10F5E000921100E08909C3098B4201D3CB01C01AF3 +:10F5F000524183098B4201D38B01C01A5241430906 +:10F600008B4201D34B01C01A524103098B4201D3F3 +:10F610000B01C01A5241C3088B4201D3CB00C01A60 +:10F62000524183088B4201D38B00C01A5241D9D278 +:10F6300043088B4201D34B00C01A5241411A00D2F9 +:10F640000146634652415B10104601D34042002BF5 +:10F6500000D54942704763465B1000D3404201B574 +:10F660000020C046C04602BD7047704770477546CF +:10F6700000F022F8AE46050069465346C008C000B7 +:10F68000854618B020B5FEF7FBFA60BC0027490894 +:10F69000B6460026C0C5C0C5C0C5C0C5C0C5C0C52A +:10F6A000C0C5C0C5403D49008D4670470446C046B0 +:10F6B000C0462046FCF751FD00487047303000201E +:10F6C00001491820ABBEFEE726000200704730B4A7 +:10F6D0007446641E2578641CAB4200D21D46635DEF +:10F6E0005B00E31830BC1847020000000000000077 +:10F6F0000000000000000000040000000000000006 +:10F7000000000000000000000000000000000000F9 +:10F7100035C40300000000000000000002000000EB +:10F7200000000000000000000000000000000000D9 +:10F7300000000000030000000000000000000000C6 +:10F7400005000000000000000000000000000000B4 +:10F75000000000000000000023D1BCEA5F78231500 +:10F76000DEEF12120000000088F7030000280020DE +:10F77000EC00000004C1030074F80300EC28002032 +:10F78000A413000020C103000000000000000000DE +:10F790000000000000000000000000000000000069 +:10F7A0000000000000000000000000000000000059 +:10F7B0000000000000000000000000000000FFFF4B +:10F7C0000000000032000000000000000000000007 +:10F7D0000000000000000000000000000000000029 +:10F7E0000000000000000000000000000000000019 +:10F7F0000000000000000000000000000000000009 +:10F80000000000000024F4000000000000000000E0 +:10F8100000000000000000000000000000000000E8 +:10F8200000000000000000000000000000000000D8 +:10F8300000000000000000000000000000000000C8 +:10F8400000000000000000000000000000000000B8 +:10F8500000000000000000000000000000000000A8 +:10F860000000000000000000000000000000000098 +:04F870000000000094 +:10FC00000100000000000000FE00000000000000F5 +:10FC100000000000000000000000000000000000E4 +:020000041000EA +:0410140000C0030015 +:040000050003C0C173 +:00000001FF + +:020000042000DA +:1000000041140E2FB82FA2BB980059220000000007 +:100010007B22636F6D7072657373696F6E223A2213 +:100020004C5A4D41222C2268656164657253697A8D +:1000300065223A3239352C227465787453697A65B1 +:10004000223A36383136382C226E616D65223A22DA +:100050004C434431696E38222C226555524C223A69 +:100060002268747470733A2F2F6D616B65636F64CF +:10007000652E6D6963726F6269742E6F72672F22CD +:100080002C2265564552223A22312E342E31382206 +:100090002C22707874546172676574223A226D69FB +:1000A00063726F626974227D5D000080006F0B01D6 +:1000B0000000000000003D8889C65436C3174FE495 +:1000C000E203782AFCEACED7E8E6BDBD7D2C58C90C +:1000D000FC88F612BD94D561CE1D1AE505EA0E7EA8 +:1000E000FEEF98561E03069DB79596BCB03EB1A292 +:1000F000C81DC7065676BD4F87922B069138CBB5E3 +:10010000FBC341C49CCB72CCABAEB70C714329F599 +:10011000405E38F66F3389B84EEB67EB4DBCED4A65 +:1001200024D9D650D840515B09042B1CD3EB0EDAEE +:100130000A2FED6CE6EFBDF6A303153FEDFE4287F7 +:10014000287A0CC43793B7B231E5520B686732DBBB +:100150000A03C93AB57E2E5BF4CFFDD8B15C52B725 +:100160007D3F743AEA21D026F908ED916E498C233F +:10017000B577E5E92AEA13F7A7D3848EBFE64534BD +:1001800024D4455507B4E3E54272207D2BD3E88E95 +:10019000BAEC618321D0441485F52E896325D46798 +:1001A000A8D91FF55C0E0A789ED93312CE1789B9EB +:1001B000CE35F6C8804541D4BA1B2C003F8F42BDD6 +:1001C00088A84A44A68EA40D3F78793021997F19DA +:1001D000BA1452468D2ACD8FD967453E190AD136B9 +:1001E000ECAE29ED9A9C267D690DF2133B29FDA505 +:1001F000E052548498FEEEEB3F701EED71BF049DFB +:1002000097B6AC86659FF2695A96F885F94CEFCBA4 +:10021000C92FEB162F50D83013FAC9A5A1A5EC6051 +:100220009CCFE608502A859F7D0DD32BD9E60F3C45 +:1002300008117DC2D396F75BDC81FA87D8A7CF8AF5 +:100240000CAD7A0E51F410A04B88A4B6BCAB9972D9 +:100250009EBB457A5D2065123AEF324F923C152DD8 +:1002600054DE1A61CFABA78DADAB8A7EF5F0E7B354 +:1002700081F29AE07E004273C552F634D4B1275120 +:10028000138352363DAF6D03EBB2E4E250ADB418C8 +:10029000D235680C33901840CF0086FDC35FE2F280 +:1002A000AB62365AD0C4721B3DA961693AC3792E3C +:1002B000B79645C13DA1367F9C32E687E2DA6542BA +:1002C000B84C0731A41BD98850C29B4003D3CE2918 +:1002D000009FBF105FECB827654338DD939BAAD918 +:1002E0002AD4A0046E2DFB7D37512102267FE57DA7 +:1002F000F10AF33C70F050C2C52D082488F286271D +:100300000DD5C2D7301691F9358E32BA4977FB5DDB +:10031000B6789E5A17FE31F9BC41F9CB982F2723A6 +:1003200031DDF09A7048667CE9D511DA48914D7D4F +:100330003EC0D3ABC952603066660CAC7582A2F782 +:100340000C9C2C34E7D0F1768FEE711933D335A0A5 +:1003500046094A3C3FBCF3A879AB3DEE8F29782291 +:10036000340A8134A54CD736E01A48AF2C6F71F4AB +:10037000A6D1DECC234214D60464A2B94CD1D2FD5E +:100380007AB67FF96EF81E435BB171185AD87DDEDC +:100390007C11D928B2E2447D8763B26B5E6DDCFFCD +:1003A00059138191DD4BA3BB24C420854574548926 +:1003B0000FE6FA178A1F779A3C877B87CCF8AB1237 +:1003C0000EBCF70FEFA51B940BF5F1FFA0CF8D7BB3 +:1003D0009FD0963321EFBD95D368AC5E6E02A7B86F +:1003E000C48A5DFA02CFE4C3E7153FE76F3DD6A8A4 +:1003F000E73DCFAF4EFB8133DE6DE5E3945E895779 +:10040000C4D998FF48EBF05411A127C4775F409CF2 +:100410009B5B623BCF29529253ABCFB08DB2D56A72 +:10042000A1541CC4D8CBC7F04F68C1B8851A266F39 +:10043000112AF6EFBE3EDD9A0F948C7CA0A0257B9E +:10044000CF15207DD95A9F7997D07A5D197FAEC498 +:10045000F9C8C6B61925E23DC1AB9556B224D48B76 +:10046000850B0A09D3C5B8EE3FCE7F6A4DEB0F0E60 +:10047000623D8216FBE832A3C2F53BC634EFBB5A9D +:100480004C625D42E3E5BE3F595E6F4744BA03EB01 +:1004900044F8B9A12FA993D71C303ED1137AA3C336 +:1004A000D6B61BFE3735D66673020173375D13FA75 +:1004B000E4CAACF99A431B0B72B571F5F2DA65FF29 +:1004C000F7E65A73535B73F1FA24511B62BC103F79 +:1004D0000DFDE5B7B513E616E27A112BE070CCCA34 +:1004E000E951D6D183B11394D67F096AD0AF916C0C +:1004F000F18240DEB7E58DEA43794A30721AA02CCA +:1005000063BCD1DA89737C66206629981452A7D817 +:1005100091BA0110A640570B1524FF3EDEDB7AAFDF +:100520004FD0448F57CDB2F7D571DA07343AFB95E7 +:10053000FF1A1DE57A6433E818BAD24D64F09310BF +:100540008C89867A5818C928594E2AD9B43AB57C6C +:10055000B53B4C2EA90D6CDB34630A3CA66B6E6771 +:10056000639A07F8E672C6E923D46DBA21C2F63D54 +:1005700022BC2CF22867C0D37809344AC47B1855B2 +:100580007DC73DAAE0402DDEE65393AE49D2873ABF +:10059000B2688F928DB4D0C7E3046E264ECF1AF6A0 +:1005A0000F5B57A32E19BE71F142196FA64FC0956C +:1005B00095B621FB6340BA8185D0972C60935E0885 +:1005C00035A8D678096AA8AD4D96B1F21C381C0F33 +:1005D00081C36EAE1F43A86FFEE91F78B11FA3FC55 +:1005E000529B7F3D4D51066C504D8A8D2CB0CE7D77 +:1005F000C3CBA79D19C424D8C70599B72C13E1997B +:100600000FCEAA5981158A5FA9D6372D5B7E5DDD95 +:10061000C5890ADEDAF3DCFB19F16A1AFD5682F4A9 +:100620001A46EE6AE1AC02314FCF9C8FA2731EF6E0 +:100630000623A90778578AF589E400960C45AA2075 +:10064000874E172E419E2A9258C7FFD2BFEE82E7EF +:100650007BACDBC6D185AEE17FBB759B713AF549BA +:1006600008E702DC2BF8EF7415CC63426B1EAC106C +:100670003CDC4B8AAA54F5355209D0B7A11074342A +:100680001FEEC4BD954EC64DB8D9EC8D604E107EA0 +:10069000E37A3E4FBBA79E9331EDD4CEB8033BCD5A +:1006A000BF9C0C3094FE8BDFD4978D15F162525DA8 +:1006B00005CC38C2493B225CF95BDD358EB8166942 +:1006C000C102EF31AEF54E85ADECCE89BDC2F05919 +:1006D00023EE555172854DFC795FCD0FB91150E075 +:1006E0008A279F0DF5CB83C6042AC05857EC44A82F +:1006F000E6CBDCFB9AF3491C204FCAF95CF5651C7C +:10070000A5AC8F0E333BB19B1E1B306962281700CE +:10071000E7F48DF3EFBFC2F13311105627E4373DF4 +:10072000E431480D452ACF3C79FF89137F402E8B59 +:100730005BE6C4E8F3D735F693F93AAED88E3DE4DC +:100740002F08FCA09A1C6D3145290A7F26A5630B52 +:100750008289629F5770B3AD498C4F94B67812026C +:10076000EE5EB83F82076BA304A7EC493667E70F3C +:100770001CB9CA911A1E748B7CF921948052C52A27 +:1007800069EF56BCB9EAA26E04A0489C09CEC81C09 +:100790002B90423C1A6B4CB9303DB8FD582717409E +:1007A000D6B91635CFC5B8F844C7B958D20F58379F +:1007B000C34E8A072ECB4A41A4DBF6FF3E649C253C +:1007C000539D862D448ECD9043F8493549831DF5C0 +:1007D000075CEF88064DE5450B5717CE227C6A373C +:1007E000CF02D6D7F01D2B831AD47B545C7CA0E2B9 +:1007F000DE3F8761D18DA7F2A2E74FBDC35F5AE903 +:100800003635A604DFE09A3DA2079C6F8B16350FA4 +:100810001130958A01844AB7488EAC2E61A8B62D56 +:100820005456C339049A702862B1257F036E50B2C2 +:10083000C944970573D69EC7AB89F53B19D6FA858F +:10084000E73432E16363DB1FAF8AE122463C515853 +:10085000CCD86B2978A12853ED923D0D000A0328CE +:100860007006619B0ED0AC0D9828836342959CE77F +:100870008F443F48CD45C08EC8D3B73B7EBF552976 +:10088000DC76D03573162F693C18DA565DCBCDC3B4 +:100890009B04EF00A29AB3E678A12E745FFEC99D77 +:1008A000174C920477043680ECA739453B9EBAD1A9 +:1008B00055CECA2F5D13E8B2DE1D11733D84CED331 +:1008C0007E336BF0433A4F51384FC432E73A83A836 +:1008D000C154E98290C2CE31C3ED412E35857A8F65 +:1008E000FDD23D59323E670C4C80C475956727FC9C +:1008F0004210680F13543CF88D6F6C3C49AC141FC8 +:10090000DD4F8180A0AB922C26AFD0D725416B91D3 +:10091000983CA4D4B84690C711FBDF77083295C243 +:10092000B00B9F0E68CA8654A64D75E825E0C2A894 +:10093000FB45C5A8D19EE4F5FBA1BF1A20859C7D8F +:100940001A3057DBE97F7CF8312C064F8E2B9DDC6B +:100950004214C18D9C4376220C2A2F39DFAB401301 +:100960004990B590CBBAFD214B9378D32BC16C271E +:10097000F8A18BC457D31D0DF146E8A8DF2EF5A6CC +:1009800087661D581DE78AA353A0ADADC92A4FAA9B +:10099000E802EC8B6F276684B93CC603422DCFDAA0 +:1009A0009E801F0A1118AC15DDC1624DA008E251EE +:1009B0002A8682CB6A9D55779F3A2C6530A01264B7 +:1009C0003CBC0F7073504DB5E84B9E63E337130F7B +:1009D0005C9101B2F8871AD4B68C24365799C1AF0E +:1009E00055A74AC93000B914140052152751438E37 +:1009F000374A484322A1057A67763FF1391A482AD7 +:100A0000D9CE1CA66D6F93D8A76CC01174470ABDD0 +:100A10009C6FC0E31ED031497005F88CB1364CC9CB +:100A20002AE782FD674FA838012A016F8BE196FA09 +:100A3000324617EF384C2A832D470F3365FCC637F3 +:100A4000C991022C14C0FBF9E040A27A2307AB1E27 +:100A5000078A92810F6486AE401A9A651635C211D4 +:100A6000B53039212E5EF98C76636732642BF3ED55 +:100A70001F8D192BEB6326FB3210FE0EE0CFBC7CE2 +:100A8000D7248835C02290A6F5889AFD8745C650A0 +:100A9000747C2E04F296A60F81068347538C0C9B20 +:100AA000EBB5B0C395DC3B793BB350B6CC7B1DF2C4 +:100AB0002BBB295000B52179671398A794CA2ABC8B +:100AC000509CB79B7CBB803139C56005E8C0F0D332 +:100AD000BF973D215DA1BB6190F36587A49B6B50DF +:100AE00083561F6AEC0AE9417B6908C764891DAC1B +:100AF000B1926DF533654E70F1DC94F35A1497386A +:100B000054D366F3FF8B487CD2B8A5EDC531418242 +:100B10000D1ADA3C1E3EE257A2FBF02DF78C2B0992 +:100B2000EE0F8FA42D9FCCEFFF00EC56A3D1D0B9D0 +:100B3000E14B72B030413FCFA257254CFF57DAEC62 +:100B400066DE242A44BEF75F3AD116AD3358AC7F37 +:100B50005650F07945ADB58BAA04BCD97E5B1A63BB +:100B6000BE2FDFDEDA537619ABC2C81A05E17B86E9 +:100B70007EC9CDFD20897848FE23BFEAA07C090408 +:100B80003E15247565C1127741658DF73CECC7AB06 +:100B9000F8D938E5CCF1BCF6130880922C45BC0A94 +:100BA000F1497C038CA0B9714BA65AB70DE4147CB3 +:100BB0005FB63D47E362D93A991CDFC7611C3D0629 +:100BC0002A2C0AD2FDFF59F0E71F19D6EC5EF84235 +:100BD0003DBDC9FDDE08EEC38C85098FF3A5C5F1C7 +:100BE00073614A7A9C7EB5C72F7449109B93F79F17 +:100BF0001831256D4B49A303E87A8E22F4F0282B97 +:100C0000BB298FDE1A24234E3626723809F6CAD243 +:100C1000D08600CCE71A1C66EE38468E2D15B76AD2 +:100C20007F50A4437D7AA3995C190C5ABB23A96514 +:100C300090ED9ACB10D71A1728C8DF4360A16B1A22 +:100C4000AF9A0C191AD28A9BA74FAF6E0C75187FFA +:100C50001D346EAA3350CE0B3E3F67BD8EA99090D7 +:100C6000FB35BA5046F536FCAF5E138524BA5CAE50 +:100C70001A3A3258A242D1D66202B1D096A48583E4 +:100C8000CCB0950AB795819021F6FDC1EC451D9336 +:100C9000F04390D466D470392E4D3C9F936FA9CA0F +:100CA00072C895ACEAC0791DCCE68908B30F3457F9 +:100CB000ACF896857AE34CFA23C6CD5F91E17ECEFF +:100CC00070C25F4161509E24D46FCFC9EF1A88670C +:100CD00042A19E079A29128C077520C41013D8C907 +:100CE000131B44EC9B44266756E02D3CADEE5A8D19 +:100CF0001CA67744C74657F1A8A4DB7EE7D3EF29AB +:100D0000126F7BD917C9F0E5A4F1FD3E419D2A6021 +:100D10001FC29A9E3E3F45D9BA67126B52181F9C5C +:100D20004B6F7EEB25D35F6D33A119AC9891D3A5A2 +:100D3000D5C86BF0F7E015E3AA892EB11FE90B4483 +:100D4000F3C5140ADDE93E3ACE3693F840895325BF +:100D500010495A79B4EB936CDD79E5661C1E3B8E25 +:100D6000E0DB46E234EFDB215476B8257F79256459 +:100D7000359401DF47582925C150A398650BDEA49F +:100D80006394B0A00DDC9EA8A8FFC9680C34ACCB5E +:100D900085AA93E357CC87E384945DCFC5C7E32A44 +:100DA0005BCFF0BC3DDC54B75254F8846D146E71C7 +:100DB0000480681817F8C647BB61C4F0FAA74B9BBC +:100DC0002EE6F334E6373C484E2B4C544D911B82B3 +:100DD000EB2443DA8E4238EC36E4B8BF589F778272 +:100DE000D6163749DA5678D965012133D67F6CC8D3 +:100DF000150316EEF2C08E511FC136565D796C6335 +:100E000063BE9076AB2B02262054B05A1BA14E6ACB +:100E1000AEF9F905E77FD010B5490CA7AB59D0045E +:100E200043C19169AEC946C27F11FC205757E70BF9 +:100E300004E1F3DB65C7FDF031F982172E190128B3 +:100E40001480F0445DF399EA28D4946EAEF547031C +:100E5000D1B651C7C336F40C6B1F6385ED8AB75BFF +:100E6000A9D48DF189F9D0B23951C7DDD430EA3235 +:100E7000E8ECAE7768E51F4A40DF1213E13D947B52 +:100E8000AF3FD81844B219649702C9C67731A23C63 +:100E90008E490A1B00F522139CB2EE41E9DE5A711D +:100EA00093F240C5DC2367E8C491A984C9E98D1198 +:100EB000E0415FC38BEDFD52A04054BCD6C072FB35 +:100EC000C33296CDF5673FA1B45850CB232376AFFC +:100ED0007D450EC54D82BAD8BCB79035DEB49C2E88 +:100EE0006799C7243004C4E36FB05E0D1FA6F51DDB +:100EF000D863F904918B32A385C8BD63C4AD912535 +:100F0000BEE46875D8653E25170BB18C63DD3E8F56 +:100F100098415347E9A32B106314B52C4479B75D6E +:100F2000BCABCF50284A49697831A3EDA0C5A9C50B +:100F3000212E9FCCA28FEADD928BBE5EEF169EBE65 +:100F40003384CC078246E4CF2AE935F4364B858AD0 +:100F500030A735D99ADAC300773565EF6ED9B70F68 +:100F6000363FEB7DE1B763343CDA89A70A8135640B +:100F700004E9BBCCEA9338CAC96D17A1AB76D33666 +:100F80002CC0E60242DC4DE530FE22495CB76B6BBB +:100F9000DEC6247DB69A09225DAD2B27B3BA039134 +:100FA0004E3ABC9CEAB158BE065D10974BB4A69E63 +:100FB00055EBF2D4125983FE083894EC54EFA48810 +:100FC000CFEC6B4A8B692B1A6E8AC7F39596B05B90 +:100FD00035453C27392EE905C3340D8E483E839AAA +:100FE000400624FC6444140C2E71083EF0AB36C459 +:100FF000885B121FDB2C85788E5E3EB1958BE46793 +:101000008868D5F2F4FEBA49EB9635F9B97FAD1789 +:10101000CD9DC391EA144C635371B0AEEE2FFAFE2E +:101020004C51A7A327F35B9288F7011AF5D5108BD3 +:101030008C50F7CFE575D2B4701F5579DB896159B3 +:10104000F05CFBFED60F70DB729FD2961731E35334 +:1010500013990723D79F0A70E5039781B3F6800A97 +:10106000FEB8039DA4166C96D4E029BA63EFAE7166 +:10107000621B036DE68D1F3D36B6DBE25081D5DC89 +:10108000608BB87898455B391FD594F6CBB810645F +:1010900012DF9519051FAADB524A58AD1811BB9FE4 +:1010A0000B1EEECC612D85E7E6C03A755BA2D87CBD +:1010B00021BFACA6B3008C4EC524CB35C600BBCC3B +:1010C000B9BAB93ADEFF72F997A73294E28F3716B0 +:1010D0008B6C366D6435E76518BF2BE17E0B825251 +:1010E000E6DCF516DCCED95DC6C0823F4573A6901E +:1010F0009D698BD8251A24A02C5FE15B88616097DD +:101100004F78EA26B255518CF00AEEBF93D10F1FEB +:101110002111D4AF3C013C0788B590B4C46682C6A7 +:101120006AA79490A5FDD45B014815F534CC8A9349 +:10113000535EF8F8472C9D697E295B963402D9B638 +:10114000C50DE73112B3CA5C6E2CB8C5E5E1999CB8 +:10115000F47AD2FA5CA4111FD36F89120624898510 +:10116000854598E0552FDB51B9E9DEAB17D7B8DAE2 +:101170000676C1ECEF0ABDDAAFF0D4B687D2C7C9A4 +:1011800006141E39156E0455505F8D2CE54976E81E +:101190007E86CB3DA525392651535D5BD760DA4469 +:1011A000C55BD8CB9F801F5E182058CC1D9FD140B7 +:1011B000A26B2765093DB73EFCD6E2B31161B19E33 +:1011C0008236AA0325DF6835E421AC51177E574AE1 +:1011D000808EF3AF9965E9EBDBBCDD2E9665251FAC +:1011E000FCA93AF2DCC35C6A9C34866332EA0A36B4 +:1011F00054321DE2E66ECCE4CE606433DEE320526E +:10120000E979FFBD4C514FE999152649FBF66E7DF2 +:101210002BC1CEBF51BF765BBFB0801933986970C8 +:101220007BDD8A8E93A3F8C09EF4A9A5FB0ED8841B +:101230008943D2780E30F7A533A110914133AEBE69 +:10124000BC541AE73FE20DF5BC8F936F094063CCA5 +:101250009093F71D5190CE35038C513421EC1A0632 +:101260005E6651A759A2D7921F5DE552F2582CFB3A +:1012700099FEF057F3E58E8ED8791F7767C7599B93 +:10128000265BFCF22A2489E11EF5EB71838DC89858 +:10129000DF43A80DD3AABAD1EB987DFEC1A5B869EA +:1012A0003B256794DF3E175B719BBFE07ED8BF3064 +:1012B000361FBB31EF548BB8C6020E16FDD4966CA8 +:1012C000E7E75B5B9A9F5C4CDFD8D43DCA62BF9E68 +:1012D0002F38D51942E904368C53291D678E9A445C +:1012E00048DE71D437CC6B1023EF0AF234F598B78F +:1012F000F8DB223FFAEC0DCAAA957065E1B0F66FF3 +:101300008AEB7850487BCBEABF24B8334B7BDF9D18 +:101310000C56E49375797FCFE49E749A01B3C49B15 +:10132000C4080DE760964FD9317C84442B4CCA3EEB +:101330007C7CD5F5E5468FBC3B238E69D308BC5732 +:101340002278953E01FEDD7B07175D1188D55A7422 +:10135000D9EE57D46D2C802F9549EB751E11A81A24 +:1013600095BD4C5F50E6A239927933AC96D5824B4D +:10137000437E4057CA1528D9F2210AB42DC7888E5A +:10138000F9C77ED28EA97CFB827875B2A983D8B5C5 +:10139000A3C5CAC1746D519001FF78CF9E3AB19C2C +:1013A0008219F8A1FB93F248C4323A89A3809FE5E1 +:1013B000E05009518A9A3150A4A163C16B9D318FCD +:1013C000FFD0C7CBE216FAD83E893C0315B72C668E +:1013D000CBD23B14F0BCC3B8A5C384726100515892 +:1013E0009EF673101EA437278D7746D46B30BA94BF +:1013F000F2165036A021931891E2E169EF78565920 +:101400001BED05DB996E3DA7B9B5B584B5D30BCB04 +:10141000F47C208B2DF1F2661E7F0DD25D572BFCE4 +:1014200079C82DA65DCBD5901BFF7804DAEC760544 +:101430008569B7CDE880F83F0D2B2B8696A49D8853 +:1014400063C66E5075D81807DB7BD84452A0B57DB3 +:101450007196433250A8C028526C69BCBC341E2817 +:10146000D6BF391F0498F8C8DAF20B25A5D030DFB3 +:1014700025AF7BB0540F6885AF73278D1D5E58D89C +:10148000C3D26F744DEAAF9CACBECE2868E23BCFAE +:10149000B7E95AF3E0471F87975C90407BB9324920 +:1014A000786F1B365A2B325F5E01B9B9B1FBEA8502 +:1014B000AB4A152725CA8859DAE4F8C8A2423AFE91 +:1014C0009698B2B4D5A20BD6F469BE8A7EB1DC641C +:1014D00088D6FFBE59AF4B25F0F833200EFC7F991C +:1014E00075BDE0469C53626918517D4ACB31CC35BD +:1014F000F506211D1F6477090630EBD2D36098EF03 +:10150000DB7EC16A943E56E29A4211A0C6D33F8563 +:10151000ACA9DF08DF9A8FA9DD5F55856BB72790EF +:10152000F4E3022193F3F66FA5D972385B83CDC73C +:1015300086506F24F81FB656981372373DDC0B5651 +:10154000CDB843B74EC0E0E008D7D6032C6BE3BE5E +:10155000575A1D005686B9E390D08EA517E74BB5B4 +:101560008844B8055AD68B50009DF860D2EC04B37D +:101570006F14D968BF8B9389A1D04B5BA3969F96BC +:10158000AD4E2DE2FB2A955B10A398C11345E8DA16 +:10159000D50F8ACECACC4BEE53E263536606F448AD +:1015A00089F205AE5916E2375EC56B9CCD98B4D56D +:1015B000839F09317F2FA323DEB7F7A4F3527B2546 +:1015C0000E95B015E605CFD84DB9DB137276210A1A +:1015D000F6A93A1A6439793A4F70D91A226D5869C6 +:1015E0009A410D190C839DAC741F352B6E6DBDBED9 +:1015F000829163006E4E6CF02D0B1FF8C722CCB4A5 +:10160000D1580CAAA1455489FC53B582563664655D +:10161000169E484807E568AA18EE68C6080F23EE2C +:101620009CC2BE0FA8D99182FD15B3411C26EF1DA7 +:10163000101242EA6D2C5A8E3A7DDBEA88B0E081C6 +:10164000420B7B8D59B08275B4B20C34ACD226A358 +:101650001D3B03997F824EEE5E0A3DAAD405986F2A +:10166000F066870B9E89724919C392B43075DE51BA +:10167000C920E7AE0976E548C1FF0ABCD2BF2FE713 +:10168000A90156E31C161834923D3738C4BC7C9629 +:1016900090296746489CCD0DFDF806D3420FDA86A7 +:1016A000C7AEAC27B10DF9374192297A52FAB4E6A8 +:1016B000237FFED312B9D1BE905C78FA51822FC736 +:1016C000E14CB748D329DA7497680FB2B32EF936D4 +:1016D000A65272503111301973D3A2463E91BA6BA3 +:1016E000CA0D0B22A316F026C2F2E35608223525B6 +:1016F00097479FF5BE0B1D6984DA3304535C1F972F +:101700009AB4C55154DCF49E3DB944513AC92CC435 +:101710006D9A044ADC2A905AD127CBF231A81DD306 +:101720003BF4687BED414FA97DB0842A6F7E2A305F +:101730009610F35B19834365B6F7FD41DAC84C6434 +:10174000F6D833F5A6934F66CFCD4BECC71695C6AA +:10175000F7AD4D101143FEB2187E4647F6879B55F4 +:10176000B83F384D5ADE5DAE385B4F0117E685C194 +:1017700003D086E02AE587D246970421B3BD08B896 +:101780006FC23A2639E6A580C722BE005B420F4DE4 +:10179000CDB1CE4105FAC1D7AE03E93ED20818D982 +:1017A00081F98355D2874D02D35B079D47CFA8E0CF +:1017B00016EFF8F20B3EB037C10E5FFBCBA52352FC +:1017C000D065BEBA87095D80D8E76BD82907665215 +:1017D0009611AE0FD7B5DFE56969A9FD87D3A75884 +:1017E0008F6D1C6A8F77A3275576CC2C5D8E3EE1DA +:1017F00021A5C9EFE673D8DCDB0A44E9828331A571 +:10180000D50C22CDA5CBBDD1868BAF8AC88DA513B3 +:10181000882F437D6CCB2D11B6C9C42AF166A4A8CC +:1018200025A542FAD25E3AF4FD960F6AA3B8ACF150 +:10183000B48407BD50CC854FE2F81A6960D0ADA7DB +:10184000C1DA34329AABB03DAA685F9C9F30B6E7EC +:101850004509251AC9C30246CEC2B93C42C57332F6 +:10186000177AE76E2A1042A4B022B1186DEFE5474F +:101870007E4FEA306BA2CFB300C57072BD91F39F6B +:101880007AFC224FCB7AAB4CCD6303584D80E54CAC +:10189000EC45EA573AD5711B6DAD56F8EA5CAC07DA +:1018A0006CBB32BA1223F8C4AA11C6A39D556F06A9 +:1018B000378535F91922655EC240EFAE405CC992AA +:1018C000AFA63F667F29D91D0615E8E4FBDC59A4C5 +:1018D00090321DF72EC61EC4EF9286BDD04429411A +:1018E000F06F78846A341C91C5DC41D68D78F3E7BB +:1018F000347CAD04B41D58C4B60C3BA1F5255BA5E2 +:1019000024A9701A3C82188D3E592832EBB3B0548A +:10191000297BE56D92D9844E50DB770646D37BD286 +:10192000D91221DD78F7D2A96A325A3AF98BCE6BF7 +:101930000E55ADEBC74EF1D50AD52EF0AB376FB3D0 +:101940005E85693B4C13D4EFADA801CA8ED94AF429 +:10195000E30F2D58C10EE3CBE0AD65F524607F2A7F +:10196000398B0442371F3FED0AF18B63F2D052DF0F +:1019700053E7F6C32FF92E23378AE7449FDEC80EBC +:101980008E1452AAB8172895570B8689213407B4AC +:10199000A7BCCA5513A44DFADE1A09B7A65B94403A +:1019A000311FD036805C334ED213EF57EBDA620032 +:1019B000D80B698CC04FE02EEF1E5FFDA15A3E3F51 +:1019C0004187ACCFD438870C89F4A7575E06DAB8C4 +:1019D000A6988774B434B94663936DDCB1D1642D95 +:1019E0005EB5EBC54991E5B59D85F2B6AA5F6BE39F +:1019F000CE944F57358FE7085E35FE00BA7863BE48 +:101A000010E3B8A90A9D7909831D81BD527FA07397 +:101A1000E180CC649D8D236414040A8848723D6E75 +:101A20009C6345449877A7E3CE9BCA328B1D41C87F +:101A300044D5D53C8A9D510FDF4A1E54B516E4B4F7 +:101A4000CF034AEE31DA962FD3BDCE0839102CF3EE +:101A5000C6801035F5B0D04A754C2B25188DABC912 +:101A6000F73924FEFDEFDE8B4A55328D2834736141 +:101A7000DE3F43D08D30490F128A152F56B65DF4E4 +:101A8000FDD2B335745525A7407B226206505F0313 +:101A9000BF530D1ECC3CCE1AC4EF580243556B12F7 +:101AA000B3197D730D57878636BAFAE80ADF30E33B +:101AB00052EFBBC495EB769FF078A13BFE781307FD +:101AC000A2C74A33EE2DCEE618F07620F776D99CE1 +:101AD00035C589F3A0284C2954BF9CAE4F49761DCB +:101AE000B04A0730CBC374191C4986D790A7E97553 +:101AF0001E5F34E67ADC3381A64604A0ACD2286EA1 +:101B000051280FCD1EB337450A58A82C6D40E86404 +:101B1000D9E639ACCB8DFF1E2C7FDE8DD4E84D2667 +:101B2000B1542696722CBF34E5DB8ED193489F5674 +:101B300086582F6E3DEBB7C8BF64759EE32FAEBBD2 +:101B4000EAE7C19B69646DA8EFB0F96FC3E7CF28DE +:101B500014BC0D87A85A3B7CD2D0E02A71D494E201 +:101B60006DFECF7DA78279544DF3221CE95AED1802 +:101B700043D116BD6923298E251FAA3B32F9E97E80 +:101B80008313652010EFFE0DCB529318F86BA4372A +:101B900083812835CDE28D6E7F524CC079AA27A56E +:101BA000F69738160AEEF6EF3934B9971A45A1922E +:101BB00019D2D284A683B3FEB3C1CF816C36FEF8AE +:101BC000C91D192750F51690BB29B50AD928B1FDB2 +:101BD0005A5614906F73AF63C00191DB72F7F8C46B +:101BE000180BCE01DEE438E5EC2DAAF18798223FF0 +:101BF0007543B68A4568010345C5FFDF3A54EE4395 +:101C000083174DA5324E71DA76517D2FA299397E18 +:101C100006353032CC9EEEB6201443B0D3C5C1EBAE +:101C20005C11CA14CF324C9028438A4E5A48B502F0 +:101C3000F4A822BC69FD8DC15FFD28F29F7C155C74 +:101C4000EB1137BF12E2F699452AFDDD2E1992DD20 +:101C5000202018F993E5960A00DFBE1FE32C7EB61C +:101C6000BB908C92382235A2BCD4F9D253FD9AC6CF +:101C7000D7F0A3B12DAB901E2907A79EB35A862A91 +:101C800043D1CCD4D128814116ED6E9D63776D8709 +:101C90009E7F8A60AC7300934D04EA901695E932FA +:101CA000604F0C08D7243E7D90DB9ED4CAA1A4537C +:101CB000E8D5A22FE136DF2B0E8061BFA1DFDF85E3 +:101CC000EB32C0A7120090D764F2E0A486A47A3663 +:101CD000C813A8E9DF9929F0A4329286E4FF60F3E3 +:101CE00092505D071F65F5C2341722EC052317D10A +:101CF0001BEABE41B474C9CFA0BAD2ABE10C0BEE63 +:101D0000599A5FB09BC2338FC20964D84EABE85E6C +:101D10005E50574F13D5BD7EE5AC1A48E4D7D424A6 +:101D2000230C2FEBB76930153CC3A0D915AA78DA7C +:101D30005EE65013F75B745431BE91E50DA8C3FE07 +:101D4000D5B615FE8BAD25DC7EB02512D2C9769CAA +:101D5000306B880AFEDE23DD199EE67F37796EE858 +:101D60007EA89594444907217E47AA6327F1A3835F +:101D700024B0FC76E5AE786A78A7B68DD826AEB8E2 +:101D800086EC5A58B4F3C337054DE7B6186FDBFA43 +:101D900051DDC7DFD912144DA5AFA7C2C5FD82EC36 +:101DA0001D7BBA8E7FB132DDB3E3ECBB0938101670 +:101DB0005CE596268868C0021F786625A209FC6A41 +:101DC000A7633C983408FD77462C4474BD130ADFA2 +:101DD0006AB22CE6E1004D7EEF319C9E97C5B5348A +:101DE000D69A0C74D36AC80AAD76138BB3001CB3B1 +:101DF000E84BFEE909FE606026A56C5C32B1B917BC +:101E0000FD10AC34643F64CA6F137CB55E4EB30BF7 +:101E1000CC89C85325BFB135B44E898DFA36977138 +:101E200064F7EF37689F49BF8860774040010394AB +:101E3000BBE171193D915C51309663F0060A2A1B93 +:101E4000318B11EE89ED894894AEB3FBB8127DBE9B +:101E5000C35437812A5F8E19B00FDE677F8D1097CC +:101E60001DEF0E2B5622E3CE6D5FF7810FD642BADF +:101E7000DACCD28D64912DA89FB423A76D18068467 +:101E80005EBFC2B0B5CDA948C6B47880C6A7BDBDF7 +:101E9000918E0ABED5D88CCB7AE0DC43CB649E6DA4 +:101EA0007EEA87B6DDD369ABD03D488CABCCBEAA09 +:101EB0003D4765D9A34D54D925D9042BDCD796E5E8 +:101EC00080725DE9EE104DCA624DABA4A54ED1F50E +:101ED000EF5659A0F12044E6253B1470026EDF5DF9 +:101EE00029DA6004A4E2C9B92CE7F0975BA7D44BC8 +:101EF0005158470EAA4A67EAC866F77212C197623C +:101F0000FED400D30CDCC9B1A96CCD918E253BDF8A +:101F1000179DBF0EB0EAF8C7393A380AEB789EC76A +:101F2000ABB9085FED760580D6E505CFA18BE43E21 +:101F30007F371ACC24FD4A5BED9E809E45C6CCA31C +:101F40005466E4779DB34E7C66CBFBCA094884B0E7 +:101F5000985F2CB8E48CE7FEB92CC8AE049769D61C +:101F600006F037A1BAEFDECED3E906BCF582D33C4A +:101F7000E7F78B17A7525053BAEFAD99AF25608E94 +:101F80000DAE8796BEEF7EE4C57454EE311D9C2DD8 +:101F90001D8304DE7E20FEC995AFB8DAC4D9C545DD +:101FA000ADAC5F719E4B5DC550DD8E0C4D7AFBA4D0 +:101FB000EB094657429ADC41AB9EA52FF015033A38 +:101FC0008E5B278D17AE34899DBD48B51D7335FADC +:101FD0009EED63847AAD246E32EA4A3803D7603DC1 +:101FE000F83216C57AA6D14EDB4700C737D926E0AE +:101FF000EBA969E1EDB6A055FF914CAAA5C8826096 +:102000009A8E9973CE62EA70ED1BD7C36F486E8EBD +:10201000B1C6912763662FA56AFFE18EEE7DB825D4 +:10202000EF28CD4718C9D0A467BC69BA62AF75F173 +:102030000DA2E611BB6B48ACF65D2713F54038B333 +:10204000E249E145A0E2F110A0A7582FB249CD30F6 +:10205000A08EC0858FA998CBE65B981E70D5CA9CD0 +:10206000F14113A510DD745D9F57AED1206BC7B948 +:1020700078646EE4F3F6C7D34280E7B02E6B3C7110 +:10208000624F76E2CC17D1231623B12C1CF00E8FB1 +:10209000B911CD7EE4296071F1981D7C96E3E120B1 +:1020A0006DC0CDA6FE01BFACD7C05749AE17745F57 +:1020B0001EE2E98E4F628E4AB715ABFDF315FD891E +:1020C000BEB2E5F39EC62294C20718026A7E82D889 +:1020D000D0B96FFD3E56CA176724957F0F77DE880B +:1020E0003801756366B00B686444463E6EF28EE953 +:1020F00044DDA8A2FEA535BF8E876670E7B86E7571 +:102100008E5DED8FB89F0B41B399BAB53CB2E395A4 +:1021100076C7658C4B34D00AF377FFE7CC7BFEBCE7 +:102120009679AEF408D3FE0FDBA30FDCE3D444931F +:102130002417B7380A618E3A8558F6CB21AFDCBF39 +:10214000005E919ABC5B4592F329548B71B4ECCA42 +:10215000DC3F8D6891604B4C7445736684674E37E5 +:1021600047D2674A5DF608DF29AAE82649BB5A5BD1 +:1021700055FE3330275F10D1BDF4AF9C0389A571A4 +:102180002AB512ECFCF9725C17B4C68292D07F6358 +:102190008F944CDB36C1F7F4020AEB2AF7E004FE19 +:1021A0000CB518C42560547B478D7D1C21C56D9EE0 +:1021B00037A864B4793995FF37B09B39FBD884B31D +:1021C0001E80B05787CD68F46C7E919283A5E71B83 +:1021D000DFF1ED6E46197F49D90BEF24CB804457D0 +:1021E000ABF070AD79B8149A1FCCC4B5B6944798CB +:1021F000844CDBBB8AD3E9B7419CCA469281A37564 +:10220000EBC101037D302D7A41C74F81CE5C3EACDE +:1022100071F7DE9CB7D3CA753077293914D3020F12 +:1022200025E7744AED5A8B2BF304FD444C7240238E +:10223000D255837EE9FD65F8B98F5B9AAECF6A5FB0 +:102240000570864640C2F78BDB9CD4E6C2074A374E +:1022500029C712708851198A371FEDB713A785C394 +:102260006552EEC595545839157DD770C15E6B28FF +:102270009773634EA4A0FC200C0ECF00C8434B2ED6 +:102280008412258E1D3B5DDC025BB3106784936D69 +:10229000F3A0795E237EFF5DF168B9DC027D056AFB +:1022A000F7AA8337F41904E7B18294710E43A6BEEE +:1022B0002982B6AF41044E14F5BF568D633968F6D6 +:1022C000060B7923AA369B94B6E1178C66FF7784B8 +:1022D0009F2CDE025FCEF436C11B838F0595974796 +:1022E00023CAFD4158A1DA3809BC4A89D2FCC0A4EE +:1022F000B023CBB3237A25BE49023E57FFB2AEFDD1 +:10230000C500000000000000000000000000000008 diff --git a/built/yotta.json b/built/yotta.json new file mode 100644 index 0000000..2412935 --- /dev/null +++ b/built/yotta.json @@ -0,0 +1,26 @@ +{ + "config": { + "microbit-dal": { + "fiber_user_data": 1, + "bluetooth": { + "private_addressing": 0, + "advertising_timeout": 0, + "tx_power": 6, + "dfu_service": 1, + "event_service": 1, + "device_info_service": 1, + "eddystone_url": 1, + "eddystone_uid": 1, + "open": 0, + "pairing_mode": 1, + "whitelist": 1, + "security_level": "SECURITY_MODE_ENCRYPTION_NO_MITM", + "partial_flashing": 1, + "enabled": 0 + } + } + }, + "dependencies": { + "microbit": "lancaster-university/microbit#pxtgc-0" + } +} \ No newline at end of file diff --git a/enums.d.ts b/enums.d.ts new file mode 100644 index 0000000..a62cbed --- /dev/null +++ b/enums.d.ts @@ -0,0 +1,43 @@ +// Auto-generated. Do not edit. +declare namespace LCD1IN8 { +} + + + declare const enum LCD_COLOR { + WHITE = 0xFFFF, + BLACK = 0x0000, + BLUE = 0x001F, + BRED = 0XF81F, + GRED = 0XFFE0, + GBLUE = 0X07FF, + RED = 0xF800, + MAGENTA = 0xF81F, + GREEN = 0x07E0, + CYAN = 0x7FFF, + YELLOW = 0xFFE0, + BROWN = 0XBC40, + BRRED = 0XFC07, + GRAY = 0X8430, + } + + + declare const enum DOT_PIXEL { + DOT_PIXEL_1 = 1, + DOT_PIXEL_2 = 2, + DOT_PIXEL_3 = 3, + DOT_PIXEL_4 = 4, + } + + + declare const enum LINE_STYLE { + LINE_SOLID = 0, + LINE_DOTTED = 1, + } + + + declare const enum DRAW_FILL { + DRAW_EMPTY = 0, + DRAW_FULL = 1, + } + +// Auto-generated. Do not edit. Really. diff --git a/main.ts b/main.ts new file mode 100644 index 0000000..f5d3430 --- /dev/null +++ b/main.ts @@ -0,0 +1,7 @@ +basic.showLeds(` + . . . . . + . # . # . + . . . . . + # . . . # + . # # # . + `); \ No newline at end of file diff --git a/projects/Untitled/main.blocks b/projects/Untitled/main.blocks new file mode 100644 index 0000000..fa12e63 --- /dev/null +++ b/projects/Untitled/main.blocks @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/projects/Untitled/main.ts b/projects/Untitled/main.ts new file mode 100644 index 0000000..ee54a1b --- /dev/null +++ b/projects/Untitled/main.ts @@ -0,0 +1,3 @@ +basic.forever(function () { + +}) diff --git a/projects/Untitled/pxt.json b/projects/Untitled/pxt.json new file mode 100644 index 0000000..fcce0c4 --- /dev/null +++ b/projects/Untitled/pxt.json @@ -0,0 +1,14 @@ +{ + "name": "无标题", + "dependencies": { + "core": "*", + "radio": "*" + }, + "description": "", + "files": [ + "main.blocks", + "main.ts", + "README.md" + ], + "preferredEditor": "blocksprj" +} \ No newline at end of file diff --git a/pxt.json b/pxt.json new file mode 100644 index 0000000..81d04d4 --- /dev/null +++ b/pxt.json @@ -0,0 +1,25 @@ +{ + "name": "LCD1in8", + "version": "0.0.0", + "description": "Mcufriend", + "dependencies": { + "core": "*", + "radio": "*" + }, + "files": [ + "README.md", + "LCD1in8.ts", + "LCD1in8.cpp", + "LCD_Driver.cpp", + "LCD_Driver.h", + "SPI_RAM.cpp", + "SPI_RAM.h", + "shims.d.ts", + "enums.d.ts" + ], + "testFiles": [ + "test.ts" + ], + "public": false, + "license": "MIT" +} \ No newline at end of file diff --git a/pxt_modules/core/README.md b/pxt_modules/core/README.md new file mode 100644 index 0000000..3abad65 --- /dev/null +++ b/pxt_modules/core/README.md @@ -0,0 +1,4 @@ +# core + +The core library. + diff --git a/pxt_modules/core/advmath.cpp b/pxt_modules/core/advmath.cpp new file mode 100644 index 0000000..df2828b --- /dev/null +++ b/pxt_modules/core/advmath.cpp @@ -0,0 +1,26 @@ +#include "pxtbase.h" + +using namespace std; + +#define SINGLE(op) return fromDouble(::op(toDouble(x))); + +namespace Math_ { + +//% +TNumber log2(TNumber x){SINGLE(log2)} +//% +TNumber exp(TNumber x){SINGLE(exp)} +//% +TNumber tanh(TNumber x){SINGLE(tanh)} +//% +TNumber sinh(TNumber x){SINGLE(sinh)} +//% +TNumber cosh(TNumber x){SINGLE(cosh)} +//% +TNumber atanh(TNumber x){SINGLE(atanh)} +//% +TNumber asinh(TNumber x){SINGLE(asinh)} +//% +TNumber acosh(TNumber x){SINGLE(acosh)} + +} \ No newline at end of file diff --git a/pxt_modules/core/basic.cpp b/pxt_modules/core/basic.cpp new file mode 100644 index 0000000..e721cb8 --- /dev/null +++ b/pxt_modules/core/basic.cpp @@ -0,0 +1,105 @@ +#include "pxt.h" + + +/** + * Provides access to basic micro:bit functionality. + */ +//% color=#1E90FF weight=116 icon="\uf00a" +namespace basic { + + /** + * Draws an image on the LED screen. + * @param leds the pattern of LED to turn on/off + * @param interval time in milliseconds to pause after drawing + */ + //% help=basic/show-leds + //% weight=95 blockGap=8 + //% imageLiteral=1 async + //% blockId=device_show_leds + //% block="show leds" icon="\uf00a" + //% parts="ledmatrix" + void showLeds(ImageLiteral_ leds, int interval = 400) { + uBit.display.print(MicroBitImage(imageBytes(leds)), 0, 0, 0, interval); + } + + /** + * Display text on the display, one character at a time. If the string fits on the screen (i.e. is one letter), does not scroll. + * @param text the text to scroll on the screen, eg: "Hello!" + * @param interval how fast to shift characters; eg: 150, 100, 200, -100 + */ + //% help=basic/show-string + //% weight=87 blockGap=16 + //% block="show|string %text" + //% async + //% blockId=device_print_message + //% parts="ledmatrix" + //% text.shadowOptions.toString=true + void showString(String text, int interval = 150) { + if (interval <= 0) + interval = 1; + int l = text ? text->getUTF8Size() : 0; + if (l == 0) { + uBit.display.clear(); + fiber_sleep(interval * 5); + } else if (l > 1) { + uBit.display.scroll(MSTR(text), interval); + } else { + uBit.display.printChar(text->getUTF8Data()[0], interval * 5); + } + } + + /** + * Turn off all LEDs + */ + //% help=basic/clear-screen weight=79 + //% blockId=device_clear_display block="clear screen" + //% parts="ledmatrix" + //% advanced=true + void clearScreen() { + uBit.display.image.clear(); + } + + /** + * Shows a sequence of LED screens as an animation. + * @param leds pattern of LEDs to turn on/off + * @param interval time in milliseconds between each redraw + */ + //% help=basic/show-animation imageLiteral=1 async + //% parts="ledmatrix" + void showAnimation(ImageLiteral_ leds, int interval = 400) { + uBit.display.animate(MicroBitImage(imageBytes(leds)), interval, 5, 0, 0); + } + + /** + * Draws an image on the LED screen. + * @param leds pattern of LEDs to turn on/off + */ + //% help=basic/plot-leds weight=80 + //% parts="ledmatrix" + void plotLeds(ImageLiteral_ leds) { + MicroBitImage i(imageBytes(leds)); + uBit.display.print(i, 0, 0, 0, 0); + } + + /** + * Repeats the code forever in the background. On each iteration, allows other codes to run. + * @param body code to execute + */ + //% help=basic/forever weight=55 blockGap=16 blockAllowMultiple=1 afterOnStart=true + //% blockId=device_forever block="forever" icon="\uf01e" + void forever(Action a) { + runForever(a); + } + + /** + * Pause for the specified time in milliseconds + * @param ms how long to pause for, eg: 100, 200, 500, 1000, 2000 + */ + //% help=basic/pause weight=54 + //% async block="pause (ms) %pause" blockGap=16 + //% blockId=device_pause icon="\uf110" + //% pause.shadow=timePicker + void pause(int ms) { + fiber_sleep(ms); + } +} \ No newline at end of file diff --git a/pxt_modules/core/basic.ts b/pxt_modules/core/basic.ts new file mode 100644 index 0000000..4e717f1 --- /dev/null +++ b/pxt_modules/core/basic.ts @@ -0,0 +1,15 @@ +namespace basic { + + /** + * Scroll a number on the screen. If the number fits on the screen (i.e. is a single digit), do not scroll. + * @param interval speed of scroll; eg: 150, 100, 200, -100 + */ + //% help=basic/show-number + //% weight=96 + //% blockId=device_show_number block="show|number %number" blockGap=8 + //% async + //% parts="ledmatrix" interval.defl=150 + export function showNumber(value: number, interval?: number) { + showString(Math.roundWithPrecision(value, 2).toString(), interval); + } +} \ No newline at end of file diff --git a/pxt_modules/core/buffer.cpp b/pxt_modules/core/buffer.cpp new file mode 100644 index 0000000..b9a3a0c --- /dev/null +++ b/pxt_modules/core/buffer.cpp @@ -0,0 +1,397 @@ +#include "pxtbase.h" +#include + +using namespace std; + +//% indexerGet=BufferMethods::getByte indexerSet=BufferMethods::setByte +namespace BufferMethods { +//% +uint8_t *getBytes(Buffer buf) { + return buf->data; +} + +//% +int getByte(Buffer buf, int off) { + if (buf && 0 <= off && off < buf->length) + return buf->data[off]; + return 0; +} + +//% +void setByte(Buffer buf, int off, int v) { + if (buf && 0 <= off && off < buf->length) + buf->data[off] = v; +} + +/** +* Reads an unsigned byte at a particular location +*/ +//% +int getUint8(Buffer buf, int off) { + return getByte(buf, off); +} + +/** +* Writes an unsigned byte at a particular location +*/ +//% +void setUint8(Buffer buf, int off, int v) { + setByte(buf, off, v); +} + +int writeBuffer(Buffer buf, int dstOffset, Buffer src, int srcOffset = 0, int length = -1) { + if (length < 0) + length = src->length; + + if (srcOffset < 0 || dstOffset < 0 || dstOffset > buf->length) + return -1; + + length = min(src->length - srcOffset, buf->length - dstOffset); + + if (length < 0) + return -1; + + if (buf == src) { + memmove(buf->data + dstOffset, src->data + srcOffset, length); + } else { + memcpy(buf->data + dstOffset, src->data + srcOffset, length); + } + + return 0; +} + +/** + * Write a number in specified format in the buffer. + */ +//% +void setNumber(Buffer buf, NumberFormat format, int offset, TNumber value) { + if (offset < 0) + return; + setNumberCore(buf->data + offset, buf->length - offset, format, value); +} + +/** + * Read a number in specified format from the buffer. + */ +//% +TNumber getNumber(Buffer buf, NumberFormat format, int offset) { + if (offset < 0) + return fromInt(0); + return getNumberCore(buf->data + offset, buf->length - offset, format); +} + +/** Returns the length of a Buffer object. */ +//% property +int length(Buffer s) { + return s->length; +} + +/** + * Fill (a fragment) of the buffer with given value. + */ +//% +void fill(Buffer buf, int value, int offset = 0, int length = -1) { + if (offset < 0 || offset > buf->length) + return; // DEVICE_INVALID_PARAMETER; + if (length < 0) + length = buf->length; + length = min(length, buf->length - offset); + memset(buf->data + offset, value, length); +} + +/** + * Return a copy of a fragment of a buffer. + */ +//% +Buffer slice(Buffer buf, int offset = 0, int length = -1) { + offset = min((int)buf->length, offset); + if (length < 0) + length = buf->length; + length = min(length, buf->length - offset); + return mkBuffer(buf->data + offset, length); +} + +/** + * Shift buffer left in place, with zero padding. + * @param offset number of bytes to shift; use negative value to shift right + * @param start start offset in buffer. Default is 0. + * @param length number of elements in buffer. If negative, length is set as the buffer length minus + * start. eg: -1 + */ +//% +void shift(Buffer buf, int offset, int start = 0, int length = -1) { + if (length < 0) + length = buf->length - start; + if (start < 0 || start + length > buf->length || start + length < start || length == 0 || + offset == 0 || offset == INT_MIN) + return; + if (offset <= -length || offset >= length) { + fill(buf, 0); + return; + } + + uint8_t *data = buf->data + start; + if (offset < 0) { + offset = -offset; + memmove(data + offset, data, length - offset); + memset(data, 0, offset); + } else { + length = length - offset; + memmove(data, data + offset, length); + memset(data + length, 0, offset); + } +} + +/** + * Convert a buffer to string assuming UTF8 encoding + */ +//% +String toString(Buffer buf) { + return mkString((char *)buf->data, buf->length); +} + +/** + * Convert a buffer to its hexadecimal representation. + */ +//% +String toHex(Buffer buf) { + const char *hex = "0123456789abcdef"; + auto res = mkStringCore(NULL, buf->length * 2); + for (int i = 0; i < buf->length; ++i) { + res->ascii.data[i << 1] = hex[buf->data[i] >> 4]; + res->ascii.data[(i << 1) + 1] = hex[buf->data[i] & 0xf]; + } + return res; +} + +/** + * Rotate buffer left in place. + * @param offset number of bytes to shift; use negative value to shift right + * @param start start offset in buffer. Default is 0. + * @param length number of elements in buffer. If negative, length is set as the buffer length minus + * start. eg: -1 + */ +//% +void rotate(Buffer buf, int offset, int start = 0, int length = -1) { + if (length < 0) + length = buf->length - start; + if (start < 0 || start + length > buf->length || start + length < start || length == 0 || + offset == 0 || offset == INT_MIN) + return; + + if (offset < 0) + offset += length << 8; // try to make it positive + offset %= length; + if (offset < 0) + offset += length; + + uint8_t *data = buf->data + start; + + uint8_t *n_first = data + offset; + uint8_t *first = data; + uint8_t *next = n_first; + uint8_t *last = data + length; + + while (first != next) { + uint8_t tmp = *first; + *first++ = *next; + *next++ = tmp; + if (next == last) { + next = n_first; + } else if (first == n_first) { + n_first = next; + } + } +} + +/** + * Write contents of `src` at `dstOffset` in current buffer. + */ +//% +void write(Buffer buf, int dstOffset, Buffer src) { + // srcOff and length not supported, we only do up to 4 args :/ + writeBuffer(buf, dstOffset, src, 0, -1); +} +} // namespace BufferMethods + +namespace control { +/** + * Create a new zero-initialized buffer. + * @param size number of bytes in the buffer + */ +//% +Buffer createBuffer(int size) { + return mkBuffer(NULL, size); +} + + +/** + * Create a new buffer with UTF8-encoded string + * @param str the string to put in the buffer + */ +//% +Buffer createBufferFromUTF8(String str) { +#if PXT_UTF8 + auto sz = toRealUTF8(str, NULL); + auto r = mkBuffer(NULL, sz); + toRealUTF8(str, r->data); + return r; +#else + return mkBuffer((const uint8_t *)str->getUTF8Data(), str->getUTF8Size()); +#endif +} +} // namespace control + +namespace pxt { +static int writeBytes(uint8_t *dst, uint8_t *src, int length, bool swapBytes, int szLeft) { + if (szLeft < length) { + return -1; + } + + if (swapBytes) { + uint8_t *p = dst + length; + for (int i = 0; i < length; ++i) + *--p = src[i]; + } else { + if (length == 4 && ((uint32_t)dst & 3) == 0) + *(uint32_t *)dst = *(uint32_t *)src; + else if (length == 2 && ((uint32_t)dst & 1) == 0) + *(uint16_t *)dst = *(uint16_t *)src; + else + memcpy(dst, src, length); + } + + return 0; +} + +static int readBytes(uint8_t *src, uint8_t *dst, int length, bool swapBytes, int szLeft) { + if (szLeft < length) { + memset(dst, 0, length); + return -1; + } + + if (swapBytes) { + uint8_t *p = src + length; + for (int i = 0; i < length; ++i) + dst[i] = *--p; + } else { + if (length == 4 && ((uint32_t)src & 3) == 0) + *(uint32_t *)dst = *(uint32_t *)src; + else if (length == 2 && ((uint32_t)src & 1) == 0) + *(uint16_t *)dst = *(uint16_t *)src; + else + memcpy(dst, src, length); + } + + return 0; +} + +void setNumberCore(uint8_t *buf, int szLeft, NumberFormat format, TNumber value) { + int8_t i8; + uint8_t u8; + int16_t i16; + uint16_t u16; + int32_t i32; + uint32_t u32; + float f32; + double f64; + +// Assume little endian +#define WRITEBYTES(isz, swap, toInt) \ + isz = toInt(value); \ + writeBytes(buf, (uint8_t *)&isz, sizeof(isz), swap, szLeft); \ + break + + switch (format) { + case NumberFormat::Int8LE: + WRITEBYTES(i8, false, toInt); + case NumberFormat::UInt8LE: + WRITEBYTES(u8, false, toInt); + case NumberFormat::Int16LE: + WRITEBYTES(i16, false, toInt); + case NumberFormat::UInt16LE: + WRITEBYTES(u16, false, toInt); + case NumberFormat::Int32LE: + WRITEBYTES(i32, false, toInt); + case NumberFormat::UInt32LE: + WRITEBYTES(u32, false, toUInt); + + case NumberFormat::Int8BE: + WRITEBYTES(i8, true, toInt); + case NumberFormat::UInt8BE: + WRITEBYTES(u8, true, toInt); + case NumberFormat::Int16BE: + WRITEBYTES(i16, true, toInt); + case NumberFormat::UInt16BE: + WRITEBYTES(u16, true, toInt); + case NumberFormat::Int32BE: + WRITEBYTES(i32, true, toInt); + case NumberFormat::UInt32BE: + WRITEBYTES(u32, true, toUInt); + + case NumberFormat::Float32LE: + WRITEBYTES(f32, false, toFloat); + case NumberFormat::Float32BE: + WRITEBYTES(f32, true, toFloat); + case NumberFormat::Float64LE: + WRITEBYTES(f64, false, toDouble); + case NumberFormat::Float64BE: + WRITEBYTES(f64, true, toDouble); + } +} + +TNumber getNumberCore(uint8_t *buf, int szLeft, NumberFormat format) { + int8_t i8; + uint8_t u8; + int16_t i16; + uint16_t u16; + int32_t i32; + uint32_t u32; + float f32; + double f64; + +// Assume little endian +#define READBYTES(isz, swap, conv) \ + readBytes(buf, (uint8_t *)&isz, sizeof(isz), swap, szLeft); \ + return conv(isz) + + switch (format) { + case NumberFormat::Int8LE: + READBYTES(i8, false, fromInt); + case NumberFormat::UInt8LE: + READBYTES(u8, false, fromInt); + case NumberFormat::Int16LE: + READBYTES(i16, false, fromInt); + case NumberFormat::UInt16LE: + READBYTES(u16, false, fromInt); + case NumberFormat::Int32LE: + READBYTES(i32, false, fromInt); + case NumberFormat::UInt32LE: + READBYTES(u32, false, fromUInt); + + case NumberFormat::Int8BE: + READBYTES(i8, true, fromInt); + case NumberFormat::UInt8BE: + READBYTES(u8, true, fromInt); + case NumberFormat::Int16BE: + READBYTES(i16, true, fromInt); + case NumberFormat::UInt16BE: + READBYTES(u16, true, fromInt); + case NumberFormat::Int32BE: + READBYTES(i32, true, fromInt); + case NumberFormat::UInt32BE: + READBYTES(u32, true, fromUInt); + + case NumberFormat::Float32LE: + READBYTES(f32, false, fromFloat); + case NumberFormat::Float32BE: + READBYTES(f32, true, fromFloat); + case NumberFormat::Float64LE: + READBYTES(f64, false, fromDouble); + case NumberFormat::Float64BE: + READBYTES(f64, true, fromDouble); + } + + return 0; +} +} // namespace pxt \ No newline at end of file diff --git a/pxt_modules/core/buffer.ts b/pxt_modules/core/buffer.ts new file mode 100644 index 0000000..4ae502c --- /dev/null +++ b/pxt_modules/core/buffer.ts @@ -0,0 +1,224 @@ +namespace pins { + /** + * Get the size in bytes of specified number format. + */ + //% + export function sizeOf(format: NumberFormat) { + switch (format) { + case NumberFormat.Int8LE: + case NumberFormat.UInt8LE: + case NumberFormat.Int8BE: + case NumberFormat.UInt8BE: + return 1; + case NumberFormat.Int16LE: + case NumberFormat.UInt16LE: + case NumberFormat.Int16BE: + case NumberFormat.UInt16BE: + return 2; + case NumberFormat.Int32LE: + case NumberFormat.Int32BE: + case NumberFormat.UInt32BE: + case NumberFormat.UInt32LE: + case NumberFormat.Float32BE: + case NumberFormat.Float32LE: + return 4; + case NumberFormat.Float64BE: + case NumberFormat.Float64LE: + return 8; + } + return 0; + } + + /** + * Create a new buffer initalized to bytes from given array. + * @param bytes data to initalize with + */ + //% + export function createBufferFromArray(bytes: number[]) { + let buf = control.createBuffer(bytes.length) + for (let i = 0; i < bytes.length; ++i) + buf[i] = bytes[i] + return buf + } + + function getFormat(pychar: string, isBig: boolean) { + switch (pychar) { + case 'B': + return NumberFormat.UInt8LE + case 'b': + return NumberFormat.Int8LE + case 'H': + return isBig ? NumberFormat.UInt16BE : NumberFormat.UInt16LE + case 'h': + return isBig ? NumberFormat.Int16BE : NumberFormat.Int16LE + case 'I': + case 'L': + return isBig ? NumberFormat.UInt32BE : NumberFormat.UInt32LE + case 'i': + case 'l': + return isBig ? NumberFormat.Int32BE : NumberFormat.Int32LE + case 'f': + return isBig ? NumberFormat.Float32BE : NumberFormat.Float32LE + case 'd': + return isBig ? NumberFormat.Float64BE : NumberFormat.Float64LE + default: + return null as NumberFormat + } + } + + function packUnpackCore(format: string, nums: number[], buf: Buffer, isPack: boolean, off = 0) { + let isBig = false + let idx = 0 + for (let i = 0; i < format.length; ++i) { + switch (format[i]) { + case ' ': + case '<': + case '=': + isBig = false + break + case '>': + case '!': + isBig = true + break + case 'x': + off++ + break + default: + let fmt = getFormat(format[i], isBig) + if (fmt === null) { + control.fail("Not supported format character: " + format[i]) + } else { + if (buf) { + if (isPack) + buf.setNumber(fmt, off, nums[idx++]) + else + nums.push(buf.getNumber(fmt, off)) + } + + off += pins.sizeOf(fmt) + } + break + } + } + return off + } + + export function packedSize(format: string) { + return packUnpackCore(format, null, null, true) + } + + export function packBuffer(format: string, nums: number[]) { + let buf = control.createBuffer(packedSize(format)) + packUnpackCore(format, nums, buf, true) + return buf + } + + export function packIntoBuffer(format: string, buf: Buffer, offset: number, nums: number[]) { + packUnpackCore(format, nums, buf, true, offset) + } + + export function unpackBuffer(format: string, buf: Buffer, offset = 0) { + let res: number[] = [] + packUnpackCore(format, res, buf, false, offset) + return res + } +} + +// see http://msgpack.org/ for the spec +// it currently only implements numbers and their sequances +// once we handle any type and typeof expressions we can do more + +namespace msgpack { + function tagFormat(tag: number) { + switch (tag) { + case 0xCB: return NumberFormat.Float64BE + case 0xCC: return NumberFormat.UInt8BE + case 0xCD: return NumberFormat.UInt16BE + case 0xCE: return NumberFormat.UInt32BE + case 0xD0: return NumberFormat.Int8BE + case 0xD1: return NumberFormat.Int16BE + case 0xD2: return NumberFormat.Int32BE + default: + return null + } + } + + function packNumberCore(buf: Buffer, offset: number, num: number) { + let tag = 0xCB + if (num == (num << 0) || num == (num >>> 0)) { + if (-31 <= num && num <= 127) { + if (buf) buf[offset] = num + return 1 + } else if (0 <= num) { + if (num <= 0xff) { + tag = 0xCC + } else if (num <= 0xffff) { + tag = 0xCD + } else { + tag = 0xCE + } + } else { + if (-0x7f <= num) { + tag = 0xD0 + } else if (-0x7fff <= num) { + tag = 0xD1 + } else { + tag = 0xD2 + } + } + } + let fmt = tagFormat(tag) + if (buf) { + buf[offset] = tag + buf.setNumber(fmt, offset + 1, num) + } + return pins.sizeOf(fmt) + 1 + } + + /** + * Unpacks a buffer into a number array. + */ + export function unpackNumberArray(buf: Buffer, offset = 0): number[] { + let res: number[] = [] + + while (offset < buf.length) { + let fmt = tagFormat(buf[offset++]) + if (fmt === null) { + let v = buf.getNumber(NumberFormat.Int8BE, offset - 1) + if (-31 <= v && v <= 127) + res.push(v) + else + return null + } else { + res.push(buf.getNumber(fmt, offset)) + offset += pins.sizeOf(fmt) + } + // padding at the end + while (buf[offset] === 0xc1) offset++; + } + + return res + } + + /** + * Pack a number array into a buffer. + * @param nums the numbers to be packed + */ + export function packNumberArray(nums: number[]): Buffer { + let off = 0 + for (let n of nums) { + off += packNumberCore(null, off, n) + } + let buf = control.createBuffer(off) + off = 0 + for (let n of nums) { + off += packNumberCore(buf, off, n) + } + return buf + } +} + +interface Buffer { + [index: number]: number; + // rest defined in buffer.cpp +} \ No newline at end of file diff --git a/pxt_modules/core/codal.cpp b/pxt_modules/core/codal.cpp new file mode 100644 index 0000000..05f3687 --- /dev/null +++ b/pxt_modules/core/codal.cpp @@ -0,0 +1,273 @@ +#include "pxt.h" +#include + +PXT_ABI(__aeabi_dadd) +PXT_ABI(__aeabi_dcmplt) +PXT_ABI(__aeabi_dcmpgt) +PXT_ABI(__aeabi_dsub) +PXT_ABI(__aeabi_ddiv) +PXT_ABI(__aeabi_dmul) + +extern "C" void target_panic(int error_code) { + // wait for serial to flush + wait_us(300000); + microbit_panic(error_code); +} + +extern "C" void target_reset() { + microbit_reset(); +} + +namespace pxt { + +MicroBit uBit; +MicroBitEvent lastEvent; + +void platform_init() { + microbit_seed_random(); + seedRandom(microbit_random(0x7fffffff)); +} + +void platform_init(); +void usb_init(); + +struct FreeList { + FreeList *next; +}; + +static void initCodal() { + + uBit.init(); + + // repeat error 4 times and restart as needed + microbit_panic_timeout(4); +} + +void dumpDmesg() {} + +// --------------------------------------------------------------------------- +// An adapter for the API expected by the run-time. +// --------------------------------------------------------------------------- + +// We have the invariant that if [dispatchEvent] is registered against the DAL +// for a given event, then [handlersMap] contains a valid entry for that +// event. +void dispatchEvent(MicroBitEvent e) { + lastEvent = e; + + auto curr = findBinding(e.source, e.value); + auto value = fromInt(e.value); + if (curr) + runAction1(curr->action, value); + + curr = findBinding(e.source, DEVICE_EVT_ANY); + if (curr) + runAction1(curr->action, value); +} + +void registerWithDal(int id, int event, Action a, int flags) { + // first time? + if (!findBinding(id, event)) + uBit.messageBus.listen(id, event, dispatchEvent, flags); + setBinding(id, event, a); +} + +void fiberDone(void *a) { + decr((Action)a); + unregisterGCPtr((Action)a); + release_fiber(); +} + +void releaseFiber() { + release_fiber(); +} + +void sleep_ms(unsigned ms) { + fiber_sleep(ms); +} + +void sleep_us(uint64_t us) { + wait_us(us); +} + +void forever_stub(void *a) { + while (true) { + runAction0((Action)a); + fiber_sleep(20); + } +} + +void runForever(Action a) { + if (a != 0) { + incr(a); + registerGCPtr(a); + create_fiber(forever_stub, (void *)a); + } +} + +void runInParallel(Action a) { + if (a != 0) { + incr(a); + registerGCPtr(a); + create_fiber((void (*)(void *))runAction0, (void *)a, fiberDone); + } +} + +void waitForEvent(int id, int event) { + fiber_wait_for_event(id, event); +} + +void initRuntime() { + initCodal(); + platform_init(); +} + +//% +unsigned afterProgramPage() { + unsigned ptr = (unsigned)&bytecode[0]; + ptr += programSize(); + ptr = (ptr + (PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1); + return ptr; +} + +int current_time_ms() { + return system_timer_current_time(); +} + +static void logwriten(const char *msg, int l) { + uBit.serial.send((uint8_t *)msg, l); +} + +static void logwrite(const char *msg) { + logwriten(msg, strlen(msg)); +} + +static void writeNum(char *buf, uint32_t n, bool full) { + int i = 0; + int sh = 28; + while (sh >= 0) { + int d = (n >> sh) & 0xf; + if (full || d || sh == 0 || i) { + buf[i++] = d > 9 ? 'A' + d - 10 : '0' + d; + } + sh -= 4; + } + buf[i] = 0; +} + +static void logwritenum(uint32_t n, bool full, bool hex) { + char buff[20]; + + if (hex) { + writeNum(buff, n, full); + logwrite("0x"); + } else { + itoa(n, buff); + } + + logwrite(buff); +} + +void vdebuglog(const char *format, va_list ap) { + const char *end = format; + + while (*end) { + if (*end++ == '%') { + logwriten(format, end - format - 1); + uint32_t val = va_arg(ap, uint32_t); + switch (*end++) { + case 'c': + logwriten((const char *)&val, 1); + break; + case 'd': + logwritenum(val, false, false); + break; + case 'x': + logwritenum(val, false, true); + break; + case 'p': + case 'X': + logwritenum(val, true, true); + break; + case 's': + logwrite((char *)(void *)val); + break; + case '%': + logwrite("%"); + break; + default: + logwrite("???"); + break; + } + format = end; + } + } + logwriten(format, end - format); + logwrite("\n"); +} + +void debuglog(const char *format, ...) { + va_list arg; + va_start(arg, format); + vdebuglog(format, arg); + va_end(arg); +} + +void sendSerial(const char *data, int len) { + logwriten(data, len); +} + +#ifdef PXT_GC +ThreadContext *getThreadContext() { + if (!currentFiber) + return NULL; + return (ThreadContext *)currentFiber->user_data; +} + +void setThreadContext(ThreadContext *ctx) { + currentFiber->user_data = ctx; +} + +static void *threadAddressFor(Fiber *fib, void *sp) { + if (fib == currentFiber) + return sp; + return (uint8_t *)sp + ((uint8_t *)fib->stack_top - (uint8_t *)fib->tcb.stack_base); +} + +void gcProcessStacks(int flags) { + // check scheduler is initialized + if (!currentFiber) { + // make sure we allocate something to at least initalize the memory allocator + void * volatile p = xmalloc(1); + xfree(p); + return; + } + + int numFibers = list_fibers(NULL); + Fiber **fibers = (Fiber **)xmalloc(sizeof(Fiber *) * numFibers); + int num2 = list_fibers(fibers); + if (numFibers != num2) + oops(12); + int cnt = 0; + + for (int i = 0; i < numFibers; ++i) { + auto fib = fibers[i]; + auto ctx = (ThreadContext *)fib->user_data; + if (!ctx) + continue; + for (auto seg = &ctx->stack; seg; seg = seg->next) { + auto ptr = (TValue *)threadAddressFor(fib, seg->top); + auto end = (TValue *)threadAddressFor(fib, seg->bottom); + if (flags & 2) + DMESG("RS%d:%p/%d", cnt++, ptr, end - ptr); + // VLOG("mark: %p - %p", ptr, end); + while (ptr < end) { + gcProcess(*ptr++); + } + } + } + xfree(fibers); +} +#endif + +} // namespace pxt diff --git a/pxt_modules/core/configkeys.h b/pxt_modules/core/configkeys.h new file mode 100644 index 0000000..e58df7b --- /dev/null +++ b/pxt_modules/core/configkeys.h @@ -0,0 +1,291 @@ +#ifndef __PXT_CONFIGKEYS_H +#define __PXT_CONFIGKEYS_H + +// used by pins.cpp to mask off the pin name from any config +// lower 16 pins of value are the pin name +#define CFG_PIN_NAME_MSK 0x0000ffff +// upper 16 bits of value is any configuration of the pin. +#define CFG_PIN_CONFIG_MSK 0xffff0000 + +// begin optional pin configurations +#define CFG_PIN_CONFIG_ACTIVE_LO 0x10000 + + +#define CFG_MAGIC0 0x1e9e10f1 +#define CFG_MAGIC1 0x20227a79 + +// these define keys for getConfig() function +#define CFG_PIN_ACCELEROMETER_INT 1 +#define CFG_PIN_ACCELEROMETER_SCL 2 +#define CFG_PIN_ACCELEROMETER_SDA 3 +#define CFG_PIN_BTN_A 4 +#define CFG_PIN_BTN_B 5 +#define CFG_PIN_BTN_SLIDE 6 +#define CFG_PIN_DOTSTAR_CLOCK 7 +#define CFG_PIN_DOTSTAR_DATA 8 +#define CFG_PIN_FLASH_CS 9 +#define CFG_PIN_FLASH_MISO 10 +#define CFG_PIN_FLASH_MOSI 11 +#define CFG_PIN_FLASH_SCK 12 +#define CFG_PIN_LED 13 +#define CFG_PIN_LIGHT 14 +#define CFG_PIN_MICROPHONE 15 +#define CFG_PIN_MIC_CLOCK 16 +#define CFG_PIN_MIC_DATA 17 +#define CFG_PIN_MISO 18 +#define CFG_PIN_MOSI 19 +#define CFG_PIN_NEOPIXEL 20 +#define CFG_PIN_RX 21 +#define CFG_PIN_RXLED 22 +#define CFG_PIN_SCK 23 +#define CFG_PIN_SCL 24 +#define CFG_PIN_SDA 25 +#define CFG_PIN_SPEAKER_AMP 26 +#define CFG_PIN_TEMPERATURE 27 +#define CFG_PIN_TX 28 +#define CFG_PIN_TXLED 29 +#define CFG_PIN_IR_OUT 30 +#define CFG_PIN_IR_IN 31 +#define CFG_PIN_DISPLAY_SCK 32 +#define CFG_PIN_DISPLAY_MISO 33 +#define CFG_PIN_DISPLAY_MOSI 34 +#define CFG_PIN_DISPLAY_CS 35 +#define CFG_PIN_DISPLAY_DC 36 +#define CFG_DISPLAY_WIDTH 37 +#define CFG_DISPLAY_HEIGHT 38 +#define CFG_DISPLAY_CFG0 39 +#define CFG_DISPLAY_CFG1 40 +#define CFG_DISPLAY_CFG2 41 +#define CFG_DISPLAY_CFG3 42 +#define CFG_PIN_DISPLAY_RST 43 +#define CFG_PIN_DISPLAY_BL 44 +#define CFG_PIN_SERVO_1 45 +#define CFG_PIN_SERVO_2 46 +#define CFG_PIN_BTN_LEFT 47 +#define CFG_PIN_BTN_RIGHT 48 +#define CFG_PIN_BTN_UP 49 +#define CFG_PIN_BTN_DOWN 50 +#define CFG_PIN_BTN_MENU 51 +#define CFG_PIN_LED_R 52 +#define CFG_PIN_LED_G 53 +#define CFG_PIN_LED_B 54 +#define CFG_PIN_LED1 55 +#define CFG_PIN_LED2 56 +#define CFG_PIN_LED3 57 +#define CFG_PIN_LED4 58 +#define CFG_SPEAKER_VOLUME 59 + +#define CFG_PIN_JACK_TX 60 +#define CFG_PIN_JACK_SENSE 61 +#define CFG_PIN_JACK_HPEN 62 +#define CFG_PIN_JACK_BZEN 63 +#define CFG_PIN_JACK_PWREN 64 +#define CFG_PIN_JACK_SND 65 +#define CFG_PIN_JACK_BUSLED 66 +#define CFG_PIN_JACK_COMMLED 67 + +#define CFG_PIN_BTN_SOFT_RESET 69 +#define CFG_ACCELEROMETER_TYPE 70 +#define CFG_PIN_BTNMX_LATCH 71 +#define CFG_PIN_BTNMX_CLOCK 72 +#define CFG_PIN_BTNMX_DATA 73 +#define CFG_PIN_BTN_MENU2 74 +#define CFG_PIN_BATTSENSE 75 +#define CFG_PIN_VIBRATION 76 +#define CFG_PIN_PWREN 77 + +// default I2C address +#define ACCELEROMETER_TYPE_LIS3DH 0x32 +#define ACCELEROMETER_TYPE_MMA8453 0x38 +#define ACCELEROMETER_TYPE_FXOS8700 0x3C +#define ACCELEROMETER_TYPE_MMA8653 0x3A +#define ACCELEROMETER_TYPE_MSA300 0x4C +#define ACCELEROMETER_TYPE_MPU6050 0x68 + +#define CFG_PIN_A0 100 +#define CFG_PIN_A1 101 +#define CFG_PIN_A2 102 +#define CFG_PIN_A3 103 +#define CFG_PIN_A4 104 +#define CFG_PIN_A5 105 +#define CFG_PIN_A6 106 +#define CFG_PIN_A7 107 +#define CFG_PIN_A8 108 +#define CFG_PIN_A9 109 +#define CFG_PIN_A10 110 +#define CFG_PIN_A11 111 +#define CFG_PIN_A12 112 +#define CFG_PIN_A13 113 +#define CFG_PIN_A14 114 +#define CFG_PIN_A15 115 +#define CFG_PIN_A16 116 +#define CFG_PIN_A17 117 +#define CFG_PIN_A18 118 +#define CFG_PIN_A19 119 +#define CFG_PIN_A20 120 +#define CFG_PIN_A21 121 +#define CFG_PIN_A22 122 +#define CFG_PIN_A23 123 +#define CFG_PIN_A24 124 +#define CFG_PIN_A25 125 +#define CFG_PIN_A26 126 +#define CFG_PIN_A27 127 +#define CFG_PIN_A28 128 +#define CFG_PIN_A29 129 +#define CFG_PIN_A30 130 +#define CFG_PIN_A31 131 + +#define CFG_PIN_D0 150 +#define CFG_PIN_D1 151 +#define CFG_PIN_D2 152 +#define CFG_PIN_D3 153 +#define CFG_PIN_D4 154 +#define CFG_PIN_D5 155 +#define CFG_PIN_D6 156 +#define CFG_PIN_D7 157 +#define CFG_PIN_D8 158 +#define CFG_PIN_D9 159 +#define CFG_PIN_D10 160 +#define CFG_PIN_D11 161 +#define CFG_PIN_D12 162 +#define CFG_PIN_D13 163 +#define CFG_PIN_D14 164 +#define CFG_PIN_D15 165 +#define CFG_PIN_D16 166 +#define CFG_PIN_D17 167 +#define CFG_PIN_D18 168 +#define CFG_PIN_D19 169 +#define CFG_PIN_D20 170 +#define CFG_PIN_D21 171 +#define CFG_PIN_D22 172 +#define CFG_PIN_D23 173 +#define CFG_PIN_D24 174 +#define CFG_PIN_D25 175 +#define CFG_PIN_D26 176 +#define CFG_PIN_D27 177 +#define CFG_PIN_D28 178 +#define CFG_PIN_D29 179 +#define CFG_PIN_D30 180 +#define CFG_PIN_D31 181 + +#define CFG_NUM_NEOPIXELS 200 +#define CFG_NUM_DOTSTARS 201 +#define CFG_DEFAULT_BUTTON_MODE 202 +#define CFG_SWD_ENABLED 203 +#define CFG_FLASH_BYTES 204 +#define CFG_RAM_BYTES 205 +#define CFG_SYSTEM_HEAP_BYTES 206 +#define CFG_LOW_MEM_SIMULATION_KB 207 +#define CFG_BOOTLOADER_BOARD_ID 208 +#define CFG_UF2_FAMILY 209 +#define CFG_PINS_PORT_SIZE 210 +#define CFG_BOOTLOADER_PROTECTION 211 +#define CFG_POWER_DEEPSLEEP_TIMEOUT 212 +#define CFG_ANALOG_BUTTON_THRESHOLD 213 + +#define CFG_PIN_B0 300 +#define CFG_PIN_B1 301 +#define CFG_PIN_B2 302 +#define CFG_PIN_B3 303 +#define CFG_PIN_B4 304 +#define CFG_PIN_B5 305 +#define CFG_PIN_B6 306 +#define CFG_PIN_B7 307 +#define CFG_PIN_B8 308 +#define CFG_PIN_B9 309 +#define CFG_PIN_B10 310 +#define CFG_PIN_B11 311 +#define CFG_PIN_B12 312 +#define CFG_PIN_B13 313 +#define CFG_PIN_B14 314 +#define CFG_PIN_B15 315 +#define CFG_PIN_B16 316 +#define CFG_PIN_B17 317 +#define CFG_PIN_B18 318 +#define CFG_PIN_B19 319 +#define CFG_PIN_B20 320 +#define CFG_PIN_B21 321 +#define CFG_PIN_B22 322 +#define CFG_PIN_B23 323 +#define CFG_PIN_B24 324 +#define CFG_PIN_B25 325 +#define CFG_PIN_B26 326 +#define CFG_PIN_B27 327 +#define CFG_PIN_B28 328 +#define CFG_PIN_B29 329 +#define CFG_PIN_B30 330 +#define CFG_PIN_B31 331 + +#define CFG_PIN_C0 350 +#define CFG_PIN_C1 351 +#define CFG_PIN_C2 352 +#define CFG_PIN_C3 353 +#define CFG_PIN_C4 354 +#define CFG_PIN_C5 355 +#define CFG_PIN_C6 356 +#define CFG_PIN_C7 357 +#define CFG_PIN_C8 358 +#define CFG_PIN_C9 359 +#define CFG_PIN_C10 360 +#define CFG_PIN_C11 361 +#define CFG_PIN_C12 362 +#define CFG_PIN_C13 363 +#define CFG_PIN_C14 364 +#define CFG_PIN_C15 365 +#define CFG_PIN_C16 366 +#define CFG_PIN_C17 367 +#define CFG_PIN_C18 368 +#define CFG_PIN_C19 369 +#define CFG_PIN_C20 370 +#define CFG_PIN_C21 371 +#define CFG_PIN_C22 372 +#define CFG_PIN_C23 373 +#define CFG_PIN_C24 374 +#define CFG_PIN_C25 375 +#define CFG_PIN_C26 376 +#define CFG_PIN_C27 377 +#define CFG_PIN_C28 378 +#define CFG_PIN_C29 379 +#define CFG_PIN_C30 380 +#define CFG_PIN_C31 381 + +#define CFG_PIN_P0 400 +#define CFG_PIN_P1 401 +#define CFG_PIN_P2 402 +#define CFG_PIN_P3 403 +#define CFG_PIN_P4 404 +#define CFG_PIN_P5 405 +#define CFG_PIN_P6 406 +#define CFG_PIN_P7 407 +#define CFG_PIN_P8 408 +#define CFG_PIN_P9 409 +#define CFG_PIN_P10 410 +#define CFG_PIN_P11 411 +#define CFG_PIN_P12 412 +#define CFG_PIN_P13 413 +#define CFG_PIN_P14 414 +#define CFG_PIN_P15 415 +#define CFG_PIN_P16 416 +#define CFG_PIN_P17 417 +#define CFG_PIN_P18 418 +#define CFG_PIN_P19 419 +#define CFG_PIN_P20 420 + +#define CFG_PIN_LORA_MISO 1001 +#define CFG_PIN_LORA_MOSI 1002 +#define CFG_PIN_LORA_SCK 1003 +#define CFG_PIN_LORA_CS 1004 +#define CFG_PIN_LORA_BOOT 1005 +#define CFG_PIN_LORA_RESET 1006 +#define CFG_PIN_IRRXLED 1007 +#define CFG_PIN_IRTXLED 1008 +#define CFG_PIN_LCD_RESET 1009 +#define CFG_PIN_LCD_ENABLE 1010 +#define CFG_PIN_LCD_DATALINE4 1011 +#define CFG_PIN_LCD_DATALINE5 1012 +#define CFG_PIN_LCD_DATALINE6 1013 +#define CFG_PIN_LCD_DATALINE7 1014 +#define CFG_NUM_LCD_COLUMNS 1015 +#define CFG_NUM_LCD_ROWS 1016 + +#endif diff --git a/pxt_modules/core/console.ts b/pxt_modules/core/console.ts new file mode 100644 index 0000000..87ec98a --- /dev/null +++ b/pxt_modules/core/console.ts @@ -0,0 +1,53 @@ +/// + +/** + * Reading and writing data to the console output. + */ +//% weight=12 color=#002050 icon="\uf120" +//% advanced=true +namespace console { + type Listener = (text: string) => void; + + //% whenUsed + let listeners: Listener[] = undefined; + + /** + * Write a line of text to the console output. + * @param value to send + */ + //% weight=90 + //% help=console/log blockGap=8 + //% text.shadowOptions.toString=true + export function log(text: string): void { + // pad text on the 32byte boundar + text += "\r\n"; + control.__log(text); + // send to listeners + if (listeners) + for (let i = 0; i < listeners.length; ++i) + listeners[i](text); + } + + /** + * Write a name:value pair as a line of text to the console output. + * @param name name of the value stream, eg: "x" + * @param value to write + */ + //% weight=88 blockGap=8 + //% help=console/log-value + export function logValue(name: string, value: number): void { + log(name ? `${name}: ${value}` : `${value}`) + } + + /** + * Adds a listener for the log messages + * @param listener + */ + //% + export function addListener(listener: (text: string) => void) { + if (!listener) return; + if (!listeners) + listeners = []; + listeners.push(listener); + } +} \ No newline at end of file diff --git a/pxt_modules/core/control.cpp b/pxt_modules/core/control.cpp new file mode 100644 index 0000000..0aff221 --- /dev/null +++ b/pxt_modules/core/control.cpp @@ -0,0 +1,333 @@ +#include "pxt.h" + +/** + * How to create the event. + */ +enum class EventCreationMode { + /** + * MicroBitEvent is initialised, and no further processing takes place. + */ + CreateOnly = CREATE_ONLY, + /** + * MicroBitEvent is initialised, and its event handlers are immediately fired (not suitable for use in interrupts!). + */ + CreateAndFire = CREATE_AND_FIRE, +}; + +// note the trailing '_' in names - otherwise we get conflict with the pre-processor +// this trailing underscore is removed by enums.d.ts generation process + +// TODO shouldn't these be renamed to something more sensible anyways? + +enum EventBusSource { + //% blockIdentity="control.eventSourceId" + MICROBIT_ID_BUTTON_A_ = MICROBIT_ID_BUTTON_A, + //% blockIdentity="control.eventSourceId" + MICROBIT_ID_BUTTON_B_ = MICROBIT_ID_BUTTON_B, + //% blockIdentity="control.eventSourceId" + MICROBIT_ID_BUTTON_AB_ = MICROBIT_ID_BUTTON_AB, + //% blockIdentity="control.eventSourceId" + MICROBIT_ID_RADIO_ = MICROBIT_ID_RADIO, + //% blockIdentity="control.eventSourceId" + MICROBIT_ID_GESTURE_ = MICROBIT_ID_GESTURE, + //% blockIdentity="control.eventSourceId" + MICROBIT_ID_ACCELEROMETER_ = MICROBIT_ID_ACCELEROMETER, + //% blockIdentity="control.eventSourceId" + MICROBIT_ID_IO_P0_ = MICROBIT_ID_IO_P0, + //% blockIdentity="control.eventSourceId" + MICROBIT_ID_IO_P1_ = MICROBIT_ID_IO_P1, + //% blockIdentity="control.eventSourceId" + MICROBIT_ID_IO_P2_ = MICROBIT_ID_IO_P2, + //% blockIdentity="control.eventSourceId" + MICROBIT_ID_IO_P3_ = MICROBIT_ID_IO_P3, + //% blockIdentity="control.eventSourceId" + MICROBIT_ID_IO_P4_ = MICROBIT_ID_IO_P4, + //% blockIdentity="control.eventSourceId" + MICROBIT_ID_IO_P5_ = MICROBIT_ID_IO_P5, + //% blockIdentity="control.eventSourceId" + MICROBIT_ID_IO_P6_ = MICROBIT_ID_IO_P6, + //% blockIdentity="control.eventSourceId" + MICROBIT_ID_IO_P7_ = MICROBIT_ID_IO_P7, + //% blockIdentity="control.eventSourceId" + MICROBIT_ID_IO_P8_ = MICROBIT_ID_IO_P8, + //% blockIdentity="control.eventSourceId" + MICROBIT_ID_IO_P9_ = MICROBIT_ID_IO_P9, + //% blockIdentity="control.eventSourceId" + MICROBIT_ID_IO_P10_ = MICROBIT_ID_IO_P10, + //% blockIdentity="control.eventSourceId" + MICROBIT_ID_IO_P11_ = MICROBIT_ID_IO_P11, + //% blockIdentity="control.eventSourceId" + MICROBIT_ID_IO_P12_ = MICROBIT_ID_IO_P12, + //% blockIdentity="control.eventSourceId" + MICROBIT_ID_IO_P13_ = MICROBIT_ID_IO_P13, + //% blockIdentity="control.eventSourceId" + MICROBIT_ID_IO_P14_ = MICROBIT_ID_IO_P14, + //% blockIdentity="control.eventSourceId" + MICROBIT_ID_IO_P15_ = MICROBIT_ID_IO_P15, + //% blockIdentity="control.eventSourceId" + MICROBIT_ID_IO_P16_ = MICROBIT_ID_IO_P16, + //% blockIdentity="control.eventSourceId" + MICROBIT_ID_IO_P19_ = MICROBIT_ID_IO_P19, + //% blockIdentity="control.eventSourceId" + MICROBIT_ID_IO_P20_ = MICROBIT_ID_IO_P20, + //% blockIdentity="control.eventSourceId" + MES_DEVICE_INFO_ID_ = MES_DEVICE_INFO_ID, + //% blockIdentity="control.eventSourceId" + MES_SIGNAL_STRENGTH_ID_ = MES_SIGNAL_STRENGTH_ID, + //% blockIdentity="control.eventSourceId" + MES_DPAD_CONTROLLER_ID_ = MES_DPAD_CONTROLLER_ID, + //% blockIdentity="control.eventSourceId" + MES_BROADCAST_GENERAL_ID_ = MES_BROADCAST_GENERAL_ID, +}; + +enum EventBusValue { + //% blockIdentity="control.eventValueId" + MICROBIT_EVT_ANY_ = MICROBIT_EVT_ANY, + //% blockIdentity="control.eventValueId" + MICROBIT_BUTTON_EVT_DOWN_ = MICROBIT_BUTTON_EVT_DOWN, + //% blockIdentity="control.eventValueId" + MICROBIT_BUTTON_EVT_UP_ = MICROBIT_BUTTON_EVT_UP, + //% blockIdentity="control.eventValueId" + MICROBIT_BUTTON_EVT_CLICK_ = MICROBIT_BUTTON_EVT_CLICK, + //% blockIdentity="control.eventValueId" + MICROBIT_RADIO_EVT_DATAGRAM_ = MICROBIT_RADIO_EVT_DATAGRAM, + //% blockIdentity="control.eventValueId" + MICROBIT_ACCELEROMETER_EVT_DATA_UPDATE_ = MICROBIT_ACCELEROMETER_EVT_DATA_UPDATE, + //% blockIdentity="control.eventValueId" + MICROBIT_PIN_EVT_RISE_ = MICROBIT_PIN_EVT_RISE, + //% blockIdentity="control.eventValueId" + MICROBIT_PIN_EVT_FALL_ = MICROBIT_PIN_EVT_FALL, + //% blockIdentity="control.eventValueId" + MICROBIT_PIN_EVT_PULSE_HI_ = MICROBIT_PIN_EVT_PULSE_HI, + //% blockIdentity="control.eventValueId" + MICROBIT_PIN_EVT_PULSE_LO_ = MICROBIT_PIN_EVT_PULSE_LO, + //% blockIdentity="control.eventValueId" + MES_ALERT_EVT_ALARM1_ = MES_ALERT_EVT_ALARM1, + //% blockIdentity="control.eventValueId" + MES_ALERT_EVT_ALARM2_ = MES_ALERT_EVT_ALARM2, + //% blockIdentity="control.eventValueId" + MES_ALERT_EVT_ALARM3_ = MES_ALERT_EVT_ALARM3, + //% blockIdentity="control.eventValueId" + MES_ALERT_EVT_ALARM4_ = MES_ALERT_EVT_ALARM4, + //% blockIdentity="control.eventValueId" + MES_ALERT_EVT_ALARM5_ = MES_ALERT_EVT_ALARM5, + //% blockIdentity="control.eventValueId" + MES_ALERT_EVT_ALARM6_ = MES_ALERT_EVT_ALARM6, + //% blockIdentity="control.eventValueId" + MES_ALERT_EVT_DISPLAY_TOAST_ = MES_ALERT_EVT_DISPLAY_TOAST, + //% blockIdentity="control.eventValueId" + MES_ALERT_EVT_FIND_MY_PHONE_ = MES_ALERT_EVT_FIND_MY_PHONE, + //% blockIdentity="control.eventValueId" + MES_ALERT_EVT_PLAY_RINGTONE_ = MES_ALERT_EVT_PLAY_RINGTONE, + //% blockIdentity="control.eventValueId" + MES_ALERT_EVT_PLAY_SOUND_ = MES_ALERT_EVT_PLAY_SOUND, + //% blockIdentity="control.eventValueId" + MES_ALERT_EVT_VIBRATE_ = MES_ALERT_EVT_VIBRATE, + //% blockIdentity="control.eventValueId" + MES_CAMERA_EVT_LAUNCH_PHOTO_MODE_ = MES_CAMERA_EVT_LAUNCH_PHOTO_MODE, + //% blockIdentity="control.eventValueId" + MES_CAMERA_EVT_LAUNCH_VIDEO_MODE_ = MES_CAMERA_EVT_LAUNCH_VIDEO_MODE, + //% blockIdentity="control.eventValueId" + MES_CAMERA_EVT_START_VIDEO_CAPTURE_ = MES_CAMERA_EVT_START_VIDEO_CAPTURE, + //% blockIdentity="control.eventValueId" + MES_CAMERA_EVT_STOP_PHOTO_MODE_ = MES_CAMERA_EVT_STOP_PHOTO_MODE, + //% blockIdentity="control.eventValueId" + MES_CAMERA_EVT_STOP_VIDEO_CAPTURE_ = MES_CAMERA_EVT_STOP_VIDEO_CAPTURE, + //% blockIdentity="control.eventValueId" + MES_CAMERA_EVT_STOP_VIDEO_MODE_ = MES_CAMERA_EVT_STOP_VIDEO_MODE, + //% blockIdentity="control.eventValueId" + MES_CAMERA_EVT_TAKE_PHOTO_ = MES_CAMERA_EVT_TAKE_PHOTO, + //% blockIdentity="control.eventValueId" + MES_CAMERA_EVT_TOGGLE_FRONT_REAR_ = MES_CAMERA_EVT_TOGGLE_FRONT_REAR, + //% blockIdentity="control.eventValueId" + MES_DEVICE_DISPLAY_OFF_ = MES_DEVICE_DISPLAY_OFF, + //% blockIdentity="control.eventValueId" + MES_DEVICE_DISPLAY_ON_ = MES_DEVICE_DISPLAY_ON, + //% blockIdentity="control.eventValueId" + MES_DEVICE_GESTURE_DEVICE_SHAKEN_ = MES_DEVICE_GESTURE_DEVICE_SHAKEN, + //% blockIdentity="control.eventValueId" + MES_DEVICE_INCOMING_CALL_ = MES_DEVICE_INCOMING_CALL, + //% blockIdentity="control.eventValueId" + MES_DEVICE_INCOMING_MESSAGE_ = MES_DEVICE_INCOMING_MESSAGE, + //% blockIdentity="control.eventValueId" + MES_DEVICE_ORIENTATION_LANDSCAPE_ = MES_DEVICE_ORIENTATION_LANDSCAPE, + //% blockIdentity="control.eventValueId" + MES_DEVICE_ORIENTATION_PORTRAIT_ = MES_DEVICE_ORIENTATION_PORTRAIT, + //% blockIdentity="control.eventValueId" + MES_DPAD_BUTTON_1_DOWN_ = MES_DPAD_BUTTON_1_DOWN, + //% blockIdentity="control.eventValueId" + MES_DPAD_BUTTON_1_UP_ = MES_DPAD_BUTTON_1_UP, + //% blockIdentity="control.eventValueId" + MES_DPAD_BUTTON_2_DOWN_ = MES_DPAD_BUTTON_2_DOWN, + //% blockIdentity="control.eventValueId" + MES_DPAD_BUTTON_2_UP_ = MES_DPAD_BUTTON_2_UP, + //% blockIdentity="control.eventValueId" + MES_DPAD_BUTTON_3_DOWN_ = MES_DPAD_BUTTON_3_DOWN, + //% blockIdentity="control.eventValueId" + MES_DPAD_BUTTON_3_UP_ = MES_DPAD_BUTTON_3_UP, + //% blockIdentity="control.eventValueId" + MES_DPAD_BUTTON_4_DOWN_ = MES_DPAD_BUTTON_4_DOWN, + //% blockIdentity="control.eventValueId" + MES_DPAD_BUTTON_4_UP_ = MES_DPAD_BUTTON_4_UP, + //% blockIdentity="control.eventValueId" + MES_DPAD_BUTTON_A_DOWN_ = MES_DPAD_BUTTON_A_DOWN, + //% blockIdentity="control.eventValueId" + MES_DPAD_BUTTON_A_UP_ = MES_DPAD_BUTTON_A_UP, + //% blockIdentity="control.eventValueId" + MES_DPAD_BUTTON_B_DOWN_ = MES_DPAD_BUTTON_B_DOWN, + //% blockIdentity="control.eventValueId" + MES_DPAD_BUTTON_B_UP_ = MES_DPAD_BUTTON_B_UP, + //% blockIdentity="control.eventValueId" + MES_DPAD_BUTTON_C_DOWN_ = MES_DPAD_BUTTON_C_DOWN, + //% blockIdentity="control.eventValueId" + MES_DPAD_BUTTON_C_UP_ = MES_DPAD_BUTTON_C_UP, + //% blockIdentity="control.eventValueId" + MES_DPAD_BUTTON_D_DOWN_ = MES_DPAD_BUTTON_D_DOWN, + //% blockIdentity="control.eventValueId" + MES_DPAD_BUTTON_D_UP_ = MES_DPAD_BUTTON_D_UP, + //% blockIdentity="control.eventValueId" + MES_REMOTE_CONTROL_EVT_FORWARD_ = MES_REMOTE_CONTROL_EVT_FORWARD, + //% blockIdentity="control.eventValueId" + MES_REMOTE_CONTROL_EVT_NEXTTRACK_ = MES_REMOTE_CONTROL_EVT_NEXTTRACK, + //% blockIdentity="control.eventValueId" + MES_REMOTE_CONTROL_EVT_PAUSE_ = MES_REMOTE_CONTROL_EVT_PAUSE, + //% blockIdentity="control.eventValueId" + MES_REMOTE_CONTROL_EVT_PLAY_ = MES_REMOTE_CONTROL_EVT_PLAY, + //% blockIdentity="control.eventValueId" + MES_REMOTE_CONTROL_EVT_PREVTRACK_ = MES_REMOTE_CONTROL_EVT_PREVTRACK, + //% blockIdentity="control.eventValueId" + MES_REMOTE_CONTROL_EVT_REWIND_ = MES_REMOTE_CONTROL_EVT_REWIND, + //% blockIdentity="control.eventValueId" + MES_REMOTE_CONTROL_EVT_STOP_ = MES_REMOTE_CONTROL_EVT_STOP, + //% blockIdentity="control.eventValueId" + MES_REMOTE_CONTROL_EVT_VOLUMEDOWN_ = MES_REMOTE_CONTROL_EVT_VOLUMEDOWN, + //% blockIdentity="control.eventValueId" + MES_REMOTE_CONTROL_EVT_VOLUMEUP_ = MES_REMOTE_CONTROL_EVT_VOLUMEUP, +}; + +enum EventFlags { + //% + QueueIfBusy = MESSAGE_BUS_LISTENER_QUEUE_IF_BUSY, + //% + DropIfBusy = MESSAGE_BUS_LISTENER_DROP_IF_BUSY, + //% + Reentrant = MESSAGE_BUS_LISTENER_REENTRANT +}; + +//% weight=1 color="#333333" +//% advanced=true +namespace control { + void fiberDone(void *a) + { + decr((Action)a); + release_fiber(); + } + + /** + * Schedules code that run in the background. + */ + //% help=control/in-background blockAllowMultiple=1 afterOnStart=true + //% blockId="control_in_background" block="run in background" blockGap=8 + void inBackground(Action a) { + runInParallel(a); + } + + /** + * Resets the BBC micro:bit. + */ + //% weight=30 async help=control/reset blockGap=8 + //% blockId="control_reset" block="reset" + void reset() { + microbit_reset(); + } + + /** + * Blocks the current fiber for the given microseconds + * @param micros number of micro-seconds to wait. eg: 4 + */ + //% help=control/wait-micros weight=29 + //% blockId="control_wait_us" block="wait (µs)%micros" + void waitMicros(int micros) { + wait_us(micros); + } + + /** + * Raises an event in the event bus. + * @param src ID of the MicroBit Component that generated the event e.g. MICROBIT_ID_BUTTON_A. + * @param value Component specific code indicating the cause of the event. + * @param mode optional definition of how the event should be processed after construction (default is CREATE_AND_FIRE). + */ + //% weight=21 blockGap=12 blockId="control_raise_event" block="raise event|from source %src=control_event_source_id|with value %value=control_event_value_id" blockExternalInputs=1 + //% help=control/raise-event + //% mode.defl=CREATE_AND_FIRE + void raiseEvent(int src, int value, EventCreationMode mode) { + MicroBitEvent evt(src, value, (MicroBitEventLaunchMode)mode); + } + + /** + * Registers an event handler. + */ + //% weight=20 blockGap=8 blockId="control_on_event" block="on event|from %src=control_event_source_id|with value %value=control_event_value_id" + //% help=control/on-event + //% blockExternalInputs=1 + void onEvent(int src, int value, Action handler, int flags = 0) { + if (!flags) flags = EventFlags::QueueIfBusy; + registerWithDal(src, value, handler, (int)flags); + } + + /** + * Gets the value of the last event executed on the bus + */ + //% blockId=control_event_value" block="event value" + //% help=control/event-value + //% weight=18 + int eventValue() { + return pxt::lastEvent.value; + } + + /** + * Gets the timestamp of the last event executed on the bus + */ + //% blockId=control_event_timestamp" block="event timestamp" + //% help=control/event-timestamp + //% weight=19 blockGap=8 + int eventTimestamp() { + return pxt::lastEvent.timestamp; + } + + /** + * Make a friendly name for the device based on its serial number + */ + //% blockId="control_device_name" block="device name" weight=10 blockGap=8 + //% advanced=true + String deviceName() { + return mkString(microbit_friendly_name(), -1); + } + + /** + * Derive a unique, consistent serial number of this device from internal data. + */ + //% blockId="control_device_serial_number" block="device serial number" weight=9 + //% advanced=true + int deviceSerialNumber() { + return microbit_serial_number(); + } + + /** + * Informs simulator/runtime of a MIDI message + * Internal function to support the simulator. + */ + //% part=midioutput blockHidden=1 + void __midiSend(Buffer buffer) { + // this is a stub to support the simulator + } + + /** + * + */ + //% + void __log(String text) { + if (NULL == text) return; + pxt::sendSerial(text->getUTF8Data(), text->getUTF8Size()); + } +} diff --git a/pxt_modules/core/control.ts b/pxt_modules/core/control.ts new file mode 100644 index 0000000..d8dcf03 --- /dev/null +++ b/pxt_modules/core/control.ts @@ -0,0 +1,66 @@ +/** +* Runtime and event utilities. +*/ +//% weight=1 color="#333333" icon="\uf233" +//% advanced=true +namespace control { + + /** + * Returns the value of a C++ runtime constant + */ + //% weight=2 weight=19 blockId="control_event_source_id" block="%id" blockGap=8 + //% shim=TD_ID advanced=true + export function eventSourceId(id: EventBusSource): number { + return id; + } + /** + * Returns the value of a C++ runtime constant + */ + //% weight=1 weight=19 blockId="control_event_value_id" block="%id" + //% shim=TD_ID advanced=true + export function eventValueId(id: EventBusValue): number { + return id; + } + + /** + * Display specified error code and stop the program. + */ + //% shim=pxtrt::panic + export function panic(code: number) { } + + /** + * If the condition is false, display msg on serial console, and panic with code 098. + */ + export function assert(condition: boolean, msg?: string) { + if (!condition) { + console.log("ASSERTION FAILED") + if (msg != null) { + console.log(msg) + } + panic(98) + } + } + + export function fail(message: string) { + console.log("Fatal failure: ") + console.log(message) + panic(108) + } + + /** + * Display warning in the simulator. + */ + //% shim=pxtrt::runtimeWarning + export function runtimeWarning(message: string) { } +} + +/** + * Convert any value to text + * @param value value to be converted to text + */ +//% help=text/convert-to-text weight=1 +//% block="convert $value=math_number to text" +//% blockId=variable_to_text blockNamespace="text" +function convertToText(value: any): string { + return "" + value; +} \ No newline at end of file diff --git a/pxt_modules/core/core.cpp b/pxt_modules/core/core.cpp new file mode 100644 index 0000000..5d91fba --- /dev/null +++ b/pxt_modules/core/core.cpp @@ -0,0 +1,1837 @@ +#include "pxtbase.h" +#include +#include + +using namespace std; + +#define p10(v) __builtin_powi(10, v) + +// try not to create cons-strings shorter than this +#define SHORT_CONCAT_STRING 50 + +// bigger value - less memory, but slower +// 16/20 keeps s.length and s.charCodeAt(i) at about 200 cycles (for actual unicode strings), +// which is similar to amortized allocation time +#define SKIP_INCR 16 // needs to be power of 2; needs to be kept in sync with compiler +#define MIN_SKIP 20 // min. size of string to use skip list; static code has its own limit + +namespace pxt { + +PXT_DEF_STRING(emptyString, "") + +static HandlerBinding *handlerBindings; + +HandlerBinding *nextBinding(HandlerBinding *curr, int source, int value) { + for (auto p = curr; p; p = p->next) { + // DEVICE_ID_ANY == DEVICE_EXT_ANY == 0 + if ((p->source == source || p->source == 0) && + (p->value == value || p->value == 0)) { + return p; + } + } + return 0; +} + +HandlerBinding *findBinding(int source, int value) { + return nextBinding(handlerBindings, source, value); +} + +void setBinding(int source, int value, Action act) { + HandlerBinding* curr = NULL; + for (auto p = handlerBindings; p; p = p->next) { + if ((p->source == source) && (p->value == value)) { + curr = p; + break; + } + } + incr(act); + if (curr) { + decr(curr->action); + curr->action = act; + return; + } + curr = new HandlerBinding(); + curr->next = handlerBindings; + curr->source = source; + curr->value = value; + curr->action = act; + registerGC(&curr->action); + handlerBindings = curr; +} + +static const char emptyBuffer[] __attribute__((aligned(4))) = "@PXT#:\x00\x00\x00"; + +#if PXT_UTF8 +int utf8Len(const char *data, int size) { + int len = 0; + for (int i = 0; i < size; ++i) { + char c = data[i]; + len++; + if ((c & 0x80) == 0x00) { + // skip + } else if ((c & 0xe0) == 0xc0) { + i++; + } else if ((c & 0xf0) == 0xe0) { + i += 2; + } else { + // error; just skip + } + } + return len; +} + +const char *utf8Skip(const char *data, int size, int skip) { + int len = 0; + for (int i = 0; i <= size; ++i) { + char c = data[i]; + len++; + if (len > skip) + return data + i; + if ((c & 0x80) == 0x00) { + // skip + } else if ((c & 0xe0) == 0xc0) { + i++; + } else if ((c & 0xf0) == 0xe0) { + i += 2; + } else { + // error; just skip over + } + } + return NULL; +} + +static char *write3byte(char *dst, uint32_t charCode) { + if (dst) { + *dst++ = 0xe0 | (charCode >> 12); + *dst++ = 0x80 | (0x3f & (charCode >> 6)); + *dst++ = 0x80 | (0x3f & (charCode >> 0)); + } + return dst; +} + +static char *write2byte(char *dst, uint32_t charCode) { + if (dst) { + *dst++ = 0xc0 | (charCode >> 6); + *dst++ = 0x80 | (0x3f & charCode); + } + return dst; +} + +static int utf8canon(char *dst, const char *data, int size) { + int outsz = 0; + for (int i = 0; i < size;) { + uint8_t c = data[i]; + uint32_t charCode = c; + if ((c & 0x80) == 0x00) { + charCode = c; + i++; + } else if ((c & 0xe0) == 0xc0 && i + 1 < size && (data[i + 1] & 0xc0) == 0x80) { + charCode = ((c & 0x1f) << 6) | (data[i + 1] & 0x3f); + if (charCode < 0x80) + goto error; + else + i += 2; + } else if ((c & 0xf0) == 0xe0 && i + 2 < size && (data[i + 1] & 0xc0) == 0x80 && + (data[i + 2] & 0xc0) == 0x80) { + charCode = ((c & 0x0f) << 12) | (data[i + 1] & 0x3f) << 6 | (data[i + 2] & 0x3f); + // don't exclude surrogate pairs, since we're generating them + if (charCode < 0x800 /*|| (0xd800 <= charCode && charCode <= 0xdfff)*/) + goto error; + else + i += 3; + } else if ((c & 0xf8) == 0xf0 && i + 3 < size && (data[i + 1] & 0xc0) == 0x80 && + (data[i + 2] & 0xc0) == 0x80 && (data[i + 3] & 0xc0) == 0x80) { + charCode = ((c & 0x07) << 18) | (data[i + 1] & 0x3f) << 12 | (data[i + 2] & 0x3f) << 6 | + (data[i + 3] & 0x3f); + if (charCode < 0x10000 || charCode > 0x10ffff) + goto error; + else + i += 4; + } else { + goto error; + } + + if (charCode < 0x80) { + outsz += 1; + if (dst) + *dst++ = charCode; + } else if (charCode < 0x800) { + outsz += 2; + dst = write2byte(dst, charCode); + } else if (charCode < 0x10000) { + outsz += 3; + dst = write3byte(dst, charCode); + } else { + outsz += 6; // a surrogate pair + charCode -= 0x10000; + dst = write3byte(dst, 0xd800 + (charCode >> 10)); + dst = write3byte(dst, 0xdc00 + (charCode & 0x3ff)); + } + + continue; + + error: + i++; + outsz += 2; + dst = write2byte(dst, c); + } + return outsz; +} + +static int utf8CharCode(const char *data) { + unsigned char c = *data; + if ((c & 0x80) == 0) { + return c; + } else if ((c & 0xe0) == 0xc0) { + return ((c & 0x1f) << 6) | (data[1] & 0x3f); + } else if ((c & 0xf0) == 0xe0) { + return ((c & 0x0f) << 12) | (data[1] & 0x3f) << 6 | (data[2] & 0x3f); + } else { + return c; // error + } +} + +static bool isUTF8(const char *data, int len) { + for (int i = 0; i < len; ++i) { + if (data[i] & 0x80) + return true; + } + return false; +} + +#define NUM_SKIP_ENTRIES(p) ((p)->skip.length / SKIP_INCR) +#define SKIP_DATA(p) (const char *)(p->skip.list + NUM_SKIP_ENTRIES(p)) + +static void setupSkipList(String r, const char *data) { + char *dst = (char *)SKIP_DATA(r); + auto len = r->skip.size; + if (data) + memcpy(dst, data, len); + dst[len] = 0; + const char *ptr = dst; + auto skipEntries = NUM_SKIP_ENTRIES(r); + for (int i = 0; i < skipEntries; ++i) { + ptr = utf8Skip(ptr, len - (ptr - dst), SKIP_INCR); + if (!ptr) + oops(80); + r->skip.list[i] = ptr - dst; + } +} +#endif + +String mkStringCore(const char *data, int len) { + if (len < 0) + len = strlen(data); + if (len == 0) + return (String)emptyString; + + auto vt = &string_inline_ascii_vt; + String r; + +#if PXT_UTF8 + if (data && isUTF8(data, len)) { + vt = len >= MIN_SKIP ? &string_skiplist16_vt : &string_inline_utf8_vt; + } + if (vt == &string_skiplist16_vt) { + r = new (gcAllocate(4 + 2 * 4)) BoxedString(vt); + r->skip.list = NULL; + registerGCPtr((TValue)r); + r->skip.size = len; + r->skip.length = utf8Len(data, len); + r->skip.list = (uint16_t *)gcAllocateArray(NUM_SKIP_ENTRIES(r) * 2 + len + 1); + setupSkipList(r, data); + unregisterGCPtr((TValue)r); + } else +#endif + { + // for ASCII and UTF8 the layout is the same + r = new (gcAllocate(4 + 2 + len + 1)) BoxedString(vt); + r->ascii.length = len; + if (data) + memcpy(r->ascii.data, data, len); + r->ascii.data[len] = 0; + } + + MEMDBG("mkString: len=%d => %p", len, r); + return r; +} + +String mkString(const char *data, int len) { +#if PXT_UTF8 + if (len < 0) + len = strlen(data); + if (len == 0) + return (String)emptyString; + + int sz = utf8canon(NULL, data, len); + if (sz == len) + return mkStringCore(data, len); + // this could be optimized, but it only kicks in when the string isn't valid utf8 + // (or we need to introduce surrogate pairs) which is unlikely to be performance critical + char *tmp = (char *)app_alloc(sz); + utf8canon(tmp, data, len); + auto r = mkStringCore(tmp, sz); + app_free(tmp); + return r; +#else + return mkStringCore(data, len); +#endif +} + +#if PXT_UTF8 +// This converts surrogate pairs, which are encoded as 2 characters of 3 bytes each +// into a proper 4 byte utf-8 character. +uint32_t toRealUTF8(String str, uint8_t *dst) { + auto src = str->getUTF8Data(); + auto len = str->getUTF8Size(); + auto dlen = 0; + + for (unsigned i = 0; i < len; ++i) { + if ((uint8_t)src[i] == 0xED && i + 5 < len) { + auto c0 = utf8CharCode(src + i); + auto c1 = utf8CharCode(src + i + 3); + if (0xd800 <= c0 && c0 < 0xdc00 && 0xdc00 <= c1 && c1 < 0xe000) { + i += 5; + auto charCode = ((c0 - 0xd800) << 10) + (c1 - 0xdc00) + 0x10000; + if (dst) { + dst[dlen] = 0xf0 | (charCode >> 18); + dst[dlen + 1] = 0x80 | (0x3f & (charCode >> 12)); + dst[dlen + 2] = 0x80 | (0x3f & (charCode >> 6)); + dst[dlen + 3] = 0x80 | (0x3f & (charCode >> 0)); + } + dlen += 4; + } + } else { + if (dst) + dst[dlen] = src[i]; + dlen++; + } + } + return dlen; +} +#endif + +Buffer mkBuffer(const uint8_t *data, int len) { + if (len <= 0) + return (Buffer)emptyBuffer; + Buffer r = new (gcAllocate(sizeof(BoxedBuffer) + len)) BoxedBuffer(); + r->length = len; + if (data) + memcpy(r->data, data, len); + else + memset(r->data, 0, len); + MEMDBG("mkBuffer: len=%d => %p", len, r); + return r; +} + +static unsigned random_value = 0xC0DA1; + +void seedRandom(unsigned seed) { + random_value = seed; +} + +void seedAddRandom(unsigned seed) { + random_value = (random_value * 0x1000193) ^ seed; +} + +unsigned getRandom(unsigned max) { + unsigned m, result; + + do { + m = (unsigned)max; + result = 0; + + do { + // Cycle the LFSR (Linear Feedback Shift Register). + // We use an optimal sequence with a period of 2^32-1, as defined by Bruce Schneier here + // (a true legend in the field!), + // For those interested, it's documented in his paper: + // "Pseudo-Random Sequence Generator for 32-Bit CPUs: A fast, machine-independent + // generator for 32-bit Microprocessors" + // https://www.schneier.com/paper-pseudorandom-sequence.html + unsigned r = random_value; + + r = ((((r >> 31) ^ (r >> 6) ^ (r >> 4) ^ (r >> 2) ^ (r >> 1) ^ r) & 1) << 31) | + (r >> 1); + + random_value = r; + + result = ((result << 1) | (r & 0x00000001)); + } while (m >>= 1); + } while (result > (unsigned)max); + + return result; +} + +TNumber BoxedString::charCodeAt(int pos) { +#if PXT_UTF8 + auto ptr = this->getUTF8DataAt(pos); + if (!ptr) + return TAG_NAN; + auto code = utf8CharCode(ptr); + if (!code && ptr == this->getUTF8Data() + this->getUTF8Size()) + return TAG_NAN; + return fromInt(code); +#else + if (0 <= pos && pos < this->ascii.length) { + return fromInt(this->ascii.data[pos]); + } else { + return TAG_NAN; + } +#endif +} + +PXT_DEF_STRING(sTrue, "true") +PXT_DEF_STRING(sFalse, "false") +PXT_DEF_STRING(sUndefined, "undefined") +PXT_DEF_STRING(sNull, "null") +PXT_DEF_STRING(sObject, "[Object]") +PXT_DEF_STRING(sFunction, "[Function]") +PXT_DEF_STRING(sNaN, "NaN") +PXT_DEF_STRING(sInf, "Infinity") +PXT_DEF_STRING(sMInf, "-Infinity") +} // namespace pxt + +#ifndef X86_64 + +namespace String_ { + +//% +String mkEmpty() { + return (String)emptyString; +} + +// TODO support var-args somehow? + +//% +String fromCharCode(int code) { +#if PXT_UTF8 + char buf[3]; + int len; + code &= 0xffff; // JS semantics + if (code < 0x80) { + buf[0] = code; + len = 1; + } else if (code < 0x800) { + buf[0] = 0xc0 | (code >> 6); + buf[1] = 0x80 | ((code >> 0) & 0x3f); + len = 2; + } else { + buf[0] = 0xe0 | (code >> 12); + buf[1] = 0x80 | ((code >> 6) & 0x3f); + buf[2] = 0x80 | ((code >> 0) & 0x3f); + len = 3; + } + return mkStringCore(buf, len); +#else + char buf[] = {(char)code, 0}; + return mkStringCore(buf, 1); +#endif +} + + + +//% +TNumber charCodeAt(String s, int pos) { + if (!s) return TAG_NAN; + return s->charCodeAt(pos); +} + +//% +String charAt(String s, int pos) { + auto v = charCodeAt(s, pos); + if (v == TAG_NAN) + return mkEmpty(); + if (!isNumber(v)) + oops(81); + return fromCharCode(numValue(v)); +} + +#define IS_CONS(s) ((s)->vtable == (uint32_t)&string_cons_vt) +#define IS_EMPTY(s) ((s) == (String)emptyString) + +//% +String concat(String s, String other) { + if (!s) + s = (String)sNull; + if (!other) + other = (String)sNull; + if (IS_EMPTY(s)) + return (String)incrRC(other); + if (IS_EMPTY(other)) + return (String)incrRC(s); + + uint32_t lenA, lenB; + +#if PXT_UTF8 + if (IS_CONS(s)) { + // (s->cons.left + s->cons.right) + other = s->cons.left + (s->cons.right + other) + if (IS_CONS(other) || IS_CONS(s->cons.right)) + goto mkCons; + auto lenAR = s->cons.right->getUTF8Size(); + lenB = other->getUTF8Size(); + if (lenAR + lenB > SHORT_CONCAT_STRING) + goto mkCons; + // if (s->cons.right + other) is short enough, use associativity + // to construct a shallower tree; this should keep the live set reasonable + // when someone decides to construct a long string by concatenating + // single characters + + // allocate [r] first, and keep it alive + String r = new (gcAllocate(4 + 2 * 4)) BoxedString(&string_cons_vt); + registerGCPtr((TValue)r); + r->cons.left = s->cons.left; + // this concat() might trigger GC + r->cons.right = concat(s->cons.right, other); + unregisterGCPtr((TValue)r); + return r; + } +#endif + + lenA = s->getUTF8Size(); + lenB = other->getUTF8Size(); +#if PXT_UTF8 + if (lenA + lenB > SHORT_CONCAT_STRING) + goto mkCons; +#endif + String r; + { + auto dataA = s->getUTF8Data(); + auto dataB = other->getUTF8Data(); + r = mkStringCore(NULL, lenA + lenB); + auto dst = (char *)r->getUTF8Data(); + memcpy(dst, dataA, lenA); + memcpy(dst + lenA, dataB, lenB); +#if PXT_UTF8 + if (isUTF8(dst, lenA + lenB)) + r->vtable = PXT_VTABLE_TO_INT(&string_inline_utf8_vt); +#endif + return r; + } + +#if PXT_UTF8 +mkCons: + r = new (gcAllocate(4 + 2 * 4)) BoxedString(&string_cons_vt); + r->cons.left = s; + r->cons.right = other; + return r; +#endif +} + +int compare(String a, String b) { + if (a == b) + return 0; + + auto lenA = a->getUTF8Size(); + auto lenB = b->getUTF8Size(); + auto dataA = a->getUTF8Data(); + auto dataB = b->getUTF8Data(); + auto len = lenA < lenB ? lenA : lenB; + + // this also works for UTF8, provided canonical encoding + // which is guaranteed by the constructor + for (unsigned i = 0; i <= len; ++i) { + unsigned char cA = dataA[i]; + unsigned char cB = dataB[i]; + if (cA == cB) + continue; + return cA < cB ? -1 : 1; + } + return 0; +} + +//% +int length(String s) { + return s->getLength(); +} + +#define isspace(c) ((c) == ' ') + +NUMBER mystrtod(const char *p, char **endp) { + while (isspace(*p)) + p++; + NUMBER m = 1; + NUMBER v = 0; + int dot = 0; + if (*p == '+') + p++; + if (*p == '-') { + m = -1; + p++; + } + if (*p == '0' && (p[1] | 0x20) == 'x') { + return m * strtol(p, endp, 16); + } + while (*p) { + int c = *p - '0'; + if (0 <= c && c <= 9) { + v *= 10; + v += c; + if (dot) + m /= 10; + } else if (!dot && *p == '.') { + dot = 1; + } else if (*p == 'e' || *p == 'E') { + break; + } else { + while (isspace(*p)) + p++; + if (*p) + return NAN; + break; + } + p++; + } + + v *= m; + + if (*p) { + p++; + int pw = strtol(p, endp, 10); + v *= p10(pw); + } else { + *endp = (char *)p; + } + + return v; +} + +//% +TNumber toNumber(String s) { + // JSCHECK + char *endptr; + auto data = s->getUTF8Data(); + NUMBER v = mystrtod(data, &endptr); + if (endptr != data + s->getUTF8Size()) + v = NAN; + else if (v == 0.0 || v == -0.0) + v = v; + else if (!isnormal(v)) + v = NAN; + return fromDouble(v); +} + +//% +String substr(String s, int start, int length) { + if (length <= 0) + return mkEmpty(); + auto slen = (int)s->getLength(); + if (start < 0) + start = max(slen + start, 0); + length = min(length, slen - start); + if (length <= 0) + return mkEmpty(); + auto p = s->getUTF8DataAt(start); +#if PXT_UTF8 + auto ep = s->getUTF8DataAt(start + length); + if (ep == NULL) + oops(82); + return mkStringCore(p, ep - p); +#else + return mkStringCore(p, length); +#endif +} + +//% +int indexOf(String s, String searchString, int start) { + if (!s || !searchString) + return -1; + auto lenA = s->getUTF8Size(); + auto lenB = searchString->getUTF8Size(); + if (start < 0 || start + lenB > lenA) + return -1; + auto dataA = s->getUTF8Data(); + auto dataB = searchString->getUTF8Data(); + auto dataA0 = dataA; + auto firstB = dataB[0]; + while (lenA >= lenB) { + if (*dataA == firstB && !memcmp(dataA, dataB, lenB)) +#if PXT_UTF8 + return utf8Len(dataA0, dataA - dataA0); +#else + return dataA - dataA0; +#endif + dataA++; + lenA--; + } + return -1; +} + +//% +int includes(String s, String searchString, int start) { + return -1 != indexOf(s, searchString, start); +} + +} // namespace String_ + +namespace Boolean_ { +//% +bool bang(int v) { + return v == 0; +} +} // namespace Boolean_ + +namespace pxt { + +// ES5 9.5, 9.6 +unsigned toUInt(TNumber v) { + if (isNumber(v)) + return numValue(v); + if (isSpecial(v)) { + if ((intptr_t)v >> 6) + return 1; + else + return 0; + } + if (!v) + return 0; + + NUMBER num = toDouble(v); + if (!isnormal(num)) + return 0; +#ifdef PXT_USE_FLOAT + float rem = fmodf(truncf(num), 4294967296.0); +#else + double rem = fmod(trunc(num), 4294967296.0); +#endif + if (rem < 0.0) + rem += 4294967296.0; + return (unsigned)rem; +} +int toInt(TNumber v) { + return (int)toUInt(v); +} + +NUMBER toDouble(TNumber v) { + if (v == TAG_NAN || v == TAG_UNDEFINED) + return NAN; + if (isTagged(v)) + return toInt(v); + + ValType t = valType(v); + if (t == ValType::Number) { + BoxedNumber *p = (BoxedNumber *)v; + return p->num; + } else if (t == ValType::String) { + // TODO avoid allocation + auto tmp = String_::toNumber((String)v); + auto r = toDouble(tmp); + decr(tmp); + return r; + } else { + return NAN; + } +} + +float toFloat(TNumber v) { + // TODO optimize? + return (float)toDouble(v); +} + +#if !defined(PXT_HARD_FLOAT) && !defined(PXT_USE_FLOAT) +union NumberConv { + double v; + struct { + uint32_t word0; + uint32_t word1; + }; +}; + +static inline TValue doubleToInt(double x) { + NumberConv cnv; + cnv.v = x; + + if (cnv.word1 == 0 && cnv.word0 == 0) + return TAG_NUMBER(0); + + auto ex = (int)((cnv.word1 << 1) >> 21) - 1023; + + // DMESG("v=%d/1000 %p %p %d", (int)(x * 1000), cnv.word0, cnv.word1, ex); + + if (ex < 0 || ex > 29) { + // the 'MININT' case + if (ex == 30 && cnv.word0 == 0 && cnv.word1 == 0xC1D00000) + return (TValue)(0x80000001); + return NULL; + } + + int32_t r; + + if (ex <= 20) { + if (cnv.word0) + return TAG_UNDEFINED; + if (cnv.word1 << (ex + 12)) + return TAG_UNDEFINED; + r = ((cnv.word1 << 11) | 0x80000000) >> (20 - ex + 11); + } else { + if (cnv.word0 << (ex - 20)) + return TAG_UNDEFINED; + r = ((cnv.word1 << 11) | 0x80000000) >> (20 - ex + 11); + r |= cnv.word0 >> (32 - (ex - 20)); + } + + if (cnv.word1 >> 31) + return TAG_NUMBER(-r); + else + return TAG_NUMBER(r); +} +#else +static inline TValue doubleToInt(NUMBER r) { + int ri = ((int)r) << 1; + if ((ri >> 1) == r) + return (TNumber)(ri | 1); + return TAG_UNDEFINED; +} +#endif + +TNumber fromDouble(NUMBER r) { +#ifndef PXT_BOX_DEBUG + auto i = doubleToInt(r); + if (i) + return i; +#endif + if (isnan(r)) + return TAG_NAN; + BoxedNumber *p = NEW_GC(BoxedNumber); + p->num = r; + MEMDBG("mkNum: %d/1000 => %p", (int)(r * 1000), p); + return (TNumber)p; +} + +TNumber fromFloat(float r) { + // TODO optimize + return fromDouble(r); +} + +TNumber fromInt(int v) { + if (canBeTagged(v)) + return TAG_NUMBER(v); + return fromDouble(v); +} + +TNumber fromUInt(unsigned v) { +#ifndef PXT_BOX_DEBUG + if (v <= 0x3fffffff) + return TAG_NUMBER(v); +#endif + return fromDouble(v); +} + +TValue fromBool(bool v) { + if (v) + return TAG_TRUE; + else + return TAG_FALSE; +} + +TNumber eqFixup(TNumber v) { + if (v == TAG_NULL) + return TAG_UNDEFINED; + if (v == TAG_TRUE) + return TAG_NUMBER(1); + if (v == TAG_FALSE) + return TAG_NUMBER(0); + return v; +} + +static inline bool eq_core(TValue a, TValue b, ValType ta) { +#ifndef PXT_BOX_DEBUG + int aa = (int)a; + int bb = (int)b; + + // if at least one of the values is tagged, they are not equal + if ((aa | bb) & 3) + return false; +#endif + + if (ta == ValType::String) + return String_::compare((String)a, (String)b) == 0; + else if (ta == ValType::Number) + return toDouble(a) == toDouble(b); + else + return a == b; +} + +bool eqq_bool(TValue a, TValue b) { + if (a == TAG_NAN || b == TAG_NAN) + return false; + + if (a == b) + return true; + + if (bothNumbers(a, b)) + return false; + + ValType ta = valType(a); + ValType tb = valType(b); + + if (ta != tb) + return false; + + return eq_core(a, b, ta); +} + +bool eq_bool(TValue a, TValue b) { + if (a == TAG_NAN || b == TAG_NAN) + return false; + + if (eqFixup(a) == eqFixup(b)) + return true; + + if (bothNumbers(a, b)) + return false; + + ValType ta = valType(a); + ValType tb = valType(b); + + if ((ta == ValType::String && tb == ValType::Number) || + (tb == ValType::String && ta == ValType::Number)) + return toDouble(a) == toDouble(b); + + if (ta == ValType::Boolean) { + a = eqFixup(a); + ta = ValType::Number; + } + if (tb == ValType::Boolean) { + b = eqFixup(b); + tb = ValType::Number; + } + + if (ta != tb) + return false; + + return eq_core(a, b, ta); +} + +// TODO move to assembly +//% +bool switch_eq(TValue a, TValue b) { + if (eq_bool(a, b)) { + decr(b); + return true; + } + return false; +} + +} // namespace pxt + +#define NUMOP(op) return fromDouble(toDouble(a) op toDouble(b)); +#define BITOP(op) return fromInt(toInt(a) op toInt(b)); +namespace numops { + +int toBool(TValue v) { + if (isTagged(v)) { + if (v == TAG_FALSE || v == TAG_UNDEFINED || v == TAG_NAN || v == TAG_NULL || + v == TAG_NUMBER(0)) + return 0; + else + return 1; + } + + ValType t = valType(v); + if (t == ValType::String) { + String s = (String)v; + if (IS_EMPTY(s)) + return 0; + } else if (t == ValType::Number) { + auto x = toDouble(v); + if (isnan(x) || x == 0.0 || x == -0.0) + return 0; + else + return 1; + } + + return 1; +} + +int toBoolDecr(TValue v) { + if (v == TAG_TRUE) + return 1; + if (v == TAG_FALSE) + return 0; + int r = toBool(v); + decr(v); + return r; +} + +// TODO +// The integer, non-overflow case for add/sub/bit opts is handled in assembly + +//% +TNumber adds(TNumber a, TNumber b){NUMOP(+)} + +//% +TNumber subs(TNumber a, TNumber b){NUMOP(-)} + +//% +TNumber muls(TNumber a, TNumber b) { + if (bothNumbers(a, b)) { + int aa = (int)a; + int bb = (int)b; + // if both operands fit 15 bits, the result will not overflow int + if ((aa >> 15 == 0 || aa >> 15 == -1) && (bb >> 15 == 0 || bb >> 15 == -1)) { + // it may overflow 31 bit int though - use fromInt to convert properly + return fromInt((aa >> 1) * (bb >> 1)); + } + } + NUMOP(*) +} + +//% +TNumber div(TNumber a, TNumber b){NUMOP(/)} + +//% +TNumber mod(TNumber a, TNumber b) { + if (isNumber(a) && isNumber(b) && numValue(b)) + BITOP(%) + return fromDouble(fmod(toDouble(a), toDouble(b))); +} + +//% +TNumber lsls(TNumber a, TNumber b){BITOP(<<)} + +//% +TNumber lsrs(TNumber a, TNumber b) { + return fromUInt(toUInt(a) >> toUInt(b)); +} + +//% +TNumber asrs(TNumber a, TNumber b){BITOP(>>)} + +//% +TNumber eors(TNumber a, TNumber b){BITOP (^)} + +//% +TNumber orrs(TNumber a, TNumber b){BITOP(|)} + +//% +TNumber bnot(TNumber a) { + return fromInt(~toInt(a)); +} + +//% +TNumber ands(TNumber a, TNumber b) { + BITOP(&) +} + +#define CMPOP_RAW(op, t, f) \ + if (bothNumbers(a, b)) \ + return (int)a op((int)b) ? t : f; \ + int cmp = valCompare(a, b); \ + return cmp != -2 && cmp op 0 ? t : f; + +#define CMPOP(op) CMPOP_RAW(op, TAG_TRUE, TAG_FALSE) + +// 7.2.13 Abstract Relational Comparison +static int valCompare(TValue a, TValue b) { + if (a == TAG_NAN || b == TAG_NAN) + return -2; + + ValType ta = valType(a); + ValType tb = valType(b); + + if (ta == ValType::String && tb == ValType::String) + return String_::compare((String)a, (String)b); + + if (a == b) + return 0; + + auto da = toDouble(a); + auto db = toDouble(b); + + if (isnan(da) || isnan(db)) + return -2; + + if (da < db) + return -1; + else if (da > db) + return 1; + else + return 0; +} + +//% +bool lt_bool(TNumber a, TNumber b){CMPOP_RAW(<, true, false)} + +//% +TNumber le(TNumber a, TNumber b){CMPOP(<=)} + +//% +TNumber lt(TNumber a, TNumber b){CMPOP(<)} + +//% +TNumber ge(TNumber a, TNumber b){CMPOP(>=)} + +//% +TNumber gt(TNumber a, TNumber b){CMPOP(>)} + +//% +TNumber eq(TNumber a, TNumber b) { + return pxt::eq_bool(a, b) ? TAG_TRUE : TAG_FALSE; +} + +//% +TNumber neq(TNumber a, TNumber b) { + return !pxt::eq_bool(a, b) ? TAG_TRUE : TAG_FALSE; +} + +//% +TNumber eqq(TNumber a, TNumber b) { + return pxt::eqq_bool(a, b) ? TAG_TRUE : TAG_FALSE; +} + +//% +TNumber neqq(TNumber a, TNumber b) { + return !pxt::eqq_bool(a, b) ? TAG_TRUE : TAG_FALSE; +} + +void mycvt(NUMBER d, char *buf) { + if (d < 0) { + *buf++ = '-'; + d = -d; + } + + if (!d) { + *buf++ = '0'; + *buf++ = 0; + return; + } + + int pw = (int)log10(d); + int e = 1; + int beforeDot = 1; + + if (0.000001 <= d && d < 1e21) { + if (pw > 0) { + d /= p10(pw); + beforeDot = 1 + pw; + } + } else { + d /= p10(pw); + e = pw; + } + + int sig = 0; + while (sig < 17 || beforeDot > 0) { + // printf("%f sig=%d bd=%d\n", d, sig, beforeDot); + int c = (int)d; + *buf++ = '0' + c; + d = (d - c) * 10; + if (--beforeDot == 0) + *buf++ = '.'; + if (sig || c) + sig++; + } + + buf--; + while (*buf == '0') + buf--; + if (*buf == '.') + buf--; + buf++; + + if (e != 1) { + *buf++ = 'e'; + itoa(e, buf); + } else { + *buf = 0; + } +} + +#if 0 +//% +TValue floatAsInt(TValue x) { + return doubleToInt(toDouble(x)); +} + +//% shim=numops::floatAsInt +function floatAsInt(v: number): number { return 0 } + +function testInt(i: number) { + if (floatAsInt(i) != i) + control.panic(101) + if (floatAsInt(i + 0.5) != null) + control.panic(102) + if (floatAsInt(i + 0.00001) != null) + control.panic(103) +} + +function testFloat(i: number) { + if (floatAsInt(i) != null) + control.panic(104) +} + +function testFloatAsInt() { + for (let i = 0; i < 0xffff; ++i) { + testInt(i) + testInt(-i) + testInt(i * 10000) + testInt(i << 12) + testInt(i + 0x3fff0001) + testInt(-i - 0x3fff0002) + testFloat(i + 0x3fffffff + 1) + testFloat((i + 10000) * 1000000) + } +} +#endif + +String toString(TValue v) { + ValType t = valType(v); + + if (t == ValType::String) { + return (String)(void *)incr(v); + } else if (t == ValType::Number) { + char buf[64]; + + if (isNumber(v)) { + itoa(numValue(v), buf); + return mkStringCore(buf); + } + + if (v == TAG_NAN) + return (String)(void *)sNaN; + + auto x = toDouble(v); + +#ifdef PXT_BOX_DEBUG + if (x == (int)x) { + itoa((int)x, buf); + return mkStringCore(buf); + } +#endif + + if (isinf(x)) { + if (x < 0) + return (String)(void *)sMInf; + else + return (String)(void *)sInf; + } else if (isnan(x)) { + return (String)(void *)sNaN; + } + mycvt(x, buf); + + return mkStringCore(buf); + } else if (t == ValType::Function) { + return (String)(void *)sFunction; + } else { + if (v == TAG_UNDEFINED) + return (String)(void *)sUndefined; + else if (v == TAG_FALSE) + return (String)(void *)sFalse; + else if (v == TAG_NAN) + return (String)(void *)sNaN; + else if (v == TAG_TRUE) + return (String)(void *)sTrue; + else if (v == TAG_NULL) + return (String)(void *)sNull; + return (String)(void *)sObject; + } +} + +} // namespace numops + +namespace Math_ { +//% +TNumber pow(TNumber x, TNumber y) { +#ifdef PXT_POWI + // regular pow() from math.h is 4k of code + return fromDouble(__builtin_powi(toDouble(x), toInt(y))); +#else + return fromDouble(::pow(toDouble(x), toDouble(y))); +#endif +} + +NUMBER randomDouble() { + return getRandom(UINT_MAX) / ((NUMBER)UINT_MAX + 1) + + getRandom(0xffffff) / ((NUMBER)UINT_MAX * 0xffffff); +} + +//% +TNumber random() { + return fromDouble(randomDouble()); +} + +//% +TNumber randomRange(TNumber min, TNumber max) { + if (isNumber(min) && isNumber(max)) { + int mini = numValue(min); + int maxi = numValue(max); + if (mini > maxi) { + int temp = mini; + mini = maxi; + maxi = temp; + } + if (maxi == mini) + return fromInt(mini); + else + return fromInt(mini + getRandom(maxi - mini)); + } else { + auto mind = toDouble(min); + auto maxd = toDouble(max); + if (mind > maxd) { + auto temp = mind; + mind = maxd; + maxd = temp; + } + if (maxd == mind) + return fromDouble(mind); + else { + return fromDouble(mind + randomDouble() * (maxd - mind)); + } + } +} + +#define SINGLE(op) return fromDouble(::op(toDouble(x))); + +//% +TNumber log(TNumber x){SINGLE(log)} + +//% +TNumber log10(TNumber x){SINGLE(log10)} + +//% +TNumber floor(TNumber x){SINGLE(floor)} + +//% +TNumber ceil(TNumber x){SINGLE(ceil)} + +//% +TNumber trunc(TNumber x){SINGLE(trunc)} + +//% +TNumber round(TNumber x) { + // In C++, round(-1.5) == -2, while in JS, round(-1.5) == -1. Align to the JS convention for + // consistency between simulator and device. The following does rounding with ties (x.5) going + // towards positive infinity. + return fromDouble(::floor(toDouble(x) + 0.5)); +} + +//% +int imul(int x, int y) { + return x * y; +} + +//% +int idiv(int x, int y) { + return x / y; +} +} // namespace Math_ + +namespace Array_ { +RefCollection *mk() { + auto r = NEW_GC(RefCollection); + MEMDBG("mkColl: => %p", r); + return r; +} +int length(RefCollection *c) { + return c->length(); +} +void setLength(RefCollection *c, int newLength) { + c->setLength(newLength); +} +void push(RefCollection *c, TValue x) { + c->head.push(x); +} +TValue pop(RefCollection *c) { + return c->head.pop(); +} +TValue getAt(RefCollection *c, int x) { + return c->head.get(x); +} +void setAt(RefCollection *c, int x, TValue y) { + c->head.set(x, y); +} +TValue removeAt(RefCollection *c, int x) { + return c->head.remove(x); +} +void insertAt(RefCollection *c, int x, TValue value) { + c->head.insert(x, value); +} +int indexOf(RefCollection *c, TValue x, int start) { + auto data = c->head.getData(); + auto len = c->head.getLength(); + for (unsigned i = 0; i < len; i++) { + if (pxt::eq_bool(data[i], x)) { + return (int)i; + } + } + return -1; +} +bool removeElement(RefCollection *c, TValue x) { + int idx = indexOf(c, x, 0); + if (idx >= 0) { + decr(removeAt(c, idx)); + return 1; + } + return 0; +} +} // namespace Array_ + +namespace pxt { +//% +void *ptrOfLiteral(int offset); + +//% +unsigned programSize() { + return bytecode[17] * 8; +} + +void deepSleep() __attribute__((weak)); +//% +void deepSleep() { } + +int *getBootloaderConfigData() __attribute__((weak)); +int *getBootloaderConfigData() +{ + return NULL; +} + +//% +int getConfig(int key, int defl) { + int *cfgData = *(int **)&bytecode[18]; + + for (int i = 0;; i += 2) { + if (cfgData[i] == key) + return cfgData[i + 1]; + if (cfgData[i] == 0) + break; + } + + cfgData = getBootloaderConfigData(); + + if (cfgData) { + for (int i = 0;; i += 2) { + if (cfgData[i] == key) + return cfgData[i + 1]; + if (cfgData[i] == 0) + break; + } + } + + return defl; +} + +} // namespace pxt + +namespace pxtrt { +//% +TValue ldlocRef(RefRefLocal *r) { + TValue tmp = r->v; + incr(tmp); + return tmp; +} + +//% +void stlocRef(RefRefLocal *r, TValue v) { + decr(r->v); + r->v = v; +} + +//% +RefRefLocal *mklocRef() { + auto r = NEW_GC(RefRefLocal); + MEMDBG("mklocRef: => %p", r); + return r; +} + +// Store a captured local in a closure. It returns the action, so it can be chained. +//% +RefAction *stclo(RefAction *a, int idx, TValue v) { + // DBG("STCLO "); a->print(); DBG("@%d = %p\n", idx, (void*)v); + a->stCore(idx, v); + return a; +} + +//% +void panic(int code) { + target_panic(code); +} + +//% +String emptyToNull(String s) { + if (!s || IS_EMPTY(s)) + return NULL; + return s; +} + +//% +int ptrToBool(TValue p) { + if (p) { + decr(p); + return 1; + } else { + return 0; + } +} + +//% +RefMap *mkMap() { + auto r = NEW_GC(RefMap); + MEMDBG("mkMap: => %p", r); + return r; +} + +//% +TValue mapGetByString(RefMap *map, String key) { + int i = map->findIdx(key); + if (i < 0) { + return 0; + } + TValue r = incr(map->values.get(i)); + return r; +} + +//% +int lookupMapKey(String key) { + auto arr = *(uintptr_t **)&bytecode[22]; + auto len = *arr++; + auto ikey = (uintptr_t)key; + auto l = 0U; + auto r = len - 1; + if (arr[0] <= ikey && ikey <= arr[len - 1]) { + while (l <= r) { + auto m = (l + r) >> 1; + if (arr[m] == ikey) + return m; + else if (arr[m] < ikey) + l = m + 1; + else + r = m - 1; + } + } else { + while (l <= r) { + auto m = (l + r) >> 1; + auto cmp = String_::compare((String)arr[m], key); + if (cmp == 0) + return m; + else if (cmp < 0) + l = m + 1; + else + r = m - 1; + } + } + return 0; +} + +//% +TValue mapGet(RefMap *map, unsigned key) { + auto arr = *(String **)&bytecode[22]; + auto r = mapGetByString(map, arr[key + 1]); + map->unref(); + return r; +} + +//% +void mapSetByString(RefMap *map, String key, TValue val) { + int i = map->findIdx(key); + if (i < 0) { + incrRC(key); + map->keys.push((TValue)key); + map->values.push(val); + } else { + map->values.set(i, val); + } + incr(val); +} + +//% +void mapSet(RefMap *map, unsigned key, TValue val) { + auto arr = *(String **)&bytecode[22]; + mapSetByString(map, arr[key + 1], val); + decr(val); + map->unref(); +} + +// +// Debugger +// + +// This is only to be called once at the beginning of lambda function +//% +void *getGlobalsPtr() { +#ifdef DEVICE_GROUP_ID_USER + fiber_set_group(DEVICE_GROUP_ID_USER); +#endif + + return globals; +} + +//% +void runtimeWarning(String s) { + // noop for now +} +} // namespace pxtrt +#endif + +namespace pxt { + +//% +ValType valType(TValue v) { + if (isTagged(v)) { + if (!v) + return ValType::Undefined; + + if (isNumber(v) || v == TAG_NAN) + return ValType::Number; + if (v == TAG_TRUE || v == TAG_FALSE) + return ValType::Boolean; + else if (v == TAG_NULL) + return ValType::Object; + else { + oops(1); + return ValType::Object; + } + } else { + auto vt = getVTable((RefObject *)v); + if (vt->magic == VTABLE_MAGIC) + return vt->objectType; + else + return ValType::Object; + } +} + +PXT_DEF_STRING(sObjectTp, "object") +PXT_DEF_STRING(sBooleanTp, "boolean") +PXT_DEF_STRING(sStringTp, "string") +PXT_DEF_STRING(sNumberTp, "number") +PXT_DEF_STRING(sFunctionTp, "function") +PXT_DEF_STRING(sUndefinedTp, "undefined") + +//% +String typeOf(TValue v) { + switch (valType(v)) { + case ValType::Undefined: + return (String)sUndefinedTp; + case ValType::Boolean: + return (String)sBooleanTp; + case ValType::Number: + return (String)sNumberTp; + case ValType::String: + return (String)sStringTp; + case ValType::Object: + return (String)sObjectTp; + case ValType::Function: + return (String)sFunctionTp; + default: + oops(2); + return 0; + } +} + +// Maybe in future we will want separate print methods; for now ignore +void anyPrint(TValue v) { + if (valType(v) == ValType::Object) { + if (isRefCounted(v)) { + auto o = (RefObject *)v; + auto vt = getVTable(o); + auto meth = ((RefObjectMethod)vt->methods[1]); + if ((void *)meth == (void *)&anyPrint) + DMESG("[RefObject refs=%d vt=%p cl=%d sz=%d]", REFCNT(o), o->vtable, vt->classNo, + vt->numbytes); + else + meth(o); + } else { + DMESG("[Native %p]", v); + } + } else { +#ifndef X86_64 + String s = numops::toString(v); + DMESG("[%s %p = %s]", pxt::typeOf(v)->getUTF8Data(), v, s->getUTF8Data()); + decr((TValue)s); +#endif + } +} + +static void dtorDoNothing() {} + +#ifdef PXT_GC +#define PRIM_VTABLE(name, objectTp, tp, szexpr) \ + static uint32_t name##_size(tp *p) { return ((sizeof(tp) + szexpr) + 3) >> 2; } \ + DEF_VTABLE(name##_vt, tp, objectTp, (void *)&dtorDoNothing, (void *)&anyPrint, 0, \ + (void *)&name##_size) +#else +#define PRIM_VTABLE(name, objectTp, tp, szexpr) \ + DEF_VTABLE(name##_vt, tp, objectTp, (void *)&dtorDoNothing, (void *)&anyPrint) +#endif + +#define NOOP ((void)0) +#define STRING_VT(name, fix, scan, gcsize, data, utfsize, length, dataAt) \ + static uint32_t name##_gcsize(BoxedString *p) { return (4 + (gcsize) + 3) >> 2; } \ + static void name##_gcscan(BoxedString *p) { scan; } \ + static const char *name##_data(BoxedString *p) { \ + fix; \ + return data; \ + } \ + static uint32_t name##_utfsize(BoxedString *p) { \ + fix; \ + return utfsize; \ + } \ + static uint32_t name##_length(BoxedString *p) { \ + fix; \ + return length; \ + } \ + static const char *name##_dataAt(BoxedString *p, uint32_t idx) { \ + fix; \ + return dataAt; \ + } \ + DEF_VTABLE(name##_vt, BoxedString, ValType::String, (void *)&dtorDoNothing, (void *)&anyPrint, \ + (void *)&name##_gcscan, (void *)&name##_gcsize, (void *)&name##_data, \ + (void *)&name##_utfsize, (void *)&name##_length, (void *)&name##_dataAt) + +void gcMarkArray(void *data); +void gcScan(TValue v); + +#if PXT_UTF8 +static const char *skipLookup(BoxedString *p, uint32_t idx) { + if (idx > p->skip.length) + return NULL; + auto ent = idx / SKIP_INCR; + auto data = SKIP_DATA(p); + auto size = p->skip.size; + if (ent) { + auto off = p->skip.list[ent - 1]; + data += off; + size -= off; + idx &= SKIP_INCR - 1; + } + return utf8Skip(data, size, idx); +} + +extern LLSegment workQueue; + +static uint32_t fixSize(BoxedString *p, uint32_t *len) { + uint32_t tlen = 0; + uint32_t sz = 0; + if (workQueue.getLength()) + oops(81); + workQueue.push((TValue)p); + while (workQueue.getLength()) { + p = (BoxedString *)workQueue.pop(); + if (IS_CONS(p)) { + workQueue.push((TValue)p->cons.right); + workQueue.push((TValue)p->cons.left); + } else { + tlen += p->getLength(); + sz += p->getUTF8Size(); + } + } + *len = tlen; + return sz; +} + +static void fixCopy(BoxedString *p, char *dst) { + if (workQueue.getLength()) + oops(81); + + workQueue.push((TValue)p); + while (workQueue.getLength()) { + p = (BoxedString *)workQueue.pop(); + if (IS_CONS(p)) { + workQueue.push((TValue)p->cons.right); + workQueue.push((TValue)p->cons.left); + } else { + auto sz = p->getUTF8Size(); + memcpy(dst, p->getUTF8Data(), sz); + dst += sz; + } + } +} + +// switches CONS representation into skip list representation +// does not switch representation of CONS' children +static void fixCons(BoxedString *r) { + uint32_t length = 0; + auto sz = fixSize(r, &length); + auto numSkips = length / SKIP_INCR; + // allocate first, while [r] still holds references to its children + // because allocation might trigger GC + auto data = (uint16_t *)gcAllocateArray(numSkips * 2 + sz + 1); + // copy, while [r] is still cons + fixCopy(r, (char *)(data + numSkips)); + // now, set [r] up properly + r->vtable = PXT_VTABLE_TO_INT(&string_skiplist16_vt); + r->skip.size = sz; + r->skip.length = length; + r->skip.list = data; + setupSkipList(r, NULL); +} +#endif + +STRING_VT(string_inline_ascii, NOOP, NOOP, 2 + p->ascii.length + 1, p->ascii.data, p->ascii.length, + p->ascii.length, idx <= p->ascii.length ? p->ascii.data + idx : NULL) +#if PXT_UTF8 +STRING_VT(string_inline_utf8, NOOP, NOOP, 2 + p->utf8.length + 1, p->utf8.data, p->utf8.length, + utf8Len(p->utf8.data, p->utf8.length), utf8Skip(p->utf8.data, p->utf8.length, idx)) +STRING_VT(string_skiplist16, NOOP, gcMarkArray(p->skip.list), 2 + 2 + 4, SKIP_DATA(p), p->skip.size, + p->skip.length, skipLookup(p, idx)) +STRING_VT(string_cons, fixCons(p), (gcScan((TValue)p->cons.left), gcScan((TValue)p->cons.right)), + 4 + 4, SKIP_DATA(p), p->skip.size, p->skip.length, skipLookup(p, idx)) +#endif + +PRIM_VTABLE(number, ValType::Number, BoxedNumber, 0) +PRIM_VTABLE(buffer, ValType::Object, BoxedBuffer, p->length) +// PRIM_VTABLE(action, ValType::Function, RefAction, ) + +void failedCast(TValue v) { + DMESG("failed type check for %p", v); + auto vt = getAnyVTable(v); + if (vt) { + DMESG("VT %p - objtype %d classNo %d", vt, vt->objectType, vt->classNo); + } + + int code; + if (v == TAG_NULL) + code = PANIC_CAST_FROM_NULL; + else + code = PANIC_CAST_FIRST + (int)valType(v); + target_panic(code); +} + +void missingProperty(TValue v) { + DMESG("missing property on %p", v); + target_panic(PANIC_MISSING_PROPERTY); +} + +#ifdef PXT_PROFILE +struct PerfCounter *perfCounters; + +struct PerfCounterInfo { + uint32_t numPerfCounters; + char *perfCounterNames[0]; +}; + +#define PERF_INFO ((PerfCounterInfo *)(((uintptr_t *)bytecode)[13])) + +void initPerfCounters() { + auto n = PERF_INFO->numPerfCounters; + perfCounters = new PerfCounter[n]; + memset(perfCounters, 0, n * sizeof(PerfCounter)); +} + +void dumpPerfCounters() { + auto info = PERF_INFO; + DMESG("calls,us,name"); + for (uint32_t i = 0; i < info->numPerfCounters; ++i) { + auto c = &perfCounters[i]; + DMESG("%d,%d,%s", c->numstops, c->value, info->perfCounterNames[i]); + } +} + +void startPerfCounter(PerfCounters n) { + auto c = &perfCounters[(uint32_t)n]; + if (c->start) + oops(50); + c->start = PERF_NOW(); +} + +void stopPerfCounter(PerfCounters n) { + auto c = &perfCounters[(uint32_t)n]; + if (!c->start) + oops(51); + c->value += PERF_NOW() - c->start; + c->start = 0; + c->numstops++; +} +#endif + +} // namespace pxt diff --git a/pxt_modules/core/dal.d.ts b/pxt_modules/core/dal.d.ts new file mode 100644 index 0000000..2bb476c --- /dev/null +++ b/pxt_modules/core/dal.d.ts @@ -0,0 +1,635 @@ +// Auto-generated. Do not edit. +declare const enum DAL { + // built/dockeryt/yotta_modules/microbit-dal/inc/bluetooth/ExternalEvents.h + MICROBIT_ID_BLE = 1000, + MICROBIT_ID_BLE_UART = 1200, + MICROBIT_BLE_EVT_CONNECTED = 1, + MICROBIT_BLE_EVT_DISCONNECTED = 2, + // built/dockeryt/yotta_modules/microbit-dal/inc/bluetooth/MESEvents.h + MES_REMOTE_CONTROL_ID = 1001, + MES_REMOTE_CONTROL_EVT_PLAY = 1, + MES_REMOTE_CONTROL_EVT_PAUSE = 2, + MES_REMOTE_CONTROL_EVT_STOP = 3, + MES_REMOTE_CONTROL_EVT_NEXTTRACK = 4, + MES_REMOTE_CONTROL_EVT_PREVTRACK = 5, + MES_REMOTE_CONTROL_EVT_FORWARD = 6, + MES_REMOTE_CONTROL_EVT_REWIND = 7, + MES_REMOTE_CONTROL_EVT_VOLUMEUP = 8, + MES_REMOTE_CONTROL_EVT_VOLUMEDOWN = 9, + MES_CAMERA_ID = 1002, + MES_CAMERA_EVT_LAUNCH_PHOTO_MODE = 1, + MES_CAMERA_EVT_LAUNCH_VIDEO_MODE = 2, + MES_CAMERA_EVT_TAKE_PHOTO = 3, + MES_CAMERA_EVT_START_VIDEO_CAPTURE = 4, + MES_CAMERA_EVT_STOP_VIDEO_CAPTURE = 5, + MES_CAMERA_EVT_STOP_PHOTO_MODE = 6, + MES_CAMERA_EVT_STOP_VIDEO_MODE = 7, + MES_CAMERA_EVT_TOGGLE_FRONT_REAR = 8, + MES_ALERTS_ID = 1004, + MES_ALERT_EVT_DISPLAY_TOAST = 1, + MES_ALERT_EVT_VIBRATE = 2, + MES_ALERT_EVT_PLAY_SOUND = 3, + MES_ALERT_EVT_PLAY_RINGTONE = 4, + MES_ALERT_EVT_FIND_MY_PHONE = 5, + MES_ALERT_EVT_ALARM1 = 6, + MES_ALERT_EVT_ALARM2 = 7, + MES_ALERT_EVT_ALARM3 = 8, + MES_ALERT_EVT_ALARM4 = 9, + MES_ALERT_EVT_ALARM5 = 10, + MES_ALERT_EVT_ALARM6 = 11, + MES_SIGNAL_STRENGTH_ID = 1101, + MES_SIGNAL_STRENGTH_EVT_NO_BAR = 1, + MES_SIGNAL_STRENGTH_EVT_ONE_BAR = 2, + MES_SIGNAL_STRENGTH_EVT_TWO_BAR = 3, + MES_SIGNAL_STRENGTH_EVT_THREE_BAR = 4, + MES_SIGNAL_STRENGTH_EVT_FOUR_BAR = 5, + MES_DEVICE_INFO_ID = 1103, + MES_DEVICE_ORIENTATION_LANDSCAPE = 1, + MES_DEVICE_ORIENTATION_PORTRAIT = 2, + MES_DEVICE_GESTURE_NONE = 3, + MES_DEVICE_GESTURE_DEVICE_SHAKEN = 4, + MES_DEVICE_DISPLAY_OFF = 5, + MES_DEVICE_DISPLAY_ON = 6, + MES_DEVICE_INCOMING_CALL = 7, + MES_DEVICE_INCOMING_MESSAGE = 8, + MES_DPAD_CONTROLLER_ID = 1104, + MES_DPAD_BUTTON_A_DOWN = 1, + MES_DPAD_BUTTON_A_UP = 2, + MES_DPAD_BUTTON_B_DOWN = 3, + MES_DPAD_BUTTON_B_UP = 4, + MES_DPAD_BUTTON_C_DOWN = 5, + MES_DPAD_BUTTON_C_UP = 6, + MES_DPAD_BUTTON_D_DOWN = 7, + MES_DPAD_BUTTON_D_UP = 8, + MES_DPAD_BUTTON_1_DOWN = 9, + MES_DPAD_BUTTON_1_UP = 10, + MES_DPAD_BUTTON_2_DOWN = 11, + MES_DPAD_BUTTON_2_UP = 12, + MES_DPAD_BUTTON_3_DOWN = 13, + MES_DPAD_BUTTON_3_UP = 14, + MES_DPAD_BUTTON_4_DOWN = 15, + MES_DPAD_BUTTON_4_UP = 16, + MES_BROADCAST_GENERAL_ID = 2000, + // built/dockeryt/yotta_modules/microbit-dal/inc/bluetooth/MicroBitBLEManager.h + MICROBIT_BLE_PAIR_REQUEST = 1, + MICROBIT_BLE_PAIR_COMPLETE = 2, + MICROBIT_BLE_PAIR_PASSCODE = 4, + MICROBIT_BLE_PAIR_SUCCESSFUL = 8, + MICROBIT_BLE_PAIRING_TIMEOUT = 90, + MICROBIT_BLE_POWER_LEVELS = 8, + MICROBIT_BLE_MAXIMUM_BONDS = 4, + MICROBIT_BLE_EDDYSTONE_ADV_INTERVAL = 400, + MICROBIT_BLE_EDDYSTONE_DEFAULT_POWER = 240, + MICROBIT_BLE_STATUS_STORE_SYSATTR = 2, + MICROBIT_BLE_STATUS_DISCONNECT = 4, + MICROBIT_BLE_DISCONNECT_AFTER_PAIRING_DELAY = 500, + // built/dockeryt/yotta_modules/microbit-dal/inc/bluetooth/MicroBitDFUService.h + MICROBIT_DFU_OPCODE_START_DFU = 1, + MICROBIT_DFU_HISTOGRAM_WIDTH = 5, + MICROBIT_DFU_HISTOGRAM_HEIGHT = 5, + // built/dockeryt/yotta_modules/microbit-dal/inc/bluetooth/MicroBitIOPinService.h + MICROBIT_IO_PIN_SERVICE_PINCOUNT = 19, + MICROBIT_IO_PIN_SERVICE_DATA_SIZE = 10, + MICROBIT_PWM_PIN_SERVICE_DATA_SIZE = 2, + // built/dockeryt/yotta_modules/microbit-dal/inc/bluetooth/MicroBitLEDService.h + MICROBIT_BLE_MAXIMUM_SCROLLTEXT = 20, + // built/dockeryt/yotta_modules/microbit-dal/inc/bluetooth/MicroBitMagnetometerService.h + COMPASS_CALIBRATION_STATUS_UNKNOWN = 0, + COMPASS_CALIBRATION_REQUESTED = 1, + COMPASS_CALIBRATION_COMPLETED_OK = 2, + COMPASS_CALIBRATION_COMPLETED_ERR = 3, + // built/dockeryt/yotta_modules/microbit-dal/inc/bluetooth/MicroBitPartialFlashingService.h + PARTIAL_FLASHING_VERSION = 1, + REGION_INFO = 0, + FLASH_DATA = 1, + END_OF_TRANSMISSION = 2, + MICROBIT_STATUS = 238, + MICROBIT_RESET = 255, + // built/dockeryt/yotta_modules/microbit-dal/inc/bluetooth/MicroBitUARTService.h + MICROBIT_UART_S_DEFAULT_BUF_SIZE = 20, + MICROBIT_UART_S_EVT_DELIM_MATCH = 1, + MICROBIT_UART_S_EVT_HEAD_MATCH = 2, + MICROBIT_UART_S_EVT_RX_FULL = 3, + // built/dockeryt/yotta_modules/microbit-dal/inc/core/ErrorNo.h + MICROBIT_OK = 0, + MICROBIT_INVALID_PARAMETER = -1001, + MICROBIT_NOT_SUPPORTED = -1002, + MICROBIT_CALIBRATION_IN_PROGRESS = -1003, + MICROBIT_CALIBRATION_REQUIRED = -1004, + MICROBIT_NO_RESOURCES = -1005, + MICROBIT_BUSY = -1006, + MICROBIT_CANCELLED = -1007, + MICROBIT_I2C_ERROR = -1010, + MICROBIT_SERIAL_IN_USE = -1011, + MICROBIT_NO_DATA = -1012, + MICROBIT_OOM = 20, + MICROBIT_HEAP_ERROR = 30, + MICROBIT_NULL_DEREFERENCE = 40, + MICROBIT_HARDWARE_UNAVAILABLE_ACC = 50, + MICROBIT_HARDWARE_UNAVAILABLE_MAG = 51, + // built/dockeryt/yotta_modules/microbit-dal/inc/core/MicroBitComponent.h + MICROBIT_ID_BUTTON_A = 1, + MICROBIT_ID_BUTTON_B = 2, + MICROBIT_ID_BUTTON_RESET = 3, + MICROBIT_ID_ACCELEROMETER = 4, + MICROBIT_ID_COMPASS = 5, + MICROBIT_ID_DISPLAY = 6, + MICROBIT_IO_PINS = 20, + MICROBIT_ID_IO_P0 = 7, + MICROBIT_ID_IO_P1 = 8, + MICROBIT_ID_IO_P2 = 9, + MICROBIT_ID_IO_P3 = 10, + MICROBIT_ID_IO_P4 = 11, + MICROBIT_ID_IO_P5 = 12, + MICROBIT_ID_IO_P6 = 13, + MICROBIT_ID_IO_P7 = 14, + MICROBIT_ID_IO_P8 = 15, + MICROBIT_ID_IO_P9 = 16, + MICROBIT_ID_IO_P10 = 17, + MICROBIT_ID_IO_P11 = 18, + MICROBIT_ID_IO_P12 = 19, + MICROBIT_ID_IO_P13 = 20, + MICROBIT_ID_IO_P14 = 21, + MICROBIT_ID_IO_P15 = 22, + MICROBIT_ID_IO_P16 = 23, + MICROBIT_ID_IO_P19 = 24, + MICROBIT_ID_IO_P20 = 25, + MICROBIT_ID_BUTTON_AB = 26, + MICROBIT_ID_GESTURE = 27, + MICROBIT_ID_THERMOMETER = 28, + MICROBIT_ID_RADIO = 29, + MICROBIT_ID_RADIO_DATA_READY = 30, + MICROBIT_ID_MULTIBUTTON_ATTACH = 31, + MICROBIT_ID_SERIAL = 32, + MICROBIT_ID_IO_INT1 = 33, + MICROBIT_ID_IO_INT2 = 34, + MICROBIT_ID_IO_INT3 = 35, + MICROBIT_ID_PARTIAL_FLASHING = 36, + MICROBIT_ID_MESSAGE_BUS_LISTENER = 1021, + MICROBIT_ID_NOTIFY_ONE = 1022, + MICROBIT_ID_NOTIFY = 1023, + MICROBIT_COMPONENT_RUNNING = 1, + // built/dockeryt/yotta_modules/microbit-dal/inc/core/MicroBitDevice.h + MICROBIT_NAME_LENGTH = 5, + MICROBIT_NAME_CODE_LETTERS = 5, + MICROBIT_PANIC_ERROR_CHARS = 4, + // built/dockeryt/yotta_modules/microbit-dal/inc/core/MicroBitFiber.h + MICROBIT_SCHEDULER_RUNNING = 1, + MICROBIT_FIBER_FLAG_FOB = 1, + MICROBIT_FIBER_FLAG_PARENT = 2, + MICROBIT_FIBER_FLAG_CHILD = 4, + MICROBIT_FIBER_FLAG_DO_NOT_PAGE = 8, + // built/dockeryt/yotta_modules/microbit-dal/inc/core/MicroBitFont.h + MICROBIT_FONT_WIDTH = 5, + MICROBIT_FONT_HEIGHT = 5, + MICROBIT_FONT_ASCII_START = 32, + MICROBIT_FONT_ASCII_END = 126, + // built/dockeryt/yotta_modules/microbit-dal/inc/core/MicroBitHeapAllocator.h + MICROBIT_MAXIMUM_HEAPS = 2, + MICROBIT_HEAP_BLOCK_FREE = 2147483648, + MICROBIT_HEAP_BLOCK_SIZE = 4, + // built/dockeryt/yotta_modules/microbit-dal/inc/core/MicroBitListener.h + MESSAGE_BUS_LISTENER_PARAMETERISED = 1, + MESSAGE_BUS_LISTENER_METHOD = 2, + MESSAGE_BUS_LISTENER_BUSY = 4, + MESSAGE_BUS_LISTENER_REENTRANT = 8, + MESSAGE_BUS_LISTENER_QUEUE_IF_BUSY = 16, + MESSAGE_BUS_LISTENER_DROP_IF_BUSY = 32, + MESSAGE_BUS_LISTENER_NONBLOCKING = 64, + MESSAGE_BUS_LISTENER_URGENT = 128, + MESSAGE_BUS_LISTENER_DELETING = 32768, + MESSAGE_BUS_LISTENER_IMMEDIATE = 192, + // built/dockeryt/yotta_modules/microbit-dal/inc/core/NotifyEvents.h + MICROBIT_DISPLAY_EVT_FREE = 1, + MICROBIT_SERIAL_EVT_TX_EMPTY = 2, + MICROBIT_UART_S_EVT_TX_EMPTY = 3, + // built/dockeryt/yotta_modules/microbit-dal/inc/drivers/DynamicPwm.h + MICROBIT_DEFAULT_PWM_PERIOD = 20000, + // built/dockeryt/yotta_modules/microbit-dal/inc/drivers/FXOS8700.h + FXOS8700_DEFAULT_ADDR = 60, + FXOS8700_STATUS_REG = 0, + FXOS8700_OUT_X_MSB = 1, + FXOS8700_OUT_X_LSB = 2, + FXOS8700_OUT_Y_MSB = 3, + FXOS8700_OUT_Y_LSB = 4, + FXOS8700_OUT_Z_MSB = 5, + FXOS8700_OUT_Z_LSB = 6, + FXOS8700_F_SETUP = 9, + FXOS8700_TRIG_CFG = 10, + FXOS8700_SYSMOD = 11, + FXOS8700_INT_SOURCE = 12, + FXOS8700_WHO_AM_I = 13, + FXOS8700_XYZ_DATA_CFG = 14, + FXOS8700_HP_FILTER_CUTOFF = 15, + FXOS8700_PL_STATUS = 16, + FXOS8700_PL_CFG = 17, + FXOS8700_PL_COUNT = 18, + FXOS8700_PL_BF_ZCOMP = 19, + FXOS8700_PL_THS_REG = 20, + FXOS8700_A_FFMT_CFG = 21, + FXOS8700_A_FFMT_SRC = 22, + FXOS8700_A_FFMT_THS = 23, + FXOS8700_A_FFMT_COUNT = 24, + FXOS8700_TRANSIENT_CFG = 29, + FXOS8700_TRANSIENT_SRC = 30, + FXOS8700_TRANSIENT_THS = 31, + FXOS8700_TRANSIENT_COUNT = 32, + FXOS8700_PULSE_CFG = 33, + FXOS8700_PULSE_SRC = 34, + FXOS8700_PULSE_THSX = 35, + FXOS8700_PULSE_THSY = 36, + FXOS8700_PULSE_THSZ = 37, + FXOS8700_PULSE_TMLT = 38, + FXOS8700_PULSE_LTCY = 39, + FXOS8700_PULSE_WIND = 40, + FXOS8700_ASLP_COUNT = 41, + FXOS8700_CTRL_REG1 = 42, + FXOS8700_CTRL_REG2 = 43, + FXOS8700_CTRL_REG3 = 44, + FXOS8700_CTRL_REG4 = 45, + FXOS8700_CTRL_REG5 = 46, + FXOS8700_OFF_X = 47, + FXOS8700_OFF_Y = 48, + FXOS8700_OFF_Z = 49, + FXOS8700_M_DR_STATUS = 50, + FXOS8700_M_OUT_X_MSB = 51, + FXOS8700_M_OUT_X_LSB = 52, + FXOS8700_M_OUT_Y_MSB = 53, + FXOS8700_M_OUT_Y_LSB = 54, + FXOS8700_M_OUT_Z_MSB = 55, + FXOS8700_M_OUT_Z_LSB = 56, + FXOS8700_CMP_X_MSB = 57, + FXOS8700_CMP_X_LSB = 58, + FXOS8700_CMP_Y_MSB = 59, + FXOS8700_CMP_Y_LSB = 60, + FXOS8700_CMP_Z_MSB = 61, + FXOS8700_CMP_Z_LSB = 62, + FXOS8700_M_OFF_X_MSB = 63, + FXOS8700_M_OFF_X_LSB = 64, + FXOS8700_M_OFF_Y_MSB = 65, + FXOS8700_M_OFF_Y_LSB = 66, + FXOS8700_M_OFF_Z_MSB = 67, + FXOS8700_M_OFF_Z_LSB = 68, + FXOS8700_MAX_X_MSB = 69, + FXOS8700_MAX_X_LSB = 70, + FXOS8700_MAX_Y_MSB = 71, + FXOS8700_MAX_Y_LSB = 72, + FXOS8700_MAX_Z_MSB = 73, + FXOS8700_MAX_Z_LSB = 74, + FXOS8700_MIN_X_MSB = 75, + FXOS8700_MIN_X_LSB = 76, + FXOS8700_MIN_Y_MSB = 77, + FXOS8700_MIN_Y_LSB = 78, + FXOS8700_MIN_Z_MSB = 79, + FXOS8700_MIN_Z_LSB = 80, + FXOS8700_TEMP = 81, + FXOS8700_M_THS_CFG = 82, + FXOS8700_M_THS_SRC = 83, + FXOS8700_M_THS_X_MSB = 84, + FXOS8700_M_THS_X_LSB = 85, + FXOS8700_M_THS_Y_MSB = 86, + FXOS8700_M_THS_Y_LSB = 87, + FXOS8700_M_THS_Z_MSB = 88, + FXOS8700_M_THS_Z_LSB = 89, + FXOS8700_M_THS_COUNT = 90, + FXOS8700_M_CTRL_REG1 = 91, + FXOS8700_M_CTRL_REG2 = 92, + FXOS8700_M_CTRL_REG3 = 93, + FXOS8700_M_INT_SRC = 94, + FXOS8700_A_VECM_CFG = 95, + FXOS8700_A_VECM_THS_MSB = 96, + FXOS8700_A_VECM_THS_LSB = 97, + FXOS8700_A_VECM_CNT = 98, + FXOS8700_A_VECM_INITX_MSB = 99, + FXOS8700_A_VECM_INITX_LSB = 100, + FXOS8700_A_VECM_INITY_MSB = 101, + FXOS8700_A_VECM_INITY_LSB = 102, + FXOS8700_A_VECM_INITZ_MSB = 103, + FXOS8700_A_VECM_INITZ_LSB = 104, + FXOS8700_M_VECM_CFG = 105, + FXOS8700_M_VECM_THS_MSB = 106, + FXOS8700_M_VECM_THS_LSB = 107, + FXOS8700_M_VECM_CNT = 108, + FXOS8700_M_VECM_INITX_MSB = 109, + FXOS8700_M_VECM_INITX_LSB = 110, + FXOS8700_M_VECM_INITY_MSB = 111, + FXOS8700_M_VECM_INITY_LSB = 112, + FXOS8700_M_VECM_INITZ_MSB = 113, + FXOS8700_M_VECM_INITZ_LSB = 114, + FXOS8700_A_FFMT_THS_X_MSB = 115, + FXOS8700_A_FFMT_THS_X_LSB = 116, + FXOS8700_A_FFMT_THS_Y_MSB = 117, + FXOS8700_A_FFMT_THS_Y_LSB = 118, + FXOS8700_A_FFMT_THS_Z_MSB = 119, + FXOS8700_A_FFMT_THS_Z_LSB = 120, + FXOS8700_WHOAMI_VAL = 199, + // built/dockeryt/yotta_modules/microbit-dal/inc/drivers/LSM303Accelerometer.h + LSM303_A_DEFAULT_ADDR = 50, + LSM303_STATUS_REG_AUX_A = 7, + LSM303_OUT_TEMP_L_A = 12, + LSM303_OUT_TEMP_H_A = 13, + LSM303_INT_COUNTER_REG_A = 14, + LSM303_WHO_AM_I_A = 15, + LSM303_TEMP_CFG_REG_A = 31, + LSM303_CTRL_REG1_A = 32, + LSM303_CTRL_REG2_A = 33, + LSM303_CTRL_REG3_A = 34, + LSM303_CTRL_REG4_A = 35, + LSM303_CTRL_REG5_A = 36, + LSM303_CTRL_REG6_A = 37, + LSM303_DATACAPTURE_A = 38, + LSM303_STATUS_REG_A = 39, + LSM303_OUT_X_L_A = 40, + LSM303_OUT_X_H_A = 41, + LSM303_OUT_Y_L_A = 42, + LSM303_OUT_Y_H_A = 43, + LSM303_OUT_Z_L_A = 44, + LSM303_OUT_Z_H_A = 45, + LSM303_FIFO_CTRL_REG_A = 46, + LSM303_FIFO_SRC_REG_A = 47, + LSM303_INT1_CFG_A = 48, + LSM303_INT1_SRC_A = 49, + LSM303_INT1_THS_A = 50, + LSM303_INT1_DURATION_A = 51, + LSM303_INT2_CFG_A = 52, + LSM303_INT2_SRC_A = 53, + LSM303_INT2_THS_A = 54, + LSM303_INT2_DURATION_A = 55, + LSM303_CLICK_CFG_A = 56, + LSM303_CLICK_SRC_A = 57, + LSM303_CLICK_THS_A = 58, + LSM303_TIME_LIMIT_A = 59, + LSM303_TIME_LATENCY_A = 60, + LSM303_TIME_WINDOW_A = 61, + LSM303_ACT_THS_A = 62, + LSM303_ACT_DUR_A = 63, + LSM303_A_WHOAMI_VAL = 51, + // built/dockeryt/yotta_modules/microbit-dal/inc/drivers/LSM303Magnetometer.h + LSM303_M_WHOAMI_VAL = 64, + LSM303_M_DEFAULT_ADDR = 60, + LSM303_OFFSET_X_REG_L_M = 69, + LSM303_OFFSET_X_REG_H_M = 70, + LSM303_OFFSET_Y_REG_L_M = 71, + LSM303_OFFSET_Y_REG_H_M = 72, + LSM303_OFFSET_Z_REG_L_M = 73, + LSM303_OFFSET_Z_REG_H_M = 74, + LSM303_WHO_AM_I_M = 79, + LSM303_CFG_REG_A_M = 96, + LSM303_CFG_REG_B_M = 97, + LSM303_CFG_REG_C_M = 98, + LSM303_INT_CRTL_REG_M = 99, + LSM303_INT_SOURCE_REG_M = 100, + LSM303_INT_THS_L_REG_M = 101, + LSM303_INT_THS_H_REG_M = 102, + LSM303_STATUS_REG_M = 103, + LSM303_OUTX_L_REG_M = 104, + LSM303_OUTX_H_REG_M = 105, + LSM303_OUTY_L_REG_M = 106, + LSM303_OUTY_H_REG_M = 107, + LSM303_OUTZ_L_REG_M = 108, + LSM303_OUTZ_H_REG_M = 109, + // built/dockeryt/yotta_modules/microbit-dal/inc/drivers/MAG3110.h + MAG3110_WHOAMI_VAL = 196, + MAG3110_DEFAULT_ADDR = 29, + MAG_DR_STATUS = 0, + MAG_OUT_X_MSB = 1, + MAG_OUT_X_LSB = 2, + MAG_OUT_Y_MSB = 3, + MAG_OUT_Y_LSB = 4, + MAG_OUT_Z_MSB = 5, + MAG_OUT_Z_LSB = 6, + MAG_WHOAMI = 7, + MAG_SYSMOD = 8, + MAG_OFF_X_MSB = 9, + MAG_OFF_X_LSB = 10, + MAG_OFF_Y_MSB = 11, + MAG_OFF_Y_LSB = 12, + MAG_OFF_Z_MSB = 13, + MAG_OFF_Z_LSB = 14, + MAG_DIE_TEMP = 15, + MAG_CTRL_REG1 = 16, + MAG_CTRL_REG2 = 17, + // built/dockeryt/yotta_modules/microbit-dal/inc/drivers/MMA8653.h + MMA8653_DEFAULT_ADDR = 58, + MMA8653_STATUS = 0, + MMA8653_OUT_X_MSB = 1, + MMA8653_WHOAMI = 13, + MMA8653_XYZ_DATA_CFG = 14, + MMA8653_CTRL_REG1 = 42, + MMA8653_CTRL_REG2 = 43, + MMA8653_CTRL_REG3 = 44, + MMA8653_CTRL_REG4 = 45, + MMA8653_CTRL_REG5 = 46, + MMA8653_WHOAMI_VAL = 90, + // built/dockeryt/yotta_modules/microbit-dal/inc/drivers/MicroBitAccelerometer.h + MICROBIT_ACCELEROMETER_IMU_DATA_VALID = 2, + MICROBIT_ACCEL_ADDED_TO_IDLE = 4, + MICROBIT_ACCELEROMETER_EVT_DATA_UPDATE = 1, + MICROBIT_ACCELEROMETER_EVT_NONE = 0, + MICROBIT_ACCELEROMETER_EVT_TILT_UP = 1, + MICROBIT_ACCELEROMETER_EVT_TILT_DOWN = 2, + MICROBIT_ACCELEROMETER_EVT_TILT_LEFT = 3, + MICROBIT_ACCELEROMETER_EVT_TILT_RIGHT = 4, + MICROBIT_ACCELEROMETER_EVT_FACE_UP = 5, + MICROBIT_ACCELEROMETER_EVT_FACE_DOWN = 6, + MICROBIT_ACCELEROMETER_EVT_FREEFALL = 7, + MICROBIT_ACCELEROMETER_EVT_3G = 8, + MICROBIT_ACCELEROMETER_EVT_6G = 9, + MICROBIT_ACCELEROMETER_EVT_8G = 10, + MICROBIT_ACCELEROMETER_EVT_SHAKE = 11, + MICROBIT_ACCELEROMETER_REST_TOLERANCE = 200, + MICROBIT_ACCELEROMETER_TILT_TOLERANCE = 200, + MICROBIT_ACCELEROMETER_FREEFALL_TOLERANCE = 400, + MICROBIT_ACCELEROMETER_SHAKE_TOLERANCE = 400, + MICROBIT_ACCELEROMETER_3G_TOLERANCE = 3072, + MICROBIT_ACCELEROMETER_6G_TOLERANCE = 6144, + MICROBIT_ACCELEROMETER_8G_TOLERANCE = 8192, + MICROBIT_ACCELEROMETER_GESTURE_DAMPING = 5, + MICROBIT_ACCELEROMETER_SHAKE_DAMPING = 10, + MICROBIT_ACCELEROMETER_SHAKE_RTX = 30, + MICROBIT_ACCELEROMETER_SHAKE_COUNT_THRESHOLD = 4, + // built/dockeryt/yotta_modules/microbit-dal/inc/drivers/MicroBitButton.h + MICROBIT_BUTTON_EVT_DOWN = 1, + MICROBIT_BUTTON_EVT_UP = 2, + MICROBIT_BUTTON_EVT_CLICK = 3, + MICROBIT_BUTTON_EVT_LONG_CLICK = 4, + MICROBIT_BUTTON_EVT_HOLD = 5, + MICROBIT_BUTTON_EVT_DOUBLE_CLICK = 6, + MICROBIT_BUTTON_LONG_CLICK_TIME = 1000, + MICROBIT_BUTTON_HOLD_TIME = 1500, + MICROBIT_BUTTON_STATE = 1, + MICROBIT_BUTTON_STATE_HOLD_TRIGGERED = 2, + MICROBIT_BUTTON_STATE_CLICK = 4, + MICROBIT_BUTTON_STATE_LONG_CLICK = 8, + MICROBIT_BUTTON_SIGMA_MIN = 0, + MICROBIT_BUTTON_SIGMA_MAX = 12, + MICROBIT_BUTTON_SIGMA_THRESH_HI = 8, + MICROBIT_BUTTON_SIGMA_THRESH_LO = 2, + MICROBIT_BUTTON_DOUBLE_CLICK_THRESH = 50, + MICROBIT_BUTTON_SIMPLE_EVENTS = 0, + MICROBIT_BUTTON_ALL_EVENTS = 1, + // built/dockeryt/yotta_modules/microbit-dal/inc/drivers/MicroBitCompass.h + MICROBIT_COMPASS_STATUS_RUNNING = 1, + MICROBIT_COMPASS_STATUS_CALIBRATED = 2, + MICROBIT_COMPASS_STATUS_CALIBRATING = 4, + MICROBIT_COMPASS_STATUS_ADDED_TO_IDLE = 8, + MICROBIT_COMPASS_EVT_DATA_UPDATE = 1, + MICROBIT_COMPASS_EVT_CONFIG_NEEDED = 2, + MICROBIT_COMPASS_EVT_CALIBRATE = 3, + MICROBIT_COMPASS_EVT_CALIBRATION_NEEDED = 4, + // built/dockeryt/yotta_modules/microbit-dal/inc/drivers/MicroBitDisplay.h + MICROBIT_DISPLAY_EVT_ANIMATION_COMPLETE = 1, + MICROBIT_DISPLAY_EVT_LIGHT_SENSE = 2, + MICROBIT_DISPLAY_DEFAULT_AUTOCLEAR = 1, + MICROBIT_DISPLAY_SPACING = 1, + MICROBIT_DISPLAY_GREYSCALE_BIT_DEPTH = 8, + MICROBIT_DISPLAY_ANIMATE_DEFAULT_POS = -255, + ANIMATION_MODE_NONE = 0, + ANIMATION_MODE_STOPPED = 1, + ANIMATION_MODE_SCROLL_TEXT = 2, + ANIMATION_MODE_PRINT_TEXT = 3, + ANIMATION_MODE_SCROLL_IMAGE = 4, + ANIMATION_MODE_ANIMATE_IMAGE = 5, + ANIMATION_MODE_ANIMATE_IMAGE_WITH_CLEAR = 6, + ANIMATION_MODE_PRINT_CHARACTER = 7, + DISPLAY_MODE_BLACK_AND_WHITE = 0, + DISPLAY_MODE_GREYSCALE = 1, + DISPLAY_MODE_BLACK_AND_WHITE_LIGHT_SENSE = 2, + MICROBIT_DISPLAY_ROTATION_0 = 0, + MICROBIT_DISPLAY_ROTATION_90 = 1, + MICROBIT_DISPLAY_ROTATION_180 = 2, + MICROBIT_DISPLAY_ROTATION_270 = 3, + // built/dockeryt/yotta_modules/microbit-dal/inc/drivers/MicroBitFile.h + READ = 1, + WRITE = 2, + READ_AND_WRITE = 3, + CREATE = 4, + // built/dockeryt/yotta_modules/microbit-dal/inc/drivers/MicroBitFileSystem.h + MBFS_FILENAME_LENGTH = 16, + MB_READ = 1, + MB_WRITE = 2, + MB_CREAT = 4, + MB_APPEND = 8, + MB_SEEK_SET = 1, + MB_SEEK_END = 2, + MB_SEEK_CUR = 4, + MBFS_STATUS_INITIALISED = 1, + MBFS_UNUSED = 65535, + MBFS_EOF = 61439, + MBFS_DELETED = 0, + MBFS_DIRECTORY_ENTRY_FREE = 32768, + MBFS_DIRECTORY_ENTRY_VALID = 16384, + MBFS_DIRECTORY_ENTRY_DIRECTORY = 8192, + MBFS_DIRECTORY_ENTRY_NEW = 65535, + MBFS_DIRECTORY_ENTRY_DELETED = 0, + MBFS_BLOCK_TYPE_FILE = 1, + MBFS_BLOCK_TYPE_DIRECTORY = 2, + MBFS_BLOCK_TYPE_FILETABLE = 3, + // built/dockeryt/yotta_modules/microbit-dal/inc/drivers/MicroBitFlash.h + PAGE_SIZE = 1024, + // built/dockeryt/yotta_modules/microbit-dal/inc/drivers/MicroBitI2C.h + MICROBIT_I2C_MAX_RETRIES = 9, + // built/dockeryt/yotta_modules/microbit-dal/inc/drivers/MicroBitLightSensor.h + MICROBIT_LIGHT_SENSOR_CHAN_NUM = 3, + MICROBIT_LIGHT_SENSOR_AN_SET_TIME = 4000, + MICROBIT_LIGHT_SENSOR_TICK_PERIOD = 5, + MICROBIT_LIGHT_SENSOR_MAX_VALUE = 338, + MICROBIT_LIGHT_SENSOR_MIN_VALUE = 75, + // built/dockeryt/yotta_modules/microbit-dal/inc/drivers/MicroBitMatrixMaps.h + NO_CONN = 0, + MICROBIT_DISPLAY_WIDTH = 5, + MICROBIT_DISPLAY_HEIGHT = 5, + // built/dockeryt/yotta_modules/microbit-dal/inc/drivers/MicroBitMemoryMap.h + NUMBER_OF_REGIONS = 3, + // built/dockeryt/yotta_modules/microbit-dal/inc/drivers/MicroBitMultiButton.h + MICROBIT_MULTI_BUTTON_STATE_1 = 1, + MICROBIT_MULTI_BUTTON_STATE_2 = 2, + MICROBIT_MULTI_BUTTON_HOLD_TRIGGERED_1 = 4, + MICROBIT_MULTI_BUTTON_HOLD_TRIGGERED_2 = 8, + MICROBIT_MULTI_BUTTON_SUPRESSED_1 = 16, + MICROBIT_MULTI_BUTTON_SUPRESSED_2 = 32, + MICROBIT_MULTI_BUTTON_ATTACHED = 64, + // built/dockeryt/yotta_modules/microbit-dal/inc/drivers/MicroBitPin.h + IO_STATUS_DIGITAL_IN = 1, + IO_STATUS_DIGITAL_OUT = 2, + IO_STATUS_ANALOG_IN = 4, + IO_STATUS_ANALOG_OUT = 8, + IO_STATUS_TOUCH_IN = 16, + IO_STATUS_EVENT_ON_EDGE = 32, + IO_STATUS_EVENT_PULSE_ON_EDGE = 64, + MICROBIT_PIN_MAX_OUTPUT = 1023, + MICROBIT_PIN_MAX_SERVO_RANGE = 180, + MICROBIT_PIN_DEFAULT_SERVO_RANGE = 2000, + MICROBIT_PIN_DEFAULT_SERVO_CENTER = 1500, + MICROBIT_PIN_EVENT_NONE = 0, + MICROBIT_PIN_EVENT_ON_EDGE = 1, + MICROBIT_PIN_EVENT_ON_PULSE = 2, + MICROBIT_PIN_EVENT_ON_TOUCH = 3, + MICROBIT_PIN_EVT_RISE = 2, + MICROBIT_PIN_EVT_FALL = 3, + MICROBIT_PIN_EVT_PULSE_HI = 4, + MICROBIT_PIN_EVT_PULSE_LO = 5, + PIN_CAPABILITY_DIGITAL_IN = 1, + PIN_CAPABILITY_DIGITAL_OUT = 2, + PIN_CAPABILITY_DIGITAL = 3, + PIN_CAPABILITY_ANALOG_IN = 4, + PIN_CAPABILITY_ANALOG_OUT = 8, + PIN_CAPABILITY_ANALOG = 12, + PIN_CAPABILITY_STANDARD = 11, + PIN_CAPABILITY_ALL = 15, + // built/dockeryt/yotta_modules/microbit-dal/inc/drivers/MicroBitQuadratureDecoder.h + QDEC_USE_SYSTEM_TICK = 1, + QDEC_USE_DEBOUNCE = 2, + QDEC_LED_ACTIVE_LOW = 4, + // built/dockeryt/yotta_modules/microbit-dal/inc/drivers/MicroBitRadio.h + MICROBIT_RADIO_STATUS_INITIALISED = 1, + MICROBIT_RADIO_BASE_ADDRESS = 1969383796, + MICROBIT_RADIO_DEFAULT_GROUP = 0, + MICROBIT_RADIO_DEFAULT_TX_POWER = 6, + MICROBIT_RADIO_DEFAULT_FREQUENCY = 7, + MICROBIT_RADIO_MAX_PACKET_SIZE = 32, + MICROBIT_RADIO_HEADER_SIZE = 4, + MICROBIT_RADIO_MAXIMUM_RX_BUFFERS = 4, + MICROBIT_RADIO_PROTOCOL_DATAGRAM = 1, + MICROBIT_RADIO_PROTOCOL_EVENTBUS = 2, + MICROBIT_RADIO_EVT_DATAGRAM = 1, + // built/dockeryt/yotta_modules/microbit-dal/inc/drivers/MicroBitSerial.h + MICROBIT_SERIAL_DEFAULT_BAUD_RATE = 115200, + MICROBIT_SERIAL_DEFAULT_BUFFER_SIZE = 20, + MICROBIT_SERIAL_EVT_DELIM_MATCH = 1, + MICROBIT_SERIAL_EVT_HEAD_MATCH = 2, + MICROBIT_SERIAL_EVT_RX_FULL = 3, + MICROBIT_SERIAL_RX_IN_USE = 1, + MICROBIT_SERIAL_TX_IN_USE = 2, + MICROBIT_SERIAL_RX_BUFF_INIT = 4, + MICROBIT_SERIAL_TX_BUFF_INIT = 8, + ASYNC = 0, + SYNC_SPINWAIT = 1, + SYNC_SLEEP = 2, + // built/dockeryt/yotta_modules/microbit-dal/inc/drivers/MicroBitStorage.h + MICROBIT_STORAGE_MAGIC = 51966, + MICROBIT_STORAGE_BLOCK_SIZE = 48, + MICROBIT_STORAGE_KEY_SIZE = 16, + MICROBIT_STORAGE_STORE_PAGE_OFFSET = 17, + MICROBIT_STORAGE_SCRATCH_PAGE_OFFSET = 19, + // built/dockeryt/yotta_modules/microbit-dal/inc/drivers/MicroBitThermometer.h + MICROBIT_THERMOMETER_PERIOD = 1000, + MAG3110_SAMPLE_RATES = 11, + MICROBIT_THERMOMETER_EVT_UPDATE = 1, + MICROBIT_THERMOMETER_ADDED_TO_IDLE = 2, + // built/dockeryt/yotta_modules/microbit-dal/inc/types/CoordinateSystem.h + COORDINATE_SPACE_ROTATED_0 = 0, + COORDINATE_SPACE_ROTATED_90 = 1, + COORDINATE_SPACE_ROTATED_180 = 2, + COORDINATE_SPACE_ROTATED_270 = 3, + RAW = 0, + SIMPLE_CARTESIAN = 1, + NORTH_EAST_DOWN = 2, + EAST_NORTH_UP = 3, + // built/dockeryt/yotta_modules/microbit-dal/inc/types/MicroBitEvent.h + MICROBIT_ID_ANY = 0, + MICROBIT_EVT_ANY = 0, + CREATE_ONLY = 0, + CREATE_AND_FIRE = 1, + MICROBIT_EVENT_DEFAULT_LAUNCH_MODE = 1, +} diff --git a/pxt_modules/core/enums.d.ts b/pxt_modules/core/enums.d.ts new file mode 100644 index 0000000..facf8f2 --- /dev/null +++ b/pxt_modules/core/enums.d.ts @@ -0,0 +1,577 @@ +// Auto-generated. Do not edit. + + + declare const enum NumberFormat { + Int8LE = 1, + UInt8LE = 2, + Int16LE = 3, + UInt16LE = 4, + Int32LE = 5, + Int8BE = 6, + UInt8BE = 7, + Int16BE = 8, + UInt16BE = 9, + Int32BE = 10, + + UInt32LE = 11, + UInt32BE = 12, + Float32LE = 13, + Float64LE = 14, + Float32BE = 15, + Float64BE = 16, + } + + + declare const enum PerfCounters { + GC = 0, + } +declare namespace images { +} +declare namespace basic { +} + + + declare const enum Button { + A = 1, // MICROBIT_ID_BUTTON_A + B = 2, // MICROBIT_ID_BUTTON_B + //% block="A+B" + AB = 26, // MICROBIT_ID_BUTTON_AB + } + + + declare const enum Dimension { + //% block=x + X = 0, + //% block=y + Y = 1, + //% block=z + Z = 2, + //% block=strength + Strength = 3, + } + + + declare const enum Rotation { + //% block=pitch + Pitch = 0, + //% block=roll + Roll = 1, + } + + + declare const enum TouchPin { + P0 = 7, // MICROBIT_ID_IO_P0 + P1 = 8, // MICROBIT_ID_IO_P1 + P2 = 9, // MICROBIT_ID_IO_P2 + } + + + declare const enum AcceleratorRange { + /** + * The accelerator measures forces up to 1 gravity + */ + //% block="1g" + OneG = 1, + /** + * The accelerator measures forces up to 2 gravity + */ + //% block="2g" + TwoG = 2, + /** + * The accelerator measures forces up to 4 gravity + */ + //% block="4g" + FourG = 4, + /** + * The accelerator measures forces up to 8 gravity + */ + //% block="8g" + EightG = 8, + } + + + declare const enum Gesture { + /** + * Raised when shaken + */ + //% block=shake + //% jres=gestures.shake + Shake = 11, // MICROBIT_ACCELEROMETER_EVT_SHAKE + /** + * Raised when the logo is upward and the screen is vertical + */ + //% block="logo up" + //% jres=gestures.tiltforward + LogoUp = 1, // MICROBIT_ACCELEROMETER_EVT_TILT_UP + /** + * Raised when the logo is downward and the screen is vertical + */ + //% block="logo down" + //% jres=gestures.tiltbackwards + LogoDown = 2, // MICROBIT_ACCELEROMETER_EVT_TILT_DOWN + /** + * Raised when the screen is pointing down and the board is horizontal + */ + //% block="screen up" + //% jres=gestures.frontsideup + ScreenUp = 5, // MICROBIT_ACCELEROMETER_EVT_FACE_UP + /** + * Raised when the screen is pointing up and the board is horizontal + */ + //% block="screen down" + //% jres=gestures.backsideup + ScreenDown = 6, // MICROBIT_ACCELEROMETER_EVT_FACE_DOWN + /** + * Raised when the screen is pointing left + */ + //% block="tilt left" + //% jres=gestures.tiltleft + TiltLeft = 3, // MICROBIT_ACCELEROMETER_EVT_TILT_LEFT + /** + * Raised when the screen is pointing right + */ + //% block="tilt right" + //% jres=gestures.tiltright + TiltRight = 4, // MICROBIT_ACCELEROMETER_EVT_TILT_RIGHT + /** + * Raised when the board is falling! + */ + //% block="free fall" + //% jres=gestures.freefall + FreeFall = 7, // MICROBIT_ACCELEROMETER_EVT_FREEFALL + /** + * Raised when a 3G shock is detected + */ + //% block="3g" + //% jres=gestures.impact3g + ThreeG = 8, // MICROBIT_ACCELEROMETER_EVT_3G + /** + * Raised when a 6G shock is detected + */ + //% block="6g" + //% jres=gestures.impact6g + SixG = 9, // MICROBIT_ACCELEROMETER_EVT_6G + /** + * Raised when a 8G shock is detected + */ + //% block="8g" + //% jres=gestures.impact8g + EightG = 10, // MICROBIT_ACCELEROMETER_EVT_8G + } + + + declare const enum MesDpadButtonInfo { + //% block="A down" + ADown = 1, // MES_DPAD_BUTTON_A_DOWN + //% block="A up" + AUp = 2, // MES_DPAD_BUTTON_A_UP + //% block="B down" + BDown = 3, // MES_DPAD_BUTTON_B_DOWN + //% block="B up" + BUp = 4, // MES_DPAD_BUTTON_B_UP + //% block="C down" + CDown = 5, // MES_DPAD_BUTTON_C_DOWN + //% block="C up" + CUp = 6, // MES_DPAD_BUTTON_C_UP + //% block="D down" + DDown = 7, // MES_DPAD_BUTTON_D_DOWN + //% block="D up" + DUp = 8, // MES_DPAD_BUTTON_D_UP + //% block="1 down" + _1Down = 9, // MES_DPAD_BUTTON_1_DOWN + //% block="1 up" + _1Up = 10, // MES_DPAD_BUTTON_1_UP + //% block="2 down" + _2Down = 11, // MES_DPAD_BUTTON_2_DOWN + //% block="2 up" + _2Up = 12, // MES_DPAD_BUTTON_2_UP + //% block="3 down" + _3Down = 13, // MES_DPAD_BUTTON_3_DOWN + //% block="3 up" + _3Up = 14, // MES_DPAD_BUTTON_3_UP + //% block="4 down" + _4Down = 15, // MES_DPAD_BUTTON_4_DOWN + //% block="4 up" + _4Up = 16, // MES_DPAD_BUTTON_4_UP + } +declare namespace input { +} + + + /** + * How to create the event. + */ + + declare const enum EventCreationMode { + /** + * MicroBitEvent is initialised, and no further processing takes place. + */ + CreateOnly = 0, // CREATE_ONLY + /** + * MicroBitEvent is initialised, and its event handlers are immediately fired (not suitable for use in interrupts!). + */ + CreateAndFire = 1, // CREATE_AND_FIRE + } + + + declare const enum EventBusSource { + //% blockIdentity="control.eventSourceId" + MICROBIT_ID_BUTTON_A = 1, // MICROBIT_ID_BUTTON_A + //% blockIdentity="control.eventSourceId" + MICROBIT_ID_BUTTON_B = 2, // MICROBIT_ID_BUTTON_B + //% blockIdentity="control.eventSourceId" + MICROBIT_ID_BUTTON_AB = 26, // MICROBIT_ID_BUTTON_AB + //% blockIdentity="control.eventSourceId" + MICROBIT_ID_RADIO = 29, // MICROBIT_ID_RADIO + //% blockIdentity="control.eventSourceId" + MICROBIT_ID_GESTURE = 27, // MICROBIT_ID_GESTURE + //% blockIdentity="control.eventSourceId" + MICROBIT_ID_ACCELEROMETER = 4, // MICROBIT_ID_ACCELEROMETER + //% blockIdentity="control.eventSourceId" + MICROBIT_ID_IO_P0 = 7, // MICROBIT_ID_IO_P0 + //% blockIdentity="control.eventSourceId" + MICROBIT_ID_IO_P1 = 8, // MICROBIT_ID_IO_P1 + //% blockIdentity="control.eventSourceId" + MICROBIT_ID_IO_P2 = 9, // MICROBIT_ID_IO_P2 + //% blockIdentity="control.eventSourceId" + MICROBIT_ID_IO_P3 = 10, // MICROBIT_ID_IO_P3 + //% blockIdentity="control.eventSourceId" + MICROBIT_ID_IO_P4 = 11, // MICROBIT_ID_IO_P4 + //% blockIdentity="control.eventSourceId" + MICROBIT_ID_IO_P5 = 12, // MICROBIT_ID_IO_P5 + //% blockIdentity="control.eventSourceId" + MICROBIT_ID_IO_P6 = 13, // MICROBIT_ID_IO_P6 + //% blockIdentity="control.eventSourceId" + MICROBIT_ID_IO_P7 = 14, // MICROBIT_ID_IO_P7 + //% blockIdentity="control.eventSourceId" + MICROBIT_ID_IO_P8 = 15, // MICROBIT_ID_IO_P8 + //% blockIdentity="control.eventSourceId" + MICROBIT_ID_IO_P9 = 16, // MICROBIT_ID_IO_P9 + //% blockIdentity="control.eventSourceId" + MICROBIT_ID_IO_P10 = 17, // MICROBIT_ID_IO_P10 + //% blockIdentity="control.eventSourceId" + MICROBIT_ID_IO_P11 = 18, // MICROBIT_ID_IO_P11 + //% blockIdentity="control.eventSourceId" + MICROBIT_ID_IO_P12 = 19, // MICROBIT_ID_IO_P12 + //% blockIdentity="control.eventSourceId" + MICROBIT_ID_IO_P13 = 20, // MICROBIT_ID_IO_P13 + //% blockIdentity="control.eventSourceId" + MICROBIT_ID_IO_P14 = 21, // MICROBIT_ID_IO_P14 + //% blockIdentity="control.eventSourceId" + MICROBIT_ID_IO_P15 = 22, // MICROBIT_ID_IO_P15 + //% blockIdentity="control.eventSourceId" + MICROBIT_ID_IO_P16 = 23, // MICROBIT_ID_IO_P16 + //% blockIdentity="control.eventSourceId" + MICROBIT_ID_IO_P19 = 24, // MICROBIT_ID_IO_P19 + //% blockIdentity="control.eventSourceId" + MICROBIT_ID_IO_P20 = 25, // MICROBIT_ID_IO_P20 + //% blockIdentity="control.eventSourceId" + MES_DEVICE_INFO_ID = 1103, // MES_DEVICE_INFO_ID + //% blockIdentity="control.eventSourceId" + MES_SIGNAL_STRENGTH_ID = 1101, // MES_SIGNAL_STRENGTH_ID + //% blockIdentity="control.eventSourceId" + MES_DPAD_CONTROLLER_ID = 1104, // MES_DPAD_CONTROLLER_ID + //% blockIdentity="control.eventSourceId" + MES_BROADCAST_GENERAL_ID = 2000, // MES_BROADCAST_GENERAL_ID + } + + + declare const enum EventBusValue { + //% blockIdentity="control.eventValueId" + MICROBIT_EVT_ANY = 0, // MICROBIT_EVT_ANY + //% blockIdentity="control.eventValueId" + MICROBIT_BUTTON_EVT_DOWN = 1, // MICROBIT_BUTTON_EVT_DOWN + //% blockIdentity="control.eventValueId" + MICROBIT_BUTTON_EVT_UP = 2, // MICROBIT_BUTTON_EVT_UP + //% blockIdentity="control.eventValueId" + MICROBIT_BUTTON_EVT_CLICK = 3, // MICROBIT_BUTTON_EVT_CLICK + //% blockIdentity="control.eventValueId" + MICROBIT_RADIO_EVT_DATAGRAM = 1, // MICROBIT_RADIO_EVT_DATAGRAM + //% blockIdentity="control.eventValueId" + MICROBIT_ACCELEROMETER_EVT_DATA_UPDATE = 1, // MICROBIT_ACCELEROMETER_EVT_DATA_UPDATE + //% blockIdentity="control.eventValueId" + MICROBIT_PIN_EVT_RISE = 2, // MICROBIT_PIN_EVT_RISE + //% blockIdentity="control.eventValueId" + MICROBIT_PIN_EVT_FALL = 3, // MICROBIT_PIN_EVT_FALL + //% blockIdentity="control.eventValueId" + MICROBIT_PIN_EVT_PULSE_HI = 4, // MICROBIT_PIN_EVT_PULSE_HI + //% blockIdentity="control.eventValueId" + MICROBIT_PIN_EVT_PULSE_LO = 5, // MICROBIT_PIN_EVT_PULSE_LO + //% blockIdentity="control.eventValueId" + MES_ALERT_EVT_ALARM1 = 6, // MES_ALERT_EVT_ALARM1 + //% blockIdentity="control.eventValueId" + MES_ALERT_EVT_ALARM2 = 7, // MES_ALERT_EVT_ALARM2 + //% blockIdentity="control.eventValueId" + MES_ALERT_EVT_ALARM3 = 8, // MES_ALERT_EVT_ALARM3 + //% blockIdentity="control.eventValueId" + MES_ALERT_EVT_ALARM4 = 9, // MES_ALERT_EVT_ALARM4 + //% blockIdentity="control.eventValueId" + MES_ALERT_EVT_ALARM5 = 10, // MES_ALERT_EVT_ALARM5 + //% blockIdentity="control.eventValueId" + MES_ALERT_EVT_ALARM6 = 11, // MES_ALERT_EVT_ALARM6 + //% blockIdentity="control.eventValueId" + MES_ALERT_EVT_DISPLAY_TOAST = 1, // MES_ALERT_EVT_DISPLAY_TOAST + //% blockIdentity="control.eventValueId" + MES_ALERT_EVT_FIND_MY_PHONE = 5, // MES_ALERT_EVT_FIND_MY_PHONE + //% blockIdentity="control.eventValueId" + MES_ALERT_EVT_PLAY_RINGTONE = 4, // MES_ALERT_EVT_PLAY_RINGTONE + //% blockIdentity="control.eventValueId" + MES_ALERT_EVT_PLAY_SOUND = 3, // MES_ALERT_EVT_PLAY_SOUND + //% blockIdentity="control.eventValueId" + MES_ALERT_EVT_VIBRATE = 2, // MES_ALERT_EVT_VIBRATE + //% blockIdentity="control.eventValueId" + MES_CAMERA_EVT_LAUNCH_PHOTO_MODE = 1, // MES_CAMERA_EVT_LAUNCH_PHOTO_MODE + //% blockIdentity="control.eventValueId" + MES_CAMERA_EVT_LAUNCH_VIDEO_MODE = 2, // MES_CAMERA_EVT_LAUNCH_VIDEO_MODE + //% blockIdentity="control.eventValueId" + MES_CAMERA_EVT_START_VIDEO_CAPTURE = 4, // MES_CAMERA_EVT_START_VIDEO_CAPTURE + //% blockIdentity="control.eventValueId" + MES_CAMERA_EVT_STOP_PHOTO_MODE = 6, // MES_CAMERA_EVT_STOP_PHOTO_MODE + //% blockIdentity="control.eventValueId" + MES_CAMERA_EVT_STOP_VIDEO_CAPTURE = 5, // MES_CAMERA_EVT_STOP_VIDEO_CAPTURE + //% blockIdentity="control.eventValueId" + MES_CAMERA_EVT_STOP_VIDEO_MODE = 7, // MES_CAMERA_EVT_STOP_VIDEO_MODE + //% blockIdentity="control.eventValueId" + MES_CAMERA_EVT_TAKE_PHOTO = 3, // MES_CAMERA_EVT_TAKE_PHOTO + //% blockIdentity="control.eventValueId" + MES_CAMERA_EVT_TOGGLE_FRONT_REAR = 8, // MES_CAMERA_EVT_TOGGLE_FRONT_REAR + //% blockIdentity="control.eventValueId" + MES_DEVICE_DISPLAY_OFF = 5, // MES_DEVICE_DISPLAY_OFF + //% blockIdentity="control.eventValueId" + MES_DEVICE_DISPLAY_ON = 6, // MES_DEVICE_DISPLAY_ON + //% blockIdentity="control.eventValueId" + MES_DEVICE_GESTURE_DEVICE_SHAKEN = 4, // MES_DEVICE_GESTURE_DEVICE_SHAKEN + //% blockIdentity="control.eventValueId" + MES_DEVICE_INCOMING_CALL = 7, // MES_DEVICE_INCOMING_CALL + //% blockIdentity="control.eventValueId" + MES_DEVICE_INCOMING_MESSAGE = 8, // MES_DEVICE_INCOMING_MESSAGE + //% blockIdentity="control.eventValueId" + MES_DEVICE_ORIENTATION_LANDSCAPE = 1, // MES_DEVICE_ORIENTATION_LANDSCAPE + //% blockIdentity="control.eventValueId" + MES_DEVICE_ORIENTATION_PORTRAIT = 2, // MES_DEVICE_ORIENTATION_PORTRAIT + //% blockIdentity="control.eventValueId" + MES_DPAD_BUTTON_1_DOWN = 9, // MES_DPAD_BUTTON_1_DOWN + //% blockIdentity="control.eventValueId" + MES_DPAD_BUTTON_1_UP = 10, // MES_DPAD_BUTTON_1_UP + //% blockIdentity="control.eventValueId" + MES_DPAD_BUTTON_2_DOWN = 11, // MES_DPAD_BUTTON_2_DOWN + //% blockIdentity="control.eventValueId" + MES_DPAD_BUTTON_2_UP = 12, // MES_DPAD_BUTTON_2_UP + //% blockIdentity="control.eventValueId" + MES_DPAD_BUTTON_3_DOWN = 13, // MES_DPAD_BUTTON_3_DOWN + //% blockIdentity="control.eventValueId" + MES_DPAD_BUTTON_3_UP = 14, // MES_DPAD_BUTTON_3_UP + //% blockIdentity="control.eventValueId" + MES_DPAD_BUTTON_4_DOWN = 15, // MES_DPAD_BUTTON_4_DOWN + //% blockIdentity="control.eventValueId" + MES_DPAD_BUTTON_4_UP = 16, // MES_DPAD_BUTTON_4_UP + //% blockIdentity="control.eventValueId" + MES_DPAD_BUTTON_A_DOWN = 1, // MES_DPAD_BUTTON_A_DOWN + //% blockIdentity="control.eventValueId" + MES_DPAD_BUTTON_A_UP = 2, // MES_DPAD_BUTTON_A_UP + //% blockIdentity="control.eventValueId" + MES_DPAD_BUTTON_B_DOWN = 3, // MES_DPAD_BUTTON_B_DOWN + //% blockIdentity="control.eventValueId" + MES_DPAD_BUTTON_B_UP = 4, // MES_DPAD_BUTTON_B_UP + //% blockIdentity="control.eventValueId" + MES_DPAD_BUTTON_C_DOWN = 5, // MES_DPAD_BUTTON_C_DOWN + //% blockIdentity="control.eventValueId" + MES_DPAD_BUTTON_C_UP = 6, // MES_DPAD_BUTTON_C_UP + //% blockIdentity="control.eventValueId" + MES_DPAD_BUTTON_D_DOWN = 7, // MES_DPAD_BUTTON_D_DOWN + //% blockIdentity="control.eventValueId" + MES_DPAD_BUTTON_D_UP = 8, // MES_DPAD_BUTTON_D_UP + //% blockIdentity="control.eventValueId" + MES_REMOTE_CONTROL_EVT_FORWARD = 6, // MES_REMOTE_CONTROL_EVT_FORWARD + //% blockIdentity="control.eventValueId" + MES_REMOTE_CONTROL_EVT_NEXTTRACK = 4, // MES_REMOTE_CONTROL_EVT_NEXTTRACK + //% blockIdentity="control.eventValueId" + MES_REMOTE_CONTROL_EVT_PAUSE = 2, // MES_REMOTE_CONTROL_EVT_PAUSE + //% blockIdentity="control.eventValueId" + MES_REMOTE_CONTROL_EVT_PLAY = 1, // MES_REMOTE_CONTROL_EVT_PLAY + //% blockIdentity="control.eventValueId" + MES_REMOTE_CONTROL_EVT_PREVTRACK = 5, // MES_REMOTE_CONTROL_EVT_PREVTRACK + //% blockIdentity="control.eventValueId" + MES_REMOTE_CONTROL_EVT_REWIND = 7, // MES_REMOTE_CONTROL_EVT_REWIND + //% blockIdentity="control.eventValueId" + MES_REMOTE_CONTROL_EVT_STOP = 3, // MES_REMOTE_CONTROL_EVT_STOP + //% blockIdentity="control.eventValueId" + MES_REMOTE_CONTROL_EVT_VOLUMEDOWN = 9, // MES_REMOTE_CONTROL_EVT_VOLUMEDOWN + //% blockIdentity="control.eventValueId" + MES_REMOTE_CONTROL_EVT_VOLUMEUP = 8, // MES_REMOTE_CONTROL_EVT_VOLUMEUP + } + + + declare const enum EventFlags { + //% + QueueIfBusy = 16, // MESSAGE_BUS_LISTENER_QUEUE_IF_BUSY + //% + DropIfBusy = 32, // MESSAGE_BUS_LISTENER_DROP_IF_BUSY + //% + Reentrant = 8, // MESSAGE_BUS_LISTENER_REENTRANT + } +declare namespace control { +} + + + declare const enum DisplayMode { + //% block="black and white" + BlackAndWhite = 0, // DISPLAY_MODE_BLACK_AND_WHITE + //% blockHidden=true + BackAndWhite = 0, // DISPLAY_MODE_BLACK_AND_WHITE + //% block="greyscale" + Greyscale = 1, // DISPLAY_MODE_GREYSCALE + // TODO DISPLAY_MODE_BLACK_AND_WHITE_LIGHT_SENSE + } +declare namespace led { +} + + + declare const enum DigitalPin { + P0 = 7, // MICROBIT_ID_IO_P0 + P1 = 8, // MICROBIT_ID_IO_P1 + P2 = 9, // MICROBIT_ID_IO_P2 + P3 = 10, // MICROBIT_ID_IO_P3 + P4 = 11, // MICROBIT_ID_IO_P4 + P5 = 12, // MICROBIT_ID_IO_P5 + P6 = 13, // MICROBIT_ID_IO_P6 + P7 = 14, // MICROBIT_ID_IO_P7 + P8 = 15, // MICROBIT_ID_IO_P8 + P9 = 16, // MICROBIT_ID_IO_P9 + P10 = 17, // MICROBIT_ID_IO_P10 + P11 = 18, // MICROBIT_ID_IO_P11 + P12 = 19, // MICROBIT_ID_IO_P12 + P13 = 20, // MICROBIT_ID_IO_P13 + P14 = 21, // MICROBIT_ID_IO_P14 + P15 = 22, // MICROBIT_ID_IO_P15 + P16 = 23, // MICROBIT_ID_IO_P16 + P19 = 24, // MICROBIT_ID_IO_P19 + P20 = 25, // MICROBIT_ID_IO_P20 + } + + + declare const enum AnalogPin { + P0 = 7, // MICROBIT_ID_IO_P0 + P1 = 8, // MICROBIT_ID_IO_P1 + P2 = 9, // MICROBIT_ID_IO_P2 + P3 = 10, // MICROBIT_ID_IO_P3 + P4 = 11, // MICROBIT_ID_IO_P4 + P10 = 17, // MICROBIT_ID_IO_P10 + //% block="P5 (write only)" + P5 = 12, // MICROBIT_ID_IO_P5 + //% block="P6 (write only)" + P6 = 13, // MICROBIT_ID_IO_P6 + //% block="P7 (write only)" + P7 = 14, // MICROBIT_ID_IO_P7 + //% block="P8 (write only)" + P8 = 15, // MICROBIT_ID_IO_P8 + //% block="P9 (write only)" + P9 = 16, // MICROBIT_ID_IO_P9 + //% block="P11 (write only)" + P11 = 18, // MICROBIT_ID_IO_P11 + //% block="P12 (write only)" + P12 = 19, // MICROBIT_ID_IO_P12 + //% block="P13 (write only)" + P13 = 20, // MICROBIT_ID_IO_P13 + //% block="P14 (write only)" + P14 = 21, // MICROBIT_ID_IO_P14 + //% block="P15 (write only)" + P15 = 22, // MICROBIT_ID_IO_P15 + //% block="P16 (write only)" + P16 = 23, // MICROBIT_ID_IO_P16 + //% block="P19 (write only)" + P19 = 24, // MICROBIT_ID_IO_P19 + //% block="P20 (write only)" + P20 = 25, // MICROBIT_ID_IO_P20 + } + + + declare const enum PulseValue { + //% block=high + High = 4, // MICROBIT_PIN_EVT_PULSE_HI + //% block=low + Low = 5, // MICROBIT_PIN_EVT_PULSE_LO + } + + + declare const enum PinPullMode { + //% block="down" + PullDown = 0, + //% block="up" + PullUp = 1, + //% block="none" + PullNone = 2, + } + + + declare const enum PinEventType { + //% block="edge" + Edge = 1, // MICROBIT_PIN_EVENT_ON_EDGE + //% block="pulse" + Pulse = 2, // MICROBIT_PIN_EVENT_ON_PULSE + //% block="touch" + Touch = 3, // MICROBIT_PIN_EVENT_ON_TOUCH + //% block="none" + None = 0, // MICROBIT_PIN_EVENT_NONE + } + + + declare const enum SerialPin { + P0 = 7, // MICROBIT_ID_IO_P0 + P1 = 8, // MICROBIT_ID_IO_P1 + P2 = 9, // MICROBIT_ID_IO_P2 + P8 = 15, // MICROBIT_ID_IO_P8 + P12 = 19, // MICROBIT_ID_IO_P12 + P13 = 20, // MICROBIT_ID_IO_P13 + P14 = 21, // MICROBIT_ID_IO_P14 + P15 = 22, // MICROBIT_ID_IO_P15 + P16 = 23, // MICROBIT_ID_IO_P16 + USB_TX = 1001, + USB_RX = 1002, + } + + + declare const enum BaudRate { + //% block=115200 + BaudRate115200 = 115200, + //% block=57600 + BaudRate57600 = 57600, + //% block=38400 + BaudRate38400 = 38400, + //% block=31250 + BaudRate31250 = 31250, + //% block=28800 + BaudRate28800 = 28800, + //% block=19200 + BaudRate19200 = 19200, + //% block=14400 + BaudRate14400 = 14400, + //% block=9600 + BaudRate9600 = 9600, + //% block=4800 + BaudRate4800 = 4800, + //% block=2400 + BaudRate2400 = 2400, + //% block=1200 + BaudRate1200 = 1200, + } + + + declare const enum Delimiters { + //% block="new line" + NewLine = 1, + //% block="," + Comma = 2, + //% block="$" + Dollar = 3, + //% block=":" + Colon = 4, + //% block="." + Fullstop = 5, + //% block="#" + Hash = 6, + } +declare namespace serial { +} + +// Auto-generated. Do not edit. Really. diff --git a/pxt_modules/core/fixed.ts b/pxt_modules/core/fixed.ts new file mode 100644 index 0000000..3901431 --- /dev/null +++ b/pxt_modules/core/fixed.ts @@ -0,0 +1,71 @@ +interface Fx8 { + _dummyFx8: string; +} + +function Fx8(v: number) { + return ((v * 256) | 0) as any as Fx8 +} + +namespace Fx { + export const zeroFx8 = 0 as any as Fx8 + export const oneFx8 = 1 as any as Fx8 + export const twoFx8 = 2 as any as Fx8 + + export function neg(a: Fx8) { + return (-(a as any as number)) as any as Fx8 + } + export function toIntShifted(a: Fx8, n: number) { + return (a as any as number) >> (n + 8) + } + export function add(a: Fx8, b: Fx8) { + return ((a as any as number) + (b as any as number)) as any as Fx8 + } + export function iadd(a: number, b: Fx8) { + return ((a << 8) + (b as any as number)) as any as Fx8 + } + export function sub(a: Fx8, b: Fx8) { + return ((a as any as number) - (b as any as number)) as any as Fx8 + } + export function mul(a: Fx8, b: Fx8) { + return (Math.imul((a as any as number), (b as any as number)) >> 8) as any as Fx8 + } + export function div(a: Fx8, b: Fx8) { + return Math.idiv((a as any as number) << 8, b as any as number) as any as Fx8 + } + export function idiv(a: Fx8, b: number) { + return Math.idiv((a as any as number), b) as any as Fx8 + } + export function compare(a: Fx8, b: Fx8) { + return (a as any as number) - (b as any as number) + } + export function abs(a: Fx8) { + if ((a as any as number) < 0) + return (-(a as any as number)) as any as Fx8 + else + return a + } + export function min(a: Fx8, b: Fx8) { + if (a < b) + return a + else + return b + } + export function max(a: Fx8, b: Fx8) { + if (a > b) + return a + else + return b + } + export function leftShift(a: Fx8, n: number) { + return (a as any as number << n) as any as Fx8 + } + export function rightShift(a: Fx8, n: number) { + return (a as any as number >> n) as any as Fx8 + } + export function toInt(v: Fx8) { + return ((v as any as number) + 128) >> 8 + } + export function toFloat(v: Fx8) { + return (v as any as number) / 256 + } +} \ No newline at end of file diff --git a/pxt_modules/core/game.ts b/pxt_modules/core/game.ts new file mode 100644 index 0000000..05e4826 --- /dev/null +++ b/pxt_modules/core/game.ts @@ -0,0 +1,794 @@ +enum Direction { + //% block=right + Right, + //% block=left + Left +} + +enum LedSpriteProperty { + //% block=x + X, + //% block=y + Y, + //% block=direction + Direction, + //% block=brightness + Brightness, + //% block=blink + Blink +} + +/** + * A single-LED sprite game engine + */ +//% color=#007A4B weight=32 icon="\uf11b" +//% advanced=true +namespace game { + let _score: number = 0; + let _life: number = 3; + let _startTime: number = 0; + let _endTime: number = 0; + let _isGameOver: boolean = false; + let _countdownPause: number = 0; + let _level: number = 1; + let _gameId: number = 0; + let _img: Image; + let _sprites: LedSprite[]; + let _paused: boolean = false; + let _backgroundAnimation = false; // indicates if an auxiliary animation (and fiber) is already running + + /** + * Creates a new LED sprite pointing to the right. + * @param x sprite horizontal coordinate, eg: 2 + * @param y sprite vertical coordinate, eg: 2 + */ + //% weight=60 blockGap=8 help=game/create-sprite + //% blockId=game_create_sprite block="create sprite at|x: %x|y: %y" + //% parts="ledmatrix" + export function createSprite(x: number, y: number): LedSprite { + init(); + let p = new LedSprite(x, y); + return p; + } + + /** + * Gets the current score + */ + //% weight=9 help=game/score + //% blockId=game_score block="score" blockGap=8 + export function score(): number { + return _score; + } + + /** + * Adds points to the current score and shows an animation + * @param points amount of points to change, eg: 1 + */ + //% weight=10 help=game/add-score + //% blockId=game_add_score block="change score by|%points" blockGap=8 + //% parts="ledmatrix" + export function addScore(points: number): void { + setScore(_score + points); + if (!_paused && !_backgroundAnimation) { + _backgroundAnimation = true; + control.inBackground(() => { + led.stopAnimation(); + basic.showAnimation(`0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 0 0 1 0 0 0 0 0 + 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 + 0 0 1 0 0 0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 0 0 1 0 0 0 0 0`, 20); + _backgroundAnimation = false; + }); + } + } + + /** + * Shows an animation, then starts a game countdown timer, which causes Game Over when it reaches 0 + * @param ms countdown duration in milliseconds, eg: 10000 + */ + //% weight=9 help=game/start-countdown + //% blockId=game_start_countdown block="start countdown|(ms) %duration" blockGap=8 + //% parts="ledmatrix" + export function startCountdown(ms: number): void { + if (checkStart()) { + basic.showAnimation(`1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 +0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 +1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 +0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 +1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0`, 400); + _countdownPause = Math.max(500, ms); + _startTime = -1; + _endTime = input.runningTime() + _countdownPause; + _paused = false; + control.inBackground(() => { + basic.pause(_countdownPause); + gameOver(); + }); + } + } + + /** + * Displays a game over animation and the score. + */ + //% weight=8 help=game/game-over + //% blockId=game_game_over block="game over" + //% parts="ledmatrix" + export function gameOver(): void { + if (!_isGameOver) { + _isGameOver = true; + unplugEvents(); + led.stopAnimation(); + led.setBrightness(255); + while (true) { + for (let i = 0; i < 8; i++) { + basic.clearScreen(); + basic.pause(100); + basic.showLeds(`1 1 1 1 1 +1 1 1 1 1 +1 1 1 1 1 +1 1 1 1 1 +1 1 1 1 1`, 300); + } + basic.showAnimation(`1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 +1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 0 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1 1 0 1 1 1 0 0 0 1 1 0 0 0 1 1 0 0 0 1 1 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 0 0 1 1 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 0 0 1 1 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0`, 100); + for (let j = 0; j < 3; j++) { + basic.showString(" GAMEOVER ", 100); + showScore(); + } + } + } else { + // already in game over mode in another fiber + while (true) { + basic.pause(10000); + } + } + } + + /** + * Sets the current score value + * @param value new score value. + */ + //% blockId=game_set_score block="set score %points" blockGap=8 + //% weight=10 help=game/set-score + export function setScore(value: number): void { + _score = Math.max(0, value); + } + + /** + * Gets the current life + */ + //% weight=10 + export function life(): number { + return _life; + } + + /** + * Sets the current life value + * @param value current life value + */ + //% weight=10 help=game/set-life + //% blockId=game_set_life block="set life %value" blockGap=8 + export function setLife(value: number): void { + _life = Math.max(0, value); + if (_life <= 0) { + gameOver(); + } + } + + /** + * Add life points to the current life amount + * @param lives amount of lives to add + */ + //% weight=10 help=game/add-life + //% blockId=game_add_life block="add life %lives" blockGap=8 + export function addLife(lives: number): void { + setLife(_life + lives); + } + + /** + * Gets the remaining time (since `start countdown`) or current time (since the device started or `start stopwatch`) in milliseconds. + */ + //% weight=10 + export function currentTime(): number { + if (_endTime > 0) { + return Math.max(0, _endTime - input.runningTime()); + } else { + return input.runningTime() - _startTime; + } + } + + /** + * Remove some life + * @param life amount of life to remove + */ + //% weight=10 help=game/remove-life + //% parts="ledmatrix" + //% blockId=game_remove_life block="remove life %life" blockGap=8 + export function removeLife(life: number): void { + setLife(_life - life); + if (!_paused) + control.inBackground(() => { + led.stopAnimation(); + basic.showAnimation(`1 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 +0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 +0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 +0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 +1 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0`, 40); + }); + } + + /** + * Increments the level and display a message. + */ + //% weight=10 + //% parts="ledmatrix" + export function levelUp(): void { + _level = _level + 1; + basic.showString("LEVEL:", 150); + basic.showNumber(_level, 150); + } + + /** + * Gets the current level + */ + //% weight=10 + export function level(): number { + return _level; + } + + /** + * Starts a stopwatch timer. `current time` will return the elapsed time. + */ + //% weight=10 + export function startStopwatch(): void { + _startTime = input.runningTime(); + _endTime = -1; + } + + /** + * Indicates if the game is still running. Returns `false` if the game is over or paused. + */ + //% weight=5 help=game/is-running + //% blockId=game_isrunning block="is running" blockGap=8 + export function isRunning(): boolean { + return !_isGameOver && !_paused && !!_img; + } + + /** + * Displays the score on the screen. + */ + //% weight=60 + //% parts="ledmatrix" + export function showScore(): void { + basic.showString(" SCORE ", 100); + basic.showNumber(_score, 150); + basic.showString(" ", 150); + } + + /** + * Indicates if the game is over and displaying the game over sequence. + */ + //% weight=7 help=game/is-game-over + //% blockId=game_isgameover block="is game over" blockGap=8 + export function isGameOver(): boolean { + return _isGameOver; + } + + /** + * Indicates if the game rendering is paused to allow other animations + */ + //% weight=6 help=game/is-paused + //% blockId=game_ispaused block="is paused" blockGap=8 + export function isPaused(): boolean { + return _paused; + } + + /** + * Pauses the game rendering engine to allow other animations + */ + //% blockId=game_pause block="pause" + //% advanced=true blockGap=8 help=game/pause + export function pause(): void { + plot() + _paused = true; + } + + + /** + * Resumes the game rendering engine + */ + //% blockId=game_resume block="resume" + //% advanced=true blockGap=8 help=game/resumeP + export function resume(): void { + _paused = false; + plot(); + } + + /** + * returns false if game can't start + */ + function checkStart(): boolean { + if (_countdownPause > 0 || _startTime > 0) { + return false; + } else { + return true; + } + } + + function unplugEvents(): void { + input.onButtonPressed(Button.A, () => { }); + input.onButtonPressed(Button.B, () => { }); + input.onButtonPressed(Button.AB, () => { + control.reset(); + }); + } + + /** + * A game sprite rendered as a single LED + */ + //% + export class LedSprite { + private _x: number; + private _y: number; + private _dir: number; + private _brightness: number; + private _blink: number; + private _enabled: boolean; + + constructor(x: number, y: number) { + this._x = Math.clamp(0, 4, x); + this._y = Math.clamp(0, 4, y); + this._dir = 90; + this._brightness = 255; + this._enabled = true; + init(); + _sprites.push(this); + plot(); + } + + /** + * Move a certain number of LEDs in the current direction + * @param this the sprite to move + * @param leds number of leds to move, eg: 1, -1 + */ + //% weight=50 help=game/move + //% blockId=game_move_sprite block="%sprite|move by %leds" blockGap=8 + //% parts="ledmatrix" + public move(leds: number): void { + if (this._dir == 0) { + this._y = this._y - leds; + } else if (this._dir == 45) { + this._x = this._x + leds; + this._y = this._y - leds; + } else if (this._dir == 90) { + this._x = this._x + leds; + } else if (this._dir == 135) { + this._x = this._x + leds; + this._y = this._y + leds; + } else if (this._dir == 180) { + this._y = this._y + leds; + } else if (this._dir == -45) { + this._x = this._x - leds; + this._y = this._y - leds; + } else if (this._dir == -90) { + this._x = this._x - leds; + } else { + this._x = this._x - leds; + this._y = this._y + leds; + } + this._x = Math.clamp(0, 4, this._x); + this._y = Math.clamp(0, 4, this._y); + plot(); + } + + /** + * Go to this position on the screen + * @param this TODO + * @param x TODO + * @param y TODO + */ + //% parts="ledmatrix" + public goTo(x: number, y: number): void { + this._x = x; + this._y = y; + this._x = Math.clamp(0, 4, this._x); + this._y = Math.clamp(0, 4, this._y); + plot(); + } + + /** + * If touching the edge of the stage and facing towards it, then turn away. + * @param this the sprite to check for bounce + */ + //% weight=18 help=game/if-on-edge-bounce + //% blockId=game_sprite_bounce block="%sprite|if on edge, bounce" + //% parts="ledmatrix" + public ifOnEdgeBounce(): void { + if (this._dir == 0 && this._y == 0) { + this._dir = 180; + } else if (this._dir == 45 && (this._x == 4 || this._y == 0)) { + if (this._x == 0 && this._y == 0) { + this._dir = -135; + } else if (this._y == 0) { + this._dir = 135; + } else { + this._dir = -45; + } + } else if (this._dir == 90 && this._x == 4) { + this._dir = -90; + } else if (this._dir == 135 && (this._x == 4 || this._y == 4)) { + if (this.x() == 4 && this.y() == 4) { + this._dir = -45; + } else if (this._y == 4) { + this._dir = 45; + } else { + this._dir = -135; + } + } else if (this._dir == 180 && this._y == 4) { + this._dir = 0; + } else if (this._dir == -45 && (this._x == 0 || this._y == 0)) { + if (this.x() == 0 && this.y() == 0) { + this._dir = 135; + } else if (this._y == 0) { + this._dir = -135; + } else { + this._dir = 45; + } + } else if (this._dir == -90 && this._x == 0) { + this._dir = 90; + } else if (this._dir == -135 && (this._x == 0 || this._y == 4)) { + if (this._x == 0 && this._y == 4) { + this._dir = 45; + } else if (this._y == 4) { + this._dir = -45; + } else { + this._dir = 135; + } + } + plot(); + } + + /** + * Turn the sprite + * @param this the sprite to trun + * @param direction left or right + * @param degrees angle in degrees to turn, eg: 45, 90, 180, 135 + */ + //% weight=49 help=game/turn + //% blockId=game_turn_sprite block="%sprite|turn %direction|by (°) %degrees" + public turn(direction: Direction, degrees: number) { + if (direction == Direction.Right) + this.setDirection(this._dir + degrees); + else + this.setDirection(this._dir - degrees); + } + + /** + * Turn to the right (clockwise) + * @param this the sprite to turn + * @param degrees TODO + */ + public turnRight(degrees: number): void { + this.turn(Direction.Right, degrees); + } + + /** + * Turn to the left (counter-clockwise) + * @param this the sprite to turn + * @param degrees TODO + */ + public turnLeft(degrees: number): void { + this.turn(Direction.Left, degrees); + } + + /** + * Sets a property of the sprite + * @param property the name of the property to change + * @param the updated value + */ + //% weight=29 help=game/set + //% blockId=game_sprite_set_property block="%sprite|set %property|to %value" blockGap=8 + public set(property: LedSpriteProperty, value: number) { + switch (property) { + case LedSpriteProperty.X: this.setX(value); break; + case LedSpriteProperty.Y: this.setY(value); break; + case LedSpriteProperty.Direction: this.setDirection(value); break; + case LedSpriteProperty.Brightness: this.setBrightness(value); break; + case LedSpriteProperty.Blink: this.setBlink(value); break; + } + } + + /** + * Changes a property of the sprite + * @param property the name of the property to change + * @param value amount of change, eg: 1 + */ + //% weight=30 help=game/change + //% blockId=game_sprite_change_xy block="%sprite|change %property|by %value" blockGap=8 + public change(property: LedSpriteProperty, value: number) { + switch (property) { + case LedSpriteProperty.X: this.changeXBy(value); break; + case LedSpriteProperty.Y: this.changeYBy(value); break; + case LedSpriteProperty.Direction: this.changeDirectionBy(value); break; + case LedSpriteProperty.Brightness: this.changeBrightnessBy(value); break; + case LedSpriteProperty.Blink: this.changeBlinkBy(value); break; + } + } + + /** + * Gets a property of the sprite + * @param property the name of the property to change + */ + //% weight=28 help=game/get + //% blockId=game_sprite_property block="%sprite|%property" + public get(property: LedSpriteProperty) { + switch (property) { + case LedSpriteProperty.X: return this.x(); + case LedSpriteProperty.Y: return this.y(); + case LedSpriteProperty.Direction: return this.direction() + case LedSpriteProperty.Brightness: return this.brightness(); + case LedSpriteProperty.Blink: return this.blink(); + default: return 0; + } + } + + /** + * Set the direction of the current sprite, rounded to the nearest multiple of 45 + * @param this the sprite to set direction for + * @param degrees new direction in degrees + */ + //% parts="ledmatrix" + public setDirection(degrees: number): void { + this._dir = (Math.floor(degrees / 45) % 8) * 45; + if (this._dir <= -180) { + this._dir = this._dir + 360; + } else if (this._dir > 180) { + this._dir = this._dir - 360; + } + plot(); + } + + /** + * Reports the ``x`` position of a sprite on the LED screen + * @param this TODO + */ + public x(): number { + return this._x; + } + + /** + * Reports the ``y`` position of a sprite on the LED screen + * @param this TODO + */ + public y(): number { + return this._y; + } + + /** + * Reports the current direction of a sprite + * @param this TODO + */ + public direction(): number { + return this._dir; + } + + /** + * Set the ``x`` position of a sprite + * @param this TODO + * @param x TODO + */ + public setX(x: number): void { + this.goTo(x, this._y); + } + + /** + * Set the ``y`` position of a sprite + * @param this TODO + * @param y TODO + */ + public setY(y: number): void { + this.goTo(this._x, y); + } + + /** + * Changes the ``y`` position by the given amount + * @param this TODO + * @param y TODO + */ + public changeYBy(y: number): void { + this.goTo(this._x, this._y + y); + } + + /** + * Changes the ``x`` position by the given amount + * @param this TODO + * @param x TODO + */ + public changeXBy(x: number): void { + this.goTo(this._x + x, this._y); + } + + /** + * Reports true if sprite has the same position as specified sprite + * @param this the sprite to check overlap or touch + * @param other the other sprite to check overlap or touch + */ + //% weight=20 help=game/is-touching + //% blockId=game_sprite_touching_sprite block="is %sprite|touching %other" blockGap=8 + public isTouching(other: LedSprite): boolean { + return this._enabled && other._enabled && this._x == other._x && this._y == other._y; + } + + /** + * Reports true if sprite is touching an edge + * @param this the sprite to check for an edge contact + */ + //% weight=19 help=game/is-touching-edge + //% blockId=game_sprite_touching_edge block="is %sprite|touching edge" blockGap=8 + public isTouchingEdge(): boolean { + return this._x == 0 || this._x == 4 || this._y == 0 || this._y == 4; + } + + /** + * Turns on the sprite (on by default) + * @param this the sprite + */ + public on(): void { + this.setBrightness(255); + } + + /** + * Turns off the sprite (on by default) + * @param this the sprite + */ + public off(): void { + this.setBrightness(0); + } + + /** + * Set the ``brightness`` of a sprite + * @param this the sprite + * @param brightness the brightness from 0 (off) to 255 (on), eg: 255. + */ + //% parts="ledmatrix" + public setBrightness(brightness: number): void { + this._brightness = Math.clamp(0, 255, brightness); + plot(); + } + + /** + * Reports the ``brightness` of a sprite on the LED screen + * @param this the sprite + */ + //% parts="ledmatrix" + public brightness(): number { + let r: number; + return this._brightness; + } + + /** + * Changes the ``y`` position by the given amount + * @param this the sprite + * @param value the value to change brightness + */ + public changeBrightnessBy(value: number): void { + this.setBrightness(this._brightness + value); + } + + /** + * Changes the ``direction`` position by the given amount by turning right + * @param this TODO + * @param angle TODO + */ + public changeDirectionBy(angle: number): void { + this.turnRight(angle); + } + + /** + * Deletes the sprite from the game engine. The sprite will no longer appear on the screen or interact with other sprites. + * @param this sprite to delete + */ + //% weight=59 help=game/delete + //% blockId="game_delete_sprite" block="delete %this(sprite)" + public delete(): void { + this._enabled = false; + if (_sprites.removeElement(this)) + plot(); + } + + /** + * Sets the blink duration interval in millisecond. + * @param sprite TODO + * @param ms TODO + */ + public setBlink(ms: number): void { + this._blink = Math.clamp(0, 10000, ms); + } + + /** + * Changes the ``blink`` duration by the given amount of millisecons + * @param this TODO + * @param ms TODO + */ + public changeBlinkBy(ms: number): void { + this.setBlink(this._blink + ms); + } + + /** + * Reports the ``blink`` duration of a sprite + * @param this TODO + */ + public blink(): number { + return this._blink; + } + + //% weight=-1 + //% parts="ledmatrix" + public _plot(now: number) { + let ps = this + if (ps._brightness > 0) { + let r = 0; + if (ps._blink > 0) { + r = Math.floor(now / ps._blink) % 2; + } + if (r == 0) { + _img.setPixelBrightness(ps._x, ps._y, _img.pixelBrightness(ps._x, ps._y) + ps._brightness); + } + } + } + } + + function init(): void { + if (_img) return; + const img = images.createImage( +`0 0 0 0 0 +0 0 0 0 0 +0 0 0 0 0 +0 0 0 0 0 +0 0 0 0 0`); + _sprites = ([]); + basic.forever(() => { + basic.pause(30); + plot(); + if (game.isGameOver()) { + basic.pause(600); + } + }); + _img = img; + } + + /** + * Plots the current sprites on the screen + */ + //% parts="ledmatrix" + function plot(): void { + if (game.isGameOver() || game.isPaused() || !_img || _backgroundAnimation) { + return; + } + // ensure greyscale mode + const dm = led.displayMode(); + if (dm != DisplayMode.Greyscale) + led.setDisplayMode(DisplayMode.Greyscale); + // render sprites + const now = input.runningTime(); + _img.clear(); + for (let i = 0; i < _sprites.length; i++) { + _sprites[i]._plot(now); + } + _img.plotImage(0); + } + + /** + * Gets an invalid sprite; used to initialize locals. + */ + //% weight=0 + export function invalidSprite(): LedSprite { + return null; + } + +} + diff --git a/pxt_modules/core/gc.cpp b/pxt_modules/core/gc.cpp new file mode 100644 index 0000000..63dd001 --- /dev/null +++ b/pxt_modules/core/gc.cpp @@ -0,0 +1,713 @@ +#include "pxtbase.h" + +#ifndef GC_BLOCK_SIZE +#define GC_BLOCK_SIZE (1024 * 16) +#endif + +#ifndef GC_MAX_ALLOC_SIZE +#define GC_MAX_ALLOC_SIZE (GC_BLOCK_SIZE - 16) +#endif + +#ifndef GC_ALLOC_BLOCK +#define GC_ALLOC_BLOCK xmalloc +#endif + +#define FREE_MASK 0x80000000 +#define ARRAY_MASK 0x40000000 +#define PERMA_MASK 0x20000000 +#define MARKED_MASK 0x00000001 +#define ANY_MARKED_MASK 0x00000003 + +// the bit operations should be faster than loading large constants +#define IS_FREE(vt) ((uint32_t)(vt) >> 31) +#define IS_ARRAY(vt) (((uint32_t)(vt) >> 30) & 1) +#define IS_PERMA(vt) (((uint32_t)(vt) >> 29) & 1) +#define IS_MARKED(vt) ((uint32_t)(vt)&MARKED_MASK) +#define IS_VAR_BLOCK(vt) ((uint32_t)(vt) >> 30) + +#define IS_LIVE(vt) (IS_MARKED(vt) || (((uint32_t)(vt) >> 28) == 0x6)) + +#define VAR_BLOCK_WORDS(vt) (((vt) << 12) >> (12 + 2)) + +//#define PXT_GC_DEBUG 1 +#ifndef PXT_GC_CHECK +#define PXT_GC_CHECKS 1 +#endif +//#define PXT_GC_STRESS 1 + +#define MARK(v) \ + do { \ + GC_CHECK(inGCArea(v), 47); \ + *(uint32_t *)(v) |= MARKED_MASK; \ + } while (0) + +#ifdef PXT_GC_DEBUG +#define LOG DMESG +#define VLOG DMESG +#define VVLOG DMESG +#else +#define LOG NOLOG +#define VLOG NOLOG +#define VVLOG NOLOG +#endif + +#ifdef PXT_GC_CHECKS +#define GC_CHECK(cond, code) \ + if (!(cond)) \ + oops(code) +#else +#define GC_CHECK(cond, code) ((void)0) +#endif + +namespace pxt { + +//% +void popThreadContext(ThreadContext *ctx); +//% +ThreadContext *pushThreadContext(void *sp, void *endSP); + +unsigned RefRecord_gcsize(RefRecord *r) { + VTable *tbl = getVTable(r); + return tbl->numbytes >> 2; +} + +#ifndef PXT_GC +// dummies, to make the linker happy +void popThreadContext(ThreadContext *ctx) {} +ThreadContext *pushThreadContext(void *sp, void *endSP) { + return NULL; +} +void RefRecord_scan(RefRecord *r) {} +#else + +#ifdef PXT_GC_THREAD_LIST +ThreadContext *threadContexts; +#endif + +#define IN_GC_ALLOC 1 +#define IN_GC_COLLECT 2 +#define IN_GC_FREEZE 4 + +static TValue *tempRoot; +static uint8_t tempRootLen; +uint8_t inGC; + +void popThreadContext(ThreadContext *ctx) { + VLOG("pop: %p", ctx); + + if (!ctx) + return; + + auto n = ctx->stack.next; + if (n) { + VLOG("seg %p", n); + ctx->stack.top = n->top; + ctx->stack.bottom = n->bottom; + ctx->stack.next = n->next; + app_free(n); + } else { +#ifdef PXT_GC_THREAD_LIST + if (ctx->next) + ctx->next->prev = ctx->prev; + if (ctx->prev) + ctx->prev->next = ctx->next; + else { + if (threadContexts != ctx) + oops(41); + threadContexts = ctx->next; + if (threadContexts) + threadContexts->prev = NULL; + } +#endif + app_free(ctx); + setThreadContext(NULL); + } +} + +#define ALLOC(tp) (tp *)app_alloc(sizeof(tp)) + +ThreadContext *pushThreadContext(void *sp, void *endSP) { + if (PXT_IN_ISR()) + target_panic(PANIC_CALLED_FROM_ISR); + + auto curr = getThreadContext(); + tempRoot = (TValue *)endSP; + tempRootLen = (uint32_t *)sp - (uint32_t *)endSP; + if (curr) { +#ifdef PXT_GC_THREAD_LIST +#ifdef PXT_GC_DEBUG + auto ok = false; + for (auto p = threadContexts; p; p = p->next) + if (p == curr) { + ok = true; + break; + } + if (!ok) + oops(49); +#endif +#endif + auto seg = ALLOC(StackSegment); + VLOG("stack %p / %p", seg, curr); + seg->top = curr->stack.top; + seg->bottom = curr->stack.bottom; + seg->next = curr->stack.next; + curr->stack.next = seg; + } else { + curr = ALLOC(ThreadContext); + LOG("push: %p", curr); + curr->globals = globals; + curr->stack.next = NULL; + +#ifdef PXT_GC_THREAD_LIST + curr->next = threadContexts; + curr->prev = NULL; + if (curr->next) + curr->next->prev = curr; + threadContexts = curr; +#endif + setThreadContext(curr); + } + tempRootLen = 0; + curr->stack.bottom = sp; + curr->stack.top = NULL; + return curr; +} + +class RefBlock : public RefObject { + public: + RefBlock *nextFree; +}; + +struct GCBlock { + GCBlock *next; + uint32_t blockSize; + RefObject data[0]; +}; + +static LLSegment gcRoots; +LLSegment workQueue; // (ab)used by consString making +static GCBlock *firstBlock; +static RefBlock *firstFree; +static uint8_t *midPtr; + +static bool inGCArea(void *ptr) { + for (auto block = firstBlock; block; block = block->next) { + if ((void *)block->data <= ptr && ptr < (void *)((uint8_t *)block->data + block->blockSize)) + return true; + } + return false; +} + +#define NO_MAGIC(vt) ((VTable *)vt)->magic != VTABLE_MAGIC +#define VT(p) (*(uint32_t *)(p)) +#define SKIP_PROCESSING(p) \ + (isReadOnly(p) || (VT(p) & (ANY_MARKED_MASK | ARRAY_MASK)) || NO_MAGIC(VT(p))) + +void gcMarkArray(void *data) { + auto segBl = (uint32_t *)data - 1; + GC_CHECK(!IS_MARKED(VT(segBl)), 47); + MARK(segBl); +} + +void gcScan(TValue v) { + if (SKIP_PROCESSING(v)) + return; + MARK(v); + workQueue.push(v); +} + +void gcScanMany(TValue *data, unsigned len) { + // VLOG("scan: %p %d", data, len); + for (unsigned i = 0; i < len; ++i) { + auto v = data[i]; + // VLOG("psh: %p %d %d", v, isReadOnly(v), (*(uint32_t *)v & 1)); + if (SKIP_PROCESSING(v)) + continue; + MARK(v); + workQueue.push(v); + } +} + +void gcScanSegment(Segment &seg) { + auto data = seg.getData(); + if (!data) + return; + gcMarkArray(data); + gcScanMany(data, seg.getLength()); +} + +#define getScanMethod(vt) ((RefObjectMethod)(((VTable *)(vt))->methods[2])) +#define getSizeMethod(vt) ((RefObjectSizeMethod)(((VTable *)(vt))->methods[3])) + +void gcProcess(TValue v) { + if (SKIP_PROCESSING(v)) + return; + VVLOG("gcProcess: %p", v); + MARK(v); + auto scan = getScanMethod(VT(v) & ~ANY_MARKED_MASK); + if (scan) + scan((RefObject *)v); + while (workQueue.getLength()) { + auto curr = (RefObject *)workQueue.pop(); + VVLOG(" - %p", curr); + scan = getScanMethod(curr->vtable & ~ANY_MARKED_MASK); + if (scan) + scan(curr); + } +} + +static void mark(int flags) { +#ifdef PXT_GC_DEBUG + flags |= 2; +#endif + auto data = gcRoots.getData(); + auto len = gcRoots.getLength(); + if (flags & 2) { + DMESG("--MARK"); + DMESG("RP:%p/%d", data, len); + } + for (unsigned i = 0; i < len; ++i) { + auto d = data[i]; + if ((uint32_t)d & 1) { + d = *(TValue *)((uint32_t)d & ~1); + } + gcProcess(d); + } + +#ifdef PXT_GC_THREAD_LIST + for (auto ctx = threadContexts; ctx; ctx = ctx->next) { + for (auto seg = &ctx->stack; seg; seg = seg->next) { + auto ptr = (TValue *)threadAddressFor(ctx, seg->top); + auto end = (TValue *)threadAddressFor(ctx, seg->bottom); + VLOG("mark: %p - %p", ptr, end); + while (ptr < end) { + gcProcess(*ptr++); + } + } + } +#else + gcProcessStacks(flags); +#endif + + if (globals) { + auto nonPtrs = bytecode[21]; + len = getNumGlobals() - nonPtrs; + data = globals + nonPtrs; + if (flags & 2) + DMESG("RG:%p/%d", data, len); + VLOG("globals: %p %d", data, len); + for (unsigned i = 0; i < len; ++i) { + gcProcess(*data++); + } + } + + data = tempRoot; + len = tempRootLen; + for (unsigned i = 0; i < len; ++i) { + gcProcess(*data++); + } +} + +static uint32_t getObjectSize(RefObject *o) { + auto vt = o->vtable & ~ANY_MARKED_MASK; + uint32_t r; + GC_CHECK(vt != 0, 49); + if (IS_VAR_BLOCK(vt)) { + r = VAR_BLOCK_WORDS(vt); + } else { + auto sz = getSizeMethod(vt); + // GC_CHECK(0x2000 <= (intptr_t)sz && (intptr_t)sz <= 0x100000, 47); + r = sz(o); + } + GC_CHECK(1 <= r && (r <= (GC_MAX_ALLOC_SIZE >> 2) || IS_FREE(vt)), 48); + return r; +} + +__attribute__((noinline)) static void allocateBlock() { + auto sz = GC_BLOCK_SIZE; + void *dummy = NULL; +#ifdef GC_GET_HEAP_SIZE + if (firstBlock) { + gc(2); // dump roots + target_panic(PANIC_GC_OOM); + } + auto lowMem = getConfig(CFG_LOW_MEM_SIMULATION_KB, 0); + auto sysHeapSize = getConfig(CFG_SYSTEM_HEAP_BYTES, 4 * 1024); + auto heapSize = GC_GET_HEAP_SIZE(); + sz = heapSize - sysHeapSize; + if (lowMem) { + auto memIncrement = 32 * 1024; + // get the memory size - assume it's increment of 32k, + // and we don't statically allocate more than 32k + auto memSize = ((heapSize + memIncrement - 1) / memIncrement) * memIncrement; + int fillerSize = memSize - lowMem * 1024; + if (fillerSize > 0) { + dummy = GC_ALLOC_BLOCK(fillerSize); + sz -= fillerSize; + } + } +#endif + auto curr = (GCBlock *)GC_ALLOC_BLOCK(sz); + curr->blockSize = sz - sizeof(GCBlock); + LOG("GC alloc: %p", curr); + GC_CHECK((curr->blockSize & 3) == 0, 40); + curr->data[0].vtable = FREE_MASK | curr->blockSize; + ((RefBlock *)curr->data)[0].nextFree = firstFree; + firstFree = (RefBlock *)curr->data; + // make sure reference to allocated block is stored somewhere, otherwise + // GCC optimizes out the call to GC_ALLOC_BLOCK + curr->data[4].vtable = (uint32_t)dummy; + + // blocks need to be sorted by address for midPtr to work + if (!firstBlock || curr < firstBlock) { + curr->next = firstBlock; + firstBlock = curr; + } else { + for (auto p = firstBlock; p; p = p->next) { + if (!p->next || curr < p->next) { + curr->next = p->next; + p->next = curr; + break; + } + } + } + midPtr = (uint8_t *)curr->data + curr->blockSize / 4; +} + +static void sweep(int flags) { + RefBlock *prevFreePtr = NULL; + uint32_t freeSize = 0; + uint32_t totalSize = 0; + firstFree = NULL; + + for (auto h = firstBlock; h; h = h->next) { + auto d = h->data; + auto words = h->blockSize >> 2; + auto end = d + words; + totalSize += words; + VLOG("sweep: %p - %p", d, end); + while (d < end) { + if (IS_LIVE(d->vtable)) { + VVLOG("Live %p", d); + d->vtable &= ~MARKED_MASK; + d += getObjectSize(d); + } else { + auto start = (RefBlock *)d; + while (d < end) { + if (IS_FREE(d->vtable)) { + VVLOG("Free %p", d); + } else if (IS_LIVE(d->vtable)) { + break; + } else if (IS_ARRAY(d->vtable)) { + VVLOG("Dead Arr %p", d); + } else { + VVLOG("Dead Obj %p", d); + GC_CHECK(((VTable *)d->vtable)->magic == VTABLE_MAGIC, 41); + d->destroyVT(); + } + d += getObjectSize(d); + } + auto sz = d - (RefObject *)start; + freeSize += sz; +#ifdef PXT_GC_CHECKS + memset(start, 0xff, sz << 2); +#endif + start->vtable = (sz << 2) | FREE_MASK; + if (sz > 1) { + start->nextFree = NULL; + if (!prevFreePtr) { + firstFree = start; + } else { + prevFreePtr->nextFree = start; + } + prevFreePtr = start; + } + } + } + } + + if (midPtr) { + uint32_t currFree = 0; + auto limit = freeSize >> 2; + for (auto p = firstFree; p; p = p->nextFree) { + currFree += VAR_BLOCK_WORDS(p->vtable); + if (currFree > limit) { + midPtr = (uint8_t *)p + ((currFree - limit) << 2); + break; + } + } + } + + // convert to bytes + freeSize <<= 2; + totalSize <<= 2; + + if (flags & 1) + DMESG("GC %d/%d free", freeSize, totalSize); + else + LOG("GC %d/%d free", freeSize, totalSize); + +#ifndef GC_GET_HEAP_SIZE + // if the heap is 90% full, allocate a new block + if (freeSize * 10 <= totalSize) { + allocateBlock(); + } +#endif +} + +void gc(int flags) { + startPerfCounter(PerfCounters::GC); + GC_CHECK(!(inGC & IN_GC_COLLECT), 40); + inGC |= IN_GC_COLLECT; + VLOG("GC mark"); + mark(flags); + VLOG("GC sweep"); + sweep(flags); + VLOG("GC done"); + stopPerfCounter(PerfCounters::GC); + inGC &= ~IN_GC_COLLECT; +} + +#ifdef GC_GET_HEAP_SIZE +extern "C" void free(void *ptr) { + if (!ptr) + return; + if (inGCArea(ptr)) + app_free(ptr); + else + xfree(ptr); +} + +extern "C" void *malloc(size_t sz) { + if (PXT_IN_ISR() || inGC) + return xmalloc(sz); + else + return app_alloc(sz); +} + +extern "C" void *realloc(void *ptr, size_t size) { + if (inGCArea(ptr)) { + void *mem = malloc(size); + + if (ptr != NULL && mem != NULL) { + auto r = (uint32_t *)ptr; + GC_CHECK((r[-1] >> 29) == 3, 41); + size_t blockSize = VAR_BLOCK_WORDS(r[-1]); + memcpy(mem, ptr, min(blockSize * sizeof(void *), size)); + free(ptr); + } + + return mem; + } else { + return device_realloc(ptr, size); + } +} +#endif + +void *gcAllocateArray(int numbytes) { + numbytes = (numbytes + 3) & ~3; + numbytes += 4; + auto r = (uint32_t *)gcAllocate(numbytes); + *r = ARRAY_MASK | numbytes; + return r + 1; +} + +void *app_alloc(int numbytes) { + if (!numbytes) + return NULL; + + // gc(0); + auto r = (uint32_t *)gcAllocateArray(numbytes); + r[-1] |= PERMA_MASK; + return r; +} + +void *app_free(void *ptr) { + auto r = (uint32_t *)ptr; + GC_CHECK((r[-1] >> 29) == 3, 41); + r[-1] |= FREE_MASK; + return r; +} + +void gcFreeze() { + inGC |= IN_GC_FREEZE; +} + +void *gcAllocate(int numbytes) { + size_t numwords = (numbytes + 3) >> 2; + + if (numbytes > GC_MAX_ALLOC_SIZE) + target_panic(PANIC_GC_TOO_BIG_ALLOCATION); + + if (PXT_IN_ISR() || (inGC & IN_GC_ALLOC)) + target_panic(PANIC_CALLED_FROM_ISR); + + inGC |= IN_GC_ALLOC; + +#ifdef PXT_GC_CHECKS + { + auto curr = getThreadContext(); + if (curr && !curr->stack.top) + oops(46); + } +#endif + +#ifdef PXT_GC_STRESS + gc(0); +#endif + + for (int i = 0;; ++i) { + RefBlock *prev = NULL; + for (auto p = firstFree; p; p = p->nextFree) { + VVLOG("p=%p", p); + if (i == 0 && (uint8_t *)p > midPtr) + break; + GC_CHECK(!isReadOnly((TValue)p), 49); + auto vt = p->vtable; + if (!IS_FREE(vt)) + oops(43); + int left = VAR_BLOCK_WORDS(vt) - numwords; + if (left >= 0) { + auto nf = (RefBlock *)((void **)p + numwords); + // VLOG("nf=%p", nf); + auto nextFree = p->nextFree; // p and nf can overlap when allocating 4 bytes + if (left) + nf->vtable = (left << 2) | FREE_MASK; + if (left >= 2) { + nf->nextFree = nextFree; + } else { + nf = p->nextFree; + } + if (prev) + prev->nextFree = nf; + else + firstFree = nf; + p->vtable = 0; + GC_CHECK(!nf || !nf->nextFree || ((uint32_t)nf->nextFree) >> 20, 48); + VVLOG("GC=>%p %d %p", p, numwords, nf->nextFree); + inGC &= ~IN_GC_ALLOC; + return p; + } + prev = p; + } + + // we didn't find anything, try GC + if (i == 0) + gc(0); + // GC didn't help, try new block + else if (i == 1) + allocateBlock(); + else + oops(44); + } +} + +static void removePtr(TValue v) { + int len = gcRoots.getLength(); + auto data = gcRoots.getData(); + // scan from the back, as this is often used as a stack + for (int i = len - 1; i >= 0; --i) { + if (data[i] == v) { + if (i == len - 1) { + gcRoots.pop(); + } else { + data[i] = gcRoots.pop(); + } + return; + } + } + oops(40); +} + +void registerGC(TValue *root, int numwords) { + if (!numwords) + return; + + if (numwords > 1) { + while (numwords-- > 0) { + registerGC(root++, 1); + } + return; + } + + gcRoots.push((TValue)((uint32_t)root | 1)); +} + +void unregisterGC(TValue *root, int numwords) { + if (!numwords) + return; + if (numwords > 1) { + while (numwords-- > 0) { + unregisterGC(root++, 1); + } + return; + } + + removePtr((TValue)((uint32_t)root | 1)); +} + +void registerGCPtr(TValue ptr) { + if (isReadOnly(ptr)) + return; + gcRoots.push(ptr); +} + +void unregisterGCPtr(TValue ptr) { + if (isReadOnly(ptr)) + return; + removePtr(ptr); +} + +void RefImage::scan(RefImage *t) { + gcScan((TValue)t->buffer()); +} + +void RefCollection::scan(RefCollection *t) { + gcScanSegment(t->head); +} + +void RefAction::scan(RefAction *t) { + gcScanMany(t->fields, t->len); +} + +void RefRefLocal::scan(RefRefLocal *t) { + gcScan(t->v); +} + +void RefMap::scan(RefMap *t) { + gcScanSegment(t->keys); + gcScanSegment(t->values); +} + +void RefRecord_scan(RefRecord *r) { + VTable *tbl = getVTable(r); + gcScanMany(r->fields, (tbl->numbytes - sizeof(RefRecord)) >> 2); +} + +#define SIZE(off) (sizeof(*t) + (off) + 3) >> 2 + +unsigned RefImage::gcsize(RefImage *t) { + if (t->hasBuffer()) + return SIZE(0); + return SIZE(t->length()); +} + +unsigned RefCollection::gcsize(RefCollection *t) { + return SIZE(0); +} + +unsigned RefAction::gcsize(RefAction *t) { + return SIZE(t->len << 2); +} + +unsigned RefRefLocal::gcsize(RefRefLocal *t) { + return SIZE(0); +} + +unsigned RefMap::gcsize(RefMap *t) { + return SIZE(0); +} + +#endif + +} // namespace pxt diff --git a/pxt_modules/core/gestures.jres b/pxt_modules/core/gestures.jres new file mode 100644 index 0000000..05a112f --- /dev/null +++ b/pxt_modules/core/gestures.jres @@ -0,0 +1,39 @@ +{ + "*": { + "namespace": "gestures", + "dataEncoding": "base64" + }, + "shake": { + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAAsSAAALEgHS3X78AAAEe0lEQVR4nO2a0XHjNhCGP2bybnZgpgLzKjBTwTkVRKkgSgXhVRC5Assd+CoIXUHkCkJXELmCzQMWIQSREgjSB4/CfwYDAlgSi5/A7gJkJiL8n/FdagVSYyEgtQKpsRCQWoHUWAhIrUBqLASkViA1FgJSKzA3MigzKELlL4qADFZAAzyF3nNRBCiugJsM6hDh7NJ2gxlsgZ+1+INAe1J+JgIqTMfXWn7BdLzTZK/fHRnk2t8V8ChmWQzLz0BAgRncFfCqnd8OyD5re4tZq/Z6VmSwBv7Q4sEsyKA4mBUiMjWtxWDr1RciUolIrW2tDKNRmVrvKabqhcheC1stV4jsENl7cpMJ2OoghpTOReRJB+kSs48gJh9BwEYLey0XjkA1JwE7HURfW+UMsHYIsPeslIgx2CsxGzGzr5cYREp/wIi0Wq5lJgJyVeqpp23jKV5FDjgUjXhE+ANGZKtlOxsnxwGl5juvbgf86snWwAPGWL4HbjkOgBrNK81bzQsrMJUA+2Db0Rr4C7jpkbWe4QXjDV4n9t0H3/u0mheaN5pbd833Ezu0M6DVhw+5P4CvGIJar77CKFjodUn8LHnzyg3wO86AfUwloNJObRwwhEe6gKTEBCtWwaZHPseQtT7zXB99z3LRAl/ciimBUAH8HSD3qrI5Zo36s8QGTw3HUWOJWVKh+IKzB9Bd4QpAhvYGZ6z8qXQXaJ1XKl87dad8v20veu47h//8e2iaYgSrQLnWk78HNmfuuXZktiN0Gr3fmGIDyvMivfDdo4tHzFJ4AD5rXRv43BdgP1aZKTPglMV3YYk699YB7hw56yaLwH6idpuxBPhv/yvwG+Yt+KjpDOCPmLfcJwfG4lurb4moAnWK226PNRqa7A5QxMT1tr4cME476d8slWKMaS3dhqmRznDmct5gWpQxY4m1Ae4MaJzrnH7cYFzmI90hiZv6zvByffZgEOMhagbExgE7DsPdXzAGaEO4wtAFUb7/v8P479Ag6JnwpXKAGAJy4J+YzmbCC8d7jXtM1DgaMUYw1v1NxRvwSfv/yWtrYh8aQ0AV29lE2KUCxzYj+sB1kIAMGk3+G081A0q6mKB26t+YcrBq3QEijaZSDo+KVp7reK8TnVDsvHLfaVTUXuBWk33Dz5oXjkzB+53ohMI3gJO+N7gE9A3YL/ttHwHNlJv7bIB7WAHp1nwoZpsBjeaV9+Cb7JCUoTg+BaJ2gC5cAvwBN07bnXNdYQKPZ47P4L41pn9vlM4L5L7lR+TJP0fvSbmYk5i1mG8BjXw7T7EOsfSn0kEonJkAYw9sBHb6w8GDNp/91OyhoDvptdehZwih+MTEWXB2L5AZQoI+NQeiYB5i3hjefYbj3BRBpHYqRh86jkiFHH5N9gMeH/Uc/QbtBjMz9a8xx1SlTLS8I2FD4JLOJW8Z8R/QKYQSUAF/avFeIreeHxFBu0ExLvEes+5mYf6jYNSByNHvJReAi/tLbCwu8T/BUVgISK1AaiwEpFYgNRYCUiuQGgsBqRVIjYWA1Aqkxr8PLUpMvtN12gAAAABJRU5ErkJggg==" + }, + "freefall": { + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAAsSAAALEgHS3X78AAADqElEQVR4nO2b4XWbMBSFP3r6P2wQOkGcCUonqDtB0wnqbuBO0GSCJhvYG5AJiiconaD2BK8/JGpZAVtIYJGEew7HRAi9x0W670kiiYjwmvEmtgOxMREQ24HYmAiI7YCJBMoEVme1OaYokIAACCTnsjmqHtCEBIoEloO1P/YeMHSvGH0PGBoTAbEMJyAJlLHs//cjlga4jvdJAwbGREBsB2JjIiC2A7ExERDR9hr441DvDngcyonRzwWGxqsfAm9jO2DhOzA7p8G+hkAO3AOX+u8NUKFy/dI4Hx36ICBDPdwFStQq4H1L3Ud9vQIK4zwa+iBgAfwAHoAbozzTR278XtKMaMT0QcA98Bl4R7PTqa6TsicjQy1+ruhGTAlsQx0+gIiEHqWIVC3Xcn1NRGSpyzLjnhsR2Uo3bEWkEJFbEVloG6mv/6EPn2qnVg3Xbi3Hc88HdkUhHkSEEpBr40ujbCbqDTc5ODSKBh+PHqGJUK5/C/27AH4BVw1168iwQY1tlzS4K9qiTytCE6E6aalQJBxzYI0iqLLKcw4jxgwVUn2w63pDaBQwFfmY02aInKEiAux7jo0URdbiRLs21sC8Q/0gDcgcx2UdIVJp1oFKly9FZC5KQ0w96QJTiwYXwbmjUze6/tJ66GOoRBFs33cK+RF/exfB3LFeZdW/A25P3HNp1Lnv4FPn+UaICPrO2r4eufaA0oWfwEddVjm2u8EjSwzpAa4hpybq1FsHJWB1vTpMZo52vGabvgTYb38NfEO9BRtLlKqvgA+ot9xUD5Ti16pfE5E7+uQ33e4qGvpYGMJTGuVtql0aooZVf66FbiUqGhSyF85UTgtmDTN6OB++GmD2gMI4T2nGFfAb9fbLhqPps5hUt902U7Th1QN8E6GSw3T3C0qAbnF3GFTm1rRqNEclTq5J0CPuQ+UAPgSkwF8fYz1hw9O5xh0qa+wMHxE866KlgR1wre1/sq4Vvo36EJD7GgtEPVTgqWZ4L7g+px4wY58TLI3yHQHrhz5RIPc1FogLVCSxNaAIabRrD8jwn6v3BVsAg/YbfAgYG4qQm1/C3uBZe0BBex4fA14zQBO+YbDes++8BtczgvcbfaLAlsOsK0WFqDpM1efnEMtgAob8QCLjcG8ww2PZ+gSuCSQhxhciGf0Qs6N99umMGB9IVOz3EUxkHBIzo3mDpYbLCtNJjOoboRbY2gJqobSXf615DgQMipeQCAVhIiC2A7ExERDbgdh49QT8A9YP5MUcc2wYAAAAAElFTkSuQmCC" + }, + "frontsideup": { + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAAsSAAALEgHS3X78AAADSUlEQVR4nO2a63XaQBCFP+Xkv9WB1QG4AquD0EFwBy6BElwC7oBUEFxBoAKLDnAFkx+jjVZCbyQNOeieswehx+7cuzOzDykQEe4Z36wNsMYsgLUB1pgFsDbAGqYCBLAJYGNqg9UwGMAS+JP+fRI4WNhh6QHbiuNJYSJA6vYL79TCKhQmD4EAIuCz4vLkoWDhAduaa29TGeEwqQABvALPNbc8p/dMBrNRACAAARAIrGy4+4nQd8vGLXve4e49wHoqLC4PWOHuPWDOAdYGWGPOAZaN3wLmHGBtgDXmHGDZ+C3g7nPAWAKE6Lp+DTym577Q3R5XEmA/UvutMcZ+wBIl9gC8k5GMgDj9ffTuP5GJkZAJNAmGFsCRByVbR+QV3QjdoaIsUdEcjuQFcV4zKIYUoIl8mJ5fpeUBeCHbI1yhIXNOy5q8IA4fqBAJmdckfY0eSoAq8hFKLAZ+FJ75hfb+qnDtRD5E2sDPL4l3fG56cAgBiuRDMtKL0iemgxNm75UcrhXAT3hHtMfL3LZo1I7MfR2itD5Xmurpg4th9xoBfPJt8IUmvi35EQHyrusQkokRoV7VNTSK7YcXZ0WkT1mKyFna4yAiYVq2Le7dichGRFYiEnntvnZo08dZ1OYLLlOQT0SJIyJ77/y68L8OK6/9Q4e2RWrISw8Bysg3ibHxnm+LveR729URtmivaFsleekoQJH8oVB5Vc/svHtW6f+kheEOiWRh0BQ+xTpqyUsHAcp6PvauN8XmTvJu7EosGgpvor1eJL4R7fVI2oeLSEvyItJqFKjL9h90H7JOXE5vq6bMS3Tk+Nmh/i+ap+H/0CRA16HuGhzJz9z6zAU6kYd6AaYk3xZuZgflr9mf6LiSrNoPCNHZ2i2Rf0cXSA5n8va90GMZXbYlFqI9f82sawy4r0eWXHaOv6rshLIQiIHffSozQm/yUO4BBzS7/w+4ijw0jwIxuhCJ0uOxVml9cDV56LcaLK7Sxly+VmEQ8jDsllhEfpkbUf9FWF8MRh6m+UosIr/REdF/p2hQ8mD7mZwfQjGX2+U+TugcYD+0EabfCVYgJgsh0DF/tPcEtyjApLj7l6OzANYGWGMWwNoAa8wCWBtgjVkAawOs8ReItTjrXj7vnAAAAABJRU5ErkJggg==" + }, + "backsideup": { + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAAsSAAALEgHS3X78AAACbUlEQVR4nO2a75GbMBDFf2TyPXRwdHCkgqOEdJCkg5TgElyCS0gJTgVxKojdwV0Fmw9CA7H5Zwx6HOjNMCNAg/Y97a6EpMTM2DI+qA1QIwqgNkCNKIDaADWkAiSwS2AntUE1DCaQA7/L288GJ4UdSg84tJSDQiJA6fbPtUfPqlAIHgIJZMDfltfBQ0HhAYeOd/tQRngEFSCBH8BLR5WXsk4wyEYBgAQMwCBR2bD5idBHZePKnvfYvAeop8Lm84AKm/eAmAPUBqgRc4Cy8SUg5gC1AWrEHKBsfAnYfA6YS4AU91//DXgqn73hVnv8dQaOM7U/GHOsB+Q4Yp8G1r9QiXGmEigIphbgXvJd+MP/gvjypJhSgCnJX+MN+MJtyKTldR774alGgbnJFzSTP+JWmA34OerrZvbolZvZq82HfUObqZmdanVeSzua7EvNbGdmRdP7R0Ngzp6v40KVCzJcOPg2vYc05QfvJX4T5nbY7eldZc8PQVfPY2aHq7o3dcbmgFA934c97SPDAfhalr2X3GBMCCyFvEd9gnXGhUhB5fZdIXK3AEsj34dO8nDfMLg68jBcgFWSh2ECrJY89AuwavLQLcDqyUO7ACluHH0v5MGtP9z9t9gkwPX08T3gOyMPWjUJkLMR8tAswAn4NfaDgfEQeeifCRa4qWVWlnOWkxceJg/j/gVSnBA5ThhfDinMJORh2iWxjMpTfLnrRNhYTEYewpwSy6i8xHvN2CQ7KXnQHpOrh1BRlp9a6l5wewzHqY2QnhNsQUEVQuAWO2fbJ1iiAEGx+c3RKIDaADWiAGoD1IgCqA1QIwqgNkCNf+aBYPgHiIEjAAAAAElFTkSuQmCC" + }, + "impact3g": { + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAAsSAAALEgHS3X78AAAEWklEQVR4nO2a/5XiNhDHP87L/0sqWKeCdQdxB6GDkArCVXCkA0rwdcBWcN4Kju3A2wFUMPljpEMI/5AtEXMc3/f8hKVhNJoZjWYEmYjwM+OXuQWYGw8FzC3A3HgoYG4B5sZDAXMLMDceCphbgGsig0UGVR/Nr/+TLHOhAhZ9BHfrARksgT+H6O5SARnkDLi+xV0qAF38Uwjh3SkggzXwRyj9XSkggwLYjPnOXSmAEa5vcdMKyGCZwSqQdgO8tAzlvV8UkZt9ECnMS41I0UNX9jHqmyO79SuxDFwB/wW2AgdnfAHsgecuHgJZ5wRzWznAC2qvs0GkdMa3Q0z6hm86BhjsTXs07TPwNYOdyfb+8ehfR3Gf28IBHrA0L4Wxft8XGkQWd+kBom0BvHfQHYGlGx9CkEoBOVCjAetgPm/RrKxkoCLrg0CDcX+zuJJ2N1/L5XYJmCCNq+7V06QRkVpEDnKJgxnbishanEAWsA12LX2V07H1xs4CZx/vFPcBBZqAvKJByWJhxuxTmtbP0z9QK9emtZ9dVP6kAqtMaUtRT5uGBNZfGQt3WXRprL8077mIVKJWrVs8xcJ608bMMcZj/KOzL4mKVsDWCLzw+hfOmJiFL8zCxYy1bZUhuIpZGr7+ovzc4IBuu6soYG8et68wglocRC3o9qXEylvUpkPYHZ6hUihARF3avm9aBJxi6TFofLnQ+qBqEfiAs51ia4ES+Ap8AnbmaavIQI+mCj2qcs6D5KgStgOt+X6mMu68OY5o8NzHngKFaXN0YV0LeUXL2q4kxT8xlj282vDhd5giaQ18Nl1HjJFEW6WL9IAdwzev76gVQGt2q7SGy+PPIqffm3x8wbk3MFavHBl3cnm0Ki63yKgnJKjZ468OoLXR3Z4iobHje4RHZG1Ogc6jz31iFr8IFM6nLQMWZpWwHaBzeU5aR0wtUI6gdWuBivb9/YZeeLi8dy10bahHyHKGGAUUwyTf6Rp0gdB9c2ODn4uQIuptmKQbqTzgiFqvrVTdmHaJBquucvaJU9CrTLsKkGM/TNKNmFPgwMmVfzPvBfCthfYsShsUaLS3R5+1dmWeLl4+/ibwZ7A2TFWAK9yRk/B9Qn+ge7pBrVYP8K8JywV+5/wIHYWpiZC7/584ZYGbnu88c3l/55bCNkkqgL8C5TgSsXiY7gFbLhdzbbyhnvbi9ZUxTKcGwahJJ+ALpwsVN+rXsYynKiA0RU0FNx9w64k6lvGUGFDGTjoBG04Xom7tEXUEwjQFhCZAKfGClt0uPhh5Bd6GKVugjJ00EeoUTKYoYPIdf2JEuz9MU0CdYuIESKKAmDxgRZqrrKno/sl7DJOIWgA0l8/RuGA/B/9BKQLRCZBF7J1gQ/svOTnXVUwS94fr/VW2oVsx7uVnzrSkKpkCbuUvMn5pnNOtmHcS5iK3ooAuuIoBTXwqEiRAFreugKvjR/iHyFXxUMDcAsyNhwLmFmBuPBQwtwBz4z9jSdC1TZEC4AAAAABJRU5ErkJggg==" + }, + "impact6g": { + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAAsSAAALEgHS3X78AAAEjElEQVR4nO2a0ZGkNhCGP1x+XxzBkcGNI7AcgdcR3GRgQsAReJwBm8FkYDYDLgKzEdxMBO0HtQotIwZGaI6hvH8VBUhNq/UjtboRmYjwf8YPaxuwNj4IWNuAtfFBwNoGrI3NEZBBmVLf5ggAygx2qZRtigDt+CfApNK5KQKAvZ5NKoXZliLBDE7AE3AWyFPo3MwIyOAZ23mAp1R+YDMEYAnwYVIo3TIBw/sobIKAzDq/p0HxLyl0b4IARt52lmAaPDwBmfX2v41Um6X6VyMggyKbt5Rdm+tmqR1rjoAc+JZBPTGU91fqZvuBDEwwjxCR1Q5EGq+gQ2SPSO7VF4OHuoAiE9BrECkRqRFpvcpDQHZVAkyg4qSG77QTft1e6/2yWssPg86G9OYBG9YjQA3otBPHCeFO5afkxo4qVPwIq0AF5GKd3a/A24hcrecmoo03se1cYu0RoG+18a5zRKqx4YudGrc28nyl7SSdyEWklh6N3ldindTF3BsYUTGQwTpA5yQPg7qhHzjp1Cix/sCva661nSodroEvwBlogQL74cKHq2uBzrs+uXhAbLr7DpoFtmKfcWUH7DON1rVenbPF4We//kJ/IgIEO3d39J3I9d4dLqAZxvSjxNxqRGaJ/9crepHrcUSSKWB02Jcj9TsRaaX3wrleu2kyhpPKHERkL4H1PjCVDiG/MfHMYgJKNThkYOV1yNUf9L4Wu7Tdik6JqZSYndcZP1D6bgS4t+iXFWqkDyN2JNwDpXZmx3sH2UzZn4IA90bc/V7s8B0iVJYS/jLpk3AR/vrHj7c6mgFyrLc/6nXNeOoK8IL13IXeG8IrRgx2QCPQqjNsgM/AH5ldKergU9fYmXEYZb+eeMOt2GkxpasU+8ZiRstwaOf0ucEJz1cM5BYRUM0w7CS9M6rETpdGRI56/yyXxg0Dqym0I53L6XOHjjskQ80M4yqVPUwJSr9cOkPnOs1QmltgI0x/ZTgG5BYRMGeomoHs84yO1dI71DnYex3KsSHxUQnYY9Pu4JK4pPPFTOMcAQ7diFw36PAtbQTn95xjSTpsZsoVen7R85jH/0Qftp71POeboQulo7CEAH9r6gz8DXwNyJXe+U/g9YpO942v1vOczY/ozgOLpoDvAN0wz0eGeC2Xc7DQ5yqxzqmRPsR1uub4GCcfdSzJBv0Hf6LP3sYUnrEBU8t0xleo7OcZdvyuslGIJcAA/3j3r9hhWzLPaIdhKnxS3f5O8BR88m9GLAEl8Fdso5H4iu2ovxfwRu9koxDrBJP9ozMTr9qmoV9NYKkDJJ4As7ThG9F4191IeRRiskGXAX5PlPTfGv3trcUjIMYHGN47wDWRLVUQMwXM0kYTIRR03YxH2BmKRZNCSQwBXYqGE2Dx/Ic4AmpsTH+ekLs3khCwdGPE3/wovOu5UVwsziT6UfJef4o6YgyWmIJEf3UpXknkjJd+FR7DCeukmkF5oYdhGTFDvdF4lH+FC+YTc9b66ATIx6MQMIaCnhiHA4k6D49PwN2x5UAoCT4IWNuAtfFBwNoGrI0PAtY2YG38B6VuuBeejFXUAAAAAElFTkSuQmCC" + }, + "impact8g": { + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAAsSAAALEgHS3X78AAAFVUlEQVR4nO2a7XHjNhCGH2Tuv5kKzFQgXgXHVHDq4HQVxCUoHSgVRK4gcgWhK4hUwUkVhK5g8wOABYMACRHUUTfxO4ORjY8F8AJY7C6hRIT/CxSUAkc376eZxhKFgkJBcwW5W2Dl598cAUANfFKwnEKYIXQPfAF2fvmtEgCwVVDkCFJQobf8AjiJJuINbpmAO/S2HQWlt/s/Rg7EjpWI3ExCpAgU1CPkbAMFy0jd+SfuDGYZKDgiUiS2LxHZhwpjbW7tCNSBvHtgPdRQ6bZ79Hn38RRtOPeqeysYXD2Tqp52DwPCVz1t55+4s337Ku0DbQrC591P5Y9wBOqB8oVyjoKCEq3Zvwy0O/jWn4sfiQCABwXlwHn30TF+XCiR2/AFlF6l+4Sqp8R6Fh9DBtBrv7dAgNnO37zsF85GzFicRMuO4kNmB70wE+sdgEEVyFsBGy5bbR+92x+uTAB68n+PaHcS2Blf4M+M/pvBGt/heku5pvz04LQ/juy8TRzf1QkoEGlNxhKRNSLNQMPCaV/3TbJH1i5lfFe/BgVazvd3IbAWqAUU8BH4CvwBHEydR9PGtm+A54DoA2HdYTF4/nUHV94BzkruEWkS6pWBvMqruLW7JGUXzXoEAlu5M8HE9laXrBKOR8dsnp0AZxKbkW1LPIcIrU9CDVrTVzAGMCcBxSWrkyBvSJkK+hbZENl5390SNKGqVlKVVL+sSwd/QBtXO6top7oFSrS2FrTgxnT0gHZcXoObkhHnc6H6b4AYFmjD6l8bdZ5qB1jP7IR2aiq6dvyLqbc3dfZMEP83nqFNnxKbPcmEBFTo6OsTb2P5hSmzqTZ5PjGWtMb82r9HwaxsbVLIXT6g7RBta0ygjFaiUUfKl6LNUquRSxHZirbUGonjaMrXpo+Y/JiC3AQK9nj2wRQEbMyAfcOjcMrETLwwExdT1vYQkELMUsKGU8g+aEM3wRQE7KV7tVVmoBat6BV086bEyplQQdeBaokEVacgQERvafv/OjDAMSt9CY5ynlBo60cjyrnxgNr87tFX4S6ieO7Qt8DWqesqydzIjxs0WXllh76QWC4B9i4u0Z3EJvJkBtZGyv0bY9kjK4ST83eJvkXsQiyU9kDXwZaxrZGYrELrw1608rNKsTFpK/q41NJVTqVplwr3CL6a3CnHIJeAFKVmr78moW4jmhREE5aqO14jSBInIfiNMWfyReLg/Lp1wsQsCZuBeq7M4Dh5G5LrRIlyfIH6grruQ4ct4fP9DPzuyU51mJqesh1aAQN8Vp6SzCEg1RmxrzRsWCsW5rbKz0XKC5FOuEzBUukXJi3wF2fCn/0+ptoBL+jVOwTqrc3vEniM1AE9SKu5t+Z3lTCO1ytOQa20F1qZ/CXwq4AyqRaPgBxnqOXM7M/mf+sY+XikO5kKfWXZq8+u9takmCwfX8l5SjOSAHdwL5wH3zfoE/o8Hhl2hStTnmIL/ELP198hjDWE3PN/h57Yjv6XHPfAb16e6wpbI6li+JO3xQsZk4fxO2BDdzLXxjN6py28vDpH6FglmNXpCDyaPiveav0mV/BYAlIeJkwJ1x5w/YkmV/AYHVDndjoCa/TEa+Czkx/18lIxhoAx0dhcLOh+Zj8R9y6TMeYI1LmdToRmCiFjCMh6wDwhsrc/jCOgmaLjCTAJATl2wIr8UFYO1CRCMnwBOD+Cqp2/U7/O5CDbALLIjQkeCX/JKbkuMZNsf7jeK7EjcWLc4GfJOKNqMgJu4qEkXde4JE7M0Nugi3ArBMTgEgPa8NkygQFkcesEXB239Fp8FrwTMPcA5sY7AXMPYG68EzD3AObGf4L8LJx8Ylq2AAAAAElFTkSuQmCC" + }, + "tiltleft": { + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAAsSAAALEgHS3X78AAAD5ElEQVR4nO1b7XWbMBS99PR/2CBM0HiDsEG9QckG3qDqBu4EpRt4g+AN6AZ4AzLB7Q89HTA1BiEJuYnvORwsIYn3rt6HJJKEJD4yPsUWIDbuBMQWIDbuBIQcPAFUAlQJsJFyKeVtyPdagaS3C2QOsgK5lXIrDwspc1BuQB5AbnzKYXN99sxnCeARQAPgIOVUygDwQ+7GKh7lKgHUCbAhUHuW6To8zPoO5EF+FyBrYwET/VJpb/pu5aFa0wJcOxe9ikmlJ8aqpFCDTP8XAlIRuHIVWsYqIfEAEidukgCQKuRMCREEuQ9NgHUalOD1HcATAOU7Jg2wCTz+YgvYBbaAdC0XSMj5u8EEyAGAQBVoPlaHrQsoAK8JsA8gSxTMJiDRCxrjk1UQaSLAygUA7QbvyQVmL4UToIBe0jaBZIkCmxhQAHiV+5pIoYNvkJQ46gLi84de1bPcT+isYM/zNj6RA9gB+NqrO0JvpVtvb5mx4htrUAfKzTnJiuOo6XH7PKdBPfLQ9x6+INlcUbyPlo6bLxsC8gsPlCelU0vFh3CWY26jfa+igfsSOBXh24WK93GggzxzG6WiOKF9dKniGfUOz4fifSyOCzYNcyzfnmYkywklKjcOlsUFFzOec+XUJjomsKImp9+n4HULqaTf2Li7WyAgZzejQ0EbUfILtVU0Ul/3yNjPVG6MqJIz44Lv7wIF9CJJoVss5XI/AXiBXsjkAP7Ib7OQesL09wIzZgZ9kvww0u4b9H4lm5TYw2ynMjNmJgvqgGRmpxKL6FuFQdvr14oFpFdm1hYtJ4K2q+JKXlKK4qQ235pdULqk+BAVNWmZ9PWNgp4J2LFTPOP5jFN+b9j58phSB3YzZMYMhYsZYqny7Ame8l8FjcmTWqlhIDTEGStqGB6KnghoeW5SQ+XNJqkY1LfUFpHJZdxnLVx0gyXfBh8kAkPuT4Pnbe9ZKlfbKyuJ0mviJzqZz3GJlYmLcldX2B7625bTK0Hf6MeoUX2szwQBEDqf/5poZw5Onifa+cYb9Kn1HjMOTpYScIs4QStdwuLEyPffB8TACTqulEs62xKQXqg7yn1tUz9Cz7jTmaQtAcOT2Rd0zK/lGkfoGa98DObiAr/RKa+cJZn3PgXP3yVcCDDn9QXC5fU3aBNXCPRBxjYL5NAfR0LDKpW54NaywKJU5oJbIcAplbkgNgFeUpkLbAnIPb3XaypzwdoWECSVuWANAoKnMheEJGC1VOaCEASsnspc4JOAaKnMBbYENBfqoqcyF9gSUELvAbbQf9d/wA2kMhcsORF6V7j/01RsAWLjTkBsAWLjTkBsAWLjwxPwF0Pxx3Dj8Xp5AAAAAElFTkSuQmCC" + }, + "tiltright": { + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAAsSAAALEgHS3X78AAAEIElEQVR4nO2a77WbRhDFf+Tk+6MD4wqsDowriFKBeRVE7oB0oFRg3IHSAelAr4KQDpQKbj7M7gHLgFj+CEnRPYejB+wuM5fZubPLiyTxf8ZPaxuwNp4ErG3A2ngSsLYBHhEUEZQRZO58765lSz53NQIiyCOoIti5Swnw0f0CbIDP/twRso/q+/NA0lUPpMT9lu5i6c4zpBwpbZwfkFKkuDFIPrM913Mc6YhUOYdSpAJpM6BvjLRv9PVjXex7SwRsGxeyiWP56DnhIupmCUDaUIf1bqrzbpzUOT/HWIs6H2NhK6TtQs/I3DOSMf2XVoENELu/Tws9Yw+8Aw6jel9hCsRLvf1GBJSMTIiR9DirwQgyQRHS5+eFbLk6IptiLxEQQsLNlMIz4Oh+NyGdHmYK+BJZUIX0e5gIcI4nEWQh64WHIcChAL4C26EdliBgiyUkuaNkwSVtYxldUtccO38tgrx3gJl1OZd00veavJWt+CrNULq21AFpT4OLa4W5DImdk0d1PzBtEJG7PnORsO+4ubtGIbTBytB3wBv9JW+JJagUC9e9OyaVyZGNdXQ2eLxpiCROZD9zIR8CP0USSYU7L3oiZ+xUGFQaT3G+CHS8SUCpesrojIjRmxzYDpII2DUaMwUSLOQ/BPb7F5MpH+4JphgvLW3/wrJ3GfIANxUOsik2DIEsp/ox5DN3L5F06HnrPultZMlp6/pkssTYhlILKMdZ1AxunHcYmZ61a8sJhWqS2u6lztGy4xnVUkQMaRSr+802nch72lUtBOSqc4Cc86lquewaJ9e8EtrbYHNm5BT4KMgutDu6Nht1E3HSTET03cwULnGXcHBGp7qsIpWMhEuEFZogoV030jC/gtB8e4naichlBPia4RIJcuMER0TXjXyUa2E4SdrLSEhUryPOkTubuqZDE0cFEtC1GgzS35F4AX4D/sY0v8Bqg9+Bfxrt/E7PEJs+EFID0L0cLoFXrHi5Bj5jRBTU64XIHX67O2irayguVYIx9vV2R3vFthTeMMdLZ0MG/DKw7yshO8MD50qs/ortluBzxqQccI4T9Rx95fs5etcYsyVWYER8whYtd40pe4IllnE/AX/OYUwAvgC/MsMLmGNTtMSWte+BbzOMNwRHLEmmWMIcjTl3hSssW78H/mBZCT1Q7/3vetpdxBLb4hVmVIIVNUsQ8YLVDSVjP4s7LPlh5IRVeAnLKcdHJtYn1/gydNMSeu1PYwU3JqFrfRssqSX0WsrRirU/jpbUyrEKEWsT4FFREzFVOZKQxrdCgEdFrRxjiUhCGt8aAR5eQmMWVo5bJaCJglpCJ5W9bbgHAjwKbFdoVgm9JwI8SvolNKg0foT/EkswBUmwVeI+pPMjEDAJ9zgFZsWTgLUNWBtPAtY2YG08CVjbgLXxH2loFxEWi9ZNAAAAAElFTkSuQmCC" + }, + "tiltbackwards": { + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAAsSAAALEgHS3X78AAACyUlEQVR4nO2Z7W3bMBCGXxX9H21gbVBngmgEb1BlgqIb2BtkgzobpBNUmaDyBHE2kCe4/iAJEQo/JRKX2nwAQbJM8o6vT8czVRERbpkv3A5wUwTgdoCbIgC3A9wUAbgd4KYIwO0AN0UAbge4KQJwO8BNEYDbAW6+BrZr5PFZGACMKQYKEaAD8CuFsYRcALQQQqyi8uwINQDe1hrJxDsSRKUvB6w2kJFNikFuPglerQAVQBXg3fG9WgFCCV0G/zsIqELa3XwEXK0AJQcEskSAVwCn1I54OMXaJKAKyQOxAjxClKBbAL8j+y7lWdrbyuukxApw1K5X1+ELbB4tbT4QmgNil8FOOlED2HnanhD2j62Bu6ztAPTadVqIyHW09JGeiM6G+4oXImo845rsDI4xB8v3MTaMh+/fYAvgT4SePwE8yesa4rn10WvtewDfIuwFFTtOFkSAjV7r9xTRbySiTvar5edQrL6rC1cbIkpaB6hffgfgR0S/O4gNlwYiZ7wk9MlLSgHO8txp93zL1qt2rZJqn8KZXHWAi3F2fgewl2cT6vs59RLjFdCopc9xNPN+KQVo5fkozxuI7TTbErfBlGAvmELflziNVSGJCDw4+h1oilKtY54kuI/oNxLRjsKS4CDb9PKzKfkNhokMpraUYRk8YArr1MvgSfozynYPMDzjlbD5d3b7nmyVq00Zio8ARa5CqNbaWyNARsFeu7F32U4dATpLSuELxLI4H6edjdXDEgGKSj7v5NnZzrklFlPRAdPLDj18TZMPpQtp9Fn2BE1vetZMHhRYT3DuCKnlbMnkG3kOSbJOfAIkeQFpQE3wjLjJbyHqhQ2EcNnfDQKisPm+1lAGHhGxQWIjRABAJJQdFpapiTlDTLxPMVioAFdL2RbndoCbIgC3A9wUAbgd4KYIwO0AN0UAbge4KQJwO8BNEYDbAW5uXoB/c4v7pl/dd2gAAAAASUVORK5CYII=" + }, + "tiltforward": { + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAAsSAAALEgHS3X78AAAC2klEQVR4nO2Y3ZHaMBRGjzN5hw5CB0sqiNMBqSCUQDogHZAKQjqgg7AVLFtB2ApiKrh5kDxoja0fY+9liM6MByMk67ufpCuZQkT4n3mnLUCbbIC2AG2yAdoCtMkGaAvQJhugLUCbbIC2AG2yAdoCtMkGaAvQJmTAFNgDckPXEZhfFbVDEfhDZA98svePnnpz4NBRNgcmPfV1cQJmQHX1k0TEd9XMPXWWto5bthWRvfPbGJQB7VFXjAF7z+9ugG7wIiLVsPFeMIgB1yTBJfCzUbYFvtr7oaf9KPQ1YIk/eHUKKAsoQ/Xe93j2ksvg4Rz8I7DjMim2McOIHMO4rdNHN4E1IvI6B/iSWiUii55rcS7pOaMzByCydgrWvr5D26BgRrSke+RrvmBGHlt3gTlH+NhhRqrCbJd74nPHZ1v/FYV5zlOj+KN0zcjIGRDaztxZsg3UbXIQkaltu0lo1zoDEDm0BHJoqyuR22DM1FzZ+gunbB9o4xpVty8j+qq5MKAx9ZtX61KIMSBFzLpRduyofxSRmfN7PYOmPfqsA5lHJJuLA12fXaCNev266+y3p/4H4I/zvW7X+4xv13iR2m6ot8GF/dwBz4ltT8DG3pcD6aEAKUwS99eT8C4QS52Vp8CKuGCOwNp+zjCjeNUuUFMHL6FZEVg2KVTNdZlwzcRk6hT69tU7B5ww+zuYvbs5UhPMuv+FWQqxr6oL+9yukf+GmRkb4CFWbDQBh1zcU95C3oaN02dzh/DOACcAb4wpSbDquB+T0ftMMWCDSXBTzll7bFact8ZtSkOBIpgASXsbfAD+pogYgAmX5/pBudt/hWPPAXdrQCxDHYVvjpj1D3kG3K8BOQdEknPA2EJunZABP95ERTrPeF6FUwgZsAK+Ay9DdDYAL5i3zXKoB4b+ELl7cg7QFqBNNkBbgDbZAG0B2mQDtAVokw3QFqBNNkBbgDbZAG0B2mQDtAVo8w/leGQvtJ6OAwAAAABJRU5ErkJggg==" + } +} \ No newline at end of file diff --git a/pxt_modules/core/helpers.ts b/pxt_modules/core/helpers.ts new file mode 100644 index 0000000..6caa902 --- /dev/null +++ b/pxt_modules/core/helpers.ts @@ -0,0 +1,10 @@ +namespace Math { + /** + * Generates a `true` or `false` value randomly, just like flipping a coin. + */ + //% blockId=logic_random block="pick random true or false" + //% help=math/random-boolean weight=0 + export function randomBoolean(): boolean { + return Math.randomRange(0, 1) === 1; + } +} \ No newline at end of file diff --git a/pxt_modules/core/icons.jres b/pxt_modules/core/icons.jres new file mode 100644 index 0000000..3e4e037 --- /dev/null +++ b/pxt_modules/core/icons.jres @@ -0,0 +1,126 @@ +{ + "*": { + "namespace": "icons", + "dataEncoding": "base64" + }, + "heart": { + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAACXBIWXMAAAsTAAALEwEAmpwYAAAF0ElEQVR4nO3dMW4USRQG4NcrkVjObTgAF+AAFneCBDmFBG6zmyPIuQAHsNe55cQStcGM2Z311KPL3T2uNt+XMp73q2b+MZbsehEAAABAF4Zf/PtxRJxExFFEPJt59m1E3ETEVURcP+QJSilnEfE2Il5FxOl80SIi4u+I+BYRH4dh+PLA53B+Kz+/rCCnEfFi5lA1F7E50NFKKe8i4v0ycXZHRcT5MAwfGr/O+W1HxYrPr1aQ44h4uVic/b7HyE/C7Sff5/j1d8C5lIh43fBJ6Pz+NzJWen5/VB58smyWyTPfxuFe3NjOetPweOe3a7XnVyvI0YJBalpmvlosxTwznd+0md2cX60gc/9ANEbLzLl/oBzjecNjnd99qzy/WkGAUBBIKQgkFAQSCgIJBYGEgkBCQSChIJBQEEgoCCQUBBIKAgkFgYSCQEJBIKEgkFAQSCgIJGoFuT1oivaZTXdAzeSy4bHO775Vnl+tIDcLBqlpmfltsRTzzHR+02Z2c361glwtGKSmZebH2FxGdihlO3Ms57drtedXK8h1bK5jPJSLaLhfdntD33kc5kW+uzrza8PXOL9/rfr8nsLl1W9icylZy71LY1zG5r8Fn9Z8+XLG+U07PwAAAAAAAABgRynlrJTyVynlsszvcvvcZ/LJt7p8pZR3C4Ta50fZ7OyWT7515Cub5v44UMC7kKObLJ98h8pX+3X33vdoy7dLvmmq+WoF6X2PtnzTZso3cubelpZSDvnXZj8NwzDqU0O+/eSbZl8+t5pAQkEgoSCQUBBIKAgkFAQSCgIJBYGEgkBCQSChIJBQEEgoCCQUBBIKAgkFgYSCQEJBIKEgkKgVpPc92vLdJ980e/PVCtL7Hm35ps2Ub+TMWkF636Mt3y75pmnN9/Pqx0Pcbjflakr55HuUfHchz0opf5ZSLhYIdrF97qmXG8sn36PkAwAAAAAAAAB2lJ73VMsn32PmKz3vqZZPvsfMVzraUy2ffI+Zz570ceSbZrX57ElfZqZ802Z2k8+e9AbyTbPGfG41gYSCQEJBIKEgkFAQSCgIJBQEEgoCCQWBhIJAQkEgoSCQUBBIKAgkFAQSCgIJBYGEgkBCQSBhT/p48k2zynz2pC8zU75pM7vJZ0/6OPJN89Ty9b+nWj75HjPfXciz0vGeavnke8x8AAAAAAAAAPD7+dVKrOOIOImIo4h4NvPs24i4iYiriLh+yBNsf03gbWz2y53OFy0iNr9y/S0iPg7D8OUhTyDftHzRwfsvK8hpRLyYOVTNRTT+DUDZ/ILZ+2Xi7I6KiPNhGD40fZF8P0fFA/JFJ++/WkGOI+LlYnH2+x4jv5NsP/k+x+FWBZeIeD32k1C++yOjIV909P6r/T3IybJZJs/sZo92hXy7WvN18/6rFeRowSA1LTO72aM9w2Pn8pTydfP+qxVk7h+IxmiZOfcPlGM8b3isfPe15Ovm/edWE0goCCQUBBIKAgkFgYSCQEJBIKEgkFAQSCgIJBQEEgoCCQWBhIJAQkEgoSCQUBBIKAgkFAQStYLcHjRF+8xu9mhXyHdfS75u3n+1gtwsGKSmZWY3e7RneOxcnlK+bt5/tYJcLRikpmVm73u05dvVmq+b91+tINexuY7xUC6i4X7e7Q1953GYF/nu6syvY79Avh3N+aKj999TuLz6TWwuJWu5d2mMy9j8t+DTxMuh5Vvx5dUAAAAAAAAAwH+t+ldNovN89pCv//Vd7Z706DyfPeQ7Vvv6rnJPenSezx7yvVb5+q51T3rv+ewhnzazm3xr3ZPeez57yKfN7CbfWvek957PHvJpM7vJ51YTSCgIJBQEEgoCCQWBhIJAQkEgoSCQUBBIKAgkFAQSCgIJBYGEgkBCQSChIJBQEEgoCCQUBBJr3ZPeez57yKfN7CbfWvek957PHvJpM7vJt9Y96b3ns4d82sxu8q1yT3p0ns8e8ntW+/q6vLruye9xj87PL/rPBwAAABzKP8/KS45dYO2PAAAAAElFTkSuQmCC" + }, + "smallheart": { + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE5ElEQVR4nO3dMY5URxQF0NdGTtAQY3sB3gALsNgTJBapneA9WXbOBryAARIiRABBO5i2Ru2hLv9P9W9V9ZyT8nveVfXcgZGaelUAAADAEHbf+POrqnpaVY+r6vsTz/5SVZ+q6n1Vfbzn15BPvvtalC8V5Ieq+unEoVquq+rdytfId0u+Ps183zVecFXnC1eHWVcrnpfvmHx9mvlaBXm6XZamNTPl65sp38KZrYI83jBIy5qZ8vXNlG/hzFZBTv0L0RJrZsrXN1O+hTNbBQFKQSBSEAgUBAIFgUBBIFAQCBQEAgWBQEEgUBAIFAQCBYFAQSBQEAgUBAIFgUBBIFAQCFoF+XLWFOtnytc3U76FM1sF+bRhkJY1M+XrmynfwpmtgrzfMEjLmpny9c2Ub+HMR42HP1fVvqqebBbn2HVVfVjxvHzH5OvTzOfy6jb5+jyEfAAAAAAAAADwwEz9UZP9fv9LVb2sqmd1szb4lN5V1Zuqer3b7f6659dwfpOf37R70vf7/a9V9ds2cY5HVdWr3W73+8rXOb/DqJr4/FoFuaqqnzeL83X/1MKfhIeffH/Wt/8GPJV9VT1f8ZPQ+f1vZE16frPuSX9Z53tz6zDrxYrnnd+xac9v1j3pzzZLcZqZzq9v5jDnN+ue9FP/QrnEjyuedX53TXl+bjWBQEEgUBAIFAQCBYFAQSBQEAgUBAIFgUBBIFAQCBQEAgWBQEEgUBAIFAQCBYFAQSBQEAhm3ZO+6g6oE3m74lnnd9eU5zfrnvQ3m6U4zUzn1zdzmPObdU/667q5jOxc9oeZSzm/Y9OeX6sgH+vmOsZzua4V98sebuh7Ved5k/+7OvPvFa9xfremPr9LuLz6Rd1cSrbm3qUl3tbNPwv+mPny5cT52ZMOAAAAAAAAAOtcwkdNht3zLZ896adycXu+5bsdVfakn8TF7PmW7+7Isie92yXt+ZbvmD3pJ3BJe77l65s5zPefPenLrfn/EvLdZU86XBoFgUBBIFAQCBQEAgWBQEEgUBAIFAQCBYFAQSBQEAgUBAIFgUBBIFAQCBQEAgWBQEEgsCd9uTV7vuW7y570Tpe051u+vpnDfP/Zk77M2j3f8h2zJ73TRe35lu+IPen3dPF7vuWzJx0AAAAAAAAALsvUHzWpwfPZQz7/+zvtnvQaPJ895EemfX+n3JNeg+ezh/yrpnx/Z92TPno+e8j7Zg6Tb9Y96aPns4e8b+Yw+Wbdkz56PnvI+2YOk8+tJhAoCAQKAoGCQKAgECgIBAoCgYJAoCAQKAgECgKBgkCgIBAoCAQKAoGCQKAgECgIBAoCwax70kfPZw9538xh8s26J330fPaQ980cJt+se9JHz2cPed/MYfJNuSe9Bs9nD/kd076/Lq9uu/g97jX4+dX4+QAAAAAAAADggfFRkzb5+lxEPnvSl5Gvz7T5Wp/mvarzhavDrKsVz8t3TL4+zXz2pG8zU76+mcPksyd9m5ny9c0cJp896dvMlK9v5jD53GoCgYJAoCAQKAgECgKBgkCgIBAoCAQKAoGCQKAgECgIBAoCgYJAoCAQKAgECgKBgkCgIBDYk77NTPn6Zg6Tz570bWbK1zdzmHz2pG8zU76+mcPke9R4+HPd7N9+slmcY9dV9WHF8/Idk69PM5/Lq9vk6/MQ8gEAAADn8i9uSXT/dv6GSgAAAABJRU5ErkJggg==" + }, + "yes": { + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFHUlEQVR4nO3dQY5UZRQF4FsaJ6Qdoy7ADbAA455gYpjqBPdkdM4GXADCxBFhIINy0G2k0u+efsVfr/ir+L4h3e09eckRiOU7VQAAAMAUdg98/aaqHlfVo6r66sS331fVu6p6U1VvP/KfIZ98H2tVvlSQb6rquxOH6ryqqtdH/ox8/5NvTJvvi+YHbup84eru1s0R3y/fIfnGtPm6gjzeLkvrmJvyjd2Ub+XNriCPNgzSOeamfGM35Vt5syvIqf9CtMYxN+UbuynfyptdQYBSEIgUBAIFgUBBIFAQCBQEAgWBQEEgUBAIFAQCBYFAQSBQEAgUBAIFgUBBIFAQCBQEgq4g78+a4vib8o3dlG/lza4g7zYM0jnmpnxjN+VbebMryJsNg3SOuSnf2E35Vt78svnmf6pqX1Vfbxbn0Kuq+vuI75fvkHxj2nxeXt2Tb8znkA8AAAAAAAAAPjM+atKTb8xwvv1+/0NVPauqJ3U7C31Kr6vqZVW92O12v3ffZCd9HfnGHJ1vv9//VFU/bxPn8FRVPd/tdr8sfbEryE1Vfb9ZpGV/1vp/08h339Xku/ud47d6+E84p7Kvqh+Xfiexk77NTfnGbj6r85Wj7m49XfqCnfRtbso3dvPJZimOvGknfZub8o3dPPVfyNf4dukXvdUEAgWBQEEgUBAIFAQCBYFAQSBQEAgUBAIFgUBBIFAQCBQEAgWBQEEgUBAIFAQCBYFAQSCwk77NTfnGbh77jq9T+GvpF+2kb3NTvrGbLzdLceRNO+nb3JRv7OaLun2Z27ns727e0xXkbd2+LvJcXtVx72+V79BV5bt7w+HzOk9J/nv16B+LWR744alfblzyXXW+u1eQPq3bl7otvrdqwF91+8eqX9PLqwEAAAAAAACAD/moSe/q882wQ/6AT/787KSvc3X5ZtkhD6Z4fnbS17uafDPtkDemeX520re5OXu+aXbIG9M8Pzvp29ycPd80O+SNaZ6fnfRtbs6eb5od8sY0z89bTSBQEAgUBAIFgUBBIFAQCBQEAgWBQEEgUBAIFAQCBYFAQSBQEAgUBAIFgUBBIFAQCBQEAjvp29ycPd80O+SNaZ6fnfRtbs6eb5od8sY0z89O+jY3Z883zQ55Y5rnZyd9navKN9MOeWOa5+fl1b2rz3cBO+RTPz8AAAAAAAAA+PzEj5rY0bZDPuAqPqrTFsSO9gE75GMudmd+sSB2tBfZIR9zkTvz3cfd7WiP3fT8xm5Ok68riB3tsZue39jNafJ1BbGjPXbT8xu7OU0+bzWBQEEgUBAIFAQCBYFAQSBQEAgUBAIFgUBBIFAQCBQEAgWBQEEgUBAIFAQCBYFAQSBQEAi6gtjRHrvp+Y3dnCZfVxA72mM3Pb+xm9Pk6wpiR3vspuc3dnOafIsFsaN9jx3yMRe7M7/m5dV2tO2Qf4yreHk1AAAAAAAAAPChh4Ymp/5P/XbIr/6jHJ88XyrIFDvVHTvkBy52hzyYIl9XkGl2qpfYIV90kTvkjWnydf8/yDQ71Q075GM35Vt5syvINDvVDTvkYzflW3mzK8g0O9UNO+RjN+VbedNbTSBQEAgUBAIFgUBBIFAQCBQEAgWBQEEgUBAIFAQCBYFAQSBQEAgUBAIFgUBBIFAQCBQEgq4g0+xUN+yQj92Ub+XNriDT7FQ37JCP3ZRv5c2uINPsVDfskI/dlG/lza4g0+xUL7FDfs/F7pA3psl3DS+vtkN+wS+HfsDs+QAAAIBz+RdDw2v5jDe3GQAAAABJRU5ErkJggg==" + }, + "no": { + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFCElEQVR4nO3dMY5URxQF0NeWnCBysBfgDbAAy3uCxCK1E7wny87ZgBcAJkckBO1g2sJN/7r+f6p7VPXnnJQZ3lNNXRBSU7cKAAAAGMIh/eLxePyxql5V1Yuqen7l2X9X1duqenM4HP645+/xtKqeVdWTqvr2WoudfK6qT1X1oao+3vP3sF/HfiPcv2ZAjsfjz1X1y5WXWhxVVa8Ph8OvG7/veVV9f4N9lryruwPdwn5fbN5vlPu3GJBTcn9v/foNHKvqpw1/kzytqh9uuM+Sv2r9n4T2u7R6v5Hu3zeNb3hVD7dcnWa93PD1z261yJVm2q9v5jD3rxWQF7fbpWnLzCc32+I6M+3XN3OY+9cKyLX/QbTGdxu+9tr/oLz2TPv1zRzm/rUCApSAQCQgEAgIBAICgYBAICAQCAgEAgKBgEAgIBAICAQCAoGAQCAgEAgIBAICgYBAICAQtAKy9Y2la3i/4Ws/32yL68y0X9/MYe5fKyBvb7hIy5aZn262xXVm2q9v5jD3rxWQN3X3mNZDOZ5mrvXhVotcaab9+mYOc/8WA3J6Ye51PcyS/z79+OeG7/lYd89ZPpR3te19Wfud27TfSPdvzePVL+vuUa0t71at8b7u/lr7zePV97L7/Sa4fwAAAAAAAADwyPxfUeIMH0XQ4+787mPV+aWA6NE+jaod9rg7vzPN82sFRI/2VyNrRz3uzm/R4vm1/j+IHu1ze+txd34rZ7YCoke7b6bz65s5zPm1AqJH+9Keetyd38qZXjWBQEAgEBAIBAQCAYFAQCAQEAgEBAIBgUBAIBAQCAQEAgGBQEAgEBAIBAQCAYFAQCAQEAhaAdGjfWlPPe7Ob+XMVkD0aPfNdH59M4c5v1ZA9Gif21uPu/NbObMVED3aX+yux935XWie3x4erx65R9v57fj8AAAAAAAAAODxmfqjJjX4fnrI5//5TtuTXoPvp4f8zLQ/3yl70mvw/fSQL5ry5ztrT/ro++kh75s5zH6z9qSPvp8e8r6Zw+w3a0/66PvpIe+bOcx+XjWBQEAgEBAIBAQCAYFAQCAQEAgEBAIBgUBAIBAQCAQEAgGBQEAgEBAIBAQCAYFAQCAQEAhm7UkffT895H0zh9lv1p700ffTQ943c5j9Zu1JH30/PeR9M4fZb8qe9Bp8Pz3kF6b9+Xq8uk0PeZ/d/3wBAAAAAAAA4PGZ+qMmesidX4d996TrIT/j/PrsqyddD/ki59dnVz3pesj7Zjq/lTNn7UnXQ9430/mtnDlrT7oe8r6Zzm/lTK+aQCAgEAgIBAICgYBAICAQCAgEAgKBgEAgIBAICAQCAoGAQCAgEAgIBAICgYBAICAQCAgEs/ak6yHvm+n8Vs6ctSddD3nfTOe3cuasPel6yPtmOr+VM6fsSddDfsH59dlnT7oecufXQU86AAAAAAAAAGwWP2qiR7v7owj2m7zHvRkQPdpnNveQl/3+a9oe98WA6NFetLqHvOy3ZMoe99bH3fVo9820X9/MYe5fKyB6tPtm2q9v5jD3rxUQPdp9M+3XN3OY++dVEwgEBAIBgUBAIBAQCAQEAgGBQEAgEBAIBAQCAYFAQCAQEAgEBAIBgUBAIBAQCAQEAgGBoBUQPdp9M+3XN3OY+9cKiB7tvpn265s5zP1rBUSPdt9M+/XNHOb+LQZEj/aFTT3kZb+vTdvjvubxaj3aO30cugbfb4L7BwAAADyUfwDmcbblze7mOAAAAABJRU5ErkJggg==" + }, + "happy": { + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAACXBIWXMAAAsTAAALEwEAmpwYAAAF2klEQVR4nO3dPXIUVxQF4DOmnLhE7J8FsAEW4PKeIHGR2gnsiTI5G/ACBCSOKAII2sEMJY+ld+mn7pl6Pfq+lJbuqeYdCaqkdxMAAABgCLtv/PlVkh+T/JDk+5Vnf0nyKcmHJB/v+Tnkk+++ZuWrCvJTkl9WDtVyneR958fId0O+ZZr5vmt8wFXOFy6HWVcdz8t3TL5lmvlaBfnxdFmaembKt2ymfDNntgrywwmDtPTMlG/ZTPlmzmwVZO3/EM3RM1O+ZTPlmzmzVRAgCgIlBYGCgkBBQaCgIFBQECgoCBQUBAoKAgUFgYKCQEFBoKAgUFAQKCgIFBQECgoCBQWBQqsgX86aon+mfMtmyjdzZqsgn04YpKVnpnzLZso3c2arIB9OGKSlZ6Z8y2bKN3Pmo8bDn5NMSR6fLM6x6yT/dDwv3zH5lmnmc3l1m3zLPIR8AAAAAAAAAPDAbPpHTaZp+jXJ8yRPs18bvKb3Sd4mebnb7f665+fw/jb+/ja7J32apt+T/HGaOMejkrzY7XZ/dn6c93cYlQ2/v1ZBrpI8OVmcu/2dmV8JD1/5Xufb3wHXMiX5reMroff3v5HZ6Pvb6p705znfX24Os551PO/9Hdvs+9vqnvSnJ0uxzkzvb9nMYd7fVvekr/0fyjl+7njW+7ttk+/PrSZQUBAoKAgUFAQKCgIFBYGCgkBBQaCgIFBQECgoCBQUBAoKAgUFgYKCQEFBoKAgUFAQKCgIFLa6J73rDqiVvOt41vu7bZPvb6t70t+eLMU6M72/ZTOHeX9b3ZP+MvvLyM5lOsycy/s7ttn31yrIx+yvYzyX63TcL3u4oe9FzvOX/PXqzDcdH+P93dj0+7uEy6ufZX8pWc+9S3O8y/6fBa+2fPlyxfuzJx0AAAAAAAAA+mz6R00in3z3d9l70iPff8m3TDNf66d5r3K+cDnMuup4Xr5j8i3TzLfVPenyLZsp38yZW92TLt+ymfLNnLnVPenyLZsp38yZbjWBgoJAQUGgoCBQUBAoKAgUFAQKCgIFBYGCgkBBQaCgIFBQECgoCBQUBAoKAgUFgYKCQEFBoLDVPenyLZsp38yZW92TLt+ymfLNnLnVPenyLZsp38yZjxoPf85+v/Xjk8U5dp3kn47n5Tsm3zLNfC6vbpNvmYeQDwAAAAAAAAAemPJHTaZp+jXJ8yRPs1/Lu6b3Sd4mebnb7f665+cY/UcR5FuQb4Tz1yzINE2/J/lj5VB3jkryYrfb/dn5cUPs0S7Id6M73yjn786CHJr7uvXnJzAl+a3jO8lVkicnzHOXvzP/K6F8t83ON9L5a/0+yPOcL1wOs551PD/MHu0Vnl3LJeUb5vy1CvL0dFmaemYOs0d7hWfXckn5hjl/rYKs/R+iOX7ueHaYPdorPLuWS8o3zPlzqwkUFAQKCgIFBYGCgkBBQaCgIFBQECgoCBQUBAoKAgUFgYKCQEFBoKAgUFAQKCgIFBQECgoChVZBeu9YWsO7jmeH2aO9wrNruaR8w5y/VkHenjBIS8/MYfZor/DsWi4p3zDnr1WQl9lfpnUu02HmXMPs0V7h2bVcUr5hzt+dBTncMPci5wn59erHNx0f8zH76yzP5Tp998vKd6wr30jnb87l1c+yv1Sr596qOd5l/23tlcur7+Xi823g/AEAAAAAAADAA/OtRYlb+FGEYfe4y7csXwY4f1VB7NE+jMo99rjLdzMq98iXQc5fqyD2aP9vZDr2uMt3e2Q68mWg89f6fRB7tI/17nGX71hvvmHOX6sg9mgvmynfspnDnL9WQezRvq3n9xHku60n3zDnz60mUFAQKCgIFBQECgoCBQWBgoJAQUGgoCBQUBAoKAgUFAQKCgIFBYGCgkBBQaCgIFBQECgoCBRaBbFH+7aePe7y3daTb5jz1yqIPdrLZsq3bOYw569VEHu0j/XucZfvWG++Yc5fqyD2aN/o3uMu35HufBno/F3C5dXD7tGWb/Ee8qHPHwAAAHBG/wKcHIXJ5Tep/gAAAABJRU5ErkJggg==" + }, + "sad": { + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFqElEQVR4nO3dPZJTRxQF4CNTTlxD7J8FeAMswOU9QeIitRPYkwtyNuAFDJA4ogggeA4kbMRMX15PS/Jr+L6Up7mnWn00TJWqOwEAAAA2YfeZf79K8n2S75J8e+LZ75O8TfI6yZs7/gz55LurVfmqgvyQ5KcTh2q5TvKq8zXy/Ue+Mc183zRecJXLhcth1lXH8/Idk29MM1+rIN+fL0tTz0z5xmbKt3JmqyDfnTFIS89M+cZmyrdyZqsgp/6DaI2emfKNzZRv5cxWQYAoCJQUBAoKAgUFgYKCQEFBoKAgUFAQKCgIFBQECgoCBQWBgoJAQUGgoCBQUBAoKAgUFAQKrYK8v2iK/pnyjc2Ub+XMVkHenjFIS89M+cZmyrdyZqsgr88YpKVnpnxjM+VbOfNe4+F3SZYk988W59h1kr87npfvmHxjmvkcXt0m35ivIR8AAAAAAAAAfGWm/qrJsiy/JHmU5EH21waf0qskL5I82e12z+74M6zf5Os37T3py7L8luT388Q5HpXk8W63+6PzddbvMCoTr1+rIFdJfj5bnNv9lZWfhIdPvj/z+d+Ap7Ik+bXjk9D6fTIyk67frPekP8rl3twcZj3seN76HZt2/Wa9J/3B2VKcZqb1G5u5mfWb9Z70U/9BucaPHc9av5umXD+nmkBBQaCgIFBQECgoCBQUBAoKAgUFgYKCQEFBoKAgUFAQKCgIFBQECgoCBQWBgoJAQUGgoCBQmPWe9K4zoE7kZcez1u+mKddv1nvSX5wtxWlmWr+xmZtZv1nvSX+S/WFkl7IcZq5l/Y5Nu36tgrzJ/jjGS7lOx/myhxP6Hucyb/KHozOfd7zG+v1n6vX7Eg6vfpj9oWQ95y6t8TL7/xY8nfnw5Yr1c086AAAAAAAAAPSZ+qsmkU++u/uy70mPfB+Tb0wzX+vbvFe5XLgcZl11PC/fMfnGNPPNek+6fGMz5Vs5c9Z70uUbmynfypmz3pMu39hM+VbOdKoJFBQECgoCBQWBgoJAQUGgoCBQUBAoKAgUFAQKCgIFBYGCgkBBQaCgIFBQECgoCBQUBAoKAoVZ70mXb2ymfCtnznpPunxjM+VbOXPWe9LlG5sp38qZ9xoPv8v+fuv7Z4tz7DrJ3x3Py3dMvjHNfA6vbpNvzNeQDwAAAAAAAAC+MlN/1WRZll+SPEryIPtrg0/pVZIXSZ7sdrtnd/kB8o3lywb237T3pC/L8luS388T53hUkse73e6PrhfJ9++o3CFfNrL/WgW5SvLz2eLc7q+s/E1y+OT7M5//DXgqS5Jf134SyndzZDryZUP7b9Z70h/lcm9uDrMedjwv37HefJvZf7Pek/7gbClOM1O+sZmb2X+z3pN+6j8o1/ix41n5burJt5n951QTKCgIFBQECgoCBQWBgoJAQUGgoCBQUBAoKAgUFAQKCgIFBYGCgkBBQaCgIFBQECgoCBQUBAqz3pPedYbWibzseFa+m3rybWb/zXpP+ouzpTjNTPnGZm5m/816T/qT7A8ju5TlMHMt+Y715tvM/msV5E32xzFeynU6zuc9nND3OJd5kz8cnfl87QvkO9KdLxvaf1/C4dUPsz+UrOfcpTVeZv/fgqeDh0PLN/Hh1QAAAAAAAADAx8qvmrhHe/irCPKNf5Xof91/zYK4R/tI9z3uke9j3fm2sv9uLYh7tG+1+h73yHeb1fm2tP9aX3d3j/bYTPnGZm5m/7UK4h7tsZnyjc3czP5rFcQ92mMz5RubuZn951QTKCgIFBQECgoCBQWBgoJAQUGgoCBQUBAoKAgUFAQKCgIFBYGCgkBBQaCgIFBQECgoCBQUBAqtgrhHe2ymfGMzN7P/WgVxj/bYTPnGZm5m/7UK4h7tsZnyjc3czP67tSDu0b6h6x73yPeprnxb2n9rDq92j/YXejh0Np5vgv0HAAAAXMo/WNaFyX18J6sAAAAASUVORK5CYII=" + }, + "confused": { + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFd0lEQVR4nO3dMW5TWxAG4N8PvQaFmsdbABvIAhB7ShqUFpqwJwR9NsACAjRUiAKK+wob8UxyhntzbMuHfF/LdWY01u8QyZpJAAAAgKOw+s2/nyR5nORhkr93XPt7kq9JPiX5csefoT/93dWs/qqA/JPk3x031XKd5OPC1+jvJ/31afb3V+MFJzlcc9nUOlnwvP626a9Ps79WQB7vr5emJTX111dTfzNrtgLycI+NtCypqb++mvqbWbMVkF3/QTTHkpr666upv5k1WwEBIiBQEhAoCAgUBAQKAgIFAYGCgEBBQKAgIFAQECgICBQEBAoCAgUBgYKAQEFAoCAgUBAQKLQC8v2gXSyvqb++mvqbWbMVkK97bKRlSU399dXU38yarYB82mMjLUtq6q+vpv5m1nzQePhbkinJo721s+06yecFz+tvm/76NPuzvLpNf33uQ38AAAAAAAAAcM8M/VWTaZqeJTlPcpr12eBd+pjkKsnlarV6e8efYX6Dz2/YO+nTNL1I8nI/7WyXSnKxWq1eLXyd+W1KZeD5tQJykuTp3tq53fvM/CTcfPK9ye9/A+7KlOT5gk9C8/ulZAad36h30s9zuDc3m1pnC543v23Dzm/UO+mne+tiNzXNr6/m0cxv1Dvpu/6Dco4nC541v5uGnJ+tJlAQECgICBQEBAoCAgUBgYKAQEFAoCAgUBAQKAgIFAQECgICBQGBgoBAQUCgICBQEBAoCAgURr2TvmgH1I58WPCs+d005PxGvZN+tbcudlPT/PpqHs38Rr2Tfpn1MrJDmTY15zK/bcPOrxWQL1mvYzyU6yzYL7vZ0HeRw7zJP1ZnvlvwGvP7aej5/QnLq8+yXkq2ZO/SHB+y/m/B65GXL1fMz510AAAAAAAAAFhm6K+aRH/6u7s/+0569Pd/+uvT7K/1bd6THK65bGqdLHhef9v016fZ36h30vXXV1N/M2uOeiddf3019Tez5qh30vXXV1N/M2vaagIFAYGCgEBBQKAgIFAQECgICBQEBAoCAgUBgYKAQEFAoCAgUBAQKAgIFAQECgICBQGBgoBAYdQ76frrq6m/mTVHvZOuv76a+ptZc9Q76frrq6m/mTUfNB7+lvV960d7a2fbdZLPC57X3zb99Wn2Z3l1m/763If+AAAAAAAAAOCeGfqrJtM0PUtynuQ067PBu/QxyVWSy9Vq9faOP8P8Bp/fsHfSp2l6keTlftrZLpXkYrVavVr4OvPblMrA82sF5CTJ0721c7v3mflJuPnke5Pf/wbclSnJ8wWfhOb3S8kMOr9R76Sf53Bvbja1zhY8b37bhp3fqHfST/fWxW5qml9fzaOZ36h30nf9B+UcTxY8a343DTk/W02gICBQEBAoCAgUBAQKAgIFAYGCgEBBQKAgIFAQECgICBQEBAoCAgUBgYKAQEFAoCAgUBAQKIx6J33RDqgd+bDgWfO7acj5jXon/WpvXeympvn11Tya+Y16J/0y62VkhzJtas5lftuGnV8rIF+yXsd4KNdZsF92s6HvIod5k3+szny34DXm99PQ8/sTllefZb2UbMnepTk+ZP3fgtcjL1+umJ876QAAAAAAAACwTPlVE3e03SHv8EfMrxkQd7S3uEPeZ9j53RoQd7Rv5Q55nyHn1/q6uzvafTXNr6/m0cyvFRB3tPtqml9fzaOZXysg7mj31TS/vppHMz9bTaAgIFAQECgICBQEBAoCAgUBgYKAQEFAoCAgUBAQKAgIFAQECgICBQGBgoBAQUCgICBQEBAotALijnZfTfPrq3k082sFxB3tvprm11fzaObXCog72n01za+v5tHM79aAuKN9gzvkfYad35zl1e5ou0N+F/dhfgAAAMCh/AecHIXJK5h09QAAAABJRU5ErkJggg==" + }, + "angry": { + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAACXBIWXMAAAsTAAALEwEAmpwYAAAF8klEQVR4nO3dMW4USRQG4Ne7IkHe2IYDcAEOYHEnnCCnkJjb7OYIci6wB7Ah2chysJaoDWa87Ky7Ht2u7qF7/H2px/N+PfVvZDGuigAAAAAWocu+WEo5jYiziHgZEScTz/4SEZ8j4qLruo8PfI+jiDiOiKcR8WSqYFu3EXETEV8j4vqB7yFfQ74lPH/VgpRS3kTE24lD9Y6KiPOu696N/L6TiHg+Q54+l7FZ6BjyfTc631Kev96CbJv7ofb1GZSIeDXiX5KjiHgxY54+f8bwn4Ty3Tc435Kev18q33AW+wsX21mvR7z+eK4gE82Ur23mYp6/WkFezpelaszMp7OlmGamfG0zF/P81Qoy9S9EQzwb8dqpf6GceqZ8bTMX8/zVCgKEgkBKQSChIJBQEEgoCCQUBBIKAgkFgYSCQEJBIKEgkFAQSCgIJBQEEgoCCQWBhIJAQkEgUSvI2DOWpnA14rW3s6WYZqZ8bTMX8/zVCvJ5xiA1Y2bezJZimpnytc1czPNXK8hFbA7T2peynTnU17mCTDRTvraZi3n+eguyPWHuPPYT8u7ox08jvuc6NsdZ7stljDtfVr5do/It6fkbcnj169gcqjXm3KohrmLzz9p7h1c/yMHnW8HzBwAAAAAAAACPzI8uSlzDRxHc425/DzFof1lB3KO9HRUHeI+7/e2o7q9WEPdo/29kHNA97vbXq3d/tb8HcY/2rkO7x93+Bs6sFcQ92m0z7a9t5mL2VyuIe7TvO6R73O1v4EynmkBCQSChIJBQEEgoCCQUBBIKAgkFgYSCQEJBIKEgkFAQSCgIJBQEEgoCCQWBhIJAQkEgoSCQqBXEPdr3HdI97vY3cGatIO7Rbptpf20zF7O/WkHco73r0O5xt7+BM2sFcY/2dwd3j7v93VPd3yEcXr3ke7Tt74D3BwAAAAAAAACPz6o/ahLyyfdwh31Pesj3X/K1qearfZr3KPYXLrazjka8Xr5d8rWp5lvrPenytc2Ub+DMtd6TLl/bTPkGzlzrPenytc2Ub+BMp5pAQkEgoSCQUBBIKAgkFAQSCgIJBYGEgkBCQSChIJBQEEgoCCQUBBIKAgkFgYSCQEJBIKEgkFjrPenytc2Ub+DMtd6TLl/bTPkGzlzrPenytc2Ub+DMXysv/js291v/NlucXZcR8deI18u3S7421XwOr66Tr81jyAcAAAAAAAAAfFdKOS2l/FFKuSrTu9q+96l88q0uXynlzQyh+nwrpbyRT77V5Cub5n7bU8C7kIObLJ98+8pX+3uQs/jxJ32n1EXE6xGvl2+XfG2q+WoFeTlflqoxM+VrmynfwJm9LS2llHmz9Ou6btBPDfn6ydemL59TTSChIJBQEEgoCCQUBBIKAgkFgYSCQEJBIKEgkFAQSCgIJBQEEgoCCQWBhIJAQkEgoSCQUBBI1AryZa8pNq5GvFa+++Rr05uvVpDPMwapGTNTvraZ8g2cWSvIRWyu4d2Xsp05lHy75GszNt+/Rz/u43S7lqMp5ZPvp+S7C3laSvm9lHI5Q7DL7Xu3Hm4sn3w/JR8AAAAAAAAAPD7plVjb/4Y/i839bScTz/4Sm09QXnRd9/GB73EUEccR8TQinkwVbOs2Im4i4mtEXD/kDexv/furFqRsPsD1duJQvaMi4rzruncjv+8kIp7PkKfPZYz8GwX727Ha/dUu8TyNiA+1r8+gRMSrET8JjyLixYx5+vwZA38S2l+vVe5vrfekH88VZKKZ9tc2czH7W+s96U9nSzHNTPtrm7mY/dUKMvUvREM8G/HaqX+hnHqm/bXNXMz+nGoCCQWBhIJAQkEgoSCQUBBIKAgkFAQSCgIJBYGEgkBCQSChIJBQEEgoCCQUBBIKAgkFgYSCQGKt96TfzpZimpn21zZzMftb6z3pN7OlmGam/bXNXMz+1npP+te5gkw00/7aZi5mf70F2Z4wdx77CXl39OOnEd9zHZvjLPflMkacL2t/96x2f0MOr34dm0O1xpy7NMRVbP5Ze3/ghy/b3+HuDwAAANiXfwDTXfEJIYpjngAAAABJRU5ErkJggg==" + }, + "asleep": { + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAACXBIWXMAAAsTAAALEwEAmpwYAAAF3klEQVR4nO3dPY4cVRQF4NNYJGgc87MAFoAXgNiTnSCnkJg9IcjNAljA2CSOEIEJiqAbcMvzrl/N62q98nxfOtVzj2rqTHuk9rsJAAAAMIXDB75+k+TzJJ8l+fTCs/9O8leSP5L8ec/vIZ9899WVryrIF0m+unColtskr1e+Rr7/yTemme+Txgtucr1wOc26WXG9fOfkG9PM1yrI59tlaVozU76xmfJ1zmwV5LMNg7SsmSnf2Ez5Ome2CnLpP4h6rJkp39hM+TpntgoCREGgpCBQUBAoKAgUFAQKCgIFBYGCgkBBQaCgIFBQECgoCBQUBAoKAgUFgYKCQEFBoKAgUGgV5O+rplg/U76xmfJ1zmwV5K8Ng7SsmSnf2Ez5Ome2CvLHhkFa1syUb2ymfJ0zHzUufptkSfJ4szjnbpO8WXG9fOfkG9PM5/DqNvnGPIR8AAAAAAAAAPDAlB81WZbl2yTPkjzJcS3vJb1O8jLJi8Ph8Mt9vsHs+TL5RyVmv38z5GsWZFmW75P8cOFQd45K8vxwOPy46kWT58ske75bZr9/s+S7syCn5v7c+voGliTf9f6mmT1fju8cX2+Y5y6/p/OdZPb7N1O+1v8HeZbrhctp1tMV18+eb5o93w2z379p8rUK8mS7LE1rZs6eb5o93w2z379p8rX+ibVsm+Vuh8Oh67fG7PmSfLNpkLbfei6a/f7NlM+pJlBQECgoCBQUBAoKAgUFgYKCQEFBoKAgUFAQKCgIFBQECgoCBQWBgoJAQUGgoCBQUBAoKAgUWgVZdcbShbxace3s+abZ890w+/2bJl+rIC83DNKyZubs+abZ890w+/2bJl+rIC9yPEzrWpbTzF6z55tmz3fD7Pdvmnx3FuR0wtzzXCfkv0c//tr7gtnz5XjC4e1Gee5ymxXn885+/2bK13N49dMcD9X68sLBXuX4tvbT4OHG0+bLPg6vnvb+zZ4PAAAAAAAAAB6eD63EmvqjEpFPvvvrylcVZOo935HvXfKNaeZrfdz9JtcLl9OsmxXXy3dOvjHNfK2CzL7nW76xmfJ1zmwVZPY93/KNzZSvc2arIJf+g6jHmpnyjc2Ur3OmU02goCBQUBAoKAgUFAQKCgIFBYGCgkBBQaCgIFBQECgoCBQUBAoKAgUFgYKCQEFBoKAgUFAQKLQKMvueb/nGZsrXObNVkNn3fMs3NlO+zpmtgsy+51u+sZnydc581Lj4bY77ox9vFufcbZI3K66X75x8Y5r5HF7dJt+Yh5APAAAAAAAAAB6YXX/UZFmWb5M8S/Ikx7XBl/Q6ycskLw6Hwy/3+QbyjeXLBM/fbvekL8vyfZIftolzPirJ88Ph8OOqF8n336jcI18mef5aBblJ8vVmce72ezrfSU6/+X7Oh98BL2VJ8l3vb0L53h+ZFfky0fO31z3pz3K9H25Os56uuF6+c2vzTfP87XVP+pPNUlxmpnxjM6d5/va6J/3Sf1D2+HLFtfK9b02+aZ4/p5pAQUGgoCBQUBAoKAgUFAQKCgIFBYGCgkBBQaCgIFBQECgoCBQUBAoKAgUFgYKCQEFBoKAgUNjrnvRVZ2hdyKsV18r3vjX5pnn+9ron/eVmKS4zU76xmdM8f3vdk/4ix8PIrmU5zewl37m1+aZ5/loF+TPH4xiv5TYrzuc9ndD3PNf5If97dOavvS+Q78zqfJno+fsYDq9+muOhZGvOXerxKsd/Fvw0eDi0fDs+vBoAAAAAAAAAeNeuP2oS+eS7v497T3rke5d8Y5r5Wp/mvcn1wuU062bF9fKdk29MM99e96TLNzZTvs6Ze92TLt/YTPk6Z+51T7p8YzPl65zpVBMoKAgUFAQKCgIFBYGCgkBBQaCgIFBQECgoCBQUBAoKAgUFgYKCQEFBoKAgUFAQKCgIFBQECnvdky7f2Ez5OmfudU+6fGMz5eucudc96fKNzZSvc+ajxsVvc9xv/XizOOduk7xZcb185+Qb08zn8Oo2+cY8hHwAAADAtfwDbK2ONrQZz3kAAAAASUVORK5CYII=" + }, + "surprised": { + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFc0lEQVR4nO3dP25UVxQG8G8SpUFODWQBbMALiNiT3SC30Jg9Iei9ARbAnyYVogjFpJhBycR+h/d8543uNb9fmzHn07E+EyTrngQAAADowuYH//0syeMkj5L8duTZ35J8TfI5yZf7/AHb7fbPJJdJzpM8OV60JMmnJDdJrjebzdt7/hn2N/j+qoI8SfLHkUNN+ZDdQmfbbrcvkrxcJ87hqCRXm83m1cKvs7/9qAy8v6mCnCV5tlqcu73PzJ+E+598b/LjvwGPZZvk+YKfhPb3v5EZdH+/THz48bpZmmde5nTf3OxnXSz4vP0dGnZ/UwV5tGKQKUtmnq+W4jgz7a9tZjf7myrIsf9BNMeSmcf+B+UcTxd81v5uG3J/UwUBoiBQUhAoKAgUFAQKCgIFBYGCgkBBQaCgIFBQECgoCBQUBAoKAgUFgYKCQEFBoKAgUFAQKEwV5NtJUyyfuegNqCP5uOCz9nfbkPubKsjXFYNMWTLzZrUUx5lpf20zu9nfVEE+rxhkypKZ19k9RnYq2/3Muezv0LD7myrIl+yeYzyVD1nwvuz+hb6rnOab/P3pzHcLvsb+/jX0/h7C49UX2T1KtuTdpTk+Zve/Ba9Hfny5Yn9t+wMAAAAAAACAn8/Qv2oS+eS7v4d9Jz3y/Zd8bSbzTf0271lOFy77WWcLPi/fIfnaTOYb9U66fG0z5Zs5c9Q76fK1zZRv5sxR76TL1zZTvpkzvWoCBQWBgoJAQUGgoCBQUBAoKAgUFAQKCgIFBYGCgkBBQaCgIFBQECgoCBQUBAoKAgUFgYKCQGHUO+nytc2Ub+bMUe+ky9c2U76ZM0e9ky5f20z5Zs78deLDf2d33/r31eIc+pDkrwWfl++QfG0m83m8epp8bX6GfAAAAAAAAADwk/GrJtOa82232z+TXCY5z+6s8TF9SnKT5Hqz2by955/R9f7SQT530udZnG+73b5I8nKdOIejklxtNptXC7+u6/2lk3xTBTlL8my1OHd7n/k/abrOt/+b401+/Df0sWyTPF/wN0nX+0tH+dxJX2fmZU5XjuxnXSz4fO/76yafO+nrzDxfLcVxZva+v27yuZO+zsxj/4N8jqcLPtv7/rrJ51UTKCgIFBQECgoCBQWBgoJAQUGgoCBQUBAoKAgUFAQKCgIFBYGCgkBBQaCgIFBQECgoCBQUBArupK8zc+kbUMfwccFne99fN/ncSV9n5s1qKY4zs/f9dZPPnfR1Zl5n95jbqWz3M+fqfX/d5JsqyJfsnmM8lQ9Z9n5r1/n2Lxxe5TQl+f706LsFX9P1/tJRPo9XTzvW49UX2T3qtuTdqjk+Zve/Va89Xn0v7qQDAAAAAAAAwGJD/6qJO+T21+Bh30l3h/yA/bV5WHfS3SG/k/21eVB30t0hb5tpfzNnjnon3R3ytpn2N3PmqHfS3SFvm2l/M2d61QQKCgIFBYGCgkBBQaCgIFBQECgoCBQUBAoKAgUFgYKCQEFBoKAgUFAQKCgIFBQECgoCBQWBwqh30t0hb5tpfzNnjnon3R3ytpn2N3PmqHfS3SFvm2l/M2cOeSfdHfJb7K/Nw7yT7g65/TVwJx0AAAAAAAAAFhv6V03SeT53yMf//g57Jz2d53OH/MCw398h76Sn83zukN9pyO/vqHfSe8/nDnnbzG7yjXonvfd87pC3zewm36h30nvP5w5528xu8nnVBAoKAgUFgYKCQEFBoKAgUFAQKCgIFBQECgoCBQWBgoJAQUGgoCBQUBAoKAgUFAQKCgIFBYHCqHfSe8/nDnnbzG7yjXonvfd87pC3zewm36h30nvP5w5528xu8g15Jz2d53OH/JZhv78er57mDnmbB//9BQAAAE7oHzt4fMP9uDtRAAAAAElFTkSuQmCC" + }, + "silly": { + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAACXBIWXMAAAsTAAALEwEAmpwYAAAGGElEQVR4nO3dMW4USRQG4Ne7IkHe2MABuAAHsLgTThApJHCb3RxB7gtwABuSjSwHi0RtMMOyI6YeXa7uoRh/X+qeeb9Q/2NGateLAAAAAIYwZT8spZxFxHlEPImIBwvP/hgRFxHxepqmd7d8j5OIOI2I+xFxb6lgW58j4iYiPkXE9S3fQ76OfCPcf9WClFKeR8TLhUPtHRURL6ZpetX4ugcR8WiFPPtcxuYftIV83zTnG+X+21uQbXPf1n6+ghIRTxt+k5xExOMV8+zzIeZ/Esr3vdn5Rrr/fqu84DwOFy62s541XH+6VpCFZsrXN3OY+69WkCfrZalqmXl/tRTLzJSvb+Yw91+tIEt/IZrjYcO1S3+hXHqmfH0zh7n/agUBQkEgpSCQUBBIKAgkFAQSCgIJBYGEgkBCQSChIJBQEEgoCCQUBBIKAgkFgYSCQEJBIKEgkKgVpPWMpSVcNVz7ebUUy8yUr2/mMPdfrSAXKwapaZl5s1qKZWbK1zdzmPuvVpDXsTlM61DKduZcn9YKstBM+fpmDnP/7S3I9oS5F3GYkF+Pfnzf8Jrr2BxneSiX0Xa+rHy7mvKNdP/NObz6WWwO1Wo5t2qOq9j8Wnvj8OpbOfp8v8D9BwAAAAAAAAB3zI8WJQ79KELIJ9/tzcqXFWToPdoh3//J16ear/a4+0kcLlxsZ500XC/fLvn6VPPVCjL6Hm35+mbKN3NmrSCj79GWr2+mfDNn1goy+h5t+fpmyjdzplNNIKEgkFAQSCgIJBQEEgoCCQWBhIJAQkEgoSCQUBBIKAgkFAQSCgIJBYGEgkBCQSChIJBQEEjUCjL6Hm35+mbKN3NmrSCj79GWr2+mfDNn1goy+h5t+fpmyjdz5u+Vi/+Jzf7oP1aLs+syIv5uuF6+XfL1qeZzeHWdfH3uQj4AAAAAAAAA4JtSylkp5a9SylVZ3tX2vc/kk++Xy1dKeb5CqH2+lFKeyyffL5OvbJr75UABv4ac3WT55DtUvtrfg5zHj5/0XdIUEc8arpdvl3x9qvlqBXmyXpaqlpny9c2Ub+bMvS0tpZR1s+w3TdOsTw359pOvz758TjWBhIJAQkEgoSCQUBBIKAgkFAQSCgIJBYGEgkBCQSChIJBQEEgoCCQUBBIKAgkFgYSCQEJBIFEryMeDpti4arhWvu/J12dvvlpBLlYMUtMyU76+mfLNnFkryOvYrOE9lLKdOZd8u+Tr05rvv6MfD3G6Xc/RlPLJ91PyfQ15Vkr5s5RyuUKwy+179x5uLJ98PyUfAAAAAAAAANw9P1qJdRIRpxFxPyLuLTz7c0TcRMSniLi+5XvI15Fv+5jFeWz28z1YLlpEbB5Zv4iI19M0vbvNG4yQLyvIg4h4tHComsto/xsA+b5pzlc2D+i9XCfO7qiIeDFN06umFw2Sr1aQk4h4vFqk/T7E/E9C+b43O9/2k/ltHG7VcomIp3N/k4yUr/b3IKfr5umeKV/fzGH2kFcMk69WkPvrZalqmSlf38xh9pAvcO1S9s6sFWTpL5RztMyUr2/m0l9453jYcO0w+ZxqAgkFgYSCQEJBIKEgkFAQSCgIJBQEEgoCCQWBhIJAQkEgoSCQUBBIKAgkFAQSCgIJBYGEgkCiVpDPB03RPlO+vpnD7CGvGCZfrSA3KwapaZkpX9/MYfaQL3DtUpr2pH9aMUhNy0z5+maOvod8mHy1glzH5jjLQ7mMtvNl5dvVlG97guCLOMxN+PVoz/dzXzBSPodX1x19vu0Rn89ic2hay7lVc1zF5r8tbzoPrx42HwAAAAAAAADcPR41qTv6fCPsIc+MkM+e9HmOLt8oe8irLxoknz3p8x1NvpH2kO+9eKB89qSvM3P0fMPsIa8YJp896evMHD3fMHvIF7h2KfakdzqmfMPsIa8YJp9TTSChIJBQEEgoCCQUBBIKAgkFgYSCQEJBIKEgkFAQSCgIJBQEEgoCCQWBhIJAQkEgoSCQUBBI2JO+zszR8w2zh7ximHz2pK8zc/R8w+whX+DapdiT3umY8g2zh7ximHz2pM9zVPlG2kO+z0j5HF5dd/T5Rt9DPno+AAAA4ID+BZBL4D8AYb8+AAAAAElFTkSuQmCC" + }, + "fabulous": { + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFs0lEQVR4nO3dMXIURxQG4Dd2OaHkGOMDcADrACruJCWUUkjEbeycglw+AAdYQeKIIjBVtINZGa+18+jRzCw9q+9LWe37afHvomLpFwEAAAC0r5RyVkr5o5RyU+Z3s33uM/nkW12+UsrzBULt86WU8lw++VaTr/TN/XKggLchq5ssn3yHyvfDQMaLiOhqf0Mz6CLifMTj5dsl3zSD+YYKcrpclkFjZso3baZ8lTP3trSUUpbNsl/XdVWvGvLtJ980+/INvYMAoSCQUhBIKAgkFAQSCgIJBYGEgkBCQSChIJBQEEgoCCQUBBIKAgkFgYSCQEJBIKEgkFAQSAwV5P1BU/RuRjxWvrvkm2ZvvqGCXC8YZMiYmfJNmylf5cyhglxFxCFvlijbmbXk2yXfNGPz/Xv14yFut5tyNaV88n2XfLchz0opv5dSNgsE22yfe+rlxvLJ913yAQAAAAAAAMDDk67E2v4z/EX0+9t+mXn2++g/QXnVdd2b+zxB6/ki4iQiHkfEo4j4aa5gW58j4lNEfIiIj/d5gtbPr4V8gwUp/Qe4Xswcau+oiLjsuu7lqC9qPF/039BfF8izzyZG/h+K1s+vlXxDSzzPIuL10K8voETEs9pXmtbzRf/O8XTBPPu8i8p3ktbPr6V89qTXGZvv8VJBZprZ+vk1k8+e9GVmPlosxTwzWz+/ZvLZkz5Cbb6I+G3RIMP+rHlQ6+fXUj63mkBCQSChIJBQEEgoCCQUBBIKAgkFgYSCQEJBIKEgkFAQSCgIJBQEEgoCCQWBhIJAQkEgoSCQsCe93ph8nxdLMc/M1s+vmXz2pC8z89NiKeaZ2fr5NZPPnvQ6Y/N9WCrITDNbP79m8u0tyPaGucs4TMjbqx/f1n5B6/miv+Fws1CefTYx4n7e1s+vpXw1l1efR3+p1pOZg91E/7b2auLlxs3mi3VcXt3s+bWeDwAAAAAAAAAenm+txGr6oxIhn3z3V5UvK0jTe75Dvv+Sb5rBfEMfdz+Jw4WL7ayTEY+Xb5d80wzmGypI63u+5Zs2U77KmUMFaX3Pt3zTZspXOXOoIHP/QFRjzEz5ps2Ur3KmW00goSCQUBBIKAgkFAQSCgIJBYGEgkBCQSChIJBQEEgoCCQUBBIKAgkFgYSCQEJBIKEgkFAQSAwVpPU93/JNmylf5cyhgrS+51u+aTPlq5w5VJDW93zLN22mfJUzfxx48N/R74/+ebE4uzYR8deIx8u3S75pBvO5vHqYfNM8hHwAAAAAAAAA8MCs+qMmpZSziLiIiNPo1wbP6X1EXEfEVdd1b+75HM5v5ee32j3ppZTnEfFimTi7oyLisuu6lyO/zvltR8WKz2+oICcR8XSxOPu9i8pXwu0r3+v49jvgXEpEPBvxSuj8/jcyVnp+a92TfhGH++bGdtb5iMc7v12rPb+17kk/XSzFPDOd37SZzZzfWvekz/0DZY0nIx7r/O5a5fm51QQSCgIJBYGEgkBCQSChIJBQEEgoCCQUBBIKAgkFgYSCQEJBIKEgkFAQSCgIJBQEEgoCCQWBxFr3pI+6A2omNyMe6/zuWuX5rXVP+vViKeaZ6fymzWzm/Na6J/0q+svIDqVsZ9ZyfrtWe35DBfkY/XWMh7KJEffLbm/ou4zDfJNvr858O+JrnN9Xqz6/Y7i8+jz6S8nG3LtU4yb6vxa8WvPlyxnnZ086AAAAAAAAAIxzDB81aXbPt3z2pM/l6PZ8y/d1VNiTPouj2fMt392RYU/6ZMe051u+Xfakz+CY9nzLN21mM3/+7EmvN+b/S8h3lz3pcGwUBBIKAgkFgYSCQEJBIKEgkFAQSCgIJBQEEgoCCQWBhIJAQkEgoSCQUBBIKAgkFAQSCgIJe9LrjdnzLd9d9qRPdEx7vuWbNrOZP3/2pNcZu+dbvl32pE90VHu+5dthT/o9Hf2eb/nsSQcAAABm8g/9piLdiLW0aAAAAABJRU5ErkJggg==" + }, + "meh": { + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFn0lEQVR4nO3dMW4UWRAG4OpdbYJMzLIH4ADrAyDuZCfIKSTmTghy7wE4gA3JRohgCXqDGSQs5hWv3d1Dtf19KT2uX2/0e4w0ehUBAAAAlDBk/ziO4/OIOI+I04j4c+HZHyPiKiIuh2F4d5cfUD1fRJxExJOIeBQRfywVbO9rRHyJiE8R8fkuP6D6+VXI1yzIOI4vI+LVwqEOjoqIi2EYXk96UfF8sXtD/1ohzyHXsXvDu1U/vyr5DhZk39y3rX9fwRgRL3p/01TPF7tPjmcr5jnkQ3R+klQ/v0r5fmu84DyOFy72s84mPF8935O1giw0s/r5lcnXKsjpelmapsysnu/RaimWmVn9/Mrka/2JNa6b5bBhGLp+a1TPFxF/rxqk7Z+eh6qfX6V8rU8QIBQEUgoCCQWBhIJAQkEgoSCQUBBIKAgkFAQSCgIJBYGEgkBCQSChIJBQEEgoCCQUBBIKAolWQSbdsbSQmwnPVs/3dbUUy8ysfn5l8rUKcrVikJYpM6vn+7JaimVmVj+/MvlaBbmM3WVaxzLuZ/aqnu/TWkEWmln9/MrkO1iQ/Q1zF3GckN+ufnzf+4Lq+WJ3w+H1SnkOuY4J9/NWP79K+Xourz6L3aVaTxcOdhO7j7U3My83LpsvtnF5ddnzq54PAAAAAAAAAB6en63EKv1ViZBPvrvrypcVpPSe75Dve/LN08zX+rr7SRwvXOxnnUx4Xr7b5Junma9VkOp7vuWbN1O+zpmtglTf8y3fvJnydc5sFWTp/xD1mDJTvnkz5euc6VYTSCgIJBQEEgoCCQWBhIJAQkEgoSCQUBBIKAgkFAQSCgIJBYGEgkBCQSChIJBQEEgoCCQUBBKtglTf8y3fvJnydc5sFaT6nm/55s2Ur3NmqyDV93zLN2+mfJ0zf288/F/s9kc/Xi3ObdcR8e+E5+W7Tb55mvlcXt0m3zwPIR8AAAAAAAAAPDC+atJ27/ON4/g8Is4j4jR2a5eX9DEiriLichiGd3f8Gb/8/OxJ73Pv8o3j+DIiXq0T5/aoiLgYhuH1xNeVOL9WQU4i4tlqcQ77EP2/CeX7UXe+/SfH2/j5XxBLGSPixYRPkjLnZ0/6OjOr5zuP45Uj9rPOJjxf5vzsSV9nZvV8p6ulWGZmmfOzJ32dmdXzLf0f8h5PJzxb5vzcagIJBYGEgkBCQSChIJBQEEgoCCQUBBIKAgkFgYSCQEJBIKEgkFAQSCgIJBQEEgoCCQWBhIJAwp70dWZWzzf1jq8l3Ex4tsz52ZO+zszq+a5WS7HMzDLnZ0/6OjOr57uM3WVuxzLuZ/Yqc36tgnyO3XWMx3Id0+6Xle+2Sfn2NxxexHFK8u3q0fcTXlPm/Fxe3Xbv8+2vID2L3aVuU+6t6nETuz+r3mz58moAAAAAAAAA4Hu+atJmD/k89+L9tSe9jz3k82z2/bUnvZ895PNs8v21J32dmfaQz5tZJp896evMtId83swy+exJX2emPeTzZpbJ51YTSCgIJBQEEgoCCQWBhIJAQkEgoSCQUBBIKAgkFAQSCgIJBYGEgkBCQSChIJBQEEgoCCQUBBL2pK8z0x7yeTPL5LMnfZ2Z9pDPm1kmnz3p68y0h3zezDL57EnvYw/5PJt9f11e3WYP+Tz3/v0FAAAAAAAAgIdn0181sYf83n+V45fn2+yedHvIb9nsHvJEiXyb3JNuD/lBm9xD3lAm31b3pNtDPm+mfJ0zt7on3R7yeTPl65y51T3p9pDPmylf50y3mkBCQSChIJBQEEgoCCQUBBIKAgkFgYSCQEJBIKEgkFAQSCgIJBQEEgoCCQWBhIJAQkEgoSCQ2OqedHvI582Ur3PmVvek20M+b6Z8nTO3uifdHvJ5M+XrnLnJPen2kP9gs3vIG8rkuw+XV9tDvuHLoX+iej4AAADgWP4HgkqdvpUqExIAAAAASUVORK5CYII=" + }, + "tshirt": { + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAACXBIWXMAAAsTAAALEwEAmpwYAAAF1ElEQVR4nO3dMW4UWRAG4OqVSCxyAwfgAMsBLO4ECXIKCdxmN0eQswfYA9jrHDmxxNugx2gtpovu6e6hpvf7UsZTv9rvt0EaXkUAAAAAJXTZH7bWLiLidUS8iIgnC8/+JyK+RMT7rus+HfIG1fNFxOOIOI+Is4h4tFSwnbuIuI2Im4j4esgbVH9+FfINFqS19iYi3i4cau+oiLjsuu7dpC8qni/6b+izFfLscxX9N3y06s+vSr69Bdk19+PQn6+gRcTLsT9pqueL/jfH8xXz7PN3jPxNUv35Vcr328AXvI7jhYvdrFcTXl893/laQRaaWf35lck3VJAX62UZNGVm9Xxnq6VYZmb151cm39Bfsdq6Wfbrum7UT43q+SLi91WDDPtrzIuqP79K+YZ+gwChIJBSEEgoCCQUBBIKAgkFgYSCQEJBIKEgkFAQSCgIJBQEEgoCCQWBhIJAQkEgoSCQUBBIDBVk0h1LC7me8Nrq+e5WS7HMzOrPr0y+oYJ8WTHIkCkzq+e7XS3FMjOrP78y+YYK8j76y7SOpe1mjlU9381aQRaaWf35lcm3tyC7G+Yu4zgh769+/Dz2C6rni/6Gw6uV8uxzFRPu563+/CrlG3N59avoL9V6unCw6+h/rX2Yeblx2XxxGpdXl31+1fMBAAAAAAAAAA+01i5aa3+21q7b8q53730hn3wnl6+19maFUPt8a/1ObPnkO418rW/utyMFvA85usnyyXesfPakjyPfPCebz570dWbKN29mmXz2pE8g3zynmM+tJpBQEEgoCCQUBBIKAgkFgYSCQEJBIKEgkFAQSCgIJBQEEgoCCQWBhIJAQkEgoSCQUBBIKAgk7EkfT755TjKfPenrzJRv3swy+exJH0e+ebaW7/vVj8e43W7O1ZTyyfdL8t2HvGit/dFau1oh2NXuvedebiyffL8kHwAAAAAAAAD8//xsJdbjiDiPiLOIeLTw7LuIuI2Im4j4esgb7D4m8Dr6/XJPlosWEf1Hrr9ExPuu6z4d8gbyzcsXBc5fVpAnEfFs4VBDrmLi/wFo/QfM3q4T5+GoiLjsuu7dpC+S7/uoOCBfFDl/QwV5HBHPV4uz398x8jfJ7iffxzjequAWES/H/iSU78eRMSFfFDp/Q/8f5HzdLLNnltmjPUC+h6bmK3P+hgpytmKQIVNmltmjvcBrl7KlfGXO31BBlv4H0RhTZi79D8oxnk54rXw/mpKvzPlzqwkkFAQSCgIJBYGEgkBCQSChIJBQEEgoCCQUBBIKAgkFgYSCQEJBIKEgkFAQSCgIJBQEEgoCiaGC3B01xfSZZfZoD5DvR1PylTl/QwW5XTHIkCkzy+zRXuC1S9lSvjLnb6ggNysGGTJlZvU92vI9NDVfmfM3VJCv0V/HeCxXMeF+3t0NfZdxnG/y/dWZn8d+gXwPTM4Xhc7fFi6vfhX9pWRT7l0a4zr6vxZ8mHk5tHwnfHk1AAAAAAAAAPBfW/ioSdk93/LZk74Ue9IPt8l8UeT82ZM+zqb2kFfPF4XOnz3p42xtD3n1fGXOnz3p68yUb97MMufPnvTxtrSHvHq+MufPrSaQUBBIKAgkFAQSCgIJBYGEgkBCQSChIJBQEEgoCCQUBBIKAgkFgYSCQEJBIKEgkFAQSCgIJOxJH29Le8ir5ytz/uxJX2emfPNmljl/9qSPs7U95NXzlTl/9qT/3Ob2kFfPF4XO3xYury6751s+e9IBAAAAAAAAYFu28FGTsnu+5bMnfSn2pB9uk/miyPmzJ32cTe0hr54vCp0/e9LH2doe8ur5ypw/e9LXmSnfvJllzp896eNtaQ959Xxlzp9bTSChIJBQEEgoCCQUBBIKAgkFgYSCQEJBIKEgkFAQSCgIJBQEEgoCCQWBhIJAQkEgoSCQUBBI2JM+3pb2kFfPV+b82ZO+zkz55s0sc/7sSR9na3vIq+crc/7sSf+5ze0hr54vCp2/LVxeXXbPt3z2pAMAAAAL+RdTjm3JtMq/IQAAAABJRU5ErkJggg==" + }, + "rollerskate": { + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFyUlEQVR4nO3dMW4USRQG4NcrkVjObTgAF+AAFneCBDmFBG6zmyPIuQAHsNe55cQStcGMQbN2Pbrc3ePq4ftSZub9KvgHjzSuFwEAAAB0YfjNnx9HxElEHEXEs5ln30bETURcRcT1I19Dvgn5SilnEfE2Il5FxOl80SIi4t+I+BYRH4dh+PKYF+ghX1aQ04h4MXOomovYBG4h3y/N+Uop7yLi/TJxdkdFxPkwDB+antRJvlpBjiPi5WKRHvY9xr8Tynff6Hzbd+bP8fufIOZSIuL12P9Jesr3V+UJJ8vmmTxTvmkz38b+/vHFdtabhsd3k69WkKPlslS1zJRv2sxXi6WYZ2Y3+WoFmfsD5RgtM+WbNnPuD7xjPG94bDf5agUBQkEgpSCQUBBIKAgkFAQSCgIJBYGEgkBCQSChIJBQEEgoCCQUBBIKAgkFgYSCQEJBIKEgkKgV5HavKdpnyjdtZusdX3O4bHhsN/lqBblZMEhNy0z5ps38tliKeWZ2k69WkKsFg9S0zJRv2syPsbksbV/KduZY3eSrFeQ6NtdZ7stFtN0vK9+upnzbGwTPYz//CO+u9vw69gk95XN5dd3B59te8fkmNpemtdxbNcZlbH5s+TTx8upu8wEAAAAAAADAn8dXTeoOPl8Pe8gzPeSzJ32cg8vXyx7y6pM6yWdP+ngHk6+nPeQPPrijfPakLzOz93zd7CGv6CafPenLzOw9Xzd7yGd47FzsSZ/okPJ1s4e8opt8bjWBhIJAQkEgoSCQUBBIKAgkFAQSCgIJBYGEgkBCQSChIJBQEEgoCCQUBBIKAgkFgYSCQEJBIGFP+jIze8/XzR7yim7y2ZO+zMze83Wzh3yGx87FnvSJDilfN3vIK7rJZ0/6OAeVr6c95A/pKZ/Lq+sOPl/ve8h7zwcAAAAAAAAA7CilnJVS/imlXJb5XW5f+0w++VaXr5TyboFQD/lRNjux5ZNvHfnKprk/9hTwLuToJssn377y1b7u3s2e6gr5dsk3TfOe9G72VM/w2LnIN80q8z3Y0lLKPn+b66dhGEa9a8j3MPmmeSifW00goSCQUBBIKAgkFAQSCgIJBYGEgkBCQSChIJBQEEgoCCQUBBIKAgkFgYSCQEJBIKEgkFAQSNQK0s2e6gr57pNvmqY96d3sqZ7hsXORb5pV5qsVpJs91RXy7ZJvmtZ8P69+3MftdlOuppRPvifJdxfyrJTydynlYoFgF9vXnnq5sXzyPUk+AAAAAAAAAGBH6XlPtXzyPWW+0vOeavnke8p8paM91fLJ95T57EkfR75pVpvPnvRlZso3bWY3+exJbyDfNGvM51YTSCgIJBQEEgoCCQWBhIJAQkEgoSCQUBBIKAgkFAQSCgIJBYGEgkBCQSChIJBQEEgoCCQUBBL2pI8n3zSrzGdP+jIz5Zs2s5t89qSPI980h5av/z3V8sn3lPnuQp6VjvdUyyffU+YDAAAAAAAAgD/P71ZiHUfESUQcRcSzmWffRsRNRFxFxPVjXmD7NYG3sdkvdzpftIjYfOX6W0R8HIbhyyNfw/mt/PyygpxGxIuZQ9VcROPvAJTNF8zeLxNnd1REnA/D8KHxec5vOypWfH61ghxHxMvF4jzse4x8J9y+832O/a0KLhHxuuGd0Pn9b2Ss9Pxqvw9ysmyWyTO72aNd4fx2rfb8agU5WjBITcvMbvZoVzi/aTO7Ob9aQeb+QDRGy8y5P1CO8bzhsc7vvlWen1tNIKEgkFAQSCgIJBQEEgoCCQWBhIJAQkEgoSCQUBBIKAgkFAQSCgIJBYGEgkBCQSChIJBQEEjUCnK71xTtM7vZo13h/O5b5fnVCnKzYJCalpnd7NGucH7TZnZzfrWCXC0YpKZlZu97tJ3frtWeX60g17G5jnFfLqLhftntDX3nsZ+/5LurM782PMf5/bLq8zuEy6vfxOZSspZ7l8a4jM2PBZ/WfPlyxvlNOz8AAABgj/4DKpNLjifM3PsAAAAASUVORK5CYII=" + }, + "duck": { + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFW0lEQVR4nO3dMXIcVRQF0DdQJC4R27AAFoAXQLEnO6GcQmL2REFuFsACZJwQuRzgYAhGYKZm/tP/+t1Tr0fnpG7p36ruK1tlqW8EAAAAUMLunj+/iYinEfEkIr5Y+OyPEfEhIt5FxPuHfIL9fv9dRLyMiOcR8Wy5aBER8WdEvImI17vd7teHfILq+aL4/Y0C+bKCPIuIrxcO1XIbhxvebb/f/xARP64T5/ioiHi12+1+Gvqg4vmi+P2NIvlaBbmJiG9Wi3PeH9H5lebuK/Mvcf/fgEvZR8T3vV+pq+eL4vc3CuX7rHHx03WzTJ/5Mi738MXdWS8Grq+er/r9LZOvVZAnKwZpGTnz+Wopljmzer7q97dMvlZBlv6GqMfImUt/w9vjq4Frq+erfn/L5GsVBAgFgZSCQEJBIKEgkFAQSCgIJBQEEgoCCQWBhIJAQkEgoSCQUBBIKAgkFAQSCgIJBYGEgkCiVZCPF00xfuboO5aW8Hbg2ur5qt/fMvlaBfmwYpCWkTPfrJZimTOr56t+f8vkaxXk3YpBWkbOfB2Hl6Vdyv7uzF7V81W/v2XytQryPg6vY7yU2xh4f+vdGwRfxWUewn9f7flb7wdUzxfF728UyncNL69+EYeXpo28F6rH2zj8s+XnyZdXl80Xxe9v1M8HAAAAAAAAAI9M+qMm1Xe+5bOTPmFuJ736zrd8n44KO+mzxnbSq+98y3d6ZNhJnzW0k15951u+Y3bS5w3tpFff+ZZv7swyO+QLXLuUoZ306jvf8p2ykz7HTjqMUhBIKAgkFAQSCgIJBYGEgkBCQSChIJBQEEgoCCQUBBIKAgkFgYSCQEJBIKEgkFAQSCgIJFoFqb7zLd8pO+lzhnbSq+98yzd3Zpkd8gWuXcrQTnr1nW/5jtlJn9e/k15951u+I3bS5z1sJ736zrd8dtIn2EkHAAAAAAAAgGH3DU2W/q/+6jvk8m0/X1aQEjvVLdV3yOX7dFRsOF+rIGV2qs+pvkMu3+mRsdF8rd8HKbNT3VB9h1y+Y5vN1ypImZ3qhuo75PLNnVkmX6ul364YJPN7z0X7/f6Sv633n91u1/VVTb7ztpjPW00goSCQUBBIKAgkFAQSCgIJBYGEgkBCQSChIJBQEEgoCCQUBBIKAgkFgYSCQEJBIKEgkFAQSLQKUmanuqH6Drl8pzaZr1WQMjvVDdV3yOWbO7NMvlZByuxUN1TfIZfv2GbztQpSZqf6nOo75PId2XS+a3h5ddkdcvmuOx8AAAAAAAAAPD7X8KMmdr6vNF8UeP7spHccFRve+W5+UPF8UeT5s5PeZ7M732cvLp4vCj1/dtL7bHbnu6F6vjLPn530dc6Ub+7MMs9fqyBLf0PUY+TMpb+h7DHy+wjynRrJV+b581YTSCgIJBQEEgoCCQWBhIJAQkEgoSCQUBBIKAgkFAQSCgIJBYGEgkBCQSChIJBQEEgoCCQUBBJ20vttcue7oXq+Ms+fnfR1zpRv7swyz5+d9D6b3fluqJ6vzPNnJ/1+m975Pqd6vij0/F3Dy6vL7mjLN71DXvr5AwAAAAAAAIDHZ9M/ahLyyfdw172THvL9n3xzmvlaP817E5cLF3dn3QxcL98x+eY08211J12+uTPl6zxzqzvp8s2dKV/nmVvdSZdv7kz5Os/0VhNIKAgkFAQSCgIJBYGEgkBCQSChIJBQEEgoCCQUBBIKAgkFgYSCQEJBIKEgkFAQSCgIJBQEElvdSZdv7kz5Os/c6k66fHNnytd55lZ30uWbO1O+zjM/b1z8dxz2rb9cLc6x24j4a+B6+Y7JN6eZz8ur2+Sb8xjyAQAAAJfyD92s8bBtlgWFAAAAAElFTkSuQmCC" + }, + "house": { + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAACXBIWXMAAAsTAAALEwEAmpwYAAAF90lEQVR4nO3dMW4UWRAG4JqVSJBzGw7ABTiAxZ0gQaSQwG12cwQ5F+AA9jq3nCDxNpgBduR55W5391Btvi9lPPXr0b+NpeFVBAAAAFDC5o4/P4mI04h4HBGPZp79LSJuIuIqIq7v+R6l87XWziPiVUQ8j4iz+aJFRMS/EfElIt5vNptP93yP0ucXBfJlBTmLiKczh+q5iO1f+Bil87XWXkfE22Xi7I+KiDebzebdyK8rfX5RJF+vICcR8WyxOId9jeHfaUrn2/3k+Bh3/4SeS4uIFyN+kpQ+vyiU76/Oi0+XzTJ5ZvV8r+J45YjdrJcjXl/9/Mrk6xXk8YJBesbMrJ7v+WIp5plZ/fzK5OsVZO5fiIYYM7N6vrl/IR/iyYjXVj+/Mvl6BQFCQSClIJBQEEgoCCQUBBIKAgkFgYSCQEJBIKEgkFAQSCgIJBQEEgoCCQWBhIJAQkEgoSCQ6BXk21FTjJ9ZPd/YO6DmcDnitdXPr0y+XkFuFgzSM2Zm9XxfFksxz8zq51cmX68gVwsG6Rkzs3q+97G9zO1Y2m7mUNXPr0y+XkGuY3sd47FcxLj7W0vn291w+CaOU5IfV49+HvE1pc8vCuVzeXXfXJdXv4ztpW5j7q0a4jK2/6z64PLqe5kjHwAAAAAAAAD8YVb9UZPqe8jlW/8e99XuSa++h1y+X6NixXvcV7knvfoecvluj4yV7nFf65706nvI5du32j3ua92TXn0PuXzTZpZ5/ta6J736HnL5blvlHne3mkBCQSChIJBQEEgoCCQUBBIKAgkFgYSCQEJBIKEgkFAQSCgIJBQEEgoCCQWBhIJAQkEgoSCQWOue9Op7yOW7bZV73Ne6J736HnL5ps0s8/ytdU969T3k8u1b7R73Ve5Jr76HXL49q97j/hAury67h1y+B7/HHQAAAAAAAAD4pbV23lr7p7V22eZ3uXvvc/nkW12+1trrBUId8r1td3bLJ9868rVtc78fKeCPkIObLJ98x8rX+7h79T3a8u2Tb5puvl5Bqu/Rlm/aTPkGzjzY0tbaMf+32U+bzWbQdw35DpNvmkP53GoCCQWBhIJAQkEgoSCQUBBIKAgkFAQSCgIJBYGEgkBCQSChIJBQEEgoCCQUBBIKAgkFgYSCQKJXkOp7tOW7Tb5pDubrFaT6Hm35ps2Ub+DMXkGq79GWb59804zN9/Pqx2Pcbjflakr55Pst+X6EPG+t/d1au1gg2MXuvadebiyffL8lHwAAAAAAAAD8ee5aiXUSEacR8TgiHs08+1tE3ETEVURc3+cNdh8TeBXb/XJn80WLiO1Hrr9ExPvNZvPpPm8g37R8UeD5ywpyFhFPZw7VcxEj/w9A237A7O0ycfZHRcSbzWbzbtQXyfdzVNwjXxR5/noFOYmIZ4vFOexrDPxJsvvO9zGOtyq4RcSLod8J5bs9Mkbki0LPX+//g5wum2XyzDJ7tDvk2zc2X5nnr1eQxwsG6Rkzs8we7RleO5eHlK/M89cryNy/EA0xZubcv1AO8WTEa+W7bUy+Ms+fW00goSCQUBBIKAgkFAQSCgIJBYGEgkBCQSChIJBQEEgoCCQUBBIKAgkFgYSCQEJBIKEgkFAQSPQK8u2oKcbPLLNHu0O+28bkK/P89Qpys2CQnjEzy+zRnuG1c3lI+co8f72CXC0YpGfMzOp7tOXbNzZfmeevV5Dr2F7HeCwXMeJ+3t0NfW/iOH/JP67O/Dz0C+TbMzpfFHr+HsLl1S9jeynZmHuXhriM7T8LPky8HFq+FV9eDQAAAAAAAAD830P4qIk9387vPuxJn8mq93z3OL899qRPtNo934c4v4PsSZ9gtXu+O5zfwJn2pC8z0/lNm1nm/OxJH26Ve747nN/AmW41gYSCQEJBIKEgkFAQSCgIJBQEEgoCCQWBhIJAQkEgoSCQUBBIKAgkFAQSCgIJBYGEgkBCQSBhT/pwq9zz3eH8Bs60J32Zmc5v2swy52dP+jCr3fPd4fwGzrQn/W6r3vN9iPO7xZ70e3jwe76dnz3pAAAAsBr/ATSEGnDLtmOQAAAAAElFTkSuQmCC" + }, + "tortoise": { + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAACXBIWXMAAAsTAAALEwEAmpwYAAAF7ElEQVR4nO3dMY5cxRoF4NMgEmuIbVgAG2ABFnuyE+QUErObR44g9wZYwAxOiCwHWKJe0G3z+s3U71tT3c29nu9Lfbv/o5p7etzSnaoEAAAAWIXdR/79KsnjJI+SfHHi2e+SvE3yOsmbe76HfPLd16J8VUGeJPn6xKF6rpP8Mfga+f4h35xuvs86L7jK5cLlMOtq4Hr5jsk3p5uvV5DH58vSNTJTvrmZ8i2c2SvIozMG6RmZKd/cTPkWzuwV5NRfiJYYmSnf3Ez5Fs7sFQSIgkBJQaCgIFBQECgoCBQUBAoKAgUFgYKCQEFBoKAgUFAQKCgIFBQECgoCBQWBgoJAQUGg0CvIu4umGJ8p39xM+RbO7BXk7RmD9IzMlG9upnwLZ/YK8vqMQXpGZso3N1O+hTM/71z8V5KW5MuzxTl2neTPgevlOybfnG4+m1f3yTfnIeQDAAAAAAAAgAdm04+atNaeJnme5Nvsjw0+pT+SvErycrfb/XqfN5BvLl9WcP9t9pz01tr3SX44T5zjUUle7Ha7H4deJN+HUblHvqzk/usV5CrJN2eLc7ffs/A3yeGT75d8/DfgqbQk3y39JJTv9sgM5MuK7r+tnpP+PJf74eYw69nA9fIdG823mvtvq+ekf3u2FKeZKd/czNXcf1s9J/3UXyiX+GrgWvluG8m3mvvPriZQUBAoKAgUFAQKCgIFBYGCgkBBQaCgIFBQECgoCBQUBAoKAgUFgYKCQEFBoKAgUFAQKCgIFLZ6TvrQHloncjNwrXy3jeRbzf231XPSX50txWlmyjc3czX331bPSX+Z/WZkl9IOM5eS79hovtXcf72CvMl+O8ZLuc7A/ryHHfpe5DI/5PdbZ/629AXyHRnOlxXdf5/C5tXPst+UbGTfpSVusv9vwU+Tm0PLt+HNqwEAAAAAAACAxVprT1trP7fWbtrp3Rze+6l88m0uX2vt+zOEusvfbX9mt3zybSNf2zf37wsFfB9ycZPlk+9S+XqPu6/9HG35jsk3p5uvV5C1n6Mt39xM+RbOvLOlrbVL/rXZB7vdbtGnhnx3k2/OXfnsagIFBYGCgkBBQaCgIFBQECgoCBQUBAoKAgUFgYKCQEFBoKAgUFAQKCgIFBQECgoCBQWBgoJAoVeQtZ+jLd9t8s25M1+vIGs/R1u+uZnyLZzZK8jaz9GW75h8c0bzfdj68RK7281sTSmffP9Kvvchn7bW/tNauz5DsOvDe89ubiyffP9KPgAAAAAAAAB4eD52JNZVksdJHiX54sSz3yV5m+R1kjf3eYPDYwLPsz9f7snpoiXZP3L9KsnL3W736z3fw/ptfP2qgjxJ8vWJQ/VcZ/BvANr+AbMfzhPneFSSF7vd7sfB11m/w6hseP16BblK8s3Z4tzt9yz8JDx88v2Syx0V3JJ8N/BJaP3+b2Q2un69vwd5fN4s0zNXc452h/U7ttn16xXk0RmD9IzMXM052h3Wb27matavV5BTfyFaYmTmqb9QLvHVwLXW77ZNrp9dTaCgIFBQECgoCBQUBAoKAgUFgYKCQEFBoKAgUFAQKCgIFBQECgoCBQWBgoJAQUGgoCBQUBAo9Ary7qIpxmeu5hztDut32ybXr1eQt2cM0jMyczXnaHdYv7mZq1m/XkFenzFIz8jMtZ+jbf2ObXb9egV5k/12jJdynYH9ZQ879L3IZX7I77fO/G3gNdbvH5tev09h8+pn2W9KNrLv0hI32f+34Kctb75csX5z6wcAAAAAAAAAD8+mHzWJfPLd36d9Tnrk+1/yzenm6z3Ne5XLhcth1tXA9fIdk29ON99Wz0mXb26mfAtnbvWcdPnmZsq3cOZWz0mXb26mfAtn2tUECgoCBQWBgoJAQUGgoCBQUBAoKAgUFAQKCgIFBYGCgkBBQaCgIFBQECgoCBQUBAoKAgUFgcJWz0mXb26mfAtnbvWcdPnmZsq3cOZWz0mXb26mfAtnft65+K/sz7f+8mxxjl0n+XPgevmOyTenm8/m1X3yzXkI+QAAAIBL+S+Xv8exkeeOeAAAAABJRU5ErkJggg==" + }, + "butterfly": { + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAACXBIWXMAAAsTAAALEwEAmpwYAAAGqElEQVR4nO3dQW5TSRSF4VMtZRJlnsACWAAswGJPyQRlCpOwG5gjmMMCWIBN5lEmkXJ7UM+0on51u8qv6uW6+b9pYt+jio4dhHNLAgAAAAAAISTvi2a2kXQl6Y2ki86zf0n6LukmpfT1kCeInk/SmaRzSaeSTnoFmzxIupd0K+nukCeIfn4R8hULYmbvJL3vHGp2lKTrlNKHpgcFz6f8A305IM+crfIPvFr084uSb7YgU3O/lL4+gEl6W/tKEz2f8jvHq4F55vxU5TtJ9POLlO+vwgOutF44TbMuG74/er7zUUE6zYx+fmHylQryZlyWopaZ0fOdDkvRZ2b08wuTr/Qrlo3NMi+lVPWqET2fpNdDg5T9qPmm6OcXKV/pHQSAKAjgoiCAg4IADgoCOCgI4KAggIOCAA4KAjgoCOCgIICDggAOCgI4KAjgoCCAg4IADgoCOCgI4KAggKNUkKYdS53sGr43er6HYSn6zIx+fmHylQryfWCQkpaZ0fPdD0vRZ2b08wuTr1SQG+VlWmuxaWat6PluRwXpNDP6+YXJN1uQacPctdYJuV/9+K32AdHzKW843A7KM2erhv280c8vUr6a5dWXyku1XnQOtlN+W/u4cLlx2Hw6juXVYc8vej4AAAAAAAAAAAAAAPCEmW3M7LOZ7ay/3fTcG/KR7+jymdm7AaHmPFq+E5t85DuOfJab+7hSwH3I6iaTj3xr5eOe9DrkW+Zo83FP+piZ5Fs2M0w+7klvQL5ljjEfW00ABwUBHBQEcFAQwEFBAAcFARwUBHBQEMBBQQAHBQEcFARwUBDAQUEABwUBHBQEcFAQwEFBAAcFARwUBHBwT3o98i1zlPm4J33MTPItmxkmH/ek1yHfMv+3fL9XP66x3W7Jakryke9Z8u1Dbszsk5ltBwTbTs+9dLkx+cj3LPkAAAAAAAAAAAAAAPjz/NeVWGeSziWdSjrpPPtB0r2kW0l3Bz5H6HzTxxiulO+/u+gXTVL+SPh3STcppa8HPkfo81OAfF5BLiS97ByqZKv2vwEInc/yB+Dej4nzdJSk65TSh8bHhT4/BclXKsiZpFfD4sz7qfpXmtD5pneOL1rvKmOT9LbhnST0+SlQvtLfg5yPzbJ4ZvR8Ye75Loh+fmHylQpyOjBIScvM6PnC3PNdEP38wuQrFaT3P4hqtMyMnq/3P8hrvGj43ujnFyYfW00ABwUBHBQEcFAQwEFBAAcFARwUBHBQEMBBQQAHBQEcFARwUBDAQUEABwUBHBQEcFAQwEFBAAcFARwUBHCUCvKwaor2mdHzhbnnuyD6+YXJVyrI/cAgJS0zo+cLc893QfTzC5OvVJDbgUFKWmZGzxf9nu/o5xcmX6kgd8rrGNeyVdv+1tD5pg2H11qnJPvVo98aHhP6/BQoH8ury3otr75UXurWsreqxk7516qPLK8+SI98AAAAAAAAAAAAAADgH2a2MbPPZraz/nbTc2/IR76jy2dm7waEmvNo+U5x8pHvOPJZbu7jSgH3IaubTD7yrZWv9HH36Pd8k+8p8i1TzFcqSPR7vsm3bCb5KmfOttTM1vxruN9SSlWvGuSbR75l5vKx1QRwUBDAQUEABwUBHBQEcFAQwEFBAAcFARwUBHBQEMBBQQAHBQEcFARwUBDAQUEABwUBHBQEcFAQwEFBAEepINHv+Sbfv5Fvmdl8pYJEv+ebfMtmkq9yZqkg0e/5Jt9T5FumNd/v1Y9rbLdbspqSfOR7lnz7kBsz+2Rm2wHBttNzL11uTD7yPUs+AAAAAAAAAAAAAAD+PO6VWNN/w18p39920Xn2L+VPUN6klL4e8gTR80k6k3Qu6VTSSa9gkwdJ95JuJd0d8gTRzy9CvmJBLH+A633nULOjJF2nlD40PSh4PuUf6MsBeeZs1fg3FNHPL0q+0iWeG0lfSl8fwCS9rX2liZ5P+Z3j1cA8c36q8p0k+vlFysc96XVa852PCtJpZvTzC5OPe9LHzDwdlqLPzOjnFyYf96Q3qM0n6fXQIGU/ar4p+vlFysdWE8BBQQAHBQEcFARwUBDAQUEABwUBHBQEcFAQwEFBAAcFARwUBHBQEMBBQQAHBQEcFARwUBDAQUEABwUBHNyTXq8l38OwFH1mRj+/MPm4J33MzPthKfrMjH5+YfJxT3qd1ny3o4J0mhn9/MLkmy3ItGHuWuuE3K9+/Fb7gOj5lDccbgflmbNVw37e6OcXKV/N8upL5aVaLzoH2ym/rX1cuNw4bD4dx/LqsOcXPR8AAAAAAFjR37pFnk41Gl9cAAAAAElFTkSuQmCC" + }, + "stickfigure": { + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAACXBIWXMAAAsTAAALEwEAmpwYAAAF+UlEQVR4nO3dMW5TWRQG4OORaKL0CSyADbCAiD1Bg9JCA7uZ6RH0bIAFJJM+ShOJO4UdZjL4Ht7LfTbH4ftaHJ9fF/9xIjn3RAAAAAAlrH7y78cRcRIRRxHxZOHZtxFxExFXEXH9wOcona+1dhYRryPiRUScLhctIiL+jogvEfF+tVp9euBzlD6/KJAvK8hpRDxbOFTPRaz/w+cona+19iYi3u4mzv1REXG+Wq3ezfy60ucXRfL1CnIcEc93Fme7rzH9O03pfJt3jo/x83fopbSIeDnjnaT0+UWhfH90Hnyy2yzDM6vnex37K0dsZr2a8fjq51cmX68gRzsM0jNnZvV8L3aWYpmZ1c+vTL5eQZb+hWiKOTOr51v6F/Ipns54bPXzK5OvVxAgFARSCgIJBYGEgkBCQSChIJBQEEgoCCQUBBIKAgkFgYSCQEJBIKEgkFAQSCgIJBQEEgoCiV5BbveaYv7M6vnm3gG1hMsZj61+fmXy9Qpys8MgPXNmVs/3ZWcplplZ/fzK5OsV5GqHQXrmzKye732sL3Pbl7aZOVX18yuTr1eQ61hfx7gvFzHv/tbS+TY3HJ7Hfkpyd/Xo5xlfU/r8olA+l1f3LXV59atYX+o2596qKS5j/WPVB5dXP8gS+QAAAAAAAACAf7XWzlprf7XWLtvyLjfPfSaffAeXr7X2ZgehtvnW1jvF5ZPvMPK1dXO/7SngXcjJTZZPvn3l633cvfqeb/nuk29MN1+vINX3fMs3NlO+iTO3trS1ts+/hvtutVpN+q4h33byjdmWz60mkFAQSCgIJBQEEgoCCQWBhIJAQkEgoSCQUBBIKAgkFAQSCgIJBYGEgkBCQSChIJBQEEgoCCR6Bam+51u+H8k3Zmu+XkGq7/mWb2ymfBNn9gpSfc+3fPfJN2Zuvu9XP+7jdruRqynlk++X5LsLedZa+7O1drGDYBeb5x693Fg++X5JPgAAAAAAAAD4/fxsJdZxRJxExFFEPFl49m1E3ETEVURcP/A5SufbfIzhdaz3350uFy0i1h8J/xIR71er1acHPkfp84sC+bKCnEbEs4VD9VzE/L8BKJ2vrT8A93Y3ce6Piojz1Wr1bubXlT6/KJKvV5DjiHi+szjbfY3p32lK59u8c3yM/a0ybhHxcsY7Senzi0L5en8PcrLbLMMzq+crs+e7o/r5lcnXK8jRDoP0zJlZPV+ZPd8d1c+vTL5eQZb+hWiKOTOr51v6F/Ipns54bPXzK5PPrSaQUBBIKAgkFAQSCgIJBYGEgkBCQSChIJBQEEgoCCQUBBIKAgkFgYSCQEJBIKEgkFAQSCgIJHoFud1rivkzq+crs+e7o/r5lcnXK8jNDoP0zJlZPV+ZPd8d1c+vTL5eQa52GKRnzszq+arv+a5+fmXy9QpyHevrGPflIubd31o63+aGw/PYT0nurh79PONrSp9fFMrn8uq+pS6vfhXrS93m3Fs1xWWsf6z64PLqB1kiHwAAAAAAAAD8Zg76oyb2kDu/AY97T7o95Pc4vzGPa0+6PeRbOb8xj2pPuj3kYzOd38SZh7on3R7ysZnOb+LMQ92Tbg/52EznN3GmW00goSCQUBBIKAgkFAQSCgIJBYGEgkBCQSChIJBQEEgoCCQUBBIKAgkFgYSCQEJBIKEgkFAQSBzqnnR7yMdmOr+JMw91T7o95GMznd/EmYe6J90e8rGZzm/izIPck24P+Q+c35jHuSfdHnLnN8CedAAAAAAAAACYLf2oiT3awx9FkO/A97h3C2KP9j2z95CHfP91sHvctxbEHu2tJu8hD/m2Ocg97r2Pu9ujPTZTvrGZZV5/vYLYoz02U76xmWVef72C2KM9NlO+sZllXn9uNYGEgkBCQSChIJBQEEgoCCQUBBIKAgkFgYSCQEJBIKEgkFAQSCgIJBQEEgoCCQWBhIJAQkEg0SuIPdpjM+Ubm1nm9dcriD3aYzPlG5tZ5vXXK4g92mMz5RubWeb1t7Ug9mj/YNYe8pDv/w52j/uUy6vt0X6kl0NH8XwH8PoDAAAA9uUf0jPoA1IKTsUAAAAASUVORK5CYII=" + }, + "ghost": { + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFt0lEQVR4nO3dMW4USRQG4NcrkVjObTgAF+AAFnfCCXIKCdxmN0eQcwEOYOPccmKJ2mDGXkYz/eh2dc9Uz35fynjer0f/47XWVEUAAAAATej+8OenEXEWEScR8WLi2Q8RcR8RtxFx95w3KKVcRMRlRLyJiPPpokVExM+I+B4Rn7qu+/qcN5CvLl808PxlBTmPiFcTh+pzHauFDlZKeR8RH+aJszkqIq66rvs46ovkexoVz8gXjTx/fQU5jYjXs8XZ7UcM/E6y/uT7En/+DjiVEhFvh34Syrc9Mkbki4aev796Xnw2b5bqmZexv7/cWM96N+L18m0am6+Z56+vICczBukzZuab2VJMM1O+upnNPH99BZn6B6Ihxsyc+gfKIV6OeK1828bka+b56ysIEAoCKQWBhIJAQkEgoSCQUBBIKAgkFAQSCgIJBYGEgkBCQSChIJBQEEgoCCQUBBIKAgkFgURfQR72mmL8zFFnaE3kZsRr5ds2Jl8zz19fQe5nDNJnzMzvs6WYZqZ8dTObef76CnI7Y5A+Y2Z+itVhZPtS1jOHkm/T2HzNPH99BbmL1XGM+3IdI87nXZ/QdxX7+Ut+PDrz29AvkG/D6HzR0PN3DIdXv4vVoWRjzl0a4iZW/1nwufJwaPkWfHg1AAAAAAAAAPC79FdN3KN93Pe4h/39cX+9BXGP9oaju8c97O9pVCT721kQ92jvdDT3uIf9bY2Mnv31/bq7e7TrZtpf3cxm9tdXEPdo1820v7qZzeyvryDu0a6baX91M5vZn1NNIKEgkFAQSCgIJBQEEgoCCQWBhIJAQkEgoSCQUBBIKAgkFAQSCgIJBYGEgkBCQSChIJBQEEj0FcQ92nUz7a9uZjP76yuIe7TrZtpf3cxm9tdXEPdo1820v7qZzexvZ0Hco73lqO5xD/v7Xbq/IYdXu0f7SO9xD/ur3R8AAAAAAAAA8J9SykUp5Z9Syk2Z3s36vS/kk29x+Uop72cItcuvsroTWz75lpGvrJr7a08BH0MObrJ88u0r31LvSZdvk3x1ju6edPnqZso3cObOlpZS9vmvuZ50XTfoU0O+3eSrsyufU00goSCQUBBIKAgkFAQSCgIJBYGEgkBCQSChIJBQEEgoCCQUBBIKAgkFgYSCQEJBIKEgkFAQSCz1nnT5tslX56juSZevbqZ8A2cu9Z50+TbJV2dsvqejH/dxul3N0ZTyyXeQfI8hL0opf5dSrmcIdr1+79rDjeWT7yD5AAAAAAAAAIANpeV7quWT75D5Ssv3VMsn3yHzlYbuqZZPvkPmc0/6MPLVWWw+96TPM1O+upnN5HNP+gjy1VliPqeaQEJBIKEgkFAQSCgIJBQEEgoCCQWBhIJAQkEgoSCQUBBIKAgkFAQSCgIJBYGEgkBCQSChIJBwT/pw8tVZZD73pM8zU766mc3kc0/6MPLVObZ87d9TLZ98h8z3GPKiNHxPtXzyHTIfAAAAAAAAAPz/pFdirf83/GWs7m87n3j2z1j9BuWnruu+PvM9TiPiLCJOIuLFVMHWHiLiPiJuI+LuOW9gf8vfX29ByuoXuD5MHGrnqIi46rru48ivO4+IVzPk2eU6Rv4bBfvbsNj99V3ieRERX/r+fAYlIt6O+CQ8jYjXM+bZ5UcM/CS0v50Wub+l3pN+NleQiWbaX93MZva31HvST2ZLMc1M+6ub2cz++goy9Q9EQ7wc8dqpf6Cceqb91c1sZn9ONYGEgkBCQSChIJBQEEgoCCQUBBIKAgkFgYSCQEJBIKEgkFAQSCgIJBQEEgoCCQWBhIJAQkEgsdR70h9mSzHNTPurm9nM/pZ6T/r9bCmmmWl/dTOb2d9S70m/nSvIRDPtr25mM/vbWZD1CXNXsZ+Qj0c/fhvxNXexOs5yX65jxPmy9rdlsfsbcnj1u1gdqjXm3KUhbmL1be3zkR++bH/Huz8AAABgX/4FumZ97KsUtWoAAAAASUVORK5CYII=" + }, + "sword": { + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE40lEQVR4nO3dMY4UVxQF0NeWnCBysBfgDbAAy3uCBJHaCd6TZedswAsAkyMSgnYwY1mjoS5V86ta7/eckzLwrrq4HiON6lYBAAAALZy+8etPq+pZVT2pqu93vv2lqj5X1ceq+vTAP6N1vvP5/HNVvaqqF1X1fL9oVVX1T1W9q6q3p9Ppzwf+Ga0/v2qQLxXkeVX9uHOoJe/r5oFv0Trf+Xx+XVW/HhPn7qmqenM6nX7b+Ptaf37VJN9SQZ5W1U+Hxfm6v2v9f2la57v9zvFHffs79F7OVfXLhu8krT+/apTvu4UvfnZsluGb3fO9qsuVo25vvdzw9d0/vzb5lgry5MAgS7bc7J7vxWEp9rnZ/fNrk2+pIHv/g2iNLTe759v7H+Rr/LDha7t/fm3yLRUEKAWBSEEgUBAIFAQCBYFAQSBQEAgUBAIFgUBBIFAQCBQEAgWBQEEgUBAIFAQCBYFAQSBYKsiXi6bYfrN7vq3vgNrDhw1f2/3za5NvqSCfDwyyZMvN7vneHZZin5vdP782+ZYK8vHAIEu23Oye723dvMztUs63N9fq/vm1ybdUkE918zrGS3lf297f2jrf7RsO39RlSvLfq0f/2vB7Wn9+1Sifl1cv2+vl1S/r5qVuW95btcaHuvnfqt+9vPpB9sgHAAAAAAAAAI+MHzVZZid9zFU8Xzvp69hJHzPt87WTvp6d9DFTPl876cfctJM+drNNPjvpx9y0kz52s00+O+nH3LSTPnazTT5vNYFAQSBQEAgUBAIFgUBBIFAQCBQEAgWBQEEgUBAIFAQCBYFAQSBQEAgUBAIFgUBBIFAQCOykH3PTTvrYzTb57KQfc9NO+tjNNvnspB9z00762M02+eykr2Mnfcy0z9fLq5fZSR9z9c8XAAAAAAAAAB4fP2qyzE76mKt4vnbS17GTPmba52snfT076WOmfL520o+5aSd97GabfHbSj7lpJ33sZpt8dtKPuWknfexmm3zeagKBgkCgIBAoCAQKAoGCQKAgECgIBAoCgYJAoCAQKAgECgKBgkCgIBAoCAQKAoGCQKAgENhJP+amnfSxm23y2Uk/5qad9LGbbfLZST/mpp30sZtt8tlJX8dO+phpn6+XVy+zkz7m6p8vAAAAAAAAADw+U/+oSfcdcvnm33Gfdie9+w65fP+fqol33KfcSe++Qy7f/ZM16Y77rDvp3XfI5btr2h33WXfSu++Qyzd2s83fv1l30rvvkMt335Q77t5qAoGCQKAgECgIBAoCgYJAoCAQKAgECgKBgkCgIBAoCAQKAoGCQKAgECgIBAoCgYJAoCAQzLqT3n2HXL77ptxxn3UnvfsOuXxjN9v8/Zt1J737Drl8d0274z7lTnr3HXL57ph6x/0aXl7ddodcvqvfcQcAAAAAAACAR2bqHzWp5vnskM//fKfdSa/m+eyQ3zHt851yJ72a57ND/lVTPt9Zd9K757NDPnazTb5Zd9K757NDPnazTb5Zd9K757NDPnazTT5vNYFAQSBQEAgUBAIFgUBBIFAQCBQEAgWBQEEgUBAIFAQCBYFAQSBQEAgUBAIFgUBBIFAQCGbdSe+ezw752M02+WbdSe+ezw752M02+WbdSe+ezw752M02+abcSa/m+eyQ3zPt8/Xy6mVXv+NezT+/6p8PAAAAuJR/ATEXlVHvyECcAAAAAElFTkSuQmCC" + }, + "giraffe": { + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE+UlEQVR4nO3dPY4cVRQF4NtIJBY5PwtgA14AYk92gpxCYvaEIPcGWICNc+TEQRP0IGs09U6/mqqy3+v5vtRj36PSnBEW7TpVAAAAwBBO6RfP5/NPVfWyqp5X1Xc73/6nqt5U1evT6fTnY/6A0fNV1TdV9W1VPauqr/cKdudjVX2oqvdV9e8j/wz5ruRrFuR8Pv9SVb/uHGrxVFW9Op1Ov636TYPnq0thfzggz5K3dSn0GvJ90sy3WJC7n8x/tH79AOeq+rn3J/Xo+eryk+/HA/Ms+bv6f1LL99Bivq8aX/yyPt83X93derHi60fP9+1RQXa6KV/nzVZBnh8YpGXNzdHzPTssxT435eu82SrI3n/h7fH9iq8dPd/ef6Hc+6Z8nTdbBQFKQSBSEAgUBAIFgUBBIFAQCBQEAgWBQEEgUBAIFAQCBYFAQSBQEAgUBAIFgUBBIFAQCFoFWfsOoz28W/G1o+f7eFiKfW7K13mzVZA3BwZpWXNz9HwfDkuxz035Om+2CvK6Li9L+1zOdzd7jZ7v/VFBdropX+fNxYLcvUHwVX2eb8L/X+35V+9vGD1fXd7Q9/agPEve1rr338p3XzNfz8urX9TlpWlr3gvV411d/rPl940vrx42Xw3w8uUr5NuWDwAAAAAAAACemGtDmEP/r3476Tf/UY4vni8VZIid6hY76fdMu0MeDJGvVZBhdqqX2ElfNOUOecMw+Vr/HmSYneoGO+nbbsrXebNVkGF2qhvspG+7KV/nzVZBhtmpbrCTvu2mfJ03vdUEAgWBQEEgUBAIFAQCBYFAQSBQEAgUBAIFgUBBIFAQCBQEAgWBQEEgUBAIFAQCBYFAQSBoFWSYneoGO+nbbsrXebNVkGF2qhvspG+7KV/nzVZBhtmpbrCTvu2mfJ03WwUZZqd6iZ30B6bdIW8YJt8tvLzaTvrEL4e+YvR8AAAAAAAAAPDE3MJHTeyk3+5HOb54PjvpHafKTvpW0+azk97HTvp2U+azk97HTvp2U+azk37MzdGfn3ydN+2k97OTvs2U+bzVBAIFgUBBIFAQCBQEAgWBQEEgUBAIFAQCBYFAQSBQEAgUBAIFgUBBIFAQCBQEAgWBQEEgsJPez076NlPms5N+zM3Rn598nTftpPexk77dlPnspF9nJ327afPdwsur7aRP/HLoK0bPBwAAAAAAAABPzC181GTYnXT55t+Zt5PecaoesZMu36dTNfHOvJ30Pqt20uV7eLIm3Zm3k95n7U66fPdNuzNvJ/2Ym/JtuznM95+d9H5r/r2JfA9NuTPvrSYQKAgECgKBgkCgIBAoCAQKAoGCQKAgECgIBAoCgYJAoCAQKAgECgKBgkCgIBAoCAQKAoGd9H5rdtLle2jKnXk76cfclG/bzWG+/+yk91m7ky7ffdPuzNtJv271Trp890y9M38LL68ediddvpvfmQcAAAAAAACAJ+YWPmpi59vzeww76TuZeue7xfO7x076RtPufC/x/BbZSd9g2p3vBs+v86ad9GNuen7bbg7z/Oyk95ty57vB8+u86a0mECgIBAoCgYJAoCAQKAgECgKBgkCgIBAoCAQKAoGCQKAgECgIBAoCgYJAoCAQKAgECgKBnfR+U+58N3h+nTftpB9z0/PbdnOY52cnvc+0O98Nnl/nTTvp1029873E83vATvoj3PzOt+dnJx0AAACm8R/nWLbllDXkpAAAAABJRU5ErkJggg==" + }, + "skull": { + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAACXBIWXMAAAsTAAALEwEAmpwYAAAF/klEQVR4nO3dMW4cVxYF0NsDOBGUS/YCvAEvQPCepMRQaifybmZyw861AS+AtHJBiQDXBE1x1Oj+j/VZVe3PmnNSNfkuiv+SItD8LwEAAACGcHjg358neZHkWZJvVp79OcmnJB+SfHzMJ5im6VWSN0l+SPJyvWhJkr+SvE/y7nA4/P6YTyDfsnwZ4PxVBXmZ5LuVQ7Xc5PhAZ5um6ackP28T53RUkreHw+GXrg+S735UHpEvg5y/VkGeJ/l+sziX/ZmZP0nuvvP9lod/Aq5lSvLj3O+E8p2PTEe+DHT+/tV48Yttsyye+SbX++LmbtbrjtfLd6o33zDnr1WQZxsGaemZ+cNmKdaZKd+ymcOcv1ZB1v6FaI6emWv/QjnHtx2vle9cT75hzl+rIEAUBEoKAgUFgYKCQEFBoKAgUFAQKCgIFBQECgoCBQWBgoJAQUGgoCBQUBAoKAgUFAQKCgKFVkE+XzVF/8yuO7RWctvxWvnO9eQb5vy1CvJpwyAtPTPfb5ZinZnyLZs5zPlrFeTDhkFaema+y/EysmuZ7mbOJd+p3nzDnL9WQT7meB3jtdyk437euxv63uY6X+QvV2f+MfcD5DvRnS8Dnb89XF79OsdLyXruXZrjNsf/Fvy68HJo+Z7w5dUAAAAAAAAAwNfKt5rYo73vPe7x/B58fs2C2KN9Ynd73OP53Y9K8fwuFsQe7Yt2s8c9nt/ZyDSeX+vt7vZoL5vp+S2bOczzaxXEHu1lMz2/ZTOHeX6tgtijvWym57ds5jDPz60mUFAQKCgIFBQECgoCBQWBgoJAQUGgoCBQUBAoKAgUFAQKCgIFBYGCgkBBQaCgIFBQECgoCBRaBbFHe9lMz2/ZzGGeX6sg9mgvm+n5LZs5zPNrFcQe7WUzPb9lM4d5fhcLYo/2mV3tcY/n97Xy+c25vNoe7Z3ucY/nt/T5AQAAAAAAAAD/M03Tq2ma/jNN0+20vtu7z/1KPvmeXL5pmn7aINQlf0/Hndjyyfc08k3H5v59pYBfQs5usnzyXSvfU92TLt8p+ZbZ3Z50+ZbNlG/mzIstnabpmn/Nde9wOMz6riHfZfItcymfW02goCBQUBAoKAgUFAQKCgIFBYGCgkBBQaCgIFBQECgoCBQUBAoKAgUFgYKCQEFBoKAgUFAQKDzVPenynZNvmV3tSZdv2Uz5Zs58qnvS5Tsl3zK9+e6vfrzG7XZLrqaUT75/JN+XkK+mafr3NE03GwS7ufvcSy83lk++fyQfAAAAAAAAAPz/eWgl1vMkL5I8S/LNyrM/J/mU5EOSj4/5BHdvE3iT4365l+tFS3J8y/X7JO8Oh8Pvj/kE8i3LlwHOX1WQl0m+WzlUy006/wZgOr7B7Odt4pyOSvL2cDj80vVB8t2PyiPyZZDz1yrI8yTfbxbnsj8z8yfJ3Xe+33K9VcFTkh/nfieU73xkOvJloPPX+nuQF9tmWTxzmD3aDfKd6s03zPlrFeTZhkFaemYOs0d7hdeuZU/5hjl/rYKs/QvRHD0z1/6Fco5vO14r37mefMOcP7eaQEFBoKAgUFAQKCgIFBQECgoCBQWBgoJAQUGgoCBQUBAoKAgUFAQKCgIFBYGCgkBBQaCgIFBoFeTzVVP0zxxmj3aDfOd68g1z/loF+bRhkJaemcPs0V7htWvZU75hzl+rIB82DNLSM3P0PdrynerNN8z5axXkY47XMV7LTTru5727oe9trvNF/nJ15h9zP0C+E935MtD528Pl1a9zvJSs596lOW5z/G/Brwsvh5bvCV9eDQAAAAAAAAB8bQ9vNRl2z7d89qSvxZ70x9tlvgxy/uxJn2dXe8hHz5eBzp896fPsbQ/56PmGOX/2pG8zU75lM4c5f/akz7enPeSj5xvm/LnVBAoKAgUFgYKCQEFBoKAgUFAQKCgIFBQECgoCBQWBgoJAQUGgoCBQUBAoKAgUFAQKCgIFBYGCPenz7WkP+ej5hjl/9qRvM1O+ZTOHOX/2pM+ztz3ko+cb5vzZk/6w3e0hHz1fBjp/e7i8etg93/LZkw4AAACs5L+H4EzOKL34ywAAAABJRU5ErkJggg==" + }, + "umbrella": { + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAACXBIWXMAAAsTAAALEwEAmpwYAAAF40lEQVR4nO3dQW4TSRQG4NcjsYmyT+AAXIADRNwJNihb2MBtZvYI9lyAAySTfZRNJGoWdpix7Hp0pdqm4vm+Lbbfr07/NpGcehEAAADAEKZf/PtpRJxFxElEPFt49n1E3EXETUTcPuYFSikXEfE2Il5FxPly0SIi4u+I+BYRH6dp+vKYF5CvL18McP9lBTmPiBcLh6q5itUFna2U8i4i3u8nzuaoiLicpulD05Pk+zkqHpEvBrn/agU5jYiXe4uz2/eY+Umyfuf7HL/+BFxKiYjXc98J5dseGQ35YqD774/Kg8/2m6V75ts43A831rPeNDxevk2t+Ya5/2oFOdljkJqWma/2lmKZmfL1zRzm/qsVZOlfiOZombn0L5RzPG94rHzbWvINc//VCgKEgkBKQSChIJBQEEgoCCQUBBIKAgkFgYSCQEJBIKEgkFAQSCgIJBQEEgoCCQWBhIJAQkEgUSvI/UFTtM9sOkNrIdcNj5VvW0u+Ye6/WkHu9hikpmXmt72lWGamfH0zh7n/agW52WOQmpaZH2N1GNmhlPXMueTb1JpvmPuvVpDbWB3HeChX0XA+7/qEvss4zA/54ejMr3OfIN+G5nwx0P13DIdXv4nVoWQt5y7NcR2r/xZ86jwcWr4nfHg1AAAAAAAAADBbKeWilPJXKeW6LO96/doX8sn35PKVUt7tIdQuP8pqZ7d88j2NfGXV3B8HCvgQcnaT5ZPvUPlqX3cffY+2fJvk61PNVyvI6Hu05eubKd/MmTtbWko55F+b/TRN06x3Dfl2k6/PrnxONYGEgkBCQSChIJBQEEgoCCQUBBIKAgkFgYSCQEJBIKEgkFAQSCgIJBQEEgoCCQWBhIJAQkEgUSvI6Hu05dsmX5+d+WoFGX2Ptnx9M+WbObNWkNH3aMu3Sb4+rfl+Hv14iNPteo6mlE++35LvIeRFKeXPUsrVHoJdrV+793Bj+eT7LfkAAAAAAAAA4P/nVyuxTiPiLCJOIuLZwrPvI+IuIm4i4vaRrzF0vvXXGN7Gav/d+XLRImL1lfBvEfFxmqYvj3yNoa9fDJAvK8h5RLxYOFTNVbT/DcDQ+crqC3Dv9xNnc1REXE7T9KHxeUNfvxgkX60gpxHxcm9xdvse899phs63/uT4HIdbZVwi4nXDJ8nQ1y8Gylf7e5Cz/Wbpnjl6vmH2fFeMfv2GyVcryMkeg9S0zBw93zB7vitGv37D5KsVZOlfiOZomTl6vqV/IZ/jecNjR79+w+RzqgkkFAQSCgIJBYGEgkBCQSChIJBQEEgoCCQUBBIKAgkFgYSCQEJBIKEgkFAQSCgIJBQEEgoCiVpB7g+aon3m6PmG2fNdMfr1GyZfrSB3ewxS0zJz9HzD7PmuGP36DZOvVpCbPQapaZk5er7R93yPfv2GyVcryG2sjmM8lKtoO7916HzrEw4v4zAleTh69GvDc4a+fjFQPodX1y11ePWbWB3q1nJu1RzXsfpv1SeHVz/KEvkAAAAAAAAA4H8m/aqJPd/2pHc4iq+aVAtiz/cGe9L7HNeedHu+d7Invc9R7Um357tvpuvXN3OYfLWC2PPdN9P165s5TL5aQez57pvp+vXNHCafU00goSCQUBBIKAgkFAQSCgIJBYGEgkBCQSChIJBQEEgoCCQUBBIKAgkFgYSCQEJBIKEgkFAQSNQKYs9330zXr2/mMPlqBbHnu2+m69c3c5h8tYLY89030/XrmzlMvp0Fsed7iz3pfY5zT7o93/akdziKw6sBAAAAAAAAgP960nvS5bMnvcNx70mX799RYU96r+Paky7f9siwJ73XUe1Jl2+TPen9jmpPunx9M4fZQ77AY5dyVHvS5dtmT3ofe9KhlYJAQkEgoSCQUBBIKAgkFAQSCgIJBYGEgkBCQSChIJBQEEgoCCQUBBIKAgkFgYSCQEJBIPFU96TLt82e9D5HtSddvr6Zw+whX+CxSzmqPenybbInvd/x7EmXb4M96f2Oc0+6fPakd7AnHQAAAJ6SfwCf6hpwMVaGmQAAAABJRU5ErkJggg==" + }, + "snake": { + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFE0lEQVR4nO3dMY5bVRQG4GMQTTTUARbAAsgCIvaUNCgtNGFPCPqwABYwIQ1VlCIpTGHDYOx75r6571nnvfm+djxzfl35t8aSfU8EAAAAUMIu++F+v38eES8j4llEfDXz7D8j4k1EvN7tdr8+5A9UzxcRNxHxNCKeRMQXcwU7+hQRHyLiXUS8f+DfkO+efM2C7Pf7HyLix5lDXRwVEa92u91Pk36peL44FPabBfJcchuHQk8h351mvosFOb4y/9L6+QL2EfF97yt19XxxeOX7dsE8l/wR/a/U8p27mO+zxoNfxvWefHGc9WLC46vne7pUkJlmytc5s1WQZwsGaZkys3q+J4ulmGemfJ0zWwWZ+w1vj68nPLZ6vrnfUM49U77Oma2CAKEgkFIQSCgIJBQEEgoCCQWBhIJAQkEgoSCQUBBIKAgkFAQSCgIJBYGEgkBCQSChIJBQEEi0CjL1DqM5vJ3w2Or5Pi2WYp6Z8nXObBXkzYJBWqbMrJ7vw2Ip5pkpX+fMVkFex+GytGvZH2f2qp7v3VJBZpopX+fMiwU53iD4Kq7zJPznas/fen+her443NB3u1CeS25j2v238p1q5uu5vPpFHC5Nm3IvVI+3cfi35efBy6vL5osCly/fQ76xfAAAAAAAAADwyNiT3rb5PenVz69CPnvSO0bFBvekVz+/KvnsSe+zqT3p1c+vUj570vtsbU969fMrk8+e9GVmltnz3VD9/Mrka/2Ldc1v6/1rt9t1vWpUzxcR3y0apO33ngdVP79K+dxqAgkFgYSCQEJBIKEgkFAQSCgIJBQEEgoCCQWBhIJAQkEgoSCQUBBIKAgkFAQSCgIJBYGEgkDCnvR+W9qTXv38yuSzJ32ZmWX2fDdUP78y+exJ77O1PenVz69MPnvS77e5PenVz69SPnvS2za/J736+VXPBwAAAAAAAACPz30rsdbwUYmye77D+a3+/LKC2PN9HBX2pI9Y9fm1CmLP9/9Ghj3pI1Z7fq3vg9jzfcqe9DGrPb9WQez5Hpvp/MZmljm/VkHmfkPUY8rMud9Q9pjyfQTnd26V5+dWE0goCCQUBBIKAgkFgYSCQEJBIKEgkFAQSCgIJBQEEgoCCQWBhIJAQkEgoSCQUBBIKAgkFAQSrYLY833OnvQxqzy/VkHs+R6b6fzGZpY5v1ZB7Pk+ZU/6mNWeX6sg9nzfsSd9zKrPbwuXV1feo+38Nnx+AAAAAAAAAPD4bOGjJmX3fMtnT/pcNrfnW767UWFP+iw2s+dbvvORYU/6sC3t+ZbvlD3pM9jSnm/5xmaWef7Zk95vyvcl5DtnTzpsjYJAQkEgoSCQUBBIKAgkFAQSCgIJBYGEgkBCQSChIJBQEEgoCCQUBBIKAgkFgYSCQEJBIGFPer8pe77lO2dP+qAt7fmWb2xmmeefPel9pu75lu+UPemDNrXnW74T9qQ/0Ob3fMtnTzoAAAAAAAAAbMuqP2oS8sn3cNvekx7y/Zd8Y5r5Wp/mvYnrhYvjrJsJj5fvlHxjmvnWuiddvrGZ8nXOXOuedPnGZsrXOXOte9LlG5spX+dMt5pAQkEgoSCQUBBIKAgkFAQSCgIJBYGEgkBCQSChIJBQEEgoCCQUBBIKAgkFgYSCQEJBIKEgkFjrnnT5xmbK1zlzrXvS5RubKV/nzLXuSZdvbKZ8nTM/bzz4Yxz2W3+5WJxTtxHx14THy3dKvjHNfC6vbpNvzGPIBwAAAFzL3/Yj4OZvgj/VAAAAAElFTkSuQmCC" + }, + "rabbit": { + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE50lEQVR4nO3dTW4UVxQF4FuRMkHMIVlAFgALiLInmERMkwnZU5TMYQFZAD9zxIRBZ2AH3O5+J1V+Va3Xpe8bGtv36prTsiW7ThUAAAAwhCn94+Fw+LmqXlbV86p6uvLsD1X1pqpeT9P01wM/x+OqelJVj6rq+7UWu/Wlqj5X1ceq+vSQT+B+fferAfZrBuRwOPxaVb+tvNTZUVX1apqm3xd+3NOq+nGDfc55Vzf/IWdzvyOL71eD7Hc2ILevfH+2/n0Dh6r6ZcEr4eOq+mnDfc75p2a+ErrfWbPvVwPt913jnV/W5b64dTvrxYL3f7LVIivNdL++mcPs1wrI8w0XaVky89FmW6wz0/36Zg6zXysga/9AOccPC9537R/Y1p7pfn0zh9mvFRCgBAQiAYFAQCAQEAgEBAIBgUBAIBAQCAQEAgGBQEAgEBAIBAQCAYFAQCAQEAgEBAIBgaAVkKXPMFrD+wXv+2WzLdaZ6X59M4fZrxWQNxsu0rJk5ufNtlhnpvv1zRxmv1ZAXtfNw8gu5XA7c66PWy2y0kz365s5zH5nA3L7hL5XdZkv8n+Pzvx7wcd8qpvHRV7Ku1rwfFn3O7HofjXQfnMeXv2ibh5KtuS5S3O8r5tvC/7Y68OX3e/6H14NAAAAAAAAANylJ71NT3qfXfyqiZ70efSk99GT3mlXPd/ud5ae9A576/l2v76Zw+ynJ32bme7XN3OY/fSkbzPT/fpmDrOfp5pAICAQCAgEAgKBgEAgIBAICAQCAoGAQCAgEAgIBAICgYBAICAQCAgEAgKBgEAgIBAICAR60reZ6X59M4fZT0/6NjPdr2/mMPvpSd9mpvv1zRxmPz3p8+hJ76Mn/QF23/Ptftf/8GoAAAAAAAAA4K6r7km33773qwF+1eRqe9Lt921U7XC/0pN+PLIW9Hzb73Rk7Wi/0pN+YmnPt/2O7W0/PemdM+3XN3P0/YbpSW99i3XJv4b7apqmWa9q9jtvL/tV1bNNF2l7e/8NnmoCgYBAICAQCAgEAgKBgEAgIBAICAQCAoGAQCAgEAgIBAICgYBAICAQCAgEAgKBgEAgIBBca0+6/U7taT896Z0z7dc3c/T99KTfs7Tn237H9rafnvQ7Fvd82+/I7vYrPelVtULPt/32vV8N8PBqAAAAAAAAAOAuPeltu+j5TtxPT/oarrrnu8X9juhJ73S1Pd/nuN9ZetI7XG3Pd4P7zZypJ32bmcP0fDe438yZrYCs/QPbHEv+HmH0/db+gXLtme43c6anmkAgIBAICAQCAoGAQCAgEAgIBAICgYBAICAQCAgEAgKBgEAgIBAICAQCAoGAQCAgEAgIBHrS57vKnu8G95s5U0/6NjOH6flucL+ZM/Wkz3O1Pd8N7jdzpp70/3fVPd/nuN8JPekPsPueb/fTkw4AAAAAAAAAy+hJb7NfHz3pK9llT7r9vo0qPenddtWTbr/TkaUnvcveetLtd0xP+gr21JNuv76Zw/Skt77FuuRfm301TdOsVzX7nbeX/arq2aaLtL29/wZPNYFAQCAQEAgEBAIBgUBAIBAQCAQEAgGBQEAgEBAIBAQCAYFAQCAQEAgEBAIBgUBAIBAQCPSkz2e/PnrSO+2pJ91+fTP1pN+zt550+x3Tk95hdz3p9juiJ/2Bdt+Tbj896QAAAMBK/gVsdTwSu+HRwQAAAABJRU5ErkJggg==" + }, + "cow": { + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAACXBIWXMAAAsTAAALEwEAmpwYAAAF2klEQVR4nO3dMW4USRQG4NcrkVjObTgAF+AAFneCBDmFBG6zmyPIuQAHsNe55cQStcGMYUeeftvl6h6qZ78vZWbeL0/9NpbG9SIAAACALgzZP5ZSLiLibUS8iojzmWf/HRHfIuLjMAxfnvgapxFxFhEnEfFsrmBb9xFxFxE3EXH7xNeQryFfD+dvtCCllHcR8X7mUHtHRcTlMAwfKp93HhEvFsizz1VsvqA15PulOl8v529vQbbN/Tz27wsoEfG64ifJaUS8XDDPPt9j+ndC+R6bnK+n8/fHyBPexuHCxXbWm4rHny0VZKaZ8rXN7Ob8jRXk1XJZRtXMPFksxTwz5Wub2c35GyvI3L8QTfG84rFz/0I590z52mZ2c/7GCgKEgkBKQSChIJBQEEgoCCQUBBIKAgkFgYSCQEJBIKEgkFAQSCgIJBQEEgoCCQWBhIJAQkEgMVaQ2juW5nBd8dj7xVLMM1O+tpndnL+xgnxbMMiYmpl3i6WYZ6Z8bTO7OX9jBfkYm8u0DqVsZ051s1SQmWbK1zazm/O3tyDbG+Yu4zAhH65+/FrxnNvYXGd5KFdRd7+sfLuq8vV0/qZcXv0mNpdq1dxbNcV1bH6sfXJ59ZMcfb4VnD8AAAAAAAAA+J+xJ33c0X+UIzrP18P5syd9mqPbQx6d5+vl/NmTPt3R7CGPzvP1dP7sSV9mpnxtM7s5f/akLzNTvraZ3Zw/e9KXmSlf28xuzp9bTSChIJBQEEgoCCQUBBIKAgkFgYSCQEJBIKEgkFAQSCgIJBQEEgoCCQWBhIJAQkEgoSCQUBBI2JO+zEz52mZ2c/7sSV9mpnxtM7s5f/akLzNTvraZ3Zw/e9KnOao95NF5vp7Onz3p447+cujoPN8Kzh8AAAAAAAAA8Esp5aKU8lcp5brM73r72hfyybe6fKWUdwuE2udH2ezElk++deQrm+b+OFDAh5CTmyyffIfKt9Y96fLtkq/N0e1Jl69tpnwTZ+5taSnlkH/N9dMwDJO+a8i3n3xt9uVzqwkkFAQSCgIJBYGEgkBCQSChIJBQEEgoCCQUBBIKAgkFgYSCQEJBIKEgkFAQSCgIJBQEEgoCibXuSZfvMfnaHNWedPnaZso3ceZa96TLt0u+NrX5fl79eIjb7VquppRPvt+S7yHkRSnlz1LK1QLBrrav3Xq5sXzy/ZZ8AAAAAAAAAPD/818rsU4j4iwiTiLi2cyz7yPiLiJuIuL2KS+w/ZjA29jslzufL1pEbD5y/S0iPg7D8OUpLyBfW77o4PxlBTmPiBczhxpzFZV/A1A2HzB7v0yc3VERcTkMw4eqJ8n3c1Q8IV90cv7GCnIaES8Xi7Pf95j4k2T7ne9zHG5VcImI11O/E8r3eGRU5IuOzt/Y34OcLZuleWY3e7RHyLerNl8352+sICcLBhlTM7ObPdozPHYux5Svm/M3VpC5fyGaombm3L9QTvG84rHyPVaTr5vz51YTSCgIJBQEEgoCCQWBhIJAQkEgoSCQUBBIKAgkFAQSCgIJBYGEgkBCQSChIJBQEEgoCCQUBBJjBbk/aIr6md3s0R4h32M1+bo5f2MFuVswyJiamd3s0Z7hsXM5pnzdnL+xgtwsGGRMzcze92jLt6s2Xzfnb6wgt7G5jvFQrqLift7tDX2XcZg3+eHqzK9TnyDfjup80dH5O4bLq9/E5lKymnuXpriOzX8LPjVeDi3fii+vBgAAAAAAAAD+bdUfNYnO89lDvv73d7V70qPzfPaQ71jt+7vKPenReT57yPda5fu71j3pveezh7xtZjf51ronvfd89pC3zewm31r3pPeezx7ytpnd5HOrCSQUBBIKAgkFgYSCQEJBIKEgkFAQSCgIJBQEEgoCCQWBhIJAQkEgoSCQUBBIKAgkFAQSCgKJte5J7z2fPeRtM7vJt9Y96b3ns4e8bWY3+da6J733fPaQt83sJt8q96RH5/nsIX9kte+vy6vHHf0e9+j86xf95wMAAAAO5R/MoQmmFihqmAAAAABJRU5ErkJggg==" + }, + "quarternote": { + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE8ElEQVR4nO3dQY4VZRQF4PtMnBDmoAtwAyzAuCeYEKY6wT0ZnbMBFwAyJ0wYPAfdxnTaOl3V/1/P+4rvm1pwT97LAUk6daoAAACAFk4P/PenVfWsqp5U1beTb3+pqs9V9bGqPj3y92id73w+/1hVr6rqRVU9nxetqqr+qqp3VfX2dDr9/sjfo/XnVw3ypYI8r6rvJ4da8r5uvvAtWuc7n8+vq+rnfeLcPVVVb06n0y8bf13rz6+a5FsqyNOq+mG3OP/tz1r/J03rfLd/c/xWD/8NPcu5qn7a8DdJ68+vGuX7ZuHhZ/tmGb7ZPd+rulw56vbWyw3Pd//82uRbKsiTHYMs2XKze74Xu6WYc7P759cm31JBZv+DaI0tN7vnm/0P8jW+2/Bs98+vTb6lggClIBApCAQKAoGCQKAgECgIBAoCgYJAoCAQKAgECgKBgkCgIBAoCAQKAoGCQKAgECgIBEsF+XLRFNtvds+39R1QM3zY8Gz3z69NvqWCfN4xyJItN7vne7dbijk3u39+bfItFeTjjkGWbLnZPd/bunmZ26Wcb2+u1f3za5NvqSCf6uZ1jJfyvra9v7V1vts3HL6py5Tkn1eP/rHh17T+/KpRPi+vXjbr5dUv6+alblveW7XGh7r536pfvbz6UWbkAwAAAAAAAICvjB81WWYnfcwhvl876evYSR9ztd+vnfT17KSPucrv1076PjftpI/dbJPPTvo+N+2kj91sk89O+j437aSP3WyTz1tNIFAQCBQEAgWBQEEgUBAIFAQCBYFAQSBQEAgUBAIFgUBBIFAQCBQEAgWBQEEgUBAIFAQCO+n73LSTPnazTT476fvctJM+drNNPjvp+9y0kz52s00+O+nr2Ekfc7Xfr5dXL7OTPubw3y8AAAAAAAAAfH38qMkyO+ljDvH92klfx076mKv9fu2kr2cnfcxVfr920ve5aSd97GabfHbS97lpJ33sZpt8dtL3uWknfexmm3zeagKBgkCgIBAoCAQKAoGCQKAgECgIBAoCgYJAoCAQKAgECgKBgkCgIBAoCAQKAoGCQKAgENhJ3+emnfSxm23y2Unf56ad9LGbbfLZSd/npp30sZtt8tlJX8dO+pir/X69vHqZnfQxh/9+AQAAAAAAAODrE3/UpPvOt3x20geM7aR33/mW799TZSd91Lad9O473/LdP1l20kdt2knvvvMt31120sdt2knvvvMt39jNNjvkE56dZdNOevedb/nus5M+xk46bKUgECgIBAoCgYJAoCAQKAgECgKBgkCgIBAoCAQKAoGCQKAgECgIBAoCgYJAoCAQKAgESwXpvvMt33120sds2knvvvMt39jNNjvkE56dZdNOevedb/nuspM+bv1Oevedb/nusJM+7nE76d13vuWzkz7ATjoAAAAAAAAAbGYnfdnh81X/H+X43/PZSV9xqg6Yr5rskAct8tlJX+dQ+arRDvmCNvnspK9ztHxtdsgnPDuLnfRBR8rXZod8wrOz2EkfdKR8bXbIJzw7i5102EpBIFAQCBQEAgWBQEEgUBAIFAQCBYFAQSBQEAgUBAIFgUBBIFAQCBQEAgWBQEEgUBAI7KSvd6R8bXbIJzw7i530QUfK12aHfMKzs9hJH3C0fG12yCc8O4ud9Ec6XL5qtEO+oE0+O+nLDp+vGrwc+gHd8wEAAACX8jdzZLbl0C/0iwAAAABJRU5ErkJggg==" + }, + "eigthnote": { + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFM0lEQVR4nO3dQY4VVRgF4P+ZOCHMQRfgBliAcU8wMUx1gnsyOmcDLgBkTpgweA66JXa6799V/W61J5fvm1pwT27lgCSdOlUAAABAhNM9//1pVT2rqidV9e3ksz9X1aeq+lBVHx/4e0TnO5/PP1bVq6p6UVXP50Wrqqq/q+ptVb05nU5/PPD3iL6/CsjXFeR5VX0/OdTIu7p64XtE5zufzz9X1S/HxLl5VFW9Pp1Ov+78ddH3VyH5RgV5WlU/HBbnbn/V9j9povNd/83xe93/N/Qs56r6acffJNH3V0H5vhk8/OzYLBefmZ7vVT1eOer6rJc7nk+/v5h8o4I8OTDIyJ4z0/O9OCzFnDPT7y8m36ggs/9BtMWeM9Pzzf4H+Rbf7Xg2/f5i8o0KApSCQEtBoKEg0FAQaCgINBQEGgoCDQWBhoJAQ0GgoSDQUBBoKAg0FAQaCgINBYGGgkBDQaAxKsjnR02x/8z0fHu/ATXD+x3Ppt9fTL5RQT4dGGRkz5np+d4elmLOmen3F5NvVJAPBwYZ2XNmer43dfUxt8dyvj5zq/T7i8k3KsjHuvoc42N5V/u+3xqd7/oLh6/rcUry76dH/9zxa6Lvr4Ly+Xj12KyPV7+sq4+67flu1Rbv6+p/q37z8eoHmZEPAAAAAAAAAL4yftRkbPmd9PR8FfB+7aRvs9xOenq+Cnm/dtK3W2YnPT1fBb1fO+nHnJm+k56eL+b92kk/5sz0nfT0fDHv1076MWem76Sn54t5v75qAg0FgYaCQENBoKEg0FAQaCgINBQEGgoCDQWBhoJAQ0GgoSDQUBBoKAg0FAQaCgINBYGGgkDDTvoxZ6bvpKfni3m/dtKPOTN9Jz09X8z7tZN+zJnpO+np+WLer530bZbaSU/PV0Hv18erx5bfSU/PV+HvFwAAAAAAAAC+Pn7UZGz5nfRyf/fen530bZbbSS/39+Woau7PTvp2y+ykl/u7dWQN7s9O+jFn2iG/7MyY+7OTfsyZdsgvOzPm/uykH3OmHfLLzoy5P181gYaCQENBoKEg0FAQaCgINBQEGgoCDQWBhoJAQ0GgoSDQUBBoKAg0FAQaCgINBYGGgkBDQaBhJ/2YM+2QX3ZmzP3ZST/mTDvkl50Zc3920o850w75ZWfG3J+d9G2W2kkv9/df7f35ePXY8jvp5f4uvT8AAAAAAAAA+Mq0P2qSsFPdkW/tnfQKyDcsSMpO9fAXyfflqFpwJ71C8t1ZkKSd6jsflu/WkbXQTnoF5Rv9uHvMTvWAfDettpMek29UkJid6gnPzrJSvvSd9Jh8o4LE7FQPyHfbSjvpMfl81QQaCgINBYGGgkBDQaChINBQEGgoCDQUBBoKAg0FgYaCQENBoKEg0FAQaCgINBQEGgoCDQWBxqggMTvVA/LdttJOeky+UUFidqonPDvLSvnSd9Jj8o0KErNTPSDfTavtpMfku7MgSTvVd5HvhuV20iso35aPV8fuVMu39k565ecDAAAAAAAAgK+MnfSx5fNV/o9y/O/57KRvOKoWzFchO+SNiHx20rdZKl8F7ZAPxOSzk77NavlidsgnPDuLnfQLrZQvZod8wrOz2Em/0Er5YnbIJzw7i5102EtBoKEg0FAQaCgINBQEGgoCDQWBhoJAQ0GgoSDQUBBoKAg0FAQaCgINBYGGgkBDQaChINCwk77dSvlidsgnPDuLnfQLrZQvZod8wrOz2Em/wGr5YnbIJzw7i530B1ouXwXtkA/E5LOTPrZ8vgr4OPQ90vMBAAAAj+Uf73PYeRwCFc4AAAAASUVORK5CYII=" + }, + "pitchfork": { + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFsklEQVR4nO3dQU4VWRQG4FOdOCHMQRfgBlwAcU8yMUx1orvpnhuduwEXADInTEi8PXgPO7TvHqu4Vc9bj++bNnD+HPJjk+g9EQAAAEAXhuw/llLOIuI8Il5FxOnMs79HxNeI+DAMw+dHfo3jiDiJiKOIeDZXsK27iLiNiOuIuHnMF7C/9e+vWpBSytuIeDdzqJ2jIuJiGIb3Ez/vNCJeLJBnl8vYLHQ0+3tgtfvbWZBtcz/V/vsCSkS8nvCT8DgiXi6YZ5dvMfInof3ttMr9/VX5hPPYX7jYznoz4eNPlgoy00z7a5vZzf5qBXm1XJaqKTOPFksxz0z7a5vZzf5qBZn7F6Ixnk/42Ll/oZx7pv21zexmf7WCAKEgkFIQSCgIJBQEEgoCCQWBhIJAQkEgoSCQUBBIKAgkFAQSCgIJBYGEgkBCQSChIJBQEEjUCjLpDaOZXE342LvFUswz0/7aZnazv1pBvi4YpGbKzNvFUswz0/7aZnazv1pBPsTmMa19KduZY10vFWSmmfbXNrOb/e0syPaFuYvYT8j7px+/TPicm9g8Z7kvlzHhfVn7+8Vq9zfm8eo3sXlUa8q7S2NcxeaPtY8H/viy/R3u/gAAAAAAAADgiXEnve4g7nz/hv25kz6L1d75TtjfdlS4kz6LVd75rrC//40Md9KbrfLOd4X9PeRO+gxWeee7wv5GznQnfZmZ9tc2s5v9edUEEgoCCQWBhIJAQkEgoSCQUBBIKAgkFAQSCgIJBYGEgkBCQSChIJBQEEgoCCQUBBIKAgkFgYQ76cvMtL+2md3sz530ZWbaX9vMbvbnTvoyM+2vbWY3+3MnfZzV3vmusL//uJP+SE/hzrf9uZMOAAAAAAAAAHMppZyVUv4ppVyV+V1tv/aZfPKtLl8p5e0CoXb5UTY3seWTbx35yqa5P/YU8D7k6CbLJ9++8q31Trp8D8nX5uDupMvXNlO+kTN3trSUss9/zfXTMAyjfmrIt5t8bXbl86oJJBQEEgoCCQWBhIJAQkEgoSCQUBBIKAgkFAQSCgIJBYGEgkBCQSChIJBQEEgoCCQUBBIKAom13kmX71fytTmoO+nytc2Ub+TMtd5Jl+8h+dpMzffz6cd9vG7X8jSlfPL9kXz3Ic9KKX+XUi4XCHa5/dqtjxvLJ98fyQcAAAAAAAAAT8/vTmIdR8RJRBxFxLOZZ99FxG1EXEfEzSO/Rtf5tn+N4Tw29+9O54sWEZu/Ev41Ij4Mw/D5kV+j6/1FB/mygpxGxIuZQ9VcxvR/A9B1vrL5C3DvlonzcFREXAzD8H7i53W9v+gkX60gxxHxcrE4u32L8T9pus63/ZPjU+zvlHGJiNcT/iTpen/RUb7avwc5WTZL88ze83Vz57ui9/11k69WkKMFg9RMmdl7vm7ufFf0vr9u8tUKMvcvRGNMmdl7vrl/IR/j+YSP7X1/3eTzqgkkFAQSCgIJBYGEgkBCQSChIJBQEEgoCCQUBBIKAgkFgYSCQEJBIKEgkFAQSCgIJBQEEgoCiVpB7vaaYvrM3vN1c+e7ovf9dZOvVpDbBYPUTJnZe75u7nxX9L6/bvLVCnK9YJCaKTN7z9f7ne/e99dNvlpBbmLzHOO+XMa091u7zrd94fAi9lOS+6dHv0z4nK73Fx3l83h13VyPV7+JzaNuU96tGuMqNv9b9dHj1Y8yRz4AAAAAAAAAeGL8VZM6d9LbHMT31530cdxJb7Pa76876eO5k95mld9fd9KXmelOetvMbvK5k77MTHfS22Z2k8+d9GVmupPeNrObfF41gYSCQEJBIKEgkFAQSCgIJBQEEgoCCQWBhIJAQkEgoSCQUBBIKAgkFAQSCgIJBYGEgkBCQSDhTvoyM91Jb5vZTT530peZ6U5628xu8rmTvsxMd9LbZnaTz530cdxJb7Pa76/Hq+vcSW9z8N9fAAAAYI/+BXw0Caa5hJIxAAAAAElFTkSuQmCC" + }, + "target": { + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFeElEQVR4nO3dMY5bVRgF4N9INFH6BBbAAsgCEHtKGpQWmrAnBH1YAAtISB+lSWGKGYiMff/xm/dsnTvzfW08uUfP72QykuedKgAAACDC7o4/f1pVz6rqSVV9vfHZn6vqU1V9qKqP9/w7ovPt9/sfqupVVb2oqufbRauqqr+r6m1Vvdntdr/f8++Ivn4VkK8ryPOq+nbjUCPv6uYNXyI6336//6mqfr5MnMOjqur1brf7ZeHXRV+/Csk3KsjTqvruYnFO+6vO/5cmOt/td47f6u7v0FvZV9WPC76TRF+/Csr31eDFzy6bZfWZ6fle1fXKUbdnvVzw+vTrF5NvVJAnFwwysuTM9HwvLpZimzPTr19MvlFBtv6B6BxLzkzPt/UP5Of4ZsFr069fTL5RQYBSEGgpCDQUBBoKAg0FgYaCQENBoKEg0FAQaCgINBQEGgoCDQWBhoJAQ0GgoSDQUBBoKAg0RgX5fNUUy89Mz7f0GVBbeL/gtenXLybfqCCfLhhkZMmZ6fneXizFNmemX7+YfKOCfLhgkJElZ6bne1M3D3O7lv3tmedKv34x+UYF+Vg3j2O8lne17Pmt0flun3D4uq5Tkn8fPfrHgq+Jvn4VlM/Dq8e2enj1y7p5qNuS51ad433d/LfqVw+vvpct8gEAAAAAAADAIzP1R03Sd8jlm3/Hfdqd9PQdcvm+HFUT77hPuZOevkMu3/GRNemO+6w76ek75PIdmnbHfdad9PQdcvnWnRlz/826k56+Qy7fsSl33D3VBBoKAg0FgYaCQENBoKEg0FAQaCgINBQEGgoCDQWBhoJAQ0GgoSDQUBBoKAg0FAQaCgINBYHGrDvp6Tvk8h2bcsd91p309B1y+dadGXP/zbqTnr5DLt+haXfcp9xJT98hl+/A1DvuD+Hh1bE75PI9+B13AAAAAAAAAHhk2o+apO9op+er8I9KpF+/hHzDgqTvaKfnq5Cd75H065eS72RB0ne00/NV0M73KenXLynf6OPu6Tva6flidr4H0q9fTL5RQdJ3tNPzxex8D6Rfv5h8o/9iXfO3zf6z2+3O+lcjPV9VfX/RIGN/nvOi9OuXlM9TTaChINBQEGgoCDQUBBoKAg0FgYaCQENBoKEg0FAQaCgINBQEGgoCDQWBhoJAQ0GgoSDQUBBojAqSvqOdni9m53sg/frF5BsVJH1HOz1fzM73QPr1i8k3Kkj6jnZ6vpid74H06xeT72RB0ne00/NV0M73KenXLynfOQ+vjt3RTs9Xczy8Ovb6pecDAAAAAAAAgMfnrkmsGT4qYef7geargPuvK4id79ujauKd7+EXheerkPtvVBA73/87sibd+T754vB8FXT/jX4fxM73oWl3vgfS88Xcf6OC2Pled6Z8686Muf9GBdn6B6JzLDlz6x8oz7Hk9xHkO7YkX8z956km0FAQaCgINBQEGgoCDQWBhoJAQ0GgoSDQUBBoKAg0FAQaCgINBYGGgkBDQaChINBQEGgoCDRGBbHzfWzKne+B9Hwx99+oIHa+150p37ozY+6/UUHsfB+adud7ID1fzP03Koid7y+m3vk+JT1fBd1/D+Hh1bE72vI97J15AAAAAAAAAHh8pv6oSYXns0M+//s77U56heezQ35g2vd3yp30Cs9nh/ykKd/fWXfS0/PZIV93Zky+WXfS0/PZIV93Zky+WXfS0/PZIV93Zkw+TzWBhoJAQ0GgoSDQUBBoKAg0FAQaCgINBYGGgkBDQaChINBQEGgoCDQUBBoKAg0FgYaCQENBoDHrTnp6Pjvk686MyTfrTnp6Pjvk686MyTfrTnp6Pjvk686MyTflTnqF57NDfmTa99fDq8ce/I57hV+/ys8HAAAAXMs/4tr5dC58svsAAAAASUVORK5CYII=" + }, + "triangle": { + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFX0lEQVR4nO3dsW5URxQG4LNBNJapTXiAvAAPYOWdoEG0SUPeJumjpOcF8gA2bqiQCywxKXYBrfAcZjz3LrP297Xc3fNrpN+LpfWcCAAAAGAKm+/8+2lEnEXESUQ8Xnj2TURcR8RVRHy443vIJ99dNeXLCvI0Ip4tHKrmIiLedb5Gvq/kG1PN91PlBadxuHCxm3Xa8bx8++QbU81XK8jZelmqembKNzZTvsaZtYKcrBikpmemfGMz5WucWSvI0r8QteiZKd/YTPkaZ9YKAoSCQEpBIKEgkFAQSCgIJBQEEgoCCQWBhIJAQkEgoSCQUBBIKAgkFAQSCgIJBYGEgkBCQSBRK8jNQVP0z5RvbKZ8jTNrBbleMUhNz0z5xmbK1zizVpCrFYPU9MyUb2ymfI0zH1Ue/hgRJSKerBZn30VEvO94Xr598o2p5nN5dZ18Yx5CPgAAAAAAAAB4YHzVpG44XynlPCJeRsTz2K41XtK7iHgbEW82m80/d3yPqc8vJshnT3qb7nyllFcR8ds6cfZHRcTrzWbze+frpj6/mCRfrSCnEfHLanFu91+0/6SZOt/uk+Pv+P4n9FJKRPza8Uky9fnFRPnsSV9n5ss4XDliN+tFx/Ozn980+exJX2fm89VSLDNz9vObJp896evMXPoX8hY/dzw7+/lNk8+tJpBQEEgoCCQUBBIKAgkFgYSCQEJBIKEgkFAQSCgIJBQEEgoCCQWBhIJAQkEgoSCQUBBIKAgk7ElfZ2bvHVBLuOx4dvbzmyafPenrzHy7WoplZs5+ftPksyd9nZlvYnuZ26GU3cxWs5/fNPlqBfkQ2+sYD+Ui+u5vnTrf7obD13GYkny+evTfjtdMfX4xUT6XV9ctdXn1i9he6tZzb1WLy9j+t+oPl1ffiT3pAAAAAAAAANDtqL9qYg+58xtwv/ek20O+x/mNuV970u0hv5XzG3Ov9qTbQz420/k1zjzWPen2kI/NdH6NM491T7o95GMznV/jTLeaQEJBIKEgkFAQSCgIJBQEEgoCCQWBhIJAQkEgoSCQUBBIKAgkFAQSCgIJBYGEgkBCQSChIJA41j3p9pCPzXR+jTOPdU+6PeRjM51f48xj3ZNuD/nYTOfXOPMo96TbQ/4N5zfmfu5Jt4fc+Q2wJx0AAAAAAAAAllVKOS+l/FVKuSzLu9y997l88h1dvlLKqxVC3eZT2e7slk++48hXts39dKCAn0M2N1k++Q6Vr/Z199n3aMu3T74x1Xy1gsy+R1u+sZnyNc68taWllEP+tdkXm82m6aeGfLeTb8xt+dxqAgkFgYSCQEJBIKEgkFAQSCgIJBQEEgoCCQWBhIJAQkEgoSCQUBBIKAgkFAQSCgIJBYGEgkCiVpDZ92jL9y35xtyar1aQ2fdoyzc2U77GmbWCzL5HW7598o3pzffl6sdD3G43cjWlfPL9kHyfQ56XUv4spVysEOxi996jlxvLJ98PyQcAAAAAAAAAD8/3VmKdRsRZRJxExOOFZ99ExHVEXEXEhzu+h3zy3VVTvqwgTyPi2cKhai6i/28A5PtKvjHVfLWvu5/G4cLFbtZpx/Py7ZNvTDVfrSBn62Wp6pkp39hM+Rpn1gpysmKQmp6Z8o3NlK9xZq0gS/9C1KJnpnxjM+VrnOlWE0goCCQUBBIKAgkFgYSCQEJBIKEgkFAQSCgIJBQEEgoCCQWBhIJAQkEgoSCQUBBIKAgkFAQStYLcHDRF/0z5xmbK1zizVpDrFYPU9MyUb2ymfI0zawW5WjFITc9M+cZmytc481Hl4Y+xXa7+ZLU4+y4i4n3H8/Ltk29MNZ/Lq+vkG/MQ8gEAAACH8j9qsKYdhQgxPgAAAABJRU5ErkJggg==" + }, + "lefttriangle": { + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFGklEQVR4nO3dPY4UVxQG0NuWnCBysBfgDbCAkfcECSK1E7wbO7fsnA14ATOQIxIknoPuAY+m6rpq6lVzX3NOOtV9P1Xpmx+p590IAAAAoIRD9sXW2lVEvIiIZxHxtPPstxHxJiJeHw6Hvx74Ho8j4klEPIqI73sFO/kYER8i4l1EvH/ge8g3eL7ZgrTWXkbEL51DTY6KiFeHw+HXla97GhE/7pBnynUcC72GfF8Mm2+yIKefHH/OfX0HLSJ+XvGT5HFE/LRjnin/xPLvhPLdN2S+72YufhHnK0ecZj1fcf2TvYJ0minftpll8s0V5NmOQeasmflotxR9Zsq3bWaZfHMF6f0H+RI/rLi29x9svWfKt21mmXxzBQFCQSClIJBQEEgoCCQUBBIKAgkFgYSCQEJBIKEgkFAQSCgIJBQEEgoCCQWBhIJAQkEgoSCQmCvI2jOMerhZce3H3VL0mSnftpll8s0V5M2OQeasmflhtxR9Zsq3bWaZfHMFeR3Hw9zOpZ1mLvVuryCdZsq3bWaZfJMFOZ1w+CrOU5Lbo0f/XvGa93E8LvJcrmPd+bLy3TVsviWHVz+P46Fua86tWuImjr9W/ebw6geRb5se+QAAAAAAAADgGzP0nvTq+aL+RyXku9Q96dXzRZE93wn5vrisPenV80WhPd8z5LvvovakV89XZs93h2t7GTLfqHvSq+crs+e7w7W9DJlv1D3p1fOV2fPd4dpehsznVBNIKAgkFAQSCgIJBYGEgkBCQSChIJBQEEgoCCQUBBIKAgkFgYSCQEJBIKEgkFAQSCgIJBQEEqPuSa+er8ye7w7X9jJkvlH3pFfPV2bPd4drexky36h70qvnK7Pnu8O1vQyZb8g96dXzRaE93zPku+sy96RXzxcFDl/+H/LZkw4AAAAAAAAAKwy9Jz2KfxTB/Rv/oybD7kmPInu057h/d9iTvtFF7SF3/ybZk77Bpe0hd/+2zSyTb9Q96WX2aM9w/7bNLJNv1D3pZfZoz3D/ts0sk8+pJpBQEEgoCCQUBBIKAgkFgYSCQEJBIKEgkFAQSCgIJBQEEgoCCQWBhIJAQkEgoSCQUBBIKAgkRt2TXmaP9gz3b9vMMvlG3ZNeZo/2DPdv28wy+Ubdk15mj/YM92/bzDL5htyTHoX2aE9x/+6xJ/0BLn4Pufs3/uHVAAAAAAAAAMB/2ZM+7+I/KuH52pPey7B7vud4vnfYk97BkHu+p3i+k+xJ32jIPd8zPN+FM+1J32dm9Xye78KZ9qTvM7N6Ps934UynmkBCQSChIJBQEEgoCCQUBBIKAgkFgYSCQEJBIKEgkFAQSCgIJBQEEgoCCQWBhIJAQkEgoSCQsCd9n5nV83m+C2fak77PzOr5PN+FM+1J32dm9Xye78KZ9qQvM+ye7yme7z32pD/At3J4tedrTzoAAAAAAAAA9NBau2qt/dFau2n93Zze+0o++YbL11p7uUOoKZ/acWe3fPKNka8dm/vpTAFvQy5usnzynSvfqHvS5btLvm1m8426J12+bTPlWzhzsqWttXP+t9lnh8Nh0XcN+abJt81UPqeaQEJBIKEgkFAQSCgIJBQEEgoCCQWBhIJAQkEgoSCQUBBIKAgkFAQSCgIJBYGEgkBCQSChIJAYdU+6fPfJt81kvlH3pMu3baZ8C2eOuiddvrvk22Ztvs9HP57jdLstR1PKJ99XyXcb8qq19ntr7XqHYNen9956uLF88n2VfAAAAMAZ/QsAIPjNRI6mtwAAAABJRU5ErkJggg==" + }, + "chessboard": { + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE7klEQVR4nO3dMY5TZxQF4OtIaRA9JAvIBlhAlD1BE9EmDdlTlPRsIAuA0CMaCqcYRyNj/2f85trW+z3f1zJwnw46A0jmnSoAAABgFTYP/PjzqnpRVc+q6vsz3/5aVV+q6lNVfX7ML7Ddbn+uqjdV9aqqXp7v0aqq6t+qel9V7zabzV+P/DXkN3l+qSAvq+rHMz/UyIe6C/Rk2+3216r67TKPs3+qqt5uNpvfF/48+e1O1cT5jQryvKp+utjjHPdPnfidcPed7896+E/Ac9lW1S8LvhPK75uTNWl+3w2++MVln6V9801d7ze3drdeL/h6+e2bNr9RQZ5d8EFGltx8dbGnOM9N+fVuria/UUHO/Q+iUyy5ee5/UJ7ihwVfK79DU+Y3KghQCgKRgkCgIBAoCAQKAoGCQKAgECgIBAoCgYJAoCAQKAgECgKBgkCgIBAoCAQKAoGCQDAqyNerPsXym4veAXUmHxd8rfwOTZnfqCBfLvggI0tuvr/YU5znpvx6N1eT36ggny74ICNLbr6ru5eRXct2d/NU8ts3bX6jgnyuu9cxXsuHWvB+2d0b+t7WdX6T/3915t8Lfo787k2d3y28vPp13b2UbMl7l07xse7+WvDHzC9fTuTXyw8AAAAAAAAAnp74URM72nbIG24iv2FB7GjvsUPeM21+RwtiR/soO+Q9U+Y3+ri7He3eTfn1bq4mv1FB7Gj3bsqvd3M1+Y0KYke7d1N+vZuryc9bTSBQEAgUBAIFgUBBIFAQCBQEAgWBQEEgUBAIFAQCBYFAQSBQEAgUBAIFgUBBIFAQCBQEglFB7Gj3bsqvd3M1+Y0KYke7d1N+vZuryW9UEDvavZvy691cTX5HC2JH+4Ad8p5p8zvl5dV2tO2QP8ZTyA8AAAAAAAAAnpiHhhJn+CiCHXL5PcZJ+aWC2NHenSo75B1T5zcqiB3tb06WHfKOafMb/X8QO9r77JD3TJvfqCB2tHs35de7uZr8RgWxo33IDnnPlPl5qwkECgKBgkCgIBAoCAQKAoGCQKAgECgIBAoCgYJAoCAQKAgECgKBgkCgIBAoCAQKAoGCQDAqiB3tQ3bIe6bMb1QQO9q9m/Lr3VxNfqOC2NHeZ4e8Z9r8RgWxo33PDnnP1Pndwsur17yjLb8bzg8AAAAAAAAAnp74URM72nbIG24iv2FB7GjvsUPeM21+RwtiR/soO+Q9U+Y3+ri7He3eTfn1bq4mv1FB7Gj3bsqvd3M1+Y0KYke7d1N+vZuryc9bTSBQEAgUBAIFgUBBIFAQCBQEAgWBQEEgUBAIFAQCBYFAQSBQEAgUBAIFgUBBIFAQCBQEglFB7Gj3bsqvd3M1+Y0KYke7d1N+vZuryW9UEDvavZvy691cTX5HC2JH+4Ad8p5p8zvl5dV2tO2QP8ZTyA8AAAAAAAAAnpiHhhJn+CiCHXL5PcZJ+aWC2NHenSo75B1T5zcqiB3tb06WHfKOafMb/X8QO9r77JD3TJvfqCB2tHs35de7uZr8RgWxo33IDnnPlPl5qwkECgKBgkCgIBAoCAQKAoGCQKAgECgIBAoCgYJAoCAQKAgECgKBgkCgIBAoCAQKAoGCQDAqiB3tQ3bIe6bMb1QQO9q9m/Lr3VxNfqOC2NHeZ4e8Z9r8RgWxo33PDnnP1Pndwsur17yjLb8bzg8AAAC4ov8AwGjpQ+5xFXQAAAAASUVORK5CYII=" + }, + "diamond": { + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFF0lEQVR4nO3dMY4UZxAF4BpLThA52AfwBTiA5TtBYpHaCb6TZedcwAcAkyMSgnGwa9nDzv+2e/+ZVXXzfSm7VKlmHgvS0K8KAAAAaOFwz68/rapnVfWkqr698OzPVfWpqj5U1ccH/h6t9zsejz9W1auqelFVzy+3WlVV/V1Vb6vqzeFw+OOBv0fr+1WD/VJAnlfV9xdeauRd3bzga7Te73g8/lxVv1xnndNRVfX6cDj8uvL7Wt+vmuw3CsjTqvrhauuc91ct/5Om9X63Pzl+r/t/Ql/Ksap+WvGTpPX9qtF+3wy++Nl1d5me2X2/V/V44ajbWS9XfH33+7XZbxSQJ1dcZGTNzO77vbjaFpeZ2f1+bfYbBeTS/yBaYs3M7vtd+h/kS3y34mu736/NfqOAACUgEAkIBAICgYBAICAQCAgEAgKBgEAgIBAICAQCAoGAQCAgEAgIBAICgYBAICAQCAgEo4B8ftQt1s/svt/aZ0BdwvsVX9v9fm32GwXk0xUXGVkzs/t+b6+2xWVmdr9fm/1GAflwxUVG1szsvt+bunmY22M53s5cqvv92uw3CsjHunkc42N5V+ue39p6v9snHL6uxwnJv48e/XPF97S+XzXaz8Orxy718OqXdfNQtzXPrVrifd38teo3D69+kEvsBwAAAAAAAABfmU1/1EQPuftN2HdPuh7yE+43Z1896XrIz3K/ObvqSddDPjfT/RbO3GpPuh7yuZnut3DmVnvS9ZDPzXS/hTM91QQCAYFAQCAQEAgEBAIBgUBAIBAQCAQEAgGBQEAgEBAIBAQCAYFAQCAQEAgEBAIBgUBAINhqT7oe8rmZ7rdw5lZ70vWQz810v4Uzt9qTrod8bqb7LZy5yZ50PeR3uN+cffak6yF3vwl60gEAAAAAAABgtfhREz3a0x9FsN/Ge9yHAdGjfWJ1D3nZ7/822+N+NiB6tM9a3ENe9jtnkz3uo4+769Gem2m/uZlt3n+jgOjRnptpv7mZbd5/o4Do0Z6bab+5mW3ef55qAoGAQCAgEAgIBAICgYBAICAQCAgEAgKBgEAgIBAICAQCAoGAQCAgEAgIBAICgYBAICAQjAKiR3tupv3mZrZ5/40Cokd7bqb95ma2ef+NAqJHe26m/eZmtnn/nQ2IHu07VvWQl/2+tNke9yUPr9ajvdOHQ1fz/Tbw/gMAAAAAAACAr8x9RYlb+CiCHnf3e4hF90sB0aN9O6p22OPufieG9xsFRI/2FyNrRz3u7nfW2fuN/j+IHu1Te+txd7+FM0cB0aM9N9P95ma2ud8oIHq079pTj7v7LZzpqSYQCAgEAgKBgEAgIBAICAQCAoGAQCAgEAgIBAICgYBAICAQCAgEAgKBgEAgIBAICAQCAsEoIHq079pTj7v7LZw5Coge7bmZ7jc3s839RgHRo31qbz3u7rdw5iggerT/s7sed/e7Y3i/PTy8unOPtvvt+H4AAAAAAAAA8PXZ9EdNqvl+esi3//putie9mu+nh/zEZl/fTfakV/P99JCftcnXd6s96d3300M+N7PNflvtSe++nx7yuZlt9ttqT3r3/fSQz81ss5+nmkAgIBAICAQCAoGAQCAgEAgIBAICgYBAICAQCAgEAgKBgEAgIBAICAQCAoGAQCAgEAgIBFvtSe++nx7yuZlt9ttqT3r3/fSQz81ss99We9K776eHfG5mm/022ZNezffTQ37HZl9fD68e00M+Z/evLwAAAPCI/gFIfqYbRE+aDAAAAABJRU5ErkJggg==" + }, + "smalldiamond": { + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE7ElEQVR4nO3dMY5TVxQG4OOgNGioSbKAbIAFROwJmog2acieoqRnA1nAAA0VooDCKewospj78+5cP+s+z/e1PM/5da1/zEjWPVUAAADAFHbf+PebqnpaVY+r6vszz/5SVZ+q6n1Vfbznz5BPvvtalC8V5Ieq+unMoVpuq+pd52vk+598Y5r5vmu84KYuF66Os246npfvlHxjmvlaBXm6Xpamnpnyjc2Ub+HMVkEerxikpWemfGMz5Vs4s1WQc/9BtETPTPnGZsq3cGarIEApCEQKAoGCQKAgECgIBAoCgYJAoCAQKAgECgKBgkCgIBAoCAQKAoGCQKAgECgIBAoCQasgXy6aon+mfGMz5Vs4s1WQTysGaemZKd/YTPkWzmwV5P2KQVp6Zso3NlO+hTMfNR7+XFX7qnqyWpxTt1X1oeN5+U7JN6aZz+XVbfKNeQj5AAAAAAAAAOCB8VWTtuF8+/3+l6p6WVXP6rDW+JzeVdWbqnq92+3+uufPmPr8aoJ89qQv051vv9//WlW/rRPndFRVvdrtdr93vm7q86tJ8rUKclNVP68W527/1PLfNFPnO35y/Fnf/oQ+l31VPe/4JJn6/GqifPakrzPzZV2uHHWc9aLj+dnPb5p89qSvM/PZainOM3P285smnz3p68w89x/kS/zY8ezs5zdNPreaQKAgECgIBAoCgYJAoCAQKAgECgKBgkCgIBAoCAQKAoGCQKAgECgIBAoCgYJAoCAQKAgE9qSvM7P3DqhzeNvx7OznN00+e9LXmflmtRTnmTn7+U2Tz570dWa+rsNlbpeyP85cavbzmyZfqyAf63Ad46XcVt/9rVPnO95w+KouU5L/rh79u+M1U59fTZTP5dVt57q8+kUdLnXrubdqibd1+G/VHy6vvhd70gEAAAAAAACg26a/amIPufMbcN170u0hP+H8xlzXnnR7yO/k/MZc1Z50e8jHZjq/hTO3uifdHvKxmc5v4cyt7km3h3xspvNbONOtJhAoCAQKAoGCQKAgECgIBAoCgYJAoCAQKAgECgKBgkCgIBAoCAQKAoGCQKAgECgIBAoCwVb3pNtDPjbT+S2cudU96faQj810fgtnbnVPuj3kYzOd38KZm9yTbg/5V5zfmOvck24PufMbYE86AAAAAAAAAHTb9FdNavJ89pBv//3d7J70mjyfPeQnNvv+bnJPek2ezx7yO23y/d3qnvTZ89lDPjZzmnxb3ZM+ez57yMdmTpNvq3vSZ89nD/nYzGnyudUEAgWBQEEgUBAIFAQCBYFAQSBQEAgUBAIFgUBBIFAQCBQEAgWBQEEgUBAIFAQCBYFAQSDY6p702fPZQz42c5p8W92TPns+e8jHZk6Tb6t70mfPZw/52Mxp8m1yT3pNns8e8q9s9v11eXWbPeRjrv79BQAAAAAAAICHx1dN2uQbcxX57ElfRr4xm83X+jbvTV0uXB1n3XQ8L98p+cY089mTvs5M+cZmTpPPnvR1Zso3NnOafPakrzNTvrGZ0+RzqwkECgKBgkCgIBAoCAQKAoGCQKAgECgIBAoCgYJAoCAQKAgECgKBgkCgIBAoCAQKAoGCQGBP+joz5RubOU0+e9LXmSnf2Mxp8tmTvs5M+cZmTpPvUePhz3XYv/1ktTinbqvqQ8fz8p2Sb0wzn8ur2+Qb8xDyAQAAAJfyL3WaU2vK5kXFAAAAAElFTkSuQmCC" + }, + "square": { + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFJElEQVR4nO3dQW4UVxAG4OpI2SD2kBwgF8gBRrkTbCy2yYbcBvZRss8FcgAb9ogNkiuLGRtZ7i5187rHr4fv2wamfqT6baGYVxEAAABA/zLzkJnvM/Mm13dz+uyDfPLtLl9mXm0QasxtZl7JJ99u8uWxubdnCngXcnaT5ZPvXPl+mMj4OiKGuX+gFQwR8WrBr5fvIfnaTOabKsiv22WZtGSmfG0z5Zs5c7SlmZnbZhk3DMOsrxryjZOvzVi+qe8gQCgIlBQECgoCBQWBgoJAQUGgoCBQUBAoKAgUFAQKCgIFBYGCgkBBQaCgIFBQECgoCBQUBApTBflw1hRHNwt+rXyPyddmNN9UQf7dMMiUJTPla5sp38yZUwV5GxHnfFkiTzPnku8h+doszXf/9OM5XrdreZpSPvmeJN9dyENmvsvM6w2CXZ8+u/VxY/nke5J8AAAAAAAAAPD9KU9inf43/Os43m97ufLsD3H8Ccq3wzD8/Y2f8TwiXkTEs4j4ca1gJ18i4nNEfIyIT9/4GfI15Oth/yYLkscf4Pp95VCjoyLizTAMfyz8fS8j4ucN8oy5juX/RkG+rxbn62X/po54HiLir6n/voGMiN8WfCd5HhG/bJhnzH8x/yuhfI/NztfT/u31TvqLrYKsNFO+tpnd7N9e76Q/2yzFOjPla5vZzf5NFWTtvxDN8dOCX7v2XyjXnilf28xu9s+rJlBQECgoCBQUBAoKAgUFgYKCQEFBoKAgUFAQKCgIFBQECgoCBQWBgoJAQUGgoCBQUBAoKAgU9non/ctmKdaZKV/bzG72b6930j9vlmKdmfK1zexm//Z6J/3jVkFWmilf28xu9m+0IKcX5t7EeULePf34z4Lf8ymOz1mey3Use19WvocW5etp/+Y8Xv0qjo9qLXm3ao6bOH5b+9Pj1d/k4vPtYP8AAAAAAAAA4DvjTvq0i/9Rjug8Xw/75076PBd3hzw6z9fL/rmTPt/F3CGPzvP1tH/upG8zU762md3snzvp28yUr21mN/vnTvo2M+Vrm9nN/nnVBAoKAgUFgYKCQEFBoKAgUFAQKCgIFBQECgoCBQWBgoJAQUGgoCBQUBAoKAgUFAQKCgIFBYGCO+nbzJSvbWY3++dO+jYz5Wub2c3+uZO+zUz52mZ2s3/upM9zUXfIo/N8Pe2fO+nTLv5x6Og83w72DwAAAAAAAAC+M+6kT7v4H+WIzvP1sH/upM9zcXfIo/N8veyfO+nzXcwd8ug8X0/75076NjPla5vZzf65k77NTPnaZnazf+6kbzNTvraZ3eyfV02goCBQUBAoKAgUFAQKCgIFBYGCgkBBQaCgIFBQECgoCBQUBAoKAgUFgYKCQEFBoKAgUFAQKLiTvs1M+dpmdrN/7qRvM1O+tpnd7J876dvMlK9tZjf75076PBd1hzw6z9fT/rmTPu3iH4eOzvPtYP8AAAAAAAAAgK8y85CZ7zPzJtd3c/rsg3zy7S5fZl5tEGrMbR5vYssn3z7y5bG5t2cKeBdydpPlk+9c+fZ6J12+h+Rrc3F30uVrmynfzJmjLc3Mc/5rrnvDMMz6qiHfOPnajOXzqgkUFAQKCgIFBYGCgkBBQaCgIFBQECgoCBQUBAoKAgUFgYKCQEFBoKAgUFAQKCgIFBQECgoChb3eSZfvMfnaXNSddPnaZso3c+Ze76TL95B8bZbmu3/68Ryv27U8TSmffE+S7y7kITPfZeb1BsGuT5/d+rixfPI9ST4AAADgjP4Hm2pLjkVf1VMAAAAASUVORK5CYII=" + }, + "smallsquare": { + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE6ElEQVR4nO3dP44URxQH4DdGTtAQY3wAX4ADWNwJEkRqEnwny865gA+wQEKECCAYghkbWrP1tmqqe9TV+33p9uz7qbd/+0earRcBAAAArMLujo/vI+JxRDyMiJ9nnv01Ij5HxIeI+HTh55BPvktV5csK8ktE/DpzqJKbiHjf+Br5vpOvTzHfT4UX7ON64eI0a99wvXxT8vUp5isV5PFyWYpaZsrXN1O+ypmlgjxcMEhJy0z5+mbKVzmzVJC5/yCq0TJTvr6Z8lXOLBUECAWBlIJAQkEgoSCQUBBIKAgkFAQSCgIJBYGEgkBCQSChIJBQEEgoCCQUBBIKAgkFgYSCQKJUkK9XTdE+U76+mfJVziwV5POCQUpaZsrXN1O+ypmlgnxYMEhJy0z5+mbKVznzQeHiLxFxiIhHi8WZuomIjw3XyzclX59iPodXl8nX5z7kAwAAAAAAAIB7Zui3mhwOh98j4kVEPI3j2uA5vY+ItxHxZrfb/X3JJ5CvL1+s4Pkbdk/64XB4GRF/LBNnOioiXu12u9dNL5Lv/1FxQb5YyfNXKsg+In5bLM7t/o3KnySn73x/xd0/AedyiIhntd8J5TsfGQ35YkXP36h70l/E9b64cZr1vOF6+aZa863m+Rt1T/rTxVLMM1O+vpmref5G3ZM+9x+UNZ40XCvfuZZ8q3n+nGoCCQWBhIJAQkEgoSCQUBBIKAgkFAQSCgIJBYGEgkBCQSChIJBQEEgoCCQUBBIKAgkFgYSCQGLUPelNZ2jN5F3DtfKda8m3mudv1D3pbxdLMc9M+fpmrub5G3VP+ps4HkZ2LYfTzFryTbXmW83zVyrIpzgex3gtN9FwPu/phL5XcZ0v8n9HZ/5T+wL5JprzxYqevy0cXv08joeStZy7VONdHH8t+LPzcGj5Bj68GgAAAAAAAAD40RbeamLPt/t3CXvSZzL0nu8S92/CnvROw+75vo37dyt70jsMu+e7wP2rnGlP+jIz3b++mau5f/ak1xtyz3eB+1c506kmkFAQSCgIJBQEEgoCCQWBhIJAQkEgoSCQUBBIKAgkFAQSCgIJBYGEgkBCQSChIJBQEEgoCCTsSa835J7vAvevcqY96cvMdP/6Zq7m/tmTXmfYPd8F7l/lTHvS7zb0nu/buH9n7Em/wOb3fLt/9qQDAAAAAAAAQJstvNVktXu+5bMnfS6b2/Mt3/dRYU/6LDaz51u+85FhT3q3Le35lm/KnvQZbGnPt3x9M1fz/NmTXq/l/yXkO2dPOmyNgkBCQSChIJBQEEgoCCQUBBIKAgkFgYSCQEJBIKEgkFAQSCgIJBQEEgoCCQWBhIJAQkEgYU96vZY93/Kdsye905b2fMvXN3M1z5896XVa93zLN2VPeqdN7fmWb8Ke9Attfs+3fPakAwAAAAAAAMC2DP1Wk5BPvstte096yPcj+foU85XezbuP64WL06x9w/XyTcnXp5hv1D3p8vXNlK9y5qh70uXrmylf5cxR96TL1zdTvsqZTjWBhIJAQkEgoSCQUBBIKAgkFAQSCgIJBYGEgkBCQSChIJBQEEgoCCQUBBIKAgkFgYSCQEJBIDHqnnT5+mbKVzlz1D3p8vXNlK9y5qh70uXrmylf5cwHhYu/xHG/9aPF4kzdRMTHhuvlm5KvTzGfw6vL5OtzH/IBAAAA1/IN7YSWk669SX0AAAAASUVORK5CYII=" + }, + "scissors": { + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFUUlEQVR4nO3dMW6cRRgG4G+RaCL6AAfgAjkA4k5Jg9JCE+6EoM8FOEBC+ihNiqVYU0TZeT3rnd/6/vXztB57Ps3odWTFnrcKAAAAaOGQPng8Hn+uqldV9aKqvl+8979V9baq3hwOh78e8gW6z1dV31XV86p6VlXfrhrszueq+lRVH6rq4wO/Ruv5OtzvMCDH4/HXqvpt8VBnt6qq14fD4feLPqn5fHW60B83mOecd3W68Eu0nq/L/Z4NyF1y/xx9fAPHqvpl9jt19/nq9J35pw3nOeefmv9O3Xq+Tvf7zeATXtXjDVd3e728YH33+Z5vNciiPbvP1+Z+RwF5sd0sQ5fs2X2+Z5tNsWbP7vO1ud9RQFb/QDTjhwvWdp9v9Q+8q/fsPl+b+x0FBCgBgUhAIBAQCAQEAgGBQEAgEBAIBAQCAYFAQCAQEAgEBAIBgUBAIBAQCAQEAgGBQEAgGAXk0jeWVnh/wdru833ebIo1e3afr839jgLydsNBRi7Zs/t8nzabYs2e3edrc7+jgLyp02Naj+V4t+es7vN92GqQRXt2n6/N/Z4NyN0Lc6/rcYb8/+nHv2c/oft8dXpB8N1G85zzri57/7b1fJ3ud+bx6pd1elTrknehZryv0z9rf1z5eHXb+ar549DVfL4d3C8AAAAAAAAAPDF60sduvifd+d1/fnrSJ7aqG+xJd35fGJ6fnvQ5N9WT7vzOOnt+etLn3FpPuvOb3FNP+jZ76iG/bs8256cnfd4t9aQ7v8k9vWoCgYBAICAQCAgEAgKBgEAgIBAICAQCAoGAQCAgEAgIBAICgYBAICAQCAgEAgKBgEAgIBDoSZ93Sz3pzm9yTz3p2+yph/y6Pducn570ObfWk+78JvfUk36/m+tJd35fGZ6fnvSxm+9Jd35X98wDAAAAAAAAwBNzX5Fj9//qbz2fHvL9328KSIue6qD1fHrIv7Db+x0FpE1P9UDr+fSQn7XL+x39PUibnuoFa1fRQ36dXd7vKCBteqoXrF1FD/l1dnm/o4C06alesHYVPeTX2eX9etUEAgGBQEAgEBAIBAQCAYFAQCAQEAgEBAIBgUBAIBAQCAQEAgGBQEAgEBAIBAQCAYFAQCAYBaRNT/WCtavoIb/OLu93FJA2PdUL1q6ih/w6u7zfUUDa9FQvWLuKHvLr7PJ+RwFp01M90Ho+PeRf2e39erx6TA/5dW7+fgEAAAAAAADg6Ym/atK957v7fNX8VyWc3xU96d17vrvPV016vkec3xcu60nv3vPdfb5q1PN9jvM766Ke9O49393na9PzPeD8JvccBaR7z3f3+dr0fA84v8k9RwHp3vPdfb42Pd8Dzm9yT6+aQCAgEAgIBAICgYBAICAQCAgEAgKBgEAgIBAICAQCAoGAQCAgEAgIBAICgYBAICAQCAgEo4B07/nuPl+bnu8B5ze55ygg3Xu+u8/Xpud7wPlN7jkKSPee7+7zten5HnB+k3ueDUj3nu/u81Wjnu9znN9XHtaT3r3nu/t81eDx5cT56UkHAAAAAAAAgMvoSR+7iZ7ve7Ser8P96kmf2Kp23PMdtJ6vy/3qSZ+z257vgdbzdbpfPelzdtvzvWDtKrvscdeTvs2ebXq+F6xdZZc97nrS5+2y53vB2lV22ePuVRMIBAQCAYFAQCAQEAgEBAIBgUBAIBAQCAQEAgGBQEAgEBAIBAQCAYFAQCAQEAgEBAIBgUBP+rxd9nwvWLvKLnvc9aRvs2ebnu8Fa1fZZY+7nvQ5u+35XrB2lV32uOtJv9+ue74HWs/X6X71pI89hZ7v1vPt4H4BAACAx/IfV5v6DSxvZ+4AAAAASUVORK5CYII=" + } +} \ No newline at end of file diff --git a/pxt_modules/core/icons.ts b/pxt_modules/core/icons.ts new file mode 100644 index 0000000..c250a23 --- /dev/null +++ b/pxt_modules/core/icons.ts @@ -0,0 +1,548 @@ +/* +The MIT License (MIT) + +Copyright (c) 2013-2016 The MicroPython-on-micro:bit Developers, as listed +in the accompanying AUTHORS file + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + +// Images from file microbitconstimage.cpp https://github.com/bbcmicrobit/micropython + +enum IconNames { + //% block="heart" + //% jres=icons.heart + Heart = 0, + //% block="small heart" + //% jres=icons.smallheart + SmallHeart, + //% block="yes" + //% jres=icons.yes + Yes, + //% block="no" + //% jres=icons.no + No, + //% block="happy" + //% jres=icons.happy + Happy, + //% block="sad" + //% jres=icons.sad + Sad, + //% block="confused" + //% jres=icons.confused + Confused, + //% block="angry" + //% jres=icons.angry + Angry, + //% block="asleep" + //% jres=icons.asleep + Asleep, + //% block="surprised" + //% jres=icons.surprised + Surprised, + //% block="silly" + //% jres=icons.silly + Silly, + //% block="fabulous" + //% jres=icons.fabulous + Fabulous, + //% block="meh" + //% jres=icons.meh + Meh, + //% block="t-shirt" + //% jres=icons.tshirt + TShirt, + //% block="roller skate" + //% jres=icons.rollerskate + Rollerskate, + //% block="duck" + //% jres=icons.duck + Duck, + //% block="house" + //% jres=icons.house + House, + //% block="tortoise" + //% jres=icons.tortoise + Tortoise, + //% block="butterfly" + //% jres=icons.butterfly + Butterfly, + //% block="stick figure" + //% jres=icons.stickfigure + StickFigure, + //% block="ghost" + //% jres=icons.ghost + Ghost, + //% block="sword" + //% jres=icons.sword + Sword, + //% block="giraffe" + //% jres=icons.giraffe + Giraffe, + //% block="skull" + //% jres=icons.skull + Skull, + //% block="umbrella" + //% jres=icons.umbrella + Umbrella, + //% block="snake" + //% jres=icons.snake + Snake, + //% block="rabbit" + //% jres=icons.rabbit + Rabbit, + //% block="cow" + //% jres=icons.cow + Cow, + //% block="quarter note" + //% jres=icons.quarternote + QuarterNote, + //% block="eigth note" + //% jres=icons.eigthnote + EigthNote, + //% block="pitchfork" + //% jres=icons.pitchfork + Pitchfork, + //% block="target" + //% jres=icons.target + Target, + //% block="triangle" + //% jres=icons.triangle + Triangle, + //% block="left triangle" + //% jres=icons.lefttriangle + LeftTriangle, + //% block="chess board" + //% jres=icons.chessboard + Chessboard, + //% block="diamond" + //% jres=icons.diamond + Diamond, + //% block="small diamond" + //% jres=icons.smalldiamond + SmallDiamond, + //% block="square" + //% jres=icons.square + Square, + //% block="small square" + //% jres=icons.smallsquare + SmallSquare, + //% block="scissors" + //% jres=icons.scissors + Scissors +} + +enum ArrowNames { + //% blockIdentity=images.arrowNumber block="North" + North = 0, + //% blockIdentity=images.arrowNumber block="North East" + NorthEast, + //% blockIdentity=images.arrowNumber block="East" + East, + //% blockIdentity=images.arrowNumber block="South East" + SouthEast, + //% blockIdentity=images.arrowNumber block="South" + South, + //% blockIdentity=images.arrowNumber block="South West" + SouthWest, + //% blockIdentity=images.arrowNumber block="West" + West, + //% blockIdentity=images.arrowNumber block="North West" + NorthWest, +} + +namespace basic { + + /** + * Draws the selected icon on the LED screen + * @param icon the predefined icon id + * @param interval the amount of time (milliseconds) to show the icon. Default is 600. + */ + //% weight=90 blockGap=8 + //% blockId=basic_show_icon + //% block="show icon %i" icon="\uf00a" + //% parts="ledmatrix" + //% help=basic/show-icon + //% icon.fieldEditor="imagedropdown" + //% icon.fieldOptions.columns="5" + //% icon.fieldOptions.width="380" + //% icon.fieldOptions.maxRows=4 + export function showIcon(icon: IconNames, interval = 600) { + let res = images.iconImage(icon) + res.showImage(0, interval) + } + + /** + * Draws an arrow on the LED screen + * @param direction the direction of the arrow + * @param interval the amount of time (milliseconds) to show the icon. Default is 600. + */ + //% weight=50 blockGap=8 + //% blockId=basic_show_arrow + //% block="show arrow %i=device_arrow" + //% parts="ledmatrix" + //% advanced=true + //% help=basic/show-arrow + export function showArrow(direction: number, interval = 600) { + let res = images.arrowImage(direction) + res.showImage(0, interval) + } +} + + +namespace images { + + //% weight=50 blockGap=8 + //% help=images/arrow-image + //% blockId=builtin_arrow_image block="arrow image %i=device_arrow" + export function arrowImage(i: ArrowNames): Image { + switch (i) { + // compass directions + case ArrowNames.North: return images.createImage(` + . . # . . + . # # # . + # . # . # + . . # . . + . . # . .`); + case ArrowNames.NorthEast: return images.createImage(` + . . # # # + . . . # # + . . # . # + . # . . . + # . . . .`); + case ArrowNames.East: return images.createImage(` + . . # . . + . . . # . + # # # # # + . . . # . + . . # . .`); + case ArrowNames.SouthEast: return images.createImage(` + # . . . . + . # . . . + . . # . # + . . . # # + . . # # #`); + case ArrowNames.South: return images.createImage(` + . . # . . + . . # . . + # . # . # + . # # # . + . . # . .`); + case ArrowNames.SouthWest: return images.createImage(` + . . . . # + . . . # . + # . # . . + # # . . . + # # # . .`); + case ArrowNames.West: return images.createImage(` + . . # . . + . # . . . + # # # # # + . # . . . + . . # . .`); + case ArrowNames.NorthWest: return images.createImage(` + # # # . . + # # . . . + # . # . . + . . . # . + . . . . #`); + default: return images.createImage(` + . . . . . + . . . . . + . . . . . + . . . . . + . . . . . + `); + } + } + + //% weight=50 blockGap=8 + //% help=images/icon-image + //% blockId=builtin_image block="icon image %i" + //% i.fieldEditor="imagedropdown" + //% i.fieldOptions.columns="5" + //% i.fieldOptions.width="380" + //% i.fieldOptions.maxRows=4 + export function iconImage(i: IconNames): Image { + switch (i) { + case IconNames.Heart: return images.createImage(` + . # . # . + # # # # # + # # # # # + . # # # . + . . # . .`); + + case IconNames.SmallHeart: return images.createImage(` + . . . . . + . # . # . + . # # # . + . . # . . + . . . . .`); + //faces + case IconNames.Happy: return images.createImage(` + . . . . . + . # . # . + . . . . . + # . . . # + . # # # .`); + case IconNames.Sad: return images.createImage(` + . . . . . + . # . # . + . . . . . + . # # # . + # . . . #`); + case IconNames.Confused: return images.createImage(` + . . . . . + . # . # . + . . . . . + . # . # . + # . # . #`); + case IconNames.Angry: return images.createImage(` + # . . . # + . # . # . + . . . . . + # # # # # + # . # . #`); + case IconNames.Asleep: return images.createImage(` + . . . . . + # # . # # + . . . . . + . # # # . + . . . . .`); + case IconNames.Surprised: return images.createImage(` + . # . # . + . . . . . + . . # . . + . # . # . + . . # . .`); + case IconNames.Silly: return images.createImage(` + # . . . # + . . . . . + # # # # # + . . . # # + . . . # #`); + case IconNames.Fabulous: return images.createImage(` + # # # # # + # # . # # + . . . . . + . # . # . + . # # # .`); + case IconNames.Meh: return images.createImage(` + # # . # # + . . . . . + . . . # . + . . # . . + . # . . .`); + case IconNames.Yes: return images.createImage(` + . . . . . + . . . . # + . . . # . + # . # . . + . # . . .`); + case IconNames.No: return images.createImage(` + # . . . # + . # . # . + . . # . . + . # . # . + # . . . #`); + case IconNames.Triangle: return images.createImage(` + . . . . . + . . # . . + . # . # . + # # # # # + . . . . .`); + case IconNames.LeftTriangle: return images.createImage(` + # . . . . + # # . . . + # . # . . + # . . # . + # # # # #`); + case IconNames.Chessboard: return images.createImage(` + . # . # . + # . # . # + . # . # . + # . # . # + . # . # .`); + case IconNames.Diamond: return images.createImage(` + . . # . . + . # . # . + # . . . # + . # . # . + . . # . .`); + case IconNames.SmallDiamond: return images.createImage(` + . . . . . + . . # . . + . # . # . + . . # . . + . . . . .`); + case IconNames.Square: return images.createImage(` + # # # # # + # . . . # + # . . . # + # . . . # + # # # # #`); + case IconNames.SmallSquare: return images.createImage(` + . . . . . + . # # # . + . # . # . + . # # # . + . . . . .`); + + case IconNames.Scissors: return images.createImage(` + # # . . # + # # . # . + . . # . . + # # . # . + # # . . #`); + // The following images were designed by Abbie Brooks. + case IconNames.TShirt: return images.createImage(` + # # . # # + # # # # # + . # # # . + . # # # . + . # # # .`); + case IconNames.Rollerskate: return images.createImage(` + . . . # # + . . . # # + # # # # # + # # # # # + . # . # .`); + case IconNames.Duck: return images.createImage(` + . # # . . + # # # . . + . # # # # + . # # # . + . . . . .`); + case IconNames.House: return images.createImage(` + . . # . . + . # # # . + # # # # # + . # # # . + . # . # .`); + case IconNames.Tortoise: return images.createImage(` + . . . . . + . # # # . + # # # # # + . # . # . + . . . . .`); + case IconNames.Butterfly: return images.createImage(` + # # . # # + # # # # # + . . # . . + # # # # # + # # . # #`); + case IconNames.StickFigure: return images.createImage(` + . . # . . + # # # # # + . . # . . + . # . # . + # . . . #`); + case IconNames.Ghost: return images.createImage(` + . # # # . + # . # . # + # # # # # + # # # # # + # . # . #`); + case IconNames.Sword: return images.createImage(` + . . # . . + . . # . . + . . # . . + . # # # . + . . # . .`); + case IconNames.Giraffe: return images.createImage(` + # # . . . + . # . . . + . # . . . + . # # # . + . # . # .`); + case IconNames.Skull: return images.createImage(` + . # # # . + # . # . # + # # # # # + . # # # . + . # # # .`); + case IconNames.Umbrella: return images.createImage(` + . # # # . + # # # # # + . . # . . + # . # . . + # # # . .`); + case IconNames.Snake: return images.createImage(` + # # . . . + # # . # # + . # . # . + . # # # . + . . . . .`); + // animals + case IconNames.Rabbit: return images.createImage(` + # . # . . + # . # . . + # # # # . + # # . # . + # # # # .`); + case IconNames.Cow: return images.createImage(` + # . . . # + # . . . # + # # # # # + . # # # . + . . # . .`); + // musical notes + case IconNames.QuarterNote: return images.createImage(` + . . # . . + . . # . . + . . # . . + # # # . . + # # # . .`); + case IconNames.EigthNote: return images.createImage(` + . . # . . + . . # # . + . . # . # + # # # . . + # # # . .`); + // other icons + case IconNames.Pitchfork: return images.createImage(` + # . # . # + # . # . # + # # # # # + . . # . . + . . # . .`); + case IconNames.Target: return images.createImage(` + . . # . . + . # # # . + # # . # # + . # # # . + . . # . .`); + default: return images.createImage(` + . . . . . + . . . . . + . . . . . + . . . . . + . . . . . + `); + } + } + + //% weight=50 blockGap=8 + //% help=images/arrow-number + //% blockId=device_arrow block="%arrow" + //% shim=TD_ID + export function arrowNumber(arrow: ArrowNames): number { + return arrow; + } +} diff --git a/pxt_modules/core/images.cpp b/pxt_modules/core/images.cpp new file mode 100644 index 0000000..e303e13 --- /dev/null +++ b/pxt_modules/core/images.cpp @@ -0,0 +1,183 @@ +#include "pxt.h" + +PXT_VTABLE(RefMImage) + +RefMImage::RefMImage(ImageData *d) : PXT_VTABLE_INIT(RefMImage), img(d) { + img->incr(); +} + +void RefMImage::destroy(RefMImage *t) { + t->img->decr(); +} + +void RefMImage::print(RefMImage *t) { + DMESG("RefMImage %p r=%d size=%d x %d", t, t->refcnt, img->width, img->height); +} + +void RefMImage::makeWritable() { + if (img->isReadOnly()) { + MicroBitImage i(img); + img = i.clone().leakData(); + } +} + +void RefMImage::scan(RefMImage *t) {} + +unsigned RefMImage::gcsize(RefMImage *t) { + return (sizeof(*t) + 3) >> 2; +} + +/** + * Creation, manipulation and display of LED images. + */ +//% color=#7600A8 weight=31 icon="\uf03e" +//% advanced=true +namespace images { +/** + * Creates an image that fits on the LED screen. + */ +//% weight=75 help=images/create-image +//% blockId=device_build_image block="create image" +//% parts="ledmatrix" +Image createImage(ImageLiteral_ leds) { + return NEW_GC(RefMImage, imageBytes(leds)); +} + +/** + * Creates an image with 2 frames. + */ +//% weight=74 help=images/create-big-image +//% blockId=device_build_big_image block="create big image" imageLiteral=2 +//% parts="ledmatrix" +Image createBigImage(ImageLiteral_ leds) { + return createImage(leds); +} +} // namespace images + +namespace ImageMethods { +/** + * Plots the image at a given column to the screen + */ +//% help=images/plot-image +//% parts="ledmatrix" +void plotImage(Image i, int xOffset = 0) { + uBit.display.print(MicroBitImage(i->img), -xOffset, 0, 0, 0); +} + +/** + * Shows an frame from the image at offset ``x offset``. + * @param xOffset column index to start displaying the image + */ +//% help=images/show-image weight=80 blockNamespace=images +//% blockId=device_show_image_offset block="show image %sprite(myImage)|at offset %offset" +//% blockGap=8 parts="ledmatrix" async +void showImage(Image sprite, int xOffset, int interval = 400) { + uBit.display.print(MicroBitImage(sprite->img), -xOffset, 0, 0, interval); +} + +/** + * Draws the ``index``-th frame of the image on the screen. + * @param xOffset column index to start displaying the image + */ +//% help=images/plot-frame weight=80 +//% parts="ledmatrix" +void plotFrame(Image i, int xOffset) { + // TODO showImage() used in original implementation + plotImage(i, xOffset * 5); +} + +/** + * Scrolls an image . + * @param frameOffset x offset moved on each animation step, eg: 1, 2, 5 + * @param interval time between each animation step in milli seconds, eg: 200 + */ +//% help=images/scroll-image weight=79 async blockNamespace=images +//% blockId=device_scroll_image +//% block="scroll image %sprite(myImage)|with offset %frameoffset|and interval (ms) %delay" +//% blockGap=8 parts="ledmatrix" +void scrollImage(Image id, int frameOffset, int interval) { + MicroBitImage i(id->img); + uBit.display.animate(i, interval, frameOffset, MICROBIT_DISPLAY_ANIMATE_DEFAULT_POS, 0); +} + +/** + * Sets all pixels off. + */ +//% help=images/clear +//% parts="ledmatrix" +void clear(Image i) { + i->makeWritable(); + MicroBitImage(i->img).clear(); +} + +/** + * Sets a specific pixel brightness at a given position + */ +//% +//% parts="ledmatrix" +void setPixelBrightness(Image i, int x, int y, int value) { + i->makeWritable(); + MicroBitImage(i->img).setPixelValue(x, y, value); +} + +/** + * Gets the pixel brightness ([0..255]) at a given position + */ +//% +//% parts="ledmatrix" +int pixelBrightness(Image i, int x, int y) { + int pix = MicroBitImage(i->img).getPixelValue(x, y); + if (pix < 0) + return 0; + return pix; +} + +/** + * Gets the width in columns + */ +//% help=functions/width +int width(Image i) { + return i->img->width; +} + +/** + * Gets the height in rows (always 5) + */ +//% +int height(Image i) { + return i->img->height; +} + +/** + * Set a pixel state at position ``(x,y)`` + * @param x pixel column + * @param y pixel row + * @param value pixel state + */ +//% help=images/set-pixel +//% parts="ledmatrix" +void setPixel(Image i, int x, int y, bool value) { + setPixelBrightness(i, x, y, value ? 255 : 0); +} + +/** + * Get the pixel state at position ``(x,y)`` + * @param x pixel column + * @param y pixel row + */ +//% help=images/pixel +//% parts="ledmatrix" +bool pixel(Image i, int x, int y) { + return pixelBrightness(i, x, y) > 0; +} + +/** + * Show a particular frame of the image strip. + * @param frame image frame to show + */ +//% weight=70 help=images/show-frame +//% parts="ledmatrix" +void showFrame(Image i, int frame, int interval = 400) { + showImage(i, frame * 5, interval); +} +} // namespace ImageMethods \ No newline at end of file diff --git a/pxt_modules/core/input.cpp b/pxt_modules/core/input.cpp new file mode 100644 index 0000000..79ce2da --- /dev/null +++ b/pxt_modules/core/input.cpp @@ -0,0 +1,405 @@ +#include "pxt.h" + +enum class Button { + A = MICROBIT_ID_BUTTON_A, + B = MICROBIT_ID_BUTTON_B, + //% block="A+B" + AB = MICROBIT_ID_BUTTON_AB, +}; + +enum class Dimension { + //% block=x + X = 0, + //% block=y + Y = 1, + //% block=z + Z = 2, + //% block=strength + Strength = 3, +}; + +enum class Rotation { + //% block=pitch + Pitch = 0, + //% block=roll + Roll = 1, +}; + +enum class TouchPin { + P0 = MICROBIT_ID_IO_P0, + P1 = MICROBIT_ID_IO_P1, + P2 = MICROBIT_ID_IO_P2, +}; + +enum class AcceleratorRange { + /** + * The accelerator measures forces up to 1 gravity + */ + //% block="1g" + OneG = 1, + /** + * The accelerator measures forces up to 2 gravity + */ + //% block="2g" + TwoG = 2, + /** + * The accelerator measures forces up to 4 gravity + */ + //% block="4g" + FourG = 4, + /** + * The accelerator measures forces up to 8 gravity + */ + //% block="8g" + EightG = 8 +}; + +enum class Gesture { + /** + * Raised when shaken + */ + //% block=shake + //% jres=gestures.shake + Shake = MICROBIT_ACCELEROMETER_EVT_SHAKE, + /** + * Raised when the logo is upward and the screen is vertical + */ + //% block="logo up" + //% jres=gestures.tiltforward + LogoUp = MICROBIT_ACCELEROMETER_EVT_TILT_UP, + /** + * Raised when the logo is downward and the screen is vertical + */ + //% block="logo down" + //% jres=gestures.tiltbackwards + LogoDown = MICROBIT_ACCELEROMETER_EVT_TILT_DOWN, + /** + * Raised when the screen is pointing down and the board is horizontal + */ + //% block="screen up" + //% jres=gestures.frontsideup + ScreenUp = MICROBIT_ACCELEROMETER_EVT_FACE_UP, + /** + * Raised when the screen is pointing up and the board is horizontal + */ + //% block="screen down" + //% jres=gestures.backsideup + ScreenDown = MICROBIT_ACCELEROMETER_EVT_FACE_DOWN, + /** + * Raised when the screen is pointing left + */ + //% block="tilt left" + //% jres=gestures.tiltleft + TiltLeft = MICROBIT_ACCELEROMETER_EVT_TILT_LEFT, + /** + * Raised when the screen is pointing right + */ + //% block="tilt right" + //% jres=gestures.tiltright + TiltRight = MICROBIT_ACCELEROMETER_EVT_TILT_RIGHT, + /** + * Raised when the board is falling! + */ + //% block="free fall" + //% jres=gestures.freefall + FreeFall = MICROBIT_ACCELEROMETER_EVT_FREEFALL, + /** + * Raised when a 3G shock is detected + */ + //% block="3g" + //% jres=gestures.impact3g + ThreeG = MICROBIT_ACCELEROMETER_EVT_3G, + /** + * Raised when a 6G shock is detected + */ + //% block="6g" + //% jres=gestures.impact6g + SixG = MICROBIT_ACCELEROMETER_EVT_6G, + /** + * Raised when a 8G shock is detected + */ + //% block="8g" + //% jres=gestures.impact8g + EightG = MICROBIT_ACCELEROMETER_EVT_8G +}; + +enum class MesDpadButtonInfo { + //% block="A down" + ADown = MES_DPAD_BUTTON_A_DOWN, + //% block="A up" + AUp = MES_DPAD_BUTTON_A_UP, + //% block="B down" + BDown = MES_DPAD_BUTTON_B_DOWN, + //% block="B up" + BUp = MES_DPAD_BUTTON_B_UP, + //% block="C down" + CDown = MES_DPAD_BUTTON_C_DOWN, + //% block="C up" + CUp = MES_DPAD_BUTTON_C_UP, + //% block="D down" + DDown = MES_DPAD_BUTTON_D_DOWN, + //% block="D up" + DUp = MES_DPAD_BUTTON_D_UP, + //% block="1 down" + _1Down = MES_DPAD_BUTTON_1_DOWN, + //% block="1 up" + _1Up = MES_DPAD_BUTTON_1_UP, + //% block="2 down" + _2Down = MES_DPAD_BUTTON_2_DOWN, + //% block="2 up" + _2Up = MES_DPAD_BUTTON_2_UP, + //% block="3 down" + _3Down = MES_DPAD_BUTTON_3_DOWN, + //% block="3 up" + _3Up = MES_DPAD_BUTTON_3_UP, + //% block="4 down" + _4Down = MES_DPAD_BUTTON_4_DOWN, + //% block="4 up" + _4Up = MES_DPAD_BUTTON_4_UP, +}; + +//% color=#D400D4 weight=111 icon="\uf192" +namespace input { + /** + * Do something when a button (A, B or both A+B) is pushed down and released again. + * @param button the button that needs to be pressed + * @param body code to run when event is raised + */ + //% help=input/on-button-pressed weight=85 blockGap=16 + //% blockId=device_button_event block="on button|%NAME|pressed" + //% parts="buttonpair" + void onButtonPressed(Button button, Action body) { + registerWithDal((int)button, MICROBIT_BUTTON_EVT_CLICK, body); + } + + /** + * Do something when when a gesture is done (like shaking the micro:bit). + * @param gesture the type of gesture to track, eg: Gesture.Shake + * @param body code to run when gesture is raised + */ + //% help=input/on-gesture weight=84 blockGap=16 + //% blockId=device_gesture_event block="on |%NAME" + //% parts="accelerometer" + //% NAME.fieldEditor="gestures" NAME.fieldOptions.columns=4 + void onGesture(Gesture gesture, Action body) { + int gi = (int)gesture; + if (gi == MICROBIT_ACCELEROMETER_EVT_3G && uBit.accelerometer.getRange() < 3) + uBit.accelerometer.setRange(4); + else if ((gi == MICROBIT_ACCELEROMETER_EVT_6G || gi == MICROBIT_ACCELEROMETER_EVT_8G) && uBit.accelerometer.getRange() < 6) + uBit.accelerometer.setRange(8); + registerWithDal(MICROBIT_ID_GESTURE, gi, body); + } + + /** + * Tests if a gesture is currently detected. + * @param gesture the type of gesture to detect, eg: Gesture.Shake + */ + //% help=input/is-gesture weight=10 blockGap=8 + //% blockId=deviceisgesture block="is %gesture gesture" + //% parts="accelerometer" + //% gesture.fieldEditor="gestures" gesture.fieldOptions.columns=4 + bool isGesture(Gesture gesture) { + int gi = (int)gesture; + return uBit.accelerometer.getGesture() == gi; + } + + /** + * Do something when a pin is touched and released again (while also touching the GND pin). + * @param name the pin that needs to be pressed, eg: TouchPin.P0 + * @param body the code to run when the pin is pressed + */ + //% help=input/on-pin-pressed weight=83 blockGap=32 + //% blockId=device_pin_event block="on pin %name|pressed" + void onPinPressed(TouchPin name, Action body) { + auto pin = getPin((int)name); + if (!pin) return; + + // Forces the PIN to switch to makey-makey style detection. + pin->isTouched(); + registerWithDal((int)name, MICROBIT_BUTTON_EVT_CLICK, body); + } + + /** + * Do something when a pin is released. + * @param name the pin that needs to be released, eg: TouchPin.P0 + * @param body the code to run when the pin is released + */ + //% help=input/on-pin-released weight=6 blockGap=16 + //% blockId=device_pin_released block="on pin %NAME|released" + //% advanced=true + void onPinReleased(TouchPin name, Action body) { + auto pin = getPin((int)name); + if (!pin) return; + + // Forces the PIN to switch to makey-makey style detection. + pin->isTouched(); + registerWithDal((int)name, MICROBIT_BUTTON_EVT_UP, body); + } + + /** + * Get the button state (pressed or not) for ``A`` and ``B``. + * @param button the button to query the request, eg: Button.A + */ + //% help=input/button-is-pressed weight=60 + //% block="button|%NAME|is pressed" + //% blockId=device_get_button2 + //% icon="\uf192" blockGap=8 + //% parts="buttonpair" + bool buttonIsPressed(Button button) { + if (button == Button::A) + return uBit.buttonA.isPressed(); + else if (button == Button::B) + return uBit.buttonB.isPressed(); + else if (button == Button::AB) + return uBit.buttonAB.isPressed(); + return false; + } + + /** + * Get the pin state (pressed or not). Requires to hold the ground to close the circuit. + * @param name pin used to detect the touch, eg: TouchPin.P0 + */ + //% help=input/pin-is-pressed weight=58 + //% blockId="device_pin_is_pressed" block="pin %NAME|is pressed" + //% blockGap=8 + bool pinIsPressed(TouchPin name) { + auto pin = getPin((int)name); + return pin && pin->isTouched(); + } + + int getAccelerationStrength() { + double x = uBit.accelerometer.getX(); + double y = uBit.accelerometer.getY(); + double z = uBit.accelerometer.getZ(); + return (int)sqrt(x*x+y*y+z*z); + } + + /** + * Get the acceleration value in milli-gravitys (when the board is laying flat with the screen up, x=0, y=0 and z=-1024) + * @param dimension x, y, or z dimension, eg: Dimension.X + */ + //% help=input/acceleration weight=58 + //% blockId=device_acceleration block="acceleration (mg)|%NAME" blockGap=8 + //% parts="accelerometer" + int acceleration(Dimension dimension) { + switch (dimension) { + case Dimension::X: return uBit.accelerometer.getX(); + case Dimension::Y: return uBit.accelerometer.getY(); + case Dimension::Z: return uBit.accelerometer.getZ(); + case Dimension::Strength: return getAccelerationStrength(); + } + return 0; + } + + /** + * Reads the light level applied to the LED screen in a range from ``0`` (dark) to ``255`` bright. + */ + //% help=input/light-level weight=57 + //% blockId=device_get_light_level block="light level" blockGap=8 + //% parts="ledmatrix" + int lightLevel() { + return uBit.display.readLightLevel(); + } + + /** + * Get the current compass heading in degrees. + */ + //% help=input/compass-heading + //% weight=56 + //% blockId=device_heading block="compass heading (°)" blockGap=8 + //% parts="compass" + int compassHeading() { + return uBit.compass.heading(); + } + + + /** + * Gets the temperature in Celsius degrees (°C). + */ + //% weight=55 + //% help=input/temperature + //% blockId=device_temperature block="temperature (°C)" blockGap=8 + //% parts="thermometer" + int temperature() { + return uBit.thermometer.getTemperature(); + } + + /** + * The pitch or roll of the device, rotation along the ``x-axis`` or ``y-axis``, in degrees. + * @param kind pitch or roll + */ + //% help=input/rotation weight=52 + //% blockId=device_get_rotation block="rotation (°)|%NAME" blockGap=8 + //% parts="accelerometer" advanced=true + int rotation(Rotation kind) { + switch (kind) { + case Rotation::Pitch: return uBit.accelerometer.getPitch(); + case Rotation::Roll: return uBit.accelerometer.getRoll(); + } + return 0; + } + + /** + * Get the magnetic force value in ``micro-Teslas`` (``µT``). This function is not supported in the simulator. + * @param dimension the x, y, or z dimension, eg: Dimension.X + */ + //% help=input/magnetic-force weight=51 + //% blockId=device_get_magnetic_force block="magnetic force (µT)|%NAME" blockGap=8 + //% parts="compass" + //% advanced=true + int magneticForce(Dimension dimension) { + if (!uBit.compass.isCalibrated()) + uBit.compass.calibrate(); + + switch (dimension) { + case Dimension::X: return uBit.compass.getX() / 1000; + case Dimension::Y: return uBit.compass.getY() / 1000; + case Dimension::Z: return uBit.compass.getZ() / 1000; + case Dimension::Strength: return uBit.compass.getFieldStrength() / 1000; + } + return 0; + } + + /** + * Gets the number of milliseconds elapsed since power on. + */ + //% help=input/running-time weight=50 blockGap=8 + //% blockId=device_get_running_time block="running time (ms)" + //% advanced=true + int runningTime() { + return system_timer_current_time(); + } + + /** + * Gets the number of microseconds elapsed since power on. + */ + //% help=input/running-time-micros weight=49 + //% blockId=device_get_running_time_micros block="running time (micros)" + //% advanced=true + int runningTimeMicros() { + return system_timer_current_time_us(); + } + + /** + * Obsolete, compass calibration is automatic. + */ + //% help=input/calibrate-compass advanced=true + //% blockId="input_compass_calibrate" block="calibrate compass" + //% weight=45 + void calibrateCompass() { + uBit.compass.calibrate(); + } + + /** + * Sets the accelerometer sample range in gravities. + * @param range a value describe the maximum strengh of acceleration measured + */ + //% help=input/set-accelerometer-range + //% blockId=device_set_accelerometer_range block="set accelerometer|range %range" + //% weight=5 + //% parts="accelerometer" + //% advanced=true + void setAccelerometerRange(AcceleratorRange range) { + uBit.accelerometer.setRange((int)range); + } +} diff --git a/pxt_modules/core/input.ts b/pxt_modules/core/input.ts new file mode 100644 index 0000000..6b5880c --- /dev/null +++ b/pxt_modules/core/input.ts @@ -0,0 +1,58 @@ +/** + * Events and data from sensors + */ +//% color=#D400D4 weight=111 icon="\uf192" +namespace input { + /** + * Attaches code to run when the screen is facing up. + * @param body TODO + */ + //% help=input/on-screen-up + export function onScreenUp(body: () => void): void { + onGesture(Gesture.ScreenUp, body); + } + + /** + * Attaches code to run when the screen is facing down. + * @param body TODO + */ + //% help=input/on-screen-down + export function onScreenDown(body: () => void): void { + onGesture(Gesture.ScreenDown, body); + } + + /** + * Attaches code to run when the device is shaken. + * @param body TODO + */ + //% help=input/on-shake + export function onShake(body: () => void): void { + onGesture(Gesture.Shake, body); + } + + /** + * Attaches code to run when the logo is oriented upwards and the board is vertical. + * @param body TODO + */ + //% help=input/on-logo-up + export function onLogoUp(body: () => void): void { + onGesture(Gesture.LogoUp, body); + } + + /** + * Attaches code to run when the logo is oriented downwards and the board is vertical. + * @param body TODO + */ + //% help=input/on-logo-down + export function onLogoDown(body: () => void): void { + onGesture(Gesture.LogoDown, body); + } + + /** + * Obsolete, use input.calibrateCompass instead. + */ + //% weight=0 help=input/calibrate-compass + export function calibrate() { + input.calibrateCompass(); + } +} diff --git a/pxt_modules/core/led.cpp b/pxt_modules/core/led.cpp new file mode 100644 index 0000000..80af46a --- /dev/null +++ b/pxt_modules/core/led.cpp @@ -0,0 +1,166 @@ +#include "pxt.h" + +enum class DisplayMode_ { + //% block="black and white" + BlackAndWhite = DISPLAY_MODE_BLACK_AND_WHITE, + //% blockHidden=true + BackAndWhite = DISPLAY_MODE_BLACK_AND_WHITE, + //% block="greyscale" + Greyscale = DISPLAY_MODE_GREYSCALE, + // TODO DISPLAY_MODE_BLACK_AND_WHITE_LIGHT_SENSE +}; + +//% color=#7600A8 weight=101 icon="\uf205" +namespace led { + + /** + * Turn on the specified LED using x, y coordinates (x is horizontal, y is vertical). (0,0) is upper left. + * @param x the horizontal coordinate of the LED starting at 0 + * @param y the vertical coordinate of the LED starting at 0 + */ + //% help=led/plot weight=78 + //% blockId=device_plot block="plot|x %x|y %y" blockGap=8 + //% parts="ledmatrix" + //% x.min=0 x.max=4 y.min=0 y.max=4 + //% x.fieldOptions.precision=1 y.fieldOptions.precision=1 + void plot(int x, int y) { + uBit.display.image.setPixelValue(x, y, 0xff); + } + + /** + * Turn on the specified LED with specific brightness using x, y coordinates (x is horizontal, y is vertical). (0,0) is upper left. + * @param x the horizontal coordinate of the LED starting at 0 + * @param y the vertical coordinate of the LED starting at 0 + * @param brightness the brightness from 0 (off) to 255 (bright), eg:255 + */ + //% help=led/plot-brightness weight=78 + //% blockId=device_plot_brightness block="plot|x %x|y %y|brightness %brightness" blockGap=8 + //% parts="ledmatrix" + //% x.min=0 x.max=4 y.min=0 y.max=4 brightness.min=0 brightness.max=255 + //% x.fieldOptions.precision=1 y.fieldOptions.precision=1 + //% advanced=true + void plotBrightness(int x, int y, int brightness) { + brightness = max(0, min(0xff, brightness)); + // enable greyscale as needed + if (brightness != 0 && brightness != 0xff && uBit.display.getDisplayMode() != DISPLAY_MODE_GREYSCALE) + uBit.display.setDisplayMode(DISPLAY_MODE_GREYSCALE); + uBit.display.image.setPixelValue(x, y, brightness); + } + + /** + * Turn off the specified LED using x, y coordinates (x is horizontal, y is vertical). (0,0) is upper left. + * @param x the horizontal coordinate of the LED + * @param y the vertical coordinate of the LED + */ + //% help=led/unplot weight=77 + //% blockId=device_unplot block="unplot|x %x|y %y" blockGap=8 + //% parts="ledmatrix" + //% x.min=0 x.max=4 y.min=0 y.max=4 + //% x.fieldOptions.precision=1 y.fieldOptions.precision=1 + void unplot(int x, int y) { + uBit.display.image.setPixelValue(x, y, 0); + } + + /** + * Get the on/off state of the specified LED using x, y coordinates. (0,0) is upper left. + * @param x the horizontal coordinate of the LED + * @param y the vertical coordinate of the LED + */ + //% help=led/point weight=76 + //% blockId=device_point block="point|x %x|y %y" + //% parts="ledmatrix" + //% x.min=0 x.max=4 y.min=0 y.max=4 + //% x.fieldOptions.precision=1 y.fieldOptions.precision=1 + bool point(int x, int y) { + int pix = uBit.display.image.getPixelValue(x, y); + return pix > 0; + } + + /** + * Get the screen brightness from 0 (off) to 255 (full bright). + */ + //% help=led/brightness weight=60 + //% blockId=device_get_brightness block="brightness" blockGap=8 + //% parts="ledmatrix" + //% advanced=true + int brightness() { + return uBit.display.getBrightness(); + } + + /** + * Set the screen brightness from 0 (off) to 255 (full bright). + * @param value the brightness value, eg:255, 127, 0 + */ + //% help=led/set-brightness weight=59 + //% blockId=device_set_brightness block="set brightness %value" + //% parts="ledmatrix" + //% advanced=true + //% value.min=0 value.max=255 + void setBrightness(int value) { + uBit.display.setBrightness(value); + } + + /** + * Cancels the current animation and clears other pending animations. + */ + //% weight=50 help=led/stop-animation + //% blockId=device_stop_animation block="stop animation" + //% parts="ledmatrix" + //% advanced=true + void stopAnimation() { + uBit.display.stopAnimation(); + } + + /** + * Sets the display mode between black and white and greyscale for rendering LEDs. + * @param mode mode the display mode in which the screen operates + */ + //% weight=1 help=led/set-display-mode + //% parts="ledmatrix" advanced=true weight=1 + //% blockId="led_set_display_mode" block="set display mode $mode" + void setDisplayMode(DisplayMode_ mode) { + uBit.display.setDisplayMode((DisplayMode)mode); + } + + /** + * Gets the current display mode + */ + //% weight=1 parts="ledmatrix" advanced=true + DisplayMode_ displayMode() { + return (DisplayMode_)uBit.display.getDisplayMode(); + } + + /** + * Turns on or off the display + */ + //% help=led/enable blockId=device_led_enable block="led enable %on" + //% advanced=true parts="ledmatrix" + void enable(bool on) { + if (on) uBit.display.enable(); + else uBit.display.disable(); + } + + /** + * Takes a screenshot of the LED screen and returns an image. + */ + //% help=led/screenshot + //% parts="ledmatrix" + Image screenshot() { + auto d = uBit.display.screenShot().leakData(); + auto r = NEW_GC(RefMImage, d); + d->decr(); + return r; + /* + let Image img; + img = image.createImage(""); + for (let i = 0; i < 5; i++) { + for (let j = 0; j < 5; j++) { + if (led.point(i, j)) { + img.setPixel(i, j, true); + } + } + } + return img; + */ + } +} diff --git a/pxt_modules/core/led.ts b/pxt_modules/core/led.ts new file mode 100644 index 0000000..b526556 --- /dev/null +++ b/pxt_modules/core/led.ts @@ -0,0 +1,147 @@ +/** + * Control of the LED screen. + */ +//% color=#5C2D91 weight=101 icon="\uf205" + namespace led { + + // what's the current high value + let barGraphHigh = 0; + // when was the current high value recorded + let barGraphHighLast = 0; + + /** + * Displays a vertical bar graph based on the `value` and `high` value. + * If `high` is 0, the chart gets adjusted automatically. + * @param value current value to plot + * @param high maximum value. If 0, maximum value adjusted automatically, eg: 0 + */ + //% help=led/plot-bar-graph weight=20 + //% blockId=device_plot_bar_graph block="plot bar graph of %value up to %high" icon="\uf080" blockExternalInputs=true + //% parts="ledmatrix" + export function plotBarGraph(value: number, high: number): void { + const now = input.runningTime(); + console.logValue("", value); + value = Math.abs(value); + + // auto-scale "high" is not provided + if (high > 0) { + barGraphHigh = high; + } else if (value > barGraphHigh || now - barGraphHighLast > 10000) { + barGraphHigh = value; + barGraphHighLast = now; + } + + // normalize lack of data to 0..1 + if (barGraphHigh < 16 * Number.EPSILON) + barGraphHigh = 1; + + // normalize value to 0..1 + const v = value / barGraphHigh; + const dv = 1 / 16; + let k = 0; + for (let y = 4; y >= 0; --y) { + for (let x = 0; x < 3; ++x) { + if (k > v) { + unplot(2 - x, y); + unplot(2 + x, y); + } else { + plot(2 - x, y); + plot(2 + x, y); + } + k += dv; + } + } + } + + /** + * Toggles a particular pixel + * @param x pixel column + * @param y pixel row + */ + //% help=led/toggle weight=77 + //% blockId=device_led_toggle block="toggle|x %x|y %y" icon="\uf204" blockGap=8 + //% parts="ledmatrix" + //% x.min=0 x.max=4 y.min=0 y.max=4 + //% x.fieldOptions.precision=1 y.fieldOptions.precision=1 + export function toggle(x: number, y: number): void { + if (led.point(x, y)) { + led.unplot(x, y); + } else { + led.plot(x, y); + } + } + + /** + * Turns all LEDS on + */ + //% help=led/plot-all + //% parts="ledmatrix" + export function plotAll(): void { + for (let i = 0; i < 5; i++) { + for (let j = 0; j < 5; j++) { + led.plot(i, j); + } + } + } + + /** + * Inverts the current LED display + */ + //% help=led/toggle-all + //% parts="ledmatrix" + export function toggleAll(): void { + for (let i = 0; i < 5; i++) { + for (let j = 0; j < 5; j++) { + led.toggle(i, j); + } + } + } + + /** + * Fades in the screen display. + * @param ms fade time in milleseconds + */ + //% help=led/fade-in + //% parts="ledmatrix" + export function fadeIn(ms: number = 700): void { + if (ms < 20) { + led.setBrightness(255); + return; + } + let dt = 50; + let brightness = led.brightness(); + let start = input.runningTime(); + let elapsed = 0; + while (elapsed < ms) { + led.setBrightness(brightness + ((255 - brightness) * elapsed) / ms); + basic.pause(dt); + elapsed = input.runningTime() - start; + } + led.setBrightness(255); + } + + /** + * Fades out the screen brightness. + * @param ms fade time in milliseconds + */ + //% help=led/fade-out + //% parts="ledmatrix" + export function fadeOut(ms: number = 700): void { + if (ms < 20) { + led.setBrightness(0); + return; + } + let brightness = led.brightness(); + let dt = 50; + let start = input.runningTime(); + let elapsed = 0; + while (elapsed < ms) { + led.setBrightness(brightness - (brightness * elapsed) / ms); + basic.pause(dt); + elapsed = input.runningTime() - start; + } + led.setBrightness(0); + } + + +} diff --git a/pxt_modules/core/math.ts b/pxt_modules/core/math.ts new file mode 100644 index 0000000..deafef0 --- /dev/null +++ b/pxt_modules/core/math.ts @@ -0,0 +1,83 @@ +namespace Math { + + export const E = 2.718281828459045; + export const LN2 = 0.6931471805599453; + export const LN10 = 2.302585092994046; + export const LOG2E = 1.4426950408889634; + export const LOG10E = 0.4342944819032518; + export const PI = 3.141592653589793; + export const SQRT1_2 = 0.7071067811865476; + export const SQRT2 = 1.4142135623730951; + + /** + * Re-maps a number from one range to another. That is, a value of ``from low`` would get mapped to ``to low``, a value of ``from high`` to ``to high``, values in-between to values in-between, etc. + * @param value value to map in ranges + * @param fromLow the lower bound of the value's current range + * @param fromHigh the upper bound of the value's current range, eg: 1023 + * @param toLow the lower bound of the value's target range + * @param toHigh the upper bound of the value's target range, eg: 4 + */ + //% help=math/map weight=10 blockGap=8 + //% blockId=math_map block="map %value|from low %fromLow|high %fromHigh|to low %toLow|high %toHigh" + //% inlineInputMode=inline + export function map(value: number, fromLow: number, fromHigh: number, toLow: number, toHigh: number): number { + return ((value - fromLow) * (toHigh - toLow)) / (fromHigh - fromLow) + toLow; + } + + /** + * Constrains a number to be within a range + * @param x the number to constrain, all data types + * @param y the lower end of the range, all data types + * @param z the upper end of the range, all data types + */ + //% help=math/constrain weight=11 blockGap=8 + //% blockId="math_constrain_value" block="constrain %value|between %low|and %high" + export function constrain(value: number, low: number, high: number): number { + return value < low ? low : value > high ? high : value; + } + + const b_m16: number[] = [0, 49, 49, 41, 90, 27, 117, 10] + /** + * Returns the sine of an input angle. This is an 8-bit approximation. + * @param theta input angle from 0-255 + */ + //% help=math/isin weight=11 advanced=true blockGap=8 + export function isin(theta: number) { + //reference: based on FASTLed's sin approximation method: [https://github.com/FastLED/FastLED](MIT) + let offset = theta; + if( theta & 0x40 ) { + offset = 255 - offset; + } + offset &= 0x3F; // 0..63 + + let secoffset = offset & 0x0F; // 0..15 + if( theta & 0x40) secoffset++; + + let section = offset >> 4; // 0..3 + let s2 = section * 2; + + let b = b_m16[s2]; + let m16 = b_m16[s2+1]; + let mx = (m16 * secoffset) >> 4; + + let y = mx + b; + if( theta & 0x80 ) y = -y; + + y += 128; + + return y; + } + + /** + * Returns the cosine of an input angle. This is an 8-bit approximation. + * @param theta input angle from 0-255 + */ + //% help=math/icos weight=10 advanced=true blockGap=8 + export function icos(theta: number) { + return isin(theta + 16384); + } +} + +namespace Number { + export const EPSILON = 2.220446049250313e-16; +} \ No newline at end of file diff --git a/pxt_modules/core/melodies.ts b/pxt_modules/core/melodies.ts new file mode 100644 index 0000000..bbeed36 --- /dev/null +++ b/pxt_modules/core/melodies.ts @@ -0,0 +1,119 @@ +/* +The MIT License (MIT) + +Copyright (c) 2013-2016 The MicroPython-on-micro:bit Developers, as listed +in the accompanying AUTHORS file + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + +// Melodies from file microbitmusictunes.c https://github.com/bbcmicrobit/MicroPython + +enum Melodies { + //% block="dadadum" blockIdentity=music.builtInMelody + Dadadadum = 0, + //% block="entertainer" blockIdentity=music.builtInMelody + Entertainer, + //% block="prelude" blockIdentity=music.builtInMelody + Prelude, + //% block="ode" blockIdentity=music.builtInMelody + Ode, + //% block="nyan" blockIdentity=music.builtInMelody + Nyan, + //% block="ringtone" blockIdentity=music.builtInMelody + Ringtone, + //% block="funk" blockIdentity=music.builtInMelody + Funk, + //% block="blues" blockIdentity=music.builtInMelody + Blues, + //% block="birthday" blockIdentity=music.builtInMelody + Birthday, + //% block="wedding" blockIdentity=music.builtInMelody + Wedding, + //% block="funereal" blockIdentity=music.builtInMelody + Funeral, + //% block="punchline" blockIdentity=music.builtInMelody + Punchline, + //% block="baddy" blockIdentity=music.builtInMelody + Baddy, + //% block="chase" blockIdentity=music.builtInMelody + Chase, + //% block="ba ding" blockIdentity=music.builtInMelody + BaDing, + //% block="wawawawaa" blockIdentity=music.builtInMelody + Wawawawaa, + //% block="jump up" blockIdentity=music.builtInMelody + JumpUp, + //% block="jump down" blockIdentity=music.builtInMelody + JumpDown, + //% block="power up" blockIdentity=music.builtInMelody + PowerUp, + //% block="power down" blockIdentity=music.builtInMelody + PowerDown, +} + +namespace music { + + export function getMelody(melody: Melodies): string[] { + switch (melody) { + case Melodies.Dadadadum: + return ['r4:2', 'g', 'g', 'g', 'eb:8', 'r:2', 'f', 'f', 'f', 'd:8']; + case Melodies.Entertainer: + return ['d4:1', 'd#', 'e', 'c5:2', 'e4:1', 'c5:2', 'e4:1', 'c5:3', 'c:1', 'd', 'd#', 'e', 'c', 'd', 'e:2', 'b4:1', 'd5:2', 'c:4']; + case Melodies.Prelude: + return ['c4:1', 'e', 'g', 'c5', 'e', 'g4', 'c5', 'e', 'c4', 'e', 'g', 'c5', 'e', 'g4', 'c5', 'e', 'c4', 'd', 'g', 'd5', 'f', 'g4', 'd5', 'f', 'c4', 'd', 'g', 'd5', 'f', 'g4', 'd5', 'f', 'b3', 'd4', 'g', 'd5', 'f', 'g4', 'd5', 'f', 'b3', 'd4', 'g', 'd5', 'f', 'g4', 'd5', 'f', 'c4', 'e', 'g', 'c5', 'e', 'g4', 'c5', 'e', 'c4', 'e', 'g', 'c5', 'e', 'g4', 'c5', 'e']; + case Melodies.Ode: + return ['e4', 'e', 'f', 'g', 'g', 'f', 'e', 'd', 'c', 'c', 'd', 'e', 'e:6', 'd:2', 'd:8', 'e:4', 'e', 'f', 'g', 'g', 'f', 'e', 'd', 'c', 'c', 'd', 'e', 'd:6', 'c:2', 'c:8']; + case Melodies.Nyan: + return ['f#5:2', 'g#', 'c#:1', 'd#:2', 'b4:1', 'd5:1', 'c#', 'b4:2', 'b', 'c#5', 'd', 'd:1', 'c#', 'b4:1', 'c#5:1', 'd#', 'f#', 'g#', 'd#', 'f#', 'c#', 'd', 'b4', 'c#5', 'b4', 'd#5:2', 'f#', 'g#:1', 'd#', 'f#', 'c#', 'd#', 'b4', 'd5', 'd#', 'd', 'c#', 'b4', 'c#5', 'd:2', 'b4:1', 'c#5', 'd#', 'f#', 'c#', 'd', 'c#', 'b4', 'c#5:2', 'b4', 'c#5', 'b4', 'f#:1', 'g#', 'b:2', 'f#:1', 'g#', 'b', 'c#5', 'd#', 'b4', 'e5', 'd#', 'e', 'f#', 'b4:2', 'b', 'f#:1', 'g#', 'b', 'f#', 'e5', 'd#', 'c#', 'b4', 'f#', 'd#', 'e', 'f#', 'b:2', 'f#:1', 'g#', 'b:2', 'f#:1', 'g#', 'b', 'b', 'c#5', 'd#', 'b4', 'f#', 'g#', 'f#', 'b:2', 'b:1', 'a#', 'b', 'f#', 'g#', 'b', 'e5', 'd#', 'e', 'f#', 'b4:2', 'c#5']; + case Melodies.Ringtone: + return ['c4:1', 'd', 'e:2', 'g', 'd:1', 'e', 'f:2', 'a', 'e:1', 'f', 'g:2', 'b', 'c5:4']; + case Melodies.Funk: + return ['c2:2', 'c', 'd#', 'c:1', 'f:2', 'c:1', 'f:2', 'f#', 'g', 'c', 'c', 'g', 'c:1', 'f#:2', 'c:1', 'f#:2', 'f', 'd#']; + case Melodies.Blues: + return ['c2:2', 'e', 'g', 'a', 'a#', 'a', 'g', 'e', 'c2:2', 'e', 'g', 'a', 'a#', 'a', 'g', 'e', 'f', 'a', 'c3', 'd', 'd#', 'd', 'c', 'a2', 'c2:2', 'e', 'g', 'a', 'a#', 'a', 'g', 'e', 'g', 'b', 'd3', 'f', 'f2', 'a', 'c3', 'd#', 'c2:2', 'e', 'g', 'e', 'g', 'f', 'e', 'd']; + case Melodies.Birthday: + return ['c4:3', 'c:1', 'd:4', 'c:4', 'f', 'e:8', 'c:3', 'c:1', 'd:4', 'c:4', 'g', 'f:8', 'c:3', 'c:1', 'c5:4', 'a4', 'f', 'e', 'd', 'a#:3', 'a#:1', 'a:4', 'f', 'g', 'f:8']; + case Melodies.Wedding: + return ['c4:4', 'f:3', 'f:1', 'f:8', 'c:4', 'g:3', 'e:1', 'f:8', 'c:4', 'f:3', 'a:1', 'c5:4', 'a4:3', 'f:1', 'f:4', 'e:3', 'f:1', 'g:8']; + case Melodies.Funeral: + return ['c3:4', 'c:3', 'c:1', 'c:4', 'd#:3', 'd:1', 'd:3', 'c:1', 'c:3', 'b2:1', 'c3:4']; + case Melodies.Punchline: + return ['c4:3', 'g3:1', 'f#', 'g', 'g#:3', 'g', 'r', 'b', 'c4']; + case Melodies.Baddy: + return ['c3:3', 'r', 'd:2', 'd#', 'r', 'c', 'r', 'f#:8']; + case Melodies.Chase: + return ['a4:1', 'b', 'c5', 'b4', 'a:2', 'r', 'a:1', 'b', 'c5', 'b4', 'a:2', 'r', 'a:2', 'e5', 'd#', 'e', 'f', 'e', 'd#', 'e', 'b4:1', 'c5', 'd', 'c', 'b4:2', 'r', 'b:1', 'c5', 'd', 'c', 'b4:2', 'r', 'b:2', 'e5', 'd#', 'e', 'f', 'e', 'd#', 'e']; + case Melodies.BaDing: + return ['b5:1', 'e6:3']; + case Melodies.Wawawawaa: + return ['e3:3', 'r:1', 'd#:3', 'r:1', 'd:4', 'r:1', 'c#:8']; + case Melodies.JumpUp: + return ['c5:1', 'd', 'e', 'f', 'g']; + case Melodies.JumpDown: + return ['g5:1', 'f', 'e', 'd', 'c']; + case Melodies.PowerUp: + return ['g4:1', 'c5', 'e', 'g:2', 'e:1', 'g:3']; + case Melodies.PowerDown: + return ['g5:1', 'd#', 'c', 'g4:2', 'b:1', 'c5:3']; + default: + return []; + } + } +} \ No newline at end of file diff --git a/pxt_modules/core/music.ts b/pxt_modules/core/music.ts new file mode 100644 index 0000000..a7e3c6f --- /dev/null +++ b/pxt_modules/core/music.ts @@ -0,0 +1,468 @@ +enum Note { + //% blockIdentity=music.noteFrequency enumval=262 + C = 262, + //% block=C# + //% blockIdentity=music.noteFrequency enumval=277 + CSharp = 277, + //% blockIdentity=music.noteFrequency enumval=294 + D = 294, + //% blockIdentity=music.noteFrequency enumval=311 + Eb = 311, + //% blockIdentity=music.noteFrequency enumval=330 + E = 330, + //% blockIdentity=music.noteFrequency enumval=349 + F = 349, + //% block=F# + //% blockIdentity=music.noteFrequency enumval=370 + FSharp = 370, + //% blockIdentity=music.noteFrequency enumval=392 + G = 392, + //% block=G# + //% blockIdentity=music.noteFrequency enumval=415 + GSharp = 415, + //% blockIdentity=music.noteFrequency enumval=440 + A = 440, + //% blockIdentity=music.noteFrequency enumval=466 + Bb = 466, + //% blockIdentity=music.noteFrequency enumval=494 + B = 494, + //% blockIdentity=music.noteFrequency enumval=131 + C3 = 131, + //% block=C#3 + //% blockIdentity=music.noteFrequency enumval=139 + CSharp3 = 139, + //% blockIdentity=music.noteFrequency enumval=147 + D3 = 147, + //% blockIdentity=music.noteFrequency enumval=156 + Eb3 = 156, + //% blockIdentity=music.noteFrequency enumval=165 + E3 = 165, + //% blockIdentity=music.noteFrequency enumval=175 + F3 = 175, + //% block=F#3 + //% blockIdentity=music.noteFrequency enumval=185 + FSharp3 = 185, + //% blockIdentity=music.noteFrequency enumval=196 + G3 = 196, + //% block=G#3 + //% blockIdentity=music.noteFrequency enumval=208 + GSharp3 = 208, + //% blockIdentity=music.noteFrequency enumval=220 + A3 = 220, + //% blockIdentity=music.noteFrequency enumval=233 + Bb3 = 233, + //% blockIdentity=music.noteFrequency enumval=247 + B3 = 247, + //% blockIdentity=music.noteFrequency enumval=262 + C4 = 262, + //% block=C#4 + //% blockIdentity=music.noteFrequency enumval=277 + CSharp4 = 277, + //% blockIdentity=music.noteFrequency enumval=294 + D4 = 294, + //% blockIdentity=music.noteFrequency enumval=311 + Eb4 = 311, + //% blockIdentity=music.noteFrequency enumval=330 + E4 = 330, + //% blockIdentity=music.noteFrequency enumval=349 + F4 = 349, + //% block=F#4 + //% blockIdentity=music.noteFrequency enumval=370 + FSharp4 = 370, + //% blockIdentity=music.noteFrequency enumval=392 + G4 = 392, + //% block=G#4 + //% blockIdentity=music.noteFrequency enumval=415 + GSharp4 = 415, + //% blockIdentity=music.noteFrequency enumval=440 + A4 = 440, + //% blockIdentity=music.noteFrequency enumval=466 + Bb4 = 466, + //% blockIdentity=music.noteFrequency enumval=494 + B4 = 494, + //% blockIdentity=music.noteFrequency enumval=523 + C5 = 523, + //% block=C#5 + //% blockIdentity=music.noteFrequency enumval=555 + CSharp5 = 555, + //% blockIdentity=music.noteFrequency enumval=587 + D5 = 587, + //% blockIdentity=music.noteFrequency enumval=622 + Eb5 = 622, + //% blockIdentity=music.noteFrequency enumval=659 + E5 = 659, + //% blockIdentity=music.noteFrequency enumval=698 + F5 = 698, + //% block=F#5 + //% blockIdentity=music.noteFrequency enumval=740 + FSharp5 = 740, + //% blockIdentity=music.noteFrequency enumval=784 + G5 = 784, + //% block=G#5 + //% blockIdentity=music.noteFrequency enumval=831 + GSharp5 = 831, + //% blockIdentity=music.noteFrequency enumval=880 + A5 = 880, + //% blockIdentity=music.noteFrequency enumval=932 + Bb5 = 932, + //% blockIdentity=music.noteFrequency enumval=988 + B5 = 988, +} + +enum BeatFraction { + //% block=1 + Whole = 1, + //% block="1/2" + Half = 2, + //% block="1/4" + Quarter = 4, + //% block="1/8" + Eighth = 8, + //% block="1/16" + Sixteenth = 16, + //% block="2" + Double = 32, + //% block="4", + Breve = 64 +} + +enum MelodyOptions { + //% block="once" + Once = 1, + //% block="forever" + Forever = 2, + //% block="once in background" + OnceInBackground = 4, + //% block="forever in background" + ForeverInBackground = 8 +} + +enum MelodyStopOptions { + //% block="all" + All = MelodyOptions.Once | MelodyOptions.OnceInBackground, + //% block="foreground" + Foreground = MelodyOptions.Once, + //% block="background" + Background = MelodyOptions.OnceInBackground +} + +enum MusicEvent { + //% block="melody note played" + MelodyNotePlayed = 1, + //% block="melody started" + MelodyStarted = 2, + //% block="melody ended" + MelodyEnded = 3, + //% block="melody repeated" + MelodyRepeated = 4, + //% block="background melody note played" + BackgroundMelodyNotePlayed = MelodyNotePlayed | 0xf0, + //% block="background melody started" + BackgroundMelodyStarted = MelodyStarted | 0xf0, + //% block="background melody ended" + BackgroundMelodyEnded = MelodyEnded | 0xf0, + //% block="background melody repeated" + BackgroundMelodyRepeated = MelodyRepeated | 0xf0, + //% block="background melody paused" + BackgroundMelodyPaused = 5 | 0xf0, + //% block="background melody resumed" + BackgroundMelodyResumed = 6 | 0xf0 +} + +/** + * Generation of music tones. + */ +//% color=#E63022 weight=106 icon="\uf025" +namespace music { + let beatsPerMinute: number = 120; + //% whenUsed + const freqs = hex` + 1f00210023002500270029002c002e003100340037003a003e004100450049004e00520057005c00620068006e00 + 75007b0083008b0093009c00a500af00b900c400d000dc00e900f70006011501260137014a015d01720188019f01 + b801d201ee010b022a024b026e029302ba02e40210033f037003a403dc03170455049704dd0427057505c8052006 + 7d06e0064907b8072d08a9082d09b9094d0aea0a900b400cfa0cc00d910e6f0f5a1053115b1272139a14d4152017 + 8018f519801b231dde1e`; + let _playTone: (frequency: number, duration: number) => void; + const MICROBIT_MELODY_ID = 2000; + + /** + * Plays a tone through pin ``P0`` for the given duration. + * @param frequency pitch of the tone to play in Hertz (Hz), eg: Note.C + * @param ms tone duration in milliseconds (ms) + */ + //% help=music/play-tone weight=90 + //% blockId=device_play_note block="play|tone %note=device_note|for %duration=device_beat" blockGap=8 + //% parts="headphone" + //% useEnumVal=1 + export function playTone(frequency: number, ms: number): void { + if (_playTone) _playTone(frequency, ms); + else pins.analogPitch(frequency, ms); + } + + /** + * Plays a tone through pin ``P0``. + * @param frequency pitch of the tone to play in Hertz (Hz), eg: Note.C + */ + //% help=music/ring-tone weight=80 + //% blockId=device_ring block="ring tone (Hz)|%note=device_note" blockGap=8 + //% parts="headphone" + //% useEnumVal=1 + export function ringTone(frequency: number): void { + playTone(frequency, 0); + } + + /** + * Rests (plays nothing) for a specified time through pin ``P0``. + * @param ms rest duration in milliseconds (ms) + */ + //% help=music/rest weight=79 + //% blockId=device_rest block="rest(ms)|%duration=device_beat" + //% parts="headphone" + export function rest(ms: number): void { + playTone(0, ms); + } + + + /** + * Gets the frequency of a note. + * @param name the note name + */ + //% weight=50 help=music/note-frequency + //% blockId=device_note block="%name" + //% shim=TD_ID color="#FFFFFF" colorSecondary="#FFFFFF" + //% name.fieldEditor="note" name.defl="262" + //% name.fieldOptions.decompileLiterals=true + //% useEnumVal=1 + export function noteFrequency(name: Note): number { + return name; + } + + function init() { + if (beatsPerMinute <= 0) beatsPerMinute = 120; + } + + /** + * Returns the duration of a beat in milli-seconds + */ + //% help=music/beat weight=49 + //% blockId=device_beat block="%fraction|beat" + export function beat(fraction?: BeatFraction): number { + init(); + if (fraction == null) fraction = BeatFraction.Whole; + let beat = Math.idiv(60000, beatsPerMinute); + switch (fraction) { + case BeatFraction.Half: return beat >> 1; + case BeatFraction.Quarter: return beat >> 2; + case BeatFraction.Eighth: return beat >> 3; + case BeatFraction.Sixteenth: return beat >> 4; + case BeatFraction.Double: return beat << 1; + case BeatFraction.Breve: return beat << 2; + default: return beat; + } + } + + /** + * Returns the tempo in beats per minute. Tempo is the speed (bpm = beats per minute) at which notes play. The larger the tempo value, the faster the notes will play. + */ + //% help=music/tempo weight=40 + //% blockId=device_tempo block="tempo (bpm)" blockGap=8 + export function tempo(): number { + init(); + return beatsPerMinute; + } + + /** + * Change the tempo by the specified amount + * @param bpm The change in beats per minute to the tempo, eg: 20 + */ + //% help=music/change-tempo-by weight=39 + //% blockId=device_change_tempo block="change tempo by (bpm)|%value" blockGap=8 + export function changeTempoBy(bpm: number): void { + init(); + setTempo(beatsPerMinute + bpm); + } + + /** + * Sets the tempo to the specified amount + * @param bpm The new tempo in beats per minute, eg: 120 + */ + //% help=music/set-tempo weight=38 + //% blockId=device_set_tempo block="set tempo to (bpm)|%value" + //% bpm.min=4 bpm.max=400 + export function setTempo(bpm: number): void { + init(); + if (bpm > 0) { + beatsPerMinute = Math.max(1, bpm); + } + } + + let currentMelody: Melody; + let currentBackgroundMelody: Melody; + + /** + * Gets the melody array of a built-in melody. + * @param name the note name, eg: Note.C + */ + //% weight=50 help=music/builtin-melody + //% blockId=device_builtin_melody block="%melody" + //% blockHidden=true + export function builtInMelody(melody: Melodies): string[] { + return getMelody(melody); + } + + /** + * Registers code to run on various melody events + */ + //% blockId=melody_on_event block="music on %value" + //% help=music/on-event weight=59 blockGap=32 + export function onEvent(value: MusicEvent, handler: () => void) { + control.onEvent(MICROBIT_MELODY_ID, value, handler); + } + + /** + * Starts playing a melody. + * Notes are expressed as a string of characters with this format: NOTE[octave][:duration] + * @param melodyArray the melody array to play + * @param options melody options, once / forever, in the foreground / background + */ + //% help=music/begin-melody weight=60 blockGap=16 + //% blockId=device_start_melody block="start melody %melody=device_builtin_melody| repeating %options" + //% parts="headphone" + export function beginMelody(melodyArray: string[], options: MelodyOptions = 1) { + init(); + if (currentMelody != undefined) { + if (((options & MelodyOptions.OnceInBackground) == 0) + && ((options & MelodyOptions.ForeverInBackground) == 0) + && currentMelody.background) { + currentBackgroundMelody = currentMelody; + currentMelody = null; + control.raiseEvent(MICROBIT_MELODY_ID, MusicEvent.BackgroundMelodyPaused); + } + if (currentMelody) + control.raiseEvent(MICROBIT_MELODY_ID, currentMelody.background ? MusicEvent.BackgroundMelodyEnded : MusicEvent.MelodyEnded); + currentMelody = new Melody(melodyArray, options); + control.raiseEvent(MICROBIT_MELODY_ID, currentMelody.background ? MusicEvent.BackgroundMelodyStarted : MusicEvent.MelodyStarted); + } else { + currentMelody = new Melody(melodyArray, options); + control.raiseEvent(MICROBIT_MELODY_ID, currentMelody.background ? MusicEvent.BackgroundMelodyStarted : MusicEvent.MelodyStarted); + // Only start the fiber once + control.inBackground(() => { + while (currentMelody.hasNextNote()) { + playNextNote(currentMelody); + if (!currentMelody.hasNextNote() && currentBackgroundMelody) { + // Swap the background melody back + currentMelody = currentBackgroundMelody; + currentBackgroundMelody = null; + control.raiseEvent(MICROBIT_MELODY_ID, MusicEvent.MelodyEnded); + control.raiseEvent(MICROBIT_MELODY_ID, MusicEvent.BackgroundMelodyResumed); + } + } + control.raiseEvent(MICROBIT_MELODY_ID, currentMelody.background ? MusicEvent.BackgroundMelodyEnded : MusicEvent.MelodyEnded); + currentMelody = null; + }) + } + } + + /** + * Stops the melodies + * @param options which melody to stop + */ + //% help=music/stop-melody weight=59 blockGap=16 + //% blockId=device_stop_melody block="stop melody $options" + //% parts="headphone" + export function stopMelody(options: MelodyStopOptions) { + if (options & MelodyStopOptions.Background) + beginMelody([], MelodyOptions.OnceInBackground); + if (options & MelodyStopOptions.Foreground) + beginMelody([], MelodyOptions.Once); + } + + /** + * Sets a custom playTone function for playing melodies + */ + //% help=music/set-play-tone + //% advanced=true + export function setPlayTone(f: (frequency: number, duration: number) => void) { + _playTone = f; + } + + function playNextNote(melody: Melody): void { + // cache elements + let currNote = melody.nextNote(); + let currentPos = melody.currentPos; + let currentDuration = melody.currentDuration; + let currentOctave = melody.currentOctave; + + let note: number; + let isrest: boolean = false; + let beatPos: number; + let parsingOctave: boolean = true; + let prevNote: boolean = false; + + for (let pos = 0; pos < currNote.length; pos++) { + let noteChar = currNote.charAt(pos); + switch (noteChar) { + case 'c': case 'C': note = 1; prevNote = true; break; + case 'd': case 'D': note = 3; prevNote = true; break; + case 'e': case 'E': note = 5; prevNote = true; break; + case 'f': case 'F': note = 6; prevNote = true; break; + case 'g': case 'G': note = 8; prevNote = true; break; + case 'a': case 'A': note = 10; prevNote = true; break; + case 'B': note = 12; prevNote = true; break; + case 'r': case 'R': isrest = true; prevNote = false; break; + case '#': note++; prevNote = false; break; + case 'b': if (prevNote) note--; else { note = 12; prevNote = true; } break; + case ':': parsingOctave = false; beatPos = pos; prevNote = false; break; + default: prevNote = false; if (parsingOctave) currentOctave = parseInt(noteChar); + } + } + if (!parsingOctave) { + currentDuration = parseInt(currNote.substr(beatPos + 1, currNote.length - beatPos)); + } + let beat = Math.idiv(60000, beatsPerMinute) >> 2; + if (isrest) { + music.rest(currentDuration * beat) + } else { + let keyNumber = note + (12 * (currentOctave - 1)); + let frequency = freqs.getNumber(NumberFormat.UInt16LE, keyNumber * 2) || 0; + music.playTone(frequency, currentDuration * beat); + } + melody.currentDuration = currentDuration; + melody.currentOctave = currentOctave; + const repeating = melody.repeating && currentPos == melody.melodyArray.length - 1; + melody.currentPos = repeating ? 0 : currentPos + 1; + + control.raiseEvent(MICROBIT_MELODY_ID, melody.background ? MusicEvent.BackgroundMelodyNotePlayed : MusicEvent.MelodyNotePlayed); + if (repeating) + control.raiseEvent(MICROBIT_MELODY_ID, melody.background ? MusicEvent.BackgroundMelodyRepeated : MusicEvent.MelodyRepeated); + } + + class Melody { + public melodyArray: string[]; + public currentDuration: number; + public currentOctave: number; + public currentPos: number; + public repeating: boolean; + public background: boolean; + + constructor(melodyArray: string[], options: MelodyOptions) { + this.melodyArray = melodyArray; + this.repeating = ((options & MelodyOptions.Forever) != 0); + this.repeating = this.repeating ? true : ((options & MelodyOptions.ForeverInBackground) != 0) + this.background = ((options & MelodyOptions.OnceInBackground) != 0); + this.background = this.background ? true : ((options & MelodyOptions.ForeverInBackground) != 0); + this.currentDuration = 4; //Default duration (Crotchet) + this.currentOctave = 4; //Middle octave + this.currentPos = 0; + } + + hasNextNote() { + return this.repeating || this.currentPos < this.melodyArray.length; + } + + nextNote(): string { + const currentNote = this.melodyArray[this.currentPos]; + return currentNote; + } + } +} diff --git a/pxt_modules/core/parts/headphone.svg b/pxt_modules/core/parts/headphone.svg new file mode 100644 index 0000000..fa4fc1e --- /dev/null +++ b/pxt_modules/core/parts/headphone.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pxt_modules/core/parts/speaker.svg b/pxt_modules/core/parts/speaker.svg new file mode 100644 index 0000000..6a03638 --- /dev/null +++ b/pxt_modules/core/parts/speaker.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pxt_modules/core/pins.cpp b/pxt_modules/core/pins.cpp new file mode 100644 index 0000000..dde282b --- /dev/null +++ b/pxt_modules/core/pins.cpp @@ -0,0 +1,450 @@ +#include "pxt.h" + +enum class DigitalPin { + P0 = MICROBIT_ID_IO_P0, + P1 = MICROBIT_ID_IO_P1, + P2 = MICROBIT_ID_IO_P2, + P3 = MICROBIT_ID_IO_P3, + P4 = MICROBIT_ID_IO_P4, + P5 = MICROBIT_ID_IO_P5, + P6 = MICROBIT_ID_IO_P6, + P7 = MICROBIT_ID_IO_P7, + P8 = MICROBIT_ID_IO_P8, + P9 = MICROBIT_ID_IO_P9, + P10 = MICROBIT_ID_IO_P10, + P11 = MICROBIT_ID_IO_P11, + P12 = MICROBIT_ID_IO_P12, + P13 = MICROBIT_ID_IO_P13, + P14 = MICROBIT_ID_IO_P14, + P15 = MICROBIT_ID_IO_P15, + P16 = MICROBIT_ID_IO_P16, + P19 = MICROBIT_ID_IO_P19, + P20 = MICROBIT_ID_IO_P20, +}; + +enum class AnalogPin { + P0 = MICROBIT_ID_IO_P0, + P1 = MICROBIT_ID_IO_P1, + P2 = MICROBIT_ID_IO_P2, + P3 = MICROBIT_ID_IO_P3, + P4 = MICROBIT_ID_IO_P4, + P10 = MICROBIT_ID_IO_P10, + //% block="P5 (write only)" + P5 = MICROBIT_ID_IO_P5, + //% block="P6 (write only)" + P6 = MICROBIT_ID_IO_P6, + //% block="P7 (write only)" + P7 = MICROBIT_ID_IO_P7, + //% block="P8 (write only)" + P8 = MICROBIT_ID_IO_P8, + //% block="P9 (write only)" + P9 = MICROBIT_ID_IO_P9, + //% block="P11 (write only)" + P11 = MICROBIT_ID_IO_P11, + //% block="P12 (write only)" + P12 = MICROBIT_ID_IO_P12, + //% block="P13 (write only)" + P13 = MICROBIT_ID_IO_P13, + //% block="P14 (write only)" + P14 = MICROBIT_ID_IO_P14, + //% block="P15 (write only)" + P15 = MICROBIT_ID_IO_P15, + //% block="P16 (write only)" + P16 = MICROBIT_ID_IO_P16, + //% block="P19 (write only)" + P19 = MICROBIT_ID_IO_P19, + //% block="P20 (write only)" + P20 = MICROBIT_ID_IO_P20 +}; + +enum class PulseValue { + //% block=high + High = MICROBIT_PIN_EVT_PULSE_HI, + //% block=low + Low = MICROBIT_PIN_EVT_PULSE_LO +}; + +enum class PinPullMode { + //% block="down" + PullDown = 0, + //% block="up" + PullUp = 1, + //% block="none" + PullNone = 2 +}; + +enum class PinEventType { + //% block="edge" + Edge = MICROBIT_PIN_EVENT_ON_EDGE, + //% block="pulse" + Pulse = MICROBIT_PIN_EVENT_ON_PULSE, + //% block="touch" + Touch = MICROBIT_PIN_EVENT_ON_TOUCH, + //% block="none" + None = MICROBIT_PIN_EVENT_NONE +}; + + +namespace pxt +{ +MicroBitPin *getPin(int id) { + switch (id) { + case MICROBIT_ID_IO_P0: return &uBit.io.P0; + case MICROBIT_ID_IO_P1: return &uBit.io.P1; + case MICROBIT_ID_IO_P2: return &uBit.io.P2; + case MICROBIT_ID_IO_P3: return &uBit.io.P3; + case MICROBIT_ID_IO_P4: return &uBit.io.P4; + case MICROBIT_ID_IO_P5: return &uBit.io.P5; + case MICROBIT_ID_IO_P6: return &uBit.io.P6; + case MICROBIT_ID_IO_P7: return &uBit.io.P7; + case MICROBIT_ID_IO_P8: return &uBit.io.P8; + case MICROBIT_ID_IO_P9: return &uBit.io.P9; + case MICROBIT_ID_IO_P10: return &uBit.io.P10; + case MICROBIT_ID_IO_P11: return &uBit.io.P11; + case MICROBIT_ID_IO_P12: return &uBit.io.P12; + case MICROBIT_ID_IO_P13: return &uBit.io.P13; + case MICROBIT_ID_IO_P14: return &uBit.io.P14; + case MICROBIT_ID_IO_P15: return &uBit.io.P15; + case MICROBIT_ID_IO_P16: return &uBit.io.P16; + case MICROBIT_ID_IO_P19: return &uBit.io.P19; + case MICROBIT_ID_IO_P20: return &uBit.io.P20; + default: return NULL; + } +} + +} // pxt + +namespace pins { + #define PINOP(op) \ + MicroBitPin *pin = getPin((int)name); \ + if (!pin) return; \ + pin->op + + #define PINREAD(op) \ + MicroBitPin *pin = getPin((int)name); \ + if (!pin) return 0; \ + return pin->op + + + //% + MicroBitPin *getPinAddress(int id) { + return getPin(id); + } + + /** + * Read the specified pin or connector as either 0 or 1 + * @param name pin to read from, eg: DigitalPin.P0 + */ + //% help=pins/digital-read-pin weight=30 + //% blockId=device_get_digital_pin block="digital read|pin %name" blockGap=8 + //% name.fieldEditor="gridpicker" name.fieldOptions.columns=4 + //% name.fieldOptions.tooltips="false" name.fieldOptions.width="250" + int digitalReadPin(DigitalPin name) { + PINREAD(getDigitalValue()); + } + + /** + * Set a pin or connector value to either 0 or 1. + * @param name pin to write to, eg: DigitalPin.P0 + * @param value value to set on the pin, 1 eg,0 + */ + //% help=pins/digital-write-pin weight=29 + //% blockId=device_set_digital_pin block="digital write|pin %name|to %value" + //% value.min=0 value.max=1 + //% name.fieldEditor="gridpicker" name.fieldOptions.columns=4 + //% name.fieldOptions.tooltips="false" name.fieldOptions.width="250" + void digitalWritePin(DigitalPin name, int value) { + PINOP(setDigitalValue(value)); + } + + /** + * Read the connector value as analog, that is, as a value comprised between 0 and 1023. + * @param name pin to write to, eg: AnalogPin.P0 + */ + //% help=pins/analog-read-pin weight=25 + //% blockId=device_get_analog_pin block="analog read|pin %name" blockGap="8" + //% name.fieldEditor="gridpicker" name.fieldOptions.columns=4 + //% name.fieldOptions.tooltips="false" name.fieldOptions.width="250" + int analogReadPin(AnalogPin name) { + PINREAD(getAnalogValue()); + } + + /** + * Set the connector value as analog. Value must be comprised between 0 and 1023. + * @param name pin name to write to, eg: AnalogPin.P0 + * @param value value to write to the pin between ``0`` and ``1023``. eg:1023,0 + */ + //% help=pins/analog-write-pin weight=24 + //% blockId=device_set_analog_pin block="analog write|pin %name|to %value" blockGap=8 + //% value.min=0 value.max=1023 + //% name.fieldEditor="gridpicker" name.fieldOptions.columns=4 + //% name.fieldOptions.tooltips="false" name.fieldOptions.width="250" + void analogWritePin(AnalogPin name, int value) { + PINOP(setAnalogValue(value)); + } + + /** + * Configure the pulse-width modulation (PWM) period of the analog output in microseconds. + * If this pin is not configured as an analog output (using `analog write pin`), the operation has no effect. + * @param name analog pin to set period to, eg: AnalogPin.P0 + * @param micros period in micro seconds. eg:20000 + */ + //% help=pins/analog-set-period weight=23 blockGap=8 + //% blockId=device_set_analog_period block="analog set period|pin %pin|to (µs)%micros" + //% pin.fieldEditor="gridpicker" pin.fieldOptions.columns=4 + //% pin.fieldOptions.tooltips="false" + void analogSetPeriod(AnalogPin name, int micros) { + PINOP(setAnalogPeriodUs(micros)); + } + + /** + * Configure the pin as a digital input and generate an event when the pin is pulsed either high or low. + * @param name digital pin to register to, eg: DigitalPin.P0 + * @param pulse the value of the pulse, eg: PulseValue.High + */ + //% help=pins/on-pulsed weight=22 blockGap=16 advanced=true + //% blockId=pins_on_pulsed block="on|pin %pin|pulsed %pulse" + //% pin.fieldEditor="gridpicker" pin.fieldOptions.columns=4 + //% pin.fieldOptions.tooltips="false" pin.fieldOptions.width="250" + void onPulsed(DigitalPin name, PulseValue pulse, Action body) { + MicroBitPin* pin = getPin((int)name); + if (!pin) return; + + pin->eventOn(MICROBIT_PIN_EVENT_ON_PULSE); + registerWithDal((int)name, (int)pulse, body); + } + + /** + * Get the duration of the last pulse in microseconds. This function should be called from a ``onPulsed`` handler. + */ + //% help=pins/pulse-duration advanced=true + //% blockId=pins_pulse_duration block="pulse duration (µs)" + //% weight=21 blockGap=8 + int pulseDuration() { + return pxt::lastEvent.timestamp; + } + + /** + * Return the duration of a pulse at a pin in microseconds. + * @param name the pin which measures the pulse, eg: DigitalPin.P0 + * @param value the value of the pulse, eg: PulseValue.High + * @param maximum duration in microseconds + */ + //% blockId="pins_pulse_in" block="pulse in (µs)|pin %name|pulsed %value" + //% weight=20 advanced=true + //% help=pins/pulse-in + //% name.fieldEditor="gridpicker" name.fieldOptions.columns=4 + //% name.fieldOptions.tooltips="false" name.fieldOptions.width="250" + int pulseIn(DigitalPin name, PulseValue value, int maxDuration = 2000000) { + MicroBitPin* pin = getPin((int)name); + if (!pin) return 0; + + int pulse = value == PulseValue::High ? 1 : 0; + uint64_t tick = system_timer_current_time_us(); + uint64_t maxd = (uint64_t)maxDuration; + while(pin->getDigitalValue() != pulse) { + if(system_timer_current_time_us() - tick > maxd) + return 0; + } + + uint64_t start = system_timer_current_time_us(); + while(pin->getDigitalValue() == pulse) { + if(system_timer_current_time_us() - tick > maxd) + return 0; + } + uint64_t end = system_timer_current_time_us(); + return end - start; + } + + /** + * Write a value to the servo, controlling the shaft accordingly. On a standard servo, this will set the angle of the shaft (in degrees), moving the shaft to that orientation. On a continuous rotation servo, this will set the speed of the servo (with ``0`` being full-speed in one direction, ``180`` being full speed in the other, and a value near ``90`` being no movement). + * @param name pin to write to, eg: AnalogPin.P0 + * @param value angle or rotation speed, eg:180,90,0 + */ + //% help=pins/servo-write-pin weight=20 + //% blockId=device_set_servo_pin block="servo write|pin %name|to %value" blockGap=8 + //% parts=microservo trackArgs=0 + //% value.min=0 value.max=180 + //% name.fieldEditor="gridpicker" name.fieldOptions.columns=4 + //% name.fieldOptions.tooltips="false" name.fieldOptions.width="250" + void servoWritePin(AnalogPin name, int value) { + PINOP(setServoValue(value)); + } + + /** + * Configure the IO pin as an analog/pwm output and set a pulse width. The period is 20 ms period and the pulse width is set based on the value given in **microseconds** or `1/1000` milliseconds. + * @param name pin name + * @param micros pulse duration in micro seconds, eg:1500 + */ + //% help=pins/servo-set-pulse weight=19 + //% blockId=device_set_servo_pulse block="servo set pulse|pin %value|to (µs) %micros" + //% value.fieldEditor="gridpicker" value.fieldOptions.columns=4 + //% value.fieldOptions.tooltips="false" value.fieldOptions.width="250" + void servoSetPulse(AnalogPin name, int micros) { + PINOP(setServoPulseUs(micros)); + } + + + MicroBitPin* pitchPin = NULL; + + /** + * Set the pin used when using analog pitch or music. + * @param name pin to modulate pitch from + */ + //% blockId=device_analog_set_pitch_pin block="analog set pitch pin %name" + //% help=pins/analog-set-pitch-pin weight=3 advanced=true + //% name.fieldEditor="gridpicker" name.fieldOptions.columns=4 + //% name.fieldOptions.tooltips="false" name.fieldOptions.width="250" + void analogSetPitchPin(AnalogPin name) { + pitchPin = getPin((int)name); + } + + /** + * Emit a plse-width modulation (PWM) signal to the current pitch pin. Use `analog set pitch pin` to define the pitch pin. + * @param frequency frequency to modulate in Hz. + * @param ms duration of the pitch in milli seconds. + */ + //% blockId=device_analog_pitch block="analog pitch %frequency|for (ms) %ms" + //% help=pins/analog-pitch weight=4 async advanced=true blockGap=8 + void analogPitch(int frequency, int ms) { + if (pitchPin == NULL) + analogSetPitchPin(AnalogPin::P0); + if (frequency <= 0) { + pitchPin->setAnalogValue(0); + } else { + pitchPin->setAnalogValue(512); + pitchPin->setAnalogPeriodUs(1000000/frequency); + } + + if (ms > 0) { + fiber_sleep(ms); + pitchPin->setAnalogValue(0); + // TODO why do we use wait_ms() here? it's a busy wait I think + wait_ms(5); + } + } + + + /** + * Configure the pull directiion of of a pin. + * @param name pin to set the pull mode on, eg: DigitalPin.P0 + * @param pull one of the mbed pull configurations, eg: PinPullMode.PullUp + */ + //% help=pins/set-pull weight=3 advanced=true + //% blockId=device_set_pull block="set pull|pin %pin|to %pull" + //% pin.fieldEditor="gridpicker" pin.fieldOptions.columns=4 + //% pin.fieldOptions.tooltips="false" pin.fieldOptions.width="250" + void setPull(DigitalPin name, PinPullMode pull) { + PinMode m = pull == PinPullMode::PullDown + ? PinMode::PullDown + : pull == PinPullMode::PullUp ? PinMode::PullUp + : PinMode::PullNone; + PINOP(setPull(m)); + } + + /** + * Configure the events emitted by this pin. Events can be subscribed to + * using ``control.onEvent()``. + * @param name pin to set the event mode on, eg: DigitalPin.P0 + * @param type the type of events for this pin to emit, eg: PinEventType.Edge + */ + //% help=pins/set-events weight=4 advanced=true + //% blockId=device_set_pin_events block="set pin %pin|to emit %type|events" + //% pin.fieldEditor="gridpicker" pin.fieldOptions.columns=4 + //% pin.fieldOptions.tooltips="false" pin.fieldOptions.width="250" + void setEvents(DigitalPin name, PinEventType type) { + getPin((int)name)->eventOn((int)type); + } + + /** + * Create a new zero-initialized buffer. + * @param size number of bytes in the buffer + */ + //% + Buffer createBuffer(int size) + { + return mkBuffer(NULL, size); + } + + /** + * Read `size` bytes from a 7-bit I2C `address`. + */ + //% + Buffer i2cReadBuffer(int address, int size, bool repeat = false) + { + Buffer buf = createBuffer(size); + uBit.i2c.read(address << 1, (char*)buf->data, size, repeat); + return buf; + } + + /** + * Write bytes to a 7-bit I2C `address`. + */ + //% + int i2cWriteBuffer(int address, Buffer buf, bool repeat = false) + { + return uBit.i2c.write(address << 1, (char*)buf->data, buf->length, repeat); + } + + SPI* spi = NULL; + SPI* allocSPI() { + if (NULL == spi) + spi = new SPI(MOSI, MISO, SCK); + return spi; + } + + /** + * Write to the SPI slave and return the response + * @param value Data to be sent to the SPI slave + */ + //% help=pins/spi-write weight=5 advanced=true + //% blockId=spi_write block="spi write %value" + int spiWrite(int value) { + auto p = allocSPI(); + return p->write(value); + } + + /** + * Set the SPI frequency + * @param frequency the clock frequency, eg: 1000000 + */ + //% help=pins/spi-frequency weight=4 advanced=true + //% blockId=spi_frequency block="spi frequency %frequency" + void spiFrequency(int frequency) { + auto p = allocSPI(); + p->frequency(frequency); + } + + /** + * Set the SPI bits and mode + * @param bits the number of bits, eg: 8 + * @param mode the mode, eg: 3 + */ + //% help=pins/spi-format weight=3 advanced=true + //% blockId=spi_format block="spi format|bits %bits|mode %mode" + void spiFormat(int bits, int mode) { + auto p = allocSPI(); + p->format(bits, mode); + } + + /** + * Set the MOSI, MISO, SCK pins used by the SPI connection + * + */ + //% help=pins/spi-pins weight=2 advanced=true + //% blockId=spi_pins block="spi set pins|MOSI %mosi|MISO %miso|SCK %sck" + //% mosi.fieldEditor="gridpicker" mosi.fieldOptions.columns=4 + //% mosi.fieldOptions.tooltips="false" mosi.fieldOptions.width="250" + //% miso.fieldEditor="gridpicker" miso.fieldOptions.columns=4 + //% miso.fieldOptions.tooltips="false" miso.fieldOptions.width="250" + //% sck.fieldEditor="gridpicker" sck.fieldOptions.columns=4 + //% sck.fieldOptions.tooltips="false" sck.fieldOptions.width="250" + void spiPins(DigitalPin mosi, DigitalPin miso, DigitalPin sck) { + if (NULL != spi) { + delete spi; + spi = NULL; + } + + spi = new SPI(getPin((int)mosi)->name, getPin((int)miso)->name, getPin((int)sck)->name); + } +} diff --git a/pxt_modules/core/pins.ts b/pxt_modules/core/pins.ts new file mode 100644 index 0000000..c75b86c --- /dev/null +++ b/pxt_modules/core/pins.ts @@ -0,0 +1,41 @@ +/** + * Control currents in Pins for analog/digital signals, servos, i2c, ... + */ +//% color=#B22222 weight=30 icon="\uf140" +//% advanced=true +namespace pins { + /** + * Map a number from one range to another. That is, a value of ``from low`` would get mapped to ``to low``, a value of ``from high`` to ``to high``, values in-between to values in-between, etc. + * @param value value to map in ranges + * @param fromLow the lower bound of the value's current range + * @param fromHigh the upper bound of the value's current range, eg: 1023 + * @param toLow the lower bound of the value's target range + * @param toHigh the upper bound of the value's target range, eg: 4 + */ + //% help=pins/map weight=23 + //% blockId=pin_map block="map %value|from low %fromLow|from high %fromHigh|to low %toLow|to high %toHigh" + export function map(value: number, fromLow: number, fromHigh: number, toLow: number, toHigh: number): number { + return ((value - fromLow) * (toHigh - toLow)) / (fromHigh - fromLow) + toLow; + } + + /** + * Read one number from 7-bit I2C address. + */ + //% help=pins/i2c-read-number blockGap=8 advanced=true + //% blockId=pins_i2c_readnumber block="i2c read number|at address %address|of format %format|repeated %repeat" weight=7 + export function i2cReadNumber(address: number, format: NumberFormat, repeated?: boolean): number { + let buf = pins.i2cReadBuffer(address, pins.sizeOf(format), repeated) + return buf.getNumber(format, 0) + } + + /** + * Write one number to a 7-bit I2C address. + */ + //% help=pins/i2c-write-number blockGap=8 advanced=true + //% blockId=i2c_writenumber block="i2c write number|at address %address|with value %value|of format %format|repeated %repeat" weight=6 + export function i2cWriteNumber(address: number, value: number, format: NumberFormat, repeated?: boolean): void { + let buf = createBuffer(pins.sizeOf(format)) + buf.setNumber(format, 0, value) + pins.i2cWriteBuffer(address, buf, repeated) + } +} diff --git a/pxt_modules/core/pinscompat.ts b/pxt_modules/core/pinscompat.ts new file mode 100644 index 0000000..d617a1a --- /dev/null +++ b/pxt_modules/core/pinscompat.ts @@ -0,0 +1,231 @@ +enum PinEvent { + //% block="pulse high" + PulseHigh = DAL.MICROBIT_PIN_EVT_PULSE_HI, // DEVICE_PIN_EVT_PULSE_HI + //% block="pulse low" + PulseLow = DAL.MICROBIT_PIN_EVT_PULSE_LO, // DEVICE_PIN_EVT_PULSE_LO + //% block="rise" + Rise = DAL.MICROBIT_PIN_EVT_RISE, // DEVICE_PIN_EVT_RISE + //% block="fall" + Fall = DAL.MICROBIT_PIN_EVT_FALL, // DEVICE_PIN_EVT_FALL +} + +//% noRefCounting fixedInstances +interface DigitalInOutPin { + digitalRead(): boolean; + + digitalWrite(value: boolean): void; + + onPulsed(pulse: PulseValue, body: () => void): void; + + onEvent(event: PinEvent, body: () => void): void; + + pulseIn(value: PulseValue, maxDuration?: number): number; + + setPull(pull: PinPullMode): void; +} + +//% noRefCounting fixedInstances +interface AnalogInPin extends DigitalInOutPin { + analogRead(): number; +} + +//% noRefCounting fixedInstances +interface AnalogOutPin extends DigitalInOutPin { + analogWrite(value: number): void; +} + +//% noRefCounting fixedInstances +interface AnalogInOutPin extends AnalogInPin, AnalogOutPin { +} + +//% noRefCounting fixedInstances +interface PwmOnlyPin extends DigitalInOutPin, AnalogOutPin { + //% parts=microservo trackArgs=0 + analogSetPeriod(period: number): void; + + //% parts=microservo trackArgs=0 + servoWrite(value: number): void; + + //% parts=microservo trackArgs=0 + servoSetPulse(duration: number): void; +} + +//% noRefCounting fixedInstances +interface PwmPin extends PwmOnlyPin, DigitalInOutPin, AnalogInPin { +} + +//% noRefCounting fixedInstances +class MicrobitPin implements AnalogInPin, AnalogOutPin, AnalogInOutPin, PwmOnlyPin { + public id: number; + constructor(id: number) { + this.id = id; + } + + protected digitalId(): DigitalPin { + return this.id; + } + + protected analogId(): AnalogPin { + return this.id; + } + + digitalRead(): boolean { + return pins.digitalReadPin(this.digitalId()) != 0; + } + + digitalWrite(value: boolean): void { + pins.digitalWritePin(this.digitalId(), value ? 1 : 0); + } + + onPulsed(pulse: PulseValue, body: () => void): void { + pins.onPulsed(this.digitalId(), pulse, body); + } + + onEvent(event: PinEvent, body: () => void): void { + // TODO + } + + pulseIn(value: PulseValue, maxDuration?: number): number { + return pins.pulseIn(this.digitalId(), value, maxDuration); + } + + setPull(pull: PinPullMode): void { + pins.setPull(this.digitalId(), pull); + } + + analogRead(): number { + return pins.analogReadPin(this.analogId()); + } + + analogWrite(value: number): void { + pins.analogWritePin(this.analogId(), value); + } + + analogSetPeriod(period: number): void { + pins.analogSetPeriod(this.analogId(), period); + } + + servoWrite(value: number): void { + pins.servoWritePin(this.analogId(), value); + } + + servoSetPulse(duration: number): void { + pins.servoSetPulse(this.analogId(), duration); + } +} + +namespace pins { + /** + * Pin P0 + */ + //% fixedInstance whenUsed + export const P0: PwmPin = new MicrobitPin(DigitalPin.P0); + + /** + * Pin P1 + */ + //% fixedInstance whenUsed + export const P1: PwmPin = new MicrobitPin(DigitalPin.P1); + + /** + * Pin P2 + */ + //% fixedInstance whenUsed + export const P2: PwmPin = new MicrobitPin(DigitalPin.P2); + + /** + * Pin P3 + */ + //% fixedInstance whenUsed + export const P3: AnalogInPin = new MicrobitPin(DigitalPin.P3); + + /** + * Pin P4 + */ + //% fixedInstance whenUsed + export const P4: AnalogInPin = new MicrobitPin(DigitalPin.P4); + + /** + * Pin P5 + */ + //% fixedInstance whenUsed + export const P5: DigitalInOutPin = new MicrobitPin(DigitalPin.P5); + + /** + * Pin P6 + */ + //% fixedInstance whenUsed + export const P6: DigitalInOutPin = new MicrobitPin(DigitalPin.P6); + + /** + * Pin P7 + */ + //% fixedInstance whenUsed + export const P7: DigitalInOutPin = new MicrobitPin(DigitalPin.P7); + + /** + * Pin P8 + */ + //% fixedInstance whenUsed + export const P8: DigitalInOutPin = new MicrobitPin(DigitalPin.P8); + + /** + * Pin P9 + */ + //% fixedInstance whenUsed + export const P9: DigitalInOutPin = new MicrobitPin(DigitalPin.P9); + + /** + * Pin P10 + */ + //% fixedInstance whenUsed + export const P10: AnalogInPin = new MicrobitPin(DigitalPin.P10); + + /** + * Pin P3 + */ + //% fixedInstance whenUsed + export const P11: DigitalInOutPin = new MicrobitPin(DigitalPin.P11); + + /** + * Pin P12 + */ + //% fixedInstance whenUsed + export const P12: DigitalInOutPin = new MicrobitPin(DigitalPin.P12); + + /** + * Pin P13 + */ + //% fixedInstance whenUsed + export const P13: DigitalInOutPin = new MicrobitPin(DigitalPin.P13); + + /** + * Pin P14 + */ + //% fixedInstance whenUsed + export const P14: DigitalInOutPin = new MicrobitPin(DigitalPin.P14); + + /** + * Pin P15 + */ + //% fixedInstance whenUsed + export const P15: DigitalInOutPin = new MicrobitPin(DigitalPin.P15); + + /** + * Pin P16 + */ + //% fixedInstance whenUsed + export const P16: DigitalInOutPin = new MicrobitPin(DigitalPin.P16); + + /** + * Pin P19 + */ + //% fixedInstance whenUsed + export const P19: DigitalInOutPin = new MicrobitPin(DigitalPin.P19); + + /** + * Pin P19 + */ + //% fixedInstance whenUsed + export const P20: DigitalInOutPin = new MicrobitPin(DigitalPin.P20); +} diff --git a/pxt_modules/core/platform.h b/pxt_modules/core/platform.h new file mode 100644 index 0000000..785d734 --- /dev/null +++ b/pxt_modules/core/platform.h @@ -0,0 +1,3 @@ +// helpful define to handle C++ differences in package +#define PXT_MICROBIT_TAGGED_INT 1 +#define PXT_POWI 1 diff --git a/pxt_modules/core/pxt-core.d.ts b/pxt_modules/core/pxt-core.d.ts new file mode 100644 index 0000000..9061e77 --- /dev/null +++ b/pxt_modules/core/pxt-core.d.ts @@ -0,0 +1,518 @@ +/// + +interface Array { + /** + * Get or set the length of an array. This number is one more than the index of the last element the array. + */ + //% shim=Array_::length weight=84 + //% blockId="lists_length" block="length of %VALUE" blockBuiltin=true blockNamespace="arrays" + length: number; + + /** + * Append a new element to an array. + * @param items New elements of the Array. + */ + //% help=arrays/push + //% shim=Array_::push weight=50 + //% blockId="array_push" block="%list| add value %value| to end" blockNamespace="arrays" + push(item: T): void; + + /** + * Concatenates the values with another array. + * @param arr The other array that is being concatenated with + */ + //% helper=arrayConcat weight=40 + concat(arr: T[]): T[]; + + /** + * Remove the last element from an array and return it. + */ + //% help=arrays/pop + //% shim=Array_::pop weight=45 + //% blockId="array_pop" block="get and remove last value from %list" blockNamespace="arrays" + //% blockGap=64 + pop(): T; + + /** + * Reverse the elements in an array. The first array element becomes the last, and the last array element becomes the first. + */ + //% help=arrays/reverse + //% helper=arrayReverse weight=10 + //% blockId="array_reverse" block="reverse %list" blockNamespace="arrays" + reverse(): void; + + /** + * Remove the first element from an array and return it. This method changes the length of the array. + */ + //% help=arrays/shift + //% helper=arrayShift weight=30 + //% blockId="array_shift" block="get and remove first value from %list" blockNamespace="arrays" + shift(): T; + + /** + * Add one element to the beginning of an array and return the new length of the array. + * @param element to insert at the start of the Array. + */ + //% help=arrays/unshift + //% helper=arrayUnshift weight=25 + //% blockId="array_unshift" block="%list| insert %value| at beginning" blockNamespace="arrays" + //unshift(...values:T[]): number; //rest is not supported in our compiler yet. + unshift(value: T): number; + + /** + * Return a section of an array. + * @param start The beginning of the specified portion of the array. eg: 0 + * @param end The end of the specified portion of the array. eg: 0 + */ + //% help=arrays/slice + //% helper=arraySlice weight=41 blockNamespace="arrays" + slice(start?: number, end?: number): T[]; + + /** + * Remove elements from an array. + * @param start The zero-based location in the array from which to start removing elements. eg: 0 + * @param deleteCount The number of elements to remove. eg: 0 + */ + //% helper=arraySplice weight=40 + splice(start: number, deleteCount: number): void; + + /** + * joins all elements of an array into a string and returns this string. + * @param sep the string separator + */ + //% helper=arrayJoin weight=40 + join(sep?: string): string; + + /** + * Tests whether at least one element in the array passes the test implemented by the provided function. + * @param callbackfn A function that accepts up to two arguments. The some method calls the callbackfn function one time for each element in the array. + */ + //% helper=arraySome weight=40 + some(callbackfn: (value: T, index: number) => boolean): boolean; + + /** + * Tests whether all elements in the array pass the test implemented by the provided function. + * @param callbackfn A function that accepts up to two arguments. The every method calls the callbackfn function one time for each element in the array. + */ + //% helper=arrayEvery weight=40 + every(callbackfn: (value: T, index: number) => boolean): boolean; + + /** + * Sort the elements of an array in place and returns the array. The sort is not necessarily stable. + * @param specifies a function that defines the sort order. If omitted, the array is sorted according to the prmitive type + */ + //% helper=arraySort weight=40 + sort(callbackfn?: (value1: T, value2: T) => number): T[]; + + /** + * Call a defined callback function on each element of an array, and return an array containing the results. + * @param callbackfn A function that accepts up to two arguments. The map method calls the callbackfn function one time for each element in the array. + */ + //% helper=arrayMap weight=40 + map(callbackfn: (value: T, index: number) => U): U[]; + + /** + * Call a defined callback function on each element of an array. + * @param callbackfn A function that accepts up to two arguments. The forEach method calls the callbackfn function one time for each element in the array. + */ + //% helper=arrayForEach weight=40 + forEach(callbackfn: (value: T, index: number) => void): void; + + /** + * Return the elements of an array that meet the condition specified in a callback function. + * @param callbackfn A function that accepts up to two arguments. The filter method calls the callbackfn function one time for each element in the array. + */ + //% helper=arrayFilter weight=40 + filter(callbackfn: (value: T, index: number) => boolean): T[]; + + /** + * Fills all the elements of an array from a start index to an end index with a static value. The end index is not included. + */ + //% helper=arrayFill weight=39 + fill(value: T, start?: number, end?: number): T[]; + + /** + * Returns the value of the first element in the array that satisfies the provided testing function. Otherwise undefined is returned. + * @param callbackfn + */ + //% helper=arrayFind weight=40 + find(callbackfn: (value: T, index: number) => boolean): T; + + /** + * Call the specified callback function for all the elements in an array. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function. + * @param callbackfn A function that accepts up to three arguments. The reduce method calls the callbackfn function one time for each element in the array. + * @param initialValue Initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value. + */ + //% helper=arrayReduce weight=40 + reduce(callbackfn: (previousValue: U, currentValue: T, currentIndex: number) => U, initialValue: U): U; + + + /** Remove the first occurence of an object. Returns true if removed. */ + //% shim=Array_::removeElement weight=48 + removeElement(element: T): boolean; + + /** Remove the element at a certain index. */ + //% help=arrays/remove-at + //% shim=Array_::removeAt weight=15 + //% blockId="array_removeat" block="%list| remove value at %index" blockNamespace="arrays" + removeAt(index: number): T; + + /** + * Insert the value at a particular index, increases length by 1 + * @param index the zero-based position in the list to insert the value, eg: 0 + * @param the value to insert, eg: 0 + */ + //% help=arrays/insert-at + //% shim=Array_::insertAt weight=20 + //% blockId="array_insertAt" block="%list| insert at %index| value %value" blockNamespace="arrays" + insertAt(index: number, value: T): void; + + /** + * Return the index of the first occurrence of a value in an array. + * @param item The value to locate in the array. + * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the search starts at index 0. + */ + //% help=arrays/index-of + //% shim=Array_::indexOf weight=40 + //% blockId="array_indexof" block="%list| find index of %value" blockNamespace="arrays" + indexOf(item: T, fromIndex?: number): number; + + /** + * Get the value at a particular index + * @param index the zero-based position in the list of the item, eg: 0 + */ + //% help=arrays/get + //% shim=Array_::getAt weight=85 + get(index: number): T; + + /** + * Store a value at a particular index + * @param index the zero-based position in the list to store the value, eg: 0 + * @param the value to insert, eg: 0 + */ + //% help=arrays/set + //% shim=Array_::setAt weight=84 + set(index: number, value: T): void; + + [n: number]: T; +} + +declare interface String { + // This block is currently disabled in favor of the built-in Blockly "Create text with" block, which compiles to "" + "" + // Add % sign back to the block annotation to re-enable + /** + * Returns a string that contains the concatenation of two or more strings. + * @param other The string to append to the end of the string. + */ + //% shim=String_::concat weight=49 + //% blockId="string_concat" blockNamespace="text" + // block="join %list=text|%other" + concat(other: string): string; + + /** + * Return the character at the specified index. + * @param index The zero-based index of the desired character. + */ + //% shim=String_::charAt weight=48 + //% help=text/char-at + //% blockId="string_get" block="char from %this=text|at %pos" blockNamespace="text" + charAt(index: number): string; + + /** Returns the length of a String object. */ + //% property shim=String_::length weight=47 + //% blockId="text_length" block="length of %VALUE" blockBuiltin=true blockNamespace="text" + length: number; + + /** + * Return the Unicode value of the character at the specified location. + * @param index The zero-based index of the desired character. If there is no character at the specified index, NaN is returned. + */ + //% shim=String_::charCodeAt + charCodeAt(index: number): number; + + /** + * See how the order of characters in two strings is different (in ASCII encoding). + * @param that String to compare to target string + */ + //% shim=String_::compare + //% help=text/compare + //% blockId="string_compare" block="compare %this=text| to %that" blockNamespace="text" + compare(that: string): number; + + /** + * Return a substring of the current string. + * @param start first character index; can be negative from counting from the end, eg:0 + * @param length number of characters to extract + */ + //% shim=String_::substr length.defl=10 + //% help=text/substr + //% blockId="string_substr" block="substring of %this=text|from %start|of length %length" blockNamespace="text" + substr(start: number, length?: number): string; + + /** + * Return a substring of the current string. + * @param start first character index; can be negative from counting from the end, eg:0 + * @param end one-past-last character index + */ + //% helper=stringSlice + slice(start: number, end?: number): string; + + /** Returns a value indicating if the string is empty */ + //% helper=stringEmpty + //% blockId="string_isempty" blockNamespace="text" + //% block="%this=text| is empty" + isEmpty(): boolean; + + /** + * Returns the position of the first occurrence of a specified value in a string. + * @param searchValue the text to find + * @param start optional start index for the search + */ + //% shim=String_::indexOf + //% help=text/index-of + //% blockId="string_indexof" blockNamespace="text" + indexOf(searchValue: string, start?: number): number; + + /** + * Determines whether a string contains the characters of a specified string. + * @param searchValue the text to find + * @param start optional start index for the search + */ + //% shim=String_::includes + //% help=text/includes + //% blockId="string_includes" blockNamespace="text" + includes(searchValue: string, start?: number): boolean; + + /** + * Splits the string according to the separators + * @param separator + * @param limit + */ + //% helper=stringSplit + //% help=text/split + //% blockId="string_split" blockNamespace="text" + split(separator?: string, limit?: number): string[]; + + [index: number]: string; +} + +/** + * Convert a string to a number. + * @param s A string to convert into a number. eg: 123 + */ +//% shim=String_::toNumber +//% help=text/parse-float +//% blockId="string_parsefloat" block="parse to number %text" blockNamespace="text" +//% text.defl="123" +declare function parseFloat(text: string): number; + +interface Object { } +interface Function { } +interface IArguments { } +interface RegExp { } +type TemplateStringsArray = Array; + +type uint8 = number; +type uint16 = number; +type uint32 = number; +type int8 = number; +type int16 = number; +type int32 = number; + + +declare interface Boolean { + /** + * Returns a string representation of an object. + */ + //% shim=numops::toString + toString(): string; +} + +/** + * Combine, split, and search text strings. +*/ +//% blockNamespace="text" +declare namespace String { + + /** + * Make a string from the given ASCII character code. + */ + //% help=math/from-char-code + //% shim=String_::fromCharCode weight=1 + //% blockNamespace="text" blockId="stringFromCharCode" block="text from char code %code" + function fromCharCode(code: number): string; +} + +declare interface Number { + /** + * Returns a string representation of a number. + */ + //% shim=numops::toString + toString(): string; +} + +/** + * Add, remove, and replace items in lists. +*/ +//% blockNamespace="Arrays" +declare namespace Array { + /** + * Check if a given object is an array. + */ + //% shim=Array_::isArray + function isArray(obj: any): boolean; +} + +declare namespace Object { + /** + * Return the field names in an object. + */ + //% shim=pxtrt::keysOf + function keys(obj: any): string[]; +} + +/** + * More complex operations with numbers. +*/ +declare namespace Math { + /** + * Returns the value of a base expression taken to a specified power. + * @param x The base value of the expression. + * @param y The exponent value of the expression. + */ + //% shim=Math_::pow + function pow(x: number, y: number): number; + + /** + * Returns a pseudorandom number between 0 and 1. + */ + //% shim=Math_::random + //% help=math/random + function random(): number; + + /** + * Returns a pseudorandom number between min and max included. + * If both numbers are integral, the result is integral. + * @param min the lower inclusive bound, eg: 0 + * @param max the upper inclusive bound, eg: 10 + */ + //% blockId="device_random" block="pick random %min|to %limit" + //% help=math/random-range + //% shim=Math_::randomRange + function randomRange(min: number, max: number): number; + + /** + * Returns the natural logarithm (base e) of a number. + * @param x A number + */ + //% shim=Math_::log + function log(x: number): number; + + /** + * Returns returns ``e^x``. + * @param x A number + */ + //% shim=Math_::exp + function exp(x: number): number; + + /** + * Returns the sine of a number. + * @param x An angle in radians + */ + //% shim=Math_::sin + function sin(x: number): number; + + /** + * Returns the cosine of a number. + * @param x An angle in radians + */ + //% shim=Math_::cos + function cos(x: number): number; + + /** + * Returns the tangent of a number. + * @param x An angle in radians + */ + //% shim=Math_::tan + function tan(x: number): number; + + /** + * Returns the arcsine (in radians) of a number + * @param x A number + */ + //% shim=Math_::asin + function asin(x: number): number; + + /** + * Returns the arccosine (in radians) of a number + * @param x A number + */ + //% shim=Math_::acos + function acos(x: number): number; + + /** + * Returns the arctangent (in radians) of a number + * @param x A number + */ + //% shim=Math_::atan + function atan(x: number): number; + + /** + * Returns the arctangent of the quotient of its arguments. + * @param y A number + * @param x A number + */ + //% shim=Math_::atan2 + function atan2(y: number, x: number): number; + + /** + * Returns the square root of a number. + * @param x A numeric expression. + */ + //% shim=Math_::sqrt + function sqrt(x: number): number; + + /** + * Returns the smallest number greater than or equal to its numeric argument. + * @param x A numeric expression. + */ + //% shim=Math_::ceil + function ceil(x: number): number; + + /** + * Returns the greatest number less than or equal to its numeric argument. + * @param x A numeric expression. + */ + //% shim=Math_::floor + function floor(x: number): number; + + /** + * Returns the number with the decimal part truncated. + * @param x A numeric expression. + */ + //% shim=Math_::trunc + function trunc(x: number): number; + + /** + * Returns a supplied numeric expression rounded to the nearest number. + * @param x The value to be rounded to the nearest number. + */ + //% shim=Math_::round + function round(x: number): number; + + /** + * Returns the value of integer signed 32 bit multiplication of two numbers. + * @param x The first number + * @param y The second number + */ + //% shim=Math_::imul + function imul(x: number, y: number): number; + + /** + * Returns the value of integer signed 32 bit division of two numbers. + * @param x The first number + * @param y The second number + */ + //% shim=Math_::idiv + function idiv(x: number, y: number): number; +} diff --git a/pxt_modules/core/pxt-helpers.ts b/pxt_modules/core/pxt-helpers.ts new file mode 100644 index 0000000..112c691 --- /dev/null +++ b/pxt_modules/core/pxt-helpers.ts @@ -0,0 +1,526 @@ +type Action = () => void; + + +/** + * Convert a string to an integer. + * @param s A string to convert into an integral number. eg: 123 + */ +//% help=text/parse-int +//% blockId="string_parseint" block="parse to integer %text" blockNamespace="text" +//% text.defl="123" +//% blockHidden=1 +function parseInt(text: string): number { + return parseFloat(text) >> 0; +} + +namespace helpers { + export function arrayFill(O: T[], value: T, start?: number, end?: number) { + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/fill + // Steps 3-5. + const len = O.length >>> 0; + + // Steps 6-7. + const relativeStart = start === undefined ? 0 : start >> 0; + + // Step 8. + let k = relativeStart < 0 ? + Math.max(len + relativeStart, 0) : + Math.min(relativeStart, len); + + // Steps 9-10. + const relativeEnd = end === undefined ? len : end >> 0; + + // Step 11. + const final = relativeEnd < 0 ? + Math.max(len + relativeEnd, 0) : + Math.min(relativeEnd, len); + + // Step 12. + while (k < final) { + O[k] = value; + k++; + } + + // Step 13. + return O; + } + + export function arraySplice(arr: T[], start: number, len: number) { + if (start < 0) { + return; + } + for (let i = 0; i < len; ++i) { + arr.removeAt(start) + } + } + + export function arrayReverse(arr: T[]): void { + let len = arr.length; + for (let i = 0; i < len / 2; i++) { + swap(arr, i, len - i - 1); + } + } + + export function arrayShift(arr: T[]): T { + return arr.removeAt(0); + } + + export function arrayJoin(arr: T[], sep?: string): string { + if (sep === undefined || sep === null) { + sep = ","; + } + + let r = ""; + let len = arr.length // caching this seems to match V8 + for (let i = 0; i < len; ++i) { + if (i > 0 && sep) + r += sep; + r += (arr[i] === undefined || arr[i] === null) ? "" : arr[i]; + } + return r; + } + + /*TODO: Enable this multiple value unshift, after rest is enabled in our compiler. + export function arrayUnshift(arr: T[], ...values: T[]) : number { + for(let i = values.length; i > 0; --i) { + arr.insertAt(0, values[i - 1]); + } + return arr.length; + } + */ + export function arrayUnshift(arr: T[], value: T): number { + arr.insertAt(0, value); + return arr.length; + } + + function swap(arr: T[], i: number, j: number): void { + let temp: T = arr[i]; + arr[i] = arr[j]; + arr[j] = temp; + } + + function sortHelper(arr: T[], callbackfn?: (value1: T, value2: T) => number): T[] { + if (arr.length <= 0 || !callbackfn) { + return arr; + } + let len = arr.length; + // simple selection sort. + for (let i = 0; i < len - 1; ++i) { + for (let j = i + 1; j < len; ++j) { + if (callbackfn(arr[i], arr[j]) > 0) { + swap(arr, i, j); + } + } + } + return arr; + } + + export function arraySort(arr: T[], callbackfn?: (value1: T, value2: T) => number): T[] { + if (!callbackfn) { + //TODO: support native strings and number sorting + /* callbackfn = function (value1: string, value2: string) : number { + return value1.compare(value2); + }*/ + } + return sortHelper(arr, callbackfn); + } + + export function arrayMap(arr: T[], callbackfn: (value: T, index: number) => U): U[] { + let res: U[] = [] + let len = arr.length // caching this seems to match V8 + for (let i = 0; i < len; ++i) { + res.push(callbackfn(arr[i], i)) + } + return res + } + + export function arraySome(arr: T[], callbackfn: (value: T, index: number) => boolean): boolean { + let len = arr.length // caching this seems to match V8 + for (let i = 0; i < len; ++i) + if (callbackfn(arr[i], i)) + return true; + return false; + } + + export function arrayEvery(arr: T[], callbackfn: (value: T, index: number) => boolean): boolean { + let len = arr.length // caching this seems to match V8 + for (let i = 0; i < len; ++i) + if (!callbackfn(arr[i], i)) + return false; + return true; + } + + export function arrayForEach(arr: T[], callbackfn: (value: T, index: number) => void): void { + let len = arr.length // caching this seems to match V8 + for (let i = 0; i < len; ++i) { + callbackfn(arr[i], i); + } + } + + export function arrayFilter(arr: T[], callbackfn: (value: T, index: number) => boolean): T[] { + let res: T[] = [] + let len = arr.length + for (let i = 0; i < len; ++i) { + let v = arr[i] // need to cache + if (callbackfn(v, i)) res.push(v) + } + return res + } + + export function arrayFind(arr: T[], callbackfn: (value: T, index: number) => boolean): T { + let len = arr.length + for (let i = 0; i < len; ++i) { + let v = arr[i] // need to cache + if (callbackfn(v, i)) return v; + } + return undefined; + } + + export function arrayReduce(arr: T[], callbackfn: (previousValue: U, currentValue: T, currentIndex: number) => U, initialValue: U): U { + let len = arr.length + for (let i = 0; i < len; ++i) { + initialValue = callbackfn(initialValue, arr[i], i) + } + return initialValue + } + + export function arrayConcat(arr: T[], otherArr: T[]): T[] { + let out: T[] = []; + for (let value of arr) { + out.push(value); + } + for (let value of otherArr) { + out.push(value); + } + return out; + } + + export function arraySlice(arr: T[], start?: number, end?: number): T[] { + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice + const res: T[] = []; + const len = arr.length; + + if (start === undefined) + start = 0; + else if (start < 0) + start = Math.max(len + start, 0); + + if (start > len) + return res; + + if (end === undefined) + end = len; + else if (end < 0) + end = len + end; + + if (end > len) + end = len; + + for (let i = start; i < end; ++i) { + res.push(arr[i]); + } + return res; + } + + export function stringSlice(s: string, start: number, end?: number): string { + const len = s.length; + + if (start < 0) { + start = Math.max(len + start, 0); + } + + if (end == null) { + end = len; + } + + if (end < 0) { + end = len + end; + } + + return s.substr(start, end - start); + } + + export function stringSplit(S: string, separator?: string, limit?: number): string[] { + // https://www.ecma-international.org/ecma-262/6.0/#sec-string.prototype.split + const A: string[] = []; + let lim = 0; + if (limit === undefined) + lim = (1 << 29) - 1; // spec says 1 << 53, leaving it at 29 for constant folding + else if (limit < 0) + lim = 0; + else + lim = limit | 0; + const s = S.length; + let p = 0; + const R = separator; + if (lim == 0) + return A; + if (separator === undefined) { + A[0] = S; + return A; + } + if (s == 0) { + let z = splitMatch(S, 0, R); + if (z > -1) return A; + A[0] = S; + return A; + } + let T: string; + let q = p; + while (q != s) { + let e = splitMatch(S, q, R); + if (e < 0) q++; + else { + if (e == p) q++; + else { + T = stringSlice(S, p, q); + A.push(T); + if (A.length == lim) return A; + p = e; + q = p; + } + } + } + T = stringSlice(S, p, q); + A.push(T); + return A; + } + + function splitMatch(S: string, q: number, R: string): number { + const r = R.length; + const s = S.length; + if (q + r > s) return -1; + for (let i = 0; i < r; ++i) { + if (S[q + i] != R[i]) + return -1; + } + return q + r; + } + + export function stringEmpty(S: string): boolean { + return !S; + } +} + +namespace Math { + export function clamp(min: number, max: number, value: number): number { + return Math.min(max, Math.max(min, value)); + } + + /** + * Returns the absolute value of a number (the value without regard to whether it is positive or negative). + * For example, the absolute value of -5 is the same as the absolute value of 5. + * @param x A numeric expression for which the absolute value is needed. + */ + export function abs(x: number): number { + return x < 0 ? -x : x; + } + + /** + * Returns the sign of the x, indicating whether x is positive, negative or zero. + * @param x The numeric expression to test + */ + export function sign(x: number): number { + if (x == 0) return 0; + if (x > 0) return 1; + return -1; + } + + /** + * Returns the larger of two supplied numeric expressions. + */ + export function max(a: number, b: number): number { + if (a >= b) return a; + return b; + } + + /** + * Returns the smaller of two supplied numeric expressions. + */ + export function min(a: number, b: number): number { + if (a <= b) return a; + return b; + } + + /** + * Rounds ``x`` to a number with the given number of ``digits`` + * @param x the number to round + * @param digits the number of resulting digits + */ + //% + export function roundWithPrecision(x: number, digits: number): number { + digits = digits | 0; + // invalid digits input + if (digits <= 0) return Math.round(x); + if (x == 0) return 0; + let r = 0; + do { + const d = Math.pow(10, digits); + r = Math.round(x * d) / d; + digits++; + } while (r == 0 && digits < 21); + return r; + } +} + + +//% blockHidden=1 +namespace __internal { + /** + * A shim to render a boolean as a down/up toggle + */ + //% shim=TD_ID blockHidden=1 + //% blockId=toggleDownUp block="%down" + //% down.fieldEditor=toggledownup + //% down.fieldOptions.decompileLiterals=true + export function __downUp(down: boolean): boolean { + return down; + } + + /** + * A shim to render a boolean as a up/down toggle + */ + //% shim=TD_ID blockHidden=1 + //% blockId=toggleUpDown block="%up" + //% up.fieldEditor=toggleupdown + //% up.fieldOptions.decompileLiterals=true + export function __upDown(up: boolean): boolean { + return up; + } + + /** + * A shim to render a boolean as a high/low toggle + */ + //% shim=TD_ID blockHidden=1 + //% blockId=toggleHighLow block="%high" + //% high.fieldEditor=togglehighlow + //% high.fieldOptions.decompileLiterals=true + export function __highLow(high: boolean): boolean { + return high; + } + + /** + * A shim to render a boolean as a on/off toggle + */ + //% shim=TD_ID blockHidden=1 + //% blockId=toggleOnOff block="%on" + //% on.fieldEditor=toggleonoff + //% on.fieldOptions.decompileLiterals=true + export function __onOff(on: boolean): boolean { + return on; + } + + /** + * A shim to render a boolean as a yes/no toggle + */ + //% shim=TD_ID blockHidden=1 + //% blockId=toggleYesNo block="%yes" + //% yes.fieldEditor=toggleyesno + //% yes.fieldOptions.decompileLiterals=true + export function __yesNo(yes: boolean): boolean { + return yes; + } + + /** + * A shim to render a boolean as a win/lose toggle + */ + //% shim=TD_ID blockHidden=1 + //% blockId=toggleWinLose block="%win" + //% win.fieldEditor=togglewinlose + //% win.fieldOptions.decompileLiterals=true + export function __winLose(win: boolean): boolean { + return win; + } + + /** + * Get the color wheel field editor + * @param color color, eg: #ff0000 + */ + //% blockId=colorNumberPicker block="%value" + //% blockHidden=true + //% shim=TD_ID colorSecondary="#FFFFFF" + //% value.fieldEditor="colornumber" value.fieldOptions.decompileLiterals=true + //% value.defl='#ff0000' + //% value.fieldOptions.colours='["#ff0000","#ff8000","#ffff00","#ff9da5","#00ff00","#b09eff","#00ffff","#007fff","#65471f","#0000ff","#7f00ff","#ff0080","#ff00ff","#ffffff","#999999","#000000"]' + //% value.fieldOptions.columns=4 value.fieldOptions.className='rgbColorPicker' + export function __colorNumberPicker(value: number) { + return value; + } + + /** + * Get the color wheel field editor + * @param value value between 0 to 255 to get a color value, eg: 10 + */ + //% blockId=colorWheelPicker block="%value" + //% blockHidden=true + //% shim=TD_ID colorSecondary="#FFFFFF" + //% value.fieldEditor="colorwheel" value.fieldOptions.decompileLiterals=true + //% value.fieldOptions.sliderWidth='200' + //% value.fieldOptions.min=0 value.fieldOptions.max=255 + export function __colorWheelPicker(value: number) { + return value; + } + + /** + * Get the color wheel field editor using HSV values + * @param value value between 0 to 255 to get a color value, eg: 10 + */ + //% blockId=colorWheelHsvPicker block="%value" + //% blockHidden=true + //% shim=TD_ID colorSecondary="#FFFFFF" + //% value.fieldEditor="colorwheel" value.fieldOptions.decompileLiterals=true + //% value.fieldOptions.sliderWidth='200' + //% value.fieldOptions.min=0 value.fieldOptions.max=255 + //% value.fieldOptions.channel=hsvfast + export function __colorWheelHsvPicker(value: number) { + return value; + } + + /** + * A speed picker + * @param speed the speed, eg: 50 + */ + //% blockId=speedPicker block="%speed" shim=TD_ID + //% speed.fieldEditor="speed" colorSecondary="#FFFFFF" + //% weight=0 blockHidden=1 speed.fieldOptions.decompileLiterals=1 + export function __speedPicker(speed: number): number { + return speed; + } + + /** + * A turn ratio picker + * @param turnratio the turn ratio, eg: 0 + */ + //% blockId=turnRatioPicker block="%turnratio" shim=TD_ID + //% turnratio.fieldEditor="turnratio" colorSecondary="#FFFFFF" + //% weight=0 blockHidden=1 turnRatio.fieldOptions.decompileLiterals=1 + export function __turnRatioPicker(turnratio: number): number { + return turnratio; + } + + /** + * A field editor that displays a protractor + */ + //% blockId=protractorPicker block="%angle" + //% shim=TD_ID + //% angle.fieldEditor=protractor + //% angle.fieldOptions.decompileLiterals=1 + //% colorSecondary="#FFFFFF" + //% blockHidden=1 + export function __protractor(angle: number) { + return angle; + } + + /** + * Get the time field editor + * @param ms time duration in milliseconds, eg: 500, 1000 + */ + //% blockId=timePicker block="%ms" + //% blockHidden=true shim=TD_ID + //% colorSecondary="#FFFFFF" + //% ms.fieldEditor="numberdropdown" ms.fieldOptions.decompileLiterals=true + //% ms.fieldOptions.data='[["100 ms", 100], ["200 ms", 200], ["500 ms", 500], ["1 second", 1000], ["2 seconds", 2000]]' + export function __timePicker(ms: number): number { + return ms; + } +} \ No newline at end of file diff --git a/pxt_modules/core/pxt.cpp b/pxt_modules/core/pxt.cpp new file mode 100644 index 0000000..cf41f55 --- /dev/null +++ b/pxt_modules/core/pxt.cpp @@ -0,0 +1,515 @@ +#include "pxtbase.h" + +using namespace std; + +namespace pxt { + +#ifndef PXT_GC +TValue incr(TValue e) { + if (isRefCounted(e)) { + getVTable((RefObject *)e); + ((RefObject *)e)->ref(); + } + return e; +} + +void decr(TValue e) { + if (isRefCounted(e)) { + ((RefObject *)e)->unref(); + } +} +#endif + +Action mkAction(int totallen, RefAction *act) { + check(getVTable(act)->classNo == BuiltInType::RefAction, PANIC_INVALID_BINARY_HEADER, 1); + + if (totallen == 0) { + return (TValue)act; // no closure needed + } + + void *ptr = gcAllocate(sizeof(RefAction) + totallen * sizeof(unsigned)); + RefAction *r = new (ptr) RefAction(); + r->len = totallen; + r->func = act->func; + memset(r->fields, 0, r->len * sizeof(unsigned)); + + MEMDBG("mkAction: start=%p => %p", act, r); + + return (Action)r; +} + +RefRecord *mkClassInstance(VTable *vtable) { + intcheck(vtable->methods[0] == &RefRecord_destroy, PANIC_SIZE, 3); + // intcheck(vtable->methods[1] == &RefRecord_print, PANIC_SIZE, 4); + + void *ptr = gcAllocate(vtable->numbytes); + RefRecord *r = new (ptr) RefRecord(vtable); + memset(r->fields, 0, vtable->numbytes - sizeof(RefRecord)); + MEMDBG("mkClass: vt=%p => %p", vtable, r); + return r; +} + +TValue RefRecord::ld(int idx) { + // intcheck((reflen == 255 ? 0 : reflen) <= idx && idx < len, PANIC_OUT_OF_BOUNDS, 1); + return fields[idx]; +} + +TValue RefRecord::ldref(int idx) { + // DMESG("LD %p len=%d reflen=%d idx=%d", this, len, reflen, idx); + // intcheck(0 <= idx && idx < reflen, PANIC_OUT_OF_BOUNDS, 2); + TValue tmp = fields[idx]; + incr(tmp); + return tmp; +} + +void RefRecord::st(int idx, TValue v) { + // intcheck((reflen == 255 ? 0 : reflen) <= idx && idx < len, PANIC_OUT_OF_BOUNDS, 3); + fields[idx] = v; +} + +void RefRecord::stref(int idx, TValue v) { + // DMESG("ST %p len=%d reflen=%d idx=%d", this, len, reflen, idx); + // intcheck(0 <= idx && idx < reflen, PANIC_OUT_OF_BOUNDS, 4); + decr(fields[idx]); + fields[idx] = v; +} + +void RefObject::destroyVT() { + ((RefObjectMethod)getVTable(this)->methods[0])(this); +#ifndef PXT_GC + free(this); +#endif +} + +//% +void deleteRefObject(RefObject *obj) { + obj->destroyVT(); +} + +void RefObject::printVT() { + ((RefObjectMethod)getVTable(this)->methods[1])(this); +} + +void RefRecord_destroy(RefRecord *r) { +#ifndef PXT_GC + VTable *tbl = getVTable(r); + int len = (tbl->numbytes - sizeof(RefRecord)) >> 2; + for (int i = 0; i < len; ++i) { + decr(r->fields[i]); + r->fields[i] = 0; + } +#endif +} + +void RefRecord_print(RefRecord *r) { + DMESG("RefRecord %p r=%d size=%d bytes", r, REFCNT(r), getVTable(r)->numbytes); +} + +void Segment::set(unsigned i, TValue value) { + if (i < size) { + data[i] = value; + } else if (i < Segment::MaxSize) { + growByMin(i + 1); + data[i] = value; + } else { + return; + } + if (length <= i) { + length = i + 1; + } + +#ifdef DEBUG_BUILD + DMESG("In Segment::set"); + this->print(); +#endif + + return; +} + +static inline int growthFactor(int size) { + if (size == 0) { + return 4; + } + if (size < 64) { + return size * 2; // Double + } + if (size < 512) { + return size * 5 / 3; // Grow by 1.66 rate + } + // Grow by constant rate + if ((unsigned)size + 256 < Segment::MaxSize) + return size + 256; + else + return Segment::MaxSize; +} + +void LLSegment::setLength(unsigned newLen) { + if (newLen > Segment::MaxSize) + return; + + if (newLen > size) { + int newSize = growthFactor(size); + if (newSize < (int)newLen) + newSize = newLen; + + // this will throw if unable to allocate + TValue *tmp = (TValue *)(xmalloc(newSize * sizeof(TValue))); + + // Copy existing data + if (size) { + memcpy(tmp, data, size * sizeof(TValue)); + } + // fill the rest with default value + memset(tmp + size, 0, (newSize - size) * sizeof(TValue)); + + // free older segment; + xfree(data); + + data = tmp; + size = newSize; + } else if (newLen < length) { + memset(data + newLen, 0, (length - newLen) * sizeof(TValue)); + } + + length = newLen; +} + +void LLSegment::set(unsigned idx, TValue v) { + if (idx >= Segment::MaxSize) + return; + if (idx >= length) + setLength(idx + 1); + data[idx] = v; +} + +TValue LLSegment::pop() { + if (length > 0) { + --length; + TValue value = data[length]; + data[length] = 0; + return value; + } + return 0; +} + +void LLSegment::destroy() { + length = size = 0; + xfree(data); + data = nullptr; +} + +void Segment::growByMin(ramint_t minSize) { + ramint_t newSize = max(minSize, (ramint_t)growthFactor(size)); + + if (size < newSize) { + // this will throw if unable to allocate + TValue *tmp = (TValue *)(gcAllocateArray(newSize * sizeof(TValue))); + + // Copy existing data + if (size) + memcpy(tmp, data, size * sizeof(TValue)); + // fill the rest with default value + memset(tmp + size, 0, (newSize - size) * sizeof(TValue)); + + data = tmp; + size = newSize; + +#ifdef DEBUG_BUILD + DMESG("growBy - after reallocation"); + this->print(); +#endif + } + // else { no shrinking yet; } + return; +} + +void Segment::ensure(ramint_t newSize) { + if (newSize < size) { + return; + } + growByMin(newSize); +} + +void Segment::setLength(unsigned newLength) { + if (newLength > size) { + ensure(length); + } + length = newLength; + return; +} + +TValue Segment::pop() { +#ifdef DEBUG_BUILD + DMESG("In Segment::pop"); + this->print(); +#endif + + if (length > 0) { + --length; + TValue value = data[length]; + data[length] = Segment::DefaultValue; + return value; + } + return Segment::DefaultValue; +} + +// this function removes an element at index i and shifts the rest of the elements to +// left to fill the gap +TValue Segment::remove(unsigned i) { +#ifdef DEBUG_BUILD + DMESG("In Segment::remove index:%d", i); + this->print(); +#endif + if (i < length) { + // value to return + TValue ret = data[i]; + if (i + 1 < length) { + // Move the rest of the elements to fill in the gap. + memmove(data + i, data + i + 1, (length - i - 1) * sizeof(unsigned)); + } + length--; + data[length] = Segment::DefaultValue; +#ifdef DEBUG_BUILD + DMESG("After Segment::remove index:%d", i); + this->print(); +#endif + return ret; + } + return Segment::DefaultValue; +} + +// this function inserts element value at index i by shifting the rest of the elements right. +void Segment::insert(unsigned i, TValue value) { +#ifdef DEBUG_BUILD + DMESG("In Segment::insert index:%d value:%d", i, value); + this->print(); +#endif + + if (i < length) { + ensure(length + 1); + + // Move the rest of the elements to fill in the gap. + memmove(data + i + 1, data + i, (length - i) * sizeof(unsigned)); + + data[i] = value; + length++; + } else { + // This is insert beyond the length, just call set which will adjust the length + set(i, value); + } +#ifdef DEBUG_BUILD + DMESG("After Segment::insert index:%d", i); + this->print(); +#endif +} + +void Segment::print() { + DMESG("Segment: %p, length: %d, size: %d", data, (unsigned)length, (unsigned)size); + for (unsigned i = 0; i < size; i++) { + DMESG("-> %d", (unsigned)(uintptr_t)data[i]); + } +} + +void Segment::destroy() { +#ifdef DEBUG_BUILD + DMESG("In Segment::destroy"); + this->print(); +#endif + length = size = 0; + data = nullptr; +} + +PXT_VTABLE_CTOR(RefCollection) {} + +void RefCollection::destroy(RefCollection *t) { +#ifndef PXT_GC + auto data = t->head.getData(); + auto len = t->head.getLength(); + for (unsigned i = 0; i < len; i++) { + decr(data[i]); + } +#endif + t->head.destroy(); +} + +void RefCollection::print(RefCollection *t) { + DMESG("RefCollection %p r=%d size=%d", t, REFCNT(t), t->head.getLength()); + t->head.print(); +} + +PXT_VTABLE_CTOR(RefAction) {} + +// fields[] contain captured locals +void RefAction::destroy(RefAction *t) { +#ifndef PXT_GC + for (int i = 0; i < t->len; ++i) { + decr(t->fields[i]); + t->fields[i] = 0; + } +#endif +} + +void RefAction::print(RefAction *t) { + DMESG("RefAction %p r=%d pc=%X size=%d", t, REFCNT(t), + (const uint8_t *)t->func - (const uint8_t *)bytecode, t->len); +} + +PXT_VTABLE_CTOR(RefRefLocal) { + v = 0; +} + +void RefRefLocal::print(RefRefLocal *t) { + DMESG("RefRefLocal %p r=%d v=%p", t, REFCNT(t), (void *)t->v); +} + +void RefRefLocal::destroy(RefRefLocal *t) { + decr(t->v); +} + +PXT_VTABLE_CTOR(RefMap) {} + +void RefMap::destroy(RefMap *t) { +#ifndef PXT_GC + auto len = t->values.getLength(); + auto values = t->values.getData(); + auto keys = t->keys.getData(); + intcheck(t->keys.getLength() == len, PANIC_SIZE, 101); + for (unsigned i = 0; i < len; ++i) { + decr(values[i]); + values[i] = nullptr; + decr(keys[i]); + keys[i] = nullptr; + } +#endif + t->keys.destroy(); + t->values.destroy(); +} + +int RefMap::findIdx(String key) { + auto len = keys.getLength(); + auto data = (String *)keys.getData(); + + // fast path + for (unsigned i = 0; i < len; ++i) { + if (data[i] == key) + return i; + } + + // slow path + auto keylen = key->getUTF8Size(); + auto keydata = key->getUTF8Data(); + for (unsigned i = 0; i < len; ++i) { + auto s = data[i]; + if (s->getUTF8Size() == keylen && memcmp(keydata, s->getUTF8Data(), keylen) == 0) + return i; + } + + return -1; +} + +void RefMap::print(RefMap *t) { + DMESG("RefMap %p r=%d size=%d", t, REFCNT(t), t->keys.getLength()); +} + +void debugMemLeaks() {} + +void error(PXT_PANIC code, int subcode) { + DMESG("Error: %d [%d]", code, subcode); + target_panic(code); +} + +uint16_t *bytecode; +TValue *globals; + +void checkStr(bool cond, const char *msg) { + if (!cond) { + while (true) { + // uBit.display.scroll(msg, 100); + // uBit.sleep(100); + } + } +} + +int templateHash() { + return ((int *)bytecode)[4]; +} + +int programHash() { + return ((int *)bytecode)[6]; +} + +int getNumGlobals() { + return bytecode[16]; +} + +#ifndef X86_64 +void exec_binary(unsigned *pc) { + // XXX re-enable once the calibration code is fixed and [editor/embedded.ts] + // properly prepends a call to [internal_main]. + // ::touch_develop::internal_main(); + + // unique group for radio based on source hash + // ::touch_develop::micro_bit::radioDefaultGroup = programHash(); + + unsigned ver = *pc++; + checkStr(ver == 0x4210, ":( Bad runtime version"); + + bytecode = *((uint16_t **)pc++); // the actual bytecode is here + globals = (TValue *)app_alloc(sizeof(TValue) * getNumGlobals()); + memset(globals, 0, sizeof(TValue) * getNumGlobals()); + + // can be any valid address, best in RAM for speed + globals[0] = (TValue)&globals; + + // just compare the first word + // TODO + checkStr(((uint32_t *)bytecode)[0] == 0x923B8E70 && (unsigned)templateHash() == *pc, + ":( Failed partial flash"); + + uintptr_t startptr = (uintptr_t)bytecode; + + startptr += 64; // header + + initPerfCounters(); + + initRuntime(); + + runAction0((Action)startptr); + + pxt::releaseFiber(); +} + +void start() { + exec_binary((unsigned *)functionsAndBytecode); +} +#endif + +} // namespace pxt + +namespace Array_ { +//% +bool isArray(TValue arr) { + auto vt = getAnyVTable(arr); + return vt && vt->classNo == BuiltInType::RefCollection; +} +} // namespace Array_ + +namespace pxtrt { +//% +RefCollection *keysOf(TValue v) { + auto r = NEW_GC(RefCollection); + MEMDBG("mkColl[keys]: => %p", r); + if (getAnyVTable(v) != &RefMap_vtable) + return r; + auto rm = (RefMap *)v; + auto len = rm->keys.getLength(); + if (!len) + return r; + r->setLength(len); + auto dst = r->getData(); + memcpy(dst, rm->keys.getData(), len * sizeof(TValue)); + for (unsigned i = 0; i < len; ++i) + incr(dst[i]); + return r; +} +} // namespace pxtrt diff --git a/pxt_modules/core/pxt.h b/pxt_modules/core/pxt.h new file mode 100644 index 0000000..33d2648 --- /dev/null +++ b/pxt_modules/core/pxt.h @@ -0,0 +1,65 @@ +#ifndef __PXT_H +#define __PXT_H + +//#define DEBUG_MEMLEAKS 1 + +#pragma GCC diagnostic ignored "-Wunused-parameter" + +#include "pxtbase.h" + +namespace pxt { + +class RefMImage : public RefObject { + public: + ImageData *img; + + RefMImage(ImageData *d); + void makeWritable(); + static void destroy(RefMImage *map); + static void print(RefMImage *map); + static void scan(RefMImage *t); + static unsigned gcsize(RefMImage *t); +}; + +#define MSTR(s) ManagedString((s)->getUTF8Data(), (s)->getUTF8Size()) + +static inline String PSTR(ManagedString s) { + return mkString(s.toCharArray(), s.length()); +} + +typedef uint32_t ImageLiteral_; + +static inline ImageData *imageBytes(ImageLiteral_ lit) { + return (ImageData *)lit; +} + +typedef RefMImage *Image; + +extern MicroBit uBit; +extern MicroBitEvent lastEvent; + +MicroBitPin *getPin(int id); + +static inline int min_(int a, int b) { + if (a < b) + return a; + else + return b; +} + +static inline int max_(int a, int b) { + if (a > b) + return a; + else + return b; +} + +} // namespace pxt + +using namespace pxt; + +#define DEVICE_EVT_ANY 0 + +#endif + +// vim: ts=2 sw=2 expandtab diff --git a/pxt_modules/core/pxt.json b/pxt_modules/core/pxt.json new file mode 100644 index 0000000..5fd502c --- /dev/null +++ b/pxt_modules/core/pxt.json @@ -0,0 +1,122 @@ +{ + "name": "core", + "description": "The microbit core library", + "files": [ + "README.md", + "platform.h", + "pxt.cpp", + "pxt.h", + "pxtbase.h", + "pxtcore.h", + "math.ts", + "dal.d.ts", + "enums.d.ts", + "shims.d.ts", + "pxt-core.d.ts", + "core.cpp", + "pxt-helpers.ts", + "helpers.ts", + "pinscompat.ts", + "configkeys.h", + "gc.cpp", + "codal.cpp", + "images.cpp", + "basic.cpp", + "basic.ts", + "icons.ts", + "icons.jres", + "input.cpp", + "input.ts", + "gestures.jres", + "control.ts", + "control.cpp", + "console.ts", + "game.ts", + "led.cpp", + "led.ts", + "music.ts", + "melodies.ts", + "pins.cpp", + "pins.ts", + "serial.cpp", + "serial.ts", + "buffer.cpp", + "buffer.ts", + "pxtparts.json", + "advmath.cpp", + "trig.cpp", + "fixed.ts", + "templates.ts", + "parts/speaker.svg", + "parts/headphone.svg" + ], + "public": true, + "dependencies": {}, + "yotta": { + "optionalConfig": { + "microbit-dal": { + "fiber_user_data": 1, + "bluetooth": { + "private_addressing": 0, + "advertising_timeout": 0, + "tx_power": 6, + "dfu_service": 1, + "event_service": 1, + "device_info_service": 1, + "eddystone_url": 1, + "eddystone_uid": 1, + "open": 0, + "pairing_mode": 1, + "whitelist": 1, + "security_level": "SECURITY_MODE_ENCRYPTION_NO_MITM", + "partial_flashing": 1 + } + } + }, + "userConfigs": [ + { + "description": "No Pairing Required: Anyone can connect via Bluetooth.", + "config": { + "microbit-dal": { + "bluetooth": { + "open": 1, + "whitelist": 0, + "security_level": null + } + } + } + }, + { + "description": "JustWorks pairing (default): Pairing is automatic once the pairing is initiated.", + "config": { + "microbit-dal": { + "bluetooth": { + "open": 0, + "whitelist": 1, + "security_level": "SECURITY_MODE_ENCRYPTION_NO_MITM" + } + } + } + }, + { + "description": "Passkey pairing: Pairing requires 6 digit key to pair.", + "config": { + "microbit-dal": { + "bluetooth": { + "open": 0, + "whitelist": 1, + "security_level": "SECURITY_MODE_ENCRYPTION_WITH_MITM" + } + } + } + } + ] + }, + "testFiles": [ + "test.ts" + ], + "targetVersions": { + "target": "1.4.18" + }, + "installedVersion": "embed:core" +} \ No newline at end of file diff --git a/pxt_modules/core/pxtbase.h b/pxt_modules/core/pxtbase.h new file mode 100644 index 0000000..3b26cb1 --- /dev/null +++ b/pxt_modules/core/pxtbase.h @@ -0,0 +1,1047 @@ +#ifndef __PXTBASE_H +#define __PXTBASE_H + +#pragma GCC diagnostic ignored "-Wunused-parameter" +#pragma GCC diagnostic ignored "-Wformat" +#pragma GCC diagnostic ignored "-Warray-bounds" + +// needed for gcc6; not sure why +#undef min +#undef max + +#define NOLOG(...) \ + do { \ + } while (0) + +#define MEMDBG NOLOG +//#define MEMDBG DMESG +#define MEMDBG2 NOLOG + +#include "pxtconfig.h" +#include "configkeys.h" + +#ifndef PXT_UTF8 +#define PXT_UTF8 0 +#endif + +#define intcheck(...) check(__VA_ARGS__) +//#define intcheck(...) do {} while (0) + +#ifdef PXT_USE_FLOAT +#define NUMBER float +#else +#define NUMBER double +#endif + +#include +#include +#include + +#ifdef POKY +void *operator new(size_t size, void *ptr); +void *operator new(size_t size); +#else +#include +#endif + +#include "platform.h" +#include "pxtcore.h" + +#ifndef PXT_VTABLE_SHIFT +#define PXT_VTABLE_SHIFT 2 +#endif + +#define PXT_REFCNT_FLASH 0xfffe + +#define CONCAT_1(a, b) a##b +#define CONCAT_0(a, b) CONCAT_1(a, b) +#define STATIC_ASSERT(e) enum { CONCAT_0(_static_assert_, __LINE__) = 1 / ((e) ? 1 : 0) }; + +#ifndef ramint_t +// this type limits size of arrays +#ifdef __linux__ +// TODO fix the inline array accesses to take note of this! +#define ramint_t uint32_t +#else +#define ramint_t uint16_t +#endif +#endif + +#ifndef PXT_IN_ISR +#define PXT_IN_ISR() (SCB->ICSR & SCB_ICSR_VECTACTIVE_Msk) +#endif + +#ifdef POKY +inline void *operator new(size_t, void *p) { + return p; +} +inline void *operator new[](size_t, void *p) { + return p; +} +#endif + +namespace pxt { + +template inline const T &max(const T &a, const T &b) { + if (a < b) + return b; + return a; +} + +template inline const T &min(const T &a, const T &b) { + if (a < b) + return a; + return b; +} + +template inline void swap(T &a, T &b) { + T tmp = a; + a = b; + b = tmp; +} + +// +// Tagged values (assume 4 bytes for now, Cortex-M0) +// +struct TValueStruct {}; +typedef TValueStruct *TValue; + +typedef TValue TNumber; +typedef TValue Action; +typedef TValue ImageLiteral; + +// To be implemented by the target +extern "C" void target_panic(int error_code); +extern "C" void target_reset(); +void sleep_ms(unsigned ms); +void sleep_us(uint64_t us); +void releaseFiber(); +uint64_t current_time_us(); +int current_time_ms(); +void initRuntime(); +void sendSerial(const char *data, int len); +void setSendToUART(void (*f)(const char *, int)); +int getSerialNumber(); +void registerWithDal(int id, int event, Action a, int flags = 16); // EVENT_LISTENER_DEFAULT_FLAGS +void runInParallel(Action a); +void runForever(Action a); +void waitForEvent(int id, int event); +//% +unsigned afterProgramPage(); +//% +void dumpDmesg(); + +// also defined DMESG macro +// end + +#define TAGGED_SPECIAL(n) (TValue)(void *)((n << 2) | 2) +#define TAG_FALSE TAGGED_SPECIAL(2) // 10 +#define TAG_TRUE TAGGED_SPECIAL(16) // 66 +#define TAG_UNDEFINED (TValue)0 +#define TAG_NULL TAGGED_SPECIAL(1) // 6 +#define TAG_NAN TAGGED_SPECIAL(3) // 14 +#define TAG_NUMBER(n) (TNumber)(void *)((n << 1) | 1) + +inline bool isTagged(TValue v) { + return ((intptr_t)v & 3) || !v; +} + +inline bool isNumber(TValue v) { + return (intptr_t)v & 1; +} + +inline bool isSpecial(TValue v) { + return (intptr_t)v & 2; +} + +inline bool bothNumbers(TValue a, TValue b) { + return (intptr_t)a & (intptr_t)b & 1; +} + +inline int numValue(TValue n) { + return (intptr_t)n >> 1; +} + +#ifdef PXT_BOX_DEBUG +inline bool canBeTagged(int) { + return false; +} +#else +inline bool canBeTagged(int v) { + return (v << 1) >> 1 == v; +} +#endif + +// keep in sym with sim/control.ts +typedef enum { + PANIC_CODAL_OOM = 20, + PANIC_GC_OOM = 21, + PANIC_GC_TOO_BIG_ALLOCATION = 22, + PANIC_CODAL_HEAP_ERROR = 30, + PANIC_CODAL_NULL_DEREFERENCE = 40, + PANIC_CODAL_USB_ERROR = 50, + PANIC_CODAL_HARDWARE_CONFIGURATION_ERROR = 90, + + PANIC_INVALID_BINARY_HEADER = 901, + PANIC_OUT_OF_BOUNDS = 902, + PANIC_REF_DELETED = 903, + PANIC_SIZE = 904, + PANIC_INVALID_VTABLE = 905, + PANIC_INTERNAL_ERROR = 906, + PANIC_NO_SUCH_CONFIG = 907, + PANIC_NO_SUCH_PIN = 908, + PANIC_INVALID_ARGUMENT = 909, + PANIC_MEMORY_LIMIT_EXCEEDED = 910, + PANIC_SCREEN_ERROR = 911, + PANIC_MISSING_PROPERTY = 912, + PANIC_INVALID_IMAGE = 913, + PANIC_CALLED_FROM_ISR = 914, + PANIC_HEAP_DUMPED = 915, + + PANIC_CAST_FIRST = 980, + PANIC_CAST_FROM_UNDEFINED = 980, + PANIC_CAST_FROM_BOOLEAN = 981, + PANIC_CAST_FROM_NUMBER = 982, + PANIC_CAST_FROM_STRING = 983, + PANIC_CAST_FROM_OBJECT = 984, + PANIC_CAST_FROM_FUNCTION = 985, + PANIC_CAST_FROM_NULL = 989, + +} PXT_PANIC; + +extern const unsigned functionsAndBytecode[]; +extern TValue *globals; +extern uint16_t *bytecode; +class RefRecord; + +// Utility functions + +typedef TValue (*RunActionType)(Action a, TValue arg0, TValue arg1, TValue arg2); +typedef TValue (*GetPropertyType)(TValue obj, unsigned key); +typedef TValue (*SetPropertyType)(TValue obj, unsigned key, TValue v); + +#define asmRunAction3 ((RunActionType)(((uintptr_t *)bytecode)[12])) + +static inline TValue runAction3(Action a, TValue arg0, TValue arg1, TValue arg2) { + return asmRunAction3(a, arg0, arg1, 0); +} +static inline TValue runAction2(Action a, TValue arg0, TValue arg1) { + return asmRunAction3(a, arg0, arg1, 0); +} +static inline TValue runAction1(Action a, TValue arg0) { + return asmRunAction3(a, arg0, 0, 0); +} +static inline TValue runAction0(Action a) { + return asmRunAction3(a, 0, 0, 0); +} + +class RefAction; +struct VTable; + +//% +Action mkAction(int totallen, RefAction *act); +//% +int templateHash(); +//% +int programHash(); +//% +unsigned programSize(); +//% +int getNumGlobals(); +//% +RefRecord *mkClassInstance(VTable *vt); +//% +void debugMemLeaks(); +//% +void anyPrint(TValue v); + +//% +int getConfig(int key, int defl = -1); + +//% +int toInt(TNumber v); +//% +unsigned toUInt(TNumber v); +//% +NUMBER toDouble(TNumber v); +//% +float toFloat(TNumber v); +//% +TNumber fromDouble(NUMBER r); +//% +TNumber fromFloat(float r); + +//% +TNumber fromInt(int v); +//% +TNumber fromUInt(unsigned v); +//% +TValue fromBool(bool v); +//% +bool eq_bool(TValue a, TValue b); +//% +bool eqq_bool(TValue a, TValue b); + +//% +void failedCast(TValue v); +//% +void missingProperty(TValue v); + +void error(PXT_PANIC code, int subcode = 0); +void exec_binary(unsigned *pc); +void start(); + +struct HandlerBinding { + HandlerBinding *next; + int source; + int value; + Action action; +}; +HandlerBinding *findBinding(int source, int value); +HandlerBinding *nextBinding(HandlerBinding *curr, int source, int value); +void setBinding(int source, int value, Action act); + +// The standard calling convention is: +// - when a pointer is loaded from a local/global/field etc, and incr()ed +// (in other words, its presence on stack counts as a reference) +// - after a function call, all pointers are popped off the stack and decr()ed +// This does not apply to the RefRecord and st/ld(ref) methods - they unref() +// the RefRecord* this. +//% +TValue incr(TValue e); +//% +void decr(TValue e); + +#ifdef PXT_GC +inline TValue incr(TValue e) { + return e; +} +inline void decr(TValue e) {} +#endif + +class RefObject; + +static inline RefObject *incrRC(RefObject *r) { + return (RefObject *)incr((TValue)r); +} +static inline void decrRC(RefObject *r) { + decr((TValue)r); +} + +inline void *ptrOfLiteral(int offset) { + return &bytecode[offset]; +} + +// Checks if object is ref-counted, and has a custom PXT vtable in front +// TODO +inline bool isRefCounted(TValue e) { +#ifdef PXT_GC + return !isTagged(e); +#else + return !isTagged(e) && (*((uint16_t *)e) & 1) == 1; +#endif +} + +inline void check(int cond, PXT_PANIC code, int subcode = 0) { + if (!cond) + error(code, subcode); +} + +inline void oops(int subcode = 0) { + target_panic(800 + subcode); +} + +class RefObject; + +typedef void (*RefObjectMethod)(RefObject *self); +typedef unsigned (*RefObjectSizeMethod)(RefObject *self); +typedef void *PVoid; +typedef void **PPVoid; + +typedef void *Object_; + +#define VTABLE_MAGIC 0xF9 + +enum class ValType : uint8_t { + Undefined, + Boolean, + Number, + String, + Object, + Function, +}; + +// keep in sync with pxt-core (search for the type name) +enum class BuiltInType : uint16_t { + BoxedString = 1, + BoxedNumber = 2, + BoxedBuffer = 3, + RefAction = 4, + RefImage = 5, + RefCollection = 6, + RefRefLocal = 7, + RefMap = 8, + RefMImage = 9, + User0 = 16, +}; + +struct VTable { + uint16_t numbytes; + ValType objectType; + uint8_t magic; + PVoid *ifaceTable; + BuiltInType classNo; + uint16_t reserved; + uint32_t ifaceHashMult; + // we only use the first few methods here; pxt will generate more +#ifdef PXT_GC + PVoid methods[8]; +#else + PVoid methods[3]; +#endif +}; + +//% +extern const VTable string_inline_ascii_vt; +#if PXT_UTF8 +//% +extern const VTable string_inline_utf8_vt; +//% +extern const VTable string_cons_vt; +//% +extern const VTable string_skiplist16_vt; +#endif +//% +extern const VTable buffer_vt; +//% +extern const VTable number_vt; +//% +extern const VTable RefAction_vtable; + +#ifdef PXT_GC +#define PXT_VTABLE_TO_INT(vt) ((uintptr_t)(vt)) +#else +#define PXT_VTABLE_TO_INT(vt) ((uintptr_t)(vt) >> PXT_VTABLE_SHIFT) +#endif + +#ifdef PXT_GC +inline bool isReadOnly(TValue v) { + return isTagged(v) || !((uint32_t)v >> 28); +} +#endif + +#ifdef PXT_GC +#define REFCNT(x) 0 +#else +#define REFCNT(x) ((x)->refcnt) +#endif + +// A base abstract class for ref-counted objects. +class RefObject { + public: +#ifdef PXT_GC + uint32_t vtable; + + RefObject(const VTable *vt) { vtable = PXT_VTABLE_TO_INT(vt); } +#else + uint16_t refcnt; + uint16_t vtable; + + RefObject(const VTable *vt) { + refcnt = 3; + vtable = PXT_VTABLE_TO_INT(vt); + } +#endif + + void destroyVT(); + void printVT(); + +#ifdef PXT_GC + inline void ref() {} + inline void unref() {} + inline bool isReadOnly() { return pxt::isReadOnly((TValue)this); } +#else + inline bool isReadOnly() { return refcnt == PXT_REFCNT_FLASH; } + + // Increment/decrement the ref-count. Decrementing to zero deletes the current object. + inline void ref() { + if (isReadOnly()) + return; + MEMDBG2("INCR: %p refs=%d", this, this->refcnt); + check(refcnt > 1, PANIC_REF_DELETED); + refcnt += 2; + } + + inline void unref() { + if (isReadOnly()) + return; + MEMDBG2("DECR: %p refs=%d", this, this->refcnt); + check(refcnt > 1, PANIC_REF_DELETED); + check((refcnt & 1), PANIC_REF_DELETED); + refcnt -= 2; + if (refcnt == 1) { + MEMDBG("DEL: %p", this); + destroyVT(); + } + } +#endif +}; + +class Segment { + private: + TValue *data; + ramint_t length; + ramint_t size; + + // this just gives max value of ramint_t + void growByMin(ramint_t minSize); + void ensure(ramint_t newSize); + + public: + static constexpr ramint_t MaxSize = (((1U << (8 * sizeof(ramint_t) - 1)) - 1) << 1) + 1; + static constexpr TValue DefaultValue = TAG_UNDEFINED; // == NULL + + Segment() : data(nullptr), length(0), size(0) {} + + TValue get(unsigned i) { return i < length ? data[i] : NULL; } + void set(unsigned i, TValue value); + + unsigned getLength() { return length; }; + void setLength(unsigned newLength); + + void push(TValue value) { set(length, value); } + TValue pop(); + + TValue remove(unsigned i); + void insert(unsigned i, TValue value); + + void destroy(); + + void print(); + + TValue *getData() { return data; } +}; + +// Low-Level segment using system malloc +class LLSegment { + private: + TValue *data; + ramint_t length; + ramint_t size; + + public: + LLSegment() : data(nullptr), length(0), size(0) {} + + void set(unsigned idx, TValue v); + void push(TValue value) { set(length, value); } + TValue pop(); + void destroy(); + void setLength(unsigned newLen); + + TValue get(unsigned i) { return i < length ? data[i] : NULL; } + unsigned getLength() { return length; }; + TValue *getData() { return data; } +}; + +// A ref-counted collection of either primitive or ref-counted objects (String, Image, +// user-defined record, another collection) +class RefCollection : public RefObject { + public: + Segment head; + + RefCollection(); + + static void destroy(RefCollection *coll); + static void scan(RefCollection *coll); + static unsigned gcsize(RefCollection *coll); + static void print(RefCollection *coll); + + unsigned length() { return head.getLength(); } + void setLength(unsigned newLength) { head.setLength(newLength); } + TValue getAt(int i) { return head.get(i); } + TValue *getData() { return head.getData(); } +}; + +class BoxedString; +class RefMap : public RefObject { + public: + Segment keys; + Segment values; + + RefMap(); + static void destroy(RefMap *map); + static void scan(RefMap *map); + static unsigned gcsize(RefMap *coll); + static void print(RefMap *map); + int findIdx(BoxedString *key); +}; + +// A ref-counted, user-defined JS object. +class RefRecord : public RefObject { + public: + // The object is allocated, so that there is space at the end for the fields. + TValue fields[]; + + RefRecord(VTable *v) : RefObject(v) {} + + TValue ld(int idx); + TValue ldref(int idx); + void st(int idx, TValue v); + void stref(int idx, TValue v); +}; + +static inline VTable *getVTable(RefObject *r) { +#ifdef PXT_GC + return (VTable *)(r->vtable & ~1); +#else + return (VTable *)((uintptr_t)r->vtable << PXT_VTABLE_SHIFT); +#endif +} + +static inline VTable *getAnyVTable(TValue v) { + if (!isRefCounted(v)) + return NULL; + auto vt = getVTable((RefObject *)v); + if (vt->magic == VTABLE_MAGIC) + return vt; + return NULL; +} + +// these are needed when constructing vtables for user-defined classes +//% +void RefRecord_destroy(RefRecord *r); +//% +void RefRecord_print(RefRecord *r); +//% +void RefRecord_scan(RefRecord *r); +//% +unsigned RefRecord_gcsize(RefRecord *r); + +typedef TValue (*ActionCB)(TValue *captured, TValue arg0, TValue arg1, TValue arg2); + +// Ref-counted function pointer. +class RefAction : public RefObject { + public: + uint16_t len; + uint16_t reserved; + ActionCB func; // The function pointer + // fields[] contain captured locals + TValue fields[]; + + static void destroy(RefAction *act); + static void scan(RefAction *act); + static unsigned gcsize(RefAction *coll); + static void print(RefAction *act); + + RefAction(); + + inline void stCore(int idx, TValue v) { + // DMESG("ST [%d] = %d ", idx, v); this->print(); + intcheck(0 <= idx && idx < len, PANIC_OUT_OF_BOUNDS, 10); + intcheck(fields[idx] == 0, PANIC_OUT_OF_BOUNDS, 11); // only one assignment permitted + fields[idx] = v; + } +}; + +// These two are used to represent locals written from inside inline functions +class RefRefLocal : public RefObject { + public: + TValue v; + static void destroy(RefRefLocal *l); + static void scan(RefRefLocal *l); + static unsigned gcsize(RefRefLocal *l); + static void print(RefRefLocal *l); + RefRefLocal(); +}; + +typedef int color; + +// note: this is hardcoded in PXT (hexfile.ts) + +class BoxedNumber : public RefObject { + public: + NUMBER num; + BoxedNumber() : RefObject(&number_vt) {} +} __attribute__((packed)); + +class BoxedString : public RefObject { + public: + union { + struct { + uint16_t length; + char data[0]; + } ascii; +#if PXT_UTF8 + struct { + uint16_t length; + char data[0]; + } utf8; + struct { + BoxedString *left; + BoxedString *right; + } cons; + struct { + uint16_t size; + uint16_t length; + uint16_t *list; + } skip; +#endif + }; + +#if PXT_UTF8 + uint32_t runMethod(int idx) { + return ((uint32_t(*)(BoxedString *))((VTable *)this->vtable)->methods[idx])(this); + } + const char *getUTF8Data() { return (const char *)runMethod(4); } + uint32_t getUTF8Size() { return runMethod(5); } + // in characters + uint32_t getLength() { return runMethod(6); } + const char *getUTF8DataAt(uint32_t pos) { + auto meth = ((const char *(*)(BoxedString *, uint32_t))((VTable *)this->vtable)->methods[7]); + return meth(this, pos); + } +#else + const char *getUTF8Data() { return ascii.data; } + uint32_t getUTF8Size() { return ascii.length; } + uint32_t getLength() { return ascii.length; } + const char *getUTF8DataAt(uint32_t pos) { return pos < ascii.length ? ascii.data + pos : NULL; } +#endif + + TNumber charCodeAt(int pos); + + BoxedString(const VTable *vt) : RefObject(vt) {} +}; + +// cross version compatible way of accessing string data +#ifndef PXT_STRING_DATA +#define PXT_STRING_DATA(str) str->getUTF8Data() +#endif + +// cross version compatible way of accessing string length +#ifndef PXT_STRING_DATA_LENGTH +#define PXT_STRING_DATA_LENGTH(str) str->getUTF8Size() +#endif + +class BoxedBuffer : public RefObject { + public: + // data needs to be word-aligned, so we use 32 bits for length + int length; + uint8_t data[0]; + BoxedBuffer() : RefObject(&buffer_vt) {} +}; + +// cross version compatible way of access data field +#ifndef PXT_BUFFER_DATA +#define PXT_BUFFER_DATA(buffer) buffer->data +#endif + +// cross version compatible way of access data length +#ifndef PXT_BUFFER_LENGTH +#define PXT_BUFFER_LENGTH(buffer) buffer->length +#endif + +#ifndef PXT_CREATE_BUFFER +#define PXT_CREATE_BUFFER(data, len) pxt::mkBuffer(data, len) +#endif + +// the first byte of data indicates the format - currently 0xE1 or 0xE4 to 1 or 4 bit bitmaps +// second byte indicates width in pixels +// third byte indicates the height (which should also match the size of the buffer) +// just like ordinary buffers, these can be layed out in flash +class RefImage : public RefObject { + uintptr_t _buffer; + uint8_t _data[0]; + + public: + RefImage(BoxedBuffer *buf); + RefImage(uint32_t sz); + + bool hasBuffer() { return !(_buffer & 1); } + BoxedBuffer *buffer() { return hasBuffer() ? (BoxedBuffer *)_buffer : NULL; } + void setBuffer(BoxedBuffer *b); + bool isDirty() { return (_buffer & 3) == 3; } + void clearDirty() { + if (isDirty()) + _buffer &= ~2; + } + + uint8_t *data() { return hasBuffer() ? buffer()->data : _data; } + int length() { return hasBuffer() ? buffer()->length : (_buffer >> 2); } + int pixLength() { return length() - 4; } + + int height(); + int width(); + int byteHeight(); + int wordHeight(); + int bpp(); + + bool hasPadding() { return (height() & 0x1f) != 0; } + + uint8_t *pix() { return data() + 4; } + uint8_t *pix(int x, int y); + uint8_t fillMask(color c); + bool inRange(int x, int y); + void clamp(int *x, int *y); + void makeWritable(); + + static void destroy(RefImage *t); + static void scan(RefImage *t); + static unsigned gcsize(RefImage *t); + static void print(RefImage *t); +}; + +RefImage *mkImage(int w, int h, int bpp); + +typedef BoxedBuffer *Buffer; +typedef BoxedString *String; +typedef RefImage *Image_; + +uint32_t toRealUTF8(String str, uint8_t *dst); + +// keep in sync with github/pxt/pxtsim/libgeneric.ts +enum class NumberFormat { + Int8LE = 1, + UInt8LE, + Int16LE, + UInt16LE, + Int32LE, + Int8BE, + UInt8BE, + Int16BE, + UInt16BE, + Int32BE, + + UInt32LE, + UInt32BE, + Float32LE, + Float64LE, + Float32BE, + Float64BE, +}; + +// this will, unlike mkStringCore, UTF8-canonicalize the data +String mkString(const char *data, int len = -1); +// data can be NULL in both cases +Buffer mkBuffer(const uint8_t *data, int len); +String mkStringCore(const char *data, int len = -1); + +TNumber getNumberCore(uint8_t *buf, int size, NumberFormat format); +void setNumberCore(uint8_t *buf, int size, NumberFormat format, TNumber value); + +void seedRandom(unsigned seed); +void seedAddRandom(unsigned seed); +// max is inclusive +unsigned getRandom(unsigned max); + +ValType valType(TValue v); + +#ifdef PXT_GC +void registerGC(TValue *root, int numwords = 1); +void unregisterGC(TValue *root, int numwords = 1); +void registerGCPtr(TValue ptr); +void unregisterGCPtr(TValue ptr); +void gc(int flags); +#else +inline void registerGC(TValue *root, int numwords = 1) {} +inline void unregisterGC(TValue *root, int numwords = 1) {} +inline void registerGCPtr(TValue ptr) {} +inline void unregisterGCPtr(TValue ptr) {} +inline void gc(int) {} +#endif + +struct StackSegment { + void *top; + void *bottom; + StackSegment *next; +}; + +struct ThreadContext { + TValue *globals; + StackSegment stack; +#ifdef PXT_GC_THREAD_LIST + ThreadContext *next; + ThreadContext *prev; +#endif +}; + +#ifdef PXT_GC_THREAD_LIST +extern ThreadContext *threadContexts; +void *threadAddressFor(ThreadContext *, void *sp); +#endif + +void releaseThreadContext(ThreadContext *ctx); +ThreadContext *getThreadContext(); +void setThreadContext(ThreadContext *ctx); + +#ifndef PXT_GC_THREAD_LIST +void gcProcessStacks(int flags); +#endif + +void gcProcess(TValue v); +void gcFreeze(); + +void *gcAllocate(int numbytes); +void *gcAllocateArray(int numbytes); +extern "C" void *app_alloc(int numbytes); +extern "C" void *app_free(void *ptr); +#ifndef PXT_GC +inline void *gcAllocate(int numbytes) { + return xmalloc(numbytes); +} +#endif + +enum class PerfCounters { + GC, +}; + +#ifdef PXT_PROFILE +#ifndef PERF_NOW +#error "missing platform timer support" +#endif + +struct PerfCounter { + uint32_t value; + uint32_t numstops; + uint32_t start; +}; + +extern struct PerfCounter *perfCounters; + +void initPerfCounters(); +//% +void dumpPerfCounters(); +//% +void startPerfCounter(PerfCounters n); +//% +void stopPerfCounter(PerfCounters n); +#else +inline void startPerfCounter(PerfCounters n) {} +inline void stopPerfCounter(PerfCounters n) {} +inline void initPerfCounters() {} +inline void dumpPerfCounters() {} +#endif + +} // namespace pxt + +#define PXT_DEF_STRING(name, val) \ + static const char name[] __attribute__((aligned(4))) = "@PXT@:" val; + +using namespace pxt; + +namespace numops { +//% +String toString(TValue v); +//% +int toBool(TValue v); +//% +int toBoolDecr(TValue v); +} // namespace numops + +namespace pins { +Buffer createBuffer(int size); +} + +namespace String_ { +//% +int compare(String a, String b); +} // namespace String_ + +namespace Array_ { +//% +RefCollection *mk(); +//% +int length(RefCollection *c); +//% +void setLength(RefCollection *c, int newLength); +//% +void push(RefCollection *c, TValue x); +//% +TValue pop(RefCollection *c); +//% +TValue getAt(RefCollection *c, int x); +//% +void setAt(RefCollection *c, int x, TValue y); +//% +TValue removeAt(RefCollection *c, int x); +//% +void insertAt(RefCollection *c, int x, TValue value); +//% +int indexOf(RefCollection *c, TValue x, int start); +//% +bool removeElement(RefCollection *c, TValue x); +} // namespace Array_ + +#define NEW_GC(T, ...) new (gcAllocate(sizeof(T))) T(__VA_ARGS__) + +// The ARM Thumb generator in the JavaScript code is parsing +// the hex file and looks for the magic numbers as present here. +// +// Then it fetches function pointer addresses from there. +// +// The vtable pointers are there, so that the ::emptyData for various types +// can be patched with the right vtable. +// +#define PXT_SHIMS_BEGIN \ + namespace pxt { \ + const unsigned functionsAndBytecode[] \ + __attribute__((aligned(0x20))) = {0x08010801, 0x42424242, 0x08010801, 0x8de9d83e, + +#define PXT_SHIMS_END \ + } \ + ; \ + } + +#ifndef X86_64 +#pragma GCC diagnostic ignored "-Wpmf-conversions" +#endif + +#define DEF_VTABLE(name, tp, valtype, ...) \ + const VTable name __attribute__((aligned(1 << PXT_VTABLE_SHIFT))) = { \ + sizeof(tp), valtype, VTABLE_MAGIC, 0, BuiltInType::tp, 0, 0, {__VA_ARGS__}}; + +#ifdef PXT_GC +#define PXT_VTABLE(classname) \ + DEF_VTABLE(classname##_vtable, classname, ValType::Object, (void *)&classname::destroy, \ + (void *)&classname::print, (void *)&classname::scan, (void *)&classname::gcsize) +#else +#define PXT_VTABLE(classname) \ + DEF_VTABLE(classname##_vtable, classname, ValType::Object, (void *)&classname::destroy, \ + (void *)&classname::print) +#endif + +#define PXT_VTABLE_INIT(classname) RefObject(&classname##_vtable) + +#define PXT_VTABLE_CTOR(classname) \ + PXT_VTABLE(classname) \ + classname::classname() : PXT_VTABLE_INIT(classname) + +#define PXT_MAIN \ + int main() { \ + pxt::start(); \ + return 0; \ + } + +#define PXT_FNPTR(x) (unsigned)(void *)(x) + +#define PXT_ABI(...) + +#define JOIN(a, b) a##b +/// Defines getClassName() function to fetch the singleton +#define SINGLETON(ClassName) \ + static ClassName *JOIN(inst, ClassName); \ + ClassName *JOIN(get, ClassName)() { \ + if (!JOIN(inst, ClassName)) \ + JOIN(inst, ClassName) = new ClassName(); \ + return JOIN(inst, ClassName); \ + } + +/// Defines getClassName() function to fetch the singleton if PIN present +#define SINGLETON_IF_PIN(ClassName, pin) \ + static ClassName *JOIN(inst, ClassName); \ + ClassName *JOIN(get, ClassName)() { \ + if (!JOIN(inst, ClassName) && LOOKUP_PIN(pin)) \ + JOIN(inst, ClassName) = new ClassName(); \ + return JOIN(inst, ClassName); \ + } + +#endif diff --git a/pxt_modules/core/pxtcore.h b/pxt_modules/core/pxtcore.h new file mode 100644 index 0000000..51d0dab --- /dev/null +++ b/pxt_modules/core/pxtcore.h @@ -0,0 +1,25 @@ +#ifndef __PXTCORE_H +#define __PXTCORE_H + +#include "MicroBit.h" +#include "MicroBitImage.h" +#include "ManagedString.h" +#include "ManagedType.h" + +namespace pxt { +void debuglog(const char *format, ...); +} + +// #define GC_GET_HEAP_SIZE() device_heap_size(0) +#define xmalloc malloc +#define xfree free + +#if CONFIG_ENABLED(MICROBIT_BLE_ENABLED) +#define GC_BLOCK_SIZE 256 +#else +#define GC_BLOCK_SIZE 1000 +#endif + +#define DMESG NOLOG + +#endif diff --git a/pxt_modules/core/pxtparts.json b/pxt_modules/core/pxtparts.json new file mode 100644 index 0000000..470c7e2 --- /dev/null +++ b/pxt_modules/core/pxtparts.json @@ -0,0 +1,445 @@ +{ + "buttonpair": { + "simulationBehavior": "buttonpair", + "visual": { + "builtIn": "buttonpair", + "width": 75, + "height": 45, + "pinDistance": 15, + "pinLocations": [ + { + "x": 0, + "y": 0 + }, + { + "x": 30, + "y": 45 + }, + { + "x": 45, + "y": 0 + }, + { + "x": 75, + "y": 45 + } + ] + }, + "numberOfPins": 4, + "pinDefinitions": [ + { + "target": "P14", + "style": "male", + "orientation": "-Z" + }, + { + "target": "ground", + "style": "male", + "orientation": "-Z" + }, + { + "target": "P15", + "style": "male", + "orientation": "-Z" + }, + { + "target": "ground", + "style": "male", + "orientation": "-Z" + } + ], + "instantiation": { + "kind": "singleton" + }, + "assembly": [ + { + "part": true + }, + { + "pinIndices": [ + 0, + 1 + ] + }, + { + "pinIndices": [ + 2, + 3 + ] + } + ] + }, + "microservo": { + "simulationBehavior": "microservo", + "visual": { + "builtIn": "microservo", + "width": 74.85, + "height": 200, + "pinDistance": 10, + "pinLocations": [ + { + "x": 30, + "y": 5 + }, + { + "x": 37, + "y": 5 + }, + { + "x": 45, + "y": 5 + } + ] + }, + "numberOfPins": 3, + "pinDefinitions": [ + { + "target": { + "pinInstantiationIdx": 0 + }, + "style": "croc", + "orientation": "+Z" + }, + { + "target": "threeVolt", + "style": "croc", + "orientation": "+Z" + }, + { + "target": "ground", + "style": "croc", + "orientation": "+Z" + } + ], + "instantiations": [ + { + "kind": "function", + "fullyQualifiedName": "pins.servoWritePin,pins.servoSetPulse,PwmOnlyPin.servoWrite,PwmOnlyPin.servoSetPulse,servos.Servo.setAngle,servos.Servo.run,servos.Servo.setPulse", + "argumentRoles": [ + { + "pinInstantiationIdx": 0, + "partParameter": "name" + } + ] + } + ], + "assembly": [ + { + "part": true, + "pinIndices": [ + 2 + ] + }, + { + "pinIndices": [ + 0, + 1 + ] + } + ] + }, + "neopixel": { + "simulationBehavior": "neopixel", + "visual": { + "builtIn": "neopixel", + "width": 58, + "height": 113, + "pinDistance": 9, + "pinLocations": [ + { + "x": 10, + "y": 0 + }, + { + "x": 19, + "y": 0 + }, + { + "x": 28, + "y": 0 + } + ] + }, + "numberOfPins": 3, + "pinDefinitions": [ + { + "target": { + "pinInstantiationIdx": 0 + }, + "style": "solder", + "orientation": "+Z" + }, + { + "target": "threeVolt", + "style": "solder", + "orientation": "+Z" + }, + { + "target": "ground", + "style": "solder", + "orientation": "+Z" + } + ], + "instantiation": { + "kind": "function", + "fullyQualifiedName": "neopixel.create", + "argumentRoles": [ + { + "pinInstantiationIdx": 0, + "partParameter": "pin" + }, + { + "partParameter": "mode" + } + ] + }, + "assembly": [ + { + "part": true, + "pinIndices": [ + 2 + ] + }, + { + "pinIndices": [ + 0, + 1 + ] + } + ] + }, + "ledmatrix": { + "visual": { + "builtIn": "ledmatrix", + "width": 105, + "height": 105, + "pinDistance": 15, + "pinLocations": [ + { + "x": 0, + "y": 0 + }, + { + "x": 15, + "y": 0 + }, + { + "x": 30, + "y": 0 + }, + { + "x": 45, + "y": 0 + }, + { + "x": 105, + "y": 105 + }, + { + "x": 0, + "y": 105 + }, + { + "x": 15, + "y": 105 + }, + { + "x": 30, + "y": 105 + }, + { + "x": 45, + "y": 105 + }, + { + "x": 60, + "y": 0 + } + ] + }, + "simulationBehavior": "ledmatrix", + "numberOfPins": 10, + "instantiation": { + "kind": "singleton" + }, + "pinDefinitions": [ + { + "target": "P6", + "style": "male", + "orientation": "-Z", + "colorGroup": 0 + }, + { + "target": "P7", + "style": "male", + "orientation": "-Z", + "colorGroup": 0 + }, + { + "target": "P8", + "style": "male", + "orientation": "-Z", + "colorGroup": 0 + }, + { + "target": "P9", + "style": "male", + "orientation": "-Z", + "colorGroup": 0 + }, + { + "target": "P10", + "style": "male", + "orientation": "-Z", + "colorGroup": 0 + }, + { + "target": "P12", + "style": "male", + "orientation": "-Z", + "colorGroup": 1 + }, + { + "target": "P13", + "style": "male", + "orientation": "-Z", + "colorGroup": 1 + }, + { + "target": "P16", + "style": "male", + "orientation": "-Z", + "colorGroup": 1 + }, + { + "target": "P19", + "style": "male", + "orientation": "-Z", + "colorGroup": 1 + }, + { + "target": "P20", + "style": "male", + "orientation": "-Z", + "colorGroup": 1 + } + ], + "assembly": [ + { + "part": true + }, + { + "pinIndices": [ + 0, + 1, + 2, + 3, + 4 + ] + }, + { + "pinIndices": [ + 5, + 6, + 7, + 8, + 9 + ] + } + ] + }, + "headphone": { + "numberOfPins": 2, + "visual": { + "image": "parts/headphone.svg", + "width": 142, + "height": 180, + "pinDistance": 20, + "pinLocations": [ + { + "x": 17, + "y": 11 + }, + { + "x": 55, + "y": 50 + } + ] + }, + "pinDefinitions": [ + { + "target": "P0", + "style": "croc", + "orientation": "Y" + }, + { + "target": "ground", + "style": "croc", + "orientation": "Y" + } + ], + "instantiation": { + "kind": "singleton" + }, + "assembly": [ + { + "part": true, + "pinIndices": [ + 0 + ] + }, + { + "pinIndices": [ + 1 + ] + } + ] + }, + "speaker": { + "numberOfPins": 2, + "visual": { + "image": "parts/speaker.svg", + "width": 500, + "height": 500, + "pinDistance": 70, + "pinLocations": [ + { + "x": 180, + "y": 135 + }, + { + "x": 320, + "y": 135 + } + ] + }, + "pinDefinitions": [ + { + "target": "P0", + "style": "male", + "orientation": "-Z" + }, + { + "target": "ground", + "style": "male", + "orientation": "-Z" + } + ], + "instantiation": { + "kind": "singleton" + }, + "assembly": [ + { + "part": true, + "pinIndices": [ + 0 + ] + }, + { + "pinIndices": [ + 1 + ] + } + ] + } +} \ No newline at end of file diff --git a/pxt_modules/core/serial.cpp b/pxt_modules/core/serial.cpp new file mode 100644 index 0000000..656213b --- /dev/null +++ b/pxt_modules/core/serial.cpp @@ -0,0 +1,214 @@ +#include "pxt.h" + +#define MICROBIT_SERIAL_READ_BUFFER_LENGTH 64 + +// make sure USB_TX and USB_RX don't overlap with other pin ids +enum SerialPin { + P0 = MICROBIT_ID_IO_P0, + P1 = MICROBIT_ID_IO_P1, + P2 = MICROBIT_ID_IO_P2, + P8 = MICROBIT_ID_IO_P8, + P12 = MICROBIT_ID_IO_P12, + P13 = MICROBIT_ID_IO_P13, + P14 = MICROBIT_ID_IO_P14, + P15 = MICROBIT_ID_IO_P15, + P16 = MICROBIT_ID_IO_P16, + USB_TX = 1001, + USB_RX = 1002 +}; + +enum BaudRate { + //% block=115200 + BaudRate115200 = 115200, + //% block=57600 + BaudRate57600 = 57600, + //% block=38400 + BaudRate38400 = 38400, + //% block=31250 + BaudRate31250 = 31250, + //% block=28800 + BaudRate28800 = 28800, + //% block=19200 + BaudRate19200 = 19200, + //% block=14400 + BaudRate14400 = 14400, + //% block=9600 + BaudRate9600 = 9600, + //% block=4800 + BaudRate4800 = 4800, + //% block=2400 + BaudRate2400 = 2400, + //% block=1200 + BaudRate1200 = 1200 +}; + +enum Delimiters { + //% block="new line" + NewLine = 1, + //% block="," + Comma = 2, + //% block="$" + Dollar = 3, + //% block=":" + Colon = 4, + //% block="." + Fullstop = 5, + //% block="#" + Hash = 6, +}; + +//% weight=2 color=#002050 icon="\uf287" +//% advanced=true +namespace serial { + // note that at least one // followed by % is needed per declaration! + + /** + * Read a line of text from the serial port and return the buffer when the delimiter is met. + * @param delimiter text delimiter that separates each text chunk + */ + //% help=serial/read-until + //% blockId=serial_read_until block="serial|read until %delimiter=serial_delimiter_conv" + //% weight=19 + String readUntil(String delimiter) { + return PSTR(uBit.serial.readUntil(MSTR(delimiter))); + } + + /** + * Read the buffered received data as a string + */ + //% help=serial/read-string + //% blockId=serial_read_buffer block="serial|read string" + //% weight=18 + String readString() { + int n = uBit.serial.getRxBufferSize(); + if (n == 0) return mkString("", 0); + return PSTR(uBit.serial.read(n, MicroBitSerialMode::ASYNC)); + } + + /** + * Register an event to be fired when one of the delimiter is matched. + * @param delimiters the characters to match received characters against. + */ + //% help=serial/on-data-received + //% weight=18 blockId=serial_on_data_received block="serial|on data received %delimiters=serial_delimiter_conv" + void onDataReceived(String delimiters, Action body) { + uBit.serial.eventOn(MSTR(delimiters)); + registerWithDal(MICROBIT_ID_SERIAL, MICROBIT_SERIAL_EVT_DELIM_MATCH, body); + // lazy initialization of serial buffers + uBit.serial.read(MicroBitSerialMode::ASYNC); + } + + /** + * Send a piece of text through the serial connection. + */ + //% help=serial/write-string + //% weight=87 blockGap=8 + //% blockId=serial_writestring block="serial|write string %text" + //% text.shadowOptions.toString=true + void writeString(String text) { + if (!text) return; + + uBit.serial.send(MSTR(text)); + } + + /** + * Send a buffer through serial connection + */ + //% blockId=serial_writebuffer block="serial|write buffer %buffer=serial_readbuffer" + //% help=serial/write-buffer advanced=true weight=6 + void writeBuffer(Buffer buffer) { + if (!buffer) return; + + uBit.serial.send(buffer->data, buffer->length); + } + + /** + * Read multiple characters from the receive buffer. Pause until enough characters are present. + * @param length default buffer length, eg: 64 + */ + //% blockId=serial_readbuffer block="serial|read buffer %length" + //% help=serial/read-buffer advanced=true weight=5 + Buffer readBuffer(int length) { + if (length <= 0) + length = MICROBIT_SERIAL_READ_BUFFER_LENGTH; + + auto buf = mkBuffer(NULL, length); + int read = uBit.serial.read(buf->data, buf->length); + if (read != length) { + auto prev = buf; + buf = mkBuffer(buf->data, read); + decrRC(prev); + } + + return buf; + } + + bool tryResolvePin(SerialPin p, PinName& name) { + switch(p) { + case SerialPin::USB_TX: name = USBTX; return true; + case SerialPin::USB_RX: name = USBRX; return true; + default: + auto pin = getPin(p); + if (NULL != pin) { + name = pin->name; + return true; + } + } + return false; + } + + /** + * Set the serial input and output to use pins instead of the USB connection. + * @param tx the new transmission pin, eg: SerialPin.P0 + * @param rx the new reception pin, eg: SerialPin.P1 + * @param rate the new baud rate. eg: 115200 + */ + //% weight=10 + //% help=serial/redirect + //% blockId=serial_redirect block="serial|redirect to|TX %tx|RX %rx|at baud rate %rate" + //% blockExternalInputs=1 + //% tx.fieldEditor="gridpicker" tx.fieldOptions.columns=3 + //% tx.fieldOptions.tooltips="false" + //% rx.fieldEditor="gridpicker" rx.fieldOptions.columns=3 + //% rx.fieldOptions.tooltips="false" + //% blockGap=8 + void redirect(SerialPin tx, SerialPin rx, BaudRate rate) { + PinName txn; + PinName rxn; + if (tryResolvePin(tx, txn) && tryResolvePin(rx, rxn)) + uBit.serial.redirect(txn, rxn); + uBit.serial.baud((int)rate); + } + + /** + * Direct the serial input and output to use the USB connection. + */ + //% weight=9 help=serial/redirect-to-usb + //% blockId=serial_redirect_to_usb block="serial|redirect to USB" + void redirectToUSB() { + uBit.serial.redirect(USBTX, USBRX); + uBit.serial.baud(115200); + } + + /** + * Sets the size of the RX buffer in bytes + * @param size length of the rx buffer in bytes, eg: 32 + */ + //% help=serial/set-rx-buffer-size + //% blockId=serialSetRxBufferSize block="serial set rx buffer size to $size" + //% advanced=true + void setRxBufferSize(uint8_t size) { + uBit.serial.setRxBufferSize(size); + } + + /** + * Sets the size of the TX buffer in bytes + * @param size length of the tx buffer in bytes, eg: 32 + */ + //% help=serial/set-tx-buffer-size + //% blockId=serialSetTxBufferSize block="serial set tx buffer size to $size" + //% advanced=true + void setTxBufferSize(uint8_t size) { + uBit.serial.setTxBufferSize(size); + } +} diff --git a/pxt_modules/core/serial.ts b/pxt_modules/core/serial.ts new file mode 100644 index 0000000..c98944d --- /dev/null +++ b/pxt_modules/core/serial.ts @@ -0,0 +1,114 @@ +/** + * Reading and writing data over a serial connection. + */ +//% weight=2 color=#002050 icon="\uf287" +//% advanced=true +namespace serial { + /** + * The string used to mark a new line, default is \r\n + */ + export let NEW_LINE = "\r\n"; + let writeLinePadding = 32; + + /** + * Print a line of text to the serial port + * @param value to send over serial + */ + //% weight=90 + //% help=serial/write-line blockGap=8 + //% blockId=serial_writeline block="serial|write line %text" + //% text.shadowOptions.toString=true + export function writeLine(text: string): void { + if (!text) text = ""; + serial.writeString(text); + // pad data to the 32 byte boundary + // to ensure apps receive the packet + if (writeLinePadding > 0) { + let r = (writeLinePadding - (text.length + NEW_LINE.length) % writeLinePadding) % writeLinePadding; + for (let i = 0; i < r; ++i) + serial.writeString(" "); + } + serial.writeString(NEW_LINE); + } + + /** + * Sets the padding length for lines sent with "write line". + * @param length the number of bytes alignment, eg: 0 + * + */ + //% weight=1 + //% help=serial/set-write-line-padding + //% blockId=serialWriteNewLinePadding block="serial set write line padding to $length" + //% advanced=true + //% length.min=0 length.max=128 + export function setWriteLinePadding(length: number) { + writeLinePadding = length | 0; + } + + /** + * Print a numeric value to the serial port + */ + //% help=serial/write-number + //% weight=89 blockGap=8 + //% blockId=serial_writenumber block="serial|write number %value" + export function writeNumber(value: number): void { + writeString(value.toString()); + } + + /** + * Print an array of numeric values as CSV to the serial port + */ + //% help=serial/write-numbers + //% weight=86 + //% blockId=serial_writenumbers block="serial|write numbers %values" + export function writeNumbers(values: number[]): void { + if (!values) return; + for (let i = 0; i < values.length; ++i) { + if (i > 0) writeString(","); + writeNumber(values[i]); + } + writeLine("") + } + + /** + * Write a name:value pair as a line to the serial port. + * @param name name of the value stream, eg: x + * @param value to write + */ + //% weight=88 blockGap=8 + //% help=serial/write-value + //% blockId=serial_writevalue block="serial|write value %name|= %value" + export function writeValue(name: string, value: number): void { + writeLine((name ? name + ":" : "") + value); + } + + /** + * Read a line of text from the serial port. + */ + //% help=serial/read-line + //% blockId=serial_read_line block="serial|read line" + //% weight=20 blockGap=8 + export function readLine(): string { + return serial.readUntil(delimiters(Delimiters.NewLine)); + } + + /** + * Return the corresponding delimiter string + */ + //% blockId="serial_delimiter_conv" block="%del" + //% weight=1 blockHidden=true + export function delimiters(del: Delimiters): string { + // even though it might not look like, this is more + // (memory) efficient than the C++ implementation, because the + // strings are statically allocated and take no RAM + switch (del) { + case Delimiters.NewLine: return "\n" + case Delimiters.Comma: return "," + case Delimiters.Dollar: return "$" + case Delimiters.Colon: return ":" + case Delimiters.Fullstop: return "." + case Delimiters.Hash: return "#" + default: return "\n" + } + } +} diff --git a/pxt_modules/core/shims.d.ts b/pxt_modules/core/shims.d.ts new file mode 100644 index 0000000..1f3f114 --- /dev/null +++ b/pxt_modules/core/shims.d.ts @@ -0,0 +1,986 @@ +// Auto-generated. Do not edit. + + + /** + * Creation, manipulation and display of LED images. + */ + //% color=#7600A8 weight=31 icon="\uf03e" + //% advanced=true +declare namespace images { + + /** + * Creates an image that fits on the LED screen. + */ + //% weight=75 help=images/create-image + //% blockId=device_build_image block="create image" + //% parts="ledmatrix" imageLiteral=1 shim=images::createImage + function createImage(leds: string): Image; + + /** + * Creates an image with 2 frames. + */ + //% weight=74 help=images/create-big-image + //% blockId=device_build_big_image block="create big image" imageLiteral=2 + //% parts="ledmatrix" shim=images::createBigImage + function createBigImage(leds: string): Image; +} + + +declare interface Image { + /** + * Plots the image at a given column to the screen + */ + //% help=images/plot-image + //% parts="ledmatrix" xOffset.defl=0 shim=ImageMethods::plotImage + plotImage(xOffset?: int32): void; + + /** + * Shows an frame from the image at offset ``x offset``. + * @param xOffset column index to start displaying the image + */ + //% help=images/show-image weight=80 blockNamespace=images + //% blockId=device_show_image_offset block="show image %sprite(myImage)|at offset %offset" + //% blockGap=8 parts="ledmatrix" async interval.defl=400 shim=ImageMethods::showImage + showImage(xOffset: int32, interval?: int32): void; + + /** + * Draws the ``index``-th frame of the image on the screen. + * @param xOffset column index to start displaying the image + */ + //% help=images/plot-frame weight=80 + //% parts="ledmatrix" shim=ImageMethods::plotFrame + plotFrame(xOffset: int32): void; + + /** + * Scrolls an image . + * @param frameOffset x offset moved on each animation step, eg: 1, 2, 5 + * @param interval time between each animation step in milli seconds, eg: 200 + */ + //% help=images/scroll-image weight=79 async blockNamespace=images + //% blockId=device_scroll_image + //% block="scroll image %sprite(myImage)|with offset %frameoffset|and interval (ms) %delay" + //% blockGap=8 parts="ledmatrix" shim=ImageMethods::scrollImage + scrollImage(frameOffset: int32, interval: int32): void; + + /** + * Sets all pixels off. + */ + //% help=images/clear + //% parts="ledmatrix" shim=ImageMethods::clear + clear(): void; + + /** + * Sets a specific pixel brightness at a given position + */ + //% + //% parts="ledmatrix" shim=ImageMethods::setPixelBrightness + setPixelBrightness(x: int32, y: int32, value: int32): void; + + /** + * Gets the pixel brightness ([0..255]) at a given position + */ + //% + //% parts="ledmatrix" shim=ImageMethods::pixelBrightness + pixelBrightness(x: int32, y: int32): int32; + + /** + * Gets the width in columns + */ + //% help=functions/width shim=ImageMethods::width + width(): int32; + + /** + * Gets the height in rows (always 5) + */ + //% shim=ImageMethods::height + height(): int32; + + /** + * Set a pixel state at position ``(x,y)`` + * @param x pixel column + * @param y pixel row + * @param value pixel state + */ + //% help=images/set-pixel + //% parts="ledmatrix" shim=ImageMethods::setPixel + setPixel(x: int32, y: int32, value: boolean): void; + + /** + * Get the pixel state at position ``(x,y)`` + * @param x pixel column + * @param y pixel row + */ + //% help=images/pixel + //% parts="ledmatrix" shim=ImageMethods::pixel + pixel(x: int32, y: int32): boolean; + + /** + * Show a particular frame of the image strip. + * @param frame image frame to show + */ + //% weight=70 help=images/show-frame + //% parts="ledmatrix" interval.defl=400 shim=ImageMethods::showFrame + showFrame(frame: int32, interval?: int32): void; +} + + + /** + * Provides access to basic micro:bit functionality. + */ + //% color=#1E90FF weight=116 icon="\uf00a" +declare namespace basic { + + /** + * Draws an image on the LED screen. + * @param leds the pattern of LED to turn on/off + * @param interval time in milliseconds to pause after drawing + */ + //% help=basic/show-leds + //% weight=95 blockGap=8 + //% imageLiteral=1 async + //% blockId=device_show_leds + //% block="show leds" icon="\uf00a" + //% parts="ledmatrix" interval.defl=400 shim=basic::showLeds + function showLeds(leds: string, interval?: int32): void; + + /** + * Display text on the display, one character at a time. If the string fits on the screen (i.e. is one letter), does not scroll. + * @param text the text to scroll on the screen, eg: "Hello!" + * @param interval how fast to shift characters; eg: 150, 100, 200, -100 + */ + //% help=basic/show-string + //% weight=87 blockGap=16 + //% block="show|string %text" + //% async + //% blockId=device_print_message + //% parts="ledmatrix" + //% text.shadowOptions.toString=true interval.defl=150 shim=basic::showString + function showString(text: string, interval?: int32): void; + + /** + * Turn off all LEDs + */ + //% help=basic/clear-screen weight=79 + //% blockId=device_clear_display block="clear screen" + //% parts="ledmatrix" + //% advanced=true shim=basic::clearScreen + function clearScreen(): void; + + /** + * Shows a sequence of LED screens as an animation. + * @param leds pattern of LEDs to turn on/off + * @param interval time in milliseconds between each redraw + */ + //% help=basic/show-animation imageLiteral=1 async + //% parts="ledmatrix" interval.defl=400 shim=basic::showAnimation + function showAnimation(leds: string, interval?: int32): void; + + /** + * Draws an image on the LED screen. + * @param leds pattern of LEDs to turn on/off + */ + //% help=basic/plot-leds weight=80 + //% parts="ledmatrix" imageLiteral=1 shim=basic::plotLeds + function plotLeds(leds: string): void; + + /** + * Repeats the code forever in the background. On each iteration, allows other codes to run. + * @param body code to execute + */ + //% help=basic/forever weight=55 blockGap=16 blockAllowMultiple=1 afterOnStart=true + //% blockId=device_forever block="forever" icon="\uf01e" shim=basic::forever + function forever(a: () => void): void; + + /** + * Pause for the specified time in milliseconds + * @param ms how long to pause for, eg: 100, 200, 500, 1000, 2000 + */ + //% help=basic/pause weight=54 + //% async block="pause (ms) %pause" blockGap=16 + //% blockId=device_pause icon="\uf110" + //% pause.shadow=timePicker shim=basic::pause + function pause(ms: int32): void; +} + + + + //% color=#D400D4 weight=111 icon="\uf192" +declare namespace input { + + /** + * Do something when a button (A, B or both A+B) is pushed down and released again. + * @param button the button that needs to be pressed + * @param body code to run when event is raised + */ + //% help=input/on-button-pressed weight=85 blockGap=16 + //% blockId=device_button_event block="on button|%NAME|pressed" + //% parts="buttonpair" shim=input::onButtonPressed + function onButtonPressed(button: Button, body: () => void): void; + + /** + * Do something when when a gesture is done (like shaking the micro:bit). + * @param gesture the type of gesture to track, eg: Gesture.Shake + * @param body code to run when gesture is raised + */ + //% help=input/on-gesture weight=84 blockGap=16 + //% blockId=device_gesture_event block="on |%NAME" + //% parts="accelerometer" + //% NAME.fieldEditor="gestures" NAME.fieldOptions.columns=4 shim=input::onGesture + function onGesture(gesture: Gesture, body: () => void): void; + + /** + * Tests if a gesture is currently detected. + * @param gesture the type of gesture to detect, eg: Gesture.Shake + */ + //% help=input/is-gesture weight=10 blockGap=8 + //% blockId=deviceisgesture block="is %gesture gesture" + //% parts="accelerometer" + //% gesture.fieldEditor="gestures" gesture.fieldOptions.columns=4 shim=input::isGesture + function isGesture(gesture: Gesture): boolean; + + /** + * Do something when a pin is touched and released again (while also touching the GND pin). + * @param name the pin that needs to be pressed, eg: TouchPin.P0 + * @param body the code to run when the pin is pressed + */ + //% help=input/on-pin-pressed weight=83 blockGap=32 + //% blockId=device_pin_event block="on pin %name|pressed" shim=input::onPinPressed + function onPinPressed(name: TouchPin, body: () => void): void; + + /** + * Do something when a pin is released. + * @param name the pin that needs to be released, eg: TouchPin.P0 + * @param body the code to run when the pin is released + */ + //% help=input/on-pin-released weight=6 blockGap=16 + //% blockId=device_pin_released block="on pin %NAME|released" + //% advanced=true shim=input::onPinReleased + function onPinReleased(name: TouchPin, body: () => void): void; + + /** + * Get the button state (pressed or not) for ``A`` and ``B``. + * @param button the button to query the request, eg: Button.A + */ + //% help=input/button-is-pressed weight=60 + //% block="button|%NAME|is pressed" + //% blockId=device_get_button2 + //% icon="\uf192" blockGap=8 + //% parts="buttonpair" shim=input::buttonIsPressed + function buttonIsPressed(button: Button): boolean; + + /** + * Get the pin state (pressed or not). Requires to hold the ground to close the circuit. + * @param name pin used to detect the touch, eg: TouchPin.P0 + */ + //% help=input/pin-is-pressed weight=58 + //% blockId="device_pin_is_pressed" block="pin %NAME|is pressed" + //% blockGap=8 shim=input::pinIsPressed + function pinIsPressed(name: TouchPin): boolean; + + /** + * Get the acceleration value in milli-gravitys (when the board is laying flat with the screen up, x=0, y=0 and z=-1024) + * @param dimension x, y, or z dimension, eg: Dimension.X + */ + //% help=input/acceleration weight=58 + //% blockId=device_acceleration block="acceleration (mg)|%NAME" blockGap=8 + //% parts="accelerometer" shim=input::acceleration + function acceleration(dimension: Dimension): int32; + + /** + * Reads the light level applied to the LED screen in a range from ``0`` (dark) to ``255`` bright. + */ + //% help=input/light-level weight=57 + //% blockId=device_get_light_level block="light level" blockGap=8 + //% parts="ledmatrix" shim=input::lightLevel + function lightLevel(): int32; + + /** + * Get the current compass heading in degrees. + */ + //% help=input/compass-heading + //% weight=56 + //% blockId=device_heading block="compass heading (°)" blockGap=8 + //% parts="compass" shim=input::compassHeading + function compassHeading(): int32; + + /** + * Gets the temperature in Celsius degrees (°C). + */ + //% weight=55 + //% help=input/temperature + //% blockId=device_temperature block="temperature (°C)" blockGap=8 + //% parts="thermometer" shim=input::temperature + function temperature(): int32; + + /** + * The pitch or roll of the device, rotation along the ``x-axis`` or ``y-axis``, in degrees. + * @param kind pitch or roll + */ + //% help=input/rotation weight=52 + //% blockId=device_get_rotation block="rotation (°)|%NAME" blockGap=8 + //% parts="accelerometer" advanced=true shim=input::rotation + function rotation(kind: Rotation): int32; + + /** + * Get the magnetic force value in ``micro-Teslas`` (``µT``). This function is not supported in the simulator. + * @param dimension the x, y, or z dimension, eg: Dimension.X + */ + //% help=input/magnetic-force weight=51 + //% blockId=device_get_magnetic_force block="magnetic force (µT)|%NAME" blockGap=8 + //% parts="compass" + //% advanced=true shim=input::magneticForce + function magneticForce(dimension: Dimension): int32; + + /** + * Gets the number of milliseconds elapsed since power on. + */ + //% help=input/running-time weight=50 blockGap=8 + //% blockId=device_get_running_time block="running time (ms)" + //% advanced=true shim=input::runningTime + function runningTime(): int32; + + /** + * Gets the number of microseconds elapsed since power on. + */ + //% help=input/running-time-micros weight=49 + //% blockId=device_get_running_time_micros block="running time (micros)" + //% advanced=true shim=input::runningTimeMicros + function runningTimeMicros(): int32; + + /** + * Obsolete, compass calibration is automatic. + */ + //% help=input/calibrate-compass advanced=true + //% blockId="input_compass_calibrate" block="calibrate compass" + //% weight=45 shim=input::calibrateCompass + function calibrateCompass(): void; + + /** + * Sets the accelerometer sample range in gravities. + * @param range a value describe the maximum strengh of acceleration measured + */ + //% help=input/set-accelerometer-range + //% blockId=device_set_accelerometer_range block="set accelerometer|range %range" + //% weight=5 + //% parts="accelerometer" + //% advanced=true shim=input::setAccelerometerRange + function setAccelerometerRange(range: AcceleratorRange): void; +} + + + + //% weight=1 color="#333333" + //% advanced=true +declare namespace control { + + /** + * Schedules code that run in the background. + */ + //% help=control/in-background blockAllowMultiple=1 afterOnStart=true + //% blockId="control_in_background" block="run in background" blockGap=8 shim=control::inBackground + function inBackground(a: () => void): void; + + /** + * Resets the BBC micro:bit. + */ + //% weight=30 async help=control/reset blockGap=8 + //% blockId="control_reset" block="reset" shim=control::reset + function reset(): void; + + /** + * Blocks the current fiber for the given microseconds + * @param micros number of micro-seconds to wait. eg: 4 + */ + //% help=control/wait-micros weight=29 + //% blockId="control_wait_us" block="wait (µs)%micros" shim=control::waitMicros + function waitMicros(micros: int32): void; + + /** + * Raises an event in the event bus. + * @param src ID of the MicroBit Component that generated the event e.g. MICROBIT_ID_BUTTON_A. + * @param value Component specific code indicating the cause of the event. + * @param mode optional definition of how the event should be processed after construction (default is CREATE_AND_FIRE). + */ + //% weight=21 blockGap=12 blockId="control_raise_event" block="raise event|from source %src=control_event_source_id|with value %value=control_event_value_id" blockExternalInputs=1 + //% help=control/raise-event + //% mode.defl=1 shim=control::raiseEvent + function raiseEvent(src: int32, value: int32, mode?: EventCreationMode): void; + + /** + * Registers an event handler. + */ + //% weight=20 blockGap=8 blockId="control_on_event" block="on event|from %src=control_event_source_id|with value %value=control_event_value_id" + //% help=control/on-event + //% blockExternalInputs=1 flags.defl=0 shim=control::onEvent + function onEvent(src: int32, value: int32, handler: () => void, flags?: int32): void; + + /** + * Gets the value of the last event executed on the bus + */ + //% blockId=control_event_value" block="event value" + //% help=control/event-value + //% weight=18 shim=control::eventValue + function eventValue(): int32; + + /** + * Gets the timestamp of the last event executed on the bus + */ + //% blockId=control_event_timestamp" block="event timestamp" + //% help=control/event-timestamp + //% weight=19 blockGap=8 shim=control::eventTimestamp + function eventTimestamp(): int32; + + /** + * Make a friendly name for the device based on its serial number + */ + //% blockId="control_device_name" block="device name" weight=10 blockGap=8 + //% advanced=true shim=control::deviceName + function deviceName(): string; + + /** + * Derive a unique, consistent serial number of this device from internal data. + */ + //% blockId="control_device_serial_number" block="device serial number" weight=9 + //% advanced=true shim=control::deviceSerialNumber + function deviceSerialNumber(): int32; + + /** + * Informs simulator/runtime of a MIDI message + * Internal function to support the simulator. + */ + //% part=midioutput blockHidden=1 shim=control::__midiSend + function __midiSend(buffer: Buffer): void; + + /** + * + */ + //% shim=control::__log + function __log(text: string): void; +} + + + + //% color=#7600A8 weight=101 icon="\uf205" +declare namespace led { + + /** + * Turn on the specified LED using x, y coordinates (x is horizontal, y is vertical). (0,0) is upper left. + * @param x the horizontal coordinate of the LED starting at 0 + * @param y the vertical coordinate of the LED starting at 0 + */ + //% help=led/plot weight=78 + //% blockId=device_plot block="plot|x %x|y %y" blockGap=8 + //% parts="ledmatrix" + //% x.min=0 x.max=4 y.min=0 y.max=4 + //% x.fieldOptions.precision=1 y.fieldOptions.precision=1 shim=led::plot + function plot(x: int32, y: int32): void; + + /** + * Turn on the specified LED with specific brightness using x, y coordinates (x is horizontal, y is vertical). (0,0) is upper left. + * @param x the horizontal coordinate of the LED starting at 0 + * @param y the vertical coordinate of the LED starting at 0 + * @param brightness the brightness from 0 (off) to 255 (bright), eg:255 + */ + //% help=led/plot-brightness weight=78 + //% blockId=device_plot_brightness block="plot|x %x|y %y|brightness %brightness" blockGap=8 + //% parts="ledmatrix" + //% x.min=0 x.max=4 y.min=0 y.max=4 brightness.min=0 brightness.max=255 + //% x.fieldOptions.precision=1 y.fieldOptions.precision=1 + //% advanced=true shim=led::plotBrightness + function plotBrightness(x: int32, y: int32, brightness: int32): void; + + /** + * Turn off the specified LED using x, y coordinates (x is horizontal, y is vertical). (0,0) is upper left. + * @param x the horizontal coordinate of the LED + * @param y the vertical coordinate of the LED + */ + //% help=led/unplot weight=77 + //% blockId=device_unplot block="unplot|x %x|y %y" blockGap=8 + //% parts="ledmatrix" + //% x.min=0 x.max=4 y.min=0 y.max=4 + //% x.fieldOptions.precision=1 y.fieldOptions.precision=1 shim=led::unplot + function unplot(x: int32, y: int32): void; + + /** + * Get the on/off state of the specified LED using x, y coordinates. (0,0) is upper left. + * @param x the horizontal coordinate of the LED + * @param y the vertical coordinate of the LED + */ + //% help=led/point weight=76 + //% blockId=device_point block="point|x %x|y %y" + //% parts="ledmatrix" + //% x.min=0 x.max=4 y.min=0 y.max=4 + //% x.fieldOptions.precision=1 y.fieldOptions.precision=1 shim=led::point + function point(x: int32, y: int32): boolean; + + /** + * Get the screen brightness from 0 (off) to 255 (full bright). + */ + //% help=led/brightness weight=60 + //% blockId=device_get_brightness block="brightness" blockGap=8 + //% parts="ledmatrix" + //% advanced=true shim=led::brightness + function brightness(): int32; + + /** + * Set the screen brightness from 0 (off) to 255 (full bright). + * @param value the brightness value, eg:255, 127, 0 + */ + //% help=led/set-brightness weight=59 + //% blockId=device_set_brightness block="set brightness %value" + //% parts="ledmatrix" + //% advanced=true + //% value.min=0 value.max=255 shim=led::setBrightness + function setBrightness(value: int32): void; + + /** + * Cancels the current animation and clears other pending animations. + */ + //% weight=50 help=led/stop-animation + //% blockId=device_stop_animation block="stop animation" + //% parts="ledmatrix" + //% advanced=true shim=led::stopAnimation + function stopAnimation(): void; + + /** + * Sets the display mode between black and white and greyscale for rendering LEDs. + * @param mode mode the display mode in which the screen operates + */ + //% weight=1 help=led/set-display-mode + //% parts="ledmatrix" advanced=true weight=1 + //% blockId="led_set_display_mode" block="set display mode $mode" shim=led::setDisplayMode + function setDisplayMode(mode: DisplayMode): void; + + /** + * Gets the current display mode + */ + //% weight=1 parts="ledmatrix" advanced=true shim=led::displayMode + function displayMode(): DisplayMode; + + /** + * Turns on or off the display + */ + //% help=led/enable blockId=device_led_enable block="led enable %on" + //% advanced=true parts="ledmatrix" shim=led::enable + function enable(on: boolean): void; + + /** + * Takes a screenshot of the LED screen and returns an image. + */ + //% help=led/screenshot + //% parts="ledmatrix" shim=led::screenshot + function screenshot(): Image; +} +declare namespace pins { + + /** + * Read the specified pin or connector as either 0 or 1 + * @param name pin to read from, eg: DigitalPin.P0 + */ + //% help=pins/digital-read-pin weight=30 + //% blockId=device_get_digital_pin block="digital read|pin %name" blockGap=8 + //% name.fieldEditor="gridpicker" name.fieldOptions.columns=4 + //% name.fieldOptions.tooltips="false" name.fieldOptions.width="250" shim=pins::digitalReadPin + function digitalReadPin(name: DigitalPin): int32; + + /** + * Set a pin or connector value to either 0 or 1. + * @param name pin to write to, eg: DigitalPin.P0 + * @param value value to set on the pin, 1 eg,0 + */ + //% help=pins/digital-write-pin weight=29 + //% blockId=device_set_digital_pin block="digital write|pin %name|to %value" + //% value.min=0 value.max=1 + //% name.fieldEditor="gridpicker" name.fieldOptions.columns=4 + //% name.fieldOptions.tooltips="false" name.fieldOptions.width="250" shim=pins::digitalWritePin + function digitalWritePin(name: DigitalPin, value: int32): void; + + /** + * Read the connector value as analog, that is, as a value comprised between 0 and 1023. + * @param name pin to write to, eg: AnalogPin.P0 + */ + //% help=pins/analog-read-pin weight=25 + //% blockId=device_get_analog_pin block="analog read|pin %name" blockGap="8" + //% name.fieldEditor="gridpicker" name.fieldOptions.columns=4 + //% name.fieldOptions.tooltips="false" name.fieldOptions.width="250" shim=pins::analogReadPin + function analogReadPin(name: AnalogPin): int32; + + /** + * Set the connector value as analog. Value must be comprised between 0 and 1023. + * @param name pin name to write to, eg: AnalogPin.P0 + * @param value value to write to the pin between ``0`` and ``1023``. eg:1023,0 + */ + //% help=pins/analog-write-pin weight=24 + //% blockId=device_set_analog_pin block="analog write|pin %name|to %value" blockGap=8 + //% value.min=0 value.max=1023 + //% name.fieldEditor="gridpicker" name.fieldOptions.columns=4 + //% name.fieldOptions.tooltips="false" name.fieldOptions.width="250" shim=pins::analogWritePin + function analogWritePin(name: AnalogPin, value: int32): void; + + /** + * Configure the pulse-width modulation (PWM) period of the analog output in microseconds. + * If this pin is not configured as an analog output (using `analog write pin`), the operation has no effect. + * @param name analog pin to set period to, eg: AnalogPin.P0 + * @param micros period in micro seconds. eg:20000 + */ + //% help=pins/analog-set-period weight=23 blockGap=8 + //% blockId=device_set_analog_period block="analog set period|pin %pin|to (µs)%micros" + //% pin.fieldEditor="gridpicker" pin.fieldOptions.columns=4 + //% pin.fieldOptions.tooltips="false" shim=pins::analogSetPeriod + function analogSetPeriod(name: AnalogPin, micros: int32): void; + + /** + * Configure the pin as a digital input and generate an event when the pin is pulsed either high or low. + * @param name digital pin to register to, eg: DigitalPin.P0 + * @param pulse the value of the pulse, eg: PulseValue.High + */ + //% help=pins/on-pulsed weight=22 blockGap=16 advanced=true + //% blockId=pins_on_pulsed block="on|pin %pin|pulsed %pulse" + //% pin.fieldEditor="gridpicker" pin.fieldOptions.columns=4 + //% pin.fieldOptions.tooltips="false" pin.fieldOptions.width="250" shim=pins::onPulsed + function onPulsed(name: DigitalPin, pulse: PulseValue, body: () => void): void; + + /** + * Get the duration of the last pulse in microseconds. This function should be called from a ``onPulsed`` handler. + */ + //% help=pins/pulse-duration advanced=true + //% blockId=pins_pulse_duration block="pulse duration (µs)" + //% weight=21 blockGap=8 shim=pins::pulseDuration + function pulseDuration(): int32; + + /** + * Return the duration of a pulse at a pin in microseconds. + * @param name the pin which measures the pulse, eg: DigitalPin.P0 + * @param value the value of the pulse, eg: PulseValue.High + * @param maximum duration in microseconds + */ + //% blockId="pins_pulse_in" block="pulse in (µs)|pin %name|pulsed %value" + //% weight=20 advanced=true + //% help=pins/pulse-in + //% name.fieldEditor="gridpicker" name.fieldOptions.columns=4 + //% name.fieldOptions.tooltips="false" name.fieldOptions.width="250" maxDuration.defl=2000000 shim=pins::pulseIn + function pulseIn(name: DigitalPin, value: PulseValue, maxDuration?: int32): int32; + + /** + * Write a value to the servo, controlling the shaft accordingly. On a standard servo, this will set the angle of the shaft (in degrees), moving the shaft to that orientation. On a continuous rotation servo, this will set the speed of the servo (with ``0`` being full-speed in one direction, ``180`` being full speed in the other, and a value near ``90`` being no movement). + * @param name pin to write to, eg: AnalogPin.P0 + * @param value angle or rotation speed, eg:180,90,0 + */ + //% help=pins/servo-write-pin weight=20 + //% blockId=device_set_servo_pin block="servo write|pin %name|to %value" blockGap=8 + //% parts=microservo trackArgs=0 + //% value.min=0 value.max=180 + //% name.fieldEditor="gridpicker" name.fieldOptions.columns=4 + //% name.fieldOptions.tooltips="false" name.fieldOptions.width="250" shim=pins::servoWritePin + function servoWritePin(name: AnalogPin, value: int32): void; + + /** + * Configure the IO pin as an analog/pwm output and set a pulse width. The period is 20 ms period and the pulse width is set based on the value given in **microseconds** or `1/1000` milliseconds. + * @param name pin name + * @param micros pulse duration in micro seconds, eg:1500 + */ + //% help=pins/servo-set-pulse weight=19 + //% blockId=device_set_servo_pulse block="servo set pulse|pin %value|to (µs) %micros" + //% value.fieldEditor="gridpicker" value.fieldOptions.columns=4 + //% value.fieldOptions.tooltips="false" value.fieldOptions.width="250" shim=pins::servoSetPulse + function servoSetPulse(name: AnalogPin, micros: int32): void; + + /** + * Set the pin used when using analog pitch or music. + * @param name pin to modulate pitch from + */ + //% blockId=device_analog_set_pitch_pin block="analog set pitch pin %name" + //% help=pins/analog-set-pitch-pin weight=3 advanced=true + //% name.fieldEditor="gridpicker" name.fieldOptions.columns=4 + //% name.fieldOptions.tooltips="false" name.fieldOptions.width="250" shim=pins::analogSetPitchPin + function analogSetPitchPin(name: AnalogPin): void; + + /** + * Emit a plse-width modulation (PWM) signal to the current pitch pin. Use `analog set pitch pin` to define the pitch pin. + * @param frequency frequency to modulate in Hz. + * @param ms duration of the pitch in milli seconds. + */ + //% blockId=device_analog_pitch block="analog pitch %frequency|for (ms) %ms" + //% help=pins/analog-pitch weight=4 async advanced=true blockGap=8 shim=pins::analogPitch + function analogPitch(frequency: int32, ms: int32): void; + + /** + * Configure the pull directiion of of a pin. + * @param name pin to set the pull mode on, eg: DigitalPin.P0 + * @param pull one of the mbed pull configurations, eg: PinPullMode.PullUp + */ + //% help=pins/set-pull weight=3 advanced=true + //% blockId=device_set_pull block="set pull|pin %pin|to %pull" + //% pin.fieldEditor="gridpicker" pin.fieldOptions.columns=4 + //% pin.fieldOptions.tooltips="false" pin.fieldOptions.width="250" shim=pins::setPull + function setPull(name: DigitalPin, pull: PinPullMode): void; + + /** + * Configure the events emitted by this pin. Events can be subscribed to + * using ``control.onEvent()``. + * @param name pin to set the event mode on, eg: DigitalPin.P0 + * @param type the type of events for this pin to emit, eg: PinEventType.Edge + */ + //% help=pins/set-events weight=4 advanced=true + //% blockId=device_set_pin_events block="set pin %pin|to emit %type|events" + //% pin.fieldEditor="gridpicker" pin.fieldOptions.columns=4 + //% pin.fieldOptions.tooltips="false" pin.fieldOptions.width="250" shim=pins::setEvents + function setEvents(name: DigitalPin, type: PinEventType): void; + + /** + * Create a new zero-initialized buffer. + * @param size number of bytes in the buffer + */ + //% shim=pins::createBuffer + function createBuffer(size: int32): Buffer; + + /** + * Read `size` bytes from a 7-bit I2C `address`. + */ + //% repeat.defl=0 shim=pins::i2cReadBuffer + function i2cReadBuffer(address: int32, size: int32, repeat?: boolean): Buffer; + + /** + * Write bytes to a 7-bit I2C `address`. + */ + //% repeat.defl=0 shim=pins::i2cWriteBuffer + function i2cWriteBuffer(address: int32, buf: Buffer, repeat?: boolean): int32; + + /** + * Write to the SPI slave and return the response + * @param value Data to be sent to the SPI slave + */ + //% help=pins/spi-write weight=5 advanced=true + //% blockId=spi_write block="spi write %value" shim=pins::spiWrite + function spiWrite(value: int32): int32; + + /** + * Set the SPI frequency + * @param frequency the clock frequency, eg: 1000000 + */ + //% help=pins/spi-frequency weight=4 advanced=true + //% blockId=spi_frequency block="spi frequency %frequency" shim=pins::spiFrequency + function spiFrequency(frequency: int32): void; + + /** + * Set the SPI bits and mode + * @param bits the number of bits, eg: 8 + * @param mode the mode, eg: 3 + */ + //% help=pins/spi-format weight=3 advanced=true + //% blockId=spi_format block="spi format|bits %bits|mode %mode" shim=pins::spiFormat + function spiFormat(bits: int32, mode: int32): void; + + /** + * Set the MOSI, MISO, SCK pins used by the SPI connection + * + */ + //% help=pins/spi-pins weight=2 advanced=true + //% blockId=spi_pins block="spi set pins|MOSI %mosi|MISO %miso|SCK %sck" + //% mosi.fieldEditor="gridpicker" mosi.fieldOptions.columns=4 + //% mosi.fieldOptions.tooltips="false" mosi.fieldOptions.width="250" + //% miso.fieldEditor="gridpicker" miso.fieldOptions.columns=4 + //% miso.fieldOptions.tooltips="false" miso.fieldOptions.width="250" + //% sck.fieldEditor="gridpicker" sck.fieldOptions.columns=4 + //% sck.fieldOptions.tooltips="false" sck.fieldOptions.width="250" shim=pins::spiPins + function spiPins(mosi: DigitalPin, miso: DigitalPin, sck: DigitalPin): void; +} + + + + //% weight=2 color=#002050 icon="\uf287" + //% advanced=true +declare namespace serial { + + /** + * Read a line of text from the serial port and return the buffer when the delimiter is met. + * @param delimiter text delimiter that separates each text chunk + */ + //% help=serial/read-until + //% blockId=serial_read_until block="serial|read until %delimiter=serial_delimiter_conv" + //% weight=19 shim=serial::readUntil + function readUntil(delimiter: string): string; + + /** + * Read the buffered received data as a string + */ + //% help=serial/read-string + //% blockId=serial_read_buffer block="serial|read string" + //% weight=18 shim=serial::readString + function readString(): string; + + /** + * Register an event to be fired when one of the delimiter is matched. + * @param delimiters the characters to match received characters against. + */ + //% help=serial/on-data-received + //% weight=18 blockId=serial_on_data_received block="serial|on data received %delimiters=serial_delimiter_conv" shim=serial::onDataReceived + function onDataReceived(delimiters: string, body: () => void): void; + + /** + * Send a piece of text through the serial connection. + */ + //% help=serial/write-string + //% weight=87 blockGap=8 + //% blockId=serial_writestring block="serial|write string %text" + //% text.shadowOptions.toString=true shim=serial::writeString + function writeString(text: string): void; + + /** + * Send a buffer through serial connection + */ + //% blockId=serial_writebuffer block="serial|write buffer %buffer=serial_readbuffer" + //% help=serial/write-buffer advanced=true weight=6 shim=serial::writeBuffer + function writeBuffer(buffer: Buffer): void; + + /** + * Read multiple characters from the receive buffer. Pause until enough characters are present. + * @param length default buffer length, eg: 64 + */ + //% blockId=serial_readbuffer block="serial|read buffer %length" + //% help=serial/read-buffer advanced=true weight=5 shim=serial::readBuffer + function readBuffer(length: int32): Buffer; + + /** + * Set the serial input and output to use pins instead of the USB connection. + * @param tx the new transmission pin, eg: SerialPin.P0 + * @param rx the new reception pin, eg: SerialPin.P1 + * @param rate the new baud rate. eg: 115200 + */ + //% weight=10 + //% help=serial/redirect + //% blockId=serial_redirect block="serial|redirect to|TX %tx|RX %rx|at baud rate %rate" + //% blockExternalInputs=1 + //% tx.fieldEditor="gridpicker" tx.fieldOptions.columns=3 + //% tx.fieldOptions.tooltips="false" + //% rx.fieldEditor="gridpicker" rx.fieldOptions.columns=3 + //% rx.fieldOptions.tooltips="false" + //% blockGap=8 shim=serial::redirect + function redirect(tx: SerialPin, rx: SerialPin, rate: BaudRate): void; + + /** + * Direct the serial input and output to use the USB connection. + */ + //% weight=9 help=serial/redirect-to-usb + //% blockId=serial_redirect_to_usb block="serial|redirect to USB" shim=serial::redirectToUSB + function redirectToUSB(): void; + + /** + * Sets the size of the RX buffer in bytes + * @param size length of the rx buffer in bytes, eg: 32 + */ + //% help=serial/set-rx-buffer-size + //% blockId=serialSetRxBufferSize block="serial set rx buffer size to $size" + //% advanced=true shim=serial::setRxBufferSize + function setRxBufferSize(size: uint8): void; + + /** + * Sets the size of the TX buffer in bytes + * @param size length of the tx buffer in bytes, eg: 32 + */ + //% help=serial/set-tx-buffer-size + //% blockId=serialSetTxBufferSize block="serial set tx buffer size to $size" + //% advanced=true shim=serial::setTxBufferSize + function setTxBufferSize(size: uint8): void; +} + + + + //% indexerGet=BufferMethods::getByte indexerSet=BufferMethods::setByte +declare interface Buffer { + /** + * Reads an unsigned byte at a particular location + */ + //% shim=BufferMethods::getUint8 + getUint8(off: int32): int32; + + /** + * Writes an unsigned byte at a particular location + */ + //% shim=BufferMethods::setUint8 + setUint8(off: int32, v: int32): void; + + /** + * Write a number in specified format in the buffer. + */ + //% shim=BufferMethods::setNumber + setNumber(format: NumberFormat, offset: int32, value: number): void; + + /** + * Read a number in specified format from the buffer. + */ + //% shim=BufferMethods::getNumber + getNumber(format: NumberFormat, offset: int32): number; + + /** Returns the length of a Buffer object. */ + //% property shim=BufferMethods::length + length: int32; + + /** + * Fill (a fragment) of the buffer with given value. + */ + //% offset.defl=0 length.defl=-1 shim=BufferMethods::fill + fill(value: int32, offset?: int32, length?: int32): void; + + /** + * Return a copy of a fragment of a buffer. + */ + //% offset.defl=0 length.defl=-1 shim=BufferMethods::slice + slice(offset?: int32, length?: int32): Buffer; + + /** + * Shift buffer left in place, with zero padding. + * @param offset number of bytes to shift; use negative value to shift right + * @param start start offset in buffer. Default is 0. + * @param length number of elements in buffer. If negative, length is set as the buffer length minus + * start. eg: -1 + */ + //% start.defl=0 length.defl=-1 shim=BufferMethods::shift + shift(offset: int32, start?: int32, length?: int32): void; + + /** + * Convert a buffer to string assuming UTF8 encoding + */ + //% shim=BufferMethods::toString + toString(): string; + + /** + * Convert a buffer to its hexadecimal representation. + */ + //% shim=BufferMethods::toHex + toHex(): string; + + /** + * Rotate buffer left in place. + * @param offset number of bytes to shift; use negative value to shift right + * @param start start offset in buffer. Default is 0. + * @param length number of elements in buffer. If negative, length is set as the buffer length minus + * start. eg: -1 + */ + //% start.defl=0 length.defl=-1 shim=BufferMethods::rotate + rotate(offset: int32, start?: int32, length?: int32): void; + + /** + * Write contents of `src` at `dstOffset` in current buffer. + */ + //% shim=BufferMethods::write + write(dstOffset: int32, src: Buffer): void; +} +declare namespace control { + + /** + * Create a new zero-initialized buffer. + * @param size number of bytes in the buffer + */ + //% shim=control::createBuffer + function createBuffer(size: int32): Buffer; + + /** + * Create a new buffer with UTF8-encoded string + * @param str the string to put in the buffer + */ + //% shim=control::createBufferFromUTF8 + function createBufferFromUTF8(str: string): Buffer; +} + +// Auto-generated. Do not edit. Really. diff --git a/pxt_modules/core/templates.ts b/pxt_modules/core/templates.ts new file mode 100644 index 0000000..9c5189b --- /dev/null +++ b/pxt_modules/core/templates.ts @@ -0,0 +1,5 @@ +/** + * Tagged hex literal converter + */ +//% shim=@hex +function hex(lits: any, ...args: any[]): Buffer { return null } diff --git a/pxt_modules/core/test.ts b/pxt_modules/core/test.ts new file mode 100644 index 0000000..a17ac26 --- /dev/null +++ b/pxt_modules/core/test.ts @@ -0,0 +1,8 @@ +let i = 1 +let f = 0.5 +let plus = i + f +let minus = i - f + +let r = Math.random() +let ri = Math.randomRange(5, 10) + diff --git a/pxt_modules/core/trig.cpp b/pxt_modules/core/trig.cpp new file mode 100644 index 0000000..7c95e2f --- /dev/null +++ b/pxt_modules/core/trig.cpp @@ -0,0 +1,37 @@ +#include "pxtbase.h" +#include +#include + +using namespace std; + +namespace Math_ { + +#define SINGLE(op) return fromDouble(::op(toDouble(x))); + +//% +TNumber atan2(TNumber y, TNumber x) { + return fromDouble(::atan2(toDouble(y), toDouble(x))); +} + +//% +TNumber tan(TNumber x){SINGLE(tan)} + +//% +TNumber sin(TNumber x){SINGLE(sin)} + +//% +TNumber cos(TNumber x){SINGLE(cos)} + +//% +TNumber atan(TNumber x){SINGLE(atan)} + +//% +TNumber asin(TNumber x){SINGLE(asin)} + +//% +TNumber acos(TNumber x){SINGLE(acos)} + +//% +TNumber sqrt(TNumber x){SINGLE(sqrt)} + +} \ No newline at end of file diff --git a/pxt_modules/radio/README.md b/pxt_modules/radio/README.md new file mode 100644 index 0000000..1ffdf2b --- /dev/null +++ b/pxt_modules/radio/README.md @@ -0,0 +1,4 @@ +# radio + +The radio library. + diff --git a/pxt_modules/radio/deprecated.ts b/pxt_modules/radio/deprecated.ts new file mode 100644 index 0000000..3677a65 --- /dev/null +++ b/pxt_modules/radio/deprecated.ts @@ -0,0 +1,188 @@ +namespace radio { + export class Packet { + /** + * The number payload if a number was sent in this packet (via ``sendNumber()`` or ``sendValue()``) + * or 0 if this packet did not contain a number. + */ + public receivedNumber: number; + /** + * The string payload if a string was sent in this packet (via ``sendString()`` or ``sendValue()``) + * or the empty string if this packet did not contain a string. + */ + public receivedString: string; + /** + * The buffer payload if a buffer was sent in this packet + * or the empty buffer + */ + public receivedBuffer: Buffer; + /** + * The system time of the sender of the packet at the time the packet was sent. + */ + public time: number; + /** + * The serial number of the sender of the packet or 0 if the sender did not sent their serial number. + */ + public serial: number; + /** + * The received signal strength indicator (RSSI) of the packet. + */ + public signal: number; + } + + /** + * Deprecated. Use onDataReceived() instead + * Registers code to run when the radio receives a packet. Also takes the + * received packet from the radio queue. + */ + //% help=radio/on-data-packet-received blockHandlerKey="radioreceived" deprecated=true + //% mutate=objectdestructuring + //% mutateText=Packet + //% mutateDefaults="receivedNumber;receivedString:name,receivedNumber:value;receivedString" + //% blockId=radio_on_packet block="on radio received" blockGap=8 + export function onDataPacketReceived(cb: (packet: Packet) => void) { + onDataReceived(() => { + receiveNumber(); + const packet = new Packet(); + packet.receivedNumber = receivedNumber(); + packet.time = receivedTime(); + packet.serial = receivedSerial(); + packet.receivedString = receivedString(); + packet.receivedBuffer = receivedBuffer(); + packet.signal = receivedSignalStrength(); + cb(packet) + }); + } + + /** + * Registers code to run when the radio receives a number. Deprecated, use + * onReceivedNumber instead. + */ + //% help=radio/on-received-number blockHandlerKey="radioreceived" + //% blockId=radio_on_number block="on radio received" blockGap=16 + //% useLoc="radio.onDataPacketReceived" deprecated=1 + export function onReceivedNumberDeprecated(cb: (receivedNumber: number) => void) { + onReceivedNumber(cb); + } + + /** + * Registers code to run when the radio receives a key value pair. Deprecated, use + * onReceivedValue instead. + */ + //% help=radio/on-received-value blockHandlerKey="radioreceived" + //% blockId=radio_on_value block="on radio received" blockGap=16 + //% useLoc="radio.onDataPacketReceived" deprecated=1 + export function onReceivedValueDeprecated(cb: (name: string, value: number) => void) { + onReceivedValue(cb); + } + + /** + * Registers code to run when the radio receives a string. Deprecated, use + * onReceivedString instead. + */ + //% help=radio/on-received-string blockHandlerKey="radioreceived" + //% blockId=radio_on_string block="on radio received" blockGap=16 + //% useLoc="radio.onDataPacketReceived" deprecated=1 + export function onReceivedStringDeprecated(cb: (receivedString: string) => void) { + onReceivedString(cb); + } + + /** + * Registers code to run when the radio receives a buffer. Deprecated, use + * onReceivedBuffer instead. + */ + //% help=radio/on-received-buffer blockHandlerKey="radioreceived" blockHidden=1 + //% blockId=radio_on_buffer block="on radio received" blockGap=16 + //% useLoc="radio.onDataPacketReceived" deprecated=1 + export function onReceivedBufferDeprecated(cb: (receivedBuffer: Buffer) => void) { + onReceivedBuffer(cb); + } + + /** + * Reads the next packet from the radio queue and and writes it to serial + * as JSON. + */ + //% help=radio/write-value-to-serial + //% weight=3 + //% blockId=radio_write_value_serial block="radio write value to serial" + //% deprecated=true + export function writeValueToSerial() { + const p = RadioPacket.getPacket(radio.readRawPacket()); + writeToSerial(p); + } + + /** + * Returns the number payload from the last packet taken from the radio queue + * (via ``receiveNumber``, ``receiveString``, etc) or 0 if that packet did not + * contain a number. + */ + //% help=radio/received-number deprecated=1 + export function receivedNumber(): number { + return (lastPacket ? lastPacket.numberPayload : 0) || 0; + } + + /** + * Returns the serial number of the sender micro:bit from the last packet taken + * from the radio queue (via ``receiveNumber``, ``receiveString``, etc) or 0 if + * that packet did not send a serial number. + */ + //% help=radio/received-serial deprecated=1 + export function receivedSerial(): number { + return lastPacket ? lastPacket.serial : 0; + } + + /** + * Returns the string payload from the last packet taken from the radio queue + * (via ``receiveNumber``, ``receiveString``, etc) or the empty string if that + * packet did not contain a string. + */ + //% help=radio/received-string deprecated=1 + export function receivedString(): string { + return (lastPacket ? lastPacket.stringPayload : "") || ""; + } + + /** + * Returns the buffer payload from the last packet taken from the radio queue + * (via ``receiveNumber``, ``receiveString``, etc) or the empty string if that + * packet did not contain a string. + */ + //% help=radio/received-buffer deprecated=1 + export function receivedBuffer(): Buffer { + return (lastPacket ? lastPacket.bufferPayload : null) || control.createBuffer(0); + } + + /** + * Returns the system time of the sender micro:bit at the moment when it sent the + * last packet taken from the radio queue (via ``receiveNumber``, + * ``receiveString``, etc). + */ + //% help=radio/received-time deprecated=1 + export function receivedTime(): number { + return lastPacket ? lastPacket.time : 0; + } + + /** + * Reads the next packet from the radio queue and returns the packet's number + * payload or 0 if the packet did not contain a number. + */ + //% help=radio/receive-number + //% weight=46 + //% blockId=radio_datagram_receive block="radio receive number" blockGap=8 + //% deprecated=true + export function receiveNumber(): number { + lastPacket = RadioPacket.getPacket(readRawPacket()); + return receivedNumber(); + } + + /** + * Reads the next packet from the radio queue and returns the packet's string + * payload or the empty string if the packet did not contain a string. + */ + //% blockId=radio_datagram_receive_string block="radio receive string" blockGap=8 + //% weight=44 + //% help=radio/receive-string + //% deprecated=true + export function receiveString(): string { + lastPacket = RadioPacket.getPacket(readRawPacket()); + return receivedString(); + } +} \ No newline at end of file diff --git a/pxt_modules/radio/enums.d.ts b/pxt_modules/radio/enums.d.ts new file mode 100644 index 0000000..9bdc205 --- /dev/null +++ b/pxt_modules/radio/enums.d.ts @@ -0,0 +1,5 @@ +// Auto-generated. Do not edit. +declare namespace radio { +} + +// Auto-generated. Do not edit. Really. diff --git a/pxt_modules/radio/pxt.json b/pxt_modules/radio/pxt.json new file mode 100644 index 0000000..2afb243 --- /dev/null +++ b/pxt_modules/radio/pxt.json @@ -0,0 +1,30 @@ +{ + "name": "radio", + "description": "The radio services", + "files": [ + "README.md", + "shims.d.ts", + "enums.d.ts", + "radio.cpp", + "radio.ts", + "deprecated.ts" + ], + "icon": "./static/packages/radio/icon.png", + "public": true, + "dependencies": { + "core": "*" + }, + "yotta": { + "config": { + "microbit-dal": { + "bluetooth": { + "enabled": 0 + } + } + } + }, + "targetVersions": { + "target": "1.4.18" + }, + "installedVersion": "embed:radio" +} \ No newline at end of file diff --git a/pxt_modules/radio/radio.cpp b/pxt_modules/radio/radio.cpp new file mode 100644 index 0000000..c869a74 --- /dev/null +++ b/pxt_modules/radio/radio.cpp @@ -0,0 +1,110 @@ +#include "pxt.h" + +using namespace pxt; + +//% color=#E3008C weight=96 icon="\uf012" +namespace radio { + + bool radioEnabled = false; + PacketBuffer packet; + + int radioEnable() { + int r = uBit.radio.enable(); + if (r != MICROBIT_OK) { + uBit.panic(43); + return r; + } + if (!radioEnabled) { + uBit.radio.setGroup(pxt::programHash()); + uBit.radio.setTransmitPower(6); // start with high power by default + radioEnabled = true; + } + return r; + } + + /** + * Sends an event over radio to neigboring devices + */ + //% blockId=radioRaiseEvent block="radio raise event|from source %src=control_event_source_id|with value %value=control_event_value_id" + //% blockExternalInputs=1 + //% advanced=true + //% weight=1 + //% help=radio/raise-event + void raiseEvent(int src, int value) { + if (radioEnable() != MICROBIT_OK) return; + uBit.radio.event.eventReceived(MicroBitEvent(src, value, CREATE_ONLY)); + } + + /** + * Takes the next packet from the radio queue and returns its contents in a Buffer + */ + //% help=radio/received-packet + Buffer readRawPacket() { + if (radioEnable() != MICROBIT_OK) return mkBuffer(NULL, 0); + packet = uBit.radio.datagram.recv(); + return mkBuffer(packet.getBytes(), packet.length()); + } + + /** + * Sends a raw packet through the radio + */ + //% advanced=true + void sendRawPacket(Buffer msg) { + if (radioEnable() != MICROBIT_OK || NULL == msg) return; + uBit.radio.datagram.send(msg->data, msg->length); + } + + /** + * Registers code to run when a packet is received over radio. + */ + //% help=radio/on-data-received + //% weight=50 + //% blockId=radio_datagram_received_event block="radio on data received" blockGap=8 + //% deprecated=true + void onDataReceived(Action body) { + if (radioEnable() != MICROBIT_OK) return; + registerWithDal(MICROBIT_ID_RADIO, MICROBIT_RADIO_EVT_DATAGRAM, body); + readRawPacket(); + } + + /** + * Gets the received signal strength indicator (RSSI) from the last packet taken + * from the radio queue (via ``receiveNumber``, ``receiveString``, etc). Not supported in simulator. + * namespace=radio + */ + //% help=radio/received-signal-strength + //% weight=40 + //% blockId=radio_datagram_rssi block="radio received signal strength" + //% deprecated=true + int receivedSignalStrength() { + if (radioEnable() != MICROBIT_OK || packet == NULL) return 0; + return packet.getRSSI(); + } + + /** + * Sets the group id for radio communications. A micro:bit can only listen to one group ID at any time. + * @param id the group id between ``0`` and ``255``, eg: 1 + */ + //% help=radio/set-group + //% weight=100 + //% blockId=radio_set_group block="radio set group %ID" + //% id.min=0 id.max=255 + void setGroup(int id) { + if (radioEnable() != MICROBIT_OK) return; + uBit.radio.setGroup(id); + } + + /** + * Change the output power level of the transmitter to the given value. + * @param power a value in the range 0..7, where 0 is the lowest power and 7 is the highest. eg: 7 + */ + //% help=radio/set-transmit-power + //% weight=9 blockGap=8 + //% blockId=radio_set_transmit_power block="radio set transmit power %power" + //% power.min=0 power.max=7 + //% advanced=true + void setTransmitPower(int power) { + if (radioEnable() != MICROBIT_OK) return; + uBit.radio.setTransmitPower(power); + } +} diff --git a/pxt_modules/radio/radio.ts b/pxt_modules/radio/radio.ts new file mode 100644 index 0000000..299b623 --- /dev/null +++ b/pxt_modules/radio/radio.ts @@ -0,0 +1,428 @@ + +enum RadioPacketProperty { + //% blockIdentity=radio._packetProperty + //% block="signal strength" + SignalStrength = 2, + //% blockIdentity=radio._packetProperty + //% block="time" + Time = 0, + //% block="serial number" + //% blockIdentity=radio._packetProperty + SerialNumber = 1 +} + +/** + * Communicate data using radio packets + */ +//% color=#E3008C weight=96 icon="\uf012" +namespace radio { + export const MAKECODE_RADIO_EVT_NUMBER = 10; + export const MAKECODE_RADIO_EVT_STRING = 11; + export const MAKECODE_RADIO_EVT_BUFFER = 12; + export const MAKECODE_RADIO_EVT_VALUE = 13; + + const MAX_FIELD_DOUBLE_NAME_LENGTH = 8; + const MAX_PAYLOAD_LENGTH = 20; + const PACKET_PREFIX_LENGTH = 9; + const VALUE_PACKET_NAME_LEN_OFFSET = 13; + const DOUBLE_VALUE_PACKET_NAME_LEN_OFFSET = 17; + + // Packet Spec: + // | 0 | 1 ... 4 | 5 ... 8 | 9 ... 28 + // ---------------------------------------------------------------- + // | packet type | system time | serial number | payload + // + // Serial number defaults to 0 unless enabled by user + + // payload: number (9 ... 12) + const PACKET_TYPE_NUMBER = 0; + // payload: number (9 ... 12), name length (13), name (14 ... 26) + const PACKET_TYPE_VALUE = 1; + // payload: string length (9), string (10 ... 28) + const PACKET_TYPE_STRING = 2; + // payload: buffer length (9), buffer (10 ... 28) + const PACKET_TYPE_BUFFER = 3; + // payload: number (9 ... 16) + const PACKET_TYPE_DOUBLE = 4; + // payload: number (9 ... 16), name length (17), name (18 ... 26) + const PACKET_TYPE_DOUBLE_VALUE = 5; + + let transmittingSerial: boolean; + let initialized = false; + + export let lastPacket: RadioPacket; + + function init() { + if (initialized) return; + initialized = true; + + onDataReceived(() => { + lastPacket = RadioPacket.getPacket(readRawPacket()); + lastPacket.signal = receivedSignalStrength(); + + switch (lastPacket.packetType) { + case PACKET_TYPE_NUMBER: + case PACKET_TYPE_DOUBLE: + control.raiseEvent(DAL.MICROBIT_ID_RADIO, MAKECODE_RADIO_EVT_NUMBER); + break; + case PACKET_TYPE_VALUE: + case PACKET_TYPE_DOUBLE_VALUE: + control.raiseEvent(DAL.MICROBIT_ID_RADIO, MAKECODE_RADIO_EVT_VALUE); + break; + case PACKET_TYPE_BUFFER: + control.raiseEvent(DAL.MICROBIT_ID_RADIO, MAKECODE_RADIO_EVT_BUFFER); + break; + case PACKET_TYPE_STRING: + control.raiseEvent(DAL.MICROBIT_ID_RADIO, MAKECODE_RADIO_EVT_STRING); + break; + } + }) + } + + /** + * Registers code to run when the radio receives a number. + */ + //% help=radio/on-received-number + //% blockId=radio_on_number_drag block="on radio received" blockGap=16 + //% useLoc="radio.onDataPacketReceived" draggableParameters=reporter + export function onReceivedNumber(cb: (receivedNumber: number) => void) { + init(); + control.onEvent(DAL.MICROBIT_ID_RADIO, MAKECODE_RADIO_EVT_NUMBER, () => { + cb(lastPacket.numberPayload); + }); + } + + /** + * Registers code to run when the radio receives a key value pair. + */ + //% help=radio/on-received-value + //% blockId=radio_on_value_drag block="on radio received" blockGap=16 + //% useLoc="radio.onDataPacketReceived" draggableParameters=reporter + export function onReceivedValue(cb: (name: string, value: number) => void) { + init(); + control.onEvent(DAL.MICROBIT_ID_RADIO, MAKECODE_RADIO_EVT_VALUE, () => { + cb(lastPacket.stringPayload, lastPacket.numberPayload); + }); + } + + /** + * Registers code to run when the radio receives a string. + */ + //% help=radio/on-received-string + //% blockId=radio_on_string_drag block="on radio received" blockGap=16 + //% useLoc="radio.onDataPacketReceived" draggableParameters=reporter + export function onReceivedString(cb: (receivedString: string) => void) { + init(); + control.onEvent(DAL.MICROBIT_ID_RADIO, MAKECODE_RADIO_EVT_STRING, () => { + cb(lastPacket.stringPayload); + }); + } + + /** + * Registers code to run when the radio receives a buffer. + */ + //% help=radio/on-received-buffer blockHidden=1 + //% blockId=radio_on_buffer_drag block="on radio received" blockGap=16 + //% useLoc="radio.onDataPacketReceived" draggableParameters=reporter + export function onReceivedBuffer(cb: (receivedBuffer: Buffer) => void) { + init(); + control.onEvent(DAL.MICROBIT_ID_RADIO, MAKECODE_RADIO_EVT_BUFFER, () => { + cb(lastPacket.bufferPayload); + }); + } + + /** + * Returns properties of the last radio packet received. + * @param type the type of property to retrieve from the last packet + */ + //% help=radio/received-packet + //% weight=11 blockGap=8 + //% blockId=radio_received_packet block="received packet %type=radio_packet_property" blockGap=16 + export function receivedPacket(type: number) { + if (lastPacket) { + switch(type) { + case RadioPacketProperty.Time: return lastPacket.time; + case RadioPacketProperty.SerialNumber: return lastPacket.serial; + case RadioPacketProperty.SignalStrength: return lastPacket.signal; + } + } + return 0; + } + + /** + * Gets a packet property. + * @param type the packet property type, eg: PacketProperty.time + */ + //% blockId=radio_packet_property block="%note" + //% shim=TD_ID blockHidden=1 + export function _packetProperty(type: RadioPacketProperty): number { + return type; + } + + export class RadioPacket { + public static getPacket(data: Buffer) { + return new RadioPacket(data); + } + + public static mkPacket(packetType: number) { + const res = new RadioPacket(); + res.data[0] = packetType; + return res; + } + + private constructor(public readonly data?: Buffer) { + if (!data) this.data = control.createBuffer(32); + } + + public signal: number; + + get packetType() { + return this.data[0]; + } + + get time() { + return this.data.getNumber(NumberFormat.Int32LE, 1); + } + + set time(val: number) { + this.data.setNumber(NumberFormat.Int32LE, 1, val); + } + + get serial() { + return this.data.getNumber(NumberFormat.Int32LE, 5); + } + + set serial(val: number) { + this.data.setNumber(NumberFormat.Int32LE, 5, val); + } + + get stringPayload() { + const offset = getStringOffset(this.packetType) as number; + return offset ? this.data.slice(offset + 1, this.data[offset]).toString() : undefined; + } + + set stringPayload(val: string) { + const offset = getStringOffset(this.packetType) as number; + if (offset) { + const buf = control.createBufferFromUTF8(truncateString(val, getMaxStringLength(this.packetType))); + this.data[offset] = buf.length; + this.data.write(offset + 1, buf); + } + } + + get numberPayload() { + switch (this.packetType) { + case PACKET_TYPE_NUMBER: + case PACKET_TYPE_VALUE: + return this.data.getNumber(NumberFormat.Int32LE, PACKET_PREFIX_LENGTH); + case PACKET_TYPE_DOUBLE: + case PACKET_TYPE_DOUBLE_VALUE: + return this.data.getNumber(NumberFormat.Float64LE, PACKET_PREFIX_LENGTH); + } + return undefined; + } + + set numberPayload(val: number) { + switch (this.packetType) { + case PACKET_TYPE_NUMBER: + case PACKET_TYPE_VALUE: + this.data.setNumber(NumberFormat.Int32LE, PACKET_PREFIX_LENGTH, val); + break; + case PACKET_TYPE_DOUBLE: + case PACKET_TYPE_DOUBLE_VALUE: + this.data.setNumber(NumberFormat.Float64LE, PACKET_PREFIX_LENGTH, val); + break; + } + } + + get bufferPayload() { + const len = this.data[PACKET_PREFIX_LENGTH]; + return this.data.slice(PACKET_PREFIX_LENGTH + 1, len); + } + + set bufferPayload(b: Buffer) { + const len = Math.min(b.length, MAX_PAYLOAD_LENGTH - 1); + this.data[PACKET_PREFIX_LENGTH] = len; + this.data.write(PACKET_PREFIX_LENGTH + 1, b.slice(0, len)); + } + + hasString() { + return this.packetType === PACKET_TYPE_STRING || + this.packetType === PACKET_TYPE_VALUE || + this.packetType === PACKET_TYPE_DOUBLE_VALUE; + } + + hasNumber() { + return this.packetType === PACKET_TYPE_NUMBER || + this.packetType === PACKET_TYPE_DOUBLE || + this.packetType === PACKET_TYPE_VALUE || + this.packetType === PACKET_TYPE_DOUBLE_VALUE; + } + } + + + /** + * Broadcasts a number over radio to any connected micro:bit in the group. + */ + //% help=radio/send-number + //% weight=60 + //% blockId=radio_datagram_send block="radio send number %value" blockGap=8 + export function sendNumber(value: number) { + let packet: RadioPacket; + + if (value === (value | 0)) { + packet = RadioPacket.mkPacket(PACKET_TYPE_NUMBER); + } + else { + packet = RadioPacket.mkPacket(PACKET_TYPE_DOUBLE); + } + + packet.numberPayload = value; + sendPacket(packet); + } + + /** + * Broadcasts a name / value pair along with the device serial number + * and running time to any connected micro:bit in the group. The name can + * include no more than 8 characters. + * @param name the field name (max 8 characters), eg: "name" + * @param value the numeric value + */ + //% help=radio/send-value + //% weight=59 + //% blockId=radio_datagram_send_value block="radio send|value %name|= %value" blockGap=8 + export function sendValue(name: string, value: number) { + let packet: RadioPacket; + + if (value === (value | 0)) { + packet = RadioPacket.mkPacket(PACKET_TYPE_VALUE); + } + else { + packet = RadioPacket.mkPacket(PACKET_TYPE_DOUBLE_VALUE); + } + + packet.numberPayload = value; + packet.stringPayload = name; + sendPacket(packet); + } + + /** + * Broadcasts a string along with the device serial number + * and running time to any connected micro:bit in the group. + */ + //% help=radio/send-string + //% weight=58 + //% blockId=radio_datagram_send_string block="radio send string %msg" + //% msg.shadowOptions.toString=true + export function sendString(value: string) { + const packet = RadioPacket.mkPacket(PACKET_TYPE_STRING); + packet.stringPayload = value; + sendPacket(packet); + } + + /** + * Broadcasts a buffer (up to 19 bytes long) along with the device serial number + * and running time to any connected micro:bit in the group. + */ + //% help=radio/send-buffer + //% weight=57 + //% advanced=true + export function sendBuffer(msg: Buffer) { + const packet = RadioPacket.mkPacket(PACKET_TYPE_BUFFER); + packet.bufferPayload = msg; + sendPacket(packet); + } + + /** + * Writes the last received packet to serial as JSON. This should be called + * within an ``onDataPacketReceived`` callback. + */ + //% help=radio/write-received-packet-to-serial + //% weight=3 + //% blockId=radio_write_packet_serial block="radio write received packet to serial" + //% advanced=true + export function writeReceivedPacketToSerial() { + if (lastPacket) writeToSerial(lastPacket) + } + + /** + * Set the radio to transmit the serial number in each message. + * @param transmit value indicating if the serial number is transmitted, eg: true + */ + //% help=radio/set-transmit-serial-number + //% weight=8 blockGap=8 + //% blockId=radio_set_transmit_serial_number block="radio set transmit serial number %transmit" + //% advanced=true + export function setTransmitSerialNumber(transmit: boolean) { + transmittingSerial = transmit; + } + + export function writeToSerial(packet: RadioPacket) { + serial.writeString("{"); + serial.writeString("\"t\":"); + serial.writeString("" + packet.time); + serial.writeString(",\"s\":"); + serial.writeString("" + packet.serial); + + if (packet.hasString()) { + serial.writeString(",\"n\":\""); + serial.writeString(packet.stringPayload); + serial.writeString("\""); + } + if (packet.packetType == PACKET_TYPE_BUFFER) { + serial.writeString(",\"b\":\""); + // TODO: proper base64 encoding + serial.writeString(packet.bufferPayload.toString()); + serial.writeString("\""); + } + if (packet.hasNumber()) { + serial.writeString(",\"v\":"); + serial.writeString("" + packet.numberPayload); + } + + serial.writeString("}\r\n"); + } + + function sendPacket(packet: RadioPacket) { + packet.time = input.runningTime(); + packet.serial = transmittingSerial ? control.deviceSerialNumber() : 0; + radio.sendRawPacket(packet.data); + } + + function truncateString(str: string, bytes: number) { + str = str.substr(0, bytes); + let buff = control.createBufferFromUTF8(str); + + while (buff.length > bytes) { + str = str.substr(0, str.length - 1); + buff = control.createBufferFromUTF8(str); + } + + return str; + } + + function getStringOffset(packetType: number) { + switch (packetType) { + case PACKET_TYPE_STRING: + return PACKET_PREFIX_LENGTH; + case PACKET_TYPE_VALUE: + return VALUE_PACKET_NAME_LEN_OFFSET; + case PACKET_TYPE_DOUBLE_VALUE: + return DOUBLE_VALUE_PACKET_NAME_LEN_OFFSET; + default: + return undefined; + } + } + + function getMaxStringLength(packetType: number) { + switch (packetType) { + case PACKET_TYPE_STRING: + return MAX_PAYLOAD_LENGTH - 2; + case PACKET_TYPE_VALUE: + case PACKET_TYPE_DOUBLE_VALUE: + return MAX_FIELD_DOUBLE_NAME_LENGTH; + default: + return undefined; + } + } +} \ No newline at end of file diff --git a/pxt_modules/radio/shims.d.ts b/pxt_modules/radio/shims.d.ts new file mode 100644 index 0000000..e30534a --- /dev/null +++ b/pxt_modules/radio/shims.d.ts @@ -0,0 +1,72 @@ +// Auto-generated. Do not edit. + + + + //% color=#E3008C weight=96 icon="\uf012" +declare namespace radio { + + /** + * Sends an event over radio to neigboring devices + */ + //% blockId=radioRaiseEvent block="radio raise event|from source %src=control_event_source_id|with value %value=control_event_value_id" + //% blockExternalInputs=1 + //% advanced=true + //% weight=1 + //% help=radio/raise-event shim=radio::raiseEvent + function raiseEvent(src: int32, value: int32): void; + + /** + * Takes the next packet from the radio queue and returns its contents in a Buffer + */ + //% help=radio/received-packet shim=radio::readRawPacket + function readRawPacket(): Buffer; + + /** + * Sends a raw packet through the radio + */ + //% advanced=true shim=radio::sendRawPacket + function sendRawPacket(msg: Buffer): void; + + /** + * Registers code to run when a packet is received over radio. + */ + //% help=radio/on-data-received + //% weight=50 + //% blockId=radio_datagram_received_event block="radio on data received" blockGap=8 + //% deprecated=true shim=radio::onDataReceived + function onDataReceived(body: () => void): void; + + /** + * Gets the received signal strength indicator (RSSI) from the last packet taken + * from the radio queue (via ``receiveNumber``, ``receiveString``, etc). Not supported in simulator. + * namespace=radio + */ + //% help=radio/received-signal-strength + //% weight=40 + //% blockId=radio_datagram_rssi block="radio received signal strength" + //% deprecated=true shim=radio::receivedSignalStrength + function receivedSignalStrength(): int32; + + /** + * Sets the group id for radio communications. A micro:bit can only listen to one group ID at any time. + * @param id the group id between ``0`` and ``255``, eg: 1 + */ + //% help=radio/set-group + //% weight=100 + //% blockId=radio_set_group block="radio set group %ID" + //% id.min=0 id.max=255 shim=radio::setGroup + function setGroup(id: int32): void; + + /** + * Change the output power level of the transmitter to the given value. + * @param power a value in the range 0..7, where 0 is the lowest power and 7 is the highest. eg: 7 + */ + //% help=radio/set-transmit-power + //% weight=9 blockGap=8 + //% blockId=radio_set_transmit_power block="radio set transmit power %power" + //% power.min=0 power.max=7 + //% advanced=true shim=radio::setTransmitPower + function setTransmitPower(power: int32): void; +} + +// Auto-generated. Do not edit. Really. diff --git a/shims.d.ts b/shims.d.ts new file mode 100644 index 0000000..4277762 --- /dev/null +++ b/shims.d.ts @@ -0,0 +1,9 @@ +// Auto-generated. Do not edit. + + + + //% weight=20 color=#436EEE icon="\uf108" +declare namespace LCD1IN8 { +} + +// Auto-generated. Do not edit. Really. diff --git a/test.ts b/test.ts new file mode 100644 index 0000000..f2037d4 --- /dev/null +++ b/test.ts @@ -0,0 +1,35 @@ +// tests go here; this will not be compiled when this package is used as a library +LCD1IN8.LCD_Init() +//LCD1IN8.LCD_SetBL(10) +LCD1IN8.LCD_Filling(LCD_COLOR.RED) + +LCD1IN8.DrawCircle( + 80, + 60, + 20, + LCD1IN8.Get_Color(LCD_COLOR.BLUE), + DRAW_FILL.DRAW_EMPTY, + DOT_PIXEL.DOT_PIXEL_1 +) + +LCD1IN8.DrawCircle( + 20, + 35, + 8, + LCD1IN8.Get_Color(LCD_COLOR.GREEN), + DRAW_FILL.DRAW_FULL, + DOT_PIXEL.DOT_PIXEL_4 +) +//LCD1IN8.LCD_DisplayWindows(10, 30, 60, 60) +LCD1IN8.DisNumber( + 50, + 10, + 32105, + LCD1IN8.Get_Color(LCD_COLOR.MAGENTA) +) +LCD1IN8.DisString( + 0, + 85, + "Welcome to Mcufriend ", + LCD1IN8.Get_Color(LCD_COLOR.BLUE) + ) diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..a2079ff --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "target": "es5", + "noImplicitAny": true, + "outDir": "built", + "rootDir": "." + }, + "exclude": ["pxt_modules/**/*test.ts"] +}