From: zhaoyifeng Date: Tue, 7 Dec 2010 08:13:40 +0000 (+0800) Subject: add rknand X-Git-Tag: firefly_0821_release~10984 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=4d463a643aad8650c1d4e909f6cc86ac36ba5fc7;p=firefly-linux-kernel-4.4.55.git add rknand --- diff --git a/arch/arm/mach-rk29/board-rk29sdk.c b/arch/arm/mach-rk29/board-rk29sdk.c old mode 100644 new mode 100755 index 1727382932fd..262e10dd4c1d --- a/arch/arm/mach-rk29/board-rk29sdk.c +++ b/arch/arm/mach-rk29/board-rk29sdk.c @@ -906,6 +906,11 @@ static struct platform_device *devices[] __initdata = { #ifdef CONFIG_SDMMC1_RK29 &rk29_device_sdmmc1, #endif + +#ifdef CONFIG_MTD_NAND_RK29XX + &rk29xx_device_nand, +#endif + #ifdef CONFIG_MTD_NAND_RK29 &rk29_device_nand, #endif diff --git a/arch/arm/mach-rk29/devices.c b/arch/arm/mach-rk29/devices.c index 14ab98324334..6fe13e75d3a3 100644 --- a/arch/arm/mach-rk29/devices.c +++ b/arch/arm/mach-rk29/devices.c @@ -434,6 +434,29 @@ struct platform_device rk29_device_fb = { } }; #endif + +#if defined(CONFIG_MTD_NAND_RK29XX) +static struct resource rk29xxnand_resources[] = { + { + .start = RK29_NANDC_PHYS, + .end = RK29_NANDC_PHYS+RK29_NANDC_SIZE -1, + .flags = IORESOURCE_MEM, + } +}; + +struct platform_device rk29xx_device_nand = { + .name = "rk29xxnand", + .id = -1, + .resource = rk29xxnand_resources, + .num_resources= ARRAY_SIZE(rk29xxnand_resources), + .dev = { + .platform_data= &rk29_nand_data, + }, + +}; +#endif + + #if defined(CONFIG_MTD_NAND_RK29) static struct resource nand_resources[] = { { diff --git a/arch/arm/mach-rk29/devices.h b/arch/arm/mach-rk29/devices.h index 41e15afdeec2..6becc8ecb8fb 100755 --- a/arch/arm/mach-rk29/devices.h +++ b/arch/arm/mach-rk29/devices.h @@ -41,6 +41,7 @@ extern struct rk29xx_spi_platform_data rk29xx_spi0_platdata; extern struct rk29xx_spi_platform_data rk29xx_spi1_platdata; extern struct platform_device rk29_device_fb; extern struct platform_device rk29_device_nand; +extern struct platform_device rk29xx_device_nand; extern struct rk29_sdmmc_platform_data default_sdmmc0_data; extern struct rk29_sdmmc_platform_data default_sdmmc1_data; extern struct platform_device rk29_device_sdmmc0; diff --git a/drivers/mtd/Kconfig b/drivers/mtd/Kconfig index ecf90f5c97c2..8bc9f6f4b430 100644 --- a/drivers/mtd/Kconfig +++ b/drivers/mtd/Kconfig @@ -323,6 +323,8 @@ source "drivers/mtd/devices/Kconfig" source "drivers/mtd/nand/Kconfig" +source "drivers/mtd/rknand/Kconfig" + source "drivers/mtd/onenand/Kconfig" source "drivers/mtd/lpddr/Kconfig" diff --git a/drivers/mtd/Makefile b/drivers/mtd/Makefile index 82d1e4de475b..1414402b17e6 100644 --- a/drivers/mtd/Makefile +++ b/drivers/mtd/Makefile @@ -29,6 +29,6 @@ obj-$(CONFIG_MTD_OOPS) += mtdoops.o nftl-objs := nftlcore.o nftlmount.o inftl-objs := inftlcore.o inftlmount.o -obj-y += chips/ lpddr/ maps/ devices/ nand/ onenand/ tests/ +obj-y += chips/ lpddr/ maps/ devices/ nand/ onenand/ tests/ rknand/ obj-$(CONFIG_MTD_UBI) += ubi/ diff --git a/drivers/mtd/rknand/Kconfig b/drivers/mtd/rknand/Kconfig new file mode 100755 index 000000000000..b373b069911a --- /dev/null +++ b/drivers/mtd/rknand/Kconfig @@ -0,0 +1,41 @@ +# +# linux/drivers/mtd/rknand/Kconfig +# + +config MTD_RKNAND + tristate "RK NAND Device Support" + depends on MTD + select MTD_RK_NAND_IDS + help + RK NAND Device Support +if MTD_RKNAND + +config MTD_NAND_RK29XX + tristate "RK29 on-chip NAND Flash Controller driver with FTL" + depends on MTD_RKNAND + default y + help + This enables the RK28xx on-chip NAND flash controller and NFTL driver. + +config RKFTL_PAGECACHE_SIZE + int "config page remap mtd part size(MB),MAX is 128MB,this mtd part will mount in /data/data" + depends on MTD_RKNAND + default "64" + help + default size is 64MB,and "swap" size is (128 - 64)MB.if you config this size up to 128MB,then "swap" funtion will disable. + +config MTD_NAND_RK29XX_DEBUG + tristate "RK29 Nand driver debug enables" + depends on MTD_RKNAND + default n + help + +config MTD_NAND_RK29XX_DEBUG_VERBOSE + int "Debugging verbosity (0 = quiet, 3 = noisy)" + depends on MTD_NAND_RK29XX_DEBUG + default "0" + help + Determines the verbosity level of the MTD NAND debugging messages. + +endif # MTD_RKNAND + diff --git a/drivers/mtd/rknand/Makefile b/drivers/mtd/rknand/Makefile new file mode 100755 index 000000000000..26555f171403 --- /dev/null +++ b/drivers/mtd/rknand/Makefile @@ -0,0 +1,13 @@ +# +# linux/drivers/nand/Makefile +# +# $Id: Makefile,v 1.2.4.1 2010/07/14 02:28:12 Administrator Exp $ +# +obj-$(CONFIG_MTD_NAND_RK29XX) += flash.o +obj-$(CONFIG_MTD_NAND_RK29XX) += ftl.o +obj-$(CONFIG_MTD_NAND_RK29XX) += rknand_base.o +#obj-$(CONFIG_MTD_UBI) += ubi/ +$(obj)/flash.o: $(obj)/flash.uu + uudecode $(obj)/flash.uu -o $(obj)/flash.o +$(obj)/ftl.o: $(obj)/ftl.uu + uudecode $(obj)/ftl.uu -o $(obj)/ftl.o diff --git a/drivers/mtd/rknand/api_flash.h b/drivers/mtd/rknand/api_flash.h new file mode 100755 index 000000000000..a3994682867c --- /dev/null +++ b/drivers/mtd/rknand/api_flash.h @@ -0,0 +1,191 @@ +/******************************************************************************** +********************************************************************************* + COPYRIGHT (c) 2004 BY ROCK-CHIP FUZHOU + -- ALL RIGHTS RESERVED -- + +File Name: api_flash.h +Author: XUESHAN LIN +Created: 1st Dec 2008 +Modified: +Revision: 1.00 +Modify log: + 1.01 Ôö¼ÓFtlClose½Ó¿Úº¯Êý 2009.10.15 lxs +******************************************************************************** +********************************************************************************/ +#ifndef _API_FLASH_H +#define _API_FLASH_H + +//1º¯ÊýÔ­ÐÍÉùÃ÷ +/*************************************************************************** +º¯ÊýÃèÊö:FTLºÍFLASH³õʼ»¯ +Èë¿Ú²ÎÊý:ÎÞ +³ö¿Ú²ÎÊý: + 0=Õý³£·µ»Ø + 1=Ó³Éä±í³ö´í, ±»Ç¿ÖƵ͸ñ + 2=flash³õʼ»¯Ê§°Ü,¿ÉÄÜÊÇÓ²¼þ´íÎó»òÒª½øÐй̼þÉý¼¶ + ÆäËüÖµ:ÄÚ²¿´íÎó, ¸ÃÇý¶¯²»¿ÉʹÓà +˵ Ã÷:ÉϵçÖ»Ðèµ÷ÓÃÒ»´Î³õʼ»¯¼´¿É +***************************************************************************/ +extern int FtlInit(unsigned int nandcBaseAddr,unsigned char pageRemapEn); +extern int FTLInit(void); + + +/*************************************************************************** +º¯ÊýÃèÊö:»ñÈ¡FLASH´ÅÅÌÈÝÁ¿ +Èë¿Ú²ÎÊý: + DISK_NAND_CODE:¹Ì¼þÅÌ + DISK_NAND_DATA:ϵͳ²ÎÊýÅÌ + DISK_NAND_USER:Óû§ÅÌ +³ö¿Ú²ÎÊý:´ÅÅÌ×ÜÉÈÇøÊý +˵ Ã÷: +***************************************************************************/ +extern unsigned int FtlGetCapacity(unsigned char LUN); + +/*************************************************************************** +º¯ÊýÃèÊö:¶ÁÉÈÇø½Ó¿Ú +Èë¿Ú²ÎÊý:LUN=Âß¼­·ÖÇøºÅ, Index=ÆðʼÉÈÇøµØÖ·, buf=Êý¾Ý»º³åÇø, nSec=ÉÈÇøÊý +³ö¿Ú²ÎÊý:0=¶ÁÈ¡ÕýÈ·; ·Ç0=¶ÁÈ¡³ö´í, Êý¾Ý²»¿ÉÓà +µ÷Óú¯Êý: +˵ Ã÷: +***************************************************************************/ +extern int FtlRead(unsigned char LUN, unsigned int Index, unsigned int nSec, void *buf); + +/*************************************************************************** +º¯ÊýÃèÊö:дÉÈÇø½Ó¿Ú +Èë¿Ú²ÎÊý:LUN=Âß¼­·ÖÇøºÅ, Index=ÆðʼÉÈÇøµØÖ·, buf=Êý¾Ý»º³åÇø, nSec=ÉÈÇøÊý +³ö¿Ú²ÎÊý:0=ÕýȷдÈë; ·Ç0=д²Ù×÷ʧ°Ü, Êý¾ÝûÓб»ÕýȷдÈë +µ÷Óú¯Êý: +˵ Ã÷: +***************************************************************************/ +extern int FtlWrite(unsigned char LUN, unsigned int Index, unsigned int nSec, void *buf); + +/*************************************************************************** +º¯ÊýÃèÊö:MLC FLASHÊý¾ÝˢР+Èë¿Ú²ÎÊý: +³ö¿Ú²ÎÊý: +µ÷Óú¯Êý: +˵ Ã÷:ÔÚϵͳIDLE/ÔڱȽϼ¯ÖжÁÊý¾Ýʱ(ÈçA-B²¥·Å¡¢Æµ·±¶Á×ÊÔ´µÈ)µ÷Óøú¯Êý, + Äܼ°Ê±ÐÞÕý±»Æµ·±¼¯ÖжÁ»µµÄÊý¾Ý,º¯ÊýÖ´ÐÐʱ¼ä¿ÉÄܽϳ¤(¼¸°ÙmsÉõÖÁ¼¸s) +***************************************************************************/ +extern void FlashRefreshHook(void); + +/*************************************************************************** +º¯ÊýÃèÊö:AHBÖ÷Ƶ¸üÐÂʱÐèÒªµ÷Óô˽ӿÚÀ´ÅäÖÃFLASHʱÐò +Èë¿Ú²ÎÊý:AHBnKHz=Ö÷Ƶ(AHB) +³ö¿Ú²ÎÊý: +µ÷Óú¯Êý: +***************************************************************************/ +extern void FlashTimingCfg(unsigned int AHBnKHz); + +/*************************************************************************** +º¯ÊýÃèÊö:FTL ¹Ø±Õ£¬¹Ø»úʱµ÷Óà +Èë¿Ú²ÎÊý:ÎÞ +³ö¿Ú²ÎÊý:ÎÞ +˵ Ã÷:¹Ø»úʱ£¬ÔÚËùÓÐдÎļþ²Ù×÷½áÊøºóµ÷Óà +***************************************************************************/ +extern void FtlClose(void); + +/*************************************************************************** +º¯ÊýÃèÊö:FTL ¶¨Ê±»Øµ÷º¯Êý£¬ÏµÍ³1S×óÓÒµ÷ÓÃÒ»´Î +Èë¿Ú²ÎÊý:ÎÞ +³ö¿Ú²ÎÊý:ÎÞ +˵ Ã÷:FTLÖÐһЩCACHEÔÚ¶¨Ê±ÖлØÐ´flash +***************************************************************************/ +extern void FtlTimeHook(void); + +/*************************************************************************** +º¯ÊýÃèÊö:»ñÈ¡ flash page ´óС£¬ÒÔ±ãÍâÃæ¿ª»º³å, +Èë¿Ú²ÎÊý:ÎÞ +³ö¿Ú²ÎÊý:page´óС£¬sectorµ¥Î» +µ÷Óú¯Êý: +˵Ã÷: ÐèÒªÔÚFTLInitºó²Å¿ÉÓà +***************************************************************************/ +extern int FlashGetPageSize(void); + +/*************************************************************************** +º¯ÊýÃèÊö:AHBÖ÷Ƶ¸üÐÂʱÐèÒªµ÷Óô˽ӿÚÀ´ÅäÖÃFLASHʱÐò +Èë¿Ú²ÎÊý:AHBnMHz=Ö÷Ƶ(AHB) +³ö¿Ú²ÎÊý: +µ÷Óú¯Êý: +***************************************************************************/ +extern void FlashTimingCfg(unsigned int AHBnKHz); + +/*************************************************************************** +º¯ÊýÃèÊö:ϵͳÅÌд²»ÔÊÐí +Èë¿Ú²ÎÊý: +³ö¿Ú²ÎÊý: +µ÷Óú¯Êý: +***************************************************************************/ +extern void FtlFlashSysProtSetOn(void); + +/*************************************************************************** +º¯ÊýÃèÊö:ϵͳÅÌдÔÊÐí +Èë¿Ú²ÎÊý: +³ö¿Ú²ÎÊý: +µ÷Óú¯Êý: +***************************************************************************/ +extern void FtlFlashSysProtSetOff(void); + +/*************************************************************************** +º¯ÊýÃèÊö:²Á³ýϵͳÅÌ£¬Éý¼¶Ê±Ê¹Óà +Èë¿Ú²ÎÊý: +³ö¿Ú²ÎÊý: +µ÷Óú¯Êý: +***************************************************************************/ +extern void FtlLowFormatSysDisk(void); + +extern int FtlWriteImage(unsigned int Index, unsigned int nSec, void *buf); +/*************************************************************************** +º¯ÊýÃèÊö:½«ËùÓлº´æµÄcache дµ½cache ¿é +Èë¿Ú²ÎÊý: +³ö¿Ú²ÎÊý: +µ÷Óú¯Êý: +***************************************************************************/ +extern void FtlCacheDelayWriteALL(void); + +/*************************************************************************** +º¯ÊýÃèÊö:ÉèÖôÅÅÌд±£»¤µØÖ·£¬ +Èë¿Ú²ÎÊý:LBAµØÖ·£¬Ð¡ÓÚLBAµÄµØÖ·Ð´±£»¤ +³ö¿Ú²ÎÊý: +µ÷Óú¯Êý: +***************************************************************************/ +void FtlSetSysProtAddr(int LBA); + + +/*************************************************************************** +º¯ÊýÃèÊö:»ñÈ¡FLASH´ÅÅÌÈÝÁ¿ +Èë¿Ú²ÎÊý:ÅÌ·û +³ö¿Ú²ÎÊý:ÈÝÁ¿,ÒÔÉÈÇøÎªµ¥Î» +µ÷Óú¯Êý: +***************************************************************************/ +int FtlGetPageZoneCapacity(void); + +/*************************************************************************** +º¯ÊýÃèÊö:¶Á¶àÉÈÇø +Èë¿Ú²ÎÊý:Index=ÉÈÇøºÅ, nSec=ÉÈÇøÊý +³ö¿Ú²ÎÊý:¶Áµ½µÄÊý¾ÝÔÚ»º³åÇøbufÖÐ +µ÷Óú¯Êý: +***************************************************************************/ +int FtlPageWrite(int Index, int nSec, void *buf); + + +/*************************************************************************** +º¯ÊýÃèÊö:¶Á¶àÉÈÇø +Èë¿Ú²ÎÊý:Index=ÉÈÇøºÅ, nSec=ÉÈÇøÊý +³ö¿Ú²ÎÊý:¶Áµ½µÄÊý¾ÝÔÚ»º³åÇøbufÖÐ +µ÷Óú¯Êý: +***************************************************************************/ +int FtlPageRead(int Index, int nSec, void *buf); + + +/*************************************************************************** +º¯ÊýÃèÊö:¶ÁÈ¡ SN sectorÐÅÏ¢ +Èë¿Ú²ÎÊý:pbuf +³ö¿Ú²ÎÊý: +µ÷Óú¯Êý: +×¢ÒâÐÅÏ¢£ºÐèÒªÔÚFTLInitºó²ÅÄܵ÷Óã¬pbuf´óСÐèÒª´óÓÚµÈÓÚ512 bytes£¬·µ»ØÐÅϢΪ512 + bytes¡£ +***************************************************************************/ +char GetSNSectorInfo(char * pbuf); + +#endif diff --git a/drivers/mtd/rknand/epphal.h b/drivers/mtd/rknand/epphal.h new file mode 100755 index 000000000000..1ad8f3bf8ae4 --- /dev/null +++ b/drivers/mtd/rknand/epphal.h @@ -0,0 +1,165 @@ +/******************************************************************************** +********************************************************************************* + COPYRIGHT (c) 2004 BY ROCK-CHIP FUZHOU + -- ALL RIGHTS RESERVED -- + +File Name: epphal.h +Author: XUESHAN LIN +Created: 1st Dec 2008 +Modified: +Revision: 1.00 +******************************************************************************** +********************************************************************************/ +#ifndef _EPPHAL_H +#define _EPPHAL_H + #define read_XDATA32(address) (*((uint32 volatile*)(address))) + #define write_XDATA32(address, value) (*((uint32 volatile*)(address)) = value) + + #define USB_OTG_INT_CH (1<<8) + +//1¼Ä´æÆ÷½á¹¹¶¨Òå +#ifndef DRIVERS_INTC + //INTC Registers + typedef volatile struct tagINTC_STRUCT + { + uint32 IRQ_INTEN_L; + uint32 IRQ_INTEN_H; + uint32 IRQ_INTMASK_L; + uint32 IRQ_INTMASK_H; + uint32 IRQ_INTFORCE_L; + uint32 IRQ_INTFORCE_H; + uint32 IRQ_RAWSTATUS_L; + uint32 IRQ_RAWSTATUS_H; + uint32 IRQ_STATUS_L; + uint32 IRQ_STATUS_H; + uint32 IRQ_MASKSTATUS_L; + uint32 IRQ_MASKSTATUS_H; + uint32 IRQ_FINALSTATUS_L; + uint32 IRQ_FINALSTATUS_H; + uint32 RESERVED1[(0xc0-0x38)/4]; + uint32 FIQ_INTEN; + uint32 FIQ_INTMASK; + uint32 FIQ_INTFORCE; + uint32 FIQ_RAWSTATUS; + uint32 FIQ_STATUS; + uint32 FIQ_FINALSTATUS; + uint32 IRQ_PLEVEL; + uint32 RESERVED2[(0xe8-0xdc)/4]; + uint32 IRQ_PN_OFFSET[40]; + uint32 RESERVED3[(0x3f8-0x188)/4]; + uint32 AHB_ICTL_COMP_VERSION; + uint32 ICTL_COMP_TYPE; + } INTC_REG, *pINTC_REG; + + //SCU Registers + typedef volatile struct tagSCU_STRUCT + { + uint32 SCU_APLL_CON; + uint32 SCU_DPLL_CON; + uint32 SCU_CPLL_CON; + uint32 SCU_MODE_CON; + uint32 SCU_PMU_CON; + uint32 SCU_CLKSEL0_CON; + uint32 SCU_CLESEL1_CON; + uint32 SCU_CLKGATE0_CON; + uint32 SCU_CLKGATE1_CON; + uint32 SCU_CLKGATE2_CON; + uint32 SCU_SOFTRST_CON; + uint32 SCU_CHIPCFG_CON; + uint32 SCU_CPUPD; + } SCU_REG, *pSCU_REG; + + //REG FILE registers + typedef volatile struct tagREG_FILE + { + uint32 CPU_APB_REG0; + uint32 CPU_APB_REG1; + uint32 CPU_APB_REG2; + uint32 CPU_APB_REG3; + uint32 CPU_APB_REG4; + uint32 CPU_APB_REG5; + uint32 CPU_APB_REG6; + uint32 CPU_APB_REG7; + uint32 IOMUX_A_CON; + uint32 IOMUX_B_CON; + uint32 GPIO0_AB_PU_CON; + uint32 GPIO0_CD_PU_CON; + uint32 GPIO1_AB_PU_CON; + uint32 GPIO1_CD_PU_CON; + uint32 OTGPHY_CON0; + uint32 OTGPHY_CON1; + } REG_FILE, *pREG_FILE; + + /******************************************************************** + ** ½á¹¹¶¨Òå * + ********************************************************************/ + //GRF Registers + typedef volatile struct tagGRF_REG + { + uint32 CPU_APB_REG0; + uint32 CPU_APB_REG1; + uint32 CPU_APB_REG2; + uint32 CPU_APB_REG3; + uint32 CPU_APB_REG4; + uint32 CPU_APB_REG5; + uint32 CPU_APB_REG6; + uint32 CPU_APB_REG7; + uint32 IOMUX_A_CON; + uint32 IOMUX_B_CON; + uint32 GPIO0_AB_PU_CON; + uint32 GPIO0_CD_PU_CON; + uint32 GPIO1_AB_PU_CON; + uint32 GPIO1_CD_PU_CON; + uint32 OTGPHY_CON0; + uint32 OTGPHY_CON1; + }GRF_REG, *pGRF_REG,*pAPB_REG; + + //GPIO Registers + typedef volatile struct tagGPIO_STRUCT + { + uint32 GPIO_SWPORTA_DR; + uint32 GPIO_SWPORTA_DDR; + uint32 RESERVED1; + uint32 GPIO_SWPORTB_DR; + uint32 GPIO_SWPORTB_DDR; + uint32 RESERVED2; + uint32 GPIO_SWPORTC_DR; + uint32 GPIO_SWPORTC_DDR; + uint32 RESERVED3; + uint32 GPIO_SWPORTD_DR; + uint32 GPIO_SWPORTD_DDR; + uint32 RESERVED4; + uint32 GPIO_INTEN; + uint32 GPIO_INTMASK; + uint32 GPIO_INTTYPE_LEVEL; + uint32 GPIO_INT_POLARITY; + uint32 GPIO_INT_STATUS; + uint32 GPIO_INT_RAWSTATUS; + uint32 GPIO_DEBOUNCE; + uint32 GPIO_PORTS_EOI; + uint32 GPIO_EXT_PORTA; + uint32 GPIO_EXT_PORTB; + uint32 GPIO_EXT_PORTC; + uint32 GPIO_EXT_PORTD; + uint32 GPIO_LS_SYNC; + }GPIO_REG,*pGPIO_REG; + +#endif + +//1È«¾Ö±äÁ¿ +#undef EXT +#ifdef IN_EPPHAL + #define EXT +#else + #define EXT extern +#endif + +//1º¯ÊýÔ­ÐÍÉùÃ÷ + + extern void EnableIRQ(void); + extern void DisableIRQ(void); + extern void EnableOtgIntr(void); + extern void DisableOtgIntr(void); + extern void InterruptInit(void); +#endif + diff --git a/drivers/mtd/rknand/flash.uu b/drivers/mtd/rknand/flash.uu new file mode 100755 index 000000000000..80b6662562f1 --- /dev/null +++ b/drivers/mtd/rknand/flash.uu @@ -0,0 +1,591 @@ +begin 644 flash.o +M?T5,1@$!`0````````````$`*``!``````````````!$2@``````!30````` +M`"@`#P`,``0PG^45`-/E'O\OX0`````$,)_EH`"#Y1[_+^$`````-#"?Y30@ +MG^6@$)/E`@!1X0``H`,>_R\!O"G3X0(`4N,!`*"3'O\OD:0PD^4#`%#A``"@ +M@P$`H),>_R_A`````$Y!3D0@,)_EO!G3X1#`T^48()/EG`$#X)(#`^`#`%#A +M``"@,P$`H",>_R_A`````'`PG^4!$*#C!""3Y0@0@N4&`)/H`@!1XQ(`P^4, +M,)+E`P``&@@`4..?-LT'`CJ#$PT``.H-``":$`!0XQ\RQ`<)```*&`!0XQ`P +M@P,&```**`!0XQ\RQ`<"```*/`!0XP$``!H0,(/C`CB#XP$P@^,,,(+E'O\O +MX0`````,,)_E`2"@XP0PD^4,((/E'O\OX0````!$,)_E`""3Y0(`4N,'```: +M`P!0XQ[_+X$$()/E`3"@XQ,`H.$`,)+E$###YP0``.H$()/E`3"@XQ,`H.$` +M,)+E$##'YP`P@N4>_R_A`````'`PG^400"WI`$"@X1`@T^6\"=/A&!"3Y9(` +M`."1``#@``!4X00`H.$<$),UD0(!(/[__^L\()_E`#"@XP008>"H`)+E!""" +MX@$`4.$0@+T(`0!PXP,``!H8()_E*C"#X@,1@N<0@+WH`3"#X@H`4^/R__\: +M$("]Z`````#P02WIQ$"?Y0-PH.$`4*#AH#"@X0%@H.$)`-3E`H"@X2`0E.4S +M`*#A_O__ZP`0A^4/,-3E"0#4Y0``4^,0```*)!"4Y0$`@.(U`*#A(%"4Y:$0 +MH.'^___K`0"@X040H.'^___K`3!%XJ50@^$!4(7BE0`%X`!0B.4D,)3EHS"@ +MX1```.HU`*#A)!"4Y?[__^L@<)3EAU"@X0$`H.$%$*#A_O__ZP%01>('<(7A +M`7"'XI<`!^``<(CE(#"4Y0$@0^*C,(+A`3"#X@`PAN7P@;WH`````(`PG^5P +M0"WI`$"@X10@T^4!`%+C!@``&@\@T^4``%+C%@``&A(PT^4``%/C"```&A(` +M`.H``%+C$```&A8@T^4/`%+C#0``FA$PT^4!`%/C"@``&BPPG^4D4)/E%A#3 +MY2P@D^65`0/@`P!2X0,``)H$`*#A!1"@X?[__^N50"3@!`"@X7"`O>@````` +M@#"?Y1(PT^40`%/C#@``"@,``(H(`%/C"P``"@X`4^,&``#J*`!3XTHT``,. +M```*/`!3XVTT``,+```*&`!3XP0T`!,(```:`0``ZD(^H.,%``#J+#"?Y2XD +M`.,`$)/E-#0`XP(`4>,",*`1%""?Y18@TN4!($+B```"X*``H.&0`P#@'O\O +MX0````#_02WI4#*?Y0"`H.$L8)/E!@!0X0!@H#$`,*`S#@``.C`0D^4`8&;@ +M`0!6X0$PH#,)```Z-""3Y09@8>`"`%;A`C"@,P0``#HX,)/E!F!BX`,`5N%_ +M```J`S"@X_@AG^4&`*#A\%&?Y0`0DN4"`%'C"$"#$@1`D@4$()(5`DR$`H-$ +MA``$1((0N?__ZQ80U>4`<*#A!@"@X?[__^L(,-7E`0!3XP!@H.%```":O#G5 +MX1`0U>48()7ED0,#X)(#`^`#`%CA.0``.@@@C>(,,(WB!!"-XD[__^L+(-7E +M)#"5Y0``4N,,`)WE`S`&X`@@G>4H```*`F"`X`-@AN`&`*#A>/__ZQ0PU>4$ +M`%/C`#"@`P@PA`6P-M41!#"$!00PA`4C-*`1"#"$%2PQG^4@**#A_Q``XB`$ +MH.$$$(3E!`"$Y00@A.44(-/E!`!2XP`PH`,(,(0%L#;3$00PA`4$,(0%(S2@ +M$0@PA!4$`)WE``"&X%S__^O_,`#B!#"$Y2`XH.$@!*#A!`"$Y00PA.7(,)_E +M8##3Y2<``.H"`(#@`6`&X@,P@.`$`)WED#8@X`P``.JD,)_E!@"@X2!0D^4% +M$*#A_O__ZP$P1>*E,(/A!1"@X0%0@^*5``7@!@"@X?[__^L!`(7@/___ZVS` +MG^4,,-SE``!3X_\0`.(@)*#A#P``"G=P_^8`,*#C"#"$Y?\P!^(G=*#A!#"$ +MY01PA.4$$(3E!""$Y0TPW.4``%/C,#"@XR`(H!$$`(05"#"$Y04``.H(,(3E +M(`B@X00PA.4$$(3E!""$Y00`A.7_@;WH`````/]!+>F@,9_E`("@X2Q@D^4& +M`%#A`&"@,0`PH#,.```Z,!"3Y0!@9N`!`%;A`3"@,PD``#HT()/E!F!AX`(` +M5N$",*`S!```.C@PD^4&8&+@`P!6X5,``"H#,*#C2"&?Y08`H.%`49_E`!"2 +MY0(`4>,(0(,2!$"2!00@DA4"3(0"@T2$``1$@A`A___K%A#5Y0!PH.$&`*#A +M_O__ZP@PU>4!`%/C`&"@X10``)J\.=7A$!#5Y1@@E>61`P/@D@,#X`,`6.$- +M```Z"""-X@PPC>($$(WBMO[_ZR0`E>4!,`;B"""=Y0!@!N`,`)WE`@"`X`9@ +M@.`$`)WED&,@X`P``.JD,)_E!@"@X2!0D^4%$*#A_O__ZP$P1>*E,(/A!1"@ +MX0%0@^*5``7@!@"@X?[__^L!`(7@T_[_ZVPPG^4,P-/ENE73X0``7./_$`#B +M("2@X0T```IW`"`%#A`C"@,P0``#HX,)/E +M``!BX`,`4.%%```J`S"@XQ0AG^4049_E`!"2Y0(`4>,6$-7E"$"#$@1`D@4$ +M()(5`DR$`H-$A``$1((0_O__ZP@PU>4!`%/C`&"@X1\``)J\.=7A$!#5Y1@@ +ME>61`P/@D@,#X`,`5^$8```Z!!"-X@@@C>(,,(WB3?[_ZR1PE>5@,*#C"#"$ +MY0XPU>4'8`;@``!3XP@PG14#8(80!@"@X0=@!N!W_O_K_S``X@0PA.4@.*#A +M(`2@X00`A.4$,(3E"0"=Z0,`@.`&`(#@"```ZE0PG^4&`*#A(%"3Y040H.'^ +M___K`3!%XJ50@^$!4(7BE0``X&/^_^M@,*#C"#"$Y?\P`.($,(3E(#2@X00P +MA.44,)_E#3#3Y0``4^,@"*`1!`"$%130C>+P@+WH`````-0PG^430"WI+""3 +MY0(`4.$``*`S#P``.C#`D^4`$&+@#`!1X0$`H#,*```Z-""3Y0$0;.`"`%'A +M`@"@,P4``#HX,)/E`2!BX`,`4N%``*`C(```*@,`H.-\,)_E`""3Y0(`4N,( +M0(`2!$"3!00PDQ4"3(0"!$2#$(!$A`#-_?_K5#"?Y14$()WE``!2XP$P0N($,(WE^O__&BPPG^4``)3E`!"3Y7``[^8"`%'C!!"3 +M!000DQ4`,)$%`#"1%1(PPP<2,,<7`#"!Y1R`O>@`````]T`MZ0!PH.$`0*#C +M`6"@XU!3#.,'`*#AP/__ZT``$.,(```:!&"-Y00PG>4``%/C`3!#X@0PC>7Z +M__\:`4"$X@4`5.'R__\:_H"]Z/!/+>DT09_E`U`"X@!@E.4%(J#AA52@X0(` +M5N,)```:!$"4Y0,`4.,&#*"#"GR$XA)LA.(%4(?@`B"&X`),A.()``"*!P`` +MZ@1`E.4(`(#B`7J$X@)LA.(%4(?@`B"&X``$A.`!``#J@`2@X0``A.`#LJ#A +M`ER%X@`PH.,K``#J``!1XP!`H!,5```:`4"@X0"0D.4`H)#E`("0Y0F.?G`'"`Y2Q\H.$`<(#E\___&@-`TN<`0(#E`T"2YU1$Y^<`0(#E +M$#"#X@)(+`%/A`FQ%XM#__QKPC[WH`````,@PG^5PP*#C,!"@X\`@G^70 +M``;COL7#X;;&P^&ZQL/A,,`&X[#&P^%PP*#CO,;#X:#`G^6X%@1(-/E``!2 +MXP8``!H"`(/@`1""XM`@P.5Q(._F@`!2X_G__QH0@+WH`0!2XP,`H!$#$*`3 +M`#"@$R<``!H4(-/E`@!2XP0```H``%+C$P``&A8PT^4/`%/C$```BJ@0G^4` +M,*#C`P!3XP,@H.$$``":`0`3XP,@H!,"(*`#@R!BX/\@`N(!P(/B`P"!X'PP +M[^;0(,#E@`!3X_'__QH0@+WH9!"?Y?\@H.,`,*#C`4"#X@$`4^,#P*"1`P"! +MX'0P[^8"P*"!`B""XH``4^/0P,#EG@ +M0)_E%##4Y0(`4^,T```:3#"4Y0``4^,Q```*`%"@XS:@H.,5CH3B`7"@XQ9@ +MH.-U`._FN/S_ZP`PE.4%`8C@K!"@XP(`4^,(((42!#"4!00PE!4"/(,"A32# +M``(T@Q`(H(/E!!"#Y=`@T.$`((/E!'"-Y00@G>4``%+C`7Z__\: +M`1"!X@$`@.*P`%'C\O__&@A@@^4`,)3E`@!3XP4``!H$$)3E`#"1Y1(PP^<` +M,(WE`#"!Y04``.H$,)3E`!"3Y0`0C>4`(,WE`""=Y0`@@^4!4(7B!`!5X]+_ +M_QK^A;WH`````![_+^$>_R_A\$$MZ0`PH.,`0*#A`5"@X0*`H.$#,,3G`3"# +MX@$,4^/[__\:`#"@XP`QQ.4#8*#A`Q"@X0-PH.$!,<3E!C#4YP$`@>(!(-CG +M!1"@X0-PA^`"<(?@=W#OY@<@U.<&(,3G`6"&X@D`<=#E`5"@X0!`H.,!,=#E!\"@X0T``.H,8-#G`S"&X',P +M[^8#@-#G#(#`YP-@P.<,H-#G!(#2YPI@AN#_8`;B!F#0YP9@*.`$8,+G`4"$ +MX@'`C.(``%7C`5!%XGS`[^;L__\:`1"'X`$QP.4`$<#E\(6]Z$0PG^5P0"WI +M`%"@X0%@H.%&WTWB#P"3Z$+/C>($0(WB#P",Z`P@H.$$`*#A$!"@X_[__^L$ +M`*#A!A"@X04@H.'^___K1M^-XG"`O>@```````#@XQ[_+^$``.#C'O\OX?[_ +M_^H$`)_E`!"@X_[__^H``%#T!`"?Y0$0H./^___J``!0]`0`G^4`$*#C_O__ +MZ@``4/3P02WI]72@XP%@H..$`)_E`$"7Y000H.'^___K5!7DY]0QYN?40.'G +M!C"#X!9$H.$&$('@,`"@XY$$`>"0`P#@_O__ZP!0H.$`$*#A2`"?Y?[__^L4 +M0)?E0`"?Y000H.'^___K5!?DY]1*X><&$('@%F2@X04`H.&1!@'@_O__ZP!` +MH.$`$*#A%`"?Y?[__^L$`*#A\(&]Z``````2````(@```#<````00"WI_O__ +MZP`0H.$0`)_E_O__ZPP`G^4`$*#C$$"]Z/[__^I'``````!0]/=/+>G<0)_E +M`%"@XS>PH.,!D*#C=0#OYJQPH./J^__K`#"4Y<``G^4"`%/C"("%$@0PE!4$ +M@)0%"(2#$*PPG^4"C(@"A82(``6A@^#^___K"+"(Y01PB.4$D(WE!&"=Y0`` +M5N,!,$;B!#"-Y?K__QH`$)CE`7"'XG0`G^5Q$._F`1#*Y'$0K^;^___KL`!7 +MX^[__QI<`)_E_O__ZP`PE.4"`%/C!0``&@0@E.4`,)+E%C##YP`PC>4`,(+E +M!0``Z@0PE.4`()/E`""-Y0!@S>4`()WE`""#Y0%0A>($`%7CR___&OZ/O>@` +M````4P```%`!``!X````@````/!!+>GZ'Z#C_O__Z_(Q`.,!($#B`&"@X0,` +M4N'P@;V(`!"@X1`'`N/^___K%'&?Y0!`H.,3$-?E`%"@X0@!G^7^___K!A"@ +MX0`!G^7^___K$S#7Y0H`H.,%$*#AD`,`X`$`0.(%`(#@_O__ZP!@E^4"`%;C +M#@``&@0`4.,!,*#C`V!`@A-&T>=V<._F)C%'X#\P`^*30LKGE0,#X$$/4^,! +M#(4R!1"@,0,`@#(1```Z$@``Z@,`4.,!,*#C`V"@DP%@0((&`*#A`Q"@XQ-& +MT>?^___K=G#OY@<`8.`_``#BD$+*YY4``.#'`%#C`P``BL<`A>(%$*#A_O__ +MZY!"RN?4,N7G2`"?Y0,`5N$'<&.``'"@DQ]P!X(!,(?B%T#$YY4#!>"5`%7C +M$T#$EQ0PG^4$()/E!$""Y00PD^4$$)/E\$&]Z/[__^H`````A0```)@```"I +M````_O__ZO[__^J`P9_E\$]"!@QG^4`,)/E`@!3XP`PH!,PP*`3 +M"`&?%04`H`$&$*`!#```&B4``.J<`@+@#Z!6Y1"`5N4``%+C"J2(X0.`@N(( +M(*"Q0B&@X0*!E><'((/@]Z```4^,"```*`P"@X80DH.'^___K``!6 +MX_"'O0AX,)_E`#"3Y0(`4^,`,*`3,!"@$PX``!H&`*#A!1"@X00BH.'P1[WH +M_O__ZI$"`N`#P(+B``!2XPP@H+%"(:#A`B&5YS(@H.$0($;E(B2@X0\@1N4' +M((/@<\#OY@$``N($`%SAHB^"X`$P@^(``J#A$&"&XL(@H.'K__\Z\(>]Z``` +M`````/__`P!1XW!`+>D`4*#A`4"@X0``X,-P@+W(*!"?Y0(LH..4$B'@_O__ +MZP$`5.,``*`#<("]"`4`H.$"'*#C_O__ZP``H.-P@+WH8`$``!!`+>D"$*#C +M_O__ZW``[^80@+WH$$`MZ0,0H./^___K<`#OYA"`O>@``%+C$$`MZ0!`H.$` +M```*_O__ZP0`H.$0@+WH<$`MZ4A1G^5(,9_E`$"@X7`IE>4#`%+A!@``&@`0 +MH.,"+*#C_O__ZP0`H.&6'H7B92^@XT0``.H"+*#C`!"@X_[__^N\,=7A!##$ +MY2,TH.$%,,3E$C#5Y04!,,3E+C#5Y0(PQ.4O,-7E +M`S#$Y18PU>4&,,3E$S#5Y0@PQ.44,-7E"3#$Y10PU>7_`%/C`#"@`PDPQ`6H +M,)_E#"#3Y0``4N,%```:N#'3X00@@N(&(,3E!##$Y2,DH.$%(,3E`!"@XWP@ +MG^4!,*#A`0"@XPH0Q.4L$)+E!"""X@``4>,*$-05$!.!$0$P@^(*$,05!`!3 +MX_;__QH`(*#C%R#$Y40@@N(0(,3E02"@XQ(@Q.4?(*#C-!"?Y18@Q.4!((+B +M%"#$Y0$@H.,8`(3B%2#$Y7,@@N)*,(/B$S#$Y1$PQ.5P0+WH_O__Z@````!$ +M3D%."````/[__^K0$*#C_O__ZOPQG^4`(*#C\T4$,-T%!3#=%2`P(P(",",2TS+@!],PX!<``%/C"``` +M&@#`C>4`,)WE``!3XP$P0^(`,(WE^O__&@$@@N("`%+CZ___&@!0H..,@9_E +MC)&?Y06@H.$,`)CH`#"3Y0(`4N,$,(WE!##=!04PW173,N`'TS#@%P``4^,/ +M```:?##8Y0``4^,#```*L#C8X3``4^,````*_O__ZP"@C>4`,)WE``!3XP$P +M0^(`,(WE^O__&@%0A>()`%7AY?__&A@QG^5\(-/E``!2XR4```JP*-/A,`!2 +MXR(```H*$-/E``"@XWP`P^4``%'A"P``"KXWT^$!`%/C!0``F@0`H.%`_/_K +M0``0X_O__PH!@*#C`P``ZA`P".,#`%+A$0``"@"`H..T4)_EB&"5Y08`H.$T +M_/_K,`B@X0$`$.,)```*L"G5X08`H.&,$)7E`%#@X_[__^L`@*#A``"@XP`0 +MH.'^___K`0``Z@2`H.$`4*#C``!7XQ<```I@,)_E!@"@X1A@D^40,-/EE@,& +MX`80H.'^___K!A"@X0"@H.$$`*#A_O__ZP``6N$*```:``!5XP<```H$`*#A +M!A"@X?[__^L(`*#A`4"@X080H.'^___KED`DX`!`A^4%`*#A_(>]Z`````"@ +MA@$`\$\MZ1303>(0$(WB#``AY?[__^N$,9_E!""=Y2P`D^4``%+A`%"@,U8` +M`#HPP)/E`@!@X`P`4.$!4*`S40``.C00D^4``&S@`0!0X0)0H#-,```Z.#"3 +MY0`08>`#`%'A1```*D8``.J\&=/A`@!1XT```)JD,)/E`P!2X3T``)H8,9_E +M`'"@XQ!!G^70L*#C!V"@X="0!N,`()/E`:"@XP(`4N,(@(42!("3!00PDQ4" +MC(@"A82(``B$@Q`G``#JQ/G_ZP0`G>5T^__K"+"(Y0`PE.4"`%/C!0``&@0@ +ME.4`,)+E'S##YPPPC>4`,(+E!0``Z@0PE.4`()/E#""-Y0Q@S>4,()WE`""# +MY00PG>4`(*#CL"G$X080H.&^)=3A`P"@X;"8Q.$!<(?BC&"$Y8@PA.47(,3E +MOF?$X7R@Q.7^___K``!0XP``X!,*```:!""=Y1PPE.4#,(+@!#"-Y180U.4( +M`*#C_O__ZP``5^$%`*#AT?__.@``H.,4T(WB\(^]Z`-0H.,0,)_E$!"?Y:`` +MD^4!`%#ALO__&K?__^H`````3D%.1/]'+>D$`(WE`%!1X@00C>(``(45!`"= +MY?[__^M,,I_E""#3Y180T^61`@+@!P!2XU,``,H,(-/E``!2XP4```H8()/E +MO#G3X9(#`^`$()WE`P!2X4H``#H$`)WE_O__ZW<``.HL();E`@!3X0!`H#-V +M```Z,!"6Y0,P8N`!`%/A`4"@,W$``#HT();E`S!AX`(`4^$"0*`S;```.C@0 +MEN4#,&+@`0!3X6<``#H``.#C8P``Z@0@EN4"+(+BA$2"X`(``.H(0(3B!""6 +MY01$@N"@();E!!"=Y0D`4N$%```*O"G6X0(`4N,'``":I""6Y0(`4>$$``": +M"("$Y0`PEN4"`%/C$@``&@L``.H"`%/C6#&?Y0``H`,``*`3!""3!00@DQ4` +M,)(%`#"2%1\PPP4,H,WE#""=Y0`@@^4$()WE`7"'XA4PUN4#,(+@!#"- +MY00``.H`<*#CX&"?Y>"0G^4'H*#AT("@XQ`@UN7,0)_E`@!7X00PG>6M__\Z +M%1#4Y0!@H./0H`;C!G"@X0&`H..1,F/@&```Z@0PG>4`(*#CL"G$X;XEU.$# +M`*#AL*C$X8@PA.47(,3EC'"$Y;YWQ.%\@,3E_O__ZP``4.,&```*``!5XV0P +MGQ4`()45%3#3%9,F9A``8(45"0``ZA4PU.4!8(;B!""=Y0,P@N`$,(WE!1"@ +MX1`PU.4#`%;AX?__.@``H.,0T(WB\(>]Z`-`H.,$`*#A]?C_ZP0`G>6E^O_K +M`#"6Y0(`4^.5__\:D/__Z@````!.04Y$\#"?Y7-`+>D`4*#A`""3Y0%@H.$" +M`%+C!@``&@1`D^4#`%#C!CR@@X`TH)$"3(3B`T"$X`(``.H$,)/E"$"`X@1$ +M@^`%`*#AVOC_ZZ0PG^7_(*#C"""$Y0``H..^)=/A`!"@X1<@P^7^___KD#"@ +MXP@PA.4`,*#C!#"$Y0HP@^($,(WE!""=Y0``4N,!,$+B!#"-Y?K__QH`$)3E +M5#"?Y0`0QN4`$)3E`1#&Y0`0E.4"$,;E`!"4Y0,0QN4`$)3E!!#&Y0`0D^4" +M`%'C!!"3%0`PD142,,<7!```&@,`5>,$$).5`#"1E1(PPY<```"*`#"!Y7R` +MO>@`````#,&?Y0$PH.'P02WI`$"@XP1@G.4$4*#A4"3GYR",H.%0&.?G"$"& +MY0!PG.4$8)SE`@!7XPQ`EN40```:$@#CV^O_J +M`1`!X@%`A..10,'G%4;,YY%0P>>!7X7C&$7+YY)1Q.>34L?G`EN%XQX``.H, +M`-SE``!0XP$``!H#`%?C\(&]"`$0`>+2(.#GD5#!YY%`P>=H$)_E#%"%XQ)2 +MQ.>C(*#ADE+&YY]!P^<2$-'E$EV%XYA"Q^<``%'C`EN%`P0@H`,25M$'`P!7 +MXP8``)H``%#C`E:%`P%(A`.34L8'$#"6Y1\QPN<0,(;E$#"?Y00@D^4,0(+E +M!#"3Y0A0@^7P@;WH`````/!/+>EL0I_E+-!-X@&`H.$H,(WB`K"@X1@@E.4, +M`"/E`Q"@X;PYU.$64-3ED@,#X`,`4.$(,*`C!#"@,Q0PC>7^___K+!"4Y1PP +MG>4!`%/A`$"@,X(``#HP`)3E`Q!AX```4>$!0*`S?0``.C0@E.4!$&#@`@!1 +MX0)`H#-X```Z.`"4Y0$@8N```%+A``#@(W```"IQ``#J!""2Y0(L@N*$)(+@ +M"""-Y0,``.H$()+E"!"$X@$4@N`($(WEM"&?Y;01G^6@`)+E`0!0X04```J\ +M&=+A`@!1XUT``)JD()+E`@!3X5H``)H$`*#A"Z"@X2OX_^L$/*#A`3B#XX4D +MH.$8,(WE")"@X04RH.$0((WE##"-Y0!@H.-8<9_E,0``ZAP`G>4`$*#C``"& +MX/[__^L<`)WE``"&X%_Y_^L),*#A`0"@XP`0H.,%(*#A`*"-Y;?\_^L`,)?E +M`0!5XP,`4Y,%```:!`"@X0$0H.,`(*#C!3"@X6?Z_^L-``#J!1"@X1@`G>57 +M___K!!"7Y0`@E^4(,)'E`@!2XR0PC>4E,-T%)C#=%1`P(^)3,N#G``!3X_;_ +M_QH0()WE``!8XP`@H`,%8(;@`I")X`@@G>4,,)WE``!;XW9@_^8`,*`#`Z"* +MX!`PH.,(,(+E%""=Y80PG^4"`%;AR?__.@`@D^4!$*#C``"@XP(`4N,$(),% +M!""3%0`PD@4`,)(5'S##!Q\PQQ<`,(+E"""@XT@PG^6P*6P&,/AC("#Y8@@@^4```#J``"@XRS0C>+PC[WH`T"@XPP@ +MG^4`$)+E`@!1XXW__QJ'___J`````$Y!3D00@/__W,2?Y?!/+>E$T$WB`H"@ +MX18@W.4<,(WE"##4D`(WED@,#X`<`4^,-``#*###4D`)WE_O__ZPX!`.HD +M`)WEO?G_ZT``$./[__\*9#2?Y0H@T^4``%+C`@``"KXWT^$!`%/CT`#GAP$` +M$.,"```*)`"=Y200C>+^___K-#2?Y200G>4L`)/E``!1X0!@H#/[```Z,,"3 +MY0$`8.`,`%#A`6"@,_8``#HT()/E``!LX`(`4.$"8*`S\0``.C@PD^4`(&+@ +M`P!2X0``X"/I```JZ@``Z@0PD^4"/(/BAC2#X!@PC>4#``#J!#"3Y0@@AN(" +M)(/@&""-Y;@SG^6X(Y_EH`"3Y0(`4.$%```*O"G3X0(`4N/?``":I#"3Y0,` +M4>'<``":C#.?Y0@@T^4!`%+C!P``FKP)T^$0P-/E&""3Y9P``^"2`P/@`P!1 +MX0*@H",````J`:"@XQ00G>4&/*#A`'"@XP$X@^,0<(WE(#"-Y0P0C>4\0Y_E +M"P``ZA8`U.4D,)WE`P"`X&OY_^M``!#C^?__"@P@G>4!<(?B`3"@XQ`PC>6+ +M)(+@#""-Y08`H.%/]__K`0!:XP0``!HD`)WED?C_ZPR0G>4`4*#C8```ZA80 +MU.4!``?B)""=Y2PPE.61("#@`P!0X0`PH#,.```Z,""4Y0``8^`"`%#A`3"@ +M,PD``#HT,)3E``!BX`,`4.$",*`S!```.C@@E.4``&/@`@!0X>;__RH#,*#C +M`""4Y0(`4N,(4(,2!%"4!00@E!4"7(4"@U2%``54@A#^___K$,"=Y3@@C>(\ +M,(WB-!"-X@&0#.(`L*#A5/?_ZSP@G>4``%GC.#"=Y20`E.4#,(+@-""=Y0`` +M"^"2.2G@`)")X+(VU!$)`*`1(S2@$0@PA14%```:NC74X2,TH.$(,(7E#C#4 +MY0``4^,)`*`1=/?_ZP`0H.,$$(7E!!"%Y?\@`.(@.*#A!""%Y2`$H.$$`(7E +M!#"%Y;;__^H``%CC=1#OYA#`H!,`P*`#`B"@XP$`H..5C"S@"3"@X0#`C>6< +M^__K!!"4Y0`@E.4(,)'E`@!2XS`PC>4Q,-T%,C#=%1`P(^)3,N#G``!3X_;_ +M_QH@()WE`A"@XP&;B>(%!(+A`E"%XCC^_^L6L-3E"P!5X>'__SH``%CC"X*( +M$`$`%^,#```:`3"'X@H`4^$1(*`3$```&@HPU.44M,-T%+C#=%1`P(^)3,N#G``!3X_;_ +M_QH8$)WE"""!Y0`@E.4"`%+C!0``&@00E.4`()'E$R##YR@@C>4`(('E!0`` +MZ@0@E.4`$)+E*!"-Y2@PS>4H,)WE`#""Y1`@G>4!,(+B@#8*#C+#"?Y0`@D^4"`%+C%/__&@[__^HD`)_E_O__ZQ`P +MG^4<`)_EI!"3Y?[__^L``*#C[___Z@````!.04Y$$(#__[P```#J````\$\M +MZ0"04^),T$WB"6"@`20`C>48$(WE'""-Y7"@G>7R`0`*^$>?Y1@0G>4<()WE +M#%#4Y1`0C>4``%7C#""-Y7H``!I($(WB"``AY?[__^M`()WE+#"4Y0,`4N$. +M```Z,!"4Y0(@8^`!`%+A`5"%,@D``#HT,)3E`B!AX`,`4N$"4*`S!```.C@0 +ME.4",&/@`0!3X=0!`"H#4*#C@(>?Y04`H.%?]O_K,#"@XP!`H.-``)WEL#C( +MX0APH.&^-=CA!:R@X01@H.$7,,CE`_?_ZQ"`G>5-``#J0`"=Y0`0H.,``(3@ +M_O__ZP`PE^4#`%/C!0``&@`0H.,%`*#A`2"@X0$PH..D^/_K+```Z@H`H.$! +M$*#CE/W_ZPP`E^@($)/E`@!2XS@0C>4Y$-T%.A#=%1`0(>)1$N#G``!1X_;_ +M_QH"`%+CT+"3!2"PDQ42,-?E``!3XSRPC>48```*/"#=Y04@`N(%`%+C!0`` +M&D`0G>4`8.#CK`:?Y0$0A.#^___K#@``ZMNQX^<",$/B`P!;X0H``+I``)WE +M-O;_ZP`PE^5`$)WE`@!3XWP&G^4!$(3@/+"=%=NQY!<+(*#A_O__ZPS`G>4` +M`*#C"#"@X0$@H.,`$*#A`4"$X@#`C>6U^O_K&!"=Y1S`G>4``%'C#!"=Y0(L +MH!,`(*`#``!`,$(WE="#_Y@@VG^4)`%+AK?__ +M.@`@D^4"`%+C:@$`&F4!`.I($(WB`3#`XP&P`.(#`*#A)#`AY?[__^LD()WE +M+#"4Y0,`4N$`4*`S:`$`.C`0E.4"(&/@`0!2X0%0H#-C`0`Z-#"4Y0(@8>`# +M`%+A`E"@,UX!`#HX$)3E`C!CX`$`4^%5`0`J6`$`ZH0@D^4D,)WE`P!2X1<` +M``IT-9_E`!"@XP`@D^5]$,/E`P!2XP<``)JP*-/A,`!2XP0``!H$()/E"#"2 +MY0$&$^,T,(WE^___"CPUG^4P(*#C)`"=Y;`HP^%Z]O_K)`"=Y0`0H./^___K +M!0"@X$L```Z +MA!"3Y2P@D^4"`%'A`$"@,P\``#HP`)/E`1!BX```4>$!0*`S"@``.C0@D^4! +M$&#@`@!1X0)`H#,%```Z.#"3Y0$@8N`#`%+A!$"@(P(``"H#0*#C!0!4X14` +M``H,9)_E!`"@X8+U_^N$`);E+O;_ZP`PEN4"`%/C!""6%0`PDA4?,,<7!``` +M&@,`5.,$():5`#"2E1\PPY<```"*`#""Y04`H.$!$*#C(!"-Y7#U_^L!``#J +M`""@XR`@C>4`8*#C!0R@X0(0H.,48(WE!H"@X;C\_^N40Y_E!G"@X<(``.H( +M$)/E`@!2XS`0C>4Q$-T%,A#=%1`0(>)1$N#G``!1X_;__QH"`%+CT#"3!0(` +M``H#`%+C$#"3!2`PDQ4"((CB1#"-Y0(@:^`)`%+A!0``*A0PG>4"$*#C`0`C +MX@4\H.&`!(/AF_S_ZQ(@U.4``%+C'@``"@`0E.5$,-WE`@!1XU,QX(<(``"* +M!#`#XG,P[^8``%/C`3"@$P(``!H``%OC13#=!=,PX`=S,._F``!3XP!PX!,- +M```:`@!1XT0PG873,>2'!P``B@``6^-$,)WETS'C%P,``!I3%>/GTS'CYP$` +M4^$!,*"Q`P!7X0-PH#$),&C@`F!KX@,`5N$#8*`A!H"(X`D`6.%D```Z``!2 +MXPX``!H4,-3E`0!3XPL``!H%`*#A+/?_ZQ``$.,$```*9`*?Y200G>7^___K +M)`"=Y2?U_^L`P.#CA,"$Y5,``.J\*=3A$!#4Y1@PE.61`@+@DP(#X"0@G>4# +M`%+A`##@,X0PA#5)```Z`#"4Y0(`4^,&```:`P!5XP0@E)4`,)*5'S##ERPP +MC94`,(*5!@``Z@0PE.4`$*#C`""3Y2P@C>4L$,WE+""=Y0`@@^4@()WE``!2 +MXS4``!J$,)3E*""4Y0(`4^$Q```J``!:XP(```H"`%KAA*"$-0,``.H6(-3E +M`2!"X@,`$N$H```:A""4Y2PPE.4#`%+A`%"@,PX``#HP$)3E`B!CX`$`4N$! +M4*`S"0``.C0PE.4"(&'@`P!2X0)0H#,$```Z.!"4Y0)08^`!`%7A`U"@,P10 +MH",%`*#AS_3_ZX0`E.5[]?_K`#"4Y0(`4^,&```:`P!5XP0@E)4`,)*5'S## +MER@PC94`,(*5!@``Z@0PE.4`P*#C`""3Y2@@C>4HP,WE*""=Y0`@@^44()WE +M``"@XPS`G>40,)WE@A"+X'8@[^8`P(WE`+"@XW$0[^96^?_K&!"=Y1P@G>4` +M`%'C$,"=Y88TH!$!,*`!``!2XPP0G>4"8*`!%""=Y09BH!$&$('@`2`BX@P0 +MC>44((WE`\",X!#`C>4)`%CA>#"?Y0P`E#@X__\Z`""3Y0=@H.$"`%+C!0`` +M&@,`5>,)``"*!""3Y0`PDN4?,,/G`@``Z@0@D^4`,)+E'S#'YP`P@N4```#J +M`&#@XP8`H.%,T(WB\(^]Z`-0H.,%`*#AA_3_ZQ0PG^6P&-/AOB73X3``4>,7 +M(,/EH?[_&IS^_^H`````$`$``"0!``!#`0``\$\MZ1303>(`0*#A`X"@X0@0 +MC>4!H*#A#""-Y0*PH.$`<*#C&&&?Y4```.H64-;E!`"@X0LPUN4``%/CA5"@ +M$750[Q8%$*#A_O__ZS@PG>4$`*#A"R"@X0`PC>4%4&'@"A"@X0@`5>$(4*`A +M=5#OY@4PH.'4_?_K`0!PXP"0H.$4```:3,"6Y0``7.,,```*!`"@X0H0H.$+ +M(*#A!3"@X3S_+^$!`'#C`'"@X0!PH!,5```:!!"@X8@`G^7^___K$0``ZH`` +MG^4$$*#A_O__ZPEPH.$,``#J$C#6Y0,P0^(#`%#A"```.DPPEN4``%/C`0`` +M&@0`H.%1]/_K"2"@X4@`G^4$$*#A_O__ZP@PG>4(@&7@!4"$X```4^,,,)WE +MA:2*$'B`[^8``%/C!;*+$```6..\__\:!P"@X130C>+PC[WH`````&0!``"& +M`0``)`$``/!/+>DLT$WB`&"@X4$+H.,D$(WE`H"@X10PC>7^___K`)!0X@2@ +MH!,-```:R#*?Y4%,H.,0H-/EE`H`X/[__^L`D%#B!@``&@0`H.'^___K`)!0 +MX@`PX`,,,(T%G@``"@&@H..0,I_E&""3Y1`0T^62`0?@!P!8X0``H(,!`*"3 +M``!8XP``H`,``%#C`##@`PPPC06.```*O`G3X9`!`>"2`0+@)!"=Y0(`4>$5 +M4-,EC```.@@`H.$%$*#A_O__ZP8`H.$!28GB"(!AX`<0H.'^___K"#"@XP0@ +MH.$`8(WE>(#_Y@8`8>``$*#C_O__Z[`PU.'R#%/C`#"@$Q`PC145```:L#'4 +MX0$P@^)S,/_FL#'$X0``4^,%```:L"#4X0X\0^(!((+B_R`"X@,P@N&P,,3A +M!Q"@X08`H.'^___K`3"@XQ`PC>4'$*#AL`/$X20`G>7^___KL`3$X0`PH.,@ +M0(WE##"-Y4\``.H0,)WE`;"+X@#@X.,``%/C`""@$PH`6^$!```J"`!6X0'@ +MCC('$*#A!3"@X0#@C>7^___K!4"$X`PPG>5!?(?B!6"&X```4.,`,.`3##"- +MY0H`6^$!*8?B"0"$X`4``#H`<*#C"6"@X0=`H.$8D)WE'+"=Y2,``.H(`%3A +MW___.O;__^H4,)WE)`"=Y0``4^,``(?@`R"@$0,``!H0,)WE``!3XP$IBP(@ +M()T5`#"@XPL0H.'^___K`#!0X@$PH!,``%3C`#"@$P``4^,!```*`0!PXR0` +MC16P,)_E`4"$X@0`H.$0$-/E_O__ZP``4>,"```:)`"=Y200C>+^___K0;R+ +MX@5PA^`*`%3A`0``*@@`5^':__\ZE`4$X"0PG>4D$(WB`S"$X`B`9.`#`*#A +M!&"&X'B`_^8D,(WE_O__ZP``6.,'```*`$"@XQR0C>4)<*#A&)"-Y02PH.$& +MD*#A!6"@X;G__^H)`*#A_O__ZPP`G>4LT(WB\(^]Z!P@D^464-/E`@!8X7*` +M_X9M___J`````/-!+>D`8*#A`@N@X_[__^L`0%#B`&#@`S(```H`$*#C92^@ +MX\0`G^4`4.#C_O__ZP8`H.$$$*#A`""@XP$PH.,`4(WE_O__ZQ&`U.40,-3E +M$B#4Y0B$@^$3,-3E%6#4Y0*(B.&(<)_E`XR(X10PU.4DX-3E!C2#X13`U^4< +M$-3E#"#7Y0``4.,`8*`!!6"@$6``G^4``%CA!6"@$0P`7N$%8*`1`@!1X05@ +MH!$2#E/C!6"@$0D``!H``%;C!P``&@00H.%E+Z#CE@Z'XO[__^L(`(?B&!"$ +MXG0@H./^___K!`"@X?[__^L&`*#A_(&]Z&`)````````1$Y!3O!/+>GD2)_E +M1=Y-X@!0H.$,T$WB`!"@XW0@H.,(`(3B_O__ZP`0H.,8(*#C?`"$XO[__^L` +M$*#C%""@XY0`A.+^___K_Q"@XR@@H..H`(3B_O__ZV4OH..6#H3B`!"@X_[_ +M_^L$4(3E`#"@XZ`PA.4`,(7E!#"4Y0`@D^7_`!+C$@``&O\@H.,`((/E!#"4 +MY0`@D^7_(`+B_P!2XPL``!H#(*#C`""$Y0(JH.,`((/E!#"4Y1\L0N(`$)/E +M`@H1XV`QDQ53..,7`#"$%0,``.H8.)_E$""@XP(0H.,`$(/E"#B?Y000D^4` +M(('E,A"@XP`@D^43$,/E`@!2XPH``!KL!Y_EY&>?Y4%.C>+^___K"$"$X@!P +MH.,7H*#C!E"@X="WG^4&@*#A!@``Z@,`4N/$!Y\%\O__"O[__^OZ/Z#CDP`` +MX.[__^IW`._F!!"@X?[__^L"X-3E`Y#4Y0<0H.$$P-3E`"#4Y0$PU.6,!Y_E +M`."-Y0`2C>G^___K`2#4Y0`PH.,#`-OG?Y0,Q@.`` +M`-3E(#"3Y9@`4.,L,(7E`@``&MX`4N,"):`#+""%!0$PH.,!H*#A$##(Y0(` +M`.H!,(/B&`!3X^K__QH!<(?B+""5Y2@PF.4$`%?C$$"$X@10A>(#,(+@*#"( +MY=+__QKL)I_E`#"@XQC$W>4`$.#C\`:?Y100PN4#$-#G,H```*&A3=Y0+`H.,``*#C`T`"XE'AX><1X,/E````ZG[`[^8!,(#B +M!`!0X8S@H.%S`._F^?__N@#FG^52(N'G@`"@XP`PH.,6P,[E````ZH``H.$! +MP(/B`@!3X7PP[^;Z__^ZU#6?Y0.0`>(4(-/E'`"#Y0$`4N,!((("!P``"@$@ +MH.-1$N'G$A&@X7$0[^8($,/E`@!1XP8``)H"((+@""##Y0,``.H!(*#C%B## +MY1\@@N(<((/E@$6?Y0`@H.,4,-3E3""$Y0(`4^,(4-3E!0``&ADTW>7>`%/C +M`@``&O[__^ML-9_E3#"$Y4PUG^41(-/E`@!2XP,``!H4(-/E``!2XU`EGP5, +M((,%+#6?Y180T^5,,)/E%#"-Y94!`^`'`%/C`@``B@@`H./^___K`%"@X01% +MG^5U`._F$`"-Y19PU.4<,)3E!Q"@X9<``N`#`*#ADP4#X!4@Q.48,(3E_O__ +MZP<0H.$@`(3E+`"4Y?[__^L`$.#CO!G$X3`YH.%!#HWB)#"$Y0@`@.+^___K +M*#"4Y0``4^,,```:%##4Y?\`4^,&```*`3&@XQ80U.4#`*#A+#"$Y?[__^LP +M":#A)`"$Y70TG^4!(*#C$"##Y6ATG^4`@*#C&*"-X@"PX..&3XWB`#"7Y0(` +M4^,.`*`#&`"@$_[__^L<`)?E"A"@X0`@H.,",*#C`+"-Y9`(`.#^___K``!0 +MXPT```H`,)?E`@!3XP@`H`,0`*`3_O__ZQP`E^4*$*#A`""@XP(PH.,`L(WE +MD`@`X/[__^L``%#CKP``&@$`VN4`,-KE`A#:Y0,@VN4`-(/A`3B#X0(\@^'H +M(Y_E`@!3X:4``!H+(-3E4@L$XPHPU.4"-(/A``!3X9\``!KM,=3E$B#7Y0,` +M4N$!```*``!3XYD``!J,(8((/E'""#Y;\N0N(3$,/EF!"! +MXA4@P^4@$(/E%B##Y?@QG^44(-/E!`!2XP$`4A,"```*%C#3Y0\`4^,"``": +MV#&?Y0$@H.,.(,/ES#&?Y10@T^4!`%+C!0``&A80T^4(`%'C`@``BAD4W>71 +M`%'C#R##%:0QG^7M(=3EF,"3Y90`D^4H$)/E``",X!(@P^4!`%#A`(#@(P"` +MH#,``%+C!0``&A0@T^4!`%+C\2"@`[8FPP&((9\%LB;#`5PQG^43(-/E/`!2 +MXSP@H(,3(,.%2#&?Y1,@T^4G`%+C"```BA0@T^4"`%+C)B""`A,@PP4#``#J +M`8"(XC(`6.,P__\:`(#@XQ0QG^4`,)/E`@!3XPP!GP4%```*`P!3XP@!GP4" +M```*_O__Z_H_H..3``#@_O__Z^0PG^4((-/E`0!2XP,``)H/,-/E``!3XP%0 +MA0*E4*`!Q$"?Y1"@A.(8,)3E$'#4Y90`E.63!0+@`0!`XI,'!^`4,)WEO%G$ +MX4PPA.4'$*#A`3!"X@<`@."D,(3E_O__ZY@@E.4'$*#A`2!"XI<``^`'`(+@ +ME#"$Y?[__^N7``?@$@#4Y9APA.7^___K$"#4Y1@0E.4`,*#C*#"$Y0-0H.&1 +M`@3@+#"6Y000H.$``%/B`@``"O[__^N4``#@+`"&Y2PPEN4$8(;B"@!6X0-0 +MA>#S__\:$#"?Y0@`H.$H4(/E7-"-X@';C>+PC[WH`````/!)`@`(````4#0# +M`*E<0Y_E+-!-X@&@H.$"D*#A +M`&"@X0PPC>41,-3E`0!3X\L``)H4$-3E``!1X\@``!K^___K`""4Y0,`4N,$ +M``":!!"4Y0@PD>4!!A/C)#"-Y?O__PH(,Y_E+`"3Y0``5N$`4*`S#@``.C#` +MD^4&`&#@#`!0X0%0H#,)```Z-!"3Y0``;.`!`%#A`E"@,P0``#HX,)/E`%!A +MX`,`5>$#4*`S!%"@(P(`4N.T,I_E!@``&@1`D^4$`%7C!CR@`X4TH!$"3(3B +M`T"$X`(``.H$,)/E"$"%X@1$@^`%`*#AJ?#_ZP`PH..BP*#C!0"@XQ`0C>(( +M`%/C","$Y0,@H!,`(*`#!""$Y3LN@Q(2(*`#`2""$O\@`A($((3E'`"-Y1P@ +MG>4``%+C`>!"XAS@C>7Z__\:`."4Y0/@P>,$$),5`#"1%1(PQQ<$```:`P!5XP,``(H$$)/E`#"1Y1(PP^<`,('E +MY'&?Y0"`H.,%`*#A?_#_Z]@AG^4)$*#C`#"@XY$H(>`(`%/CH2"@XP@@A.4# +M(*`3`""@`P0@A.4[+H,2`2""$A(@H`/_(`(2!""$Y1`@C>(#(-+G<@"OYM`@ +MT>$`(&+@`""$Y04@H.,<((WE'""=Y0``4N,!`$+B'`"-Y?K__QH!,(/B`1"! +MX@D`4^/C__\:`#"7Y0(`4^,&```:`P!5XP00EY4`,)&5$C##ER`PC94`,(&5 +M!0``Z@0PE^4`$)/E(!"-Y2`@S>4@()WE`""#Y0H0H.$)(*#A##"=Y08`H.$` +MP.#C`,"-Y;[Y_^L`$*#C`+"@X08`H.'^___K`0![XP(``!H!@(CB$P!8X[W_ +M_QH%`*#A/?#_ZP`PH..AP*#C$`"-X@40H.,(`%/C","$Y0,@H!,`(*`#!""$ +MY3LN@Q(2(*`#`2""$O\@`A($((3ETR"0X0`@A.4<$(WE'""=Y0``4N,!<$+B +M''"-Y?K__QH!,(/B"0!3X^K__QIH,)_E`!"3Y0(`4>,$$),5`#"1%1(PQQ<$ +M```:`P!5XP00DY4`,)&5$C##EP```(H`,('E`0![XPD``!H&`*#A"A"@X0D@ +MH.$,,)WE`,"@XP#`C>6$^?_K`+"@X0```.H`L.#C"P"@X2S0C>+PC[WH```` +M`(````#P3RWI+-!-X@"@H.$,$(WE`!"@XQ0PC>40((WE_O__Z[0RG^4L$)/E +M`0!:X0!`H#,.```Z,`"3Y0H08>```%'A`4"@,PD``#HT()/E`1!@X`(`4>$" +M0*`S!```.C@PD^4!0&+@`P!4X0-`H#,$0*`C9#*?Y0`@D^4"`%+C!@``&@10 +MD^4$`%3C!CR@`X0TH!$"7(7B`U"%X`(``.H$,)/E"%"$X@54@^`P,I_E`8"@ +MXP1PH.$$,8/@&#"-Y1A"G^4`8*#C'("-Y0<`H.$8L)WET>__ZS8PH.,$`I_E +M!A"@X0@PA>6L@*#C_O__Z_0QG^4&D8/@!("%Y=`@V>'0,-OAY`&?Y0,P@N`` +M,(7ET##;X=`0V>$#$('@<1#OYO[__^L!,*#C(#"-Y2`PG>4``%/C`2!#XB`@ +MC>7Z__\:`8"(X@&PB^*P`%CC`9")XNC__QJ8`9_E"#"-Y?[__^L6(*#C"""% +MY0`@E.4(,)WE`@!2XP8``!H#`%?C!!"4E0`@D943(,.7)""-E0`@@94%``#J +M!""4Y0`0DN4D$(WE)##-Y20PG>4`,(+E#!"=Y0H`H.$0()WE`,#@XQ0PG>4` +MP(WE"_G_ZP`0H.,`D*#A"@"@X?[__^L!`'GC`P``"@4`5N,'0*#A%0``F@H` +M`.H!8(;B"@!6X[/__QH<@)WE\`"?Y0@0H.'^___K``!8XP&`2!*I__\:!T"@ +MX;PPG^42,-/E#0!3XP0@H(,"(*"3`S!BX`,`6>$!```Z"@"@X8KO_^L$`*#A +M=.__ZY`0G^6L,*#C`0"@XP01@>`V(*#C"""%Y00PA>70(-'A`""%Y2``C>4@ +M()WE``!2XP'`0N(@P(WE^O__&@$P@^(!$('BL`!3X_+__QI`,)_E%A"@XP@0 +MA>4`$)/E`@!1XP00DQ4`,)$5$C#'%P0``!H#`%3C!!"3E0`PD942,,.7```` +MB@`P@>4)`*#A+-"-XO"/O>@`````4`$``,4!```L`0``>````(````#D`0`` +M[)BMP2P'((EU=GAY.CP```$````"````!``` +M``0````(````!`````0````(````$````"````!`````"````!`````@```` +M0````(```````0``0````(```````0````(````!`````0````+W^/?W]_CY +M^0KW^??W^/G[^PKX^OCX^?K\_`KY^_GY^OO]_0KZ_/KZ^_S^_@K[_?O[_/W_ +M_PK\_OS\_?X```K\__W\_O\!`0K\`/[\_P`"`@K_`?__``$#`PH`!````00$ +M!`H!`P`!`@,%!0H"!``"`P0&!@H"!0$"!`4'!PH"!@("!08("`H#!P,#!@<) +M"0H$"`0$!P@,"@H%"04%"`D-"PH&"@8&"0H.#`H````"```#!00`!@@&``@+ +M"``*#@H`_OOZ`/SV]0#Y\N\`]N[J``#IY`>Q`8&PL%^$`````):R`8&PL*\! +M``````````"PL+"`$````+"PL(`@````L+"P@&0```"PL+"`D````+"PL(`, +M`0``L+"P@"0!``"PL+"`=`$``+"PJ(#P`0``L+"L@,0"``"PL*J`4`,``+"P +ML(#<`P``K`^Q@#P&``"L#[&`[`<``+"K!(!L"0``J`.Q@$P*``"K![&`F`H` +M`+"PKX#<"P``L+"P@,0,``"PL*B`!`X```````#T#@``L+"P@/@.``"PL+"` +M_`X``+"PK(!X#P``L%^$@/`/``"J/P6`0!```+"PL(!($```L+"P@%`0``"P +ML+"`5!```+"PL(!D$```L+"P@'00``"PL+"`A!```+"PK(`L$0``L+"H@%@1 +M``"O![&`5!(``+"PK("L$P``L+"P@+`3``"PL+"`M!,``+"PKH!$%0``L+"J +M@)`5``"PL*B`I!4``+"PJ("X%0``L+"H@-05``"PL*J`-!<``+"PL(`X%P`` +ML+"P@$`7``"N`[&`3!D``+"O!(#T&@``K@^Q@&P=``"J`[&`:!X``+"PK("` +M'P``L*\*@`0B``"PKQ"`_"8``+"O$H`P+P``L*\$@(0P``"PKPJ`A#,``*P# +ML8"`-```#````)@]``"PKPJ`"$$``+"O"H!\3@,$504)!RTL>S@7#1<10U)5 +M7T%03$Q?0T]..B`E>`H`07)M4&QL.B`E9"!-2'H*`$-255]#3$M314PP7T-/ +M3CH@)7@*`$%H8D-L:SH@)60@34AZ"@!!2$(@/25D($U(>@`\-3Y(>6YI>$=E +M=%)E8612971R>41E9F%U;'0@5F%L=64@.B``/#4^("5X(``\-3X*`$%C8V5S +M`H`9T9L87-H26YF;RYS>7-);F9O+G-Y"P@97)R;W(@8FET +M/25D"@`\-3YE2!E`H`1FQA`H`1FQA'1A +M8@`N&ED>``N``#H!@``#0````$````$ +M````"````"4````!`````P`````````T1```5`$`````````````!``````` +M```K````"`````,`````````B$4``/0*``````````````0`````````,``` +M``$````"`````````(A%```8```````````````$`````````#\````!``!P +M@@````````"@10``V`$```$`````````!``````````[````"0`````````` +M````4&4``/@!```-````!@````0````(````2@````$````"`````````'A' +M```0```````````````$`````````%(````!````,@````````"(1P```P(` +M`````````````0````$```!A`````0``````````````BTD``!(````````` +M``````$`````````:@````,``'```````````)U)```K```````````````! +M`````````!$````#``````````````#(20``>@```````````````0`````` +M```!`````@``````````````G$P``+`,```.````@@````0````0````"0`` +M``,``````````````$Q9```;!0`````````````!```````````````````` +M```````````!```````````````$`/'_`````````````````P`!```````` +M``````````,``P`````````````````#``0`"0`````````````````!``P` +M```,`````````````0`````````````````#``4``````````````````P`& +M``D````0`````````````0`,````'`````````````$`"0```"`````````` +M```!``P```!<`````````````0`)````9`````````````$`#````(P````` +M```````!``D```"0`````````````0`,````"`$```````````$`"0````P! +M```````````!``P````@`0```````````0`/````)`$``%`````"``$`"0`` +M`"0!```````````!``P```!P`0```````````0`7````=`$``'P````"``$` +M"0```'0!```````````!``P```#L`0```````````0`G````\`$``-0````" +M``$`"0```/`!```````````!``P```#``@```````````0`Z````Q`(``(P` +M```"``$`"0```,0"```````````!``P```!,`P```````````0!+````4`,` +M`(P````"``$`"0```%`#```````````!``P```#8`P```````````0!;```` +MW`,``&`"```"``$`"0```-P#```````````!``P````X!@```````````0!H +M````/`8``+`!```"``$`"0```#P&```````````!``P```#H!P`````````` +M`0!U````[`<``(`!```"``$`"0```.P'```````````!``P```!H"0`````` +M`````0"(````;`D``.`````"``$`"0```&P)```````````!``P```!("@`` +M`````````0`)````3`H```````````$`F````)@*``!$`0```@`!``D```"8 +M"@```````````0`,````V`L```````````$`"0```-P+```````````!``P` +M``"L#````````````0`)````Q`P```````````$`#``````.```````````! +M``D````$#@```````````0`,````\`X```````````$`"0```/0.```````` +M```!``D```#X#@```````````0`)````_`X```````````$`"0```'@/```` +M```````!``D```#P#P```````````0`,````/!````````````$`"0```$`0 +M```````````!``D```!($````````````0`)````4!````````````$`"0`` +M`%00```````````!``P```!@$````````````0`)````9!````````````$` +M#````'`0```````````!``D```!T$````````````0`,````@!`````````` +M``$`"0```(00```````````!``P````<$0```````````0`)````+!$````` +M``````$`#````%`1```````````!``D```!8$0```````````0`,````0!(` +M``````````$`"0```%02```````````!``P```"<$P```````````0`)```` +MK!,```````````$`"0```+`3```````````!`*@```"T$P``D`$```(``0`) +M````M!,```````````$`#````#P5```````````!``D```!$%0`````````` +M`0`,````C!4```````````$`"0```)`5```````````!``D```"D%0`````` +M`````0`)````N!4```````````$`"0```-05```````````!``P````H%P`` +M`````````0`)````-!<```````````$`"0```#@7```````````!``D```!` +M%P```````````0`,````1!D```````````$`"0```$P9```````````!``P` +M``#L&@```````````0`)````]!H```````````$`#````&0=```````````! +M``D```!L'0```````````0`,````9!X```````````$`M0```&@>```8`0`` +M`@`!``D```!H'@```````````0`,````?!\```````````$`"0```(`?```` +M```````!``P```#X(0```````````0`)````!"(```````````$`#````.@F +M```````````!`,P```#\)@``-`@```(``0`)````_"8```````````$`#``` +M`"`O```````````!``D````P+P```````````0`,````=#````````````$` +M"0```(0P```````````!``P```"`,P```````````0`)````A#,````````` +M``$`#````'0T```````````!``D```"`-````````````0`,````<#T````` +M``````$`"0```)@]```````````!``P`````00```````````0`)````"$$` +M``````````$`#````.1#```````````!``````````````````,`"`#:```` +M`````!`````!``@`#``````````````````(``````````````````,`"0`, +M``````````````````,``````````````````P`*``````````````````,` +M"P#F`````````!`````2``$`]P``````````````$`````X!```0````$``` +M`!(``0`>`0``(````$0````2``$`+@$``&0````L````$@`!`#X!``"0```` +M?````!(``0!%`0``#`$``!@````2``$`3@$`````````````$````%\!```` +M`````````!````!M`0``3`H``$P````2``$`@@$``-P+``#H````$@`!`(\! +M``#$#```0`$``!(``0"F`0``!`X``/`````2``$`OP$`````````````$``` +M`-8!``#T#@``!````!(``0#G`0``^`X```0````2``$`\@$``/P.``!\```` +M$@`!``0"``!X#P``>````!(``0`4`@``\`\``%`````2``$`*`(``$`0```( +M````$@`!`#4"``!($```"````!(``0!$`@``4!````0````2``$`5`(````` +M````````$````&D"``!4$```$````!(``0"&`@`````````````0````C@(` +M`&00```0````$@`!`)H"``!T$```$````!(``0"S`@``A!```*@````2``$` +MO0(`````````````$````,0"```L$0``+````!(``0#,`@``6!$``/P````2 +M``$`Y0(``%02``!8`0``$@`!`/0"``"L$P``!````!(``0#_`@`````````` +M```0````!@,``+`3```$````$@`!`!$#`````````````!`````8`P``1!4` +M`$P````2``$`*@,``)`5```4````$@`!`#P#``"D%0``%````!(``0!,`P`` +MN!4``!P````2``$`5P,`````````````$````%X#``#4%0``8`$``!(``0!L +M`P``-!<```0````2``$`=0,`````````````$````'L#```X%P``"````!(` +M`0"&`P`````````````0````D`,``$`7```,`@``$@`!`)X#```````````` +M`!````"R`P`````````````0````P0,`````````````$````,X#``!,&0`` +MJ`$``!(``0#G`P``]!H``'@"```2``$`]P,``&P=``#\````$@`!``,$``"` +M'P``A`(``!(``0`6!```!"(``/@$```2``$`*`0``#`O``!4`0``$@`!`#H$ +M`````````````!````!*!```A#`````#```2``$`6`0`````````````$``` +M`&8$``"$,P``_````!(``0!V!```@#0``!@)```2``$`@`0```A!``#X`@`` +M$@`!`)$$``"8/0``<`,``!(``0"D!`````````@````1``,`M00```@````8 +M````$0`#`,`$```@````8````!$``P#+!```+`$``"@````1``,`U00``(`` +M``"K````$0`#`-X$``#0````@````!$`!`#K!````````-`````1``0`]@0` +M`&`)``"4`0``$0`$``,%``!@`0````@``!$`!``.!0``4`$``!`````1``0` +M`&9L87-H+F,`)&$`)&0`1FQA7!A7-00!&;&%S:$-M9$EN:70`0G5I;&1& +M;&%S:$QS8E!A9V5486)L90!&;&%S:%-E=%)E8612971R>41E9F%U;'0`7U]A +M96%B:5]U;G=I;F1?8W!P7W!R,0!&;&%S:%AF97)#;VUP25-2`$9L87-H4D)) +M4U(`3D%.1%]20S1?2V5Y4V5T=7``3D%.1%]20S1?0VEP:&5R`$=E=$ED8FQO +M8VM$871A3F]28S0`1FQA5=R:71E0V%C:&5%;@!&5$Q?34-026YI=%]7 +M:71H;W5T4&%G95)E;6%P`$9T;$EN:70`1E1,7TU#4$EN:70`1E1,26YI=%]7 +M:71H;W5T4&%G95)E;6%P`$=E=$%(0D-,2P!P6YI +M>$=E=%)E8612971R>41E9F%U;'0`1FQA0!M96UC<'D`1V5T261";&]C:U-Y0!R:TYA;F1?8V]N9%]R97-C:&5D +M`$9L87-H4')O9T5R``#$$```'(H``-00```< +MG@``Y!```!R>````$0``'(H``!`1`````#P$0``')X``$`2```"!```1!(```)^``!($@`` +M`@0``$P2```"?@``4!(```)^``!<$@``'(H``'P2`````"@ +M$@``')X``+P2`````!`*0``'+```/@I``````@+P```@0``"0O```" +M?@``*"\```)^```L+P```GX``'@O`````#\+P``')X``#@P +M```#D``!RY``#\.0``'+D``%@Z`````!@0@``')X``-A"`````#D0P```@0``.A#```"!```[$,```)^``#P0P```@,``/1#```"?@`` +M^$,```)^``#\0P```GX````````J`@````````"#```(````*@(``!`````J +M`@``&````"H"```@````*@(``"@````J`@``,````"H"```X````*@(``$`` +M```J`@``2````"H"``!0````*@(``%@````J`@``8````"H"``!H````*@(` +M`'`````J`@``>````"H"``"`````*@(``(@````J`@``D````"H"``"8```` +M*@(``)@`````CP``G````"H'``"@````*@(``*@````J`@``L````"H"``"X +M````*@(``,`````J`@``R````"H"``#0````*@(``-@````J`@``X````"H" +M``#H````*@(``/`````J`@``^````"H"`````0``*@(```@!```J`@``$`$` +M`"H"```8`0``*@(``"`!```J`@``*`$``"H"```P`0``*@(``#@!```J`@`` +M0`$``"H"``!(`0``*@(``%`!```J`@``6`$``"H"``!@`0``*@(``&@!```J +M`@``<`$``"H"``!X`0``*@(``(`!```J`@``B`$``"H"``"0`0``*@(``)@! +M```J`@``H`$``"H"``"H`0``*@(``+`!```J`@``N`$``"H"``#``0``*@(` +9`,0!```J!P``R`$``"H"``#0`0``*@(````` +` +end diff --git a/drivers/mtd/rknand/ftl.uu b/drivers/mtd/rknand/ftl.uu new file mode 100755 index 000000000000..2ce1701dd783 --- /dev/null +++ b/drivers/mtd/rknand/ftl.uu @@ -0,0 +1,837 @@ +begin 644 ftl.o +M?T5,1@$!`0````````````$`*``!```````````````X9P``````!30````` +M`"@`#P`,`#@PG^6R(]/A``!2X0``H),>_R^1``!1XT@@DQ6`,*`1@`"@X;,0 +MDA$!$($2LQ""$0@PG^5(,)/EL`"3X1[_+^$`````3#"?Y;(CT^$``%+A'O\O +MD4@@D^6``*#A_\\/XPP`4>$`$*`#L!""X;H!T^$@()/E`0!0X;H1PS$"(('@ +M(""#Y0PPG^6X(=/A`0!2X;@1PX$>_R_A`````-0PG^7W3RWIOB'3X;P1T^$" +M((#@`0"`X'(@_^:^(4`,*#C +M`4"$XH$?@>*!$(7@LA#1X0L`4>&!$*#AL3"2,0@`4^&V,)6A`3"#HK8PA:%T +M,/_F"@"$X`D`4^$'$*#AZ___.OZ/O>@`````<$`MZ5!`G^4!4*#A`2"@XS@P +ME.6T$]3A`3"#XB0@A.4#`*#A.#"$Y?[__^L@,:#A/`"$Y0`@@^```&/@`@!5 +MX0`@H(,D((2%``!5X0(@H#,$,)\U)""#-7"`O>@`````!#"?Y;@"P^$>_R_A +M`````/!!+>E<4)_E`$"@X0$`H.$"@*#ANG#5X0<0H.'^___KNX0$`H.$& +M$*#A_O__ZP<0H.$`4*#A"`"@X?[__^L!`*#A!A"@X?[__^L8,)3E``!5X850 +MH.&U`(/A`3"@$Q0PQ!7P@;WH`````![_+^$``*#C'O\OX0``H.,>_R_A``"@ +MXQ[_+^$>_R_A`0!0XU0PGP68`),%'O\O`4@PGS64`),U'O\O,0(`4.,$```* +M_P!0XP``H!,`,*`#'O\O$0,``.H@()_EE#"2Y9@`DN4#,(#@%""?Y;`!TN&Z +M(-+AD`(`X```8^`>_R_A````````````(*#C,#"?Y3`0G^4"`*#A`<""X@P@ +M0^4$$`/E`AJ!XGP@_^8+`$/E$`!2XQ```^44,(/B]?__&A[_+^&HGP``X"`! +M`&PPG^4`(*#C\$`MZ0-0H.$(,-/E`L"@X0-`@.``,&/@`1"$X`)@A>`4((+B +MGPR&X@!PH.&=`(#BE'"'X@!`T.4``%3C!P``"@!PE^4#`%?A!```.I]LAN(! +M`%?AG&"&X@#`P)4`P,:5!0U2X^S__QKP@+WH`````/!/+>G84)_E'-!-X@!@ +MH.$`H.#C"("-XKAPU>&Z`-7A!Q"@X?[__^L((*#A`3"@XP`0H.,`H(WE"@"` +MX'!`_^9T`+_FEV`@X/[__^NX,-WA_R\/XP(`4^$9```:")"@X06PH.$#@*#A +M`'"@XPL``.K54._GN,#;X0"@C>5U`+_FG&`@X/[__^NX(-WA`3"%X@@`4N$! +M0$4"W__SH#`%#AU#`*(P`0X",$()\E`Q"")_R!O>@`````V#"?Y?!/+>G4 +M<)_EN%#3X47?3>*TA-/ALB33X4AP@^68!0;@NA#3X08`4N$H``"Z`0!2X28` +M`(JPE-/A`F!FX`!`H..%I*#A=F#_YA"PC>*9`0G@=<#OYA,``.H`X*#C#,"- +MY0#@C>7^___KL"'=X5H5"N,%8(;@`3"$X@$`4N$,P)WE=F#_Y@(``!JP(MWA +M!`!2X0,```H$$*#A1`"?Y?[__^L'``#J@`````X"`#```` +M`````*#C_O__Z@``G^7^___J3D%.1'PPG^4`(*#C\$5!;(;B +M"W!%Y1!P!>7^___K!#"*X`%`A.(G.X/B(`!4X^XP@^(44(7B`(##Y>[__QH, +M()_E#CT)XP`0X.,#$,+G\(>]Z``````HG0``X"`$```PH.,T()_E-`"?Y0,0 +MH.'#P*#A`3R#X@(*4^,4$,+E#,&`X!C`@N4<((+B]___&@P`G^7_$*#C`BF@ +MX_[__^J`````X$`,`'!`+>ET0)_E`!"@XS@@H.,4`(3B`%#@X_[__^M@,)_E +M0."@X[[AQ.&^X-3A`,"@XPP0H.$"*:#C`P"@X;K!Q.&RX\3A`<",XD@PA.4D +MP(3EM,'$X;A1Q.'^___KN!#4X;X`U.$%,('@LE3$X;!4Q.$@!(/@_O__Z[0$ +MQ.%P@+WH`````.`@`P!P0"WI+$"?Y=10"N,,$`CC!0"$X/[__^O8(`KC`#"@ +MXP(PA.<$((+B`C"$YP`PX.,%,(3G<("]Z``````(`9_E<$`MZ01!G^40(-#E +M`%"@XQ@0D.6\.=#A`%#$Y9$"`>"\,,3A0CZ@X[8PQ.$5,-#E`5#$Y2@`D.6X +M,,3A<1#_YKH0Q.'^___K`C0`XP40H.&S4(3A`C"#XK-0A.$",(/BLU"$X0(P +M@^*S4(3A`3N@XW`@_^:^(,3AE`"?Y:(BH.$!"U+C`2N@(X``4N.`(*`SLR"$ +MX8!`A.*"(*#A_O__ZP4PH.$!((7B$%#$Y1$PQ.4<0(3B/X__\: +M9O__Z_[__^L`(*#C1#"?Y0(`H.%`$)_E`<""X@P@0^4$$`/E`AJ!XGP@_^8+ +M`$/E$`!2XQ```^44,(/B]?__&O[__^MP0+WH>/__Z@``````````"@0``*B? +M``#@(`$`\$\MZ1!1G^44T$WB`'"@X0)@H.&ZD-7A`!"-Y0D0H.$$,(WE_O__ +MZW"`_^:9"`/@`P!7X0!`H!,O```:(#"5Y06@H.$`0*#C#+"-X@$P@^(@,(7E +MLB/:X8@PH.$`4*#C"`!2X04``)I(()KELQ"2X0$0@>*S$(+A2"":Y;-0DN$+ +M$*#A!P"@X?[__^L``%#C#0``"@<0H.&``)_E_O__ZPPPG>4)$*#A`P!7X0,` +MH.$#0*#A`W"@X0!`X`,3```*_O__ZW"`_^;A___J2#"?Y;HAT^$%`%+ANE'# +M,0``5N,%```*L##6X0\*4^,"```*\@Q3X[!7QN&PA,8!!P"@X0`0G>4&(*#A +M!#"=Y?[__^L$`*#A%-"-XO"/O>@`````'````/!/+>D4=)_EXCP(X^!L".,` +MP*#C2=]-XK/`A^$D/0GC`!"@XP@@H.,#4)?G`CN@X^P#G^6V,(?A`##@X[I` +MU^$%@*#A'#&-Y1@QC>7^___KMB"7X?\0H./(`Y_E`6"@X010H.&"(*#A_O__ +MZ[R@U^&:!`G@(@``Z@#`H.,`P(WE_O__ZP$PA^(``%#C"@``&K@AW>$!,(;B +M#PI2XQ,``!H``%3C$@Z-XG-@[P9V,*_F`S&`X`BP`^4"``#J$#0(3@!0!4X0FPA.`($*#A"P"@X1@@C>(!,*#CX?__.G8P +MK^8%D(G@``!3XP<``,H!H(KB%".?Y;PPTN$R,(/B`P!:X0!PH#,'0*`Q[/__ +M.G9@K^8``Y_E!A"@X05`H.'^___K`0!VXPA0H.$#```:Z`*?Y?[__^L&`*#A +ML0``ZABAG>4$$*#A"@"@X?[__^L<89WE!@"@X0%PH.$$$*#A_O__ZP$`5^$! +M@*#A!0``"@$`=N,#```*`0!ZXP(```H!`%?A````F@I@H.$%$*#A&""-X@@P +MH.,&`*#A`,#@XP#`C>7^___K=!*?Y1+.C>*XY-WAN*7=X;$0G.&XEMWAN+?= +MX;C(W>&X(MWAN#/=X5`"G^4`X(WE!*"-Y0B0C>4,L(WE$,"-Y?[__^L(`%?A +M)```"@00H.$&`*#A_O__Z[@5W>&X)MWAE`$#X`$`4.$<,8T%&#&-%90"`@#L +M,9_EE`("$!@AC04<(8T5O"#3X0(`4>$"```ZN#;=X0(`4^$!```JX`&?Y5@` +M`.K<`9_E&&"-XO[__^L%$*#A!B"@X0`PH.,8`9WE_O__ZP8@H.$<`9WE!1"@ +MX0`PH./^___K``"@X_[__^N`,9_EZAP(X[C'W>'B#`CCN"/=X?_G`..QP(/A +M`A"!XKC(W>&R(&P((/AX"P(X[00P^$` +M$*#CLB"3X04``.JW8)7A#`!6X0D```JP8)/A`6"&XK!@@^$.`%+A@7"@X0)@ +MH)$":Z"#!@!1X0$0@>+R__\Z@B"@X040H.$""U+C`BN@H_``G^7^___K&&&= +MY1QQG>4$$*#AU%"?Y0<`5N$&`*`Q!P"@(?[__^OF/`CC!!"@X;,`A>$'`%;A +M!@"@(0<`H#'^___KZ#P(XP00H.&S`(7A!@"@X?[__^NT,-7A(R2@X00`4N/D +M+`CCLA"%X0,0H!&<`)\50BZ@$P0``!JP$=7AOB#5X0(`4>$"```ZA`"?Y?[_ +M_^L2``#JH@!1X00``"IP`)_E_O__Z[XPU>$C,4/@L#'%X31`G^7B7`CC6`"? +MY;40E.'^___KOB#4X;4PE.$B`E/A``"@DP(``)H\`)_E_O__ZP``X.-)WXWB +M\(^]Z`````#FC```[HP``#\```!9````^/[__VT```"?````3D%.1,X```#Y +M````,P$``$L!``#P3RWI?*&?Y>H\".,`@*#AH]]-X@&0H.&S4)KA`K"@X;I@ +MVN&6!07@!0"@X2C]_^M4,9_E`P!8X7!PO^8,```:`BR-X@!`H./S/*#C!P"@ +MX;@PPN$&$*#A"$"-Y0Q`C>400(WE_O__ZP0PH.&"+XWB#0``ZA1!G^4$`%CA +M#@``&@(LC>+S/*#C!P"@X080H.&X,,+A"("-Y0R0C>40L(WE_O__ZX(OC>(` +M,*#C!0"!X`@0C>+^___K,```ZM`PG^4`(%?B`2"@$P,`6.$`(*`3``!2XP*` +MH.$H```*N`#:X0B0C>*"KXWB`3"@XP4`8.`)$*#A"B"@X0<`@.``P.#C`,"- +MY?[__^L(,)WE!`!3X1H``!H"/(WBN(#3X?,,6.,6```:`$"@XV@`G^7^___K +M!#"@X08@H.$0$)WE#`"=Y?[__^L"+(WB!P"@X080H.&X@,+A"$"-Y0Q`C>40 +M0(WE_O__ZPH@H.$$,*#A!0"!X`D0H.'^___K!`"@X?[__^NCWXWB\(^]Z``` +M`````%-5$1%352(B4U5.04Y$:#&?Y>(<"./P12WI`""@X;$`D^$"$$'BA-!- +MXKI0T^&Q$)/A``!1X0`0H(,#``"*3```ZK#`W.$"`%SA20``"H'`@^```%'A +M(\N,X@$0@>+NP(SB%$&?Y?7__SI&#(#BXCP(XW0`@.+FK`CCLQ"4X>B,"..` +MP(3@ZNP(X^1\"./L`)_EMB#,X>PL"..RP=3A#6"@X;(@E.&^X)3AL,+-X;`G +MS>$!(('BLR"$X;0PU.&ZP)3AL.;-X;`QS>$`,*#CL#/-X;@PE.&PQ,WAL#7- +MX0\ZH..P,,WA_O__Z[?`E.&Z`)3A!0!@`````3D%.1.Z,```00"WI+`"? +MY201".,`(*#C_O__ZR`PG^4``%#C$`2#Y0`PH!,T,(`5/#"`%0PPGQ4X,(`5 +M$("]Z&T!``#0O`P`````````4N/P02WI`W"@X0!0H.$!,*#C`$"@$0`P@>5; +M```:?!&?Y7PAG^7^___K>$&?Y0!@A>!T`9_E_O__Z[@@U.%L$9_E!@"@X?[_ +M_^NZ(-3A8!&?Y0!@AN`&`*#A_O__Z[`AU.%0$9_E`&"&X`8`H.'^___KLB'4 +MX4`1G^4`8(;@!@"@X?[__^L(-`#C,!&?Y;,@E.$`8(;@!@"@X?[__^L&-`#C +M'!&?Y;,@E.$`8(;@!@"@X?[__^L@()3E"!&?Y0!@AN`&`*#A_O__ZRP@E.7X +M$)_E`&"&X`8`H.'^___KNB'4X>@0G^4`8(;@!@"@X?[__^NX(=3AV!"?Y0!@ +MAN`&`*#A_O__Z[XAU.'($)_E`&"&X`8`H.'^___KO"'4X;@0G^4`8(;@!@"@ +MX?[__^NT$]3A`&"&X"``E.7^___KG!"?Y0`@H.$&`*#A_O__ZUP@E.6,$)_E +M`&"&X`8`H.'^___K.""4Y7P0G^4`8(;@!@"@X?[__^L\()3E;!"?Y0!`AN`$ +M`*#A_O__ZP!`A.`$0&7@!P!4X00`H+$'`*"A\(&]Z'8!`````````````'H! +M``"0`0``H@$``+,!``#(`0``X`$``/,!```&`@``'@(``#,"``!-`@``9P(` +M`(8"``"E`@``OP(``,\"``#D`@``^$\MZ0@QG^4&)`#CLI"3X0``6>,\```* +M"!0`XR0@D^6Q<)/A`@!2XPF09^!Y*!0(3@LI#4X0L``.K^___K!0"@X0&@BN)ZH/_F@4^!X@@0H.'^___KA$"+ +MX($?@>*!$(O@LA#1X;(0Q.$&`%KA`5!%X@@0H.$!`(7B[O__.@``5^-$0)_E +M"#0``P)4`.,X()\%M0"4X;,0D@$!`(#B`1!!`K,0@@$&-`#C`1N@X[,@E.&Q +M$)3A`2!"XK,@A.'^___KM1"$X0D`H.'XC[WH`````&0QG^7P3RWI`$"@X;*S +MT^$4T$WB"P!0X0"`H"-((),U@#"@,;.`DC$&)`#C.#&?Y;)PD^$!*Z#CLJ"3 +MX0H`5^%'```*`B""XD@`D^4`8*#C`\"@X;(@D^$!D*#C#`"-Y090H.$(((WE +M$0``Z@3`C>7^___K!,"=Y0$PB>*!'X'B@1",X+(@T>$+`%+A@A"@X0,``"H, +M`)WEL1"0X0@`4>$```"*"5"@X0(`5.%SD/_F*P``"G8P_^8(()WE!P!3X0H0 +MH.$"`(;@`6"&XN;__SH(``#J_O__ZP%0A>)U4/_F@1^!XH$0B>"R,-'ALD#! +MX0-`H.$```#J;)"?Y0@PG>4'`%7A"A"@X5Q@G^4#`(7@[___.@14`.,!.Z#C +M!B0`XP%PA^*U`);ALQ"6X8$_@.*R<(;A`0"`XH,PAN"R0,/A_O__Z[XQUN$$ +M,$/B`P!8X0@T`*.S():AM1"&X0$@@J*S((:A%-"-XO"/O>@`````\4\MZ1Q! +MG^4(-`#C`2N@X[-0E.$",$/BLG"4X;.@E.$$,$/B!Q"@X;,PE.$*H&7@>J#S +MY@H`H.'^___K``!5XX$?@>*!$(3@LF#1X3(```JR,]3AS("?Y08`4^&&,*"! +M`#"@DT@@E(6S,)*!OB'8X0,`4N$!L$6"`%"@@PP``(HE``#J_O__ZP$`B>(! +M4(7B=5#_YH%/@>('$*#A_O__ZX1`B."!'X'B@1"(X+(0T>&R$,3A"P!5X0J0 +MA>`'$*#A"0"@X5Q`G^7M__^Z!%0`XP$;H.,(-`#C!B0`X[7`E.&Q`)3ALN"4 +MX0`0H.$``(S@L\"4X0'@3N(!`$#BLN"$X0$@3.*S((3A_O__ZP8`H.&U$(3A +M!-"-XO"/O>@$T(WB\$^]Z!/__^H`````B#"?Y084`.,00"WIM"'3X;$0D^$! +M`%+C""0`X[(@D^$8```:`2!BX'(@_^8/`%+C#P``B@`@T^4!`%+C#```&B0P +MD^4"`%/C`0``&J#__^L```#J_/[_ZS`PG^6^(=/ANA'3X0(`4>$!(*`CMB'# +M(0```.KT_O_K$#"?Y0$@H.,D((/E$("]Z!!`O>B0___J`````/!/+>GH0)_E +M_S\/XXS03>*P)-3A2'"4Y0,`4N&Z(-3ANX;2$U.$$((WE`P``&LW__^L` +M,*#CLC3$X;`$Q.&L0)_E!,"=Y;(TU.&8-B/@#`!3X04``-JP!-3A&___Z\'_ +M_^L`(*#CLB3$X;`$Q.%\,)_EAJ2@X03`G>4`4*#C`T"@X6R0G^6P--/A"+"- +MXIP#`^`$,(WE$0``ZK(4U.%4`)_EN%'-X0%0A>*XD,WA_O__Z[($U.$'$*#A +M!,"=Y0`PH.,+(*#A"G"'X```C.!U4/_F_O__Z[(TU.$#,(;@LC3$X0@`5>'K +M__\ZC-"-XO"/O>@`````6J7___8"``#P3RWIH$*?Y:303>*<`I_EL#'4X7\_ +M@^(#,(/BHS2@X10PC>7^___KU"P`XP`PH.,$P*#A`W"@X;(`E.$!$*#C`P`` +MZ@(AC.#,+)+E$202X'5P_Q9S(/_F'T`#X@``4N$!4(?B`3"#XJ(BH.'T__\Z +M``!7XXH```HL0I_EV%P`X[@0U.&U()3ANC#4X9$G(N`#`%+A"```NM9L`..V +MD)3A@QG^76+`#C`&"@XP&@ +MH.,#4*#AG&"-Y;(@D^'8C`#CNC#3X9A@C>62`P+@#""-Y20``.H$0)'E!``3 +MX1\```H&P(7@`T#$X;@@E>&,/-SEN`#5X0;L@^($0('EH\*@X:`0C>($X([B +M`B"`X`S!@>`?L`/BCN"%X+@QS>$(,!SE$( +M,`SE6`&?Y?[__^M4(9_EN`"5X0`PH.,,P)WE!A6"X!@@C>(``(S@_O__ZP%@ +MAN)V8/_FU.P`XZ82H.$S'H'B'S`&XKX@E>$"$('B&C.@X01!G^4&`%+A`1&% +MX,___XJX(-3A`7!'XM@\`..2!P?@LR"4X0<`4N$U```:NB#4X0!@H.,&4*#A +MD@D"X!`@C>4G``#JH!"-X@,1@>`,$(WE")`1Y0F`&^`?```:!G"$X`"`C>4# +M>X?B$,"=Y0QPA^(((*#AG!"?Y0(PH..P`-?A"9"+X0``C.#^___KV.P`X[C` +MU.$(,*#AOA"4X1@@C>*ZX-3A`<",X-8<`.,,@)WEL0"4X7S`_^98$)_E")`( +MY9#.(.#8[`#CL,#'X8Q5UH/_F +M`1"@XQ^P!>("`%KAJC*@X1&[H.'/__\ZI-"-XO"/O>@`````'`,``"P#``#> +M#```2#&?Y?!%+>D`8*#AL"'3X8S03>(!<*#A``!2X0``H)-%``":U!P`XP,` +MH.&FA*#A`""@X[$PD^$"``#JC!S1Y0$`6.$E```*"5X;H`U>$$4(7@M,#3X0(PH..$$)_E`*"-Y005@>">P"#@_O__ZXR, +MQ>6&:Z#A9#"?Y0``5^.F:Z#AA&2&X&9NAN(,8(;BAF"#X+8`UN$,```*OB#3 +MX0<`4N$)``":I"*@X0$0H.,S+H+B'T`$X@(@@N*V<,;A`C&#X`0@D^411(+A +M!$"#Y8S0C>+PA;WH_O__ZP!`H./1___J`````-X,``#P02WI`&"@X0!`H.,\ +M4)_E!P``ZO[__^NZ$-7A`'"@X08`H.'^___K``!7X04```H!0(3BL#'5X70` +M_^8`$*#C`P!4X?+__SH$`*#A\(&]Z`````#P3RWIS&&?Y9303>(`0*#AQ`&? +MY0@0C>4$$*#A#""-Y;I0UN'^___K`##6Y0``4^-E```*(#_YB``6./B__\:]#"?Y0!@H.,#D*#A6*"3Y08``.JXL-/A +M_O__ZP%@AN)V8/_F``!;X;!PR`$&```*+#"&X@H`5N$$`*#A!1"@X8,PB>`( +M@(/B\?__.@@PG>65!P;@``!3XQX```H$`*#A!1"@X?[__^L`D*#C$*"-X@@P +MH.,*(*#A`)"-Y0&`H.$$L&'@"P"@X0D0H.'^___K!A"@X0HPH.$+`*#A>"#_ +MYK!US>'^___K##"=Y0A@AN`)`%/A!P``"@DPH.$&`*#A"!"=Y0H@H.'^___K +M*#"?Y;@PT^$#8(;@!`"@X040H.'^___K!D"@X7``_^8S_/_K!`"@X930C>+P +MC[WH`````%,#``"`````*#&?Y?!'+>D!<*#ANF#3X0"@H.$&$*#A_O__ZPH` +MH.%Q4/_F!A"@X?[__^L`$*#C<(#_Y@@`H.'^___K``!0XP!`H.$`D*#A#``` +M&O/]_^L`0*#A"`"@X000H.'^___K"1"@X0@`H.'^___K"A"@X00@H.$`,*#A +MM`"?Y?[__^L``%?CEE0DX"8```JD@)_EV7](XA$PU^4&$*#A``!3XQT```H` +M`)?E_O__ZP80H.$`H*#A!`"@X?[__^L``%KA%0``&F0PG^4%`*#ANX080 +MH.'^___K&#"7Y7``_^:``*#AL("3X?\_#^,#`%CA"$"7!01`A0`*```*!0"@ +MX080H.'^___K<1#_Y@%09>"66";@!D"$X`(``.H(`%?A''"'XMK__QH$`*#A +M\(>]Z`````!Q`P``Y`,``(PPG^4`$*#C\$$MZ9Q`@^*Z8-/A_O__ZWAPG^4` +M4*#A"S!4Y0``4^,2```*"#!4Y080H.$%`*#A``!3XP<```K^___K!A"@X0"` +MH.$<`!3E_O__ZP``6.$&```:"@``ZAPP%.4%`%/A`@``&A@P%.4#`%7A!``` +M.AQ`A.('`%3AYO__&@``H./P@;WH`0"@X_"!O>@`````'`0``+0PG^7P3RWI +M`Z"@X8S03>*Z,-/A"("-X@!PH.$!8*#A`E"@X0@`H.'_$*#C@""@XP0PC>4` +M0*#C_O__ZQ8``.K^___K=#"?Y000G>6X,,WA`#"@X[@QS>$`L*#A"0"@X?[_ +M_^L!,*#CN#?-X;@"S>%,`)_E_O__ZX04A>``,*#C"""@X0L`H.'^___K``"@ +MX_[__^NX,-KA`T"$X`8`5.$'D(3@`1"@XPD`H.'C__\Z``"@XXS0C>+PC[WH +M``````#R__].04Y$1#2?Y?!/+>E'WTWBNF#3X0-`H.$0`(WE`("@XP80H.$& +M<*#A_O__ZP@0H.%P`/_F%`"-Y0@`H.'^___K`%"@X;L``.H(`*#A`!"@X_[_ +M_^L%`%#A`*"@(P&@H#,`,&7@`0!3XPHPH)$!,(J#`&"@X0``4^.J```*T`.? +MY040H.'^___K``!:XP@```H`H*#C.OW_ZP&@BN)ZH/_F!0!0X0$``(H4`%KC +M^/__&@!@H.'B+`CC`5"%XK(`E.&2``#JL!#1X0(P@^(!`%7AC0``"@,0A.`! +MP(+B``!2X2,;@>+N$('B?"#_YO3__SH%`%;AA```"M:L`.-4`Y_E!1"@X?[_ +M_^NZ,)3A!0!3X0@``!H:_?_KV"P`XP`PH..R()3A`,"@X;K`A.&7``'@EP4` +MX/[__^L&-`#C!L"@X0"@H..SL)3A!#!#XK.0E.$!.Z#CLS"4X0-@H.$-``#J +M","-Y?[__^L(P)WE@1^!XH$0A.`"(('BLA#1X04`4>$$```:#&"@X;#`PN&P +M`=3A`#"@XQ$``.IZ(/_F"0"*X`L`4N$&$*#A`:"*XNO__SH,8*#A]/__ZK`@ +MTN$!,(/B`@!5X04``!IF/H'B?,*?Y0PP@^*#,(S@MF##X08``.IS$/_F@R"$ +MX```4>'-+H+B#B""X@,0H.'N__\Z6""4Y0\`4N,`,*"3!P``F@0``.JX`-'A +M"!"!X@4`4.$"```:L&#!X3"BG^4&``#J+!"#X@$`@^("`%/A@1"$X'`P_^;R +M__^:]O__ZA$PVN4'$*#A``!3XP4```H(`)KE_O__ZP``5>$`(*`#$2#*!0,` +M``KH,9_E`P!:X1R@BN+Q__\:O#34X040H.$8H(WB"`"@X04`4^&\9,0!EP8& +MX`#`H`,`(*`#OL3$`5`@A`7^___K"B"@X08`H.$`$*#C"#"@XP#`X.,`P(WE +M_O__Z[C"W>'R[*#CEP4!X`'`C.(!4*#CN,+-X;A8S>'_P.#C1E^-X@8`H.$* +M,*#A!R"@X;S@A>&X@\WA_O__ZP<``.H!4(7B=5#_Y@Q0C>4&`%7A`#"@DP,@ +MH)%J__^:#&"-Y0&`B.(,4)WE>(#_YA3`G>4,`%CA0/__.A`@G>4!$*#C$+&? +MY0=@H.$!D$+B\*"?Y0D`H.$+<*#A_O__ZP`0H.,!4*#A`8"@X9Q`BN*D`(OE +M"0"@X?[__^L&$*#A_O__Z[(SVN$&$*#A`9"`XA``G>5YD/_FL)/*X0,P:>"T +M,\KA_O__ZPD0H.&V`\KAJ`"?Y?[__^L+,%3E``!3XQ,```H<`!3EI#"7Y0,` +M4.$/``"*"X!$Y10@%.6D,)?E`P!2X0H``)H&$*#A_O__ZP40H.$`(*#A9`"? +MY?[__^L4`!3E!A"@X?[__^MP`/_FLOO_ZP%0A>(<0(3B(`!5X^3__QHP,)_E +M!A"@X:0`D^7^___K`!"@X2@`G^7^___K1]^-XO"/O>@`````K`,``,,#``"` +M````Y`,```````#C`P``$00``$,$````,9_E\$&`(*#AN!'8X4@PF(6R,).!`2"$X@,`4>$C```J +M!0!3X01PH)$#4*"1@`````>P0``&`QG^5P0"WI7$&?Y910D^4!,*#C +M``!5X[0QQ.$%```*`0!%X@`0H./^___KNA#4X?[__^L`4*#A+$&?Y0%0A>(@ +M,9_E=5#_YKH0U.&4`)/E_O__Z[(SU.$%$*#AL%/$X0-09>"T4\3A!%"@X;8# +MQ.'X`)_E_O__Z^(\"..PP]3ALP"4X0`PH..T(]3A@`"@X0(``.JP$-'A#`!1 +MX78@_R8#$(7@``!3X2,;@>(!8$+B[A"!X@(P@^*L0)_E]/__&K@1U.&Z,=3A +M0`"!XK0CQ.&\$<3A<"#_YKXAQ.$#`%+A#```*D!00^(@`)3EM!/4X750_^:^ +M,<3AO%'$X?[__^MP`/_F!0!0X0,PH#.3```P0`&@,;P!Q#%,,)_E`Q"@X;`C +MT^&",*#A"```ZD@`D>4#P(#@LP"0X0(P@^(``%#C`@``&KP!T>$``%#CL`#, +M$;(#T>$``%+A`2""XO+__SIP0+WH_O__Z@``````````J`0``#0QG^7P02WI +M`P!0X8#03>(`0*#A!```&B`AG^7&R<)7A!@!3X04``#KH`)_E_O__ZP`` +MH./^___K`!"@X[@0A>'4,)_E`P!4X08``!J\()_EW#P`X[,PDN$``%/C`0`` +M&O[__^O^___K/3N@X[`PS>&4,)_E`P!4X04``!J,()_E`#"@X[`PS>'@``%-5```` +M`,0$``!.04Y$$1%35>$$``#P02WI"3#0Y0!0H.$``%/C\(&]"&PRG^40+0GC +M9$*?Y0`0H.,"`)/G)!"#Y0``5>&Z8-/A`A"#!U@PE.4!`'/C!0``&E0PE.4! +M`'/C`3"#`E0PA`58,(0%60``"B1"G^54,)3E!@!3X5D``#H8`I_E_O__ZU@0 +ME.5<,)3E`""@XP\`4>-4((3E`3"#XEPPA.4I```:L`;4X0(PH.$"P(3@`>"# +MXIT(`P-SE``!X;#FS.$!`(/B4`(*#C`C"@X5@0E.6!$(3@L!;1X;P0Q>%><-3E5`"4Y?%\A^,,<([G$,"5 +MY;SEU.&6`2#@$!`$XP'@C.<0$('B$,"5Y0#@E>4!X(SG$!"!XA#`E>6RX-7A +M`>",YQ`0@>(0P)7E!."5Y0'@C.<0$('B$,"5Y;;@U>$!X(SG$!"!XA#`E>4! +M((SG$!"5Y0$I@>+^___K5#"4Y;@@U.$#,(+@5#"$Y?"!O>@```````!3512= +M``!S0"WI9`"?Y?[__^M@,)_E`2#3Y0``4N,$```*$"T)XP(`D^<``%#C```` +M"D[__^M``)_E`,"@XS3@G^4,$*#A#""@X0$PH..48)#EF%"0Y;!!WN$&8.#A +MN@#>X0;@9>``P(WEE.`@X/[__^M\@+WH$`4`````````````$$`MZ0!`4.(( +M```:*#"?Y0$@T^4``%+C!```"A`M">,"`)/G``!0XP````HO___K!#"?Y0%` +MP^40@+WH`````%0PG^400"WI%"33Y0$`4N,$```*%233Y3P`4N,!((+B%23# +MY08``)HP`)_E_O__ZR0@G^4`,*#C`P"@X14TPN7^___K$""?Y0$PH.,#`*#A +M%#3"Y1!`O>C^___JT+P,`",%``#P1RWI`$"@XXQ@G^4`4*#AB)"?Y12@H.,$ +M<*#A$(T)XP0PAN`G.X/BZ#"#X@8PT^6:DR/@`P!5X1(``!H$<(7E"#"6YP,` +M5>$(<(8'`0``"@4`H.'\_O_K"7#%Y00PAN`!0(3B)RN#X@(PH.'I((+B=$#_ +MYN@P@^(&(-+E(`!4XP8@P^7T__\:`4"$XG1`_^8?`%3CX?__FO"'O>@````` +M%)T``'!`+>E00)_E`%"@X0$PU.4``%/C`0``&G!`O>CA_O_J$&T)XP8`E.<% +M`%#A!```"@``4.,"```*VO[_ZP`PH.,&,(3G$""?Y1`]">,#$)+G``!1XP-0 +M@@=P@+WH`````&PPG^5S0"WI`2#3Y0``4N,$```*$"T)XP(`D^<``%#C```` +M"L?^_^M(`)_E_O__Z_[__^M``)_E-."?Y0#`H.,,$*#A`3"@XY1@D.4,(*#A +MF%"0Y;!!WN$&8.#AN@#>X0;@9>``P(WEE.`@X/[__^M\@+WH`````!$14U4` +M````\$$MZ7!!G^4"@*#A_S\/XX#03>(`8*#AO"34X0%PH.&Z4-3A`P!2X00` +M`!KS^?_K`#"@XU`PA.6^-,3AO`3$X31!G^6X(-3AOC34X0,P@N`%`%/A"``` +MVKP$U.%`^?_KYOG_ZP`PH..^-,3A4#"4Y0$P@^)0,(3EO`3$X?PPG^4#`%CA +M%0``&NQ`G^4`<*#C&!"6Y0!@H..P8LWA#2"@X;QDU.$`,*#CO@34X5#@E.7, +MP)_EE08@X%Y8Y^<,P(7AL'/-X;!TS>&P=&PX!2R.?G`S", +MX;`AS>&P,,WA_O__ZP40H.&P`LWA"`"6Y?[__^L8$);EO.34X0T@H.&P=,WA +M`#"@X[)QUN&^Q-3AL'7-X;Q@UN&P9LWA`&"@X[!GS>&P`\WAE@```````!350#U__\1$5-5>#*?Y?!/ +M+>D`0*#ANH#3X9S03>(!H*#AN!#3X0@`H.'^___K%%#4Y0``5>-P`/_F"`"- +MY8D```H``%KC`#"@XQ0PQ.4!```:B?G_ZP"@H.$*$*#AL@'4X?[__^L$,)3E +M'"*?Y00`H.$#,&C@"A"@X0`PA.4`4*#C??__ZY@*`N`(,)WE])&?Y0BPH.$! +M,$/B%#"-Y1`@C>5=``#J&#"4Y84@H.'_SP_CLA"3X0P`4>$%(*`1`7"@$P8` +M`!H1``#JM@"3X;S`D^$!`(#B#`!0X0@``!I^"' +MX@P`4N&`P*#A<"#_YO'__[JX8-GA`#"4Y98Q)N`X``#J`2"%X@&`H.-R(/_F +M#""-Y00``.J\$)/A_^\/XPX`4>$'```:<(#_Y@C@G>4!$(+B@L"@X0$`B.(. +M`%+A<2#_YO/__SJX8-GA``!5XP@PE.4(<*#AEC4FX"$``!H(,*#C!1"@X08` +MH.$8((WB`,#@XP#`C>7^___KN#+=X0(P@^)S,/_FN#+-X0$`4^,%```:N"'= +MX>0PG^4!((+B_R`"X@,P@N&X,4!<$CB +MN"#9X;BES>%W$&`*#A_O__Z[@PV>$#8(;@N!#9X08`H.$0 +MX)WE`#"@XY$'`N"1Y2'@!5"'X'50_^9R(/_F_O__ZP@@G>4"`%7AGO__.F0@ +MG^4$`*#A`!"@XPN`H.$/___K"Q"@X0@`E.4!4*#C_O__ZW``_^9B^/_K"Q"@ +MX0``E.7^___K<`#_YEWX_^L(,)WE_Q"@XQ@`E.6#(*#A_O__ZP4`H.&(`L*#A`0R@XQP0C>6Z +M$-;A)""-Y1`0C>7^___K``!0XPP`C>7B```*`0R@X[J`UN'^___K`%!0XE$` +M``J\!-;A_S\/XP,`4.%+```*F```X-3S_^N\Q-;AN)#6X0`0H.,%(*#A"#"@ +MXY@,#.`,P&G@<`#_YKX$QN$`D(S@``#@XP``C>4)`*#A_O__ZP``4.,Y```: +ML#+5X0``4^,V```*L"/5X0``4N,S```*L!35X0``4>,+<*`1*```&BX``.JR +MP-?A`0!$&___K +MD:#&Y;"@Q^$4,)WEL*##X0<``.H$<(?B)."=Y0'`@.(.`%#A`@"'XA0`C>5\ +M`/_FT/__.@4`H.'^___K`&"@XRR"G^4+H*#A!E"@X11@C>4&<*#A?```ZK*0 +MVN$``%GC=0``"A`0G>6P8-KAD0D)X`D`H.%Y\__K$#"=Y7``_^9P(+_F&""- +MY0,`4N%J```J'P!5XQ8``(H63!@+@``!"TX9_E`T".X`/`CN<&`(3I$%#$Y0<```JP,-KA`>"@XQS`G>4? +M$`/BHS*@X0,AG.<>(8+A`R&,YW``O^8`8*#C(`"-Y0&P@.(LH(WE&```Z@@P +MV.4`P*#C`,"-Y?[__^L``%#C#@``&@S@G>4?`%7C"Z"@X0!PWN6P`M[AL#'> +MX2@`C>4'>(/A!0``BK`VWN$&(*#AN!#8X00`H.&1`P'@T_+_Z[@PV.$*L*#A +M`V"&X'9@_^8@,)WE"0"&X``0H.,,()WE`P!6X0:@H.'?__^Z'P!5XRR@G>4& +M``"*`5"%XBC`G>4!X*#C#'"$Y750_^81X,3ELL'$X1@`G>4``%OA'@``BK0` +MG^7^___K!A0`X[$PF.$``%/C`&"@$P,``!KJ+`CCLF"8X08`H.&!]__K`3"@ +MXP0`H.$`$*#C%##$Y8;^_^L``%;C`,"@XQ'`Q.4*```*'OC_ZP`0H.$`D*#A +ML@'4X?[__^L0X)WE!@"@X0`PH.,.(*#AG@D!X/[__^L4`)WE!*"*X@$`@.(4 +M`(WE%!"=Y20@G>4"`%'A?O__.@P`G>4TT(WB\$^]Z/[__^HTT(WB\(^]Z``` +M``"`````204``)0PG^7P02WIV2]#X@!`H.$$`%+A'```&A$PU.4``%/C\(&] +M"`0`H.$`$*#C6O[_ZP!P4.(1```:8&"?Y0!0E.6Z$-;A!0"@X?[__^L$()3E +M"`"4Y0`%$*#A_O__Z[H0UN$(`)3E_O__ZW``_^8\ +M]__K`#"@XQ$PQ.7P@;WH`P!2X1P@@N+=__\:\(&]Z.0#````````\$$MZ0`0 +MH./^___K9#"?Y8!`@^+Y;X/BNE#3X0!PH.$1,-3E!1"@X0``4^,+```*``"4 +MY?[__^L%$*#A`("@X0<`H.'^___K``!8X0,``!H$`*#A%$#4Y?[__^L#``#J +M!@!4X1Q`A.+L__\:`$"@XP0`H.'P@;WH`````/!'+>D`$*#C*-!-X@"`H.'^ +M___K)#*?Y0!0H..`0(/BNJ#3X0!@H.$1,-3E"A"@X0``4^,/```*`'"4Y0<` +MH.'^___K"A"@X0"0H.$&`*#A_O__ZP``6>$&```:!R"@X00`H.$&$*#A*/+_ +MZQ\`5>-C``":!```Z@%0A>(<0(3B=5#_YB``5>/F__\:K#&?Y0`0H.,(`*#A +M`:"@X8!`@^*Z4-/A_O__ZP!PH.$1,-3E!1"@X0``4^,,```*``"4Y?[__^L% +M$*#A`)"@X0<`H.'^___K``!9X00``!H$`*#A_O__ZQ\`6N,8``":!```Z@&@ +MBN(<0(3B>J#_YB``6N/I__\:.#&?Y=E/0^(1(-3E``!2XPT```H#`%3A'$"$ +MXOG__QH<,9_E#DU#XA`@U.4``%+C`@``&@0`H.'^___K`@``ZAQ`A.(#`%3A +M]O__&@<`H.$%$*#A_O__ZP@@C>(",*#C``#@XP``C>4'`&'@`!"@X_[__^L( +M,-WEN''=X040H.$(`*#A`7"'X@-XA^`,<(3E_O__ZP<0H.%P]Z`````#D`P````0``'!`+>G$8)_EMC'6X0$` +M4^-P@+T8`""@X[I0UN&V(<;A_O__Z[PQUN$`0*#AN`'6X0,`4.$"``":``!C +MX'``_^;^___KA&"?Y;HAUN&^,=;A`P!2X7"`O3@$`*#A`!"@X_[__^NR,];A +M!!"@X94$!.```%/A@`"@@0`@H)-(,):%L""3@4@`G^7^___K/#"?Y0`@H.,$ +M`*#AM"'#X2P@D^4!((+B+""#Y?[__^L``%#C`@``&@0`H.'^___K_O__ZP@P +MG^4!(*#CM"'#X7"`O>@`````@04```@QG^7P3RWI`&"@X;B`T^&$T$WB^`"? +MY0)0H.$!H*#ANG#3X0V0H.'^___KB+2@X2\``.IS4/_F_O__Z]0PG^4'$*#A +M`$"@X08`H.$.(-3E`S""X;`PS>&\,-3AL#'-X?[__^L'$*#AL`+-X0@`E.7^ +M___K!Q"@X;`#S>$``)3E_O__ZP<0H.$`,*#CL#7-X;`$S>$&`*#A_O__ZPA@ +MAN`!`*#A"!"@X?[__^L`,*#C"A"@X;`WS>$-(*#A`#!5X@$PH!,+H(K@L`;- +MX0``E.7^___K`#"4Y00@E.4#,(C@`#"$Y0(`4^$!```:!`"@X?[__^L``%7C +M`3!%X@8`H.'+__\:!0"@X830C>+PC[WH````````4U4`\O__0"*?Y?A/+>D\ +M,I_END#2X0!@H..H4)/E`0!UXP0``!H!8(;B!#"#X@H`5N/X__\:^(^]Z!`R +MG^4$<*#A!(*?Y:0PD^4#`%7A(0``B@8T`.,%`*#A!""@X;,PF.$``%/C`C0` +M$_^/#P.S,)@1@3^#$H.`B!``,*#CLH#8$90(".`($*#A_O__ZP!P4.)H```: +MN`&?Y?[__^L($*#A!2"@X:P!G^5`]/_K!1"@X00@H.$',*#A"`"@X?[__^N4 +M`9_E!Q"@X0<@H.$W]/_K!P"@X4T``.I\`9_E_O__ZP4`H.'^___KL#'8X0,` +M4.&`@(@B`*"@(P@``"J4``3@!`"@X?[__^L``%#C20``&@0`H.'^___K_O__ +MZT4``.H1,-CE!!"@X0``4^,,```*"`"8Y?[__^L$$*#A`)"@X04`H.'^___K +M``!9X00``!H(`*#A_O__ZQ\`6N,U``":!```Z@&@BN(<@(CB>J#OYB``6N/I +M__\:S#"?Y0"`H.,#D*#A6*"3Y2,``.JPMM/A_O__ZP$PB.(``%OA'0``&@H` +M6.&@()_EI`"?Y9@PGP6T1=,!ZCP(X[,PDN&7`P?@_O__ZP`PH.,$(*#A!0"@ +MX0<0H.'^___K!Q"@X04@H.%P`)_E\?/_ZP40H.$$(*#A`#"@XP<`H.'^___K +M`!"@XU0`G^4!(*#AZ//_ZP``H./^___K!P``ZG.`[^8*`%CAB#")X`4`H.$$ +M$*#A`0``B@\`6N/4__^:$#"?Y2I@AN(`(.#C!B&#Y_B/O>@``````````$Y! +M3D01$5-5``!350$`4./P3RWI`4"@X1303>("8*#A!0``"@<``#H"`%#C:0`` +M&K0AG^68()+E`D"!X*@AG^64()+E`D"$X*"QG^4&$(3@NB#;X;`!V^&0`@+@ +M`@!1X0"`H),#D*"1"*"@D54``)I8``#J`1"@XP0`H.'^___K"%#;Y040H.$` +M<*#A!`"@X?[__^L'`*#A<8#_Y@50:.!U4/_F!@!5X790_X;^___K`""@XPD0 +MH.%U,._F!P"@X0`@C>7^___KN!#;X0``4.,$`*#A`*#@$_[__^L`,*#C!!!A +MX`,@B^`!,(/B)RN"XNX@@N(`<-+E%""@X_\`5^.2!P?@+```"@<@B^"=+(+B +M%"""X@`@DN4!`%+A`P``&LPPG^4'<)/@`P``&B(``.H@`%/CZO__&A\``.H$ +M,)?E``!3XQP```H),*#A`,"@XPB0C>4$D*#A#*"-Y0-`H.$&H*#A#&"@X0T` +M`.H$()?E`<"@XQPH$N`$```*$!"7Y0(LH.,$`*#AF!(AX/[__^L!8(;B`8"( +MX@),A.)V8/_F>(#_Y@4`5N'O__\Z"4"@X0I@H.$(D)WE#*"=Y05`A."%E(G@ +M!F!EX```5N.H__\:"H"@X0```.H`@.#C_O__ZP@`H.$4T(WB\(^]Z``````` +M````%)T``/!!+>D),-#E`$"@X0``4^/P@;T(`%"@XUAPG^4!8*#C"@``Z@0` +ME.46!1#@!0``&@`0E.4!(*#C$#"4Y0$0A>"%-(/@_O__ZP%0A>)U4/_FN##7 +MX04`4^'Q__^*``"4Y0$@H.,0$)3E_O__ZP0`H.'P0;WH&OO_Z@````#X3RWI +M@#2?Y0!PH.$`0*#CNX080H.'^___K;#2?Y0<08>```-/E`2"$X@``4.,# +M```*"0`3Y0$`4.$!4*`#S0``"G)`_^84,(/B(`!4X_/__QH`0*#C+!2?Y00P +MH.$#(('@`0"$XITL@N(4,(/B'2""X@!0TN4``%7CO@``"G!`_^8@`%3C]/__ +M&@`@H./T$Y_E`N"@X0)0H.$"0*#A`C"@X12`H.,"P('@"@@0`PH.,!((+B(`!2X][__QH$`%/A`T"@@0Y0H)$!@(3B>(#_ +MY@,`6.,V``":/*.?Y0!@H.,4L*#C!9"*X`D``.H&,-/EFZ,CX)T\@^(4,(/B +M``"3Y63W_^L!,(;B``!0XP8``!IS8._F!C")X`0`5N$G.X/BZ#"#XO#__SH3 +M``#J!5"&X.0RG^4$0&;@"&!FX'50X^;`! +M`(3BG2R"XA0P@^(=((+B`"#2Y0``4N-#```*<$#_YB``5./T__\:/P``ZI[$ +M(>`#`(S@G0R`X@%0@N(<`(#B%#"#XIT<@>(8$('B``#0Y000T>4!`%#A`D"@ +M,74@_^8@`%+C\/__&M`AG^4`8*#C!H""X"<[B.+N,(/B`##3Y00`4^$E```: +M)UN(XJRAG^6PL9_EZ8"%XA20H./H4(7B!C#8Y?\`4^.9HR/@$@``"@8`U>6= +M/(/B%#"#XK@0VN&9``#@`""3Y0`PBN```(O@G3R#XA0P@^(`,)/E`S"!X`(` +M4^$$```:$O__ZP8PU>7_`%/CZ?__&@L``.I(,9_E%`"@XP!0H.,#8(;@-#&? +MY08@UN60,B#@!O__ZP,``.H!8(;B(`!6X]#__QH`4*#C%("@XPRQG^4`H9_E +M`3"@XY@$">`'`*#A"6"+X`DPQN6X$-KA_O__ZP``5>,'$&'@"1"+YR0``!H% +M,*#A!2"*X`$`@^(G*X+B`5"%XNX@@N(`(-+E_P!2XYBB(N`7```*G2R"XA0@ +M@N(`()+E`0!2X0\``)J4P)_E'R"@XP%00N("((S@)PN"XG4@_^8`$*#A`5"" +MXN@`@.+I$('B!@#0Y750_^8#`%7A!@#!Y?+__XH"``#J<##_YB``4^/>__\: +M5""?Y0(P@^`&0,/E/`"?Y0`PH.,#((#@",#6Y9TL@N(4,(/B'"""X@`0TN4! +M`%SA`1!!X@`0PC4*#5/C]/__&A\PH.,&`*#A"##&Y?B/O>@`````'9T``!2= +M``#HG```\$\MZ;!1G^6DT$WBN!#5X;H`U>'^___K<`#_Y@!#H.$$`*#A_O__ +MZP`04.(0$(WE7P``"@`PX.,$(*#A_Q"@XU0PA>58,(7E`("@X_[__^L/<*#C +M!4"@X0B@H.&^-]7A``!3XTP```JZ(-3A!Y"@X;JPU.$%8*#A6!"4Y9,"`N`0 +M,)WE`0!QXUAPA`4".H/B'#"-Y;@PU.$+L&/@&""-Y7NP_^8W``#J'P!8XS@` +M`(H8$)WE(""-X@"@C>4!$(7@%!"-Y10PG>4*$*#A`@"#X@0PH./^___K``!0 +MXR8``!JP$MWA_S\/XP,`4>%44(0%(0``"K!SW>$04)WEL#3=X;`EW>$'>('A +M`!"5Y0$`<>,3```:`CB3X0\```H'`*#A##"-Y8[^_^L,,)WE`8"(X@H@H.%X +M@/_F`!"@X10`G>4$,('EOC?6X;PPP>$(,-3E`*"-Y1`0D>7^___K`'"%Y04` +M`.H'`%'A!%"%X@(```H<$)WE`0!5X>+__QJX,-3A"[!CX'NP_^9[4+_F``!5 +MX\3__ZH)<*#A!E"@X0%P1^("4$7B`0!WXZO__QH0`)WE_O__ZZ30C>+PC[WH +M`````/@RG^7L+`CC\$\MZ0`0H..RH)/AW"P`XT7?3>(`0*#CLA"#X20=">.Z +M(-/A`W"@X0Q`C>40@(WB`6"3YP10H.'_D.#C_[\/XYH""N`+``#J`%"-Y?[_ +M_^L``%#C`"#@$PP@C14#```:$1Z-XKDPD>$+`%/A"```"K@PU^$#0(3@NL#7 +MX0H`A.`%$*#A"""@X0P`5.$!,*#C[/__.F`"G^4$$*#A5%*?Y?[__^O:C`#C +M``!4XW1P_^:X<(7A@P``"K@`U>$&$*#A$""-X@@PH.,*H&#@`,"@XP0`BN`` +MP(WE_O__ZP``4.-U```:_S#@XQ$NC>*S,)+A/0M3XVT``!JV(-;AMC#5X0,` +M4N%F```:LB'6X;(QU>$#`%+A8@``&@@@EN4(,)7E`P!2X5X``!H&$*#A!0"@ +MX0$JH.,`0*#C_O__Z[!AU>&X<(7A$)"-X@$)5N.D49_E?V^&DB!@H(,#8(:2 +MUGP`XYBAG^4$L*#AIF2@D1$``.JTX-#ANL#5X;<`E>&,3,CE`+"-Y9#L(.#^ +M___K``!0XP(``!JP,=WA!`!3X00```H$$*#A6`&?Y?[__^O^___K1P``Z@%` +MA.(&#(3B`C"@XP0`@.(&`%3A!("%X`05BN`)(*#AD%,@X.3__SK^___K`0!P +MXP!0H.$$```:%`&?Y?[__^O^___K!0"@X3L``.H&`%3A)@``&A!`C>(`$*#C +M!`"@X8`@H./^___KU#"?Y0"`H.,#4*#A#GV#XKI@T^&1,-7E!A"@X0``4^,& +M```*B`"5Y?[__^L&$*#AL`#$X8``E>7^___KL@#$X9&`Q>4<4(7B!P!5X01` +MA.+O__\:&>__ZQ``C>(`$*#C(""@XT?Z_^ML()_EW#P`XP$0H..S$(+A[.[_ +MZ^;^_^L``*#C$@``ZF``G^7^___K!0``ZE@`G^7^___K!0``ZE``G^7^___K +M!```Z@P@G>4!`'+C`0``"@``X.,$``#J%""?Y=H\`.,``.#C`!"@X[,0@N%% +MWXWB\(^]Z`````"H!0``W@P``-4%```'!@``,08``%X&``")!@``\$\MZ130 +M3>(!`%#C`E"@X0`PC>4`(*#CD#.?Y0%`H.$4),/E!0``"@<``#H"`%#CV0`` +M&G@SG^68,)/E`T"!X&PSG^64,)/E`T"$X&`SG^64,)/E`P!4X<\``#I48Y_E +M!2"$X+HPUN&P$=;AD0,#X`,`4N'(``"*=1#_Y@0`H.'^___KNA#6X00`H.'^ +M___K"'#6Y0<0H.&X`L;A!`"@X?[__^MQL/_F``!;XP5@H`$`H)T%&P``"@0` +MH.$'D&O@;_W_ZP4`6>$%D*`A`!"=Y7F0_^8)0(3@!6!IX(FDH.$*(*#A"J"! +MX`"`H.$0`)#EBP2`X/[__^L`(.#C!#"8Y1``5>,2F>#A&;N#X02PB.4"``": +M"`"@X3K]_^L!``#J"`"@X8/W_^N((I_E$#T)XP,`DN<``%#C````"GWW_^L` +M,.#C`("@XX4,,(WE!9"@X5"RG^54``#J#P!9XP(` +M`)JX$-OA`#"@XQ8``.H$`*#A`?7_ZP`P4.+X__\:"""@X0`0G>4$`)WE`X"@ +MX?[__^L$`*#A-OW_ZP@@G>4*$*#A`%"@X1``D.7^___K#""=Y00PE>4%`*#A +M`C"#X00PA>58]__K-```Z@,@B^`!,$/BG2R"X@T@@N(``-+E%""@X_\`4..2 +M``#@"@``"@`@B^"=+(+B%"""X@`@DN4"(('@!`!2X0,``!J<,9_E``"#X/C\ +M_^L!``#J'P!SX^G__QH$`*#AN!#;X?[__^M\,9_E``"@XP008>``P-/E`2"` +MX@``7.,"```*"<`3Y0$`7.$$```*<@#_YA0P@^(@`%#C]/__&@,``.H\,9_E +M%""@XY(P(.`8^/_K!""=Y0$PB.(``%CC!""@`7.`_^8$((WE`""=Y0H@H`$` +M((WE"#"=Y0=`A.`&8&?@`Z"*X`<`5N&H__\J!`"=Y0@@H.$`$)WE_O__ZP`` +M5N,P```*!Q"@X00`H.'^___KR#"?Y00`H.$`4*#C<7#_YK@0T^'^___KN#"? +MY0008>```-/E`2"%X@``4.,"```*"0`3Y0$`4.$#```*C0O`P````` +M```````4G0``'9T``/=/+>D#L*#A6#&?Y0%PH.$$`(WE`0"@X0)0H.$6H-/E +M"A"@X?[__^L``%7C!7"@`7%@_^9(```*"@!5X08``)H$`)WE!Q"@X04@H.$+ +M,*#A#-"-XO!/O>C^___J`)"@XP1!G^4)@*#A!R!FX`DPU.4!$(CB``!3XPL` +M``H``)3E`@!0X0@``!H0$)3E"P"@X84DH.&&%('@_O__ZQ``6.,`<*`3'0`` +M&@D``.H(`-3E%$"$X@``4.,!```*``!3XP```!H(D*#A<8#_YA``6./E__\: +M%!"@XXPPG^4'<&;@"B"@X9$)">`$`)WE!Q"@X0E`@^`)<(/G$#"4Y?[__^L0 +M$)3EA22@X884@>``<*#A"P"@X?[__^L!,*#C"3#$Y4@`G^4`,*#C`R"`X`C` +MU.6?+(+B%#"#XIP@@N(`$-+E`0!(`$,(U!0U3X_3__QH/,*#C"##$ +MY0<`H.$,T(WB\(^]Z`````"4GP```````"C!G^4!`%#C\$#T,)_EE#"3Y0-`A.#L +M,)_E!2"$X+`1T^&Z,-/AD0,#X`,`4N$Q``"*!`"@X0<0H.'^___K"H"@X7%@ +M_^8``%;C#0``"@=@9N`$$*#A``"@XPHPH.%V8/_F!0!6X75@_X8&(*#A!D"$ +MX/[__^N&A(K@!5!FX`!@4.(`8.`3`#"@XP$``.IR,/_F!5!GX`<`5>$!((/B +M^O__*@``4^,*```*EP,'X`00H.$(,*#A``"@XW=P_^8'(*#A!T"$X/[__^N' +MA(C@``!0XP!@X!,``%7C!P``"@00H.%U(/_F"#"@X0``H./^___K``!0XP`` +M``H`8.#C!@"@X?"'O>@``````````"`QG^4`(*#C\$`!*Z#C!`!3X0``B."84)_EZO__BM9,`.,`,*#CM#"%X5?Q +M_^L`8%#B'0``"K1@A>'8C`#C`$"@XPV@H.$*``#JN`#5X;K`U>&P0,WAD`0` +MX`%`A.)T0/_F<`#_YK0`Q^&X`(7AG`8@X/[__^NP`=7A!GR$X@1PA^($%8G@ +M?P^`X@T@H.$#`(#BAW"%X``PH.,4P)_EH`14X>C__[K0/(SES#R,Y8#0C>+P +MA[WH`````-X,``#P3RWI1*B?Y3@]">,`$.#C0=]-X@"0H..\%,KAP%"-X@-P +MFN<4,$/BOA3*X0I@H.$#0)KG*#"#XA0(G^4)@*#A`S":YU"0BN6ZL-KA'#"- +MY?[__^N^(-KA"1"@X00`H.$8D(WEHB&@X?[__^L)$*#A`2J@XP<`H.'^___K +ML"':X0D0H.$<`)WEP#"-XH(@H.$$,(/B/#"-Y?[__^L)$*#A(""@XV``BN+^ +M___K"1"@X4`@H.,%`*#A_O__ZY0'G^4)$*#A"2"@X;_N_^OL/`CCLU":X=P\ +M`..SD(KA`C"%X@%0A>*;`P/@FP4*X"`PC>4HH(WE!@$`ZK`@TN$"`%7A!@`` +M&L4BH.$!P*#C'P`%X@(1E.<<$('A`A&$YP4``.H!,(/B@R"&X`$`4^$C*X+B +M[B""XN___[KBS`CCO""6X0(`4^'K``"Z(."=Y0`0H.,H`)WE0""-X@@PH.,` +MX(WE_O__ZP``4.,P`(WEX0``&G6@_^:P&]WA"@"@X?[__^NP)-WA_SP"XO$, +M4^-/```:_S`"XK`5W>$/D*#C"0!HX`,X@>$K``#JP!"-X@DAD><"`%/A)@`` +MFL`@G>4`(%+B`2"@$Q``6.,!(((#``!2XP&`B`)X@/\&`P``"K`&UN$4,(WE +M$O#_ZQ0PG>7`((WB9!:?Y0@`@N(\()WE"0&`X`,``.H$P!+ELN!1X0C``N6T +MX$'A!"""X@(0@>(``%+A]___&@$+%(J#A"0&!X(D0AN`!P*#C0#``Y1\` +M!>*PIL'A`A&4YQP0@>$"$83G`@``Z@&02>(``%GAT?__R@``6>,(``"JQ3*@ +MX0'`H.,?$`7B"@"@X0,AE.<<(8+A`R&$Y^KO_^N:``#J#R!HX@(`6>&7``#* +M`$!@(CB0#`)Y0$`H.,",93G'Q`%XGB`_^80 +M,8/A`C&$YXD``.KR#%/C;P``&K`1UN'_(`+BL#;=X;`%W>$!`%/A.!"6Y0(( +M@.$D`(WE`1"`X#@0AN5\```J'`"=Y8/@H.$LX(WEOI"0X0``6>,(```:Q3*@ +MX0$`H.,?$`7B`R&4YQ`A@N$#(83G'!"=Y;Z@@>%M``#J&"6?Y0L0H.&4`)+E +M%#"-Y?[__^L4,)WE``!3X64``#H@P)WE0""-XK#GW>$%,*#C,!"=Y0#`C>6P +MR-WAFPD`X#3@C>4PP(WE_O__ZT`0W>6P)=WA.#"6Y0$H@N$DX)WE`@!3X0,P +M8H`X,(:%`@!>X;`GW9&P.-V1$P``FJG"H.'%`J#A'Q`)X@P`C>4?(`7B`0"@ +MXS@@C>4,X93G-""=Y1#ASN$P,)WE#.&$YPP0G>4XX)WE`<&4YQ`.C.$!`83G +M'!"=Y2P`G>6PH('A`@"'X@`0H..PP-#A#`!9X04``!H!"U'C`1&@X;$@A^&P +M,,#A!```*B\``.H!$('B!`"`X@$+4>/R__\:!Q"@X0$*A^*RP-'A_^,`XQB@ +MG>4$$('B#@!:X0``7),'```:`0"*X@K!H.$*$8?@O""'X7``_^88`(WELC#! +MX1H``.H``%'A[O__&A<``.KU#%/C%0``&L4"H.$!$*#CL)7=X?\@`N(`P93G +M'^`%X@(HB>$1SHSA`,&$YU`PEN4"`%/A"0``BKS$UN&^,-;A#`!3X:PRH($? +MP`R"`P&4AQ$4+`(#@*`"-Y0L0 +M@>`@$(WEOC#6X0,`5>'B+`BS`#"@L[(0EK']_O^Z_`"=Y<`@C>(4$Y_E#C"@ +MXUP`@>4X`)+E/!"2Y00@0N(!`(#B`0!0X0X```KP4I_E`V"@X8-0A>!@4(7B +M!0``ZK(P5>```%/B"```"BWO_^L`,*#CLC#%X0``5N,!8$;B]O__J@$``.H! +M,%/BZ/__*JPBG^6P-M+A``!3XQ8``!JP%M+A`B""X@``4>,/```*C"*?Y0,0 +MH.&#,(+@8"""XF`P@^(#``#JLJ!3X0#`H..RH$+ALL!#X0\`4>,",(/B`1"! +MX@(@@N+V___:`@``Z@$P@^(0`%/CZ/__&@"@H.,'4*#A.(*?Y4"0C>(*8*#A +M*@``ZK(`U>&ZX-CA`0"`XKC`V.$`8(WEG@``X```;.#^___KL`3=X080H.$) +M(*#A_PP`X@,PH./R#%#CL&#%`;)@Q0$7```*L,#5X;H`V.$`8(WEG```X/[_ +M_^NP--WAL+;=X?\\`^+R#%/C"@``&K+`U>$#,*#CN@#8X080H.$)(*#A`&"- +MY9P``.#^___KL#;=X0L`4^$"```*`."@X[#@Q>&RX,7A`:"*X@10A>(8`)WE +M!A"@X0D@H.$!,*#C``!:X6@!G^7-__^Z`V"@X>P\".,`H*#A`("@X[-0D.$& +M4(7@)```ZL4RH.$#,93G`0!SXQ]0A0,!4(4"'```"@``5>,?`(7B!0"@H7XQ +M%>(!,$-"P`*@X8,]X$$`$93GHSW@00$P@T(6(Q'@#0``&@(``.J\P)?A!0!< +MX0D```H8X)WE`L&@X0X`4N$!((+B]___NA8S@>$`,83G=0#_Y@&`B.*K[O_K +M`5"%XA\`%>/B__\:!`!8XP(``(J^,-KA`P!5X=?__[H<`)WE`5"@X\?]_^L' +M`*#A`2N@XP00H.%*]O_KB#"?Y>PL".,#<*#ALF"3X05@AN`6``#JQC*@X0,Q +ME.!!`B&4YZ,]X$$!,(-"%2,2X````!J![O_K'P`6X^[__QJ^,-?A +M`P!6X>7__[K.^O_K``"@XT'?C>+PC[WH`````+`&```B(E-58@````````!P +M0"WI\$"?Y0!0H.-"/J#C`&"@X;8PQ.$`4,3E`5#$Y?[__^O4,)_E!@"@X154 +MP^445,/E_O__ZP4`4.$`4.`3%P``&O[__^NQZ__K``!0XPH```JH()_E0AZ@ +MXZ0`G^7^___KMA#4X9P`G^7^___KF`"?Y?[__^L``.#C<("]Z/[__^L``%#C +M`0``"L+]_^O^___K8#"?Y0!0H.,!(*#C`"##Y5!`G^5"'J#C4""?Y5``G^7^ +M___K7!"4Y5``G^7^___K!C0`XT@`G^6S$)3A_O__Z[`1U.$\`)_E_O__Z[(1 +MU.$T`)_E_O__ZP$`H./^___K!0"@X7"`O>@`````T+P,`.$&``#`!@``Z08` +M``<'```=!P``,`<``$8'``#(`0```0````````"PL+"`1````+"PL("<```` +MKP>Q@'P!``"PL*J`W`$``+"PL(#L`0``L+"L@%@"``"PL+"`7`(``+"PL(!D +M`@``L+"P@&P"``"PL+"`=`(``+"PL(!X`@``L+"P@.`"``"PL+"`)`,``+"P +MJX"<`P``L*\&@(0$``"L`[&`D`4``*\_!(!\!@``L+"P@(0&``"PL+"`D`8` +M`+"PKH`@!P``L+"P@&@'``"PL*J`\`<``+"PJH`L"```L+"J@%`)``"PKP2` +M=`H``*\_"(#(#@``KR*R@&00``!?A""`X!$``+"PJ(`D$@``L+"L@!@4``"O +M"+&`,!4``+"O!("@%@``KP&Q@,P7``"PL*B`8!@``+"O(H!@&0``L*\H@!P< +M``!?A"*`=!T``+"PK(#('0``L*\D@*P?``"PL*Z`Z"```+"PK("$(0``L*\B +M@$PB``"O/P:`O"8``+"PKH#,)P``L+"J@$`I``"PK!^`E"H``+"PK(`H+0`` +MJ@.Q@*0M``"PL*B`Y"T``+"PJ(!(+@``L+"N@.PN``"PL*J`3"\``*H#L8#, +M+P``L*P?@%@Q``"PKR:`Z#,``+"O#("\-P``L+"L@&`X``"PL*R`W#@``+"N +M"8`H.P``L+"J@``\``"PKR"`'#T``*\(L8!X/P``L*\$@&1!``"PL*R`X$$` +M`*\(L8!\1@``L*\H@#Q(``"O/P2`7$L``+"O!(`@3P``KP>Q@)10``"PL*Z` +MS%$``+"N'X#\4@``KS\`@&!;``"PL*J`1E1,(%9E"5X+#!X)7@L +M,'@E>"PP>"5X+#!X)7@L,'@E>"PP>"5X+#!X)7@*`#PU/G-P87)E6S0J.%T@ +M)7@@+"!P1G1L26YF;RT^`H`/#4^<$9T;$EN9F\M +M/F9T;%9E"`L($943%]615)324].(#T@)7@*`#PU/G!&=&Q);F9O+3YT +M;W1A;$QO9VEC0FQK("5X("P@<$9T;$EN9F\M/FUA>%!H>4)L:R`]("5X"@`\ +M-3YP0F%D0FQK26YF;RT^8VYT("5D"@`\-3Y'971"861";&M48FP@=&]O(&UA +M;GD@8F%D(&)L:PH`"!%`H`/#4^1FQA`H`/#4^97)R;W(Z1V5T +M4F5M87`@4$%"(&ES(#`@+$Q"02`]("5X("P@;F5W(%!"02`]("5X("P@)7@@ +M"@`\-3Y00D%,87-T('!B82`]("5D("`*`$9T;%-E=%-Y7-);F9O+G-Y"`*`$9T +M;$-A8VAE5W)I=&5"86-K"@`\-3Y&=&Q4:6UE2&]O:SI&=&Q#86-H941E;&%Y +M5W)I=&5!3$P*`#PU/F5X8VAA9V4@8FQO8VL@"Q$871E(#T@)7,*`#(P,3`Q,3@`3$]!1$52($943"!)3D9/.E9E`H`3F5E9"!U<&1A=&4@3&]A9&5R(2$A`#PU/D-A8VAE(%9E!``N!P`````````````!```` +M`0```&$````!``````````````!^9@``$@```````````````0````````!J +M`````P``<```````````D&8``"L```````````````$`````````$0````,` +M`````````````+MF``!Z```````````````!``````````$````"```````` +M``````"0:0``(!````X```"P````!````!`````)`````P`````````````` +ML'D```\&``````````````$```````````````````````````````$````` +M``````````0`\?\````````````````#``$``````````````````P`#```` +M``````````````,`!``'``````````````````$`"@```$`````````````! +M``````````````````,`!0`````````````````#``8`!P```$0````````` +M```!``H```"8`````````````0`'````G`````````````$`"@```'@!```` +M```````!``<```!\`0```````````0`*````V`$```````````$`!P```-P! +M```````````!``H```#H`0```````````0`-````[`$``&P````"``$`!P`` +M`.P!```````````!``H```!4`@```````````0`'````6`(```````````$` +M!P```%P"```````````!``<```!D`@```````````0`'````;`(````````` +M``$`!P```'0"```````````!``<```!X`@```````````0`*````V`(````` +M``````$`!P```.`"```````````!``H````<`P```````````0`'````)`,` +M``````````$`"@```)@#```````````!`!X```"<`P``Z`````(``0`'```` +MG`,```````````$`"@```(`$```````````!``<```"$!````````````0`* +M````C`4```````````$`!P```)`%```````````!``H```!P!@`````````` +M`0`'````?`8```````````$`!P```(0&```````````!``H```",!@`````` +M`````0`F````D`8``)`````"``$`!P```)`&```````````!``H````4!P`` +M`````````0`S````(`<``$@````"``$`!P```"`'```````````!``H```!@ +M!P```````````0`'````:`<```````````$`"@```.@'```````````!``<` +M``#P!P```````````0`*````*`@```````````$`!P```"P(```````````! +M``H````\"0```````````0`'````4`D```````````$`"@```&P*```````` +M```!`$4```!T"@``5`0```(``0`'````=`H```````````$`"@```)0.```` +M```````!`%(```#(#@``G`$```(``0`'````R`X```````````$`"@```%`0 +M```````````!`&````!D$```?`$```(``0`'````9!````````````$`"@`` +M`-01```````````!``<```#@$0```````````0`*````&!(```````````$` +M;0```"02``#T`0```@`!``<````D$@```````````0`*````R!,````````` +M``$`?@```!@4```8`0```@`!``<````8%````````````0`*````+!4````` +M``````$`DP```#`5``!P`0```@`!``<````P%0```````````0`*````G!8` +M``````````$`HP```*`6```L`0```@`!``<```"@%@```````````0`*```` +MR!<```````````$`N````,P7``"4`````@`!``<```#,%P```````````0`* +M````7!@```````````$`!P```&`8```````````!``H```!4&0`````````` +M`0`'````8!D```````````$`"@````P<```````````!``<````<'``````` +M`````0`*````;!T```````````$`!P```'0=```````````!``H```#$'0`` +M`````````0`'````R!T```````````$`"@```*`?```````````!``<```"L +M'P```````````0`*````W"````````````$`R0```.@@``"<`````@`!``<` +M``#H(````````````0`*````?"$```````````$`!P```(0A```````````! +M``H```!`(@```````````0`'````3"(```````````$`"@```)@F```````` +M```!``<```"\)@```````````0`*````Q"<```````````$`!P```,PG```` +M```````!``H````T*0```````````0`'````0"D```````````$`"@```'PJ +M```````````!`-8```"4*@``E`(```(``0`'````E"H```````````$`"@`` +M`!PM```````````!``<````H+0```````````0`*````F"T```````````$` +M!P```*0M```````````!``H```#@+0```````````0`'````Y"T````````` +M``$`"@```$`N```````````!`.0```!(+@``I`````(``0`'````2"X````` +M``````$`"@```.0N```````````!``<```#L+@```````````0`*````2"\` +M``````````$`!P```$PO```````````!``H```#`+P```````````0#T```` +MS"\``(P!```"``$`!P```,PO```````````!``H```!(,0```````````0`& +M`0``6#$``)`"```"``$`!P```%@Q```````````!``H```#8,P`````````` +M`0`9`0``Z#,``-0#```"``$`!P```.@S```````````!``H```"P-P`````` +M`````0`'````O#<```````````$`"@```%@X```````````!``<```!@.``` +M`````````0`*````V#@```````````$`!P```-PX```````````!``H````< +M.P```````````0`'````*#L```````````$`"@```/@[```````````!``<` +M````/````````````0`*````$#T```````````$`!P```!P]```````````! +M``H```!D/P```````````0`'````>#\```````````$`"@```%A!```````` +M```!`"D!``!D00``?`````(``0`'````9$$```````````$`"@```-Q!```` +M```````!`#8!``#@00``G`0```(``0`'````X$$```````````$`"@```&Q& +M```````````!`$,!``!\1@``P`$```(``0`'````?$8```````````$`"@`` +M`#A(```````````!``<````\2````````````0`*````/$L```````````$` +M!P```%Q+```````````!``H````,3P```````````0`'````($\````````` +M``$`"@```(A0```````````!``<```"44````````````0`*````Q%$````` +M``````$`5`$``,Q1```P`0```@`!``<```#,40```````````0`*````]%(` +M``````````$`80$``/Q2``!D"````@`!``<```#\4@```````````0`*```` +M3%L```````````$`!P```&!;```````````!``H```!<7````````````0`` +M```````````````#``@``````````````````P`)``H````````````````` +M`P!M`0``X,`,``0````!``0``````````````````P`*```````````````` +M``,`"P![`0```````$0````2``$`B0$`````````````$````*`!``!$```` +M6````!(``0"N`0`````````````0````O@$``)P```#@````$@`!`,X!```` +M`````````!````#<`0``?`$``&`````2``$`Z@$``-P!```0````$@`!`/P! +M`````````````!`````-`@``6`(```0````2``$`&`(``%P"```(````$@`! +M`"\"``!D`@``"````!(``0`[`@``;`(```@````2``$`2`(``'0"```$```` +M$@`!`&`"``!X`@``:````!(``0!O`@`````````````0````>@(``.`"``!$ +M````$@`!`(@"```D`P``>````!(``0":`@`````````````0````K`(``(0$ +M```,`0``$@`!`+X"``"0!0``[````!(``0#+`@`````````````0````T@(` +M`'P&```(````$@`!`.<"`````````````!````#W`@``A`8```P````2``$` +M#0,`````````````$````!@#`````````````!`````E`P``:`<``(@````2 +M``$`+`,``/`'```\````$@`!`#T#`````````````!````!'`P``+`@``"0! +M```2``$`4@,``%`)```D`0``$@`!`&`#`````````````!````!P`P`````` +M```````0````@@,`````````````$````(T#`````````````!````";`P`` +MX!$``$0````2``$`L@,`````````````$````,0#`````````````!````#, +M`P``8!@````!```2``$`V0,``&`9``"\`@``$@`!`.8#```<'```6`$``!(` +M`0#R`P``=!T``%0````2``$`_0,``,@=``#D`0``$@`!``P$``"L'P``/`$` +M`!(``0`5!```A"$``,@````2``$`(P0``$PB``!P!```$@`!`#4$``"\)@`` +M$`$``!(``0!*!```S"<``'0!```2``$`500``$`I``!4`0``$@`!`&@$```H +M+0``?````!(``0!Z!```I"T``$`````2``$`CP0``.0M``!D````$@`!`)L$ +M``#L+@``8````!(``0"N!```3"\``(`````2``$`MP0`````````````$``` +M`-`$`````````````!````#;!``````````````0````Y`0``+PW``"D```` +M$@`!`/$$``!@.```?````!(``0`#!0``W#@``$P"```2``$`%04``"@[``#8 +M````$@`!`!\%````/```'`$``!(``0`L!0``'#T``%P"```2``$`/04``'@_ +M``#L`0``$@`!`$@%`````````````!````!/!0``/$@``"`#```2``$`804` +M`%Q+``#$`P``$@`!`&H%```@3P``=`$``!(``0!U!0``E%```#@!```2``$` +M?04``&!;```D`0``$@`!`(4%`````````````!````"/!0```````!P````1 +M``@`FP4````````$````$0`#`*4%````````X"`!`!$`!`"N!0``X"`$```@ +M"``1``0`N`4``.`@`0````(`$0`$`,8%``#@0`P``(```!$`!`#8!0``Z,`, +M``0````1``0`Y@4``.`@`P````$`$0`$`.P%``#DP`P``0```!$`!`#\!0`` +MY<`,``$````1``0``&9T;"YC`"1A`"1D`$5X8VA086=E4F5M87!!9&0`1D9& +M4&%G90!&=&Q#86-H94EN:70`17AC:%!A9V5296UA<$EN:70`1V5T0F%D0FQK +M5&)L`$QO&-H0FQK4F5C;W9E5]P5=R:71E06QL0V%C:&5%;@!&=&Q'971#87!A +M8VET>0!G1FQA7-0F5R;P!&=&Q6 +M87));FET`$9T;#)&;&%S:%!R;V<`1FQA0!0=W)/ +M9F93879E4F5M87!48FP`1G1L0V%C:&575=R:71E`$9T;$-L +M;W-E`$9L87-H4V5T4F5A9%)E=')Y1&5F875L=`!F=&Q?;6%L;&]C`&9T;%]F +M&-H0FQK36%T8VA#;&]S90!%>&-H0FQK5W)I +M=&5-871C:`!73%)E<&QA8V4`1G1L5W)I=&5086=E`$9L87-H4F5F`8```*K``"`!@`` +M'<<``(@&```=QP``W`8``!S)```4!P```@0``!@'```"!```'`<```($``!< +M!P``'```< +MM0``6!X``!RU``!L'@``'+@``+P>`````` +M`"H"``"`````*@(``(@````J`@``D````"H"``"8````*@(``*`````J`@`` +MJ````"H"``"P````*@(``+@````J`@``P````"H"``#(````*@(``-`````J +M`@``V````"H"``#@````*@(``.@````J`@``\````"H"``#X````*@(````! +M```J`@``"`$``"H"```0`0``*@(``!@!```J`@``(`$``"H"```H`0``*@(` +M`#`!```J`@``.`$``"H"``!``0``*@(``$@!```J`@``4`$``"H"``!8`0`` +M*@(``&`!```J`@``:`$``"H"``!P`0``*@(``'@!```J`@``@`$``"H"``"( +M`0``*@(``)`!```J`@``F`$``"H"``"@`0``*@(``*@!```J`@``L`$``"H" +M``"X`0``*@(``,`!```J`@``R`$``"H"``#0`0``*@(``-@!```J`@``X`$` +M`"H"``#H`0``*@(``/`!```J`@``^`$``"H"`````@``*@(```@"```J`@`` +M$`(``"H"```8`@``*@(``"`"```J`@``*`(``"H"```P`@``*@(``#@"```J ++`@``0`(``"H"```` +` +end diff --git a/drivers/mtd/rknand/nand_config.h b/drivers/mtd/rknand/nand_config.h new file mode 100755 index 000000000000..573f26726f88 --- /dev/null +++ b/drivers/mtd/rknand/nand_config.h @@ -0,0 +1,58 @@ +/******************************************************************************** +********************************************************************************* + COPYRIGHT (c) 2004 BY ROCK-CHIP FUZHOU + -- ALL RIGHTS RESERVED -- + +File Name: nand_config.h +Author: RK28XX Driver Develop Group +Created: 25th OCT 2008 +Modified: +Revision: 1.00 +******************************************************************************** +********************************************************************************/ +#ifndef _NAND_CONFIG_H +#define _NAND_CONFIG_H +#define DRIVERS_NAND +#define LINUX + +#include +#include +#include +#include +//#include +#include "typedef.h" +#include +#include +//#include "epphal.h" +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef NULL +#define NULL (void*)0 +#endif + +#include "FTL_OSDepend.h" +#include "flash.h" +#include "ftl.h" + +#ifdef CONFIG_MTD_NAND_RK29XX_DEBUG +#undef RKNAND_DEBUG +#define RKNAND_DEBUG(format, arg...) \ + printk(KERN_NOTICE format, ## arg); +#else +#undef RKNAND_DEBUG +#define RKNAND_DEBUG(n, arg...) +#endif + +extern void rkNand_cond_resched(void); + +#define COND_RESCHED() rkNand_cond_resched()//cond_resched() + +#define PRINTF RKNAND_DEBUG +#endif + diff --git a/drivers/mtd/rknand/rknand_base.c b/drivers/mtd/rknand/rknand_base.c new file mode 100755 index 000000000000..0d6e0817b8a9 --- /dev/null +++ b/drivers/mtd/rknand/rknand_base.c @@ -0,0 +1,737 @@ +/* + * linux/drivers/mtd/rknand/rknand_base.c + * + * Copyright (C) 2005-2009 Fuzhou Rockchip Electronics + * ZYF + * + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "api_flash.h" + + +#define DRIVER_NAME "rk29xxnand" + +#define NAND_DEBUG_LEVEL0 0 +#define NAND_DEBUG_LEVEL1 1 +#define NAND_DEBUG_LEVEL2 2 +#define NAND_DEBUG_LEVEL3 3 +long FTLWriteCount =0; +long FTLReadWriteTime =0; +long FTLSwapWriteCount =0; +long FTLPageWriteCount =0; + + +#ifndef CONFIG_RKFTL_PAGECACHE_SIZE +#define CONFIG_RKFTL_PAGECACHE_SIZE 64 //¶¨ÒåpageÓ³ÉäÇø´óС£¬µ¥Î»ÎªMB,mount ÔÚ/data/dataÏ¡£ +#endif + +#define use_image + +#ifdef use_image +unsigned long SysImageWriteEndAdd = 0; +int g_num_partitions = 0; +#endif + +#ifdef CONFIG_MTD_NAND_RK29XX_DEBUG +static int s_debug = CONFIG_MTD_NAND_RK29XX_DEBUG_VERBOSE; +//module_param(s_debug, int, 0); +//MODULE_PARM_DESC(s_debug, "Set Debug Level 0=quiet, 5=noisy"); +#undef NAND_DEBUG +/*#define NAND_DEBUG(n, format, arg...) \ + if (n <= s_debug) { \ + printk(KERN_NOTICE __FILE__ ":%s(): " format "\n", __FUNCTION__ , ## arg); \ + }*/ +#define NAND_DEBUG(n, format, arg...) \ + if (n <= s_debug) { \ + printk(format,##arg); \ + } +#else +#undef NAND_DEBUG +#define NAND_DEBUG(n, arg...) +static const int s_debug = 0; +#endif + +long RkFtlWriteCount; + +/* +* RK28 LBA PARTITIONS,the size and offset value below is default value in this program, +* when RK28 LBA FLASH init,the value will be modify to the value in the nand flash. +*/ +#define MAX_FLASH_PARTITION 2 + +#define ROOTFS_PART_SIZE 300 +#define PARA_PART_SIZE 1 +#define KERNEL_PART_SIZE 4 + +static struct mtd_partition rk28_partition_info[] = { + { + name: "misc", + offset: 0x2000*0x200, + size: 0x2000*0x200,//100MB + }, + + { + name: "kernel", + offset: 0x4000*0x200, + size: 0x4000*0x200,//200MB + }, + + { + name: "boot", + offset: 0x8000*0x200, + size: 0x2000*0x200,//200MB + }, + + { + name: "system", + offset: 0xE000*0x200, + size: 0x38000*0x200,//200MB + }, + +}; + + +static struct mtd_partition rk28_page_part_info[] = { + { + name: "pagecache", + offset: 0, + size: CONFIG_RKFTL_PAGECACHE_SIZE * 0x800,//32MB + }, + + { + name: "swap", + offset: (CONFIG_RKFTL_PAGECACHE_SIZE) * 0x800, + size: 64 * 0x800,//64MB + }, +}; + +/* + * onenand_state_t - chip states + * Enumeration for OneNAND flash chip state + */ +typedef enum { + FL_READY, + FL_READING, + FL_WRITING, + FL_ERASING, + FL_SYNCING, + FL_UNVALID, +} rknand_state_t; + +struct rknand_chip { + wait_queue_head_t wq; + rknand_state_t state; + int rknand_schedule_enable;//1 enable ,0 disable + void (*pFlashCallBack)(void);//call back funtion +}; + +struct rknand_info { + struct mtd_info mtd; + struct mtd_info page_mtd; + struct mtd_partition *parts; + struct rknand_chip rknand; + struct task_struct *thread; +}; + +struct rknand_info * gpNandInfo; +static int rknand_get_device(int new_state) +{ + struct rknand_chip *nand_info = &gpNandInfo->rknand; + DECLARE_WAITQUEUE(wait, current); + while (1) { + if (nand_info->state == FL_READY) { + nand_info->state = new_state; + break; + } + NAND_DEBUG(NAND_DEBUG_LEVEL1,"FLASH not ready\n"); + set_current_state(TASK_UNINTERRUPTIBLE); + add_wait_queue(&nand_info->wq, &wait); + schedule(); + remove_wait_queue(&nand_info->wq, &wait); + } + return 0; +} + +static void rknand_release_device(void) +{ + struct rknand_chip *nand_info = &gpNandInfo->rknand; + if(nand_info->pFlashCallBack) + nand_info->pFlashCallBack();//call back + nand_info->pFlashCallBack = NULL; + nand_info->state = FL_READY; + wake_up(&nand_info->wq); +} + +void rkNand_cond_resched(void) +{ + if(gpNandInfo->rknand.rknand_schedule_enable == 1) + { + //msleep(1); + //mdelay(1); + cond_resched(); + } +} + +static int rk28xxnand_read(struct mtd_info *mtd, loff_t from, size_t len, + size_t *retlen, u_char *buf) +{ + int ret = 0; + int sector = len>>9; + int LBA = (int)(from>>9); + //printk(KERN_NOTICE "read: from=%x,len=%x,\n",(int)from,len); + NAND_DEBUG(NAND_DEBUG_LEVEL1,"-"); + //FTLReadWriteTime++; + //if(len&511) + // printk("rk28xxnand_read: from=%x,len=%x,\n",(int)from,len); + rknand_get_device(FL_READING); + if(sector) + { + { + ret = FtlRead(2,LBA, sector, buf); + } + } + rknand_release_device(); + *retlen = len; + return 0;//ret; +} + +// cmy: before cache part use FtlWriteImage, after cache(include cache) use FtlWrite +static int write_Image(int LBA, int sector, u_char* buf) +{ + int remain_sector = sector; + int write_sector = 0; + u_char* data = buf; + int index = LBA; + int ret = 0; + while(remain_sector > 0) + { + write_sector = remain_sector>32?32:remain_sector; + ret = FtlWriteImage(index, write_sector, data); + data += write_sector<<9; + index += write_sector; + remain_sector -= write_sector; + } + return ret; +} + +static int rk28xxnand_write(struct mtd_info *mtd, loff_t from, size_t len, + size_t *retlen, u_char *buf) +{ + int ret = 0; + int sector = len>>9; + int LBA = (int)(from>>9); + //NAND_DEBUG(NAND_DEBUG_LEVEL0,"+"); + FTLWriteCount+=sector; + FTLReadWriteTime++; + //dump_stack(); + //printk(KERN_NOTICE "write: from=%lx,len=%x\n",(int)from,len); + rknand_get_device(FL_WRITING); + if(sector)// cmy + { +#ifdef use_image + if(LBA < SysImageWriteEndAdd)//0x4E000) + { + printk(">>> FtlWriteImage: LBA=0x%08X sector=%d\n",LBA, sector); + + ret = FtlWriteImage(LBA&0xFFFFFFE0, sector, buf);// LBA align to 32 + } +#else + if(LBA<0x4E000) + ret = write_Image(LBA, sector, buf); +#endif + else + { + ret = FtlWrite(2,LBA, sector, buf); + } + } + rknand_release_device(); + *retlen = len; + return 0;//ret; +} + +static int rk28xxnand_page_write(struct mtd_info *mtd, loff_t from, size_t len, + size_t *retlen, u_char *buf) +{ + int ret = 0; + int sector = len; + int LBA = (int)(from); + NAND_DEBUG(NAND_DEBUG_LEVEL1,"*"); + FTLWriteCount+=sector; + //printk("+"); + //printk(KERN_NOTICE "pagewrite: from=%lx,len=%x\n",(int)from,len); + rknand_get_device(FL_WRITING); + if(sector)// cmy + { + ret = FtlPageWrite(LBA, sector, buf); + } + rknand_release_device(); + *retlen = len; + return 0;//ret; +} + +static int rk28xxnand_page_read(struct mtd_info *mtd, loff_t from, size_t len, + size_t *retlen, u_char *buf) +{ + int ret = 0; + int sector = len; + int LBA = (int)(from); + //printk(KERN_NOTICE "read: from=%x,len=%x,\n",(int)from,len); + NAND_DEBUG(NAND_DEBUG_LEVEL2,"-"); + //printk("-"); + //if(len&511) + // printk("rk28xxnand_read: from=%x,len=%x,\n",(int)from,len); + rknand_get_device(FL_READING); + if(sector) + { + ret = FtlPageRead(LBA, sector, buf); + } + rknand_release_device(); + *retlen = len; + return 0;//ret; +} + + +static int rk28xxnand_erase(struct mtd_info *mtd, struct erase_info *instr) +{ + int ret = 0; + if (instr->callback) + instr->callback(instr); + NAND_DEBUG(NAND_DEBUG_LEVEL0,"rk28xxnand_erase,add:%x,len:%x\n",instr->addr,instr->len); + return ret; +} + +static int rk28xxnand_read_oob(struct mtd_info *mtd, loff_t from, + struct mtd_oob_ops *ops) +{ + int ret = 0; + NAND_DEBUG(NAND_DEBUG_LEVEL0,"rk28xxnand_read_oob\n"); + return ret; +} + + +static int rk28xxnand_write_oob(struct mtd_info *mtd, loff_t to, + struct mtd_oob_ops *ops) +{ + int ret=0; + NAND_DEBUG(NAND_DEBUG_LEVEL0,"rk28xxnand_write_oob\n"); + return ret; +} + +static int rk28xxnand_suspend(struct platform_device *dev, pm_message_t pm) +{ + gpNandInfo->rknand.rknand_schedule_enable = 0; + NAND_DEBUG(NAND_DEBUG_LEVEL0,"rk28xx_nand_suspend: \n"); + return 0; +} + +static int rk28xxnand_resume(struct platform_device *dev) +{ + gpNandInfo->rknand.rknand_schedule_enable = 1; + NAND_DEBUG(NAND_DEBUG_LEVEL0,"rk28xx_nand_resume: \n"); + return 0; +} + +static int rk28xxnand_block_isbad(struct mtd_info *mtd, loff_t ofs) +{ + //printk("rk28xxnand_block_isbad: \n"); + return 0; +} + +static int rk28xxnand_block_markbad(struct mtd_info *mtd, loff_t ofs) +{ + NAND_DEBUG(NAND_DEBUG_LEVEL0,"rk28xxnand_block_markbad: \n"); + return 0; +} + +static void rk28xxnand_sync(struct mtd_info *mtd) +{ + /* Grab the lock and see if the device is available */ + rknand_get_device(FL_SYNCING); + /* Release it and go back */ + rknand_release_device(); + NAND_DEBUG(NAND_DEBUG_LEVEL0,"rk28xxnand_sync: \n"); +} + +static int rk28xxnand_lock(struct mtd_info *mtd, loff_t ofs, size_t len) +{ + NAND_DEBUG(NAND_DEBUG_LEVEL0,"rk28xxnand_lock: \n"); + return 0; +} + +static int rk28xxnand_unlock(struct mtd_info *mtd, loff_t ofs, size_t len) +{ + NAND_DEBUG(NAND_DEBUG_LEVEL0,"rk28xxnand_unlock: \n"); + return 0; +} + +static int rk28xxnand_init(struct rknand_info *nand_info) +{ + struct mtd_info *mtd = &nand_info->mtd; + struct mtd_info *page_mtd = &nand_info->page_mtd; + struct rknand_chip *rknand = &nand_info->rknand; + + rknand->state = FL_READY; + rknand->rknand_schedule_enable = 1; + rknand->pFlashCallBack = NULL; + init_waitqueue_head(&rknand->wq); + NAND_DEBUG(NAND_DEBUG_LEVEL0,"FTLInit ...: \n"); + if(FTLInit()) + { + NAND_DEBUG(NAND_DEBUG_LEVEL0,"FTLInit Error: \n"); + return -ENXIO; + } + NAND_DEBUG(NAND_DEBUG_LEVEL0,"FTLInit OK: \n"); + mtd->size = (uint64_t)FtlGetCapacity(0xFF)*0x200; + //readflash modify rk28_partition_info + + NAND_DEBUG(NAND_DEBUG_LEVEL0,"mtd->size: 0x%012llx\n",mtd->size); + mtd->oobsize = 0; + mtd->oobavail = 0; + mtd->ecclayout = 0; + mtd->erasesize = FlashGetPageSize()*0x200; //sector + mtd->writesize = FlashGetPageSize()*0x200; + + // Fill in remaining MTD driver data + mtd->type = MTD_NANDFLASH;//MTD_RAM;// + mtd->flags = (MTD_WRITEABLE|MTD_NO_ERASE);// + mtd->erase = rk28xxnand_erase; + mtd->point = NULL; + mtd->unpoint = NULL; + mtd->read = rk28xxnand_read; + mtd->write = rk28xxnand_write; + mtd->read_oob = rk28xxnand_read_oob; + mtd->write_oob = rk28xxnand_write_oob; + mtd->panic_write = NULL; + + mtd->sync = rk28xxnand_sync; + mtd->lock = rk28xxnand_lock; + mtd->unlock = rk28xxnand_unlock; + mtd->suspend = rk28xxnand_suspend; + mtd->resume = rk28xxnand_resume; + mtd->block_isbad = rk28xxnand_block_isbad; + mtd->block_markbad = rk28xxnand_block_markbad; + mtd->owner = THIS_MODULE; + + page_mtd->size = FtlGetPageZoneCapacity(); + //readflash modify rk28_partition_info + NAND_DEBUG(NAND_DEBUG_LEVEL0,"page_mtd->size: %x\n",page_mtd->size); + page_mtd->oobsize = 0; + page_mtd->oobavail = 0; + page_mtd->ecclayout = 0; + page_mtd->erasesize = FlashGetPageSize(); //sector + page_mtd->writesize = FlashGetPageSize(); + + // Fill in remaining MTD driver data + page_mtd->type = MTD_NANDFLASH;//MTD_RAM;// + page_mtd->flags = (MTD_WRITEABLE|MTD_NO_ERASE);// + page_mtd->erase = rk28xxnand_erase; + page_mtd->point = NULL; + page_mtd->unpoint = NULL; + page_mtd->read = rk28xxnand_page_read; + page_mtd->write = rk28xxnand_page_write; + page_mtd->read_oob = rk28xxnand_read_oob; + page_mtd->write_oob = rk28xxnand_write_oob; + page_mtd->panic_write = NULL; + + page_mtd->sync = rk28xxnand_sync; + page_mtd->lock = rk28xxnand_lock; + page_mtd->unlock = rk28xxnand_unlock; + page_mtd->suspend = rk28xxnand_suspend; + page_mtd->resume = rk28xxnand_resume; + page_mtd->block_isbad = rk28xxnand_block_isbad; + page_mtd->block_markbad = rk28xxnand_block_markbad; + page_mtd->owner = THIS_MODULE; + + return 0; +} + + +/* + * CMY: Ôö¼ÓÁ˶ÔÃüÁîÐзÖÇøÐÅÏ¢µÄÖ§³Ö + * ÈôcmdlineÓÐÌṩ·ÖÇøÐÅÏ¢£¬ÔòʹÓÃcmdlineµÄ·ÖÇøÐÅÏ¢½øÐзÖÇø + * ÈôcmdlineûÓÐÌṩ·ÖÇøÐÅÏ¢£¬ÔòʹÓÃĬÈϵķÖÇøÐÅÏ¢(rk28_partition_info)½øÐзÖÇø + */ + +#ifdef CONFIG_MTD_CMDLINE_PARTS +const char *part_probes[] = { "cmdlinepart", NULL }; +#endif + +static int rk28xxnand_add_partitions(struct rknand_info *nand_info) +{ + NAND_DEBUG(NAND_DEBUG_LEVEL0,"Enter rk28xxnand_add_partitions\n"); +#ifdef CONFIG_MTD_CMDLINE_PARTS + int num_partitions = 0; + + // ´ÓÃüÁîÐнâÎö·ÖÇøµÄÐÅÏ¢ + num_partitions = parse_mtd_partitions(&(nand_info->mtd), part_probes, &nand_info->parts, 0); + printk("num_partitions = %d\n",num_partitions); + if(num_partitions > 0) { + int i; + for (i = 0; i < num_partitions; i++) + { + //printk(KERN_ERR"111 offset 0x%012llx size :0x%012llx\n",nand_info->parts[i].offset, nand_info->parts[i].size); + nand_info->parts[i].offset *= 0x200; + nand_info->parts[i].size *=0x200; + //printk(KERN_ERR"offset 0x%012llx size :0x%012llx\n",nand_info->parts[i].offset, nand_info->parts[i].size); + } + nand_info->parts[num_partitions - 1].size = nand_info->mtd.size - nand_info->parts[num_partitions - 1].offset; + +#ifdef use_image + g_num_partitions = num_partitions; +#endif + return add_mtd_partitions(&nand_info->mtd, nand_info->parts, num_partitions); + } +#endif + // Èç¹ûÃüÁîÐÐûÓÐÌṩ·ÖÇøÐÅÏ¢£¬ÔòʹÓÃĬÈϵķÖÇøÐÅÏ¢ + printk("parse_mtd_partitions\n"); + +// rk28_partition_info[1].size = nand_info->mtd.size - ((ROOTFS_PART_SIZE + PARA_PART_SIZE + KERNEL_PART_SIZE)*0x100000); +// rk28_partition_info[2].offset = rk28_partition_info[1].size + rk28_partition_info[1].offset; +#ifdef use_image + g_num_partitions = sizeof(rk28_partition_info)/sizeof(struct mtd_partition); +#endif + return add_mtd_partitions(&nand_info->mtd, rk28_partition_info, sizeof(rk28_partition_info)/sizeof(struct mtd_partition));//MAX_FLASH_PARTITION); +} + +static int __devinit rk28xxnand_probe(struct platform_device *pdev) +{ + struct rknand_info *nand_info; + struct mtd_partition *parts; + int i; + struct resource *res = pdev->resource; + int err = 0; + NAND_DEBUG(NAND_DEBUG_LEVEL0,"rk28xxnand_probe: \n"); + gpNandInfo = kzalloc(sizeof(struct rknand_info), GFP_KERNEL); + if (!gpNandInfo) + return -ENOMEM; + + nand_info = gpNandInfo; + + nand_info->mtd.name = dev_name(&pdev->dev);//pdev->dev.bus_id + nand_info->mtd.priv = &nand_info->rknand; + nand_info->mtd.owner = THIS_MODULE; + + nand_info->page_mtd.name = dev_name(&pdev->dev);//pdev->dev.bus_id + nand_info->page_mtd.priv = &nand_info->rknand; + nand_info->page_mtd.owner = THIS_MODULE; + + if(rk28xxnand_init(nand_info)) + { + err = -ENXIO; + goto exit_free; + } + + /*{ + char pbuf[512]; + GetSNSectorInfo(pbuf); + printk("SN: %x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x",pbuf[2],pbuf[3],pbuf[4],pbuf[5],pbuf[6],pbuf[7],pbuf[8],pbuf[9], + pbuf[10],pbuf[11],pbuf[12],pbuf[13],pbuf[14],pbuf[15],pbuf[16],pbuf[17]); + } */ + + rk28xxnand_add_partitions(nand_info); + return 0; + + #if 0 + nand_info->page_mtd.name = "pagecache"; + add_mtd_device(&nand_info->page_mtd); + #else + //rk28_page_part_info[1].size = nand_info->page_mtd.size - rk28_page_part_info[0].size; + //add_mtd_partitions(&nand_info->page_mtd, rk28_page_part_info, 2); + #endif + +#ifdef use_image + parts = nand_info->parts; + for(i=0;i>> part[%d]: name=%s offset=0x%X\n", i, parts[i].name, parts[i].offset); + if(strcmp(parts[i].name,"cache") == 0) + { + SysImageWriteEndAdd = parts[i].offset; + printk(">>> SysImageWriteEndAdd=0x%X\n", SysImageWriteEndAdd); + break; + } + } +#endif + + FtlSetSysProtAddr(SysImageWriteEndAdd); + dev_set_drvdata(&pdev->dev, nand_info); + + return 0; + +exit_free: + if(nand_info) + kfree(nand_info); + + return err; +} + +static int __devexit rknand_remove(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct rknand_info *nand_info = dev_get_drvdata(&pdev->dev); + struct resource *res = pdev->resource; + unsigned long size = res->end - res->start + 1; + NAND_DEBUG(NAND_DEBUG_LEVEL0,"rk28xx_rknand_remove: \n"); + dev_set_drvdata(&pdev->dev, NULL); + + if (nand_info) { + if (nand_info->parts) + del_mtd_partitions(&nand_info->mtd); + else + del_mtd_device(&nand_info->mtd); + + //rknand_release(&nand_info->mtd); + release_mem_region(res->start, size); + kfree(nand_info); + } + return 0; +} + +void rk28xxnand_shutdown(struct platform_device *pdev) +{ + NAND_DEBUG(NAND_DEBUG_LEVEL0,"rk28xxnand_shutdown\n"); + //rknand_get_device(FL_UNVALID); + //FtlClose(); + //rknand_release_device(); +} + +static struct platform_driver rknand_driver = { + .probe = rk28xxnand_probe, + .remove = rknand_remove, + .suspend = rk28xxnand_suspend, + .resume = rk28xxnand_resume, + .shutdown = rk28xxnand_shutdown, + .driver = { + .name = DRIVER_NAME, + .owner = THIS_MODULE, + //.bus = &platform_bus_type, + }, +}; + + +MODULE_ALIAS(DRIVER_NAME); + +static int __init rknand_init(void) +{ + int ret; + NAND_DEBUG(NAND_DEBUG_LEVEL0,"rknand_init: \n"); + ret = platform_driver_register(&rknand_driver); + NAND_DEBUG(NAND_DEBUG_LEVEL0,"platform_driver_register:ret = %x \n",ret); + return ret; +} + +static void __exit rknand_exit(void) +{ + NAND_DEBUG(NAND_DEBUG_LEVEL0,"rknand_exit: \n"); + rknand_get_device(FL_UNVALID); + FtlClose(); + rknand_release_device(); + platform_driver_unregister(&rknand_driver); +} + +module_init(rknand_init); +module_exit(rknand_exit); + + +#if 0//def CONFIG_rknand +/* +×¢²áÒ»¸ösys dev £¬ÔڹػúºÍ¸´Î»Ê±»Øµ÷£¬°Ñflash¹Ø¼üÐÅϢдµ½nand flashÖУ¬Ï´οª»úʱ¿ÉÒÔ¿ìËÙ¿ª»ú¡£ +*/ + +#include +#include + +static int rknand_sys_suspend(struct sys_device *dev, pm_message_t state) +{ + struct rknand_chip *nand_info = &gpNandInfo->rknand; + NAND_DEBUG(NAND_DEBUG_LEVEL0,"...rknand_sys_suspend...\n"); + extern void FtlCacheWriteBack(void); + nand_info->rknand_schedule_enable = 0; + if (nand_info->state == FL_READY) + { + nand_info->state = FL_WRITING; + FtlCacheWriteBack(); + rknand_release_device(); + } + else + { + nand_info->pFlashCallBack = FtlCacheWriteBack; + } + NAND_DEBUG(NAND_DEBUG_LEVEL0,"...rknand_sys_suspend done...\n"); + return 0; + +} + +static int rknand_sys_resume(struct sys_device *dev) +{ + struct rknand_chip *nand_info = &gpNandInfo->rknand; + nand_info->rknand_schedule_enable = 1; + NAND_DEBUG(NAND_DEBUG_LEVEL0,"...rknand_sys_resume...\n"); + return 0; +} + +static int rknand_sys_shutdown(struct sys_device *dev) +{ + struct rknand_chip *nand_info = &gpNandInfo->rknand; + NAND_DEBUG(NAND_DEBUG_LEVEL0,"...rknand_sys_shutdown...\n"); + nand_info->rknand_schedule_enable = 0; + + if (nand_info->state == FL_READY) + { + //rknand_get_device(FL_UNVALID); + nand_info->state = FL_UNVALID; + FtlClose(); + rknand_release_device(); + } + else + {//flash not ready,use call back + nand_info->pFlashCallBack = FtlClose; + } + return 0; +} + +static struct sysdev_class rknand_sysclass = { + .name = "rknand_sysdev", + .shutdown = rknand_sys_shutdown, + .suspend = rknand_sys_suspend, + .resume = rknand_sys_resume, +}; + +static struct sys_device rknand_sysdevice = { + .id = 0, + .cls = &rknand_sysclass, +}; + +static int __init rknand_sys_init(void) +{ + int ret; + NAND_DEBUG(NAND_DEBUG_LEVEL0,"rknand_sys_init!!!!!!!!!!!!!!\n"); + ret = sysdev_class_register(&rknand_sysclass); + if (ret == 0) + ret = sysdev_register(&rknand_sysdevice); + return ret; +} + +device_initcall(rknand_sys_init); +#endif + + +MODULE_LICENSE(""); +MODULE_AUTHOR("ZYF "); +MODULE_DESCRIPTION("FTL layer for SLC and MlC nand flash on RK28xx SDK boards"); + + diff --git a/drivers/mtd/rknand/typedef.h b/drivers/mtd/rknand/typedef.h new file mode 100755 index 000000000000..0ec757010b6d --- /dev/null +++ b/drivers/mtd/rknand/typedef.h @@ -0,0 +1,56 @@ + +#ifndef __TYPEDEF_H +#define __TYPEDEF_H + +typedef volatile unsigned int REG32; +typedef volatile unsigned short REG16; +typedef volatile unsigned char REG8; + +typedef int BOOLEAN; +typedef BOOLEAN BOOL; + +#define FALSE 0 +#define TRUE (!FALSE) +#define NULL 0 +#define OK 0 +#define ERROR !0 + +//typedef char * va_list; + + +typedef unsigned int uint32; +typedef unsigned int UINT32; +typedef unsigned short UINT16; +typedef unsigned char UINT8; +typedef int INT32; +typedef short INT16; +typedef char INT8; + +typedef unsigned char INT8U; +typedef signed char INT8S; +typedef unsigned short INT16U; +typedef signed short INT16S; +typedef int INT32S; +typedef unsigned int INT32U; + +typedef unsigned long L32U; +typedef signed long L32S; + +typedef unsigned char BYTE; + +//typedef volatile unsigned int data_t; +//typedef volatile unsigned int* addr_t; + +typedef void (*pFunc)(void); //¶¨Ò庯ÊýÖ¸Õë, ÓÃÓÚµ÷Óþø¶ÔµØÖ· + +typedef unsigned char uint8; +typedef signed char int8; +typedef unsigned short uint16; +typedef signed short int16; +typedef signed long int32; +typedef unsigned long long uint64; +typedef signed long long int64; +//typedef unsigned char bool; +typedef unsigned short WCHAR; + +#endif /*__TYPEDEF_H */ diff --git a/mkkrnlimg b/mkkrnlimg new file mode 100755 index 000000000000..234f68da715e Binary files /dev/null and b/mkkrnlimg differ