diff --git a/[refs] b/[refs] index 3145e7777bc8..5290380be023 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: a41842f70d6d6b0cfde3d21e163add81c4318ebd +refs/heads/master: a2302b45d8ab41a55e84c39a6c6f813586ad8493 diff --git a/trunk/Documentation/feature-removal-schedule.txt b/trunk/Documentation/feature-removal-schedule.txt index ed511af0f79a..a5cc0db63d7a 100644 --- a/trunk/Documentation/feature-removal-schedule.txt +++ b/trunk/Documentation/feature-removal-schedule.txt @@ -582,10 +582,3 @@ Why: The paravirt mmu host support is slower than non-paravirt mmu, both Who: Avi Kivity ---------------------------- - -What: "acpi=ht" boot option -When: 2.6.35 -Why: Useful in 2003, implementation is a hack. - Generally invoked by accident today. - Seen as doing more harm than good. -Who: Len Brown diff --git a/trunk/Documentation/kernel-parameters.txt b/trunk/Documentation/kernel-parameters.txt index e4cbca58536c..3bc48b0bd3a9 100644 --- a/trunk/Documentation/kernel-parameters.txt +++ b/trunk/Documentation/kernel-parameters.txt @@ -200,6 +200,10 @@ and is between 256 and 4096 characters. It is defined in the file acpi_display_output=video See above. + acpi_early_pdc_eval [HW,ACPI] Evaluate processor _PDC methods + early. Needed on some platforms to properly + initialize the EC. + acpi_irq_balance [HW,ACPI] ACPI will balance active IRQs default in APIC mode diff --git a/trunk/Documentation/networking/Makefile b/trunk/Documentation/networking/Makefile index 5aba7a33aeeb..6d8af1ac56c4 100644 --- a/trunk/Documentation/networking/Makefile +++ b/trunk/Documentation/networking/Makefile @@ -6,5 +6,3 @@ hostprogs-y := ifenslave # Tell kbuild to always build the programs always := $(hostprogs-y) - -obj-m := timestamping/ diff --git a/trunk/Documentation/networking/timestamping/Makefile b/trunk/Documentation/networking/timestamping/Makefile index e79973443e9f..2a1489fdc036 100644 --- a/trunk/Documentation/networking/timestamping/Makefile +++ b/trunk/Documentation/networking/timestamping/Makefile @@ -1,13 +1,6 @@ -# kbuild trick to avoid linker error. Can be omitted if a module is built. -obj- := dummy.o +CPPFLAGS = -I../../../include -# List of programs to build -hostprogs-y := timestamping - -# Tell kbuild to always build the programs -always := $(hostprogs-y) - -HOSTCFLAGS_timestamping.o += -I$(objtree)/usr/include +timestamping: timestamping.c clean: rm -f timestamping diff --git a/trunk/Documentation/networking/timestamping/timestamping.c b/trunk/Documentation/networking/timestamping/timestamping.c index 8ba82bfe6a33..bab619a48214 100644 --- a/trunk/Documentation/networking/timestamping/timestamping.c +++ b/trunk/Documentation/networking/timestamping/timestamping.c @@ -41,9 +41,9 @@ #include #include -#include -#include -#include +#include "asm/types.h" +#include "linux/net_tstamp.h" +#include "linux/errqueue.h" #ifndef SO_TIMESTAMPING # define SO_TIMESTAMPING 37 @@ -164,7 +164,7 @@ static void printpacket(struct msghdr *msg, int res, gettimeofday(&now, 0); - printf("%ld.%06ld: received %s data, %d bytes from %s, %zu bytes control messages\n", + printf("%ld.%06ld: received %s data, %d bytes from %s, %d bytes control messages\n", (long)now.tv_sec, (long)now.tv_usec, (recvmsg_flags & MSG_ERRQUEUE) ? "error" : "regular", res, @@ -173,7 +173,7 @@ static void printpacket(struct msghdr *msg, int res, for (cmsg = CMSG_FIRSTHDR(msg); cmsg; cmsg = CMSG_NXTHDR(msg, cmsg)) { - printf(" cmsg len %zu: ", cmsg->cmsg_len); + printf(" cmsg len %d: ", cmsg->cmsg_len); switch (cmsg->cmsg_level) { case SOL_SOCKET: printf("SOL_SOCKET "); diff --git a/trunk/MAINTAINERS b/trunk/MAINTAINERS index 382eaa4d0068..fe88b5f732cd 100644 --- a/trunk/MAINTAINERS +++ b/trunk/MAINTAINERS @@ -1405,30 +1405,20 @@ F: arch/x86/include/asm/calgary.h F: arch/x86/include/asm/tce.h CAN NETWORK LAYER -M: Oliver Hartkopp -M: Oliver Hartkopp M: Urs Thuermann -L: socketcan-core@lists.berlios.de -L: netdev@vger.kernel.org +M: Oliver Hartkopp +L: socketcan-core@lists.berlios.de (subscribers-only) W: http://developer.berlios.de/projects/socketcan/ S: Maintained -F: net/can/ +F: drivers/net/can/ +F: include/linux/can/ F: include/linux/can.h -F: include/linux/can/core.h -F: include/linux/can/bcm.h -F: include/linux/can/raw.h CAN NETWORK DRIVERS M: Wolfgang Grandegger -L: socketcan-core@lists.berlios.de -L: netdev@vger.kernel.org +L: socketcan-core@lists.berlios.de (subscribers-only) W: http://developer.berlios.de/projects/socketcan/ S: Maintained -F: drivers/net/can/ -F: include/linux/can/dev.h -F: include/linux/can/error.h -F: include/linux/can/netlink.h -F: include/linux/can/platform/ CELL BROADBAND ENGINE ARCHITECTURE M: Arnd Bergmann @@ -2140,7 +2130,6 @@ F: drivers/net/eexpress.* ETHERNET BRIDGE M: Stephen Hemminger L: bridge@lists.linux-foundation.org -L: netdev@vger.kernel.org W: http://www.linux-foundation.org/en/Net:Bridge S: Maintained F: include/linux/netfilter_bridge/ @@ -4327,7 +4316,6 @@ PERFORMANCE EVENTS SUBSYSTEM M: Peter Zijlstra M: Paul Mackerras M: Ingo Molnar -M: Arnaldo Carvalho de Melo S: Supported F: kernel/perf_event.c F: include/linux/perf_event.h @@ -5214,21 +5202,6 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-next-2.6.git S: Maintained F: arch/sparc/ -SPARC SERIAL DRIVERS -M: "David S. Miller" -L: sparclinux@vger.kernel.org -T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6.git -T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-next-2.6.git -S: Maintained -F: drivers/serial/suncore.c -F: drivers/serial/suncore.h -F: drivers/serial/sunhv.c -F: drivers/serial/sunsab.c -F: drivers/serial/sunsab.h -F: drivers/serial/sunsu.c -F: drivers/serial/sunzilog.c -F: drivers/serial/sunzilog.h - SPECIALIX IO8+ MULTIPORT SERIAL CARD DRIVER M: Roger Wolff S: Supported diff --git a/trunk/arch/arm/boot/compressed/misc.c b/trunk/arch/arm/boot/compressed/misc.c index d32bc71c1f78..d2b2ef41cd4f 100644 --- a/trunk/arch/arm/boot/compressed/misc.c +++ b/trunk/arch/arm/boot/compressed/misc.c @@ -33,6 +33,7 @@ unsigned int __machine_arch_type; #else static void putstr(const char *ptr); +extern void error(char *x); #include diff --git a/trunk/arch/arm/kernel/perf_event.c b/trunk/arch/arm/kernel/perf_event.c index 3875d99cc40f..c54ceb3d1f97 100644 --- a/trunk/arch/arm/kernel/perf_event.c +++ b/trunk/arch/arm/kernel/perf_event.c @@ -965,7 +965,7 @@ armv6pmu_handle_irq(int irq_num, */ armv6_pmcr_write(pmcr); - perf_sample_data_init(&data, 0); + data.addr = 0; cpuc = &__get_cpu_var(cpu_hw_events); for (idx = 0; idx <= armpmu->num_events; ++idx) { @@ -1945,7 +1945,7 @@ static irqreturn_t armv7pmu_handle_irq(int irq_num, void *dev) */ regs = get_irq_regs(); - perf_sample_data_init(&data, 0); + data.addr = 0; cpuc = &__get_cpu_var(cpu_hw_events); for (idx = 0; idx <= armpmu->num_events; ++idx) { diff --git a/trunk/arch/arm/mach-s3c64xx/include/mach/debug-macro.S b/trunk/arch/arm/mach-s3c64xx/include/mach/debug-macro.S index f9ab5d26052a..b18ac5266dfc 100644 --- a/trunk/arch/arm/mach-s3c64xx/include/mach/debug-macro.S +++ b/trunk/arch/arm/mach-s3c64xx/include/mach/debug-macro.S @@ -21,7 +21,7 @@ * aligned and add in the offset when we load the value here. */ - .macro addruart, rx, rtmp + .macro addruart, rx mrc p15, 0, \rx, c1, c0 tst \rx, #1 ldreq \rx, = S3C_PA_UART diff --git a/trunk/arch/arm/mach-s5p6440/include/mach/debug-macro.S b/trunk/arch/arm/mach-s5p6440/include/mach/debug-macro.S index 1347d7f99079..48cdb0da026c 100644 --- a/trunk/arch/arm/mach-s5p6440/include/mach/debug-macro.S +++ b/trunk/arch/arm/mach-s5p6440/include/mach/debug-macro.S @@ -19,7 +19,7 @@ * aligned and add in the offset when we load the value here. */ - .macro addruart, rx, rtmp + .macro addruart, rx mrc p15, 0, \rx, c1, c0 tst \rx, #1 ldreq \rx, = S3C_PA_UART diff --git a/trunk/arch/arm/mach-s5p6442/include/mach/debug-macro.S b/trunk/arch/arm/mach-s5p6442/include/mach/debug-macro.S index bb6536147ffb..1aae691e58ef 100644 --- a/trunk/arch/arm/mach-s5p6442/include/mach/debug-macro.S +++ b/trunk/arch/arm/mach-s5p6442/include/mach/debug-macro.S @@ -15,7 +15,7 @@ #include #include - .macro addruart, rx, rtmp + .macro addruart, rx mrc p15, 0, \rx, c1, c0 tst \rx, #1 ldreq \rx, = S3C_PA_UART diff --git a/trunk/arch/arm/mach-s3c2440/s3c2440-cpufreq.c b/trunk/arch/arm/plat-s3c24xx/s3c2440-cpufreq.c similarity index 100% rename from trunk/arch/arm/mach-s3c2440/s3c2440-cpufreq.c rename to trunk/arch/arm/plat-s3c24xx/s3c2440-cpufreq.c diff --git a/trunk/arch/arm/plat-samsung/pwm.c b/trunk/arch/arm/plat-samsung/pwm.c index f2d11390d01c..ef019f27b67d 100644 --- a/trunk/arch/arm/plat-samsung/pwm.c +++ b/trunk/arch/arm/plat-samsung/pwm.c @@ -379,39 +379,6 @@ static int __devexit s3c_pwm_remove(struct platform_device *pdev) return 0; } -#ifdef CONFIG_PM -static int s3c_pwm_suspend(struct platform_device *pdev, pm_message_t state) -{ - struct pwm_device *pwm = platform_get_drvdata(pdev); - - /* No one preserve these values during suspend so reset them - * Otherwise driver leaves PWM unconfigured if same values - * passed to pwm_config - */ - pwm->period_ns = 0; - pwm->duty_ns = 0; - - return 0; -} - -static int s3c_pwm_resume(struct platform_device *pdev) -{ - struct pwm_device *pwm = platform_get_drvdata(pdev); - unsigned long tcon; - - /* Restore invertion */ - tcon = __raw_readl(S3C2410_TCON); - tcon |= pwm_tcon_invert(pwm); - __raw_writel(tcon, S3C2410_TCON); - - return 0; -} - -#else -#define s3c_pwm_suspend NULL -#define s3c_pwm_resume NULL -#endif - static struct platform_driver s3c_pwm_driver = { .driver = { .name = "s3c24xx-pwm", @@ -419,8 +386,6 @@ static struct platform_driver s3c_pwm_driver = { }, .probe = s3c_pwm_probe, .remove = __devexit_p(s3c_pwm_remove), - .suspend = s3c_pwm_suspend, - .resume = s3c_pwm_resume, }; static int __init pwm_init(void) diff --git a/trunk/arch/ia64/kernel/acpi.c b/trunk/arch/ia64/kernel/acpi.c index f1c9f70b4e45..a7ca07f3754e 100644 --- a/trunk/arch/ia64/kernel/acpi.c +++ b/trunk/arch/ia64/kernel/acpi.c @@ -44,7 +44,6 @@ #include #include #include -#include #include #include #include @@ -908,8 +907,6 @@ int acpi_map_lsapic(acpi_handle handle, int *pcpu) cpu_set(cpu, cpu_present_map); ia64_cpu_to_sapicid[cpu] = physid; - acpi_processor_set_pdc(handle); - *pcpu = cpu; return (0); } diff --git a/trunk/arch/microblaze/Kconfig b/trunk/arch/microblaze/Kconfig index 203ec61c6d4c..b008168ae946 100644 --- a/trunk/arch/microblaze/Kconfig +++ b/trunk/arch/microblaze/Kconfig @@ -14,8 +14,6 @@ config MICROBLAZE select USB_ARCH_HAS_EHCI select ARCH_WANT_OPTIONAL_GPIOLIB select HAVE_OPROFILE - select HAVE_DMA_ATTRS - select HAVE_DMA_API_DEBUG select TRACING_SUPPORT config SWAP @@ -78,6 +76,9 @@ config HAVE_LATENCYTOP_SUPPORT config PCI def_bool n +config NO_DMA + def_bool y + config DTC def_bool y @@ -145,6 +146,7 @@ menu "Advanced setup" config ADVANCED_OPTIONS bool "Prompt for advanced kernel configuration options" + depends on MMU help This option will enable prompting for a variety of advanced kernel configuration options. These options can cause the kernel to not @@ -156,15 +158,6 @@ config ADVANCED_OPTIONS comment "Default settings for advanced configuration options are used" depends on !ADVANCED_OPTIONS -config XILINX_UNCACHED_SHADOW - bool "Are you using uncached shadow for RAM ?" - depends on ADVANCED_OPTIONS && !MMU - default n - help - This is needed to be able to allocate uncachable memory regions. - The feature requires the design to define the RAM memory controller - window to be twice as large as the actual physical memory. - config HIGHMEM_START_BOOL bool "Set high memory pool address" depends on ADVANCED_OPTIONS && HIGHMEM @@ -182,7 +175,7 @@ config HIGHMEM_START config LOWMEM_SIZE_BOOL bool "Set maximum low memory" - depends on ADVANCED_OPTIONS && MMU + depends on ADVANCED_OPTIONS help This option allows you to set the maximum amount of memory which will be used as "low memory", that is, memory which the kernel can @@ -194,6 +187,7 @@ config LOWMEM_SIZE_BOOL config LOWMEM_SIZE hex "Maximum low memory size (in bytes)" if LOWMEM_SIZE_BOOL + depends on MMU default "0x30000000" config KERNEL_START_BOOL @@ -214,7 +208,7 @@ config KERNEL_START config TASK_SIZE_BOOL bool "Set custom user task size" - depends on ADVANCED_OPTIONS && MMU + depends on ADVANCED_OPTIONS help This option allows you to set the amount of virtual address space allocated to user tasks. This can be useful in optimizing the @@ -224,34 +218,42 @@ config TASK_SIZE_BOOL config TASK_SIZE hex "Size of user task space" if TASK_SIZE_BOOL + depends on MMU default "0x80000000" -endmenu +config CONSISTENT_START_BOOL + bool "Set custom consistent memory pool address" + depends on ADVANCED_OPTIONS && NOT_COHERENT_CACHE + help + This option allows you to set the base virtual address + of the the consistent memory pool. This pool of virtual + memory is used to make consistent memory allocations. -source "mm/Kconfig" +config CONSISTENT_START + hex "Base virtual address of consistent memory pool" if CONSISTENT_START_BOOL + depends on MMU + default "0xff100000" if NOT_COHERENT_CACHE -menu "Exectuable file formats" +config CONSISTENT_SIZE_BOOL + bool "Set custom consistent memory pool size" + depends on ADVANCED_OPTIONS && NOT_COHERENT_CACHE + help + This option allows you to set the size of the the + consistent memory pool. This pool of virtual memory + is used to make consistent memory allocations. -source "fs/Kconfig.binfmt" +config CONSISTENT_SIZE + hex "Size of consistent memory pool" if CONSISTENT_SIZE_BOOL + depends on MMU + default "0x00200000" if NOT_COHERENT_CACHE endmenu -menu "Bus Options" - -config PCI - bool "PCI support" - -config PCI_DOMAINS - def_bool PCI - -config PCI_SYSCALL - def_bool PCI +source "mm/Kconfig" -config PCI_XILINX - bool "Xilinx PCI host bridge support" - depends on PCI +menu "Exectuable file formats" -source "drivers/pci/Kconfig" +source "fs/Kconfig.binfmt" endmenu diff --git a/trunk/arch/microblaze/Makefile b/trunk/arch/microblaze/Makefile index 836832dd9b26..d2d6cfcb1a30 100644 --- a/trunk/arch/microblaze/Makefile +++ b/trunk/arch/microblaze/Makefile @@ -50,7 +50,6 @@ libs-y += $(LIBGCC) core-y += arch/microblaze/kernel/ core-y += arch/microblaze/mm/ core-y += arch/microblaze/platform/ -core-$(CONFIG_PCI) += arch/microblaze/pci/ drivers-$(CONFIG_OPROFILE) += arch/microblaze/oprofile/ diff --git a/trunk/arch/microblaze/include/asm/device.h b/trunk/arch/microblaze/include/asm/device.h index 402b46e630f6..78a038452c0f 100644 --- a/trunk/arch/microblaze/include/asm/device.h +++ b/trunk/arch/microblaze/include/asm/device.h @@ -14,10 +14,6 @@ struct device_node; struct dev_archdata { /* Optional pointer to an OF device node */ struct device_node *of_node; - - /* DMA operations on that device */ - struct dma_map_ops *dma_ops; - void *dma_data; }; struct pdev_archdata { diff --git a/trunk/arch/microblaze/include/asm/dma-mapping.h b/trunk/arch/microblaze/include/asm/dma-mapping.h index 18b3731c8509..d00e40099165 100644 --- a/trunk/arch/microblaze/include/asm/dma-mapping.h +++ b/trunk/arch/microblaze/include/asm/dma-mapping.h @@ -1,153 +1 @@ -/* - * Implements the generic device dma API for microblaze and the pci - * - * Copyright (C) 2009-2010 Michal Simek - * Copyright (C) 2009-2010 PetaLogix - * - * This file is subject to the terms and conditions of the GNU General - * Public License. See the file COPYING in the main directory of this - * archive for more details. - * - * This file is base on powerpc and x86 dma-mapping.h versions - * Copyright (C) 2004 IBM - */ - -#ifndef _ASM_MICROBLAZE_DMA_MAPPING_H -#define _ASM_MICROBLAZE_DMA_MAPPING_H - -/* - * See Documentation/PCI/PCI-DMA-mapping.txt and - * Documentation/DMA-API.txt for documentation. - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#define DMA_ERROR_CODE (~(dma_addr_t)0x0) - -#define __dma_alloc_coherent(dev, gfp, size, handle) NULL -#define __dma_free_coherent(size, addr) ((void)0) -#define __dma_sync(addr, size, rw) ((void)0) - -static inline unsigned long device_to_mask(struct device *dev) -{ - if (dev->dma_mask && *dev->dma_mask) - return *dev->dma_mask; - /* Assume devices without mask can take 32 bit addresses */ - return 0xfffffffful; -} - -extern struct dma_map_ops *dma_ops; - -/* - * Available generic sets of operations - */ -extern struct dma_map_ops dma_direct_ops; - -static inline struct dma_map_ops *get_dma_ops(struct device *dev) -{ - /* We don't handle the NULL dev case for ISA for now. We could - * do it via an out of line call but it is not needed for now. The - * only ISA DMA device we support is the floppy and we have a hack - * in the floppy driver directly to get a device for us. - */ - if (unlikely(!dev) || !dev->archdata.dma_ops) - return NULL; - - return dev->archdata.dma_ops; -} - -static inline void set_dma_ops(struct device *dev, struct dma_map_ops *ops) -{ - dev->archdata.dma_ops = ops; -} - -static inline int dma_supported(struct device *dev, u64 mask) -{ - struct dma_map_ops *ops = get_dma_ops(dev); - - if (unlikely(!ops)) - return 0; - if (!ops->dma_supported) - return 1; - return ops->dma_supported(dev, mask); -} - -#ifdef CONFIG_PCI -/* We have our own implementation of pci_set_dma_mask() */ -#define HAVE_ARCH_PCI_SET_DMA_MASK - -#endif - -static inline int dma_set_mask(struct device *dev, u64 dma_mask) -{ - struct dma_map_ops *ops = get_dma_ops(dev); - - if (unlikely(ops == NULL)) - return -EIO; - if (ops->set_dma_mask) - return ops->set_dma_mask(dev, dma_mask); - if (!dev->dma_mask || !dma_supported(dev, dma_mask)) - return -EIO; - *dev->dma_mask = dma_mask; - return 0; -} - -#include - -static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr) -{ - struct dma_map_ops *ops = get_dma_ops(dev); - if (ops->mapping_error) - return ops->mapping_error(dev, dma_addr); - - return (dma_addr == DMA_ERROR_CODE); -} - -#define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f) -#define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h) -#define dma_is_consistent(d, h) (1) - -static inline void *dma_alloc_coherent(struct device *dev, size_t size, - dma_addr_t *dma_handle, gfp_t flag) -{ - struct dma_map_ops *ops = get_dma_ops(dev); - void *memory; - - BUG_ON(!ops); - - memory = ops->alloc_coherent(dev, size, dma_handle, flag); - - debug_dma_alloc_coherent(dev, size, *dma_handle, memory); - return memory; -} - -static inline void dma_free_coherent(struct device *dev, size_t size, - void *cpu_addr, dma_addr_t dma_handle) -{ - struct dma_map_ops *ops = get_dma_ops(dev); - - BUG_ON(!ops); - debug_dma_free_coherent(dev, size, cpu_addr, dma_handle); - ops->free_coherent(dev, size, cpu_addr, dma_handle); -} - -static inline int dma_get_cache_alignment(void) -{ - return L1_CACHE_BYTES; -} - -static inline void dma_cache_sync(struct device *dev, void *vaddr, size_t size, - enum dma_data_direction direction) -{ - BUG_ON(direction == DMA_NONE); - __dma_sync(vaddr, size, (int)direction); -} - -#endif /* _ASM_MICROBLAZE_DMA_MAPPING_H */ +#include diff --git a/trunk/arch/microblaze/include/asm/io.h b/trunk/arch/microblaze/include/asm/io.h index 32d621a56aee..267c7c779e53 100644 --- a/trunk/arch/microblaze/include/asm/io.h +++ b/trunk/arch/microblaze/include/asm/io.h @@ -15,23 +15,7 @@ #include #include #include /* Get struct page {...} */ -#include -#ifndef CONFIG_PCI -#define _IO_BASE 0 -#define _ISA_MEM_BASE 0 -#define PCI_DRAM_OFFSET 0 -#else -#define _IO_BASE isa_io_base -#define _ISA_MEM_BASE isa_mem_base -#define PCI_DRAM_OFFSET pci_dram_offset -#endif - -extern unsigned long isa_io_base; -extern unsigned long pci_io_base; -extern unsigned long pci_dram_offset; - -extern resource_size_t isa_mem_base; #define IO_SPACE_LIMIT (0xFFFFFFFF) @@ -140,6 +124,9 @@ static inline void writel(unsigned int v, volatile void __iomem *addr) #define virt_to_phys(addr) ((unsigned long)__virt_to_phys(addr)) #define virt_to_bus(addr) ((unsigned long)__virt_to_phys(addr)) +#define __page_address(page) \ + (PAGE_OFFSET + (((page) - mem_map) << PAGE_SHIFT)) +#define page_to_phys(page) virt_to_phys((void *)__page_address(page)) #define page_to_bus(page) (page_to_phys(page)) #define bus_to_virt(addr) (phys_to_virt(addr)) @@ -240,7 +227,15 @@ static inline void __iomem *__ioremap(phys_addr_t address, unsigned long size, #define out_8(a, v) __raw_writeb((v), (a)) #define in_8(a) __raw_readb(a) -#define ioport_map(port, nr) ((void __iomem *)(port)) -#define ioport_unmap(addr) +/* FIXME */ +static inline void __iomem *ioport_map(unsigned long port, unsigned int len) +{ + return (void __iomem *) (port); +} + +static inline void ioport_unmap(void __iomem *addr) +{ + /* Nothing to do */ +} #endif /* _ASM_MICROBLAZE_IO_H */ diff --git a/trunk/arch/microblaze/include/asm/irq.h b/trunk/arch/microblaze/include/asm/irq.h index 31a35c33df63..90f050535ebe 100644 --- a/trunk/arch/microblaze/include/asm/irq.h +++ b/trunk/arch/microblaze/include/asm/irq.h @@ -14,12 +14,6 @@ #include -/* This type is the placeholder for a hardware interrupt number. It has to - * be big enough to enclose whatever representation is used by a given - * platform. - */ -typedef unsigned long irq_hw_number_t; - extern unsigned int nr_irq; #define NO_IRQ (-1) @@ -27,8 +21,7 @@ extern unsigned int nr_irq; struct pt_regs; extern void do_IRQ(struct pt_regs *regs); -/** - * irq_of_parse_and_map - Parse and Map an interrupt into linux virq space +/* irq_of_parse_and_map - Parse and Map an interrupt into linux virq space * @device: Device node of the device whose interrupt is to be mapped * @index: Index of the interrupt to map * @@ -47,32 +40,4 @@ static inline void irq_dispose_mapping(unsigned int virq) return; } -struct irq_host; - -/** - * irq_create_mapping - Map a hardware interrupt into linux virq space - * @host: host owning this hardware interrupt or NULL for default host - * @hwirq: hardware irq number in that host space - * - * Only one mapping per hardware interrupt is permitted. Returns a linux - * virq number. - * If the sense/trigger is to be specified, set_irq_type() should be called - * on the number returned from that call. - */ -extern unsigned int irq_create_mapping(struct irq_host *host, - irq_hw_number_t hwirq); - -/** - * irq_create_of_mapping - Map a hardware interrupt into linux virq space - * @controller: Device node of the interrupt controller - * @inspec: Interrupt specifier from the device-tree - * @intsize: Size of the interrupt specifier from the device-tree - * - * This function is identical to irq_create_mapping except that it takes - * as input informations straight from the device-tree (typically the results - * of the of_irq_map_*() functions. - */ -extern unsigned int irq_create_of_mapping(struct device_node *controller, - u32 *intspec, unsigned int intsize); - #endif /* _ASM_MICROBLAZE_IRQ_H */ diff --git a/trunk/arch/microblaze/include/asm/page.h b/trunk/arch/microblaze/include/asm/page.h index 2dd1d04129e0..9b66c0fa9a32 100644 --- a/trunk/arch/microblaze/include/asm/page.h +++ b/trunk/arch/microblaze/include/asm/page.h @@ -61,6 +61,12 @@ extern unsigned int __page_offset; */ #define PAGE_OFFSET CONFIG_KERNEL_START +/* + * MAP_NR -- given an address, calculate the index of the page struct which + * points to the address's page. + */ +#define MAP_NR(addr) (((unsigned long)(addr) - PAGE_OFFSET) >> PAGE_SHIFT) + /* * The basic type of a PTE - 32 bit physical addressing. */ @@ -148,11 +154,7 @@ extern int page_is_ram(unsigned long pfn); # define pfn_to_virt(pfn) __va(pfn_to_phys((pfn))) # ifdef CONFIG_MMU - -# define virt_to_page(kaddr) (pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)) -# define page_to_virt(page) __va(page_to_pfn(page) << PAGE_SHIFT) -# define page_to_phys(page) (page_to_pfn(page) << PAGE_SHIFT) - +# define virt_to_page(kaddr) (mem_map + MAP_NR(kaddr)) # else /* CONFIG_MMU */ # define virt_to_page(vaddr) (pfn_to_page(virt_to_pfn(vaddr))) # define page_to_virt(page) (pfn_to_virt(page_to_pfn(page))) diff --git a/trunk/arch/microblaze/include/asm/pci-bridge.h b/trunk/arch/microblaze/include/asm/pci-bridge.h index 0c77cda9f5d8..7ad28f6f5f1a 100644 --- a/trunk/arch/microblaze/include/asm/pci-bridge.h +++ b/trunk/arch/microblaze/include/asm/pci-bridge.h @@ -1,196 +1 @@ -#ifndef _ASM_MICROBLAZE_PCI_BRIDGE_H -#define _ASM_MICROBLAZE_PCI_BRIDGE_H -#ifdef __KERNEL__ -/* - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version - * 2 of the License, or (at your option) any later version. - */ #include -#include -#include - -struct device_node; - -enum { - /* Force re-assigning all resources (ignore firmware - * setup completely) - */ - PCI_REASSIGN_ALL_RSRC = 0x00000001, - - /* Re-assign all bus numbers */ - PCI_REASSIGN_ALL_BUS = 0x00000002, - - /* Do not try to assign, just use existing setup */ - PCI_PROBE_ONLY = 0x00000004, - - /* Don't bother with ISA alignment unless the bridge has - * ISA forwarding enabled - */ - PCI_CAN_SKIP_ISA_ALIGN = 0x00000008, - - /* Enable domain numbers in /proc */ - PCI_ENABLE_PROC_DOMAINS = 0x00000010, - /* ... except for domain 0 */ - PCI_COMPAT_DOMAIN_0 = 0x00000020, -}; - -/* - * Structure of a PCI controller (host bridge) - */ -struct pci_controller { - struct pci_bus *bus; - char is_dynamic; - struct device_node *dn; - struct list_head list_node; - struct device *parent; - - int first_busno; - int last_busno; - - int self_busno; - - void __iomem *io_base_virt; - resource_size_t io_base_phys; - - resource_size_t pci_io_size; - - /* Some machines (PReP) have a non 1:1 mapping of - * the PCI memory space in the CPU bus space - */ - resource_size_t pci_mem_offset; - - /* Some machines have a special region to forward the ISA - * "memory" cycles such as VGA memory regions. Left to 0 - * if unsupported - */ - resource_size_t isa_mem_phys; - resource_size_t isa_mem_size; - - struct pci_ops *ops; - unsigned int __iomem *cfg_addr; - void __iomem *cfg_data; - - /* - * Used for variants of PCI indirect handling and possible quirks: - * SET_CFG_TYPE - used on 4xx or any PHB that does explicit type0/1 - * EXT_REG - provides access to PCI-e extended registers - * SURPRESS_PRIMARY_BUS - we surpress the setting of PCI_PRIMARY_BUS - * on Freescale PCI-e controllers since they used the PCI_PRIMARY_BUS - * to determine which bus number to match on when generating type0 - * config cycles - * NO_PCIE_LINK - the Freescale PCI-e controllers have issues with - * hanging if we don't have link and try to do config cycles to - * anything but the PHB. Only allow talking to the PHB if this is - * set. - * BIG_ENDIAN - cfg_addr is a big endian register - * BROKEN_MRM - the 440EPx/GRx chips have an errata that causes hangs - * on the PLB4. Effectively disable MRM commands by setting this. - */ -#define INDIRECT_TYPE_SET_CFG_TYPE 0x00000001 -#define INDIRECT_TYPE_EXT_REG 0x00000002 -#define INDIRECT_TYPE_SURPRESS_PRIMARY_BUS 0x00000004 -#define INDIRECT_TYPE_NO_PCIE_LINK 0x00000008 -#define INDIRECT_TYPE_BIG_ENDIAN 0x00000010 -#define INDIRECT_TYPE_BROKEN_MRM 0x00000020 - u32 indirect_type; - - /* Currently, we limit ourselves to 1 IO range and 3 mem - * ranges since the common pci_bus structure can't handle more - */ - struct resource io_resource; - struct resource mem_resources[3]; - int global_number; /* PCI domain number */ -}; - -static inline struct pci_controller *pci_bus_to_host(const struct pci_bus *bus) -{ - return bus->sysdata; -} - -static inline int isa_vaddr_is_ioport(void __iomem *address) -{ - /* No specific ISA handling on ppc32 at this stage, it - * all goes through PCI - */ - return 0; -} - -/* These are used for config access before all the PCI probing - has been done. */ -extern int early_read_config_byte(struct pci_controller *hose, int bus, - int dev_fn, int where, u8 *val); -extern int early_read_config_word(struct pci_controller *hose, int bus, - int dev_fn, int where, u16 *val); -extern int early_read_config_dword(struct pci_controller *hose, int bus, - int dev_fn, int where, u32 *val); -extern int early_write_config_byte(struct pci_controller *hose, int bus, - int dev_fn, int where, u8 val); -extern int early_write_config_word(struct pci_controller *hose, int bus, - int dev_fn, int where, u16 val); -extern int early_write_config_dword(struct pci_controller *hose, int bus, - int dev_fn, int where, u32 val); - -extern int early_find_capability(struct pci_controller *hose, int bus, - int dev_fn, int cap); - -extern void setup_indirect_pci(struct pci_controller *hose, - resource_size_t cfg_addr, - resource_size_t cfg_data, u32 flags); - -/* Get the PCI host controller for an OF device */ -extern struct pci_controller *pci_find_hose_for_OF_device( - struct device_node *node); - -/* Fill up host controller resources from the OF node */ -extern void pci_process_bridge_OF_ranges(struct pci_controller *hose, - struct device_node *dev, int primary); - -/* Allocate & free a PCI host bridge structure */ -extern struct pci_controller *pcibios_alloc_controller(struct device_node *dev); -extern void pcibios_free_controller(struct pci_controller *phb); -extern void pcibios_setup_phb_resources(struct pci_controller *hose); - -#ifdef CONFIG_PCI -extern unsigned int pci_flags; - -static inline void pci_set_flags(int flags) -{ - pci_flags = flags; -} - -static inline void pci_add_flags(int flags) -{ - pci_flags |= flags; -} - -static inline int pci_has_flag(int flag) -{ - return pci_flags & flag; -} - -extern struct list_head hose_list; - -extern unsigned long pci_address_to_pio(phys_addr_t address); -extern int pcibios_vaddr_is_ioport(void __iomem *address); -#else -static inline unsigned long pci_address_to_pio(phys_addr_t address) -{ - return (unsigned long)-1; -} -static inline int pcibios_vaddr_is_ioport(void __iomem *address) -{ - return 0; -} - -static inline void pci_set_flags(int flags) { } -static inline void pci_add_flags(int flags) { } -static inline int pci_has_flag(int flag) -{ - return 0; -} -#endif /* CONFIG_PCI */ - -#endif /* __KERNEL__ */ -#endif /* _ASM_MICROBLAZE_PCI_BRIDGE_H */ diff --git a/trunk/arch/microblaze/include/asm/pci.h b/trunk/arch/microblaze/include/asm/pci.h index bdd65aaee30d..9f0df5faf2c8 100644 --- a/trunk/arch/microblaze/include/asm/pci.h +++ b/trunk/arch/microblaze/include/asm/pci.h @@ -1,177 +1 @@ -/* - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version - * 2 of the License, or (at your option) any later version. - * - * Based on powerpc version - */ - -#ifndef __ASM_MICROBLAZE_PCI_H -#define __ASM_MICROBLAZE_PCI_H -#ifdef __KERNEL__ - -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#define PCIBIOS_MIN_IO 0x1000 -#define PCIBIOS_MIN_MEM 0x10000000 - -struct pci_dev; - -/* Values for the `which' argument to sys_pciconfig_iobase syscall. */ -#define IOBASE_BRIDGE_NUMBER 0 -#define IOBASE_MEMORY 1 -#define IOBASE_IO 2 -#define IOBASE_ISA_IO 3 -#define IOBASE_ISA_MEM 4 - -#define pcibios_scan_all_fns(a, b) 0 - -/* - * Set this to 1 if you want the kernel to re-assign all PCI - * bus numbers (don't do that on ppc64 yet !) - */ -#define pcibios_assign_all_busses() \ - (pci_has_flag(PCI_REASSIGN_ALL_BUS)) - -static inline void pcibios_set_master(struct pci_dev *dev) -{ - /* No special bus mastering setup handling */ -} - -static inline void pcibios_penalize_isa_irq(int irq, int active) -{ - /* We don't do dynamic PCI IRQ allocation */ -} - -#ifdef CONFIG_PCI -extern void set_pci_dma_ops(struct dma_map_ops *dma_ops); -extern struct dma_map_ops *get_pci_dma_ops(void); -#else /* CONFIG_PCI */ -#define set_pci_dma_ops(d) -#define get_pci_dma_ops() NULL -#endif - -#ifdef CONFIG_PCI -static inline void pci_dma_burst_advice(struct pci_dev *pdev, - enum pci_dma_burst_strategy *strat, - unsigned long *strategy_parameter) -{ - *strat = PCI_DMA_BURST_INFINITY; - *strategy_parameter = ~0UL; -} -#endif - -extern int pci_domain_nr(struct pci_bus *bus); - -/* Decide whether to display the domain number in /proc */ -extern int pci_proc_domain(struct pci_bus *bus); - -struct vm_area_struct; -/* Map a range of PCI memory or I/O space for a device into user space */ -int pci_mmap_page_range(struct pci_dev *pdev, struct vm_area_struct *vma, - enum pci_mmap_state mmap_state, int write_combine); - -/* Tell drivers/pci/proc.c that we have pci_mmap_page_range() */ -#define HAVE_PCI_MMAP 1 - -extern int pci_legacy_read(struct pci_bus *bus, loff_t port, u32 *val, - size_t count); -extern int pci_legacy_write(struct pci_bus *bus, loff_t port, u32 val, - size_t count); -extern int pci_mmap_legacy_page_range(struct pci_bus *bus, - struct vm_area_struct *vma, - enum pci_mmap_state mmap_state); - -#define HAVE_PCI_LEGACY 1 - -/* pci_unmap_{page,single} is a nop so... */ -#define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME) -#define DECLARE_PCI_UNMAP_LEN(LEN_NAME) -#define pci_unmap_addr(PTR, ADDR_NAME) (0) -#define pci_unmap_addr_set(PTR, ADDR_NAME, VAL) do { } while (0) -#define pci_unmap_len(PTR, LEN_NAME) (0) -#define pci_unmap_len_set(PTR, LEN_NAME, VAL) do { } while (0) - -/* The PCI address space does equal the physical memory - * address space (no IOMMU). The IDE and SCSI device layers use - * this boolean for bounce buffer decisions. - */ -#define PCI_DMA_BUS_IS_PHYS (1) - -extern void pcibios_resource_to_bus(struct pci_dev *dev, - struct pci_bus_region *region, - struct resource *res); - -extern void pcibios_bus_to_resource(struct pci_dev *dev, - struct resource *res, - struct pci_bus_region *region); - -static inline struct resource *pcibios_select_root(struct pci_dev *pdev, - struct resource *res) -{ - struct resource *root = NULL; - - if (res->flags & IORESOURCE_IO) - root = &ioport_resource; - if (res->flags & IORESOURCE_MEM) - root = &iomem_resource; - - return root; -} - -extern void pcibios_claim_one_bus(struct pci_bus *b); - -extern void pcibios_finish_adding_to_bus(struct pci_bus *bus); - -extern void pcibios_resource_survey(void); - -extern struct pci_controller *init_phb_dynamic(struct device_node *dn); -extern int remove_phb_dynamic(struct pci_controller *phb); - -extern struct pci_dev *of_create_pci_dev(struct device_node *node, - struct pci_bus *bus, int devfn); - -extern void of_scan_pci_bridge(struct device_node *node, - struct pci_dev *dev); - -extern void of_scan_bus(struct device_node *node, struct pci_bus *bus); -extern void of_rescan_bus(struct device_node *node, struct pci_bus *bus); - -extern int pci_read_irq_line(struct pci_dev *dev); - -extern int pci_bus_find_capability(struct pci_bus *bus, - unsigned int devfn, int cap); - -struct file; -extern pgprot_t pci_phys_mem_access_prot(struct file *file, - unsigned long pfn, - unsigned long size, - pgprot_t prot); - -#define HAVE_ARCH_PCI_RESOURCE_TO_USER -extern void pci_resource_to_user(const struct pci_dev *dev, int bar, - const struct resource *rsrc, - resource_size_t *start, resource_size_t *end); - -extern void pcibios_setup_bus_devices(struct pci_bus *bus); -extern void pcibios_setup_bus_self(struct pci_bus *bus); - -/* This part of code was originaly in xilinx-pci.h */ -#ifdef CONFIG_PCI_XILINX -extern void __init xilinx_pci_init(void); -#else -static inline void __init xilinx_pci_init(void) { return; } -#endif - -#endif /* __KERNEL__ */ -#endif /* __ASM_MICROBLAZE_PCI_H */ +#include diff --git a/trunk/arch/microblaze/include/asm/pgalloc.h b/trunk/arch/microblaze/include/asm/pgalloc.h index f44b0d696fe2..7547f5064560 100644 --- a/trunk/arch/microblaze/include/asm/pgalloc.h +++ b/trunk/arch/microblaze/include/asm/pgalloc.h @@ -19,7 +19,6 @@ #include #include #include -#include #define PGDIR_ORDER 0 @@ -112,6 +111,7 @@ static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address) { pte_t *pte; + extern int mem_init_done; extern void *early_get_page(void); if (mem_init_done) { pte = (pte_t *)__get_free_page(GFP_KERNEL | diff --git a/trunk/arch/microblaze/include/asm/pgtable.h b/trunk/arch/microblaze/include/asm/pgtable.h index dd2bb60651c7..cc3a4dfc3eaa 100644 --- a/trunk/arch/microblaze/include/asm/pgtable.h +++ b/trunk/arch/microblaze/include/asm/pgtable.h @@ -16,10 +16,6 @@ #define io_remap_pfn_range(vma, vaddr, pfn, size, prot) \ remap_pfn_range(vma, vaddr, pfn, size, prot) -#ifndef __ASSEMBLY__ -extern int mem_init_done; -#endif - #ifndef CONFIG_MMU #define pgd_present(pgd) (1) /* pages are always present on non MMU */ @@ -55,8 +51,6 @@ static inline int pte_file(pte_t pte) { return 0; } #define arch_enter_lazy_cpu_mode() do {} while (0) -#define pgprot_noncached_wc(prot) prot - #else /* CONFIG_MMU */ #include @@ -74,6 +68,7 @@ static inline int pte_file(pte_t pte) { return 0; } extern unsigned long va_to_phys(unsigned long address); extern pte_t *va_to_pte(unsigned long address); +extern unsigned long ioremap_bot, ioremap_base; /* * The following only work if pte_present() is true. @@ -90,24 +85,10 @@ static inline pte_t pte_mkspecial(pte_t pte) { return pte; } #define VMALLOC_START (CONFIG_KERNEL_START + \ max(32 * 1024 * 1024UL, memory_size)) #define VMALLOC_END ioremap_bot +#define VMALLOC_VMADDR(x) ((unsigned long)(x)) #endif /* __ASSEMBLY__ */ -/* - * Macro to mark a page protection value as "uncacheable". - */ - -#define _PAGE_CACHE_CTL (_PAGE_GUARDED | _PAGE_NO_CACHE | \ - _PAGE_WRITETHRU) - -#define pgprot_noncached(prot) \ - (__pgprot((pgprot_val(prot) & ~_PAGE_CACHE_CTL) | \ - _PAGE_NO_CACHE | _PAGE_GUARDED)) - -#define pgprot_noncached_wc(prot) \ - (__pgprot((pgprot_val(prot) & ~_PAGE_CACHE_CTL) | \ - _PAGE_NO_CACHE)) - /* * The MicroBlaze MMU is identical to the PPC-40x MMU, and uses a hash * table containing PTEs, together with a set of 16 segment registers, to @@ -416,7 +397,7 @@ static inline unsigned long pte_update(pte_t *p, unsigned long clr, mts rmsr, %2\n\ nop" : "=&r" (old), "=&r" (tmp), "=&r" (msr), "=m" (*p) - : "r" ((unsigned long)(p + 1) - 4), "r" (clr), "r" (set), "m" (*p) + : "r" ((unsigned long)(p+1) - 4), "r" (clr), "r" (set), "m" (*p) : "cc"); return old; @@ -585,11 +566,18 @@ void mapin_ram(void); int map_page(unsigned long va, phys_addr_t pa, int flags); extern int mem_init_done; +extern unsigned long ioremap_base; +extern unsigned long ioremap_bot; asmlinkage void __init mmu_init(void); void __init *early_get_page(void); +void *consistent_alloc(int gfp, size_t size, dma_addr_t *dma_handle); +void consistent_free(void *vaddr); +void consistent_sync(void *vaddr, size_t size, int direction); +void consistent_sync_page(struct page *page, unsigned long offset, + size_t size, int direction); #endif /* __ASSEMBLY__ */ #endif /* __KERNEL__ */ @@ -598,14 +586,6 @@ void __init *early_get_page(void); #ifndef __ASSEMBLY__ #include -extern unsigned long ioremap_bot, ioremap_base; - -void *consistent_alloc(int gfp, size_t size, dma_addr_t *dma_handle); -void consistent_free(void *vaddr); -void consistent_sync(void *vaddr, size_t size, int direction); -void consistent_sync_page(struct page *page, unsigned long offset, - size_t size, int direction); - void setup_memory(void); #endif /* __ASSEMBLY__ */ diff --git a/trunk/arch/microblaze/include/asm/prom.h b/trunk/arch/microblaze/include/asm/prom.h index e7d67a329bd7..03f45a963204 100644 --- a/trunk/arch/microblaze/include/asm/prom.h +++ b/trunk/arch/microblaze/include/asm/prom.h @@ -31,21 +31,6 @@ /* Other Prototypes */ extern int early_uartlite_console(void); -#ifdef CONFIG_PCI -/* - * PCI <-> OF matching functions - * (XXX should these be here?) - */ -struct pci_bus; -struct pci_dev; -extern int pci_device_from_OF_node(struct device_node *node, - u8 *bus, u8 *devfn); -extern struct device_node *pci_busdev_to_OF_node(struct pci_bus *bus, - int devfn); -extern struct device_node *pci_device_to_OF_node(struct pci_dev *dev); -extern void pci_create_OF_bus_map(void); -#endif - /* * OF address retreival & translation */ diff --git a/trunk/arch/microblaze/include/asm/system.h b/trunk/arch/microblaze/include/asm/system.h index 59efb3fef957..157970688b2a 100644 --- a/trunk/arch/microblaze/include/asm/system.h +++ b/trunk/arch/microblaze/include/asm/system.h @@ -87,9 +87,6 @@ void free_initmem(void); extern char *klimit; extern void ret_from_fork(void); -extern void *alloc_maybe_bootmem(size_t size, gfp_t mask); -extern void *zalloc_maybe_bootmem(size_t size, gfp_t mask); - #ifdef CONFIG_DEBUG_FS extern struct dentry *of_debugfs_root; #endif diff --git a/trunk/arch/microblaze/include/asm/tlbflush.h b/trunk/arch/microblaze/include/asm/tlbflush.h index bcb8b41d55af..10ec70cd8735 100644 --- a/trunk/arch/microblaze/include/asm/tlbflush.h +++ b/trunk/arch/microblaze/include/asm/tlbflush.h @@ -23,7 +23,7 @@ extern void _tlbie(unsigned long address); extern void _tlbia(void); -#define __tlbia() { preempt_disable(); _tlbia(); preempt_enable(); } +#define __tlbia() _tlbia() static inline void local_flush_tlb_all(void) { __tlbia(); } diff --git a/trunk/arch/microblaze/kernel/Makefile b/trunk/arch/microblaze/kernel/Makefile index e51bc1520825..b07594eccf9b 100644 --- a/trunk/arch/microblaze/kernel/Makefile +++ b/trunk/arch/microblaze/kernel/Makefile @@ -14,7 +14,7 @@ endif extra-y := head.o vmlinux.lds -obj-y += dma.o exceptions.o \ +obj-y += exceptions.o \ hw_exception_handler.o init_task.o intc.o irq.o of_device.o \ of_platform.o process.o prom.o prom_parse.o ptrace.o \ setup.o signal.o sys_microblaze.o timer.o traps.o reset.o diff --git a/trunk/arch/microblaze/kernel/asm-offsets.c b/trunk/arch/microblaze/kernel/asm-offsets.c index 0071260a672c..7bc7b68f97db 100644 --- a/trunk/arch/microblaze/kernel/asm-offsets.c +++ b/trunk/arch/microblaze/kernel/asm-offsets.c @@ -90,7 +90,6 @@ int main(int argc, char *argv[]) DEFINE(TI_FLAGS, offsetof(struct thread_info, flags)); DEFINE(TI_ADDR_LIMIT, offsetof(struct thread_info, addr_limit)); DEFINE(TI_CPU_CONTEXT, offsetof(struct thread_info, cpu_context)); - DEFINE(TI_PREEMPT_COUNT, offsetof(struct thread_info, preempt_count)); BLANK(); /* struct cpu_context */ diff --git a/trunk/arch/microblaze/kernel/cpu/cache.c b/trunk/arch/microblaze/kernel/cpu/cache.c index f04d8a86dead..2a56bccce4e0 100644 --- a/trunk/arch/microblaze/kernel/cpu/cache.c +++ b/trunk/arch/microblaze/kernel/cpu/cache.c @@ -15,6 +15,25 @@ #include #include +static inline void __invalidate_flush_icache(unsigned int addr) +{ + __asm__ __volatile__ ("wic %0, r0;" \ + : : "r" (addr)); +} + +static inline void __flush_dcache(unsigned int addr) +{ + __asm__ __volatile__ ("wdc.flush %0, r0;" \ + : : "r" (addr)); +} + +static inline void __invalidate_dcache(unsigned int baseaddr, + unsigned int offset) +{ + __asm__ __volatile__ ("wdc.clear %0, %1;" \ + : : "r" (baseaddr), "r" (offset)); +} + static inline void __enable_icache_msr(void) { __asm__ __volatile__ (" msrset r0, %0; \ @@ -129,9 +148,9 @@ do { \ int step = -line_length; \ BUG_ON(step >= 0); \ \ - __asm__ __volatile__ (" 1: " #op " r0, %0; \ - bgtid %0, 1b; \ - addk %0, %0, %1; \ + __asm__ __volatile__ (" 1: " #op " r0, %0; \ + bgtid %0, 1b; \ + addk %0, %0, %1; \ " : : "r" (len), "r" (step) \ : "memory"); \ } while (0); @@ -143,9 +162,9 @@ do { \ int count = end - start; \ BUG_ON(count <= 0); \ \ - __asm__ __volatile__ (" 1: " #op " %0, %1; \ - bgtid %1, 1b; \ - addk %1, %1, %2; \ + __asm__ __volatile__ (" 1: " #op " %0, %1; \ + bgtid %1, 1b; \ + addk %1, %1, %2; \ " : : "r" (start), "r" (count), \ "r" (step) : "memory"); \ } while (0); @@ -156,7 +175,7 @@ do { \ int volatile temp; \ BUG_ON(end - start <= 0); \ \ - __asm__ __volatile__ (" 1: " #op " %1, r0; \ + __asm__ __volatile__ (" 1: " #op " %1, r0; \ cmpu %0, %1, %2; \ bgtid %0, 1b; \ addk %1, %1, %3; \ @@ -164,14 +183,10 @@ do { \ "r" (line_length) : "memory"); \ } while (0); -#define ASM_LOOP - static void __flush_icache_range_msr_irq(unsigned long start, unsigned long end) { unsigned long flags; -#ifndef ASM_LOOP - int i; -#endif + pr_debug("%s: start 0x%x, end 0x%x\n", __func__, (unsigned int)start, (unsigned int) end); @@ -181,13 +196,8 @@ static void __flush_icache_range_msr_irq(unsigned long start, unsigned long end) local_irq_save(flags); __disable_icache_msr(); -#ifdef ASM_LOOP CACHE_RANGE_LOOP_1(start, end, cpuinfo.icache_line_length, wic); -#else - for (i = start; i < end; i += cpuinfo.icache_line_length) - __asm__ __volatile__ ("wic %0, r0;" \ - : : "r" (i)); -#endif + __enable_icache_msr(); local_irq_restore(flags); } @@ -196,9 +206,7 @@ static void __flush_icache_range_nomsr_irq(unsigned long start, unsigned long end) { unsigned long flags; -#ifndef ASM_LOOP - int i; -#endif + pr_debug("%s: start 0x%x, end 0x%x\n", __func__, (unsigned int)start, (unsigned int) end); @@ -208,13 +216,7 @@ static void __flush_icache_range_nomsr_irq(unsigned long start, local_irq_save(flags); __disable_icache_nomsr(); -#ifdef ASM_LOOP CACHE_RANGE_LOOP_1(start, end, cpuinfo.icache_line_length, wic); -#else - for (i = start; i < end; i += cpuinfo.icache_line_length) - __asm__ __volatile__ ("wic %0, r0;" \ - : : "r" (i)); -#endif __enable_icache_nomsr(); local_irq_restore(flags); @@ -223,41 +225,25 @@ static void __flush_icache_range_nomsr_irq(unsigned long start, static void __flush_icache_range_noirq(unsigned long start, unsigned long end) { -#ifndef ASM_LOOP - int i; -#endif pr_debug("%s: start 0x%x, end 0x%x\n", __func__, (unsigned int)start, (unsigned int) end); CACHE_LOOP_LIMITS(start, end, cpuinfo.icache_line_length, cpuinfo.icache_size); -#ifdef ASM_LOOP CACHE_RANGE_LOOP_1(start, end, cpuinfo.icache_line_length, wic); -#else - for (i = start; i < end; i += cpuinfo.icache_line_length) - __asm__ __volatile__ ("wic %0, r0;" \ - : : "r" (i)); -#endif } static void __flush_icache_all_msr_irq(void) { unsigned long flags; -#ifndef ASM_LOOP - int i; -#endif + pr_debug("%s\n", __func__); local_irq_save(flags); __disable_icache_msr(); -#ifdef ASM_LOOP + CACHE_ALL_LOOP(cpuinfo.icache_size, cpuinfo.icache_line_length, wic); -#else - for (i = 0; i < cpuinfo.icache_size; - i += cpuinfo.icache_line_length) - __asm__ __volatile__ ("wic %0, r0;" \ - : : "r" (i)); -#endif + __enable_icache_msr(); local_irq_restore(flags); } @@ -265,59 +251,35 @@ static void __flush_icache_all_msr_irq(void) static void __flush_icache_all_nomsr_irq(void) { unsigned long flags; -#ifndef ASM_LOOP - int i; -#endif + pr_debug("%s\n", __func__); local_irq_save(flags); __disable_icache_nomsr(); -#ifdef ASM_LOOP + CACHE_ALL_LOOP(cpuinfo.icache_size, cpuinfo.icache_line_length, wic); -#else - for (i = 0; i < cpuinfo.icache_size; - i += cpuinfo.icache_line_length) - __asm__ __volatile__ ("wic %0, r0;" \ - : : "r" (i)); -#endif + __enable_icache_nomsr(); local_irq_restore(flags); } static void __flush_icache_all_noirq(void) { -#ifndef ASM_LOOP - int i; -#endif pr_debug("%s\n", __func__); -#ifdef ASM_LOOP CACHE_ALL_LOOP(cpuinfo.icache_size, cpuinfo.icache_line_length, wic); -#else - for (i = 0; i < cpuinfo.icache_size; - i += cpuinfo.icache_line_length) - __asm__ __volatile__ ("wic %0, r0;" \ - : : "r" (i)); -#endif } static void __invalidate_dcache_all_msr_irq(void) { unsigned long flags; -#ifndef ASM_LOOP - int i; -#endif + pr_debug("%s\n", __func__); local_irq_save(flags); __disable_dcache_msr(); -#ifdef ASM_LOOP + CACHE_ALL_LOOP(cpuinfo.dcache_size, cpuinfo.dcache_line_length, wdc); -#else - for (i = 0; i < cpuinfo.dcache_size; - i += cpuinfo.dcache_line_length) - __asm__ __volatile__ ("wdc %0, r0;" \ - : : "r" (i)); -#endif + __enable_dcache_msr(); local_irq_restore(flags); } @@ -325,107 +287,60 @@ static void __invalidate_dcache_all_msr_irq(void) static void __invalidate_dcache_all_nomsr_irq(void) { unsigned long flags; -#ifndef ASM_LOOP - int i; -#endif + pr_debug("%s\n", __func__); local_irq_save(flags); __disable_dcache_nomsr(); -#ifdef ASM_LOOP + CACHE_ALL_LOOP(cpuinfo.dcache_size, cpuinfo.dcache_line_length, wdc); -#else - for (i = 0; i < cpuinfo.dcache_size; - i += cpuinfo.dcache_line_length) - __asm__ __volatile__ ("wdc %0, r0;" \ - : : "r" (i)); -#endif + __enable_dcache_nomsr(); local_irq_restore(flags); } static void __invalidate_dcache_all_noirq_wt(void) { -#ifndef ASM_LOOP - int i; -#endif pr_debug("%s\n", __func__); -#ifdef ASM_LOOP CACHE_ALL_LOOP(cpuinfo.dcache_size, cpuinfo.dcache_line_length, wdc) -#else - for (i = 0; i < cpuinfo.dcache_size; - i += cpuinfo.dcache_line_length) - __asm__ __volatile__ ("wdc %0, r0;" \ - : : "r" (i)); -#endif } /* FIXME this is weird - should be only wdc but not work * MS: I am getting bus errors and other weird things */ static void __invalidate_dcache_all_wb(void) { -#ifndef ASM_LOOP - int i; -#endif pr_debug("%s\n", __func__); -#ifdef ASM_LOOP CACHE_ALL_LOOP2(cpuinfo.dcache_size, cpuinfo.dcache_line_length, wdc.clear) -#else - for (i = 0; i < cpuinfo.dcache_size; - i += cpuinfo.dcache_line_length) - __asm__ __volatile__ ("wdc.clear %0, r0;" \ - : : "r" (i)); -#endif } static void __invalidate_dcache_range_wb(unsigned long start, unsigned long end) { -#ifndef ASM_LOOP - int i; -#endif pr_debug("%s: start 0x%x, end 0x%x\n", __func__, (unsigned int)start, (unsigned int) end); CACHE_LOOP_LIMITS(start, end, cpuinfo.dcache_line_length, cpuinfo.dcache_size); -#ifdef ASM_LOOP CACHE_RANGE_LOOP_2(start, end, cpuinfo.dcache_line_length, wdc.clear); -#else - for (i = start; i < end; i += cpuinfo.icache_line_length) - __asm__ __volatile__ ("wdc.clear %0, r0;" \ - : : "r" (i)); -#endif } static void __invalidate_dcache_range_nomsr_wt(unsigned long start, unsigned long end) { -#ifndef ASM_LOOP - int i; -#endif pr_debug("%s: start 0x%x, end 0x%x\n", __func__, (unsigned int)start, (unsigned int) end); CACHE_LOOP_LIMITS(start, end, cpuinfo.dcache_line_length, cpuinfo.dcache_size); -#ifdef ASM_LOOP CACHE_RANGE_LOOP_1(start, end, cpuinfo.dcache_line_length, wdc); -#else - for (i = start; i < end; i += cpuinfo.icache_line_length) - __asm__ __volatile__ ("wdc %0, r0;" \ - : : "r" (i)); -#endif } static void __invalidate_dcache_range_msr_irq_wt(unsigned long start, unsigned long end) { unsigned long flags; -#ifndef ASM_LOOP - int i; -#endif + pr_debug("%s: start 0x%x, end 0x%x\n", __func__, (unsigned int)start, (unsigned int) end); CACHE_LOOP_LIMITS(start, end, @@ -434,13 +349,7 @@ static void __invalidate_dcache_range_msr_irq_wt(unsigned long start, local_irq_save(flags); __disable_dcache_msr(); -#ifdef ASM_LOOP CACHE_RANGE_LOOP_1(start, end, cpuinfo.dcache_line_length, wdc); -#else - for (i = start; i < end; i += cpuinfo.icache_line_length) - __asm__ __volatile__ ("wdc %0, r0;" \ - : : "r" (i)); -#endif __enable_dcache_msr(); local_irq_restore(flags); @@ -450,9 +359,7 @@ static void __invalidate_dcache_range_nomsr_irq(unsigned long start, unsigned long end) { unsigned long flags; -#ifndef ASM_LOOP - int i; -#endif + pr_debug("%s: start 0x%x, end 0x%x\n", __func__, (unsigned int)start, (unsigned int) end); @@ -462,13 +369,7 @@ static void __invalidate_dcache_range_nomsr_irq(unsigned long start, local_irq_save(flags); __disable_dcache_nomsr(); -#ifdef ASM_LOOP CACHE_RANGE_LOOP_1(start, end, cpuinfo.dcache_line_length, wdc); -#else - for (i = start; i < end; i += cpuinfo.icache_line_length) - __asm__ __volatile__ ("wdc %0, r0;" \ - : : "r" (i)); -#endif __enable_dcache_nomsr(); local_irq_restore(flags); @@ -476,38 +377,19 @@ static void __invalidate_dcache_range_nomsr_irq(unsigned long start, static void __flush_dcache_all_wb(void) { -#ifndef ASM_LOOP - int i; -#endif pr_debug("%s\n", __func__); -#ifdef ASM_LOOP CACHE_ALL_LOOP(cpuinfo.dcache_size, cpuinfo.dcache_line_length, wdc.flush); -#else - for (i = 0; i < cpuinfo.dcache_size; - i += cpuinfo.dcache_line_length) - __asm__ __volatile__ ("wdc.flush %0, r0;" \ - : : "r" (i)); -#endif } static void __flush_dcache_range_wb(unsigned long start, unsigned long end) { -#ifndef ASM_LOOP - int i; -#endif pr_debug("%s: start 0x%x, end 0x%x\n", __func__, (unsigned int)start, (unsigned int) end); CACHE_LOOP_LIMITS(start, end, cpuinfo.dcache_line_length, cpuinfo.dcache_size); -#ifdef ASM_LOOP CACHE_RANGE_LOOP_2(start, end, cpuinfo.dcache_line_length, wdc.flush); -#else - for (i = start; i < end; i += cpuinfo.icache_line_length) - __asm__ __volatile__ ("wdc.flush %0, r0;" \ - : : "r" (i)); -#endif } /* struct for wb caches and for wt caches */ @@ -611,7 +493,7 @@ const struct scache wt_nomsr_noirq = { #define CPUVER_7_20_A 0x0c #define CPUVER_7_20_D 0x0f -#define INFO(s) printk(KERN_INFO "cache: " s "\n"); +#define INFO(s) printk(KERN_INFO "cache: " s " \n"); void microblaze_cache_init(void) { @@ -650,9 +532,4 @@ void microblaze_cache_init(void) } } } - invalidate_dcache(); - enable_dcache(); - - invalidate_icache(); - enable_icache(); } diff --git a/trunk/arch/microblaze/kernel/dma.c b/trunk/arch/microblaze/kernel/dma.c deleted file mode 100644 index b1084974fccd..000000000000 --- a/trunk/arch/microblaze/kernel/dma.c +++ /dev/null @@ -1,156 +0,0 @@ -/* - * Copyright (C) 2009-2010 PetaLogix - * Copyright (C) 2006 Benjamin Herrenschmidt, IBM Corporation - * - * Provide default implementations of the DMA mapping callbacks for - * directly mapped busses. - */ - -#include -#include -#include -#include -#include - -/* - * Generic direct DMA implementation - * - * This implementation supports a per-device offset that can be applied if - * the address at which memory is visible to devices is not 0. Platform code - * can set archdata.dma_data to an unsigned long holding the offset. By - * default the offset is PCI_DRAM_OFFSET. - */ -static inline void __dma_sync_page(unsigned long paddr, unsigned long offset, - size_t size, enum dma_data_direction direction) -{ - switch (direction) { - case DMA_TO_DEVICE: - flush_dcache_range(paddr + offset, paddr + offset + size); - break; - case DMA_FROM_DEVICE: - invalidate_dcache_range(paddr + offset, paddr + offset + size); - break; - default: - BUG(); - } -} - -static unsigned long get_dma_direct_offset(struct device *dev) -{ - if (dev) - return (unsigned long)dev->archdata.dma_data; - - return PCI_DRAM_OFFSET; /* FIXME Not sure if is correct */ -} - -#define NOT_COHERENT_CACHE - -static void *dma_direct_alloc_coherent(struct device *dev, size_t size, - dma_addr_t *dma_handle, gfp_t flag) -{ -#ifdef NOT_COHERENT_CACHE - return consistent_alloc(flag, size, dma_handle); -#else - void *ret; - struct page *page; - int node = dev_to_node(dev); - - /* ignore region specifiers */ - flag &= ~(__GFP_HIGHMEM); - - page = alloc_pages_node(node, flag, get_order(size)); - if (page == NULL) - return NULL; - ret = page_address(page); - memset(ret, 0, size); - *dma_handle = virt_to_phys(ret) + get_dma_direct_offset(dev); - - return ret; -#endif -} - -static void dma_direct_free_coherent(struct device *dev, size_t size, - void *vaddr, dma_addr_t dma_handle) -{ -#ifdef NOT_COHERENT_CACHE - consistent_free(vaddr); -#else - free_pages((unsigned long)vaddr, get_order(size)); -#endif -} - -static int dma_direct_map_sg(struct device *dev, struct scatterlist *sgl, - int nents, enum dma_data_direction direction, - struct dma_attrs *attrs) -{ - struct scatterlist *sg; - int i; - - /* FIXME this part of code is untested */ - for_each_sg(sgl, sg, nents, i) { - sg->dma_address = sg_phys(sg) + get_dma_direct_offset(dev); - sg->dma_length = sg->length; - __dma_sync_page(page_to_phys(sg_page(sg)), sg->offset, - sg->length, direction); - } - - return nents; -} - -static void dma_direct_unmap_sg(struct device *dev, struct scatterlist *sg, - int nents, enum dma_data_direction direction, - struct dma_attrs *attrs) -{ -} - -static int dma_direct_dma_supported(struct device *dev, u64 mask) -{ - return 1; -} - -static inline dma_addr_t dma_direct_map_page(struct device *dev, - struct page *page, - unsigned long offset, - size_t size, - enum dma_data_direction direction, - struct dma_attrs *attrs) -{ - __dma_sync_page(page_to_phys(page), offset, size, direction); - return page_to_phys(page) + offset + get_dma_direct_offset(dev); -} - -static inline void dma_direct_unmap_page(struct device *dev, - dma_addr_t dma_address, - size_t size, - enum dma_data_direction direction, - struct dma_attrs *attrs) -{ -/* There is not necessary to do cache cleanup - * - * phys_to_virt is here because in __dma_sync_page is __virt_to_phys and - * dma_address is physical address - */ - __dma_sync_page(dma_address, 0 , size, direction); -} - -struct dma_map_ops dma_direct_ops = { - .alloc_coherent = dma_direct_alloc_coherent, - .free_coherent = dma_direct_free_coherent, - .map_sg = dma_direct_map_sg, - .unmap_sg = dma_direct_unmap_sg, - .dma_supported = dma_direct_dma_supported, - .map_page = dma_direct_map_page, - .unmap_page = dma_direct_unmap_page, -}; -EXPORT_SYMBOL(dma_direct_ops); - -/* Number of entries preallocated for DMA-API debugging */ -#define PREALLOC_DMA_DEBUG_ENTRIES (1 << 16) - -static int __init dma_init(void) -{ - dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES); - - return 0; -} -fs_initcall(dma_init); diff --git a/trunk/arch/microblaze/kernel/entry.S b/trunk/arch/microblaze/kernel/entry.S index c0ede25c5b99..3bad4ff49471 100644 --- a/trunk/arch/microblaze/kernel/entry.S +++ b/trunk/arch/microblaze/kernel/entry.S @@ -305,7 +305,7 @@ C_ENTRY(_user_exception): swi r11, r1, PTO+PT_R1; /* Store user SP. */ addi r11, r0, 1; swi r11, r0, TOPHYS(PER_CPU(KM)); /* Now we're in kernel-mode. */ -2: lwi CURRENT_TASK, r0, TOPHYS(PER_CPU(CURRENT_SAVE)); +2: lwi r31, r0, TOPHYS(PER_CPU(CURRENT_SAVE)); /* get saved current */ /* Save away the syscall number. */ swi r12, r1, PTO+PT_R0; tovirt(r1,r1) @@ -322,7 +322,8 @@ C_ENTRY(_user_exception): rtid r11, 0 nop 3: - lwi r11, CURRENT_TASK, TS_THREAD_INFO /* get thread info */ + add r11, r0, CURRENT_TASK /* Get current task ptr into r11 */ + lwi r11, r11, TS_THREAD_INFO /* get thread info */ lwi r11, r11, TI_FLAGS /* get flags in thread info */ andi r11, r11, _TIF_WORK_SYSCALL_MASK beqi r11, 4f @@ -381,50 +382,60 @@ C_ENTRY(ret_from_trap): /* See if returning to kernel mode, if so, skip resched &c. */ bnei r11, 2f; - swi r3, r1, PTO + PT_R3 - swi r4, r1, PTO + PT_R4 - /* We're returning to user mode, so check for various conditions that * trigger rescheduling. */ - /* FIXME: Restructure all these flag checks. */ - lwi r11, CURRENT_TASK, TS_THREAD_INFO; /* get thread info */ + # FIXME: Restructure all these flag checks. + add r11, r0, CURRENT_TASK; /* Get current task ptr into r11 */ + lwi r11, r11, TS_THREAD_INFO; /* get thread info */ lwi r11, r11, TI_FLAGS; /* get flags in thread info */ andi r11, r11, _TIF_WORK_SYSCALL_MASK beqi r11, 1f + swi r3, r1, PTO + PT_R3 + swi r4, r1, PTO + PT_R4 brlid r15, do_syscall_trace_leave addik r5, r1, PTO + PT_R0 + lwi r3, r1, PTO + PT_R3 + lwi r4, r1, PTO + PT_R4 1: + /* We're returning to user mode, so check for various conditions that * trigger rescheduling. */ - /* get thread info from current task */ - lwi r11, CURRENT_TASK, TS_THREAD_INFO; + /* Get current task ptr into r11 */ + add r11, r0, CURRENT_TASK; /* Get current task ptr into r11 */ + lwi r11, r11, TS_THREAD_INFO; /* get thread info */ lwi r11, r11, TI_FLAGS; /* get flags in thread info */ andi r11, r11, _TIF_NEED_RESCHED; beqi r11, 5f; + swi r3, r1, PTO + PT_R3; /* store syscall result */ + swi r4, r1, PTO + PT_R4; bralid r15, schedule; /* Call scheduler */ nop; /* delay slot */ + lwi r3, r1, PTO + PT_R3; /* restore syscall result */ + lwi r4, r1, PTO + PT_R4; /* Maybe handle a signal */ -5: /* get thread info from current task*/ - lwi r11, CURRENT_TASK, TS_THREAD_INFO; +5: add r11, r0, CURRENT_TASK; /* Get current task ptr into r11 */ + lwi r11, r11, TS_THREAD_INFO; /* get thread info */ lwi r11, r11, TI_FLAGS; /* get flags in thread info */ andi r11, r11, _TIF_SIGPENDING; beqi r11, 1f; /* Signals to handle, handle them */ + swi r3, r1, PTO + PT_R3; /* store syscall result */ + swi r4, r1, PTO + PT_R4; la r5, r1, PTO; /* Arg 1: struct pt_regs *regs */ + add r6, r0, r0; /* Arg 2: sigset_t *oldset */ addi r7, r0, 1; /* Arg 3: int in_syscall */ bralid r15, do_signal; /* Handle any signals */ - add r6, r0, r0; /* Arg 2: sigset_t *oldset */ - -/* Finally, return to user state. */ -1: + nop; lwi r3, r1, PTO + PT_R3; /* restore syscall result */ lwi r4, r1, PTO + PT_R4; - swi r0, r0, PER_CPU(KM); /* Now officially in user state. */ - swi CURRENT_TASK, r0, PER_CPU(CURRENT_SAVE); /* save current */ +/* Finally, return to user state. */ +1: swi r0, r0, PER_CPU(KM); /* Now officially in user state. */ + add r11, r0, CURRENT_TASK; /* Get current task ptr into r11 */ + swi r11, r0, PER_CPU(CURRENT_SAVE); /* save current */ VM_OFF; tophys(r1,r1); RESTORE_REGS; @@ -554,7 +565,7 @@ C_ENTRY(sys_rt_sigreturn_wrapper): swi r11, r1, PTO+PT_R1; /* Store user SP. */ \ addi r11, r0, 1; \ swi r11, r0, TOPHYS(PER_CPU(KM)); /* Now we're in kernel-mode.*/\ -2: lwi CURRENT_TASK, r0, TOPHYS(PER_CPU(CURRENT_SAVE)); \ +2: lwi r31, r0, TOPHYS(PER_CPU(CURRENT_SAVE)); /* get saved current */\ /* Save away the syscall number. */ \ swi r0, r1, PTO+PT_R0; \ tovirt(r1,r1) @@ -662,7 +673,9 @@ C_ENTRY(ret_from_exc): /* We're returning to user mode, so check for various conditions that trigger rescheduling. */ - lwi r11, CURRENT_TASK, TS_THREAD_INFO; /* get thread info */ + /* Get current task ptr into r11 */ + add r11, r0, CURRENT_TASK; /* Get current task ptr into r11 */ + lwi r11, r11, TS_THREAD_INFO; /* get thread info */ lwi r11, r11, TI_FLAGS; /* get flags in thread info */ andi r11, r11, _TIF_NEED_RESCHED; beqi r11, 5f; @@ -672,7 +685,8 @@ C_ENTRY(ret_from_exc): nop; /* delay slot */ /* Maybe handle a signal */ -5: lwi r11, CURRENT_TASK, TS_THREAD_INFO; /* get thread info */ +5: add r11, r0, CURRENT_TASK; /* Get current task ptr into r11 */ + lwi r11, r11, TS_THREAD_INFO; /* get thread info */ lwi r11, r11, TI_FLAGS; /* get flags in thread info */ andi r11, r11, _TIF_SIGPENDING; beqi r11, 1f; /* Signals to handle, handle them */ @@ -691,13 +705,15 @@ C_ENTRY(ret_from_exc): * store return registers separately because this macros is use * for others exceptions */ la r5, r1, PTO; /* Arg 1: struct pt_regs *regs */ + add r6, r0, r0; /* Arg 2: sigset_t *oldset */ addi r7, r0, 0; /* Arg 3: int in_syscall */ bralid r15, do_signal; /* Handle any signals */ - add r6, r0, r0; /* Arg 2: sigset_t *oldset */ + nop; /* Finally, return to user state. */ 1: swi r0, r0, PER_CPU(KM); /* Now officially in user state. */ - swi CURRENT_TASK, r0, PER_CPU(CURRENT_SAVE); /* save current */ + add r11, r0, CURRENT_TASK; /* Get current task ptr into r11 */ + swi r11, r0, PER_CPU(CURRENT_SAVE); /* save current */ VM_OFF; tophys(r1,r1); @@ -786,7 +802,7 @@ C_ENTRY(_interrupt): swi r11, r0, TOPHYS(PER_CPU(KM)); 2: - lwi CURRENT_TASK, r0, TOPHYS(PER_CPU(CURRENT_SAVE)); + lwi r31, r0, TOPHYS(PER_CPU(CURRENT_SAVE)); swi r0, r1, PTO + PT_R0; tovirt(r1,r1) la r5, r1, PTO; @@ -801,7 +817,8 @@ ret_from_irq: lwi r11, r1, PTO + PT_MODE; bnei r11, 2f; - lwi r11, CURRENT_TASK, TS_THREAD_INFO; + add r11, r0, CURRENT_TASK; + lwi r11, r11, TS_THREAD_INFO; lwi r11, r11, TI_FLAGS; /* MS: get flags from thread info */ andi r11, r11, _TIF_NEED_RESCHED; beqi r11, 5f @@ -809,7 +826,8 @@ ret_from_irq: nop; /* delay slot */ /* Maybe handle a signal */ -5: lwi r11, CURRENT_TASK, TS_THREAD_INFO; /* MS: get thread info */ +5: add r11, r0, CURRENT_TASK; + lwi r11, r11, TS_THREAD_INFO; /* MS: get thread info */ lwi r11, r11, TI_FLAGS; /* get flags in thread info */ andi r11, r11, _TIF_SIGPENDING; beqid r11, no_intr_resched @@ -824,7 +842,8 @@ no_intr_resched: /* Disable interrupts, we are now committed to the state restore */ disable_irq swi r0, r0, PER_CPU(KM); /* MS: Now officially in user state. */ - swi CURRENT_TASK, r0, PER_CPU(CURRENT_SAVE); + add r11, r0, CURRENT_TASK; + swi r11, r0, PER_CPU(CURRENT_SAVE); VM_OFF; tophys(r1,r1); lwi r3, r1, PTO + PT_R3; /* MS: restore saved r3, r4 registers */ @@ -834,28 +853,7 @@ no_intr_resched: lwi r1, r1, PT_R1 - PT_SIZE; bri 6f; /* MS: Return to kernel state. */ -2: -#ifdef CONFIG_PREEMPT - lwi r11, CURRENT_TASK, TS_THREAD_INFO; - /* MS: get preempt_count from thread info */ - lwi r5, r11, TI_PREEMPT_COUNT; - bgti r5, restore; - - lwi r5, r11, TI_FLAGS; /* get flags in thread info */ - andi r5, r5, _TIF_NEED_RESCHED; - beqi r5, restore /* if zero jump over */ - -preempt: - /* interrupts are off that's why I am calling preempt_chedule_irq */ - bralid r15, preempt_schedule_irq - nop - lwi r11, CURRENT_TASK, TS_THREAD_INFO; /* get thread info */ - lwi r5, r11, TI_FLAGS; /* get flags in thread info */ - andi r5, r5, _TIF_NEED_RESCHED; - bnei r5, preempt /* if non zero jump to resched */ -restore: -#endif - VM_OFF /* MS: turn off MMU */ +2: VM_OFF /* MS: turn off MMU */ tophys(r1,r1) lwi r3, r1, PTO + PT_R3; /* MS: restore saved r3, r4 registers */ lwi r4, r1, PTO + PT_R4; @@ -917,7 +915,7 @@ C_ENTRY(_debug_exception): swi r11, r1, PTO+PT_R1; /* Store user SP. */ addi r11, r0, 1; swi r11, r0, TOPHYS(PER_CPU(KM)); /* Now we're in kernel-mode. */ -2: lwi CURRENT_TASK, r0, TOPHYS(PER_CPU(CURRENT_SAVE)); +2: lwi r31, r0, TOPHYS(PER_CPU(CURRENT_SAVE)); /* get saved current */ /* Save away the syscall number. */ swi r0, r1, PTO+PT_R0; tovirt(r1,r1) @@ -937,7 +935,8 @@ dbtrap_call: rtbd r11, 0; bnei r11, 2f; /* Get current task ptr into r11 */ - lwi r11, CURRENT_TASK, TS_THREAD_INFO; /* get thread info */ + add r11, r0, CURRENT_TASK; /* Get current task ptr into r11 */ + lwi r11, r11, TS_THREAD_INFO; /* get thread info */ lwi r11, r11, TI_FLAGS; /* get flags in thread info */ andi r11, r11, _TIF_NEED_RESCHED; beqi r11, 5f; @@ -950,7 +949,8 @@ dbtrap_call: rtbd r11, 0; /* XXX m68knommu also checks TASK_STATE & TASK_COUNTER here. */ /* Maybe handle a signal */ -5: lwi r11, CURRENT_TASK, TS_THREAD_INFO; /* get thread info */ +5: add r11, r0, CURRENT_TASK; /* Get current task ptr into r11 */ + lwi r11, r11, TS_THREAD_INFO; /* get thread info */ lwi r11, r11, TI_FLAGS; /* get flags in thread info */ andi r11, r11, _TIF_SIGPENDING; beqi r11, 1f; /* Signals to handle, handle them */ @@ -966,14 +966,16 @@ dbtrap_call: rtbd r11, 0; (in a possibly modified form) after do_signal returns. */ la r5, r1, PTO; /* Arg 1: struct pt_regs *regs */ + add r6, r0, r0; /* Arg 2: sigset_t *oldset */ addi r7, r0, 0; /* Arg 3: int in_syscall */ bralid r15, do_signal; /* Handle any signals */ - add r6, r0, r0; /* Arg 2: sigset_t *oldset */ + nop; /* Finally, return to user state. */ 1: swi r0, r0, PER_CPU(KM); /* Now officially in user state. */ - swi CURRENT_TASK, r0, PER_CPU(CURRENT_SAVE); /* save current */ + add r11, r0, CURRENT_TASK; /* Get current task ptr into r11 */ + swi r11, r0, PER_CPU(CURRENT_SAVE); /* save current */ VM_OFF; tophys(r1,r1); @@ -1005,7 +1007,7 @@ DBTRAP_return: /* Make global symbol for debugging */ ENTRY(_switch_to) /* prepare return value */ - addk r3, r0, CURRENT_TASK + addk r3, r0, r31 /* save registers in cpu_context */ /* use r11 and r12, volatile registers, as temp register */ @@ -1049,10 +1051,10 @@ ENTRY(_switch_to) nop swi r12, r11, CC_FSR - /* update r31, the current-give me pointer to task which will be next */ - lwi CURRENT_TASK, r6, TI_TASK + /* update r31, the current */ + lwi r31, r6, TI_TASK/* give me pointer to task which will be next */ /* stored it to current_save too */ - swi CURRENT_TASK, r0, PER_CPU(CURRENT_SAVE) + swi r31, r0, PER_CPU(CURRENT_SAVE) /* get new process' cpu context and restore */ /* give me start where start context of next task */ diff --git a/trunk/arch/microblaze/kernel/head.S b/trunk/arch/microblaze/kernel/head.S index cb7815cfe5ab..30916193fcc7 100644 --- a/trunk/arch/microblaze/kernel/head.S +++ b/trunk/arch/microblaze/kernel/head.S @@ -99,8 +99,8 @@ no_fdt_arg: tophys(r4,r4) /* convert to phys address */ ori r3, r0, COMMAND_LINE_SIZE - 1 /* number of loops */ _copy_command_line: - lbu r2, r5, r6 /* r7=r5+r6 - r5 contain pointer to command line */ - sb r2, r4, r6 /* addr[r4+r6]= r7*/ + lbu r7, r5, r6 /* r7=r5+r6 - r5 contain pointer to command line */ + sb r7, r4, r6 /* addr[r4+r6]= r7*/ addik r6, r6, 1 /* increment counting */ bgtid r3, _copy_command_line /* loop for all entries */ addik r3, r3, -1 /* descrement loop */ @@ -136,11 +136,6 @@ _invalidate: addik r3, r3, -1 /* sync */ - /* Setup the kernel PID */ - mts rpid,r0 /* Load the kernel PID */ - nop - bri 4 - /* * We should still be executing code at physical address area * RAM_BASEADDR at this point. However, kernel code is at @@ -151,6 +146,10 @@ _invalidate: addik r3,r0, CONFIG_KERNEL_START /* Load the kernel virtual address */ tophys(r4,r3) /* Load the kernel physical address */ + mts rpid,r0 /* Load the kernel PID */ + nop + bri 4 + /* * Configure and load two entries into TLB slots 0 and 1. * In case we are pinning TLBs, these are reserved in by the diff --git a/trunk/arch/microblaze/kernel/irq.c b/trunk/arch/microblaze/kernel/irq.c index 6f39e2c001f3..0f06034d1fe0 100644 --- a/trunk/arch/microblaze/kernel/irq.c +++ b/trunk/arch/microblaze/kernel/irq.c @@ -93,18 +93,3 @@ int show_interrupts(struct seq_file *p, void *v) } return 0; } - -/* MS: There is no any advance mapping mechanism. We are using simple 32bit - intc without any cascades or any connection that's why mapping is 1:1 */ -unsigned int irq_create_mapping(struct irq_host *host, irq_hw_number_t hwirq) -{ - return hwirq; -} -EXPORT_SYMBOL_GPL(irq_create_mapping); - -unsigned int irq_create_of_mapping(struct device_node *controller, - u32 *intspec, unsigned int intsize) -{ - return intspec[0]; -} -EXPORT_SYMBOL_GPL(irq_create_of_mapping); diff --git a/trunk/arch/microblaze/kernel/setup.c b/trunk/arch/microblaze/kernel/setup.c index f974ec7aa357..bb8c4b9ccb80 100644 --- a/trunk/arch/microblaze/kernel/setup.c +++ b/trunk/arch/microblaze/kernel/setup.c @@ -22,10 +22,7 @@ #include #include #include -#include #include -#include -#include #include #include #include @@ -57,9 +54,13 @@ void __init setup_arch(char **cmdline_p) microblaze_cache_init(); - setup_memory(); + invalidate_dcache(); + enable_dcache(); + + invalidate_icache(); + enable_icache(); - xilinx_pci_init(); + setup_memory(); #if defined(CONFIG_SELFMOD_INTC) || defined(CONFIG_SELFMOD_TIMER) printk(KERN_NOTICE "Self modified code enable\n"); @@ -187,37 +188,3 @@ static int microblaze_debugfs_init(void) } arch_initcall(microblaze_debugfs_init); #endif - -static int dflt_bus_notify(struct notifier_block *nb, - unsigned long action, void *data) -{ - struct device *dev = data; - - /* We are only intereted in device addition */ - if (action != BUS_NOTIFY_ADD_DEVICE) - return 0; - - set_dma_ops(dev, &dma_direct_ops); - - return NOTIFY_DONE; -} - -static struct notifier_block dflt_plat_bus_notifier = { - .notifier_call = dflt_bus_notify, - .priority = INT_MAX, -}; - -static struct notifier_block dflt_of_bus_notifier = { - .notifier_call = dflt_bus_notify, - .priority = INT_MAX, -}; - -static int __init setup_bus_notifier(void) -{ - bus_register_notifier(&platform_bus_type, &dflt_plat_bus_notifier); - bus_register_notifier(&of_platform_bus_type, &dflt_of_bus_notifier); - - return 0; -} - -arch_initcall(setup_bus_notifier); diff --git a/trunk/arch/microblaze/mm/Makefile b/trunk/arch/microblaze/mm/Makefile index 09c49ed87235..6c8a924d9e26 100644 --- a/trunk/arch/microblaze/mm/Makefile +++ b/trunk/arch/microblaze/mm/Makefile @@ -2,6 +2,6 @@ # Makefile # -obj-y := consistent.o init.o +obj-y := init.o obj-$(CONFIG_MMU) += pgtable.o mmu_context.o fault.o diff --git a/trunk/arch/microblaze/mm/consistent.c b/trunk/arch/microblaze/mm/consistent.c deleted file mode 100644 index a9b443e3fb98..000000000000 --- a/trunk/arch/microblaze/mm/consistent.c +++ /dev/null @@ -1,246 +0,0 @@ -/* - * Microblaze support for cache consistent memory. - * Copyright (C) 2010 Michal Simek - * Copyright (C) 2010 PetaLogix - * Copyright (C) 2005 John Williams - * - * Based on PowerPC version derived from arch/arm/mm/consistent.c - * Copyright (C) 2001 Dan Malek (dmalek@jlc.net) - * Copyright (C) 2000 Russell King - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#ifndef CONFIG_MMU - -/* I have to use dcache values because I can't relate on ram size */ -#define UNCACHED_SHADOW_MASK (cpuinfo.dcache_high - cpuinfo.dcache_base + 1) - -/* - * Consistent memory allocators. Used for DMA devices that want to - * share uncached memory with the processor core. - * My crufty no-MMU approach is simple. In the HW platform we can optionally - * mirror the DDR up above the processor cacheable region. So, memory accessed - * in this mirror region will not be cached. It's alloced from the same - * pool as normal memory, but the handle we return is shifted up into the - * uncached region. This will no doubt cause big problems if memory allocated - * here is not also freed properly. -- JW - */ -void *consistent_alloc(int gfp, size_t size, dma_addr_t *dma_handle) -{ - struct page *page, *end, *free; - unsigned long order; - void *ret, *virt; - - if (in_interrupt()) - BUG(); - - size = PAGE_ALIGN(size); - order = get_order(size); - - page = alloc_pages(gfp, order); - if (!page) - goto no_page; - - /* We could do with a page_to_phys and page_to_bus here. */ - virt = page_address(page); - ret = ioremap(virt_to_phys(virt), size); - if (!ret) - goto no_remap; - - /* - * Here's the magic! Note if the uncached shadow is not implemented, - * it's up to the calling code to also test that condition and make - * other arranegments, such as manually flushing the cache and so on. - */ -#ifdef CONFIG_XILINX_UNCACHED_SHADOW - ret = (void *)((unsigned) ret | UNCACHED_SHADOW_MASK); -#endif - /* dma_handle is same as physical (shadowed) address */ - *dma_handle = (dma_addr_t)ret; - - /* - * free wasted pages. We skip the first page since we know - * that it will have count = 1 and won't require freeing. - * We also mark the pages in use as reserved so that - * remap_page_range works. - */ - page = virt_to_page(virt); - free = page + (size >> PAGE_SHIFT); - end = page + (1 << order); - - for (; page < end; page++) { - init_page_count(page); - if (page >= free) - __free_page(page); - else - SetPageReserved(page); - } - - return ret; -no_remap: - __free_pages(page, order); -no_page: - return NULL; -} - -#else - -void *consistent_alloc(int gfp, size_t size, dma_addr_t *dma_handle) -{ - int order, err, i; - unsigned long page, va, flags; - phys_addr_t pa; - struct vm_struct *area; - void *ret; - - if (in_interrupt()) - BUG(); - - /* Only allocate page size areas. */ - size = PAGE_ALIGN(size); - order = get_order(size); - - page = __get_free_pages(gfp, order); - if (!page) { - BUG(); - return NULL; - } - - /* - * we need to ensure that there are no cachelines in use, - * or worse dirty in this area. - */ - flush_dcache_range(virt_to_phys(page), virt_to_phys(page) + size); - - /* Allocate some common virtual space to map the new pages. */ - area = get_vm_area(size, VM_ALLOC); - if (area == NULL) { - free_pages(page, order); - return NULL; - } - va = (unsigned long) area->addr; - ret = (void *)va; - - /* This gives us the real physical address of the first page. */ - *dma_handle = pa = virt_to_bus((void *)page); - - /* MS: This is the whole magic - use cache inhibit pages */ - flags = _PAGE_KERNEL | _PAGE_NO_CACHE; - - /* - * Set refcount=1 on all pages in an order>0 - * allocation so that vfree() will actually - * free all pages that were allocated. - */ - if (order > 0) { - struct page *rpage = virt_to_page(page); - for (i = 1; i < (1 << order); i++) - init_page_count(rpage+i); - } - - err = 0; - for (i = 0; i < size && err == 0; i += PAGE_SIZE) - err = map_page(va+i, pa+i, flags); - - if (err) { - vfree((void *)va); - return NULL; - } - - return ret; -} -#endif /* CONFIG_MMU */ -EXPORT_SYMBOL(consistent_alloc); - -/* - * free page(s) as defined by the above mapping. - */ -void consistent_free(void *vaddr) -{ - if (in_interrupt()) - BUG(); - - /* Clear SHADOW_MASK bit in address, and free as per usual */ -#ifdef CONFIG_XILINX_UNCACHED_SHADOW - vaddr = (void *)((unsigned)vaddr & ~UNCACHED_SHADOW_MASK); -#endif - vfree(vaddr); -} -EXPORT_SYMBOL(consistent_free); - -/* - * make an area consistent. - */ -void consistent_sync(void *vaddr, size_t size, int direction) -{ - unsigned long start; - unsigned long end; - - start = (unsigned long)vaddr; - - /* Convert start address back down to unshadowed memory region */ -#ifdef CONFIG_XILINX_UNCACHED_SHADOW - start &= ~UNCACHED_SHADOW_MASK; -#endif - end = start + size; - - switch (direction) { - case PCI_DMA_NONE: - BUG(); - case PCI_DMA_FROMDEVICE: /* invalidate only */ - flush_dcache_range(start, end); - break; - case PCI_DMA_TODEVICE: /* writeback only */ - flush_dcache_range(start, end); - break; - case PCI_DMA_BIDIRECTIONAL: /* writeback and invalidate */ - flush_dcache_range(start, end); - break; - } -} -EXPORT_SYMBOL(consistent_sync); - -/* - * consistent_sync_page makes memory consistent. identical - * to consistent_sync, but takes a struct page instead of a - * virtual address - */ -void consistent_sync_page(struct page *page, unsigned long offset, - size_t size, int direction) -{ - unsigned long start = (unsigned long)page_address(page) + offset; - consistent_sync((void *)start, size, direction); -} -EXPORT_SYMBOL(consistent_sync_page); diff --git a/trunk/arch/microblaze/mm/init.c b/trunk/arch/microblaze/mm/init.c index 1608e2e1a44a..a57cedf36715 100644 --- a/trunk/arch/microblaze/mm/init.c +++ b/trunk/arch/microblaze/mm/init.c @@ -23,9 +23,6 @@ #include #include -/* Use for MMU and noMMU because of PCI generic code */ -int mem_init_done; - #ifndef CONFIG_MMU unsigned int __page_offset; EXPORT_SYMBOL(__page_offset); @@ -33,6 +30,7 @@ EXPORT_SYMBOL(__page_offset); #else DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); +int mem_init_done; static int init_bootmem_done; #endif /* CONFIG_MMU */ @@ -195,6 +193,12 @@ void free_initmem(void) (unsigned long)(&__init_end)); } +/* FIXME from arch/powerpc/mm/mem.c*/ +void show_mem(void) +{ + printk(KERN_NOTICE "%s\n", __func__); +} + void __init mem_init(void) { high_memory = (void *)__va(memory_end); @@ -204,7 +208,9 @@ void __init mem_init(void) printk(KERN_INFO "Memory: %luk/%luk available\n", nr_free_pages() << (PAGE_SHIFT-10), num_physpages << (PAGE_SHIFT-10)); +#ifdef CONFIG_MMU mem_init_done = 1; +#endif } #ifndef CONFIG_MMU @@ -216,10 +222,6 @@ int ___range_ok(unsigned long addr, unsigned long size) } EXPORT_SYMBOL(___range_ok); -int page_is_ram(unsigned long pfn) -{ - return __range_ok(pfn, 0); -} #else int page_is_ram(unsigned long pfn) { @@ -347,27 +349,4 @@ void __init *early_get_page(void) } return p; } - #endif /* CONFIG_MMU */ - -void * __init_refok alloc_maybe_bootmem(size_t size, gfp_t mask) -{ - if (mem_init_done) - return kmalloc(size, mask); - else - return alloc_bootmem(size); -} - -void * __init_refok zalloc_maybe_bootmem(size_t size, gfp_t mask) -{ - void *p; - - if (mem_init_done) - p = kzalloc(size, mask); - else { - p = alloc_bootmem(size); - if (p) - memset(p, 0, size); - } - return p; -} diff --git a/trunk/arch/microblaze/mm/pgtable.c b/trunk/arch/microblaze/mm/pgtable.c index 63a6fd07c48f..2820081b21ab 100644 --- a/trunk/arch/microblaze/mm/pgtable.c +++ b/trunk/arch/microblaze/mm/pgtable.c @@ -103,7 +103,7 @@ static void __iomem *__ioremap(phys_addr_t addr, unsigned long size, area = get_vm_area(size, VM_IOREMAP); if (area == NULL) return NULL; - v = (unsigned long) area->addr; + v = VMALLOC_VMADDR(area->addr); } else { v = (ioremap_bot -= size); } diff --git a/trunk/arch/microblaze/pci/Makefile b/trunk/arch/microblaze/pci/Makefile deleted file mode 100644 index 9889cc2e1294..000000000000 --- a/trunk/arch/microblaze/pci/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -# -# Makefile -# - -obj-$(CONFIG_PCI) += pci_32.o pci-common.o indirect_pci.o iomap.o -obj-$(CONFIG_PCI_XILINX) += xilinx_pci.o diff --git a/trunk/arch/microblaze/pci/indirect_pci.c b/trunk/arch/microblaze/pci/indirect_pci.c deleted file mode 100644 index 25f18f017f21..000000000000 --- a/trunk/arch/microblaze/pci/indirect_pci.c +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Support for indirect PCI bridges. - * - * Copyright (C) 1998 Gabriel Paubert. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version - * 2 of the License, or (at your option) any later version. - */ - -#include -#include -#include -#include -#include - -#include -#include -#include - -static int -indirect_read_config(struct pci_bus *bus, unsigned int devfn, int offset, - int len, u32 *val) -{ - struct pci_controller *hose = pci_bus_to_host(bus); - volatile void __iomem *cfg_data; - u8 cfg_type = 0; - u32 bus_no, reg; - - if (hose->indirect_type & INDIRECT_TYPE_NO_PCIE_LINK) { - if (bus->number != hose->first_busno) - return PCIBIOS_DEVICE_NOT_FOUND; - if (devfn != 0) - return PCIBIOS_DEVICE_NOT_FOUND; - } - - if (hose->indirect_type & INDIRECT_TYPE_SET_CFG_TYPE) - if (bus->number != hose->first_busno) - cfg_type = 1; - - bus_no = (bus->number == hose->first_busno) ? - hose->self_busno : bus->number; - - if (hose->indirect_type & INDIRECT_TYPE_EXT_REG) - reg = ((offset & 0xf00) << 16) | (offset & 0xfc); - else - reg = offset & 0xfc; /* Only 3 bits for function */ - - if (hose->indirect_type & INDIRECT_TYPE_BIG_ENDIAN) - out_be32(hose->cfg_addr, (0x80000000 | (bus_no << 16) | - (devfn << 8) | reg | cfg_type)); - else - out_le32(hose->cfg_addr, (0x80000000 | (bus_no << 16) | - (devfn << 8) | reg | cfg_type)); - - /* - * Note: the caller has already checked that offset is - * suitably aligned and that len is 1, 2 or 4. - */ - cfg_data = hose->cfg_data + (offset & 3); /* Only 3 bits for function */ - switch (len) { - case 1: - *val = in_8(cfg_data); - break; - case 2: - *val = in_le16(cfg_data); - break; - default: - *val = in_le32(cfg_data); - break; - } - return PCIBIOS_SUCCESSFUL; -} - -static int -indirect_write_config(struct pci_bus *bus, unsigned int devfn, int offset, - int len, u32 val) -{ - struct pci_controller *hose = pci_bus_to_host(bus); - volatile void __iomem *cfg_data; - u8 cfg_type = 0; - u32 bus_no, reg; - - if (hose->indirect_type & INDIRECT_TYPE_NO_PCIE_LINK) { - if (bus->number != hose->first_busno) - return PCIBIOS_DEVICE_NOT_FOUND; - if (devfn != 0) - return PCIBIOS_DEVICE_NOT_FOUND; - } - - if (hose->indirect_type & INDIRECT_TYPE_SET_CFG_TYPE) - if (bus->number != hose->first_busno) - cfg_type = 1; - - bus_no = (bus->number == hose->first_busno) ? - hose->self_busno : bus->number; - - if (hose->indirect_type & INDIRECT_TYPE_EXT_REG) - reg = ((offset & 0xf00) << 16) | (offset & 0xfc); - else - reg = offset & 0xfc; - - if (hose->indirect_type & INDIRECT_TYPE_BIG_ENDIAN) - out_be32(hose->cfg_addr, (0x80000000 | (bus_no << 16) | - (devfn << 8) | reg | cfg_type)); - else - out_le32(hose->cfg_addr, (0x80000000 | (bus_no << 16) | - (devfn << 8) | reg | cfg_type)); - - /* surpress setting of PCI_PRIMARY_BUS */ - if (hose->indirect_type & INDIRECT_TYPE_SURPRESS_PRIMARY_BUS) - if ((offset == PCI_PRIMARY_BUS) && - (bus->number == hose->first_busno)) - val &= 0xffffff00; - - /* Workaround for PCI_28 Errata in 440EPx/GRx */ - if ((hose->indirect_type & INDIRECT_TYPE_BROKEN_MRM) && - offset == PCI_CACHE_LINE_SIZE) { - val = 0; - } - - /* - * Note: the caller has already checked that offset is - * suitably aligned and that len is 1, 2 or 4. - */ - cfg_data = hose->cfg_data + (offset & 3); - switch (len) { - case 1: - out_8(cfg_data, val); - break; - case 2: - out_le16(cfg_data, val); - break; - default: - out_le32(cfg_data, val); - break; - } - - return PCIBIOS_SUCCESSFUL; -} - -static struct pci_ops indirect_pci_ops = { - .read = indirect_read_config, - .write = indirect_write_config, -}; - -void __init -setup_indirect_pci(struct pci_controller *hose, - resource_size_t cfg_addr, - resource_size_t cfg_data, u32 flags) -{ - resource_size_t base = cfg_addr & PAGE_MASK; - void __iomem *mbase; - - mbase = ioremap(base, PAGE_SIZE); - hose->cfg_addr = mbase + (cfg_addr & ~PAGE_MASK); - if ((cfg_data & PAGE_MASK) != base) - mbase = ioremap(cfg_data & PAGE_MASK, PAGE_SIZE); - hose->cfg_data = mbase + (cfg_data & ~PAGE_MASK); - hose->ops = &indirect_pci_ops; - hose->indirect_type = flags; -} diff --git a/trunk/arch/microblaze/pci/iomap.c b/trunk/arch/microblaze/pci/iomap.c deleted file mode 100644 index 3fbf16f4e16c..000000000000 --- a/trunk/arch/microblaze/pci/iomap.c +++ /dev/null @@ -1,39 +0,0 @@ -/* - * ppc64 "iomap" interface implementation. - * - * (C) Copyright 2004 Linus Torvalds - */ -#include -#include -#include -#include -#include - -void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long max) -{ - resource_size_t start = pci_resource_start(dev, bar); - resource_size_t len = pci_resource_len(dev, bar); - unsigned long flags = pci_resource_flags(dev, bar); - - if (!len) - return NULL; - if (max && len > max) - len = max; - if (flags & IORESOURCE_IO) - return ioport_map(start, len); - if (flags & IORESOURCE_MEM) - return ioremap(start, len); - /* What? */ - return NULL; -} -EXPORT_SYMBOL(pci_iomap); - -void pci_iounmap(struct pci_dev *dev, void __iomem *addr) -{ - if (isa_vaddr_is_ioport(addr)) - return; - if (pcibios_vaddr_is_ioport(addr)) - return; - iounmap(addr); -} -EXPORT_SYMBOL(pci_iounmap); diff --git a/trunk/arch/microblaze/pci/pci-common.c b/trunk/arch/microblaze/pci/pci-common.c deleted file mode 100644 index 0be34350d733..000000000000 --- a/trunk/arch/microblaze/pci/pci-common.c +++ /dev/null @@ -1,1642 +0,0 @@ -/* - * Contains common pci routines for ALL ppc platform - * (based on pci_32.c and pci_64.c) - * - * Port for PPC64 David Engebretsen, IBM Corp. - * Contains common pci routines for ppc64 platform, pSeries and iSeries brands. - * - * Copyright (C) 2003 Anton Blanchard , IBM - * Rework, based on alpha PCI code. - * - * Common pmac/prep/chrp pci routines. -- Cort - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version - * 2 of the License, or (at your option) any later version. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -static DEFINE_SPINLOCK(hose_spinlock); -LIST_HEAD(hose_list); - -/* XXX kill that some day ... */ -static int global_phb_number; /* Global phb counter */ - -/* ISA Memory physical address */ -resource_size_t isa_mem_base; - -/* Default PCI flags is 0 on ppc32, modified at boot on ppc64 */ -unsigned int pci_flags; - -static struct dma_map_ops *pci_dma_ops = &dma_direct_ops; - -void set_pci_dma_ops(struct dma_map_ops *dma_ops) -{ - pci_dma_ops = dma_ops; -} - -struct dma_map_ops *get_pci_dma_ops(void) -{ - return pci_dma_ops; -} -EXPORT_SYMBOL(get_pci_dma_ops); - -int pci_set_dma_mask(struct pci_dev *dev, u64 mask) -{ - return dma_set_mask(&dev->dev, mask); -} - -int pci_set_consistent_dma_mask(struct pci_dev *dev, u64 mask) -{ - int rc; - - rc = dma_set_mask(&dev->dev, mask); - dev->dev.coherent_dma_mask = dev->dma_mask; - - return rc; -} - -struct pci_controller *pcibios_alloc_controller(struct device_node *dev) -{ - struct pci_controller *phb; - - phb = zalloc_maybe_bootmem(sizeof(struct pci_controller), GFP_KERNEL); - if (!phb) - return NULL; - spin_lock(&hose_spinlock); - phb->global_number = global_phb_number++; - list_add_tail(&phb->list_node, &hose_list); - spin_unlock(&hose_spinlock); - phb->dn = dev; - phb->is_dynamic = mem_init_done; - return phb; -} - -void pcibios_free_controller(struct pci_controller *phb) -{ - spin_lock(&hose_spinlock); - list_del(&phb->list_node); - spin_unlock(&hose_spinlock); - - if (phb->is_dynamic) - kfree(phb); -} - -static resource_size_t pcibios_io_size(const struct pci_controller *hose) -{ - return hose->io_resource.end - hose->io_resource.start + 1; -} - -int pcibios_vaddr_is_ioport(void __iomem *address) -{ - int ret = 0; - struct pci_controller *hose; - resource_size_t size; - - spin_lock(&hose_spinlock); - list_for_each_entry(hose, &hose_list, list_node) { - size = pcibios_io_size(hose); - if (address >= hose->io_base_virt && - address < (hose->io_base_virt + size)) { - ret = 1; - break; - } - } - spin_unlock(&hose_spinlock); - return ret; -} - -unsigned long pci_address_to_pio(phys_addr_t address) -{ - struct pci_controller *hose; - resource_size_t size; - unsigned long ret = ~0; - - spin_lock(&hose_spinlock); - list_for_each_entry(hose, &hose_list, list_node) { - size = pcibios_io_size(hose); - if (address >= hose->io_base_phys && - address < (hose->io_base_phys + size)) { - unsigned long base = - (unsigned long)hose->io_base_virt - _IO_BASE; - ret = base + (address - hose->io_base_phys); - break; - } - } - spin_unlock(&hose_spinlock); - - return ret; -} -EXPORT_SYMBOL_GPL(pci_address_to_pio); - -/* - * Return the domain number for this bus. - */ -int pci_domain_nr(struct pci_bus *bus) -{ - struct pci_controller *hose = pci_bus_to_host(bus); - - return hose->global_number; -} -EXPORT_SYMBOL(pci_domain_nr); - -/* This routine is meant to be used early during boot, when the - * PCI bus numbers have not yet been assigned, and you need to - * issue PCI config cycles to an OF device. - * It could also be used to "fix" RTAS config cycles if you want - * to set pci_assign_all_buses to 1 and still use RTAS for PCI - * config cycles. - */ -struct pci_controller *pci_find_hose_for_OF_device(struct device_node *node) -{ - while (node) { - struct pci_controller *hose, *tmp; - list_for_each_entry_safe(hose, tmp, &hose_list, list_node) - if (hose->dn == node) - return hose; - node = node->parent; - } - return NULL; -} - -static ssize_t pci_show_devspec(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct pci_dev *pdev; - struct device_node *np; - - pdev = to_pci_dev(dev); - np = pci_device_to_OF_node(pdev); - if (np == NULL || np->full_name == NULL) - return 0; - return sprintf(buf, "%s", np->full_name); -} -static DEVICE_ATTR(devspec, S_IRUGO, pci_show_devspec, NULL); - -/* Add sysfs properties */ -int pcibios_add_platform_entries(struct pci_dev *pdev) -{ - return device_create_file(&pdev->dev, &dev_attr_devspec); -} - -char __devinit *pcibios_setup(char *str) -{ - return str; -} - -/* - * Reads the interrupt pin to determine if interrupt is use by card. - * If the interrupt is used, then gets the interrupt line from the - * openfirmware and sets it in the pci_dev and pci_config line. - */ -int pci_read_irq_line(struct pci_dev *pci_dev) -{ - struct of_irq oirq; - unsigned int virq; - - /* The current device-tree that iSeries generates from the HV - * PCI informations doesn't contain proper interrupt routing, - * and all the fallback would do is print out crap, so we - * don't attempt to resolve the interrupts here at all, some - * iSeries specific fixup does it. - * - * In the long run, we will hopefully fix the generated device-tree - * instead. - */ - pr_debug("PCI: Try to map irq for %s...\n", pci_name(pci_dev)); - -#ifdef DEBUG - memset(&oirq, 0xff, sizeof(oirq)); -#endif - /* Try to get a mapping from the device-tree */ - if (of_irq_map_pci(pci_dev, &oirq)) { - u8 line, pin; - - /* If that fails, lets fallback to what is in the config - * space and map that through the default controller. We - * also set the type to level low since that's what PCI - * interrupts are. If your platform does differently, then - * either provide a proper interrupt tree or don't use this - * function. - */ - if (pci_read_config_byte(pci_dev, PCI_INTERRUPT_PIN, &pin)) - return -1; - if (pin == 0) - return -1; - if (pci_read_config_byte(pci_dev, PCI_INTERRUPT_LINE, &line) || - line == 0xff || line == 0) { - return -1; - } - pr_debug(" No map ! Using line %d (pin %d) from PCI config\n", - line, pin); - - virq = irq_create_mapping(NULL, line); - if (virq != NO_IRQ) - set_irq_type(virq, IRQ_TYPE_LEVEL_LOW); - } else { - pr_debug(" Got one, spec %d cells (0x%08x 0x%08x...) on %s\n", - oirq.size, oirq.specifier[0], oirq.specifier[1], - oirq.controller ? oirq.controller->full_name : - ""); - - virq = irq_create_of_mapping(oirq.controller, oirq.specifier, - oirq.size); - } - if (virq == NO_IRQ) { - pr_debug(" Failed to map !\n"); - return -1; - } - - pr_debug(" Mapped to linux irq %d\n", virq); - - pci_dev->irq = virq; - - return 0; -} -EXPORT_SYMBOL(pci_read_irq_line); - -/* - * Platform support for /proc/bus/pci/X/Y mmap()s, - * modelled on the sparc64 implementation by Dave Miller. - * -- paulus. - */ - -/* - * Adjust vm_pgoff of VMA such that it is the physical page offset - * corresponding to the 32-bit pci bus offset for DEV requested by the user. - * - * Basically, the user finds the base address for his device which he wishes - * to mmap. They read the 32-bit value from the config space base register, - * add whatever PAGE_SIZE multiple offset they wish, and feed this into the - * offset parameter of mmap on /proc/bus/pci/XXX for that device. - * - * Returns negative error code on failure, zero on success. - */ -static struct resource *__pci_mmap_make_offset(struct pci_dev *dev, - resource_size_t *offset, - enum pci_mmap_state mmap_state) -{ - struct pci_controller *hose = pci_bus_to_host(dev->bus); - unsigned long io_offset = 0; - int i, res_bit; - - if (hose == 0) - return NULL; /* should never happen */ - - /* If memory, add on the PCI bridge address offset */ - if (mmap_state == pci_mmap_mem) { -#if 0 /* See comment in pci_resource_to_user() for why this is disabled */ - *offset += hose->pci_mem_offset; -#endif - res_bit = IORESOURCE_MEM; - } else { - io_offset = (unsigned long)hose->io_base_virt - _IO_BASE; - *offset += io_offset; - res_bit = IORESOURCE_IO; - } - - /* - * Check that the offset requested corresponds to one of the - * resources of the device. - */ - for (i = 0; i <= PCI_ROM_RESOURCE; i++) { - struct resource *rp = &dev->resource[i]; - int flags = rp->flags; - - /* treat ROM as memory (should be already) */ - if (i == PCI_ROM_RESOURCE) - flags |= IORESOURCE_MEM; - - /* Active and same type? */ - if ((flags & res_bit) == 0) - continue; - - /* In the range of this resource? */ - if (*offset < (rp->start & PAGE_MASK) || *offset > rp->end) - continue; - - /* found it! construct the final physical address */ - if (mmap_state == pci_mmap_io) - *offset += hose->io_base_phys - io_offset; - return rp; - } - - return NULL; -} - -/* - * Set vm_page_prot of VMA, as appropriate for this architecture, for a pci - * device mapping. - */ -static pgprot_t __pci_mmap_set_pgprot(struct pci_dev *dev, struct resource *rp, - pgprot_t protection, - enum pci_mmap_state mmap_state, - int write_combine) -{ - pgprot_t prot = protection; - - /* Write combine is always 0 on non-memory space mappings. On - * memory space, if the user didn't pass 1, we check for a - * "prefetchable" resource. This is a bit hackish, but we use - * this to workaround the inability of /sysfs to provide a write - * combine bit - */ - if (mmap_state != pci_mmap_mem) - write_combine = 0; - else if (write_combine == 0) { - if (rp->flags & IORESOURCE_PREFETCH) - write_combine = 1; - } - - return pgprot_noncached(prot); -} - -/* - * This one is used by /dev/mem and fbdev who have no clue about the - * PCI device, it tries to find the PCI device first and calls the - * above routine - */ -pgprot_t pci_phys_mem_access_prot(struct file *file, - unsigned long pfn, - unsigned long size, - pgprot_t prot) -{ - struct pci_dev *pdev = NULL; - struct resource *found = NULL; - resource_size_t offset = ((resource_size_t)pfn) << PAGE_SHIFT; - int i; - - if (page_is_ram(pfn)) - return prot; - - prot = pgprot_noncached(prot); - for_each_pci_dev(pdev) { - for (i = 0; i <= PCI_ROM_RESOURCE; i++) { - struct resource *rp = &pdev->resource[i]; - int flags = rp->flags; - - /* Active and same type? */ - if ((flags & IORESOURCE_MEM) == 0) - continue; - /* In the range of this resource? */ - if (offset < (rp->start & PAGE_MASK) || - offset > rp->end) - continue; - found = rp; - break; - } - if (found) - break; - } - if (found) { - if (found->flags & IORESOURCE_PREFETCH) - prot = pgprot_noncached_wc(prot); - pci_dev_put(pdev); - } - - pr_debug("PCI: Non-PCI map for %llx, prot: %lx\n", - (unsigned long long)offset, pgprot_val(prot)); - - return prot; -} - -/* - * Perform the actual remap of the pages for a PCI device mapping, as - * appropriate for this architecture. The region in the process to map - * is described by vm_start and vm_end members of VMA, the base physical - * address is found in vm_pgoff. - * The pci device structure is provided so that architectures may make mapping - * decisions on a per-device or per-bus basis. - * - * Returns a negative error code on failure, zero on success. - */ -int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma, - enum pci_mmap_state mmap_state, int write_combine) -{ - resource_size_t offset = - ((resource_size_t)vma->vm_pgoff) << PAGE_SHIFT; - struct resource *rp; - int ret; - - rp = __pci_mmap_make_offset(dev, &offset, mmap_state); - if (rp == NULL) - return -EINVAL; - - vma->vm_pgoff = offset >> PAGE_SHIFT; - vma->vm_page_prot = __pci_mmap_set_pgprot(dev, rp, - vma->vm_page_prot, - mmap_state, write_combine); - - ret = remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff, - vma->vm_end - vma->vm_start, vma->vm_page_prot); - - return ret; -} - -/* This provides legacy IO read access on a bus */ -int pci_legacy_read(struct pci_bus *bus, loff_t port, u32 *val, size_t size) -{ - unsigned long offset; - struct pci_controller *hose = pci_bus_to_host(bus); - struct resource *rp = &hose->io_resource; - void __iomem *addr; - - /* Check if port can be supported by that bus. We only check - * the ranges of the PHB though, not the bus itself as the rules - * for forwarding legacy cycles down bridges are not our problem - * here. So if the host bridge supports it, we do it. - */ - offset = (unsigned long)hose->io_base_virt - _IO_BASE; - offset += port; - - if (!(rp->flags & IORESOURCE_IO)) - return -ENXIO; - if (offset < rp->start || (offset + size) > rp->end) - return -ENXIO; - addr = hose->io_base_virt + port; - - switch (size) { - case 1: - *((u8 *)val) = in_8(addr); - return 1; - case 2: - if (port & 1) - return -EINVAL; - *((u16 *)val) = in_le16(addr); - return 2; - case 4: - if (port & 3) - return -EINVAL; - *((u32 *)val) = in_le32(addr); - return 4; - } - return -EINVAL; -} - -/* This provides legacy IO write access on a bus */ -int pci_legacy_write(struct pci_bus *bus, loff_t port, u32 val, size_t size) -{ - unsigned long offset; - struct pci_controller *hose = pci_bus_to_host(bus); - struct resource *rp = &hose->io_resource; - void __iomem *addr; - - /* Check if port can be supported by that bus. We only check - * the ranges of the PHB though, not the bus itself as the rules - * for forwarding legacy cycles down bridges are not our problem - * here. So if the host bridge supports it, we do it. - */ - offset = (unsigned long)hose->io_base_virt - _IO_BASE; - offset += port; - - if (!(rp->flags & IORESOURCE_IO)) - return -ENXIO; - if (offset < rp->start || (offset + size) > rp->end) - return -ENXIO; - addr = hose->io_base_virt + port; - - /* WARNING: The generic code is idiotic. It gets passed a pointer - * to what can be a 1, 2 or 4 byte quantity and always reads that - * as a u32, which means that we have to correct the location of - * the data read within those 32 bits for size 1 and 2 - */ - switch (size) { - case 1: - out_8(addr, val >> 24); - return 1; - case 2: - if (port & 1) - return -EINVAL; - out_le16(addr, val >> 16); - return 2; - case 4: - if (port & 3) - return -EINVAL; - out_le32(addr, val); - return 4; - } - return -EINVAL; -} - -/* This provides legacy IO or memory mmap access on a bus */ -int pci_mmap_legacy_page_range(struct pci_bus *bus, - struct vm_area_struct *vma, - enum pci_mmap_state mmap_state) -{ - struct pci_controller *hose = pci_bus_to_host(bus); - resource_size_t offset = - ((resource_size_t)vma->vm_pgoff) << PAGE_SHIFT; - resource_size_t size = vma->vm_end - vma->vm_start; - struct resource *rp; - - pr_debug("pci_mmap_legacy_page_range(%04x:%02x, %s @%llx..%llx)\n", - pci_domain_nr(bus), bus->number, - mmap_state == pci_mmap_mem ? "MEM" : "IO", - (unsigned long long)offset, - (unsigned long long)(offset + size - 1)); - - if (mmap_state == pci_mmap_mem) { - /* Hack alert ! - * - * Because X is lame and can fail starting if it gets an error - * trying to mmap legacy_mem (instead of just moving on without - * legacy memory access) we fake it here by giving it anonymous - * memory, effectively behaving just like /dev/zero - */ - if ((offset + size) > hose->isa_mem_size) { -#ifdef CONFIG_MMU - printk(KERN_DEBUG - "Process %s (pid:%d) mapped non-existing PCI" - "legacy memory for 0%04x:%02x\n", - current->comm, current->pid, pci_domain_nr(bus), - bus->number); -#endif - if (vma->vm_flags & VM_SHARED) - return shmem_zero_setup(vma); - return 0; - } - offset += hose->isa_mem_phys; - } else { - unsigned long io_offset = (unsigned long)hose->io_base_virt - \ - _IO_BASE; - unsigned long roffset = offset + io_offset; - rp = &hose->io_resource; - if (!(rp->flags & IORESOURCE_IO)) - return -ENXIO; - if (roffset < rp->start || (roffset + size) > rp->end) - return -ENXIO; - offset += hose->io_base_phys; - } - pr_debug(" -> mapping phys %llx\n", (unsigned long long)offset); - - vma->vm_pgoff = offset >> PAGE_SHIFT; - vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); - return remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff, - vma->vm_end - vma->vm_start, - vma->vm_page_prot); -} - -void pci_resource_to_user(const struct pci_dev *dev, int bar, - const struct resource *rsrc, - resource_size_t *start, resource_size_t *end) -{ - struct pci_controller *hose = pci_bus_to_host(dev->bus); - resource_size_t offset = 0; - - if (hose == NULL) - return; - - if (rsrc->flags & IORESOURCE_IO) - offset = (unsigned long)hose->io_base_virt - _IO_BASE; - - /* We pass a fully fixed up address to userland for MMIO instead of - * a BAR value because X is lame and expects to be able to use that - * to pass to /dev/mem ! - * - * That means that we'll have potentially 64 bits values where some - * userland apps only expect 32 (like X itself since it thinks only - * Sparc has 64 bits MMIO) but if we don't do that, we break it on - * 32 bits CHRPs :-( - * - * Hopefully, the sysfs insterface is immune to that gunk. Once X - * has been fixed (and the fix spread enough), we can re-enable the - * 2 lines below and pass down a BAR value to userland. In that case - * we'll also have to re-enable the matching code in - * __pci_mmap_make_offset(). - * - * BenH. - */ -#if 0 - else if (rsrc->flags & IORESOURCE_MEM) - offset = hose->pci_mem_offset; -#endif - - *start = rsrc->start - offset; - *end = rsrc->end - offset; -} - -/** - * pci_process_bridge_OF_ranges - Parse PCI bridge resources from device tree - * @hose: newly allocated pci_controller to be setup - * @dev: device node of the host bridge - * @primary: set if primary bus (32 bits only, soon to be deprecated) - * - * This function will parse the "ranges" property of a PCI host bridge device - * node and setup the resource mapping of a pci controller based on its - * content. - * - * Life would be boring if it wasn't for a few issues that we have to deal - * with here: - * - * - We can only cope with one IO space range and up to 3 Memory space - * ranges. However, some machines (thanks Apple !) tend to split their - * space into lots of small contiguous ranges. So we have to coalesce. - * - * - We can only cope with all memory ranges having the same offset - * between CPU addresses and PCI addresses. Unfortunately, some bridges - * are setup for a large 1:1 mapping along with a small "window" which - * maps PCI address 0 to some arbitrary high address of the CPU space in - * order to give access to the ISA memory hole. - * The way out of here that I've chosen for now is to always set the - * offset based on the first resource found, then override it if we - * have a different offset and the previous was set by an ISA hole. - * - * - Some busses have IO space not starting at 0, which causes trouble with - * the way we do our IO resource renumbering. The code somewhat deals with - * it for 64 bits but I would expect problems on 32 bits. - * - * - Some 32 bits platforms such as 4xx can have physical space larger than - * 32 bits so we need to use 64 bits values for the parsing - */ -void __devinit pci_process_bridge_OF_ranges(struct pci_controller *hose, - struct device_node *dev, - int primary) -{ - const u32 *ranges; - int rlen; - int pna = of_n_addr_cells(dev); - int np = pna + 5; - int memno = 0, isa_hole = -1; - u32 pci_space; - unsigned long long pci_addr, cpu_addr, pci_next, cpu_next, size; - unsigned long long isa_mb = 0; - struct resource *res; - - printk(KERN_INFO "PCI host bridge %s %s ranges:\n", - dev->full_name, primary ? "(primary)" : ""); - - /* Get ranges property */ - ranges = of_get_property(dev, "ranges", &rlen); - if (ranges == NULL) - return; - - /* Parse it */ - pr_debug("Parsing ranges property...\n"); - while ((rlen -= np * 4) >= 0) { - /* Read next ranges element */ - pci_space = ranges[0]; - pci_addr = of_read_number(ranges + 1, 2); - cpu_addr = of_translate_address(dev, ranges + 3); - size = of_read_number(ranges + pna + 3, 2); - - pr_debug("pci_space: 0x%08x pci_addr:0x%016llx " - "cpu_addr:0x%016llx size:0x%016llx\n", - pci_space, pci_addr, cpu_addr, size); - - ranges += np; - - /* If we failed translation or got a zero-sized region - * (some FW try to feed us with non sensical zero sized regions - * such as power3 which look like some kind of attempt - * at exposing the VGA memory hole) - */ - if (cpu_addr == OF_BAD_ADDR || size == 0) - continue; - - /* Now consume following elements while they are contiguous */ - for (; rlen >= np * sizeof(u32); - ranges += np, rlen -= np * 4) { - if (ranges[0] != pci_space) - break; - pci_next = of_read_number(ranges + 1, 2); - cpu_next = of_translate_address(dev, ranges + 3); - if (pci_next != pci_addr + size || - cpu_next != cpu_addr + size) - break; - size += of_read_number(ranges + pna + 3, 2); - } - - /* Act based on address space type */ - res = NULL; - switch ((pci_space >> 24) & 0x3) { - case 1: /* PCI IO space */ - printk(KERN_INFO - " IO 0x%016llx..0x%016llx -> 0x%016llx\n", - cpu_addr, cpu_addr + size - 1, pci_addr); - - /* We support only one IO range */ - if (hose->pci_io_size) { - printk(KERN_INFO - " \\--> Skipped (too many) !\n"); - continue; - } - /* On 32 bits, limit I/O space to 16MB */ - if (size > 0x01000000) - size = 0x01000000; - - /* 32 bits needs to map IOs here */ - hose->io_base_virt = ioremap(cpu_addr, size); - - /* Expect trouble if pci_addr is not 0 */ - if (primary) - isa_io_base = - (unsigned long)hose->io_base_virt; - /* pci_io_size and io_base_phys always represent IO - * space starting at 0 so we factor in pci_addr - */ - hose->pci_io_size = pci_addr + size; - hose->io_base_phys = cpu_addr - pci_addr; - - /* Build resource */ - res = &hose->io_resource; - res->flags = IORESOURCE_IO; - res->start = pci_addr; - break; - case 2: /* PCI Memory space */ - case 3: /* PCI 64 bits Memory space */ - printk(KERN_INFO - " MEM 0x%016llx..0x%016llx -> 0x%016llx %s\n", - cpu_addr, cpu_addr + size - 1, pci_addr, - (pci_space & 0x40000000) ? "Prefetch" : ""); - - /* We support only 3 memory ranges */ - if (memno >= 3) { - printk(KERN_INFO - " \\--> Skipped (too many) !\n"); - continue; - } - /* Handles ISA memory hole space here */ - if (pci_addr == 0) { - isa_mb = cpu_addr; - isa_hole = memno; - if (primary || isa_mem_base == 0) - isa_mem_base = cpu_addr; - hose->isa_mem_phys = cpu_addr; - hose->isa_mem_size = size; - } - - /* We get the PCI/Mem offset from the first range or - * the, current one if the offset came from an ISA - * hole. If they don't match, bugger. - */ - if (memno == 0 || - (isa_hole >= 0 && pci_addr != 0 && - hose->pci_mem_offset == isa_mb)) - hose->pci_mem_offset = cpu_addr - pci_addr; - else if (pci_addr != 0 && - hose->pci_mem_offset != cpu_addr - pci_addr) { - printk(KERN_INFO - " \\--> Skipped (offset mismatch) !\n"); - continue; - } - - /* Build resource */ - res = &hose->mem_resources[memno++]; - res->flags = IORESOURCE_MEM; - if (pci_space & 0x40000000) - res->flags |= IORESOURCE_PREFETCH; - res->start = cpu_addr; - break; - } - if (res != NULL) { - res->name = dev->full_name; - res->end = res->start + size - 1; - res->parent = NULL; - res->sibling = NULL; - res->child = NULL; - } - } - - /* If there's an ISA hole and the pci_mem_offset is -not- matching - * the ISA hole offset, then we need to remove the ISA hole from - * the resource list for that brige - */ - if (isa_hole >= 0 && hose->pci_mem_offset != isa_mb) { - unsigned int next = isa_hole + 1; - printk(KERN_INFO " Removing ISA hole at 0x%016llx\n", isa_mb); - if (next < memno) - memmove(&hose->mem_resources[isa_hole], - &hose->mem_resources[next], - sizeof(struct resource) * (memno - next)); - hose->mem_resources[--memno].flags = 0; - } -} - -/* Decide whether to display the domain number in /proc */ -int pci_proc_domain(struct pci_bus *bus) -{ - struct pci_controller *hose = pci_bus_to_host(bus); - - if (!(pci_flags & PCI_ENABLE_PROC_DOMAINS)) - return 0; - if (pci_flags & PCI_COMPAT_DOMAIN_0) - return hose->global_number != 0; - return 1; -} - -void pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region, - struct resource *res) -{ - resource_size_t offset = 0, mask = (resource_size_t)-1; - struct pci_controller *hose = pci_bus_to_host(dev->bus); - - if (!hose) - return; - if (res->flags & IORESOURCE_IO) { - offset = (unsigned long)hose->io_base_virt - _IO_BASE; - mask = 0xffffffffu; - } else if (res->flags & IORESOURCE_MEM) - offset = hose->pci_mem_offset; - - region->start = (res->start - offset) & mask; - region->end = (res->end - offset) & mask; -} -EXPORT_SYMBOL(pcibios_resource_to_bus); - -void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, - struct pci_bus_region *region) -{ - resource_size_t offset = 0, mask = (resource_size_t)-1; - struct pci_controller *hose = pci_bus_to_host(dev->bus); - - if (!hose) - return; - if (res->flags & IORESOURCE_IO) { - offset = (unsigned long)hose->io_base_virt - _IO_BASE; - mask = 0xffffffffu; - } else if (res->flags & IORESOURCE_MEM) - offset = hose->pci_mem_offset; - res->start = (region->start + offset) & mask; - res->end = (region->end + offset) & mask; -} -EXPORT_SYMBOL(pcibios_bus_to_resource); - -/* Fixup a bus resource into a linux resource */ -static void __devinit fixup_resource(struct resource *res, struct pci_dev *dev) -{ - struct pci_controller *hose = pci_bus_to_host(dev->bus); - resource_size_t offset = 0, mask = (resource_size_t)-1; - - if (res->flags & IORESOURCE_IO) { - offset = (unsigned long)hose->io_base_virt - _IO_BASE; - mask = 0xffffffffu; - } else if (res->flags & IORESOURCE_MEM) - offset = hose->pci_mem_offset; - - res->start = (res->start + offset) & mask; - res->end = (res->end + offset) & mask; -} - -/* This header fixup will do the resource fixup for all devices as they are - * probed, but not for bridge ranges - */ -static void __devinit pcibios_fixup_resources(struct pci_dev *dev) -{ - struct pci_controller *hose = pci_bus_to_host(dev->bus); - int i; - - if (!hose) { - printk(KERN_ERR "No host bridge for PCI dev %s !\n", - pci_name(dev)); - return; - } - for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { - struct resource *res = dev->resource + i; - if (!res->flags) - continue; - /* On platforms that have PCI_PROBE_ONLY set, we don't - * consider 0 as an unassigned BAR value. It's technically - * a valid value, but linux doesn't like it... so when we can - * re-assign things, we do so, but if we can't, we keep it - * around and hope for the best... - */ - if (res->start == 0 && !(pci_flags & PCI_PROBE_ONLY)) { - pr_debug("PCI:%s Resource %d %016llx-%016llx [%x]" \ - "is unassigned\n", - pci_name(dev), i, - (unsigned long long)res->start, - (unsigned long long)res->end, - (unsigned int)res->flags); - res->end -= res->start; - res->start = 0; - res->flags |= IORESOURCE_UNSET; - continue; - } - - pr_debug("PCI:%s Resource %d %016llx-%016llx [%x] fixup...\n", - pci_name(dev), i, - (unsigned long long)res->start,\ - (unsigned long long)res->end, - (unsigned int)res->flags); - - fixup_resource(res, dev); - - pr_debug("PCI:%s %016llx-%016llx\n", - pci_name(dev), - (unsigned long long)res->start, - (unsigned long long)res->end); - } -} -DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, pcibios_fixup_resources); - -/* This function tries to figure out if a bridge resource has been initialized - * by the firmware or not. It doesn't have to be absolutely bullet proof, but - * things go more smoothly when it gets it right. It should covers cases such - * as Apple "closed" bridge resources and bare-metal pSeries unassigned bridges - */ -static int __devinit pcibios_uninitialized_bridge_resource(struct pci_bus *bus, - struct resource *res) -{ - struct pci_controller *hose = pci_bus_to_host(bus); - struct pci_dev *dev = bus->self; - resource_size_t offset; - u16 command; - int i; - - /* We don't do anything if PCI_PROBE_ONLY is set */ - if (pci_flags & PCI_PROBE_ONLY) - return 0; - - /* Job is a bit different between memory and IO */ - if (res->flags & IORESOURCE_MEM) { - /* If the BAR is non-0 (res != pci_mem_offset) then it's - * probably been initialized by somebody - */ - if (res->start != hose->pci_mem_offset) - return 0; - - /* The BAR is 0, let's check if memory decoding is enabled on - * the bridge. If not, we consider it unassigned - */ - pci_read_config_word(dev, PCI_COMMAND, &command); - if ((command & PCI_COMMAND_MEMORY) == 0) - return 1; - - /* Memory decoding is enabled and the BAR is 0. If any of - * the bridge resources covers that starting address (0 then - * it's good enough for us for memory - */ - for (i = 0; i < 3; i++) { - if ((hose->mem_resources[i].flags & IORESOURCE_MEM) && - hose->mem_resources[i].start == hose->pci_mem_offset) - return 0; - } - - /* Well, it starts at 0 and we know it will collide so we may as - * well consider it as unassigned. That covers the Apple case. - */ - return 1; - } else { - /* If the BAR is non-0, then we consider it assigned */ - offset = (unsigned long)hose->io_base_virt - _IO_BASE; - if (((res->start - offset) & 0xfffffffful) != 0) - return 0; - - /* Here, we are a bit different than memory as typically IO - * space starting at low addresses -is- valid. What we do - * instead if that we consider as unassigned anything that - * doesn't have IO enabled in the PCI command register, - * and that's it. - */ - pci_read_config_word(dev, PCI_COMMAND, &command); - if (command & PCI_COMMAND_IO) - return 0; - - /* It's starting at 0 and IO is disabled in the bridge, consider - * it unassigned - */ - return 1; - } -} - -/* Fixup resources of a PCI<->PCI bridge */ -static void __devinit pcibios_fixup_bridge(struct pci_bus *bus) -{ - struct resource *res; - int i; - - struct pci_dev *dev = bus->self; - - for (i = 0; i < PCI_BUS_NUM_RESOURCES; ++i) { - res = bus->resource[i]; - if (!res) - continue; - if (!res->flags) - continue; - if (i >= 3 && bus->self->transparent) - continue; - - pr_debug("PCI:%s Bus rsrc %d %016llx-%016llx [%x] fixup...\n", - pci_name(dev), i, - (unsigned long long)res->start,\ - (unsigned long long)res->end, - (unsigned int)res->flags); - - /* Perform fixup */ - fixup_resource(res, dev); - - /* Try to detect uninitialized P2P bridge resources, - * and clear them out so they get re-assigned later - */ - if (pcibios_uninitialized_bridge_resource(bus, res)) { - res->flags = 0; - pr_debug("PCI:%s (unassigned)\n", - pci_name(dev)); - } else { - pr_debug("PCI:%s %016llx-%016llx\n", - pci_name(dev), - (unsigned long long)res->start, - (unsigned long long)res->end); - } - } -} - -void __devinit pcibios_setup_bus_self(struct pci_bus *bus) -{ - /* Fix up the bus resources for P2P bridges */ - if (bus->self != NULL) - pcibios_fixup_bridge(bus); -} - -void __devinit pcibios_setup_bus_devices(struct pci_bus *bus) -{ - struct pci_dev *dev; - - pr_debug("PCI: Fixup bus devices %d (%s)\n", - bus->number, bus->self ? pci_name(bus->self) : "PHB"); - - list_for_each_entry(dev, &bus->devices, bus_list) { - struct dev_archdata *sd = &dev->dev.archdata; - - /* Setup OF node pointer in archdata */ - sd->of_node = pci_device_to_OF_node(dev); - - /* Fixup NUMA node as it may not be setup yet by the generic - * code and is needed by the DMA init - */ - set_dev_node(&dev->dev, pcibus_to_node(dev->bus)); - - /* Hook up default DMA ops */ - sd->dma_ops = pci_dma_ops; - sd->dma_data = (void *)PCI_DRAM_OFFSET; - - /* Read default IRQs and fixup if necessary */ - pci_read_irq_line(dev); - } -} - -void __devinit pcibios_fixup_bus(struct pci_bus *bus) -{ - /* When called from the generic PCI probe, read PCI<->PCI bridge - * bases. This is -not- called when generating the PCI tree from - * the OF device-tree. - */ - if (bus->self != NULL) - pci_read_bridge_bases(bus); - - /* Now fixup the bus bus */ - pcibios_setup_bus_self(bus); - - /* Now fixup devices on that bus */ - pcibios_setup_bus_devices(bus); -} -EXPORT_SYMBOL(pcibios_fixup_bus); - -static int skip_isa_ioresource_align(struct pci_dev *dev) -{ - if ((pci_flags & PCI_CAN_SKIP_ISA_ALIGN) && - !(dev->bus->bridge_ctl & PCI_BRIDGE_CTL_ISA)) - return 1; - return 0; -} - -/* - * We need to avoid collisions with `mirrored' VGA ports - * and other strange ISA hardware, so we always want the - * addresses to be allocated in the 0x000-0x0ff region - * modulo 0x400. - * - * Why? Because some silly external IO cards only decode - * the low 10 bits of the IO address. The 0x00-0xff region - * is reserved for motherboard devices that decode all 16 - * bits, so it's ok to allocate at, say, 0x2800-0x28ff, - * but we want to try to avoid allocating at 0x2900-0x2bff - * which might have be mirrored at 0x0100-0x03ff.. - */ -void pcibios_align_resource(void *data, struct resource *res, - resource_size_t size, resource_size_t align) -{ - struct pci_dev *dev = data; - - if (res->flags & IORESOURCE_IO) { - resource_size_t start = res->start; - - if (skip_isa_ioresource_align(dev)) - return; - if (start & 0x300) { - start = (start + 0x3ff) & ~0x3ff; - res->start = start; - } - } -} -EXPORT_SYMBOL(pcibios_align_resource); - -/* - * Reparent resource children of pr that conflict with res - * under res, and make res replace those children. - */ -static int __init reparent_resources(struct resource *parent, - struct resource *res) -{ - struct resource *p, **pp; - struct resource **firstpp = NULL; - - for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) { - if (p->end < res->start) - continue; - if (res->end < p->start) - break; - if (p->start < res->start || p->end > res->end) - return -1; /* not completely contained */ - if (firstpp == NULL) - firstpp = pp; - } - if (firstpp == NULL) - return -1; /* didn't find any conflicting entries? */ - res->parent = parent; - res->child = *firstpp; - res->sibling = *pp; - *firstpp = res; - *pp = NULL; - for (p = res->child; p != NULL; p = p->sibling) { - p->parent = res; - pr_debug("PCI: Reparented %s [%llx..%llx] under %s\n", - p->name, - (unsigned long long)p->start, - (unsigned long long)p->end, res->name); - } - return 0; -} - -/* - * Handle resources of PCI devices. If the world were perfect, we could - * just allocate all the resource regions and do nothing more. It isn't. - * On the other hand, we cannot just re-allocate all devices, as it would - * require us to know lots of host bridge internals. So we attempt to - * keep as much of the original configuration as possible, but tweak it - * when it's found to be wrong. - * - * Known BIOS problems we have to work around: - * - I/O or memory regions not configured - * - regions configured, but not enabled in the command register - * - bogus I/O addresses above 64K used - * - expansion ROMs left enabled (this may sound harmless, but given - * the fact the PCI specs explicitly allow address decoders to be - * shared between expansion ROMs and other resource regions, it's - * at least dangerous) - * - * Our solution: - * (1) Allocate resources for all buses behind PCI-to-PCI bridges. - * This gives us fixed barriers on where we can allocate. - * (2) Allocate resources for all enabled devices. If there is - * a collision, just mark the resource as unallocated. Also - * disable expansion ROMs during this step. - * (3) Try to allocate resources for disabled devices. If the - * resources were assigned correctly, everything goes well, - * if they weren't, they won't disturb allocation of other - * resources. - * (4) Assign new addresses to resources which were either - * not configured at all or misconfigured. If explicitly - * requested by the user, configure expansion ROM address - * as well. - */ - -void pcibios_allocate_bus_resources(struct pci_bus *bus) -{ - struct pci_bus *b; - int i; - struct resource *res, *pr; - - pr_debug("PCI: Allocating bus resources for %04x:%02x...\n", - pci_domain_nr(bus), bus->number); - - for (i = 0; i < PCI_BUS_NUM_RESOURCES; ++i) { - res = bus->resource[i]; - if (!res || !res->flags - || res->start > res->end || res->parent) - continue; - if (bus->parent == NULL) - pr = (res->flags & IORESOURCE_IO) ? - &ioport_resource : &iomem_resource; - else { - /* Don't bother with non-root busses when - * re-assigning all resources. We clear the - * resource flags as if they were colliding - * and as such ensure proper re-allocation - * later. - */ - if (pci_flags & PCI_REASSIGN_ALL_RSRC) - goto clear_resource; - pr = pci_find_parent_resource(bus->self, res); - if (pr == res) { - /* this happens when the generic PCI - * code (wrongly) decides that this - * bridge is transparent -- paulus - */ - continue; - } - } - - pr_debug("PCI: %s (bus %d) bridge rsrc %d: %016llx-%016llx " - "[0x%x], parent %p (%s)\n", - bus->self ? pci_name(bus->self) : "PHB", - bus->number, i, - (unsigned long long)res->start, - (unsigned long long)res->end, - (unsigned int)res->flags, - pr, (pr && pr->name) ? pr->name : "nil"); - - if (pr && !(pr->flags & IORESOURCE_UNSET)) { - if (request_resource(pr, res) == 0) - continue; - /* - * Must be a conflict with an existing entry. - * Move that entry (or entries) under the - * bridge resource and try again. - */ - if (reparent_resources(pr, res) == 0) - continue; - } - printk(KERN_WARNING "PCI: Cannot allocate resource region " - "%d of PCI bridge %d, will remap\n", i, bus->number); -clear_resource: - res->flags = 0; - } - - list_for_each_entry(b, &bus->children, node) - pcibios_allocate_bus_resources(b); -} - -static inline void __devinit alloc_resource(struct pci_dev *dev, int idx) -{ - struct resource *pr, *r = &dev->resource[idx]; - - pr_debug("PCI: Allocating %s: Resource %d: %016llx..%016llx [%x]\n", - pci_name(dev), idx, - (unsigned long long)r->start, - (unsigned long long)r->end, - (unsigned int)r->flags); - - pr = pci_find_parent_resource(dev, r); - if (!pr || (pr->flags & IORESOURCE_UNSET) || - request_resource(pr, r) < 0) { - printk(KERN_WARNING "PCI: Cannot allocate resource region %d" - " of device %s, will remap\n", idx, pci_name(dev)); - if (pr) - pr_debug("PCI: parent is %p: %016llx-%016llx [%x]\n", - pr, - (unsigned long long)pr->start, - (unsigned long long)pr->end, - (unsigned int)pr->flags); - /* We'll assign a new address later */ - r->flags |= IORESOURCE_UNSET; - r->end -= r->start; - r->start = 0; - } -} - -static void __init pcibios_allocate_resources(int pass) -{ - struct pci_dev *dev = NULL; - int idx, disabled; - u16 command; - struct resource *r; - - for_each_pci_dev(dev) { - pci_read_config_word(dev, PCI_COMMAND, &command); - for (idx = 0; idx <= PCI_ROM_RESOURCE; idx++) { - r = &dev->resource[idx]; - if (r->parent) /* Already allocated */ - continue; - if (!r->flags || (r->flags & IORESOURCE_UNSET)) - continue; /* Not assigned at all */ - /* We only allocate ROMs on pass 1 just in case they - * have been screwed up by firmware - */ - if (idx == PCI_ROM_RESOURCE) - disabled = 1; - if (r->flags & IORESOURCE_IO) - disabled = !(command & PCI_COMMAND_IO); - else - disabled = !(command & PCI_COMMAND_MEMORY); - if (pass == disabled) - alloc_resource(dev, idx); - } - if (pass) - continue; - r = &dev->resource[PCI_ROM_RESOURCE]; - if (r->flags) { - /* Turn the ROM off, leave the resource region, - * but keep it unregistered. - */ - u32 reg; - pci_read_config_dword(dev, dev->rom_base_reg, ®); - if (reg & PCI_ROM_ADDRESS_ENABLE) { - pr_debug("PCI: Switching off ROM of %s\n", - pci_name(dev)); - r->flags &= ~IORESOURCE_ROM_ENABLE; - pci_write_config_dword(dev, dev->rom_base_reg, - reg & ~PCI_ROM_ADDRESS_ENABLE); - } - } - } -} - -static void __init pcibios_reserve_legacy_regions(struct pci_bus *bus) -{ - struct pci_controller *hose = pci_bus_to_host(bus); - resource_size_t offset; - struct resource *res, *pres; - int i; - - pr_debug("Reserving legacy ranges for domain %04x\n", - pci_domain_nr(bus)); - - /* Check for IO */ - if (!(hose->io_resource.flags & IORESOURCE_IO)) - goto no_io; - offset = (unsigned long)hose->io_base_virt - _IO_BASE; - res = kzalloc(sizeof(struct resource), GFP_KERNEL); - BUG_ON(res == NULL); - res->name = "Legacy IO"; - res->flags = IORESOURCE_IO; - res->start = offset; - res->end = (offset + 0xfff) & 0xfffffffful; - pr_debug("Candidate legacy IO: %pR\n", res); - if (request_resource(&hose->io_resource, res)) { - printk(KERN_DEBUG - "PCI %04x:%02x Cannot reserve Legacy IO %pR\n", - pci_domain_nr(bus), bus->number, res); - kfree(res); - } - - no_io: - /* Check for memory */ - offset = hose->pci_mem_offset; - pr_debug("hose mem offset: %016llx\n", (unsigned long long)offset); - for (i = 0; i < 3; i++) { - pres = &hose->mem_resources[i]; - if (!(pres->flags & IORESOURCE_MEM)) - continue; - pr_debug("hose mem res: %pR\n", pres); - if ((pres->start - offset) <= 0xa0000 && - (pres->end - offset) >= 0xbffff) - break; - } - if (i >= 3) - return; - res = kzalloc(sizeof(struct resource), GFP_KERNEL); - BUG_ON(res == NULL); - res->name = "Legacy VGA memory"; - res->flags = IORESOURCE_MEM; - res->start = 0xa0000 + offset; - res->end = 0xbffff + offset; - pr_debug("Candidate VGA memory: %pR\n", res); - if (request_resource(pres, res)) { - printk(KERN_DEBUG - "PCI %04x:%02x Cannot reserve VGA memory %pR\n", - pci_domain_nr(bus), bus->number, res); - kfree(res); - } -} - -void __init pcibios_resource_survey(void) -{ - struct pci_bus *b; - - /* Allocate and assign resources. If we re-assign everything, then - * we skip the allocate phase - */ - list_for_each_entry(b, &pci_root_buses, node) - pcibios_allocate_bus_resources(b); - - if (!(pci_flags & PCI_REASSIGN_ALL_RSRC)) { - pcibios_allocate_resources(0); - pcibios_allocate_resources(1); - } - - /* Before we start assigning unassigned resource, we try to reserve - * the low IO area and the VGA memory area if they intersect the - * bus available resources to avoid allocating things on top of them - */ - if (!(pci_flags & PCI_PROBE_ONLY)) { - list_for_each_entry(b, &pci_root_buses, node) - pcibios_reserve_legacy_regions(b); - } - - /* Now, if the platform didn't decide to blindly trust the firmware, - * we proceed to assigning things that were left unassigned - */ - if (!(pci_flags & PCI_PROBE_ONLY)) { - pr_debug("PCI: Assigning unassigned resources...\n"); - pci_assign_unassigned_resources(); - } -} - -#ifdef CONFIG_HOTPLUG - -/* This is used by the PCI hotplug driver to allocate resource - * of newly plugged busses. We can try to consolidate with the - * rest of the code later, for now, keep it as-is as our main - * resource allocation function doesn't deal with sub-trees yet. - */ -void __devinit pcibios_claim_one_bus(struct pci_bus *bus) -{ - struct pci_dev *dev; - struct pci_bus *child_bus; - - list_for_each_entry(dev, &bus->devices, bus_list) { - int i; - - for (i = 0; i < PCI_NUM_RESOURCES; i++) { - struct resource *r = &dev->resource[i]; - - if (r->parent || !r->start || !r->flags) - continue; - - pr_debug("PCI: Claiming %s: " - "Resource %d: %016llx..%016llx [%x]\n", - pci_name(dev), i, - (unsigned long long)r->start, - (unsigned long long)r->end, - (unsigned int)r->flags); - - pci_claim_resource(dev, i); - } - } - - list_for_each_entry(child_bus, &bus->children, node) - pcibios_claim_one_bus(child_bus); -} -EXPORT_SYMBOL_GPL(pcibios_claim_one_bus); - - -/* pcibios_finish_adding_to_bus - * - * This is to be called by the hotplug code after devices have been - * added to a bus, this include calling it for a PHB that is just - * being added - */ -void pcibios_finish_adding_to_bus(struct pci_bus *bus) -{ - pr_debug("PCI: Finishing adding to hotplug bus %04x:%02x\n", - pci_domain_nr(bus), bus->number); - - /* Allocate bus and devices resources */ - pcibios_allocate_bus_resources(bus); - pcibios_claim_one_bus(bus); - - /* Add new devices to global lists. Register in proc, sysfs. */ - pci_bus_add_devices(bus); - - /* Fixup EEH */ - eeh_add_device_tree_late(bus); -} -EXPORT_SYMBOL_GPL(pcibios_finish_adding_to_bus); - -#endif /* CONFIG_HOTPLUG */ - -int pcibios_enable_device(struct pci_dev *dev, int mask) -{ - return pci_enable_resources(dev, mask); -} - -void __devinit pcibios_setup_phb_resources(struct pci_controller *hose) -{ - struct pci_bus *bus = hose->bus; - struct resource *res; - int i; - - /* Hookup PHB IO resource */ - bus->resource[0] = res = &hose->io_resource; - - if (!res->flags) { - printk(KERN_WARNING "PCI: I/O resource not set for host" - " bridge %s (domain %d)\n", - hose->dn->full_name, hose->global_number); - /* Workaround for lack of IO resource only on 32-bit */ - res->start = (unsigned long)hose->io_base_virt - isa_io_base; - res->end = res->start + IO_SPACE_LIMIT; - res->flags = IORESOURCE_IO; - } - - pr_debug("PCI: PHB IO resource = %016llx-%016llx [%lx]\n", - (unsigned long long)res->start, - (unsigned long long)res->end, - (unsigned long)res->flags); - - /* Hookup PHB Memory resources */ - for (i = 0; i < 3; ++i) { - res = &hose->mem_resources[i]; - if (!res->flags) { - if (i > 0) - continue; - printk(KERN_ERR "PCI: Memory resource 0 not set for " - "host bridge %s (domain %d)\n", - hose->dn->full_name, hose->global_number); - - /* Workaround for lack of MEM resource only on 32-bit */ - res->start = hose->pci_mem_offset; - res->end = (resource_size_t)-1LL; - res->flags = IORESOURCE_MEM; - - } - bus->resource[i+1] = res; - - pr_debug("PCI: PHB MEM resource %d = %016llx-%016llx [%lx]\n", - i, (unsigned long long)res->start, - (unsigned long long)res->end, - (unsigned long)res->flags); - } - - pr_debug("PCI: PHB MEM offset = %016llx\n", - (unsigned long long)hose->pci_mem_offset); - pr_debug("PCI: PHB IO offset = %08lx\n", - (unsigned long)hose->io_base_virt - _IO_BASE); -} - -/* - * Null PCI config access functions, for the case when we can't - * find a hose. - */ -#define NULL_PCI_OP(rw, size, type) \ -static int \ -null_##rw##_config_##size(struct pci_dev *dev, int offset, type val) \ -{ \ - return PCIBIOS_DEVICE_NOT_FOUND; \ -} - -static int -null_read_config(struct pci_bus *bus, unsigned int devfn, int offset, - int len, u32 *val) -{ - return PCIBIOS_DEVICE_NOT_FOUND; -} - -static int -null_write_config(struct pci_bus *bus, unsigned int devfn, int offset, - int len, u32 val) -{ - return PCIBIOS_DEVICE_NOT_FOUND; -} - -static struct pci_ops null_pci_ops = { - .read = null_read_config, - .write = null_write_config, -}; - -/* - * These functions are used early on before PCI scanning is done - * and all of the pci_dev and pci_bus structures have been created. - */ -static struct pci_bus * -fake_pci_bus(struct pci_controller *hose, int busnr) -{ - static struct pci_bus bus; - - if (!hose) - printk(KERN_ERR "Can't find hose for PCI bus %d!\n", busnr); - - bus.number = busnr; - bus.sysdata = hose; - bus.ops = hose ? hose->ops : &null_pci_ops; - return &bus; -} - -#define EARLY_PCI_OP(rw, size, type) \ -int early_##rw##_config_##size(struct pci_controller *hose, int bus, \ - int devfn, int offset, type value) \ -{ \ - return pci_bus_##rw##_config_##size(fake_pci_bus(hose, bus), \ - devfn, offset, value); \ -} - -EARLY_PCI_OP(read, byte, u8 *) -EARLY_PCI_OP(read, word, u16 *) -EARLY_PCI_OP(read, dword, u32 *) -EARLY_PCI_OP(write, byte, u8) -EARLY_PCI_OP(write, word, u16) -EARLY_PCI_OP(write, dword, u32) - -int early_find_capability(struct pci_controller *hose, int bus, int devfn, - int cap) -{ - return pci_bus_find_capability(fake_pci_bus(hose, bus), devfn, cap); -} diff --git a/trunk/arch/microblaze/pci/pci_32.c b/trunk/arch/microblaze/pci/pci_32.c deleted file mode 100644 index 7e0c94f501cc..000000000000 --- a/trunk/arch/microblaze/pci/pci_32.c +++ /dev/null @@ -1,430 +0,0 @@ -/* - * Common pmac/prep/chrp pci routines. -- Cort - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#undef DEBUG - -unsigned long isa_io_base; -unsigned long pci_dram_offset; -int pcibios_assign_bus_offset = 1; - -static u8 *pci_to_OF_bus_map; - -/* By default, we don't re-assign bus numbers. We do this only on - * some pmacs - */ -static int pci_assign_all_buses; - -static int pci_bus_count; - -/* - * Functions below are used on OpenFirmware machines. - */ -static void -make_one_node_map(struct device_node *node, u8 pci_bus) -{ - const int *bus_range; - int len; - - if (pci_bus >= pci_bus_count) - return; - bus_range = of_get_property(node, "bus-range", &len); - if (bus_range == NULL || len < 2 * sizeof(int)) { - printk(KERN_WARNING "Can't get bus-range for %s, " - "assuming it starts at 0\n", node->full_name); - pci_to_OF_bus_map[pci_bus] = 0; - } else - pci_to_OF_bus_map[pci_bus] = bus_range[0]; - - for_each_child_of_node(node, node) { - struct pci_dev *dev; - const unsigned int *class_code, *reg; - - class_code = of_get_property(node, "class-code", NULL); - if (!class_code || - ((*class_code >> 8) != PCI_CLASS_BRIDGE_PCI && - (*class_code >> 8) != PCI_CLASS_BRIDGE_CARDBUS)) - continue; - reg = of_get_property(node, "reg", NULL); - if (!reg) - continue; - dev = pci_get_bus_and_slot(pci_bus, ((reg[0] >> 8) & 0xff)); - if (!dev || !dev->subordinate) { - pci_dev_put(dev); - continue; - } - make_one_node_map(node, dev->subordinate->number); - pci_dev_put(dev); - } -} - -void -pcibios_make_OF_bus_map(void) -{ - int i; - struct pci_controller *hose, *tmp; - struct property *map_prop; - struct device_node *dn; - - pci_to_OF_bus_map = kmalloc(pci_bus_count, GFP_KERNEL); - if (!pci_to_OF_bus_map) { - printk(KERN_ERR "Can't allocate OF bus map !\n"); - return; - } - - /* We fill the bus map with invalid values, that helps - * debugging. - */ - for (i = 0; i < pci_bus_count; i++) - pci_to_OF_bus_map[i] = 0xff; - - /* For each hose, we begin searching bridges */ - list_for_each_entry_safe(hose, tmp, &hose_list, list_node) { - struct device_node *node = hose->dn; - - if (!node) - continue; - make_one_node_map(node, hose->first_busno); - } - dn = of_find_node_by_path("/"); - map_prop = of_find_property(dn, "pci-OF-bus-map", NULL); - if (map_prop) { - BUG_ON(pci_bus_count > map_prop->length); - memcpy(map_prop->value, pci_to_OF_bus_map, pci_bus_count); - } - of_node_put(dn); -#ifdef DEBUG - printk(KERN_INFO "PCI->OF bus map:\n"); - for (i = 0; i < pci_bus_count; i++) { - if (pci_to_OF_bus_map[i] == 0xff) - continue; - printk(KERN_INFO "%d -> %d\n", i, pci_to_OF_bus_map[i]); - } -#endif -} - -typedef int (*pci_OF_scan_iterator)(struct device_node *node, void *data); - -static struct device_node *scan_OF_pci_childs(struct device_node *parent, - pci_OF_scan_iterator filter, void *data) -{ - struct device_node *node; - struct device_node *sub_node; - - for_each_child_of_node(parent, node) { - const unsigned int *class_code; - - if (filter(node, data)) { - of_node_put(node); - return node; - } - - /* For PCI<->PCI bridges or CardBus bridges, we go down - * Note: some OFs create a parent node "multifunc-device" as - * a fake root for all functions of a multi-function device, - * we go down them as well. - */ - class_code = of_get_property(node, "class-code", NULL); - if ((!class_code || - ((*class_code >> 8) != PCI_CLASS_BRIDGE_PCI && - (*class_code >> 8) != PCI_CLASS_BRIDGE_CARDBUS)) && - strcmp(node->name, "multifunc-device")) - continue; - sub_node = scan_OF_pci_childs(node, filter, data); - if (sub_node) { - of_node_put(node); - return sub_node; - } - } - return NULL; -} - -static struct device_node *scan_OF_for_pci_dev(struct device_node *parent, - unsigned int devfn) -{ - struct device_node *np, *cnp; - const u32 *reg; - unsigned int psize; - - for_each_child_of_node(parent, np) { - reg = of_get_property(np, "reg", &psize); - if (reg && psize >= 4 && ((reg[0] >> 8) & 0xff) == devfn) - return np; - - /* Note: some OFs create a parent node "multifunc-device" as - * a fake root for all functions of a multi-function device, - * we go down them as well. */ - if (!strcmp(np->name, "multifunc-device")) { - cnp = scan_OF_for_pci_dev(np, devfn); - if (cnp) - return cnp; - } - } - return NULL; -} - - -static struct device_node *scan_OF_for_pci_bus(struct pci_bus *bus) -{ - struct device_node *parent, *np; - - /* Are we a root bus ? */ - if (bus->self == NULL || bus->parent == NULL) { - struct pci_controller *hose = pci_bus_to_host(bus); - if (hose == NULL) - return NULL; - return of_node_get(hose->dn); - } - - /* not a root bus, we need to get our parent */ - parent = scan_OF_for_pci_bus(bus->parent); - if (parent == NULL) - return NULL; - - /* now iterate for children for a match */ - np = scan_OF_for_pci_dev(parent, bus->self->devfn); - of_node_put(parent); - - return np; -} - -/* - * Scans the OF tree for a device node matching a PCI device - */ -struct device_node * -pci_busdev_to_OF_node(struct pci_bus *bus, int devfn) -{ - struct device_node *parent, *np; - - pr_debug("pci_busdev_to_OF_node(%d,0x%x)\n", bus->number, devfn); - parent = scan_OF_for_pci_bus(bus); - if (parent == NULL) - return NULL; - pr_debug(" parent is %s\n", parent ? parent->full_name : ""); - np = scan_OF_for_pci_dev(parent, devfn); - of_node_put(parent); - pr_debug(" result is %s\n", np ? np->full_name : ""); - - /* XXX most callers don't release the returned node - * mostly because ppc64 doesn't increase the refcount, - * we need to fix that. - */ - return np; -} -EXPORT_SYMBOL(pci_busdev_to_OF_node); - -struct device_node* -pci_device_to_OF_node(struct pci_dev *dev) -{ - return pci_busdev_to_OF_node(dev->bus, dev->devfn); -} -EXPORT_SYMBOL(pci_device_to_OF_node); - -static int -find_OF_pci_device_filter(struct device_node *node, void *data) -{ - return ((void *)node == data); -} - -/* - * Returns the PCI device matching a given OF node - */ -int -pci_device_from_OF_node(struct device_node *node, u8 *bus, u8 *devfn) -{ - const unsigned int *reg; - struct pci_controller *hose; - struct pci_dev *dev = NULL; - - /* Make sure it's really a PCI device */ - hose = pci_find_hose_for_OF_device(node); - if (!hose || !hose->dn) - return -ENODEV; - if (!scan_OF_pci_childs(hose->dn, - find_OF_pci_device_filter, (void *)node)) - return -ENODEV; - reg = of_get_property(node, "reg", NULL); - if (!reg) - return -ENODEV; - *bus = (reg[0] >> 16) & 0xff; - *devfn = ((reg[0] >> 8) & 0xff); - - /* Ok, here we need some tweak. If we have already renumbered - * all busses, we can't rely on the OF bus number any more. - * the pci_to_OF_bus_map is not enough as several PCI busses - * may match the same OF bus number. - */ - if (!pci_to_OF_bus_map) - return 0; - - for_each_pci_dev(dev) - if (pci_to_OF_bus_map[dev->bus->number] == *bus && - dev->devfn == *devfn) { - *bus = dev->bus->number; - pci_dev_put(dev); - return 0; - } - - return -ENODEV; -} -EXPORT_SYMBOL(pci_device_from_OF_node); - -/* We create the "pci-OF-bus-map" property now so it appears in the - * /proc device tree - */ -void __init -pci_create_OF_bus_map(void) -{ - struct property *of_prop; - struct device_node *dn; - - of_prop = (struct property *) alloc_bootmem(sizeof(struct property) + \ - 256); - if (!of_prop) - return; - dn = of_find_node_by_path("/"); - if (dn) { - memset(of_prop, -1, sizeof(struct property) + 256); - of_prop->name = "pci-OF-bus-map"; - of_prop->length = 256; - of_prop->value = &of_prop[1]; - prom_add_property(dn, of_prop); - of_node_put(dn); - } -} - -static void __devinit pcibios_scan_phb(struct pci_controller *hose) -{ - struct pci_bus *bus; - struct device_node *node = hose->dn; - unsigned long io_offset; - struct resource *res = &hose->io_resource; - - pr_debug("PCI: Scanning PHB %s\n", - node ? node->full_name : ""); - - /* Create an empty bus for the toplevel */ - bus = pci_create_bus(hose->parent, hose->first_busno, hose->ops, hose); - if (bus == NULL) { - printk(KERN_ERR "Failed to create bus for PCI domain %04x\n", - hose->global_number); - return; - } - bus->secondary = hose->first_busno; - hose->bus = bus; - - /* Fixup IO space offset */ - io_offset = (unsigned long)hose->io_base_virt - isa_io_base; - res->start = (res->start + io_offset) & 0xffffffffu; - res->end = (res->end + io_offset) & 0xffffffffu; - - /* Wire up PHB bus resources */ - pcibios_setup_phb_resources(hose); - - /* Scan children */ - hose->last_busno = bus->subordinate = pci_scan_child_bus(bus); -} - -static int __init pcibios_init(void) -{ - struct pci_controller *hose, *tmp; - int next_busno = 0; - - printk(KERN_INFO "PCI: Probing PCI hardware\n"); - - if (pci_flags & PCI_REASSIGN_ALL_BUS) { - printk(KERN_INFO "setting pci_asign_all_busses\n"); - pci_assign_all_buses = 1; - } - - /* Scan all of the recorded PCI controllers. */ - list_for_each_entry_safe(hose, tmp, &hose_list, list_node) { - if (pci_assign_all_buses) - hose->first_busno = next_busno; - hose->last_busno = 0xff; - pcibios_scan_phb(hose); - printk(KERN_INFO "calling pci_bus_add_devices()\n"); - pci_bus_add_devices(hose->bus); - if (pci_assign_all_buses || next_busno <= hose->last_busno) - next_busno = hose->last_busno + \ - pcibios_assign_bus_offset; - } - pci_bus_count = next_busno; - - /* OpenFirmware based machines need a map of OF bus - * numbers vs. kernel bus numbers since we may have to - * remap them. - */ - if (pci_assign_all_buses) - pcibios_make_OF_bus_map(); - - /* Call common code to handle resource allocation */ - pcibios_resource_survey(); - - return 0; -} - -subsys_initcall(pcibios_init); - -static struct pci_controller* -pci_bus_to_hose(int bus) -{ - struct pci_controller *hose, *tmp; - - list_for_each_entry_safe(hose, tmp, &hose_list, list_node) - if (bus >= hose->first_busno && bus <= hose->last_busno) - return hose; - return NULL; -} - -/* Provide information on locations of various I/O regions in physical - * memory. Do this on a per-card basis so that we choose the right - * root bridge. - * Note that the returned IO or memory base is a physical address - */ - -long sys_pciconfig_iobase(long which, unsigned long bus, unsigned long devfn) -{ - struct pci_controller *hose; - long result = -EOPNOTSUPP; - - hose = pci_bus_to_hose(bus); - if (!hose) - return -ENODEV; - - switch (which) { - case IOBASE_BRIDGE_NUMBER: - return (long)hose->first_busno; - case IOBASE_MEMORY: - return (long)hose->pci_mem_offset; - case IOBASE_IO: - return (long)hose->io_base_phys; - case IOBASE_ISA_IO: - return (long)isa_io_base; - case IOBASE_ISA_MEM: - return (long)isa_mem_base; - } - - return result; -} diff --git a/trunk/arch/microblaze/pci/xilinx_pci.c b/trunk/arch/microblaze/pci/xilinx_pci.c deleted file mode 100644 index 7869a41b0f94..000000000000 --- a/trunk/arch/microblaze/pci/xilinx_pci.c +++ /dev/null @@ -1,168 +0,0 @@ -/* - * PCI support for Xilinx plbv46_pci soft-core which can be used on - * Xilinx Virtex ML410 / ML510 boards. - * - * Copyright 2009 Roderick Colenbrander - * Copyright 2009 Secret Lab Technologies Ltd. - * - * The pci bridge fixup code was copied from ppc4xx_pci.c and was written - * by Benjamin Herrenschmidt. - * Copyright 2007 Ben. Herrenschmidt , IBM Corp. - * - * This file is licensed under the terms of the GNU General Public License - * version 2. This program is licensed "as is" without any warranty of any - * kind, whether express or implied. - */ - -#include -#include -#include -#include - -#define XPLB_PCI_ADDR 0x10c -#define XPLB_PCI_DATA 0x110 -#define XPLB_PCI_BUS 0x114 - -#define PCI_HOST_ENABLE_CMD (PCI_COMMAND_SERR | PCI_COMMAND_PARITY | \ - PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY) - -static struct of_device_id xilinx_pci_match[] = { - { .compatible = "xlnx,plbv46-pci-1.03.a", }, - {} -}; - -/** - * xilinx_pci_fixup_bridge - Block Xilinx PHB configuration. - */ -static void xilinx_pci_fixup_bridge(struct pci_dev *dev) -{ - struct pci_controller *hose; - int i; - - if (dev->devfn || dev->bus->self) - return; - - hose = pci_bus_to_host(dev->bus); - if (!hose) - return; - - if (!of_match_node(xilinx_pci_match, hose->dn)) - return; - - /* Hide the PCI host BARs from the kernel as their content doesn't - * fit well in the resource management - */ - for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { - dev->resource[i].start = 0; - dev->resource[i].end = 0; - dev->resource[i].flags = 0; - } - - dev_info(&dev->dev, "Hiding Xilinx plb-pci host bridge resources %s\n", - pci_name(dev)); -} -DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, xilinx_pci_fixup_bridge); - -#ifdef DEBUG -/** - * xilinx_pci_exclude_device - Don't do config access for non-root bus - * - * This is a hack. Config access to any bus other than bus 0 does not - * currently work on the ML510 so we prevent it here. - */ -static int -xilinx_pci_exclude_device(struct pci_controller *hose, u_char bus, u8 devfn) -{ - return (bus != 0); -} - -/** - * xilinx_early_pci_scan - List pci config space for available devices - * - * List pci devices in very early phase. - */ -void __init xilinx_early_pci_scan(struct pci_controller *hose) -{ - u32 bus = 0; - u32 val, dev, func, offset; - - /* Currently we have only 2 device connected - up-to 32 devices */ - for (dev = 0; dev < 2; dev++) { - /* List only first function number - up-to 8 functions */ - for (func = 0; func < 1; func++) { - printk(KERN_INFO "%02x:%02x:%02x", bus, dev, func); - /* read the first 64 standardized bytes */ - /* Up-to 192 bytes can be list of capabilities */ - for (offset = 0; offset < 64; offset += 4) { - early_read_config_dword(hose, bus, - PCI_DEVFN(dev, func), offset, &val); - if (offset == 0 && val == 0xFFFFFFFF) { - printk(KERN_CONT "\nABSENT"); - break; - } - if (!(offset % 0x10)) - printk(KERN_CONT "\n%04x: ", offset); - - printk(KERN_CONT "%08x ", val); - } - printk(KERN_INFO "\n"); - } - } -} -#else -void __init xilinx_early_pci_scan(struct pci_controller *hose) -{ -} -#endif - -/** - * xilinx_pci_init - Find and register a Xilinx PCI host bridge - */ -void __init xilinx_pci_init(void) -{ - struct pci_controller *hose; - struct resource r; - void __iomem *pci_reg; - struct device_node *pci_node; - - pci_node = of_find_matching_node(NULL, xilinx_pci_match); - if (!pci_node) - return; - - if (of_address_to_resource(pci_node, 0, &r)) { - pr_err("xilinx-pci: cannot resolve base address\n"); - return; - } - - hose = pcibios_alloc_controller(pci_node); - if (!hose) { - pr_err("xilinx-pci: pcibios_alloc_controller() failed\n"); - return; - } - - /* Setup config space */ - setup_indirect_pci(hose, r.start + XPLB_PCI_ADDR, - r.start + XPLB_PCI_DATA, - INDIRECT_TYPE_SET_CFG_TYPE); - - /* According to the xilinx plbv46_pci documentation the soft-core starts - * a self-init when the bus master enable bit is set. Without this bit - * set the pci bus can't be scanned. - */ - early_write_config_word(hose, 0, 0, PCI_COMMAND, PCI_HOST_ENABLE_CMD); - - /* Set the max latency timer to 255 */ - early_write_config_byte(hose, 0, 0, PCI_LATENCY_TIMER, 0xff); - - /* Set the max bus number to 255, and bus/subbus no's to 0 */ - pci_reg = of_iomap(pci_node, 0); - out_be32(pci_reg + XPLB_PCI_BUS, 0x000000ff); - iounmap(pci_reg); - - /* Register the host bridge with the linux kernel! */ - pci_process_bridge_OF_ranges(hose, pci_node, - INDIRECT_TYPE_SET_CFG_TYPE); - - pr_info("xilinx-pci: Registered PCI host bridge\n"); - xilinx_early_pci_scan(hose); -} diff --git a/trunk/arch/mips/txx9/generic/setup.c b/trunk/arch/mips/txx9/generic/setup.c index 95184a0a1ae6..7174d830dd05 100644 --- a/trunk/arch/mips/txx9/generic/setup.c +++ b/trunk/arch/mips/txx9/generic/setup.c @@ -956,7 +956,6 @@ void __init txx9_sramc_init(struct resource *r) if (!dev->base) goto exit; dev->dev.cls = &txx9_sramc_sysdev_class; - sysfs_bin_attr_init(&dev->bindata_attr); dev->bindata_attr.attr.name = "bindata"; dev->bindata_attr.attr.mode = S_IRUSR | S_IWUSR; dev->bindata_attr.read = txx9_sram_read; diff --git a/trunk/arch/powerpc/kernel/perf_event.c b/trunk/arch/powerpc/kernel/perf_event.c index 08460a2e9f41..b6cf8f1f4d35 100644 --- a/trunk/arch/powerpc/kernel/perf_event.c +++ b/trunk/arch/powerpc/kernel/perf_event.c @@ -1164,10 +1164,10 @@ static void record_and_restart(struct perf_event *event, unsigned long val, * Finally record data if requested. */ if (record) { - struct perf_sample_data data; - - perf_sample_data_init(&data, ~0ULL); - data.period = event->hw.last_period; + struct perf_sample_data data = { + .addr = ~0ULL, + .period = event->hw.last_period, + }; if (event->attr.sample_type & PERF_SAMPLE_ADDR) perf_get_data_addr(regs, &data.addr); @@ -1287,7 +1287,7 @@ static void perf_event_interrupt(struct pt_regs *regs) irq_exit(); } -static void power_pmu_setup(int cpu) +void hw_perf_event_setup(int cpu) { struct cpu_hw_events *cpuhw = &per_cpu(cpu_hw_events, cpu); @@ -1297,23 +1297,6 @@ static void power_pmu_setup(int cpu) cpuhw->mmcr[0] = MMCR0_FC; } -static int __cpuinit -power_pmu_notifier(struct notifier_block *self, unsigned long action, void *hcpu) -{ - unsigned int cpu = (long)hcpu; - - switch (action & ~CPU_TASKS_FROZEN) { - case CPU_UP_PREPARE: - power_pmu_setup(cpu); - break; - - default: - break; - } - - return NOTIFY_OK; -} - int register_power_pmu(struct power_pmu *pmu) { if (ppmu) @@ -1331,7 +1314,5 @@ int register_power_pmu(struct power_pmu *pmu) freeze_events_kernel = MMCR0_FCHV; #endif /* CONFIG_PPC64 */ - perf_cpu_notifier(power_pmu_notifier); - return 0; } diff --git a/trunk/arch/sh/kernel/perf_event.c b/trunk/arch/sh/kernel/perf_event.c index 9f253e9cce01..7ff0943e7a08 100644 --- a/trunk/arch/sh/kernel/perf_event.c +++ b/trunk/arch/sh/kernel/perf_event.c @@ -275,30 +275,13 @@ const struct pmu *hw_perf_event_init(struct perf_event *event) return &pmu; } -static void sh_pmu_setup(int cpu) +void hw_perf_event_setup(int cpu) { struct cpu_hw_events *cpuhw = &per_cpu(cpu_hw_events, cpu); memset(cpuhw, 0, sizeof(struct cpu_hw_events)); } -static int __cpuinit -sh_pmu_notifier(struct notifier_block *self, unsigned long action, void *hcpu) -{ - unsigned int cpu = (long)hcpu; - - switch (action & ~CPU_TASKS_FROZEN) { - case CPU_UP_PREPARE: - sh_pmu_setup(cpu); - break; - - default: - break; - } - - return NOTIFY_OK; -} - void hw_perf_enable(void) { if (!sh_pmu_initialized()) @@ -325,6 +308,5 @@ int register_sh_pmu(struct sh_pmu *pmu) WARN_ON(pmu->num_events > MAX_HWEVENTS); - perf_cpu_notifier(sh_pmu_notifier); return 0; } diff --git a/trunk/arch/sparc/kernel/perf_event.c b/trunk/arch/sparc/kernel/perf_event.c index 68cb9b42088f..b867ab3353b4 100644 --- a/trunk/arch/sparc/kernel/perf_event.c +++ b/trunk/arch/sparc/kernel/perf_event.c @@ -1189,7 +1189,7 @@ static int __kprobes perf_event_nmi_handler(struct notifier_block *self, regs = args->regs; - perf_sample_data_init(&data, 0); + data.addr = 0; cpuc = &__get_cpu_var(cpu_hw_events); diff --git a/trunk/arch/x86/Kconfig b/trunk/arch/x86/Kconfig index 0eacb1ffb421..93936de67796 100644 --- a/trunk/arch/x86/Kconfig +++ b/trunk/arch/x86/Kconfig @@ -662,7 +662,7 @@ config GART_IOMMU bool "GART IOMMU support" if EMBEDDED default y select SWIOTLB - depends on X86_64 && PCI && K8_NB + depends on X86_64 && PCI ---help--- Support for full DMA access of devices with 32bit memory access only on systems with more than 3GB. This is usually needed for USB, @@ -2061,7 +2061,7 @@ endif # X86_32 config K8_NB def_bool y - depends on CPU_SUP_AMD && PCI + depends on AGP_AMD64 || (X86_64 && (GART_IOMMU || (PCI && NUMA))) source "drivers/pcmcia/Kconfig" diff --git a/trunk/arch/x86/include/asm/hw_breakpoint.h b/trunk/arch/x86/include/asm/hw_breakpoint.h index 2a1bd8f4f23a..0675a7c4c20e 100644 --- a/trunk/arch/x86/include/asm/hw_breakpoint.h +++ b/trunk/arch/x86/include/asm/hw_breakpoint.h @@ -10,6 +10,7 @@ * (display/resolving) */ struct arch_hw_breakpoint { + char *name; /* Contains name of the symbol to set bkpt */ unsigned long address; u8 len; u8 type; diff --git a/trunk/arch/x86/include/asm/perf_event.h b/trunk/arch/x86/include/asm/perf_event.h index db6109a885a7..befd172c82ad 100644 --- a/trunk/arch/x86/include/asm/perf_event.h +++ b/trunk/arch/x86/include/asm/perf_event.h @@ -18,7 +18,7 @@ #define MSR_ARCH_PERFMON_EVENTSEL0 0x186 #define MSR_ARCH_PERFMON_EVENTSEL1 0x187 -#define ARCH_PERFMON_EVENTSEL_ENABLE (1 << 22) +#define ARCH_PERFMON_EVENTSEL0_ENABLE (1 << 22) #define ARCH_PERFMON_EVENTSEL_ANY (1 << 21) #define ARCH_PERFMON_EVENTSEL_INT (1 << 20) #define ARCH_PERFMON_EVENTSEL_OS (1 << 17) @@ -50,7 +50,7 @@ INTEL_ARCH_INV_MASK| \ INTEL_ARCH_EDGE_MASK|\ INTEL_ARCH_UNIT_MASK|\ - INTEL_ARCH_EVENT_MASK) + INTEL_ARCH_EVTSEL_MASK) #define ARCH_PERFMON_UNHALTED_CORE_CYCLES_SEL 0x3c #define ARCH_PERFMON_UNHALTED_CORE_CYCLES_UMASK (0x00 << 8) @@ -117,18 +117,6 @@ union cpuid10_edx { */ #define X86_PMC_IDX_FIXED_BTS (X86_PMC_IDX_FIXED + 16) -/* IbsFetchCtl bits/masks */ -#define IBS_FETCH_RAND_EN (1ULL<<57) -#define IBS_FETCH_VAL (1ULL<<49) -#define IBS_FETCH_ENABLE (1ULL<<48) -#define IBS_FETCH_CNT 0xFFFF0000ULL -#define IBS_FETCH_MAX_CNT 0x0000FFFFULL - -/* IbsOpCtl bits */ -#define IBS_OP_CNT_CTL (1ULL<<19) -#define IBS_OP_VAL (1ULL<<18) -#define IBS_OP_ENABLE (1ULL<<17) -#define IBS_OP_MAX_CNT 0x0000FFFFULL #ifdef CONFIG_PERF_EVENTS extern void init_hw_perf_events(void); diff --git a/trunk/arch/x86/kernel/acpi/boot.c b/trunk/arch/x86/kernel/acpi/boot.c index 0061ea263061..a54d714545ff 100644 --- a/trunk/arch/x86/kernel/acpi/boot.c +++ b/trunk/arch/x86/kernel/acpi/boot.c @@ -490,7 +490,6 @@ int acpi_register_gsi(struct device *dev, u32 gsi, int trigger, int polarity) * ACPI based hotplug support for CPU */ #ifdef CONFIG_ACPI_HOTPLUG_CPU -#include static void acpi_map_cpu2node(acpi_handle handle, int cpu, int physid) { @@ -568,8 +567,6 @@ static int __cpuinit _acpi_map_lsapic(acpi_handle handle, int *pcpu) goto free_new_map; } - acpi_processor_set_pdc(handle); - cpu = cpumask_first(new_map); acpi_map_cpu2node(handle, cpu, physid); @@ -1295,6 +1292,23 @@ static int __init dmi_disable_acpi(const struct dmi_system_id *d) return 0; } +/* + * Limit ACPI to CPU enumeration for HT + */ +static int __init force_acpi_ht(const struct dmi_system_id *d) +{ + if (!acpi_force) { + printk(KERN_NOTICE "%s detected: force use of acpi=ht\n", + d->ident); + disable_acpi(); + acpi_ht = 1; + } else { + printk(KERN_NOTICE + "Warning: acpi=force overrules DMI blacklist: acpi=ht\n"); + } + return 0; +} + /* * Force ignoring BIOS IRQ0 pin2 override */ @@ -1330,6 +1344,82 @@ static struct dmi_system_id __initdata acpi_dmi_table[] = { }, }, + /* + * Boxes that need acpi=ht + */ + { + .callback = force_acpi_ht, + .ident = "FSC Primergy T850", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), + DMI_MATCH(DMI_PRODUCT_NAME, "PRIMERGY T850"), + }, + }, + { + .callback = force_acpi_ht, + .ident = "HP VISUALIZE NT Workstation", + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), + DMI_MATCH(DMI_PRODUCT_NAME, "HP VISUALIZE NT Workstation"), + }, + }, + { + .callback = force_acpi_ht, + .ident = "Compaq Workstation W8000", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Compaq"), + DMI_MATCH(DMI_PRODUCT_NAME, "Workstation W8000"), + }, + }, + { + .callback = force_acpi_ht, + .ident = "ASUS CUR-DLS", + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), + DMI_MATCH(DMI_BOARD_NAME, "CUR-DLS"), + }, + }, + { + .callback = force_acpi_ht, + .ident = "ABIT i440BX-W83977", + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "ABIT "), + DMI_MATCH(DMI_BOARD_NAME, "i440BX-W83977 (BP6)"), + }, + }, + { + .callback = force_acpi_ht, + .ident = "IBM Bladecenter", + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "IBM"), + DMI_MATCH(DMI_BOARD_NAME, "IBM eServer BladeCenter HS20"), + }, + }, + { + .callback = force_acpi_ht, + .ident = "IBM eServer xSeries 360", + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "IBM"), + DMI_MATCH(DMI_BOARD_NAME, "eServer xSeries 360"), + }, + }, + { + .callback = force_acpi_ht, + .ident = "IBM eserver xSeries 330", + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "IBM"), + DMI_MATCH(DMI_BOARD_NAME, "eserver xSeries 330"), + }, + }, + { + .callback = force_acpi_ht, + .ident = "IBM eserver xSeries 440", + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "IBM"), + DMI_MATCH(DMI_PRODUCT_NAME, "eserver xSeries 440"), + }, + }, + /* * Boxes that need ACPI PCI IRQ routing disabled */ @@ -1562,10 +1652,8 @@ static int __init parse_acpi(char *arg) } /* Limit ACPI just to boot-time to enable HT */ else if (strcmp(arg, "ht") == 0) { - if (!acpi_force) { - printk(KERN_WARNING "acpi=ht will be removed in Linux-2.6.35\n"); + if (!acpi_force) disable_acpi(); - } acpi_ht = 1; } /* acpi=rsdt use RSDT instead of XSDT */ diff --git a/trunk/arch/x86/kernel/aperture_64.c b/trunk/arch/x86/kernel/aperture_64.c index 3704997e8b25..f147a95fd84a 100644 --- a/trunk/arch/x86/kernel/aperture_64.c +++ b/trunk/arch/x86/kernel/aperture_64.c @@ -31,6 +31,7 @@ #include int gart_iommu_aperture; +EXPORT_SYMBOL_GPL(gart_iommu_aperture); int gart_iommu_aperture_disabled __initdata; int gart_iommu_aperture_allowed __initdata; diff --git a/trunk/arch/x86/kernel/apic/x2apic_uv_x.c b/trunk/arch/x86/kernel/apic/x2apic_uv_x.c index 49dbeaef2a27..3740c8a4eae7 100644 --- a/trunk/arch/x86/kernel/apic/x2apic_uv_x.c +++ b/trunk/arch/x86/kernel/apic/x2apic_uv_x.c @@ -120,9 +120,11 @@ EXPORT_SYMBOL_GPL(uv_possible_blades); unsigned long sn_rtc_cycles_per_second; EXPORT_SYMBOL(sn_rtc_cycles_per_second); +/* Start with all IRQs pointing to boot CPU. IRQ balancing will shift them. */ + static const struct cpumask *uv_target_cpus(void) { - return cpu_online_mask; + return cpumask_of(0); } static void uv_vector_allocation_domain(int cpu, struct cpumask *retmask) diff --git a/trunk/arch/x86/kernel/cpu/intel.c b/trunk/arch/x86/kernel/cpu/intel.c index 7e1cca13af35..879666f4d871 100644 --- a/trunk/arch/x86/kernel/cpu/intel.c +++ b/trunk/arch/x86/kernel/cpu/intel.c @@ -70,8 +70,7 @@ static void __cpuinit early_init_intel(struct cpuinfo_x86 *c) if (c->x86_power & (1 << 8)) { set_cpu_cap(c, X86_FEATURE_CONSTANT_TSC); set_cpu_cap(c, X86_FEATURE_NONSTOP_TSC); - if (!check_tsc_unstable()) - sched_clock_stable = 1; + sched_clock_stable = 1; } /* diff --git a/trunk/arch/x86/kernel/cpu/mcheck/mce.c b/trunk/arch/x86/kernel/cpu/mcheck/mce.c index 3ab9c886b613..28cba46bf32c 100644 --- a/trunk/arch/x86/kernel/cpu/mcheck/mce.c +++ b/trunk/arch/x86/kernel/cpu/mcheck/mce.c @@ -46,13 +46,6 @@ #include "mce-internal.h" -static DEFINE_MUTEX(mce_read_mutex); - -#define rcu_dereference_check_mce(p) \ - rcu_dereference_check((p), \ - rcu_read_lock_sched_held() || \ - lockdep_is_held(&mce_read_mutex)) - #define CREATE_TRACE_POINTS #include @@ -165,7 +158,7 @@ void mce_log(struct mce *mce) mce->finished = 0; wmb(); for (;;) { - entry = rcu_dereference_check_mce(mcelog.next); + entry = rcu_dereference(mcelog.next); for (;;) { /* * When the buffer fills up discard new entries. @@ -1492,6 +1485,8 @@ static void collect_tscs(void *data) rdtscll(cpu_tsc[smp_processor_id()]); } +static DEFINE_MUTEX(mce_read_mutex); + static ssize_t mce_read(struct file *filp, char __user *ubuf, size_t usize, loff_t *off) { @@ -1505,7 +1500,7 @@ static ssize_t mce_read(struct file *filp, char __user *ubuf, size_t usize, return -ENOMEM; mutex_lock(&mce_read_mutex); - next = rcu_dereference_check_mce(mcelog.next); + next = rcu_dereference(mcelog.next); /* Only supports full reads right now */ if (*off != 0 || usize < MCE_LOG_LEN*sizeof(struct mce)) { @@ -1570,7 +1565,7 @@ static ssize_t mce_read(struct file *filp, char __user *ubuf, size_t usize, static unsigned int mce_poll(struct file *file, poll_table *wait) { poll_wait(file, &mce_wait, wait); - if (rcu_dereference_check_mce(mcelog.next)) + if (rcu_dereference(mcelog.next)) return POLLIN | POLLRDNORM; return 0; } diff --git a/trunk/arch/x86/kernel/cpu/mcheck/mce_intel.c b/trunk/arch/x86/kernel/cpu/mcheck/mce_intel.c index d15df6e49bf0..7c785634af2b 100644 --- a/trunk/arch/x86/kernel/cpu/mcheck/mce_intel.c +++ b/trunk/arch/x86/kernel/cpu/mcheck/mce_intel.c @@ -95,7 +95,7 @@ static void cmci_discover(int banks, int boot) /* Already owned by someone else? */ if (val & CMCI_EN) { - if (test_and_clear_bit(i, owned) && !boot) + if (test_and_clear_bit(i, owned) || boot) print_update("SHD", &hdr, i); __clear_bit(i, __get_cpu_var(mce_poll_banks)); continue; @@ -107,7 +107,7 @@ static void cmci_discover(int banks, int boot) /* Did the enable bit stick? -- the bank supports CMCI */ if (val & CMCI_EN) { - if (!test_and_set_bit(i, owned) && !boot) + if (!test_and_set_bit(i, owned) || boot) print_update("CMCI", &hdr, i); __clear_bit(i, __get_cpu_var(mce_poll_banks)); } else { diff --git a/trunk/arch/x86/kernel/cpu/perf_event.c b/trunk/arch/x86/kernel/cpu/perf_event.c index 60398a0d947c..b1fbdeecf6c9 100644 --- a/trunk/arch/x86/kernel/cpu/perf_event.c +++ b/trunk/arch/x86/kernel/cpu/perf_event.c @@ -73,10 +73,10 @@ struct debug_store { struct event_constraint { union { unsigned long idxmsk[BITS_TO_LONGS(X86_PMC_IDX_MAX)]; - u64 idxmsk64; + u64 idxmsk64[1]; }; - u64 code; - u64 cmask; + int code; + int cmask; int weight; }; @@ -103,7 +103,7 @@ struct cpu_hw_events { }; #define __EVENT_CONSTRAINT(c, n, m, w) {\ - { .idxmsk64 = (n) }, \ + { .idxmsk64[0] = (n) }, \ .code = (c), \ .cmask = (m), \ .weight = (w), \ @@ -116,7 +116,7 @@ struct cpu_hw_events { EVENT_CONSTRAINT(c, n, INTEL_ARCH_EVTSEL_MASK) #define FIXED_EVENT_CONSTRAINT(c, n) \ - EVENT_CONSTRAINT(c, (1ULL << (32+n)), INTEL_ARCH_FIXED_MASK) + EVENT_CONSTRAINT(c, n, INTEL_ARCH_FIXED_MASK) #define EVENT_CONSTRAINT_END \ EVENT_CONSTRAINT(0, 0, 0) @@ -133,8 +133,8 @@ struct x86_pmu { int (*handle_irq)(struct pt_regs *); void (*disable_all)(void); void (*enable_all)(void); - void (*enable)(struct perf_event *); - void (*disable)(struct perf_event *); + void (*enable)(struct hw_perf_event *, int); + void (*disable)(struct hw_perf_event *, int); unsigned eventsel; unsigned perfctr; u64 (*event_map)(int); @@ -157,11 +157,6 @@ struct x86_pmu { void (*put_event_constraints)(struct cpu_hw_events *cpuc, struct perf_event *event); struct event_constraint *event_constraints; - - void (*cpu_prepare)(int cpu); - void (*cpu_starting)(int cpu); - void (*cpu_dying)(int cpu); - void (*cpu_dead)(int cpu); }; static struct x86_pmu x86_pmu __read_mostly; @@ -170,7 +165,8 @@ static DEFINE_PER_CPU(struct cpu_hw_events, cpu_hw_events) = { .enabled = 1, }; -static int x86_perf_event_set_period(struct perf_event *event); +static int x86_perf_event_set_period(struct perf_event *event, + struct hw_perf_event *hwc, int idx); /* * Generalized hw caching related hw_event table, filled @@ -193,12 +189,11 @@ static u64 __read_mostly hw_cache_event_ids * Returns the delta events processed. */ static u64 -x86_perf_event_update(struct perf_event *event) +x86_perf_event_update(struct perf_event *event, + struct hw_perf_event *hwc, int idx) { - struct hw_perf_event *hwc = &event->hw; int shift = 64 - x86_pmu.event_bits; u64 prev_raw_count, new_raw_count; - int idx = hwc->idx; s64 delta; if (idx == X86_PMC_IDX_FIXED_BTS) @@ -298,7 +293,7 @@ static inline bool bts_available(void) return x86_pmu.enable_bts != NULL; } -static void init_debug_store_on_cpu(int cpu) +static inline void init_debug_store_on_cpu(int cpu) { struct debug_store *ds = per_cpu(cpu_hw_events, cpu).ds; @@ -310,7 +305,7 @@ static void init_debug_store_on_cpu(int cpu) (u32)((u64)(unsigned long)ds >> 32)); } -static void fini_debug_store_on_cpu(int cpu) +static inline void fini_debug_store_on_cpu(int cpu) { if (!per_cpu(cpu_hw_events, cpu).ds) return; @@ -508,9 +503,6 @@ static int __hw_perf_event_init(struct perf_event *event) */ if (attr->type == PERF_TYPE_RAW) { hwc->config |= x86_pmu.raw_event(attr->config); - if ((hwc->config & ARCH_PERFMON_EVENTSEL_ANY) && - perf_paranoid_cpu() && !capable(CAP_SYS_ADMIN)) - return -EACCES; return 0; } @@ -561,9 +553,9 @@ static void x86_pmu_disable_all(void) if (!test_bit(idx, cpuc->active_mask)) continue; rdmsrl(x86_pmu.eventsel + idx, val); - if (!(val & ARCH_PERFMON_EVENTSEL_ENABLE)) + if (!(val & ARCH_PERFMON_EVENTSEL0_ENABLE)) continue; - val &= ~ARCH_PERFMON_EVENTSEL_ENABLE; + val &= ~ARCH_PERFMON_EVENTSEL0_ENABLE; wrmsrl(x86_pmu.eventsel + idx, val); } } @@ -598,7 +590,7 @@ static void x86_pmu_enable_all(void) continue; val = event->hw.config; - val |= ARCH_PERFMON_EVENTSEL_ENABLE; + val |= ARCH_PERFMON_EVENTSEL0_ENABLE; wrmsrl(x86_pmu.eventsel + idx, val); } } @@ -620,8 +612,8 @@ static int x86_schedule_events(struct cpu_hw_events *cpuc, int n, int *assign) bitmap_zero(used_mask, X86_PMC_IDX_MAX); for (i = 0; i < n; i++) { - c = x86_pmu.get_event_constraints(cpuc, cpuc->event_list[i]); - constraints[i] = c; + constraints[i] = + x86_pmu.get_event_constraints(cpuc, cpuc->event_list[i]); } /* @@ -643,7 +635,7 @@ static int x86_schedule_events(struct cpu_hw_events *cpuc, int n, int *assign) if (test_bit(hwc->idx, used_mask)) break; - __set_bit(hwc->idx, used_mask); + set_bit(hwc->idx, used_mask); if (assign) assign[i] = hwc->idx; } @@ -692,7 +684,7 @@ static int x86_schedule_events(struct cpu_hw_events *cpuc, int n, int *assign) if (j == X86_PMC_IDX_MAX) break; - __set_bit(j, used_mask); + set_bit(j, used_mask); if (assign) assign[i] = j; @@ -785,7 +777,6 @@ static inline int match_prev_assignment(struct hw_perf_event *hwc, hwc->last_tag == cpuc->tags[i]; } -static int x86_pmu_start(struct perf_event *event); static void x86_pmu_stop(struct perf_event *event); void hw_perf_enable(void) @@ -802,7 +793,6 @@ void hw_perf_enable(void) return; if (cpuc->n_added) { - int n_running = cpuc->n_events - cpuc->n_added; /* * apply assignment obtained either from * hw_perf_group_sched_in() or x86_pmu_enable() @@ -810,7 +800,8 @@ void hw_perf_enable(void) * step1: save events moving to new counters * step2: reprogram moved events into new counters */ - for (i = 0; i < n_running; i++) { + for (i = 0; i < cpuc->n_events; i++) { + event = cpuc->event_list[i]; hwc = &event->hw; @@ -825,18 +816,29 @@ void hw_perf_enable(void) continue; x86_pmu_stop(event); + + hwc->idx = -1; } for (i = 0; i < cpuc->n_events; i++) { + event = cpuc->event_list[i]; hwc = &event->hw; - if (!match_prev_assignment(hwc, cpuc, i)) + if (hwc->idx == -1) { x86_assign_hw_event(event, cpuc, i); - else if (i < n_running) - continue; + x86_perf_event_set_period(event, hwc, hwc->idx); + } + /* + * need to mark as active because x86_pmu_disable() + * clear active_mask and events[] yet it preserves + * idx + */ + set_bit(hwc->idx, cpuc->active_mask); + cpuc->events[hwc->idx] = event; - x86_pmu_start(event); + x86_pmu.enable(hwc, hwc->idx); + perf_event_update_userpage(event); } cpuc->n_added = 0; perf_events_lapic_init(); @@ -848,16 +850,15 @@ void hw_perf_enable(void) x86_pmu.enable_all(); } -static inline void __x86_pmu_enable_event(struct hw_perf_event *hwc) +static inline void __x86_pmu_enable_event(struct hw_perf_event *hwc, int idx) { - (void)checking_wrmsrl(hwc->config_base + hwc->idx, - hwc->config | ARCH_PERFMON_EVENTSEL_ENABLE); + (void)checking_wrmsrl(hwc->config_base + idx, + hwc->config | ARCH_PERFMON_EVENTSEL0_ENABLE); } -static inline void x86_pmu_disable_event(struct perf_event *event) +static inline void x86_pmu_disable_event(struct hw_perf_event *hwc, int idx) { - struct hw_perf_event *hwc = &event->hw; - (void)checking_wrmsrl(hwc->config_base + hwc->idx, hwc->config); + (void)checking_wrmsrl(hwc->config_base + idx, hwc->config); } static DEFINE_PER_CPU(u64 [X86_PMC_IDX_MAX], pmc_prev_left); @@ -867,12 +868,12 @@ static DEFINE_PER_CPU(u64 [X86_PMC_IDX_MAX], pmc_prev_left); * To be called with the event disabled in hw: */ static int -x86_perf_event_set_period(struct perf_event *event) +x86_perf_event_set_period(struct perf_event *event, + struct hw_perf_event *hwc, int idx) { - struct hw_perf_event *hwc = &event->hw; s64 left = atomic64_read(&hwc->period_left); s64 period = hwc->sample_period; - int err, ret = 0, idx = hwc->idx; + int err, ret = 0; if (idx == X86_PMC_IDX_FIXED_BTS) return 0; @@ -918,11 +919,11 @@ x86_perf_event_set_period(struct perf_event *event) return ret; } -static void x86_pmu_enable_event(struct perf_event *event) +static void x86_pmu_enable_event(struct hw_perf_event *hwc, int idx) { struct cpu_hw_events *cpuc = &__get_cpu_var(cpu_hw_events); if (cpuc->enabled) - __x86_pmu_enable_event(&event->hw); + __x86_pmu_enable_event(hwc, idx); } /* @@ -958,32 +959,34 @@ static int x86_pmu_enable(struct perf_event *event) memcpy(cpuc->assign, assign, n*sizeof(int)); cpuc->n_events = n; - cpuc->n_added += n - n0; + cpuc->n_added = n - n0; return 0; } static int x86_pmu_start(struct perf_event *event) { - struct cpu_hw_events *cpuc = &__get_cpu_var(cpu_hw_events); - int idx = event->hw.idx; + struct hw_perf_event *hwc = &event->hw; - if (idx == -1) + if (hwc->idx == -1) return -EAGAIN; - x86_perf_event_set_period(event); - cpuc->events[idx] = event; - __set_bit(idx, cpuc->active_mask); - x86_pmu.enable(event); - perf_event_update_userpage(event); + x86_perf_event_set_period(event, hwc, hwc->idx); + x86_pmu.enable(hwc, hwc->idx); return 0; } static void x86_pmu_unthrottle(struct perf_event *event) { - int ret = x86_pmu_start(event); - WARN_ON_ONCE(ret); + struct cpu_hw_events *cpuc = &__get_cpu_var(cpu_hw_events); + struct hw_perf_event *hwc = &event->hw; + + if (WARN_ON_ONCE(hwc->idx >= X86_PMC_IDX_MAX || + cpuc->events[hwc->idx] != event)) + return; + + x86_pmu.enable(hwc, hwc->idx); } void perf_event_print_debug(void) @@ -1043,16 +1046,18 @@ static void x86_pmu_stop(struct perf_event *event) struct hw_perf_event *hwc = &event->hw; int idx = hwc->idx; - if (!__test_and_clear_bit(idx, cpuc->active_mask)) - return; - - x86_pmu.disable(event); + /* + * Must be done before we disable, otherwise the nmi handler + * could reenable again: + */ + clear_bit(idx, cpuc->active_mask); + x86_pmu.disable(hwc, idx); /* * Drain the remaining delta count out of a event * that we are disabling: */ - x86_perf_event_update(event); + x86_perf_event_update(event, hwc, idx); cpuc->events[idx] = NULL; } @@ -1089,7 +1094,8 @@ static int x86_pmu_handle_irq(struct pt_regs *regs) int idx, handled = 0; u64 val; - perf_sample_data_init(&data, 0); + data.addr = 0; + data.raw = NULL; cpuc = &__get_cpu_var(cpu_hw_events); @@ -1100,7 +1106,7 @@ static int x86_pmu_handle_irq(struct pt_regs *regs) event = cpuc->events[idx]; hwc = &event->hw; - val = x86_perf_event_update(event); + val = x86_perf_event_update(event, hwc, idx); if (val & (1ULL << (x86_pmu.event_bits - 1))) continue; @@ -1110,11 +1116,11 @@ static int x86_pmu_handle_irq(struct pt_regs *regs) handled = 1; data.period = event->hw.last_period; - if (!x86_perf_event_set_period(event)) + if (!x86_perf_event_set_period(event, hwc, idx)) continue; if (perf_event_overflow(event, 1, &data, regs)) - x86_pmu_stop(event); + x86_pmu.disable(hwc, idx); } if (handled) @@ -1301,7 +1307,7 @@ int hw_perf_group_sched_in(struct perf_event *leader, memcpy(cpuc->assign, assign, n0*sizeof(int)); cpuc->n_events = n0; - cpuc->n_added += n1; + cpuc->n_added = n1; ctx->nr_active += n1; /* @@ -1329,39 +1335,6 @@ int hw_perf_group_sched_in(struct perf_event *leader, #include "perf_event_p6.c" #include "perf_event_intel.c" -static int __cpuinit -x86_pmu_notifier(struct notifier_block *self, unsigned long action, void *hcpu) -{ - unsigned int cpu = (long)hcpu; - - switch (action & ~CPU_TASKS_FROZEN) { - case CPU_UP_PREPARE: - if (x86_pmu.cpu_prepare) - x86_pmu.cpu_prepare(cpu); - break; - - case CPU_STARTING: - if (x86_pmu.cpu_starting) - x86_pmu.cpu_starting(cpu); - break; - - case CPU_DYING: - if (x86_pmu.cpu_dying) - x86_pmu.cpu_dying(cpu); - break; - - case CPU_DEAD: - if (x86_pmu.cpu_dead) - x86_pmu.cpu_dead(cpu); - break; - - default: - break; - } - - return NOTIFY_OK; -} - static void __init pmu_check_apic(void) { if (cpu_has_apic) @@ -1374,7 +1347,6 @@ static void __init pmu_check_apic(void) void __init init_hw_perf_events(void) { - struct event_constraint *c; int err; pr_info("Performance Events: "); @@ -1423,16 +1395,6 @@ void __init init_hw_perf_events(void) __EVENT_CONSTRAINT(0, (1ULL << x86_pmu.num_events) - 1, 0, x86_pmu.num_events); - if (x86_pmu.event_constraints) { - for_each_event_constraint(c, x86_pmu.event_constraints) { - if (c->cmask != INTEL_ARCH_FIXED_MASK) - continue; - - c->idxmsk64 |= (1ULL << x86_pmu.num_events) - 1; - c->weight += x86_pmu.num_events; - } - } - pr_info("... version: %d\n", x86_pmu.version); pr_info("... bit width: %d\n", x86_pmu.event_bits); pr_info("... generic registers: %d\n", x86_pmu.num_events); @@ -1440,13 +1402,11 @@ void __init init_hw_perf_events(void) pr_info("... max period: %016Lx\n", x86_pmu.max_period); pr_info("... fixed-purpose events: %d\n", x86_pmu.num_events_fixed); pr_info("... event mask: %016Lx\n", perf_event_mask); - - perf_cpu_notifier(x86_pmu_notifier); } static inline void x86_pmu_read(struct perf_event *event) { - x86_perf_event_update(event); + x86_perf_event_update(event, &event->hw, event->hw.idx); } static const struct pmu pmu = { @@ -1702,16 +1662,28 @@ struct perf_callchain_entry *perf_callchain(struct pt_regs *regs) return entry; } -#ifdef CONFIG_EVENT_TRACING -void perf_arch_fetch_caller_regs(struct pt_regs *regs, unsigned long ip, int skip) +void hw_perf_event_setup_online(int cpu) { - regs->ip = ip; - /* - * perf_arch_fetch_caller_regs adds another call, we need to increment - * the skip level - */ - regs->bp = rewind_frame_pointer(skip + 1); - regs->cs = __KERNEL_CS; - local_save_flags(regs->flags); + init_debug_store_on_cpu(cpu); + + switch (boot_cpu_data.x86_vendor) { + case X86_VENDOR_AMD: + amd_pmu_cpu_online(cpu); + break; + default: + return; + } +} + +void hw_perf_event_setup_offline(int cpu) +{ + init_debug_store_on_cpu(cpu); + + switch (boot_cpu_data.x86_vendor) { + case X86_VENDOR_AMD: + amd_pmu_cpu_offline(cpu); + break; + default: + return; + } } -#endif diff --git a/trunk/arch/x86/kernel/cpu/perf_event_amd.c b/trunk/arch/x86/kernel/cpu/perf_event_amd.c index 573458f1caf2..8f3dbfda3c4f 100644 --- a/trunk/arch/x86/kernel/cpu/perf_event_amd.c +++ b/trunk/arch/x86/kernel/cpu/perf_event_amd.c @@ -271,6 +271,28 @@ amd_get_event_constraints(struct cpu_hw_events *cpuc, struct perf_event *event) return &emptyconstraint; } +static __initconst struct x86_pmu amd_pmu = { + .name = "AMD", + .handle_irq = x86_pmu_handle_irq, + .disable_all = x86_pmu_disable_all, + .enable_all = x86_pmu_enable_all, + .enable = x86_pmu_enable_event, + .disable = x86_pmu_disable_event, + .eventsel = MSR_K7_EVNTSEL0, + .perfctr = MSR_K7_PERFCTR0, + .event_map = amd_pmu_event_map, + .raw_event = amd_pmu_raw_event, + .max_events = ARRAY_SIZE(amd_perfmon_event_map), + .num_events = 4, + .event_bits = 48, + .event_mask = (1ULL << 48) - 1, + .apic = 1, + /* use highest bit to detect overflow */ + .max_period = (1ULL << 47) - 1, + .get_event_constraints = amd_get_event_constraints, + .put_event_constraints = amd_put_event_constraints +}; + static struct amd_nb *amd_alloc_nb(int cpu, int nb_id) { struct amd_nb *nb; @@ -287,7 +309,7 @@ static struct amd_nb *amd_alloc_nb(int cpu, int nb_id) * initialize all possible NB constraints */ for (i = 0; i < x86_pmu.num_events; i++) { - __set_bit(i, nb->event_constraints[i].idxmsk); + set_bit(i, nb->event_constraints[i].idxmsk); nb->event_constraints[i].weight = 1; } return nb; @@ -356,31 +378,6 @@ static void amd_pmu_cpu_offline(int cpu) raw_spin_unlock(&amd_nb_lock); } -static __initconst struct x86_pmu amd_pmu = { - .name = "AMD", - .handle_irq = x86_pmu_handle_irq, - .disable_all = x86_pmu_disable_all, - .enable_all = x86_pmu_enable_all, - .enable = x86_pmu_enable_event, - .disable = x86_pmu_disable_event, - .eventsel = MSR_K7_EVNTSEL0, - .perfctr = MSR_K7_PERFCTR0, - .event_map = amd_pmu_event_map, - .raw_event = amd_pmu_raw_event, - .max_events = ARRAY_SIZE(amd_perfmon_event_map), - .num_events = 4, - .event_bits = 48, - .event_mask = (1ULL << 48) - 1, - .apic = 1, - /* use highest bit to detect overflow */ - .max_period = (1ULL << 47) - 1, - .get_event_constraints = amd_get_event_constraints, - .put_event_constraints = amd_put_event_constraints, - - .cpu_prepare = amd_pmu_cpu_online, - .cpu_dead = amd_pmu_cpu_offline, -}; - static __init int amd_pmu_init(void) { /* Performance-monitoring supported from K7 and later: */ @@ -393,6 +390,11 @@ static __init int amd_pmu_init(void) memcpy(hw_cache_event_ids, amd_hw_cache_event_ids, sizeof(hw_cache_event_ids)); + /* + * explicitly initialize the boot cpu, other cpus will get + * the cpu hotplug callbacks from smp_init() + */ + amd_pmu_cpu_online(smp_processor_id()); return 0; } @@ -403,4 +405,12 @@ static int amd_pmu_init(void) return 0; } +static void amd_pmu_cpu_online(int cpu) +{ +} + +static void amd_pmu_cpu_offline(int cpu) +{ +} + #endif diff --git a/trunk/arch/x86/kernel/cpu/perf_event_intel.c b/trunk/arch/x86/kernel/cpu/perf_event_intel.c index 84bfde64a337..977e7544738c 100644 --- a/trunk/arch/x86/kernel/cpu/perf_event_intel.c +++ b/trunk/arch/x86/kernel/cpu/perf_event_intel.c @@ -1,7 +1,7 @@ #ifdef CONFIG_CPU_SUP_INTEL /* - * Intel PerfMon, used on Core and later. + * Intel PerfMon v3. Used on Core2 and later. */ static const u64 intel_perfmon_event_map[] = { @@ -27,14 +27,8 @@ static struct event_constraint intel_core_event_constraints[] = static struct event_constraint intel_core2_event_constraints[] = { - FIXED_EVENT_CONSTRAINT(0x00c0, 0), /* INST_RETIRED.ANY */ - FIXED_EVENT_CONSTRAINT(0x003c, 1), /* CPU_CLK_UNHALTED.CORE */ - /* - * Core2 has Fixed Counter 2 listed as CPU_CLK_UNHALTED.REF and event - * 0x013c as CPU_CLK_UNHALTED.BUS and specifies there is a fixed - * ratio between these counters. - */ - /* FIXED_EVENT_CONSTRAINT(0x013c, 2), CPU_CLK_UNHALTED.REF */ + FIXED_EVENT_CONSTRAINT(0xc0, (0x3|(1ULL<<32))), /* INSTRUCTIONS_RETIRED */ + FIXED_EVENT_CONSTRAINT(0x3c, (0x3|(1ULL<<33))), /* UNHALTED_CORE_CYCLES */ INTEL_EVENT_CONSTRAINT(0x10, 0x1), /* FP_COMP_OPS_EXE */ INTEL_EVENT_CONSTRAINT(0x11, 0x2), /* FP_ASSIST */ INTEL_EVENT_CONSTRAINT(0x12, 0x2), /* MUL */ @@ -43,16 +37,14 @@ static struct event_constraint intel_core2_event_constraints[] = INTEL_EVENT_CONSTRAINT(0x18, 0x1), /* IDLE_DURING_DIV */ INTEL_EVENT_CONSTRAINT(0x19, 0x2), /* DELAYED_BYPASS */ INTEL_EVENT_CONSTRAINT(0xa1, 0x1), /* RS_UOPS_DISPATCH_CYCLES */ - INTEL_EVENT_CONSTRAINT(0xc9, 0x1), /* ITLB_MISS_RETIRED (T30-9) */ INTEL_EVENT_CONSTRAINT(0xcb, 0x1), /* MEM_LOAD_RETIRED */ EVENT_CONSTRAINT_END }; static struct event_constraint intel_nehalem_event_constraints[] = { - FIXED_EVENT_CONSTRAINT(0x00c0, 0), /* INST_RETIRED.ANY */ - FIXED_EVENT_CONSTRAINT(0x003c, 1), /* CPU_CLK_UNHALTED.CORE */ - /* FIXED_EVENT_CONSTRAINT(0x013c, 2), CPU_CLK_UNHALTED.REF */ + FIXED_EVENT_CONSTRAINT(0xc0, (0xf|(1ULL<<32))), /* INSTRUCTIONS_RETIRED */ + FIXED_EVENT_CONSTRAINT(0x3c, (0xf|(1ULL<<33))), /* UNHALTED_CORE_CYCLES */ INTEL_EVENT_CONSTRAINT(0x40, 0x3), /* L1D_CACHE_LD */ INTEL_EVENT_CONSTRAINT(0x41, 0x3), /* L1D_CACHE_ST */ INTEL_EVENT_CONSTRAINT(0x42, 0x3), /* L1D_CACHE_LOCK */ @@ -66,9 +58,8 @@ static struct event_constraint intel_nehalem_event_constraints[] = static struct event_constraint intel_westmere_event_constraints[] = { - FIXED_EVENT_CONSTRAINT(0x00c0, 0), /* INST_RETIRED.ANY */ - FIXED_EVENT_CONSTRAINT(0x003c, 1), /* CPU_CLK_UNHALTED.CORE */ - /* FIXED_EVENT_CONSTRAINT(0x013c, 2), CPU_CLK_UNHALTED.REF */ + FIXED_EVENT_CONSTRAINT(0xc0, (0xf|(1ULL<<32))), /* INSTRUCTIONS_RETIRED */ + FIXED_EVENT_CONSTRAINT(0x3c, (0xf|(1ULL<<33))), /* UNHALTED_CORE_CYCLES */ INTEL_EVENT_CONSTRAINT(0x51, 0x3), /* L1D */ INTEL_EVENT_CONSTRAINT(0x60, 0x1), /* OFFCORE_REQUESTS_OUTSTANDING */ INTEL_EVENT_CONSTRAINT(0x63, 0x3), /* CACHE_LOCK_CYCLES */ @@ -77,9 +68,8 @@ static struct event_constraint intel_westmere_event_constraints[] = static struct event_constraint intel_gen_event_constraints[] = { - FIXED_EVENT_CONSTRAINT(0x00c0, 0), /* INST_RETIRED.ANY */ - FIXED_EVENT_CONSTRAINT(0x003c, 1), /* CPU_CLK_UNHALTED.CORE */ - /* FIXED_EVENT_CONSTRAINT(0x013c, 2), CPU_CLK_UNHALTED.REF */ + FIXED_EVENT_CONSTRAINT(0xc0, (0x3|(1ULL<<32))), /* INSTRUCTIONS_RETIRED */ + FIXED_EVENT_CONSTRAINT(0x3c, (0x3|(1ULL<<33))), /* UNHALTED_CORE_CYCLES */ EVENT_CONSTRAINT_END }; @@ -548,9 +538,9 @@ static inline void intel_pmu_ack_status(u64 ack) } static inline void -intel_pmu_disable_fixed(struct hw_perf_event *hwc) +intel_pmu_disable_fixed(struct hw_perf_event *hwc, int __idx) { - int idx = hwc->idx - X86_PMC_IDX_FIXED; + int idx = __idx - X86_PMC_IDX_FIXED; u64 ctrl_val, mask; mask = 0xfULL << (idx * 4); @@ -590,9 +580,10 @@ static void intel_pmu_drain_bts_buffer(void) ds->bts_index = ds->bts_buffer_base; - perf_sample_data_init(&data, 0); data.period = event->hw.last_period; + data.addr = 0; + data.raw = NULL; regs.ip = 0; /* @@ -621,28 +612,26 @@ static void intel_pmu_drain_bts_buffer(void) } static inline void -intel_pmu_disable_event(struct perf_event *event) +intel_pmu_disable_event(struct hw_perf_event *hwc, int idx) { - struct hw_perf_event *hwc = &event->hw; - - if (unlikely(hwc->idx == X86_PMC_IDX_FIXED_BTS)) { + if (unlikely(idx == X86_PMC_IDX_FIXED_BTS)) { intel_pmu_disable_bts(); intel_pmu_drain_bts_buffer(); return; } if (unlikely(hwc->config_base == MSR_ARCH_PERFMON_FIXED_CTR_CTRL)) { - intel_pmu_disable_fixed(hwc); + intel_pmu_disable_fixed(hwc, idx); return; } - x86_pmu_disable_event(event); + x86_pmu_disable_event(hwc, idx); } static inline void -intel_pmu_enable_fixed(struct hw_perf_event *hwc) +intel_pmu_enable_fixed(struct hw_perf_event *hwc, int __idx) { - int idx = hwc->idx - X86_PMC_IDX_FIXED; + int idx = __idx - X86_PMC_IDX_FIXED; u64 ctrl_val, bits, mask; int err; @@ -672,11 +661,9 @@ intel_pmu_enable_fixed(struct hw_perf_event *hwc) err = checking_wrmsrl(hwc->config_base, ctrl_val); } -static void intel_pmu_enable_event(struct perf_event *event) +static void intel_pmu_enable_event(struct hw_perf_event *hwc, int idx) { - struct hw_perf_event *hwc = &event->hw; - - if (unlikely(hwc->idx == X86_PMC_IDX_FIXED_BTS)) { + if (unlikely(idx == X86_PMC_IDX_FIXED_BTS)) { if (!__get_cpu_var(cpu_hw_events).enabled) return; @@ -685,11 +672,11 @@ static void intel_pmu_enable_event(struct perf_event *event) } if (unlikely(hwc->config_base == MSR_ARCH_PERFMON_FIXED_CTR_CTRL)) { - intel_pmu_enable_fixed(hwc); + intel_pmu_enable_fixed(hwc, idx); return; } - __x86_pmu_enable_event(hwc); + __x86_pmu_enable_event(hwc, idx); } /* @@ -698,8 +685,14 @@ static void intel_pmu_enable_event(struct perf_event *event) */ static int intel_pmu_save_and_restart(struct perf_event *event) { - x86_perf_event_update(event); - return x86_perf_event_set_period(event); + struct hw_perf_event *hwc = &event->hw; + int idx = hwc->idx; + int ret; + + x86_perf_event_update(event, hwc, idx); + ret = x86_perf_event_set_period(event, hwc, idx); + + return ret; } static void intel_pmu_reset(void) @@ -739,15 +732,16 @@ static int intel_pmu_handle_irq(struct pt_regs *regs) int bit, loops; u64 ack, status; - perf_sample_data_init(&data, 0); + data.addr = 0; + data.raw = NULL; cpuc = &__get_cpu_var(cpu_hw_events); - intel_pmu_disable_all(); + perf_disable(); intel_pmu_drain_bts_buffer(); status = intel_pmu_get_status(); if (!status) { - intel_pmu_enable_all(); + perf_enable(); return 0; } @@ -757,7 +751,8 @@ static int intel_pmu_handle_irq(struct pt_regs *regs) WARN_ONCE(1, "perfevents: irq loop stuck!\n"); perf_event_print_debug(); intel_pmu_reset(); - goto done; + perf_enable(); + return 1; } inc_irq_stat(apic_perf_irqs); @@ -765,6 +760,7 @@ static int intel_pmu_handle_irq(struct pt_regs *regs) for_each_set_bit(bit, (unsigned long *)&status, X86_PMC_IDX_MAX) { struct perf_event *event = cpuc->events[bit]; + clear_bit(bit, (unsigned long *) &status); if (!test_bit(bit, cpuc->active_mask)) continue; @@ -774,7 +770,7 @@ static int intel_pmu_handle_irq(struct pt_regs *regs) data.period = event->hw.last_period; if (perf_event_overflow(event, 1, &data, regs)) - x86_pmu_stop(event); + intel_pmu_disable_event(&event->hw, bit); } intel_pmu_ack_status(ack); @@ -786,8 +782,8 @@ static int intel_pmu_handle_irq(struct pt_regs *regs) if (status) goto again; -done: - intel_pmu_enable_all(); + perf_enable(); + return 1; } @@ -866,10 +862,7 @@ static __initconst struct x86_pmu intel_pmu = { .max_period = (1ULL << 31) - 1, .enable_bts = intel_pmu_enable_bts, .disable_bts = intel_pmu_disable_bts, - .get_event_constraints = intel_get_event_constraints, - - .cpu_starting = init_debug_store_on_cpu, - .cpu_dying = fini_debug_store_on_cpu, + .get_event_constraints = intel_get_event_constraints }; static __init int intel_pmu_init(void) @@ -942,7 +935,7 @@ static __init int intel_pmu_init(void) x86_pmu.event_constraints = intel_nehalem_event_constraints; pr_cont("Nehalem/Corei7 events, "); break; - case 28: /* Atom */ + case 28: memcpy(hw_cache_event_ids, atom_hw_cache_event_ids, sizeof(hw_cache_event_ids)); @@ -958,7 +951,6 @@ static __init int intel_pmu_init(void) x86_pmu.event_constraints = intel_westmere_event_constraints; pr_cont("Westmere events, "); break; - default: /* * default constraints for v2 and up diff --git a/trunk/arch/x86/kernel/cpu/perf_event_p6.c b/trunk/arch/x86/kernel/cpu/perf_event_p6.c index a330485d14da..1ca5ba078afd 100644 --- a/trunk/arch/x86/kernel/cpu/perf_event_p6.c +++ b/trunk/arch/x86/kernel/cpu/perf_event_p6.c @@ -62,7 +62,7 @@ static void p6_pmu_disable_all(void) /* p6 only has one enable register */ rdmsrl(MSR_P6_EVNTSEL0, val); - val &= ~ARCH_PERFMON_EVENTSEL_ENABLE; + val &= ~ARCH_PERFMON_EVENTSEL0_ENABLE; wrmsrl(MSR_P6_EVNTSEL0, val); } @@ -72,34 +72,32 @@ static void p6_pmu_enable_all(void) /* p6 only has one enable register */ rdmsrl(MSR_P6_EVNTSEL0, val); - val |= ARCH_PERFMON_EVENTSEL_ENABLE; + val |= ARCH_PERFMON_EVENTSEL0_ENABLE; wrmsrl(MSR_P6_EVNTSEL0, val); } static inline void -p6_pmu_disable_event(struct perf_event *event) +p6_pmu_disable_event(struct hw_perf_event *hwc, int idx) { struct cpu_hw_events *cpuc = &__get_cpu_var(cpu_hw_events); - struct hw_perf_event *hwc = &event->hw; u64 val = P6_NOP_EVENT; if (cpuc->enabled) - val |= ARCH_PERFMON_EVENTSEL_ENABLE; + val |= ARCH_PERFMON_EVENTSEL0_ENABLE; - (void)checking_wrmsrl(hwc->config_base + hwc->idx, val); + (void)checking_wrmsrl(hwc->config_base + idx, val); } -static void p6_pmu_enable_event(struct perf_event *event) +static void p6_pmu_enable_event(struct hw_perf_event *hwc, int idx) { struct cpu_hw_events *cpuc = &__get_cpu_var(cpu_hw_events); - struct hw_perf_event *hwc = &event->hw; u64 val; val = hwc->config; if (cpuc->enabled) - val |= ARCH_PERFMON_EVENTSEL_ENABLE; + val |= ARCH_PERFMON_EVENTSEL0_ENABLE; - (void)checking_wrmsrl(hwc->config_base + hwc->idx, val); + (void)checking_wrmsrl(hwc->config_base + idx, val); } static __initconst struct x86_pmu p6_pmu = { diff --git a/trunk/arch/x86/kernel/cpu/perfctr-watchdog.c b/trunk/arch/x86/kernel/cpu/perfctr-watchdog.c index fb329e9f8494..74f4e85a5727 100644 --- a/trunk/arch/x86/kernel/cpu/perfctr-watchdog.c +++ b/trunk/arch/x86/kernel/cpu/perfctr-watchdog.c @@ -680,7 +680,7 @@ static int setup_intel_arch_watchdog(unsigned nmi_hz) cpu_nmi_set_wd_enabled(); apic_write(APIC_LVTPC, APIC_DM_NMI); - evntsel |= ARCH_PERFMON_EVENTSEL_ENABLE; + evntsel |= ARCH_PERFMON_EVENTSEL0_ENABLE; wrmsr(evntsel_msr, evntsel, 0); intel_arch_wd_ops.checkbit = 1ULL << (eax.split.bit_width - 1); return 1; diff --git a/trunk/arch/x86/kernel/dumpstack.h b/trunk/arch/x86/kernel/dumpstack.h index 29e5f7c845b2..4fd1420faffa 100644 --- a/trunk/arch/x86/kernel/dumpstack.h +++ b/trunk/arch/x86/kernel/dumpstack.h @@ -29,19 +29,4 @@ struct stack_frame { struct stack_frame *next_frame; unsigned long return_address; }; - -static inline unsigned long rewind_frame_pointer(int n) -{ - struct stack_frame *frame; - - get_bp(frame); - -#ifdef CONFIG_FRAME_POINTER - while (n--) - frame = frame->next_frame; #endif - - return (unsigned long)frame; -} - -#endif /* DUMPSTACK_H */ diff --git a/trunk/arch/x86/kernel/dumpstack_64.c b/trunk/arch/x86/kernel/dumpstack_64.c index 272c9f1f05f3..dce99abb4496 100644 --- a/trunk/arch/x86/kernel/dumpstack_64.c +++ b/trunk/arch/x86/kernel/dumpstack_64.c @@ -120,15 +120,9 @@ fixup_bp_irq_link(unsigned long bp, unsigned long *stack, { #ifdef CONFIG_FRAME_POINTER struct stack_frame *frame = (struct stack_frame *)bp; - unsigned long next; - if (!in_irq_stack(stack, irq_stack, irq_stack_end)) { - if (!probe_kernel_address(&frame->next_frame, next)) - return next; - else - WARN_ONCE(1, "Perf: bad frame pointer = %p in " - "callchain\n", &frame->next_frame); - } + if (!in_irq_stack(stack, irq_stack, irq_stack_end)) + return (unsigned long)frame->next_frame; #endif return bp; } @@ -208,7 +202,7 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs, if (in_irq_stack(stack, irq_stack, irq_stack_end)) { if (ops->stack(data, "IRQ") < 0) break; - bp = ops->walk_stack(tinfo, stack, bp, + bp = print_context_stack(tinfo, stack, bp, ops, data, irq_stack_end, &graph); /* * We link to the next stack (which would be @@ -229,7 +223,7 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs, /* * This handles the process stack: */ - bp = ops->walk_stack(tinfo, stack, bp, ops, data, NULL, &graph); + bp = print_context_stack(tinfo, stack, bp, ops, data, NULL, &graph); put_cpu(); } EXPORT_SYMBOL(dump_trace); diff --git a/trunk/arch/x86/kernel/hw_breakpoint.c b/trunk/arch/x86/kernel/hw_breakpoint.c index d6cc065f519f..dca2802c666f 100644 --- a/trunk/arch/x86/kernel/hw_breakpoint.c +++ b/trunk/arch/x86/kernel/hw_breakpoint.c @@ -343,6 +343,13 @@ int arch_validate_hwbkpt_settings(struct perf_event *bp, return ret; } + /* + * For kernel-addresses, either the address or symbol name can be + * specified. + */ + if (info->name) + info->address = (unsigned long) + kallsyms_lookup_name(info->name); /* * Check that the low-order bits of the address are appropriate * for the alignment implied by len. @@ -528,3 +535,8 @@ void hw_breakpoint_pmu_read(struct perf_event *bp) { /* TODO */ } + +void hw_breakpoint_pmu_unthrottle(struct perf_event *bp) +{ + /* TODO */ +} diff --git a/trunk/arch/x86/kernel/k8.c b/trunk/arch/x86/kernel/k8.c index 9b895464dd03..cbc4332a77b2 100644 --- a/trunk/arch/x86/kernel/k8.c +++ b/trunk/arch/x86/kernel/k8.c @@ -121,17 +121,3 @@ void k8_flush_garts(void) } EXPORT_SYMBOL_GPL(k8_flush_garts); -static __init int init_k8_nbs(void) -{ - int err = 0; - - err = cache_k8_northbridges(); - - if (err < 0) - printk(KERN_NOTICE "K8 NB: Cannot enumerate AMD northbridges.\n"); - - return err; -} - -/* This has to go after the PCI subsystem */ -fs_initcall(init_k8_nbs); diff --git a/trunk/arch/x86/kernel/pci-gart_64.c b/trunk/arch/x86/kernel/pci-gart_64.c index f3af115a573a..34de53b46f87 100644 --- a/trunk/arch/x86/kernel/pci-gart_64.c +++ b/trunk/arch/x86/kernel/pci-gart_64.c @@ -735,7 +735,7 @@ int __init gart_iommu_init(void) unsigned long scratch; long i; - if (num_k8_northbridges == 0) + if (cache_k8_northbridges() < 0 || num_k8_northbridges == 0) return 0; #ifndef CONFIG_AGP_AMD64 diff --git a/trunk/arch/x86/kernel/process.c b/trunk/arch/x86/kernel/process.c index ad9540676fcc..02d678065d7d 100644 --- a/trunk/arch/x86/kernel/process.c +++ b/trunk/arch/x86/kernel/process.c @@ -607,7 +607,7 @@ void __cpuinit select_idle_routine(const struct cpuinfo_x86 *c) { #ifdef CONFIG_SMP if (pm_idle == poll_idle && smp_num_siblings > 1) { - printk_once(KERN_WARNING "WARNING: polling idle and HT enabled," + printk(KERN_WARNING "WARNING: polling idle and HT enabled," " performance may degrade.\n"); } #endif diff --git a/trunk/arch/x86/mm/pageattr.c b/trunk/arch/x86/mm/pageattr.c index cf07c26d9a4a..1d4eb93d333c 100644 --- a/trunk/arch/x86/mm/pageattr.c +++ b/trunk/arch/x86/mm/pageattr.c @@ -291,29 +291,8 @@ static inline pgprot_t static_protections(pgprot_t prot, unsigned long address, */ if (kernel_set_to_readonly && within(address, (unsigned long)_text, - (unsigned long)__end_rodata_hpage_align)) { - unsigned int level; - - /* - * Don't enforce the !RW mapping for the kernel text mapping, - * if the current mapping is already using small page mapping. - * No need to work hard to preserve large page mappings in this - * case. - * - * This also fixes the Linux Xen paravirt guest boot failure - * (because of unexpected read-only mappings for kernel identity - * mappings). In this paravirt guest case, the kernel text - * mapping and the kernel identity mapping share the same - * page-table pages. Thus we can't really use different - * protections for the kernel text and identity mappings. Also, - * these shared mappings are made of small page mappings. - * Thus this don't enforce !RW mapping for small page kernel - * text mapping logic will help Linux Xen parvirt guest boot - * aswell. - */ - if (lookup_address(address, &level) && (level != PG_LEVEL_4K)) - pgprot_val(forbidden) |= _PAGE_RW; - } + (unsigned long)__end_rodata_hpage_align)) + pgprot_val(forbidden) |= _PAGE_RW; #endif prot = __pgprot(pgprot_val(prot) & ~pgprot_val(forbidden)); diff --git a/trunk/arch/x86/oprofile/op_model_amd.c b/trunk/arch/x86/oprofile/op_model_amd.c index 090cbbec7dbd..6a58256dce9f 100644 --- a/trunk/arch/x86/oprofile/op_model_amd.c +++ b/trunk/arch/x86/oprofile/op_model_amd.c @@ -46,6 +46,17 @@ static unsigned long reset_value[NUM_VIRT_COUNTERS]; +/* IbsFetchCtl bits/masks */ +#define IBS_FETCH_RAND_EN (1ULL<<57) +#define IBS_FETCH_VAL (1ULL<<49) +#define IBS_FETCH_ENABLE (1ULL<<48) +#define IBS_FETCH_CNT_MASK 0xFFFF0000ULL + +/* IbsOpCtl bits */ +#define IBS_OP_CNT_CTL (1ULL<<19) +#define IBS_OP_VAL (1ULL<<18) +#define IBS_OP_ENABLE (1ULL<<17) + #define IBS_FETCH_SIZE 6 #define IBS_OP_SIZE 12 @@ -171,7 +182,7 @@ static void op_amd_setup_ctrs(struct op_x86_model_spec const *model, continue; } rdmsrl(msrs->controls[i].addr, val); - if (val & ARCH_PERFMON_EVENTSEL_ENABLE) + if (val & ARCH_PERFMON_EVENTSEL0_ENABLE) op_x86_warn_in_use(i); val &= model->reserved; wrmsrl(msrs->controls[i].addr, val); @@ -279,7 +290,7 @@ op_amd_handle_ibs(struct pt_regs * const regs, oprofile_write_commit(&entry); /* reenable the IRQ */ - ctl &= ~(IBS_FETCH_VAL | IBS_FETCH_CNT); + ctl &= ~(IBS_FETCH_VAL | IBS_FETCH_CNT_MASK); ctl |= IBS_FETCH_ENABLE; wrmsrl(MSR_AMD64_IBSFETCHCTL, ctl); } @@ -319,7 +330,7 @@ static inline void op_amd_start_ibs(void) return; if (ibs_config.fetch_enabled) { - val = (ibs_config.max_cnt_fetch >> 4) & IBS_FETCH_MAX_CNT; + val = (ibs_config.max_cnt_fetch >> 4) & 0xFFFF; val |= ibs_config.rand_en ? IBS_FETCH_RAND_EN : 0; val |= IBS_FETCH_ENABLE; wrmsrl(MSR_AMD64_IBSFETCHCTL, val); @@ -341,7 +352,7 @@ static inline void op_amd_start_ibs(void) * avoid underflows. */ ibs_op_ctl = min(ibs_op_ctl + IBS_RANDOM_MAXCNT_OFFSET, - IBS_OP_MAX_CNT); + 0xFFFFULL); } if (ibs_caps & IBS_CAPS_OPCNT && ibs_config.dispatched_ops) ibs_op_ctl |= IBS_OP_CNT_CTL; @@ -398,7 +409,7 @@ static void op_amd_start(struct op_msrs const * const msrs) if (!reset_value[op_x86_phys_to_virt(i)]) continue; rdmsrl(msrs->controls[i].addr, val); - val |= ARCH_PERFMON_EVENTSEL_ENABLE; + val |= ARCH_PERFMON_EVENTSEL0_ENABLE; wrmsrl(msrs->controls[i].addr, val); } @@ -418,7 +429,7 @@ static void op_amd_stop(struct op_msrs const * const msrs) if (!reset_value[op_x86_phys_to_virt(i)]) continue; rdmsrl(msrs->controls[i].addr, val); - val &= ~ARCH_PERFMON_EVENTSEL_ENABLE; + val &= ~ARCH_PERFMON_EVENTSEL0_ENABLE; wrmsrl(msrs->controls[i].addr, val); } diff --git a/trunk/arch/x86/oprofile/op_model_ppro.c b/trunk/arch/x86/oprofile/op_model_ppro.c index 2bf90fafa7b5..5d1727ba409e 100644 --- a/trunk/arch/x86/oprofile/op_model_ppro.c +++ b/trunk/arch/x86/oprofile/op_model_ppro.c @@ -88,7 +88,7 @@ static void ppro_setup_ctrs(struct op_x86_model_spec const *model, continue; } rdmsrl(msrs->controls[i].addr, val); - if (val & ARCH_PERFMON_EVENTSEL_ENABLE) + if (val & ARCH_PERFMON_EVENTSEL0_ENABLE) op_x86_warn_in_use(i); val &= model->reserved; wrmsrl(msrs->controls[i].addr, val); @@ -166,7 +166,7 @@ static void ppro_start(struct op_msrs const * const msrs) for (i = 0; i < num_counters; ++i) { if (reset_value[i]) { rdmsrl(msrs->controls[i].addr, val); - val |= ARCH_PERFMON_EVENTSEL_ENABLE; + val |= ARCH_PERFMON_EVENTSEL0_ENABLE; wrmsrl(msrs->controls[i].addr, val); } } @@ -184,7 +184,7 @@ static void ppro_stop(struct op_msrs const * const msrs) if (!reset_value[i]) continue; rdmsrl(msrs->controls[i].addr, val); - val &= ~ARCH_PERFMON_EVENTSEL_ENABLE; + val &= ~ARCH_PERFMON_EVENTSEL0_ENABLE; wrmsrl(msrs->controls[i].addr, val); } } diff --git a/trunk/drivers/acpi/Makefile b/trunk/drivers/acpi/Makefile index a8d8998dd5c5..66cc3f36a954 100644 --- a/trunk/drivers/acpi/Makefile +++ b/trunk/drivers/acpi/Makefile @@ -32,7 +32,7 @@ acpi-$(CONFIG_ACPI_SLEEP) += proc.o # acpi-y += bus.o glue.o acpi-y += scan.o -acpi-y += processor_core.o +acpi-y += processor_pdc.o acpi-y += ec.o acpi-$(CONFIG_ACPI_DOCK) += dock.o acpi-y += pci_root.o pci_link.o pci_irq.o pci_bind.o @@ -61,7 +61,7 @@ obj-$(CONFIG_ACPI_SBS) += sbs.o obj-$(CONFIG_ACPI_POWER_METER) += power_meter.o # processor has its own "processor." module_param namespace -processor-y := processor_driver.o processor_throttling.o +processor-y := processor_core.o processor_throttling.o processor-y += processor_idle.o processor_thermal.o processor-$(CONFIG_CPU_FREQ) += processor_perflib.o diff --git a/trunk/drivers/acpi/acpica/exmutex.c b/trunk/drivers/acpi/acpica/exmutex.c index 7116bc86494d..cc8a10268f68 100644 --- a/trunk/drivers/acpi/acpica/exmutex.c +++ b/trunk/drivers/acpi/acpica/exmutex.c @@ -375,7 +375,8 @@ acpi_ex_release_mutex(union acpi_operand_object *obj_desc, return_ACPI_STATUS(AE_AML_MUTEX_NOT_ACQUIRED); } - /* Must have a valid thread. */ + /* Must have a valid thread ID */ + if (!walk_state->thread) { ACPI_ERROR((AE_INFO, "Cannot release Mutex [%4.4s], null thread info", diff --git a/trunk/drivers/acpi/battery.c b/trunk/drivers/acpi/battery.c index 75f39f2c166d..58d2c91ba62b 100644 --- a/trunk/drivers/acpi/battery.c +++ b/trunk/drivers/acpi/battery.c @@ -54,7 +54,6 @@ #define ACPI_BATTERY_DEVICE_NAME "Battery" #define ACPI_BATTERY_NOTIFY_STATUS 0x80 #define ACPI_BATTERY_NOTIFY_INFO 0x81 -#define ACPI_BATTERY_NOTIFY_THRESHOLD 0x82 #define _COMPONENT ACPI_BATTERY_COMPONENT @@ -89,15 +88,10 @@ static const struct acpi_device_id battery_device_ids[] = { MODULE_DEVICE_TABLE(acpi, battery_device_ids); -enum { - ACPI_BATTERY_ALARM_PRESENT, - ACPI_BATTERY_XINFO_PRESENT, - /* For buggy DSDTs that report negative 16-bit values for either - * charging or discharging current and/or report 0 as 65536 - * due to bad math. - */ - ACPI_BATTERY_QUIRK_SIGNED16_CURRENT, -}; +/* For buggy DSDTs that report negative 16-bit values for either charging + * or discharging current and/or report 0 as 65536 due to bad math. + */ +#define QUIRK_SIGNED16_CURRENT 0x0001 struct acpi_battery { struct mutex lock; @@ -115,12 +109,6 @@ struct acpi_battery { int design_voltage; int design_capacity_warning; int design_capacity_low; - int cycle_count; - int measurement_accuracy; - int max_sampling_time; - int min_sampling_time; - int max_averaging_interval; - int min_averaging_interval; int capacity_granularity_1; int capacity_granularity_2; int alarm; @@ -130,7 +118,8 @@ struct acpi_battery { char oem_info[32]; int state; int power_unit; - unsigned long flags; + u8 alarm_present; + long quirks; }; #define to_acpi_battery(x) container_of(x, struct acpi_battery, bat); @@ -209,9 +198,6 @@ static int acpi_battery_get_property(struct power_supply *psy, case POWER_SUPPLY_PROP_TECHNOLOGY: val->intval = acpi_battery_technology(battery); break; - case POWER_SUPPLY_PROP_CYCLE_COUNT: - val->intval = battery->cycle_count; - break; case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN: val->intval = battery->design_voltage * 1000; break; @@ -253,7 +239,6 @@ static enum power_supply_property charge_battery_props[] = { POWER_SUPPLY_PROP_STATUS, POWER_SUPPLY_PROP_PRESENT, POWER_SUPPLY_PROP_TECHNOLOGY, - POWER_SUPPLY_PROP_CYCLE_COUNT, POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN, POWER_SUPPLY_PROP_VOLTAGE_NOW, POWER_SUPPLY_PROP_CURRENT_NOW, @@ -269,7 +254,6 @@ static enum power_supply_property energy_battery_props[] = { POWER_SUPPLY_PROP_STATUS, POWER_SUPPLY_PROP_PRESENT, POWER_SUPPLY_PROP_TECHNOLOGY, - POWER_SUPPLY_PROP_CYCLE_COUNT, POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN, POWER_SUPPLY_PROP_VOLTAGE_NOW, POWER_SUPPLY_PROP_CURRENT_NOW, @@ -321,28 +305,6 @@ static struct acpi_offsets info_offsets[] = { {offsetof(struct acpi_battery, oem_info), 1}, }; -static struct acpi_offsets extended_info_offsets[] = { - {offsetof(struct acpi_battery, power_unit), 0}, - {offsetof(struct acpi_battery, design_capacity), 0}, - {offsetof(struct acpi_battery, full_charge_capacity), 0}, - {offsetof(struct acpi_battery, technology), 0}, - {offsetof(struct acpi_battery, design_voltage), 0}, - {offsetof(struct acpi_battery, design_capacity_warning), 0}, - {offsetof(struct acpi_battery, design_capacity_low), 0}, - {offsetof(struct acpi_battery, cycle_count), 0}, - {offsetof(struct acpi_battery, measurement_accuracy), 0}, - {offsetof(struct acpi_battery, max_sampling_time), 0}, - {offsetof(struct acpi_battery, min_sampling_time), 0}, - {offsetof(struct acpi_battery, max_averaging_interval), 0}, - {offsetof(struct acpi_battery, min_averaging_interval), 0}, - {offsetof(struct acpi_battery, capacity_granularity_1), 0}, - {offsetof(struct acpi_battery, capacity_granularity_2), 0}, - {offsetof(struct acpi_battery, model_number), 1}, - {offsetof(struct acpi_battery, serial_number), 1}, - {offsetof(struct acpi_battery, type), 1}, - {offsetof(struct acpi_battery, oem_info), 1}, -}; - static int extract_package(struct acpi_battery *battery, union acpi_object *package, struct acpi_offsets *offsets, int num) @@ -388,29 +350,22 @@ static int acpi_battery_get_info(struct acpi_battery *battery) { int result = -EFAULT; acpi_status status = 0; - char *name = test_bit(ACPI_BATTERY_XINFO_PRESENT, &battery->flags)? - "_BIX" : "_BIF"; - struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; if (!acpi_battery_present(battery)) return 0; mutex_lock(&battery->lock); - status = acpi_evaluate_object(battery->device->handle, name, - NULL, &buffer); + status = acpi_evaluate_object(battery->device->handle, "_BIF", + NULL, &buffer); mutex_unlock(&battery->lock); if (ACPI_FAILURE(status)) { - ACPI_EXCEPTION((AE_INFO, status, "Evaluating %s", name)); + ACPI_EXCEPTION((AE_INFO, status, "Evaluating _BIF")); return -ENODEV; } - if (test_bit(ACPI_BATTERY_XINFO_PRESENT, &battery->flags)) - result = extract_package(battery, buffer.pointer, - extended_info_offsets, - ARRAY_SIZE(extended_info_offsets)); - else - result = extract_package(battery, buffer.pointer, - info_offsets, ARRAY_SIZE(info_offsets)); + + result = extract_package(battery, buffer.pointer, + info_offsets, ARRAY_SIZE(info_offsets)); kfree(buffer.pointer); return result; } @@ -444,7 +399,7 @@ static int acpi_battery_get_state(struct acpi_battery *battery) battery->update_time = jiffies; kfree(buffer.pointer); - if (test_bit(ACPI_BATTERY_QUIRK_SIGNED16_CURRENT, &battery->flags) && + if ((battery->quirks & QUIRK_SIGNED16_CURRENT) && battery->rate_now != -1) battery->rate_now = abs((s16)battery->rate_now); @@ -457,8 +412,7 @@ static int acpi_battery_set_alarm(struct acpi_battery *battery) union acpi_object arg0 = { .type = ACPI_TYPE_INTEGER }; struct acpi_object_list arg_list = { 1, &arg0 }; - if (!acpi_battery_present(battery) || - !test_bit(ACPI_BATTERY_ALARM_PRESENT, &battery->flags)) + if (!acpi_battery_present(battery)|| !battery->alarm_present) return -ENODEV; arg0.integer.value = battery->alarm; @@ -483,10 +437,10 @@ static int acpi_battery_init_alarm(struct acpi_battery *battery) /* See if alarms are supported, and if so, set default */ status = acpi_get_handle(battery->device->handle, "_BTP", &handle); if (ACPI_FAILURE(status)) { - clear_bit(ACPI_BATTERY_ALARM_PRESENT, &battery->flags); + battery->alarm_present = 0; return 0; } - set_bit(ACPI_BATTERY_ALARM_PRESENT, &battery->flags); + battery->alarm_present = 1; if (!battery->alarm) battery->alarm = battery->design_capacity_warning; return acpi_battery_set_alarm(battery); @@ -556,8 +510,9 @@ static void sysfs_remove_battery(struct acpi_battery *battery) static void acpi_battery_quirks(struct acpi_battery *battery) { + battery->quirks = 0; if (dmi_name_in_vendors("Acer") && battery->power_unit) { - set_bit(ACPI_BATTERY_QUIRK_SIGNED16_CURRENT, &battery->flags); + battery->quirks |= QUIRK_SIGNED16_CURRENT; } } @@ -635,7 +590,6 @@ static int acpi_battery_print_info(struct seq_file *seq, int result) seq_printf(seq, "design capacity low: %d %sh\n", battery->design_capacity_low, acpi_battery_units(battery)); - seq_printf(seq, "cycle count: %i\n", battery->cycle_count); seq_printf(seq, "capacity granularity 1: %d %sh\n", battery->capacity_granularity_1, acpi_battery_units(battery)); @@ -887,7 +841,6 @@ static int acpi_battery_add(struct acpi_device *device) { int result = 0; struct acpi_battery *battery = NULL; - acpi_handle handle; if (!device) return -EINVAL; battery = kzalloc(sizeof(struct acpi_battery), GFP_KERNEL); @@ -898,9 +851,6 @@ static int acpi_battery_add(struct acpi_device *device) strcpy(acpi_device_class(device), ACPI_BATTERY_CLASS); device->driver_data = battery; mutex_init(&battery->lock); - if (ACPI_SUCCESS(acpi_get_handle(battery->device->handle, - "_BIX", &handle))) - set_bit(ACPI_BATTERY_XINFO_PRESENT, &battery->flags); acpi_battery_update(battery); #ifdef CONFIG_ACPI_PROCFS_POWER result = acpi_battery_add_fs(device); diff --git a/trunk/drivers/acpi/bus.c b/trunk/drivers/acpi/bus.c index b70cd3756142..a52126e46307 100644 --- a/trunk/drivers/acpi/bus.c +++ b/trunk/drivers/acpi/bus.c @@ -190,16 +190,16 @@ int acpi_bus_get_power(acpi_handle handle, int *state) * Get the device's power state either directly (via _PSC) or * indirectly (via power resources). */ - if (device->power.flags.power_resources) { - result = acpi_power_get_inferred_state(device); - if (result) - return result; - } else if (device->power.flags.explicit_get) { + if (device->power.flags.explicit_get) { status = acpi_evaluate_integer(device->handle, "_PSC", NULL, &psc); if (ACPI_FAILURE(status)) return -ENODEV; device->power.state = (int)psc; + } else if (device->power.flags.power_resources) { + result = acpi_power_get_inferred_state(device); + if (result) + return result; } *state = device->power.state; diff --git a/trunk/drivers/acpi/ec.c b/trunk/drivers/acpi/ec.c index 1ac28c6a672e..d7a6bbbb834c 100644 --- a/trunk/drivers/acpi/ec.c +++ b/trunk/drivers/acpi/ec.c @@ -76,9 +76,8 @@ enum ec_command { enum { EC_FLAGS_QUERY_PENDING, /* Query is pending */ EC_FLAGS_GPE_STORM, /* GPE storm detected */ - EC_FLAGS_HANDLERS_INSTALLED, /* Handlers for GPE and + EC_FLAGS_HANDLERS_INSTALLED /* Handlers for GPE and * OpReg are installed */ - EC_FLAGS_FROZEN, /* Transactions are suspended */ }; /* If we find an EC via the ECDT, we need to keep a ptr to its context */ @@ -292,10 +291,6 @@ static int acpi_ec_transaction(struct acpi_ec *ec, struct transaction *t) if (t->rdata) memset(t->rdata, 0, t->rlen); mutex_lock(&ec->lock); - if (test_bit(EC_FLAGS_FROZEN, &ec->flags)) { - status = -EINVAL; - goto unlock; - } if (ec->global_lock) { status = acpi_acquire_global_lock(ACPI_EC_UDELAY_GLK, &glk); if (ACPI_FAILURE(status)) { @@ -458,32 +453,6 @@ int ec_transaction(u8 command, EXPORT_SYMBOL(ec_transaction); -void acpi_ec_suspend_transactions(void) -{ - struct acpi_ec *ec = first_ec; - - if (!ec) - return; - - mutex_lock(&ec->lock); - /* Prevent transactions from being carried out */ - set_bit(EC_FLAGS_FROZEN, &ec->flags); - mutex_unlock(&ec->lock); -} - -void acpi_ec_resume_transactions(void) -{ - struct acpi_ec *ec = first_ec; - - if (!ec) - return; - - mutex_lock(&ec->lock); - /* Allow transactions to be carried out again */ - clear_bit(EC_FLAGS_FROZEN, &ec->flags); - mutex_unlock(&ec->lock); -} - static int acpi_ec_query_unlocked(struct acpi_ec *ec, u8 * data) { int result; diff --git a/trunk/drivers/acpi/internal.h b/trunk/drivers/acpi/internal.h index e28411367239..9c4c962e46e3 100644 --- a/trunk/drivers/acpi/internal.h +++ b/trunk/drivers/acpi/internal.h @@ -49,8 +49,6 @@ void acpi_early_processor_set_pdc(void); int acpi_ec_init(void); int acpi_ec_ecdt_probe(void); int acpi_boot_ec_enable(void); -void acpi_ec_suspend_transactions(void); -void acpi_ec_resume_transactions(void); /*-------------------------------------------------------------------------- Suspend/Resume diff --git a/trunk/drivers/acpi/processor_core.c b/trunk/drivers/acpi/processor_core.c index 791ac7b0f8df..e9b7b402dbfb 100644 --- a/trunk/drivers/acpi/processor_core.c +++ b/trunk/drivers/acpi/processor_core.c @@ -1,62 +1,383 @@ /* - * Copyright (C) 2005 Intel Corporation - * Copyright (C) 2009 Hewlett-Packard Development Company, L.P. + * acpi_processor.c - ACPI Processor Driver ($Revision: 71 $) * - * Alex Chiang - * - Unified x86/ia64 implementations - * Venkatesh Pallipadi - * - Added _PDC for platforms with Intel CPUs + * Copyright (C) 2001, 2002 Andy Grover + * Copyright (C) 2001, 2002 Paul Diefenbaugh + * Copyright (C) 2004 Dominik Brodowski + * Copyright (C) 2004 Anil S Keshavamurthy + * - Added processor hotplug support + * + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + * + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * TBD: + * 1. Make # power states dynamic. + * 2. Support duty_cycle values that span bit 4. + * 3. Optimize by having scheduler determine business instead of + * having us try to calculate it here. + * 4. Need C1 timing -- must modify kernel (IRQ handler) to get this. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include #include #include -#include "internal.h" +#define PREFIX "ACPI: " + +#define ACPI_PROCESSOR_CLASS "processor" +#define ACPI_PROCESSOR_DEVICE_NAME "Processor" +#define ACPI_PROCESSOR_FILE_INFO "info" +#define ACPI_PROCESSOR_FILE_THROTTLING "throttling" +#define ACPI_PROCESSOR_FILE_LIMIT "limit" +#define ACPI_PROCESSOR_NOTIFY_PERFORMANCE 0x80 +#define ACPI_PROCESSOR_NOTIFY_POWER 0x81 +#define ACPI_PROCESSOR_NOTIFY_THROTTLING 0x82 + +#define ACPI_PROCESSOR_LIMIT_USER 0 +#define ACPI_PROCESSOR_LIMIT_THERMAL 1 -#define PREFIX "ACPI: " #define _COMPONENT ACPI_PROCESSOR_COMPONENT ACPI_MODULE_NAME("processor_core"); -static int set_no_mwait(const struct dmi_system_id *id) +MODULE_AUTHOR("Paul Diefenbaugh"); +MODULE_DESCRIPTION("ACPI Processor Driver"); +MODULE_LICENSE("GPL"); + +static int acpi_processor_add(struct acpi_device *device); +static int acpi_processor_remove(struct acpi_device *device, int type); +#ifdef CONFIG_ACPI_PROCFS +static int acpi_processor_info_open_fs(struct inode *inode, struct file *file); +#endif +static void acpi_processor_notify(struct acpi_device *device, u32 event); +static acpi_status acpi_processor_hotadd_init(acpi_handle handle, int *p_cpu); +static int acpi_processor_handle_eject(struct acpi_processor *pr); + + +static const struct acpi_device_id processor_device_ids[] = { + {ACPI_PROCESSOR_OBJECT_HID, 0}, + {"ACPI0007", 0}, + {"", 0}, +}; +MODULE_DEVICE_TABLE(acpi, processor_device_ids); + +static struct acpi_driver acpi_processor_driver = { + .name = "processor", + .class = ACPI_PROCESSOR_CLASS, + .ids = processor_device_ids, + .ops = { + .add = acpi_processor_add, + .remove = acpi_processor_remove, + .suspend = acpi_processor_suspend, + .resume = acpi_processor_resume, + .notify = acpi_processor_notify, + }, +}; + +#define INSTALL_NOTIFY_HANDLER 1 +#define UNINSTALL_NOTIFY_HANDLER 2 +#ifdef CONFIG_ACPI_PROCFS +static const struct file_operations acpi_processor_info_fops = { + .owner = THIS_MODULE, + .open = acpi_processor_info_open_fs, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; +#endif + +DEFINE_PER_CPU(struct acpi_processor *, processors); +EXPORT_PER_CPU_SYMBOL(processors); + +struct acpi_processor_errata errata __read_mostly; + +/* -------------------------------------------------------------------------- + Errata Handling + -------------------------------------------------------------------------- */ + +static int acpi_processor_errata_piix4(struct pci_dev *dev) { - printk(KERN_NOTICE PREFIX "%s detected - " - "disabling mwait for CPU C-states\n", id->ident); - idle_nomwait = 1; + u8 value1 = 0; + u8 value2 = 0; + + + if (!dev) + return -EINVAL; + + /* + * Note that 'dev' references the PIIX4 ACPI Controller. + */ + + switch (dev->revision) { + case 0: + ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found PIIX4 A-step\n")); + break; + case 1: + ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found PIIX4 B-step\n")); + break; + case 2: + ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found PIIX4E\n")); + break; + case 3: + ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found PIIX4M\n")); + break; + default: + ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found unknown PIIX4\n")); + break; + } + + switch (dev->revision) { + + case 0: /* PIIX4 A-step */ + case 1: /* PIIX4 B-step */ + /* + * See specification changes #13 ("Manual Throttle Duty Cycle") + * and #14 ("Enabling and Disabling Manual Throttle"), plus + * erratum #5 ("STPCLK# Deassertion Time") from the January + * 2002 PIIX4 specification update. Applies to only older + * PIIX4 models. + */ + errata.piix4.throttle = 1; + + case 2: /* PIIX4E */ + case 3: /* PIIX4M */ + /* + * See erratum #18 ("C3 Power State/BMIDE and Type-F DMA + * Livelock") from the January 2002 PIIX4 specification update. + * Applies to all PIIX4 models. + */ + + /* + * BM-IDE + * ------ + * Find the PIIX4 IDE Controller and get the Bus Master IDE + * Status register address. We'll use this later to read + * each IDE controller's DMA status to make sure we catch all + * DMA activity. + */ + dev = pci_get_subsys(PCI_VENDOR_ID_INTEL, + PCI_DEVICE_ID_INTEL_82371AB, + PCI_ANY_ID, PCI_ANY_ID, NULL); + if (dev) { + errata.piix4.bmisx = pci_resource_start(dev, 4); + pci_dev_put(dev); + } + + /* + * Type-F DMA + * ---------- + * Find the PIIX4 ISA Controller and read the Motherboard + * DMA controller's status to see if Type-F (Fast) DMA mode + * is enabled (bit 7) on either channel. Note that we'll + * disable C3 support if this is enabled, as some legacy + * devices won't operate well if fast DMA is disabled. + */ + dev = pci_get_subsys(PCI_VENDOR_ID_INTEL, + PCI_DEVICE_ID_INTEL_82371AB_0, + PCI_ANY_ID, PCI_ANY_ID, NULL); + if (dev) { + pci_read_config_byte(dev, 0x76, &value1); + pci_read_config_byte(dev, 0x77, &value2); + if ((value1 & 0x80) || (value2 & 0x80)) + errata.piix4.fdma = 1; + pci_dev_put(dev); + } + + break; + } + + if (errata.piix4.bmisx) + ACPI_DEBUG_PRINT((ACPI_DB_INFO, + "Bus master activity detection (BM-IDE) erratum enabled\n")); + if (errata.piix4.fdma) + ACPI_DEBUG_PRINT((ACPI_DB_INFO, + "Type-F DMA livelock erratum (C3 disabled)\n")); + return 0; } -static struct dmi_system_id __cpuinitdata processor_idle_dmi_table[] = { - { - set_no_mwait, "IFL91 board", { - DMI_MATCH(DMI_BIOS_VENDOR, "COMPAL"), - DMI_MATCH(DMI_SYS_VENDOR, "ZEPTO"), - DMI_MATCH(DMI_PRODUCT_VERSION, "3215W"), - DMI_MATCH(DMI_BOARD_NAME, "IFL91") }, NULL}, - { - set_no_mwait, "Extensa 5220", { - DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"), - DMI_MATCH(DMI_SYS_VENDOR, "Acer"), - DMI_MATCH(DMI_PRODUCT_VERSION, "0100"), - DMI_MATCH(DMI_BOARD_NAME, "Columbia") }, NULL}, - {}, -}; +static int acpi_processor_errata(struct acpi_processor *pr) +{ + int result = 0; + struct pci_dev *dev = NULL; + + + if (!pr) + return -EINVAL; + + /* + * PIIX4 + */ + dev = pci_get_subsys(PCI_VENDOR_ID_INTEL, + PCI_DEVICE_ID_INTEL_82371AB_3, PCI_ANY_ID, + PCI_ANY_ID, NULL); + if (dev) { + result = acpi_processor_errata_piix4(dev); + pci_dev_put(dev); + } + + return result; +} + +/* -------------------------------------------------------------------------- + FS Interface (/proc) + -------------------------------------------------------------------------- */ + +#ifdef CONFIG_ACPI_PROCFS +static struct proc_dir_entry *acpi_processor_dir = NULL; + +static int acpi_processor_info_seq_show(struct seq_file *seq, void *offset) +{ + struct acpi_processor *pr = seq->private; + + + if (!pr) + goto end; + + seq_printf(seq, "processor id: %d\n" + "acpi id: %d\n" + "bus mastering control: %s\n" + "power management: %s\n" + "throttling control: %s\n" + "limit interface: %s\n", + pr->id, + pr->acpi_id, + pr->flags.bm_control ? "yes" : "no", + pr->flags.power ? "yes" : "no", + pr->flags.throttling ? "yes" : "no", + pr->flags.limit ? "yes" : "no"); + + end: + return 0; +} + +static int acpi_processor_info_open_fs(struct inode *inode, struct file *file) +{ + return single_open(file, acpi_processor_info_seq_show, + PDE(inode)->data); +} + +static int __cpuinit acpi_processor_add_fs(struct acpi_device *device) +{ + struct proc_dir_entry *entry = NULL; + + + if (!acpi_device_dir(device)) { + acpi_device_dir(device) = proc_mkdir(acpi_device_bid(device), + acpi_processor_dir); + if (!acpi_device_dir(device)) + return -ENODEV; + } + + /* 'info' [R] */ + entry = proc_create_data(ACPI_PROCESSOR_FILE_INFO, + S_IRUGO, acpi_device_dir(device), + &acpi_processor_info_fops, + acpi_driver_data(device)); + if (!entry) + return -EIO; + + /* 'throttling' [R/W] */ + entry = proc_create_data(ACPI_PROCESSOR_FILE_THROTTLING, + S_IFREG | S_IRUGO | S_IWUSR, + acpi_device_dir(device), + &acpi_processor_throttling_fops, + acpi_driver_data(device)); + if (!entry) + return -EIO; + + /* 'limit' [R/W] */ + entry = proc_create_data(ACPI_PROCESSOR_FILE_LIMIT, + S_IFREG | S_IRUGO | S_IWUSR, + acpi_device_dir(device), + &acpi_processor_limit_fops, + acpi_driver_data(device)); + if (!entry) + return -EIO; + return 0; +} +static int acpi_processor_remove_fs(struct acpi_device *device) +{ + + if (acpi_device_dir(device)) { + remove_proc_entry(ACPI_PROCESSOR_FILE_INFO, + acpi_device_dir(device)); + remove_proc_entry(ACPI_PROCESSOR_FILE_THROTTLING, + acpi_device_dir(device)); + remove_proc_entry(ACPI_PROCESSOR_FILE_LIMIT, + acpi_device_dir(device)); + remove_proc_entry(acpi_device_bid(device), acpi_processor_dir); + acpi_device_dir(device) = NULL; + } + + return 0; +} +#else +static inline int acpi_processor_add_fs(struct acpi_device *device) +{ + return 0; +} +static inline int acpi_processor_remove_fs(struct acpi_device *device) +{ + return 0; +} +#endif + +/* Use the acpiid in MADT to map cpus in case of SMP */ + +#ifndef CONFIG_SMP +static int get_cpu_id(acpi_handle handle, int type, u32 acpi_id) { return -1; } +#else + +static struct acpi_table_madt *madt; -#ifdef CONFIG_SMP static int map_lapic_id(struct acpi_subtable_header *entry, u32 acpi_id, int *apic_id) { struct acpi_madt_local_apic *lapic = (struct acpi_madt_local_apic *)entry; - - if (!(lapic->lapic_flags & ACPI_MADT_ENABLED)) - return 0; - - if (lapic->processor_id != acpi_id) - return 0; - - *apic_id = lapic->id; - return 1; + if ((lapic->lapic_flags & ACPI_MADT_ENABLED) && + lapic->processor_id == acpi_id) { + *apic_id = lapic->id; + return 1; + } + return 0; } static int map_x2apic_id(struct acpi_subtable_header *entry, @@ -64,16 +385,22 @@ static int map_x2apic_id(struct acpi_subtable_header *entry, { struct acpi_madt_local_x2apic *apic = (struct acpi_madt_local_x2apic *)entry; + u32 tmp = apic->local_apic_id; + /* Only check enabled APICs*/ if (!(apic->lapic_flags & ACPI_MADT_ENABLED)) return 0; - if (device_declaration && (apic->uid == acpi_id)) { - *apic_id = apic->local_apic_id; - return 1; + /* Device statement declaration type */ + if (device_declaration) { + if (apic->uid == acpi_id) + goto found; } return 0; +found: + *apic_id = tmp; + return 1; } static int map_lsapic_id(struct acpi_subtable_header *entry, @@ -81,34 +408,35 @@ static int map_lsapic_id(struct acpi_subtable_header *entry, { struct acpi_madt_local_sapic *lsapic = (struct acpi_madt_local_sapic *)entry; + u32 tmp = (lsapic->id << 8) | lsapic->eid; + /* Only check enabled APICs*/ if (!(lsapic->lapic_flags & ACPI_MADT_ENABLED)) return 0; + /* Device statement declaration type */ if (device_declaration) { - if ((entry->length < 16) || (lsapic->uid != acpi_id)) - return 0; - } else if (lsapic->processor_id != acpi_id) - return 0; + if (entry->length < 16) + printk(KERN_ERR PREFIX + "Invalid LSAPIC with Device type processor (SAPIC ID %#x)\n", + tmp); + else if (lsapic->uid == acpi_id) + goto found; + /* Processor statement declaration type */ + } else if (lsapic->processor_id == acpi_id) + goto found; - *apic_id = (lsapic->id << 8) | lsapic->eid; + return 0; +found: + *apic_id = tmp; return 1; } static int map_madt_entry(int type, u32 acpi_id) { unsigned long madt_end, entry; - static struct acpi_table_madt *madt; - static int read_madt; int apic_id = -1; - if (!read_madt) { - if (ACPI_FAILURE(acpi_get_table(ACPI_SIG_MADT, 0, - (struct acpi_table_header **)&madt))) - madt = NULL; - read_madt++; - } - if (!madt) return apic_id; @@ -168,7 +496,7 @@ static int map_mat_entry(acpi_handle handle, int type, u32 acpi_id) return apic_id; } -int acpi_get_cpuid(acpi_handle handle, int type, u32 acpi_id) +static int get_cpu_id(acpi_handle handle, int type, u32 acpi_id) { int i; int apic_id = -1; @@ -185,170 +513,630 @@ int acpi_get_cpuid(acpi_handle handle, int type, u32 acpi_id) } return -1; } -EXPORT_SYMBOL_GPL(acpi_get_cpuid); #endif -static bool processor_physically_present(acpi_handle handle) +/* -------------------------------------------------------------------------- + Driver Interface + -------------------------------------------------------------------------- */ + +static int acpi_processor_get_info(struct acpi_device *device) { - int cpuid, type; - u32 acpi_id; - acpi_status status; - acpi_object_type acpi_type; - unsigned long long tmp; + acpi_status status = 0; union acpi_object object = { 0 }; struct acpi_buffer buffer = { sizeof(union acpi_object), &object }; + struct acpi_processor *pr; + int cpu_index, device_declaration = 0; + static int cpu0_initialized; - status = acpi_get_type(handle, &acpi_type); - if (ACPI_FAILURE(status)) - return false; - - switch (acpi_type) { - case ACPI_TYPE_PROCESSOR: - status = acpi_evaluate_object(handle, NULL, NULL, &buffer); - if (ACPI_FAILURE(status)) - return false; - acpi_id = object.processor.proc_id; + pr = acpi_driver_data(device); + if (!pr) + return -EINVAL; + + if (num_online_cpus() > 1) + errata.smp = TRUE; + + acpi_processor_errata(pr); + + /* + * Check to see if we have bus mastering arbitration control. This + * is required for proper C3 usage (to maintain cache coherency). + */ + if (acpi_gbl_FADT.pm2_control_block && acpi_gbl_FADT.pm2_control_length) { + pr->flags.bm_control = 1; + ACPI_DEBUG_PRINT((ACPI_DB_INFO, + "Bus mastering arbitration control present\n")); + } else + ACPI_DEBUG_PRINT((ACPI_DB_INFO, + "No bus mastering arbitration control\n")); + + if (!strcmp(acpi_device_hid(device), ACPI_PROCESSOR_OBJECT_HID)) { + /* Declared with "Processor" statement; match ProcessorID */ + status = acpi_evaluate_object(pr->handle, NULL, NULL, &buffer); + if (ACPI_FAILURE(status)) { + printk(KERN_ERR PREFIX "Evaluating processor object\n"); + return -ENODEV; + } + + /* + * TBD: Synch processor ID (via LAPIC/LSAPIC structures) on SMP. + * >>> 'acpi_get_processor_id(acpi_id, &id)' in + * arch/xxx/acpi.c + */ + pr->acpi_id = object.processor.proc_id; + } else { + /* + * Declared with "Device" statement; match _UID. + * Note that we don't handle string _UIDs yet. + */ + unsigned long long value; + status = acpi_evaluate_integer(pr->handle, METHOD_NAME__UID, + NULL, &value); + if (ACPI_FAILURE(status)) { + printk(KERN_ERR PREFIX + "Evaluating processor _UID [%#x]\n", status); + return -ENODEV; + } + device_declaration = 1; + pr->acpi_id = value; + } + cpu_index = get_cpu_id(pr->handle, device_declaration, pr->acpi_id); + + /* Handle UP system running SMP kernel, with no LAPIC in MADT */ + if (!cpu0_initialized && (cpu_index == -1) && + (num_online_cpus() == 1)) { + cpu_index = 0; + } + + cpu0_initialized = 1; + + pr->id = cpu_index; + + /* + * Extra Processor objects may be enumerated on MP systems with + * less than the max # of CPUs. They should be ignored _iff + * they are physically not present. + */ + if (pr->id == -1) { + if (ACPI_FAILURE + (acpi_processor_hotadd_init(pr->handle, &pr->id))) { + return -ENODEV; + } + } + /* + * On some boxes several processors use the same processor bus id. + * But they are located in different scope. For example: + * \_SB.SCK0.CPU0 + * \_SB.SCK1.CPU0 + * Rename the processor device bus id. And the new bus id will be + * generated as the following format: + * CPU+CPU ID. + */ + sprintf(acpi_device_bid(device), "CPU%X", pr->id); + ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Processor [%d:%d]\n", pr->id, + pr->acpi_id)); + + if (!object.processor.pblk_address) + ACPI_DEBUG_PRINT((ACPI_DB_INFO, "No PBLK (NULL address)\n")); + else if (object.processor.pblk_length != 6) + printk(KERN_ERR PREFIX "Invalid PBLK length [%d]\n", + object.processor.pblk_length); + else { + pr->throttling.address = object.processor.pblk_address; + pr->throttling.duty_offset = acpi_gbl_FADT.duty_offset; + pr->throttling.duty_width = acpi_gbl_FADT.duty_width; + + pr->pblk = object.processor.pblk_address; + + /* + * We don't care about error returns - we just try to mark + * these reserved so that nobody else is confused into thinking + * that this region might be unused.. + * + * (In particular, allocating the IO range for Cardbus) + */ + request_region(pr->throttling.address, 6, "ACPI CPU throttle"); + } + + /* + * If ACPI describes a slot number for this CPU, we can use it + * ensure we get the right value in the "physical id" field + * of /proc/cpuinfo + */ + status = acpi_evaluate_object(pr->handle, "_SUN", NULL, &buffer); + if (ACPI_SUCCESS(status)) + arch_fix_phys_package_id(pr->id, object.integer.value); + + return 0; +} + +static DEFINE_PER_CPU(void *, processor_device_array); + +static void acpi_processor_notify(struct acpi_device *device, u32 event) +{ + struct acpi_processor *pr = acpi_driver_data(device); + int saved; + + if (!pr) + return; + + switch (event) { + case ACPI_PROCESSOR_NOTIFY_PERFORMANCE: + saved = pr->performance_platform_limit; + acpi_processor_ppc_has_changed(pr, 1); + if (saved == pr->performance_platform_limit) + break; + acpi_bus_generate_proc_event(device, event, + pr->performance_platform_limit); + acpi_bus_generate_netlink_event(device->pnp.device_class, + dev_name(&device->dev), event, + pr->performance_platform_limit); break; - case ACPI_TYPE_DEVICE: - status = acpi_evaluate_integer(handle, "_UID", NULL, &tmp); - if (ACPI_FAILURE(status)) - return false; - acpi_id = tmp; + case ACPI_PROCESSOR_NOTIFY_POWER: + acpi_processor_cst_has_changed(pr); + acpi_bus_generate_proc_event(device, event, 0); + acpi_bus_generate_netlink_event(device->pnp.device_class, + dev_name(&device->dev), event, 0); break; + case ACPI_PROCESSOR_NOTIFY_THROTTLING: + acpi_processor_tstate_has_changed(pr); + acpi_bus_generate_proc_event(device, event, 0); + acpi_bus_generate_netlink_event(device->pnp.device_class, + dev_name(&device->dev), event, 0); default: - return false; + ACPI_DEBUG_PRINT((ACPI_DB_INFO, + "Unsupported event [0x%x]\n", event)); + break; } - type = (acpi_type == ACPI_TYPE_DEVICE) ? 1 : 0; - cpuid = acpi_get_cpuid(handle, type, acpi_id); + return; +} - if (cpuid == -1) - return false; +static int acpi_cpu_soft_notify(struct notifier_block *nfb, + unsigned long action, void *hcpu) +{ + unsigned int cpu = (unsigned long)hcpu; + struct acpi_processor *pr = per_cpu(processors, cpu); - return true; + if (action == CPU_ONLINE && pr) { + acpi_processor_ppc_has_changed(pr, 0); + acpi_processor_cst_has_changed(pr); + acpi_processor_tstate_has_changed(pr); + } + return NOTIFY_OK; } -static void acpi_set_pdc_bits(u32 *buf) +static struct notifier_block acpi_cpu_notifier = { - buf[0] = ACPI_PDC_REVISION_ID; - buf[1] = 1; + .notifier_call = acpi_cpu_soft_notify, +}; - /* Enable coordination with firmware's _TSD info */ - buf[2] = ACPI_PDC_SMP_T_SWCOORD; +static int __cpuinit acpi_processor_add(struct acpi_device *device) +{ + struct acpi_processor *pr = NULL; + int result = 0; + struct sys_device *sysdev; - /* Twiddle arch-specific bits needed for _PDC */ - arch_acpi_set_pdc_bits(buf); -} + pr = kzalloc(sizeof(struct acpi_processor), GFP_KERNEL); + if (!pr) + return -ENOMEM; -static struct acpi_object_list *acpi_processor_alloc_pdc(void) -{ - struct acpi_object_list *obj_list; - union acpi_object *obj; - u32 *buf; + if (!zalloc_cpumask_var(&pr->throttling.shared_cpu_map, GFP_KERNEL)) { + kfree(pr); + return -ENOMEM; + } + + pr->handle = device->handle; + strcpy(acpi_device_name(device), ACPI_PROCESSOR_DEVICE_NAME); + strcpy(acpi_device_class(device), ACPI_PROCESSOR_CLASS); + device->driver_data = pr; + + result = acpi_processor_get_info(device); + if (result) { + /* Processor is physically not present */ + return 0; + } + + BUG_ON((pr->id >= nr_cpu_ids) || (pr->id < 0)); - /* allocate and initialize pdc. It will be used later. */ - obj_list = kmalloc(sizeof(struct acpi_object_list), GFP_KERNEL); - if (!obj_list) { - printk(KERN_ERR "Memory allocation error\n"); - return NULL; + /* + * Buggy BIOS check + * ACPI id of processors can be reported wrongly by the BIOS. + * Don't trust it blindly + */ + if (per_cpu(processor_device_array, pr->id) != NULL && + per_cpu(processor_device_array, pr->id) != device) { + printk(KERN_WARNING "BIOS reported wrong ACPI id " + "for the processor\n"); + result = -ENODEV; + goto err_free_cpumask; } + per_cpu(processor_device_array, pr->id) = device; + + per_cpu(processors, pr->id) = pr; + + result = acpi_processor_add_fs(device); + if (result) + goto err_free_cpumask; - obj = kmalloc(sizeof(union acpi_object), GFP_KERNEL); - if (!obj) { - printk(KERN_ERR "Memory allocation error\n"); - kfree(obj_list); - return NULL; + sysdev = get_cpu_sysdev(pr->id); + if (sysfs_create_link(&device->dev.kobj, &sysdev->kobj, "sysdev")) { + result = -EFAULT; + goto err_remove_fs; } - buf = kmalloc(12, GFP_KERNEL); - if (!buf) { - printk(KERN_ERR "Memory allocation error\n"); - kfree(obj); - kfree(obj_list); - return NULL; + /* _PDC call should be done before doing anything else (if reqd.). */ + acpi_processor_set_pdc(pr->handle); + +#ifdef CONFIG_CPU_FREQ + acpi_processor_ppc_has_changed(pr, 0); +#endif + acpi_processor_get_throttling_info(pr); + acpi_processor_get_limit_info(pr); + + + acpi_processor_power_init(pr, device); + + pr->cdev = thermal_cooling_device_register("Processor", device, + &processor_cooling_ops); + if (IS_ERR(pr->cdev)) { + result = PTR_ERR(pr->cdev); + goto err_power_exit; } - acpi_set_pdc_bits(buf); + dev_dbg(&device->dev, "registered as cooling_device%d\n", + pr->cdev->id); - obj->type = ACPI_TYPE_BUFFER; - obj->buffer.length = 12; - obj->buffer.pointer = (u8 *) buf; - obj_list->count = 1; - obj_list->pointer = obj; + result = sysfs_create_link(&device->dev.kobj, + &pr->cdev->device.kobj, + "thermal_cooling"); + if (result) { + printk(KERN_ERR PREFIX "Create sysfs link\n"); + goto err_thermal_unregister; + } + result = sysfs_create_link(&pr->cdev->device.kobj, + &device->dev.kobj, + "device"); + if (result) { + printk(KERN_ERR PREFIX "Create sysfs link\n"); + goto err_remove_sysfs; + } + + return 0; + +err_remove_sysfs: + sysfs_remove_link(&device->dev.kobj, "thermal_cooling"); +err_thermal_unregister: + thermal_cooling_device_unregister(pr->cdev); +err_power_exit: + acpi_processor_power_exit(pr, device); +err_remove_fs: + acpi_processor_remove_fs(device); +err_free_cpumask: + free_cpumask_var(pr->throttling.shared_cpu_map); - return obj_list; + return result; } -/* - * _PDC is required for a BIOS-OS handshake for most of the newer - * ACPI processor features. - */ -static int -acpi_processor_eval_pdc(acpi_handle handle, struct acpi_object_list *pdc_in) +static int acpi_processor_remove(struct acpi_device *device, int type) { - acpi_status status = AE_OK; + struct acpi_processor *pr = NULL; - if (idle_nomwait) { - /* - * If mwait is disabled for CPU C-states, the C2C3_FFH access - * mode will be disabled in the parameter of _PDC object. - * Of course C1_FFH access mode will also be disabled. - */ - union acpi_object *obj; - u32 *buffer = NULL; - obj = pdc_in->pointer; - buffer = (u32 *)(obj->buffer.pointer); - buffer[2] &= ~(ACPI_PDC_C_C2C3_FFH | ACPI_PDC_C_C1_FFH); + if (!device || !acpi_driver_data(device)) + return -EINVAL; + + pr = acpi_driver_data(device); + if (pr->id >= nr_cpu_ids) + goto free; + + if (type == ACPI_BUS_REMOVAL_EJECT) { + if (acpi_processor_handle_eject(pr)) + return -EINVAL; } - status = acpi_evaluate_object(handle, "_PDC", pdc_in, NULL); - if (ACPI_FAILURE(status)) + acpi_processor_power_exit(pr, device); + + sysfs_remove_link(&device->dev.kobj, "sysdev"); + + acpi_processor_remove_fs(device); + + if (pr->cdev) { + sysfs_remove_link(&device->dev.kobj, "thermal_cooling"); + sysfs_remove_link(&pr->cdev->device.kobj, "device"); + thermal_cooling_device_unregister(pr->cdev); + pr->cdev = NULL; + } + + per_cpu(processors, pr->id) = NULL; + per_cpu(processor_device_array, pr->id) = NULL; + +free: + free_cpumask_var(pr->throttling.shared_cpu_map); + kfree(pr); + + return 0; +} + +#ifdef CONFIG_ACPI_HOTPLUG_CPU +/**************************************************************************** + * Acpi processor hotplug support * + ****************************************************************************/ + +static int is_processor_present(acpi_handle handle) +{ + acpi_status status; + unsigned long long sta = 0; + + + status = acpi_evaluate_integer(handle, "_STA", NULL, &sta); + + if (ACPI_SUCCESS(status) && (sta & ACPI_STA_DEVICE_PRESENT)) + return 1; + + /* + * _STA is mandatory for a processor that supports hot plug + */ + if (status == AE_NOT_FOUND) ACPI_DEBUG_PRINT((ACPI_DB_INFO, - "Could not evaluate _PDC, using legacy perf. control.\n")); + "Processor does not support hot plug\n")); + else + ACPI_EXCEPTION((AE_INFO, status, + "Processor Device is not present")); + return 0; +} + +static +int acpi_processor_device_add(acpi_handle handle, struct acpi_device **device) +{ + acpi_handle phandle; + struct acpi_device *pdev; + + + if (acpi_get_parent(handle, &phandle)) { + return -ENODEV; + } + + if (acpi_bus_get_device(phandle, &pdev)) { + return -ENODEV; + } - return status; + if (acpi_bus_add(device, pdev, handle, ACPI_BUS_TYPE_PROCESSOR)) { + return -ENODEV; + } + + return 0; } -void acpi_processor_set_pdc(acpi_handle handle) +static void __ref acpi_processor_hotplug_notify(acpi_handle handle, + u32 event, void *data) { - struct acpi_object_list *obj_list; + struct acpi_processor *pr; + struct acpi_device *device = NULL; + int result; - if (arch_has_acpi_pdc() == false) - return; - obj_list = acpi_processor_alloc_pdc(); - if (!obj_list) - return; + switch (event) { + case ACPI_NOTIFY_BUS_CHECK: + case ACPI_NOTIFY_DEVICE_CHECK: + ACPI_DEBUG_PRINT((ACPI_DB_INFO, + "Processor driver received %s event\n", + (event == ACPI_NOTIFY_BUS_CHECK) ? + "ACPI_NOTIFY_BUS_CHECK" : "ACPI_NOTIFY_DEVICE_CHECK")); + + if (!is_processor_present(handle)) + break; - acpi_processor_eval_pdc(handle, obj_list); + if (acpi_bus_get_device(handle, &device)) { + result = acpi_processor_device_add(handle, &device); + if (result) + printk(KERN_ERR PREFIX + "Unable to add the device\n"); + break; + } + break; + case ACPI_NOTIFY_EJECT_REQUEST: + ACPI_DEBUG_PRINT((ACPI_DB_INFO, + "received ACPI_NOTIFY_EJECT_REQUEST\n")); - kfree(obj_list->pointer->buffer.pointer); - kfree(obj_list->pointer); - kfree(obj_list); + if (acpi_bus_get_device(handle, &device)) { + printk(KERN_ERR PREFIX + "Device don't exist, dropping EJECT\n"); + break; + } + pr = acpi_driver_data(device); + if (!pr) { + printk(KERN_ERR PREFIX + "Driver data is NULL, dropping EJECT\n"); + return; + } + break; + default: + ACPI_DEBUG_PRINT((ACPI_DB_INFO, + "Unsupported event [0x%x]\n", event)); + break; + } + + return; } -EXPORT_SYMBOL_GPL(acpi_processor_set_pdc); static acpi_status -early_init_pdc(acpi_handle handle, u32 lvl, void *context, void **rv) +processor_walk_namespace_cb(acpi_handle handle, + u32 lvl, void *context, void **rv) { - if (processor_physically_present(handle) == false) - return AE_OK; + acpi_status status; + int *action = context; + acpi_object_type type = 0; + + status = acpi_get_type(handle, &type); + if (ACPI_FAILURE(status)) + return (AE_OK); + + if (type != ACPI_TYPE_PROCESSOR) + return (AE_OK); + + switch (*action) { + case INSTALL_NOTIFY_HANDLER: + acpi_install_notify_handler(handle, + ACPI_SYSTEM_NOTIFY, + acpi_processor_hotplug_notify, + NULL); + break; + case UNINSTALL_NOTIFY_HANDLER: + acpi_remove_notify_handler(handle, + ACPI_SYSTEM_NOTIFY, + acpi_processor_hotplug_notify); + break; + default: + break; + } + + return (AE_OK); +} + +static acpi_status acpi_processor_hotadd_init(acpi_handle handle, int *p_cpu) +{ + + if (!is_processor_present(handle)) { + return AE_ERROR; + } + + if (acpi_map_lsapic(handle, p_cpu)) + return AE_ERROR; + + if (arch_register_cpu(*p_cpu)) { + acpi_unmap_lsapic(*p_cpu); + return AE_ERROR; + } - acpi_processor_set_pdc(handle); return AE_OK; } -void __init acpi_early_processor_set_pdc(void) +static int acpi_processor_handle_eject(struct acpi_processor *pr) { - /* - * Check whether the system is DMI table. If yes, OSPM - * should not use mwait for CPU-states. - */ - dmi_check_system(processor_idle_dmi_table); + if (cpu_online(pr->id)) + cpu_down(pr->id); + + arch_unregister_cpu(pr->id); + acpi_unmap_lsapic(pr->id); + return (0); +} +#else +static acpi_status acpi_processor_hotadd_init(acpi_handle handle, int *p_cpu) +{ + return AE_ERROR; +} +static int acpi_processor_handle_eject(struct acpi_processor *pr) +{ + return (-EINVAL); +} +#endif + +static +void acpi_processor_install_hotplug_notify(void) +{ +#ifdef CONFIG_ACPI_HOTPLUG_CPU + int action = INSTALL_NOTIFY_HANDLER; + acpi_walk_namespace(ACPI_TYPE_PROCESSOR, + ACPI_ROOT_OBJECT, + ACPI_UINT32_MAX, + processor_walk_namespace_cb, NULL, &action, NULL); +#endif + register_hotcpu_notifier(&acpi_cpu_notifier); +} - acpi_walk_namespace(ACPI_TYPE_PROCESSOR, ACPI_ROOT_OBJECT, +static +void acpi_processor_uninstall_hotplug_notify(void) +{ +#ifdef CONFIG_ACPI_HOTPLUG_CPU + int action = UNINSTALL_NOTIFY_HANDLER; + acpi_walk_namespace(ACPI_TYPE_PROCESSOR, + ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, - early_init_pdc, NULL, NULL, NULL); + processor_walk_namespace_cb, NULL, &action, NULL); +#endif + unregister_hotcpu_notifier(&acpi_cpu_notifier); } + +/* + * We keep the driver loaded even when ACPI is not running. + * This is needed for the powernow-k8 driver, that works even without + * ACPI, but needs symbols from this driver + */ + +static int __init acpi_processor_init(void) +{ + int result = 0; + + if (acpi_disabled) + return 0; + + memset(&errata, 0, sizeof(errata)); + +#ifdef CONFIG_SMP + if (ACPI_FAILURE(acpi_get_table(ACPI_SIG_MADT, 0, + (struct acpi_table_header **)&madt))) + madt = NULL; +#endif +#ifdef CONFIG_ACPI_PROCFS + acpi_processor_dir = proc_mkdir(ACPI_PROCESSOR_CLASS, acpi_root_dir); + if (!acpi_processor_dir) + return -ENOMEM; +#endif + result = cpuidle_register_driver(&acpi_idle_driver); + if (result < 0) + goto out_proc; + + result = acpi_bus_register_driver(&acpi_processor_driver); + if (result < 0) + goto out_cpuidle; + + acpi_processor_install_hotplug_notify(); + + acpi_thermal_cpufreq_init(); + + acpi_processor_ppc_init(); + + acpi_processor_throttling_init(); + + return 0; + +out_cpuidle: + cpuidle_unregister_driver(&acpi_idle_driver); + +out_proc: +#ifdef CONFIG_ACPI_PROCFS + remove_proc_entry(ACPI_PROCESSOR_CLASS, acpi_root_dir); +#endif + + return result; +} + +static void __exit acpi_processor_exit(void) +{ + if (acpi_disabled) + return; + + acpi_processor_ppc_exit(); + + acpi_thermal_cpufreq_exit(); + + acpi_processor_uninstall_hotplug_notify(); + + acpi_bus_unregister_driver(&acpi_processor_driver); + + cpuidle_unregister_driver(&acpi_idle_driver); + +#ifdef CONFIG_ACPI_PROCFS + remove_proc_entry(ACPI_PROCESSOR_CLASS, acpi_root_dir); +#endif + + return; +} + +module_init(acpi_processor_init); +module_exit(acpi_processor_exit); + +EXPORT_SYMBOL(acpi_processor_set_thermal_limit); + +MODULE_ALIAS("processor"); diff --git a/trunk/drivers/acpi/processor_driver.c b/trunk/drivers/acpi/processor_driver.c deleted file mode 100644 index b5658cdce27f..000000000000 --- a/trunk/drivers/acpi/processor_driver.c +++ /dev/null @@ -1,978 +0,0 @@ -/* - * acpi_processor.c - ACPI Processor Driver ($Revision: 71 $) - * - * Copyright (C) 2001, 2002 Andy Grover - * Copyright (C) 2001, 2002 Paul Diefenbaugh - * Copyright (C) 2004 Dominik Brodowski - * Copyright (C) 2004 Anil S Keshavamurthy - * - Added processor hotplug support - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or (at - * your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. - * - * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * TBD: - * 1. Make # power states dynamic. - * 2. Support duty_cycle values that span bit 4. - * 3. Optimize by having scheduler determine business instead of - * having us try to calculate it here. - * 4. Need C1 timing -- must modify kernel (IRQ handler) to get this. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#define PREFIX "ACPI: " - -#define ACPI_PROCESSOR_CLASS "processor" -#define ACPI_PROCESSOR_DEVICE_NAME "Processor" -#define ACPI_PROCESSOR_FILE_INFO "info" -#define ACPI_PROCESSOR_FILE_THROTTLING "throttling" -#define ACPI_PROCESSOR_FILE_LIMIT "limit" -#define ACPI_PROCESSOR_NOTIFY_PERFORMANCE 0x80 -#define ACPI_PROCESSOR_NOTIFY_POWER 0x81 -#define ACPI_PROCESSOR_NOTIFY_THROTTLING 0x82 - -#define ACPI_PROCESSOR_LIMIT_USER 0 -#define ACPI_PROCESSOR_LIMIT_THERMAL 1 - -#define _COMPONENT ACPI_PROCESSOR_COMPONENT -ACPI_MODULE_NAME("processor_driver"); - -MODULE_AUTHOR("Paul Diefenbaugh"); -MODULE_DESCRIPTION("ACPI Processor Driver"); -MODULE_LICENSE("GPL"); - -static int acpi_processor_add(struct acpi_device *device); -static int acpi_processor_remove(struct acpi_device *device, int type); -#ifdef CONFIG_ACPI_PROCFS -static int acpi_processor_info_open_fs(struct inode *inode, struct file *file); -#endif -static void acpi_processor_notify(struct acpi_device *device, u32 event); -static acpi_status acpi_processor_hotadd_init(acpi_handle handle, int *p_cpu); -static int acpi_processor_handle_eject(struct acpi_processor *pr); - - -static const struct acpi_device_id processor_device_ids[] = { - {ACPI_PROCESSOR_OBJECT_HID, 0}, - {"ACPI0007", 0}, - {"", 0}, -}; -MODULE_DEVICE_TABLE(acpi, processor_device_ids); - -static struct acpi_driver acpi_processor_driver = { - .name = "processor", - .class = ACPI_PROCESSOR_CLASS, - .ids = processor_device_ids, - .ops = { - .add = acpi_processor_add, - .remove = acpi_processor_remove, - .suspend = acpi_processor_suspend, - .resume = acpi_processor_resume, - .notify = acpi_processor_notify, - }, -}; - -#define INSTALL_NOTIFY_HANDLER 1 -#define UNINSTALL_NOTIFY_HANDLER 2 -#ifdef CONFIG_ACPI_PROCFS -static const struct file_operations acpi_processor_info_fops = { - .owner = THIS_MODULE, - .open = acpi_processor_info_open_fs, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, -}; -#endif - -DEFINE_PER_CPU(struct acpi_processor *, processors); -EXPORT_PER_CPU_SYMBOL(processors); - -struct acpi_processor_errata errata __read_mostly; - -/* -------------------------------------------------------------------------- - Errata Handling - -------------------------------------------------------------------------- */ - -static int acpi_processor_errata_piix4(struct pci_dev *dev) -{ - u8 value1 = 0; - u8 value2 = 0; - - - if (!dev) - return -EINVAL; - - /* - * Note that 'dev' references the PIIX4 ACPI Controller. - */ - - switch (dev->revision) { - case 0: - ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found PIIX4 A-step\n")); - break; - case 1: - ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found PIIX4 B-step\n")); - break; - case 2: - ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found PIIX4E\n")); - break; - case 3: - ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found PIIX4M\n")); - break; - default: - ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found unknown PIIX4\n")); - break; - } - - switch (dev->revision) { - - case 0: /* PIIX4 A-step */ - case 1: /* PIIX4 B-step */ - /* - * See specification changes #13 ("Manual Throttle Duty Cycle") - * and #14 ("Enabling and Disabling Manual Throttle"), plus - * erratum #5 ("STPCLK# Deassertion Time") from the January - * 2002 PIIX4 specification update. Applies to only older - * PIIX4 models. - */ - errata.piix4.throttle = 1; - - case 2: /* PIIX4E */ - case 3: /* PIIX4M */ - /* - * See erratum #18 ("C3 Power State/BMIDE and Type-F DMA - * Livelock") from the January 2002 PIIX4 specification update. - * Applies to all PIIX4 models. - */ - - /* - * BM-IDE - * ------ - * Find the PIIX4 IDE Controller and get the Bus Master IDE - * Status register address. We'll use this later to read - * each IDE controller's DMA status to make sure we catch all - * DMA activity. - */ - dev = pci_get_subsys(PCI_VENDOR_ID_INTEL, - PCI_DEVICE_ID_INTEL_82371AB, - PCI_ANY_ID, PCI_ANY_ID, NULL); - if (dev) { - errata.piix4.bmisx = pci_resource_start(dev, 4); - pci_dev_put(dev); - } - - /* - * Type-F DMA - * ---------- - * Find the PIIX4 ISA Controller and read the Motherboard - * DMA controller's status to see if Type-F (Fast) DMA mode - * is enabled (bit 7) on either channel. Note that we'll - * disable C3 support if this is enabled, as some legacy - * devices won't operate well if fast DMA is disabled. - */ - dev = pci_get_subsys(PCI_VENDOR_ID_INTEL, - PCI_DEVICE_ID_INTEL_82371AB_0, - PCI_ANY_ID, PCI_ANY_ID, NULL); - if (dev) { - pci_read_config_byte(dev, 0x76, &value1); - pci_read_config_byte(dev, 0x77, &value2); - if ((value1 & 0x80) || (value2 & 0x80)) - errata.piix4.fdma = 1; - pci_dev_put(dev); - } - - break; - } - - if (errata.piix4.bmisx) - ACPI_DEBUG_PRINT((ACPI_DB_INFO, - "Bus master activity detection (BM-IDE) erratum enabled\n")); - if (errata.piix4.fdma) - ACPI_DEBUG_PRINT((ACPI_DB_INFO, - "Type-F DMA livelock erratum (C3 disabled)\n")); - - return 0; -} - -static int acpi_processor_errata(struct acpi_processor *pr) -{ - int result = 0; - struct pci_dev *dev = NULL; - - - if (!pr) - return -EINVAL; - - /* - * PIIX4 - */ - dev = pci_get_subsys(PCI_VENDOR_ID_INTEL, - PCI_DEVICE_ID_INTEL_82371AB_3, PCI_ANY_ID, - PCI_ANY_ID, NULL); - if (dev) { - result = acpi_processor_errata_piix4(dev); - pci_dev_put(dev); - } - - return result; -} - -/* -------------------------------------------------------------------------- - FS Interface (/proc) - -------------------------------------------------------------------------- */ - -#ifdef CONFIG_ACPI_PROCFS -static struct proc_dir_entry *acpi_processor_dir = NULL; - -static int acpi_processor_info_seq_show(struct seq_file *seq, void *offset) -{ - struct acpi_processor *pr = seq->private; - - - if (!pr) - goto end; - - seq_printf(seq, "processor id: %d\n" - "acpi id: %d\n" - "bus mastering control: %s\n" - "power management: %s\n" - "throttling control: %s\n" - "limit interface: %s\n", - pr->id, - pr->acpi_id, - pr->flags.bm_control ? "yes" : "no", - pr->flags.power ? "yes" : "no", - pr->flags.throttling ? "yes" : "no", - pr->flags.limit ? "yes" : "no"); - - end: - return 0; -} - -static int acpi_processor_info_open_fs(struct inode *inode, struct file *file) -{ - return single_open(file, acpi_processor_info_seq_show, - PDE(inode)->data); -} - -static int __cpuinit acpi_processor_add_fs(struct acpi_device *device) -{ - struct proc_dir_entry *entry = NULL; - - - if (!acpi_device_dir(device)) { - acpi_device_dir(device) = proc_mkdir(acpi_device_bid(device), - acpi_processor_dir); - if (!acpi_device_dir(device)) - return -ENODEV; - } - - /* 'info' [R] */ - entry = proc_create_data(ACPI_PROCESSOR_FILE_INFO, - S_IRUGO, acpi_device_dir(device), - &acpi_processor_info_fops, - acpi_driver_data(device)); - if (!entry) - return -EIO; - - /* 'throttling' [R/W] */ - entry = proc_create_data(ACPI_PROCESSOR_FILE_THROTTLING, - S_IFREG | S_IRUGO | S_IWUSR, - acpi_device_dir(device), - &acpi_processor_throttling_fops, - acpi_driver_data(device)); - if (!entry) - return -EIO; - - /* 'limit' [R/W] */ - entry = proc_create_data(ACPI_PROCESSOR_FILE_LIMIT, - S_IFREG | S_IRUGO | S_IWUSR, - acpi_device_dir(device), - &acpi_processor_limit_fops, - acpi_driver_data(device)); - if (!entry) - return -EIO; - return 0; -} -static int acpi_processor_remove_fs(struct acpi_device *device) -{ - - if (acpi_device_dir(device)) { - remove_proc_entry(ACPI_PROCESSOR_FILE_INFO, - acpi_device_dir(device)); - remove_proc_entry(ACPI_PROCESSOR_FILE_THROTTLING, - acpi_device_dir(device)); - remove_proc_entry(ACPI_PROCESSOR_FILE_LIMIT, - acpi_device_dir(device)); - remove_proc_entry(acpi_device_bid(device), acpi_processor_dir); - acpi_device_dir(device) = NULL; - } - - return 0; -} -#else -static inline int acpi_processor_add_fs(struct acpi_device *device) -{ - return 0; -} -static inline int acpi_processor_remove_fs(struct acpi_device *device) -{ - return 0; -} -#endif - -/* -------------------------------------------------------------------------- - Driver Interface - -------------------------------------------------------------------------- */ - -static int acpi_processor_get_info(struct acpi_device *device) -{ - acpi_status status = 0; - union acpi_object object = { 0 }; - struct acpi_buffer buffer = { sizeof(union acpi_object), &object }; - struct acpi_processor *pr; - int cpu_index, device_declaration = 0; - static int cpu0_initialized; - - pr = acpi_driver_data(device); - if (!pr) - return -EINVAL; - - if (num_online_cpus() > 1) - errata.smp = TRUE; - - acpi_processor_errata(pr); - - /* - * Check to see if we have bus mastering arbitration control. This - * is required for proper C3 usage (to maintain cache coherency). - */ - if (acpi_gbl_FADT.pm2_control_block && acpi_gbl_FADT.pm2_control_length) { - pr->flags.bm_control = 1; - ACPI_DEBUG_PRINT((ACPI_DB_INFO, - "Bus mastering arbitration control present\n")); - } else - ACPI_DEBUG_PRINT((ACPI_DB_INFO, - "No bus mastering arbitration control\n")); - - if (!strcmp(acpi_device_hid(device), ACPI_PROCESSOR_OBJECT_HID)) { - /* Declared with "Processor" statement; match ProcessorID */ - status = acpi_evaluate_object(pr->handle, NULL, NULL, &buffer); - if (ACPI_FAILURE(status)) { - printk(KERN_ERR PREFIX "Evaluating processor object\n"); - return -ENODEV; - } - - /* - * TBD: Synch processor ID (via LAPIC/LSAPIC structures) on SMP. - * >>> 'acpi_get_processor_id(acpi_id, &id)' in - * arch/xxx/acpi.c - */ - pr->acpi_id = object.processor.proc_id; - } else { - /* - * Declared with "Device" statement; match _UID. - * Note that we don't handle string _UIDs yet. - */ - unsigned long long value; - status = acpi_evaluate_integer(pr->handle, METHOD_NAME__UID, - NULL, &value); - if (ACPI_FAILURE(status)) { - printk(KERN_ERR PREFIX - "Evaluating processor _UID [%#x]\n", status); - return -ENODEV; - } - device_declaration = 1; - pr->acpi_id = value; - } - cpu_index = acpi_get_cpuid(pr->handle, device_declaration, pr->acpi_id); - - /* Handle UP system running SMP kernel, with no LAPIC in MADT */ - if (!cpu0_initialized && (cpu_index == -1) && - (num_online_cpus() == 1)) { - cpu_index = 0; - } - - cpu0_initialized = 1; - - pr->id = cpu_index; - - /* - * Extra Processor objects may be enumerated on MP systems with - * less than the max # of CPUs. They should be ignored _iff - * they are physically not present. - */ - if (pr->id == -1) { - if (ACPI_FAILURE - (acpi_processor_hotadd_init(pr->handle, &pr->id))) { - return -ENODEV; - } - } - /* - * On some boxes several processors use the same processor bus id. - * But they are located in different scope. For example: - * \_SB.SCK0.CPU0 - * \_SB.SCK1.CPU0 - * Rename the processor device bus id. And the new bus id will be - * generated as the following format: - * CPU+CPU ID. - */ - sprintf(acpi_device_bid(device), "CPU%X", pr->id); - ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Processor [%d:%d]\n", pr->id, - pr->acpi_id)); - - if (!object.processor.pblk_address) - ACPI_DEBUG_PRINT((ACPI_DB_INFO, "No PBLK (NULL address)\n")); - else if (object.processor.pblk_length != 6) - printk(KERN_ERR PREFIX "Invalid PBLK length [%d]\n", - object.processor.pblk_length); - else { - pr->throttling.address = object.processor.pblk_address; - pr->throttling.duty_offset = acpi_gbl_FADT.duty_offset; - pr->throttling.duty_width = acpi_gbl_FADT.duty_width; - - pr->pblk = object.processor.pblk_address; - - /* - * We don't care about error returns - we just try to mark - * these reserved so that nobody else is confused into thinking - * that this region might be unused.. - * - * (In particular, allocating the IO range for Cardbus) - */ - request_region(pr->throttling.address, 6, "ACPI CPU throttle"); - } - - /* - * If ACPI describes a slot number for this CPU, we can use it - * ensure we get the right value in the "physical id" field - * of /proc/cpuinfo - */ - status = acpi_evaluate_object(pr->handle, "_SUN", NULL, &buffer); - if (ACPI_SUCCESS(status)) - arch_fix_phys_package_id(pr->id, object.integer.value); - - return 0; -} - -static DEFINE_PER_CPU(void *, processor_device_array); - -static void acpi_processor_notify(struct acpi_device *device, u32 event) -{ - struct acpi_processor *pr = acpi_driver_data(device); - int saved; - - if (!pr) - return; - - switch (event) { - case ACPI_PROCESSOR_NOTIFY_PERFORMANCE: - saved = pr->performance_platform_limit; - acpi_processor_ppc_has_changed(pr, 1); - if (saved == pr->performance_platform_limit) - break; - acpi_bus_generate_proc_event(device, event, - pr->performance_platform_limit); - acpi_bus_generate_netlink_event(device->pnp.device_class, - dev_name(&device->dev), event, - pr->performance_platform_limit); - break; - case ACPI_PROCESSOR_NOTIFY_POWER: - acpi_processor_cst_has_changed(pr); - acpi_bus_generate_proc_event(device, event, 0); - acpi_bus_generate_netlink_event(device->pnp.device_class, - dev_name(&device->dev), event, 0); - break; - case ACPI_PROCESSOR_NOTIFY_THROTTLING: - acpi_processor_tstate_has_changed(pr); - acpi_bus_generate_proc_event(device, event, 0); - acpi_bus_generate_netlink_event(device->pnp.device_class, - dev_name(&device->dev), event, 0); - default: - ACPI_DEBUG_PRINT((ACPI_DB_INFO, - "Unsupported event [0x%x]\n", event)); - break; - } - - return; -} - -static int acpi_cpu_soft_notify(struct notifier_block *nfb, - unsigned long action, void *hcpu) -{ - unsigned int cpu = (unsigned long)hcpu; - struct acpi_processor *pr = per_cpu(processors, cpu); - - if (action == CPU_ONLINE && pr) { - acpi_processor_ppc_has_changed(pr, 0); - acpi_processor_cst_has_changed(pr); - acpi_processor_tstate_has_changed(pr); - } - return NOTIFY_OK; -} - -static struct notifier_block acpi_cpu_notifier = -{ - .notifier_call = acpi_cpu_soft_notify, -}; - -static int __cpuinit acpi_processor_add(struct acpi_device *device) -{ - struct acpi_processor *pr = NULL; - int result = 0; - struct sys_device *sysdev; - - pr = kzalloc(sizeof(struct acpi_processor), GFP_KERNEL); - if (!pr) - return -ENOMEM; - - if (!zalloc_cpumask_var(&pr->throttling.shared_cpu_map, GFP_KERNEL)) { - kfree(pr); - return -ENOMEM; - } - - pr->handle = device->handle; - strcpy(acpi_device_name(device), ACPI_PROCESSOR_DEVICE_NAME); - strcpy(acpi_device_class(device), ACPI_PROCESSOR_CLASS); - device->driver_data = pr; - - result = acpi_processor_get_info(device); - if (result) { - /* Processor is physically not present */ - return 0; - } - - BUG_ON((pr->id >= nr_cpu_ids) || (pr->id < 0)); - - /* - * Buggy BIOS check - * ACPI id of processors can be reported wrongly by the BIOS. - * Don't trust it blindly - */ - if (per_cpu(processor_device_array, pr->id) != NULL && - per_cpu(processor_device_array, pr->id) != device) { - printk(KERN_WARNING "BIOS reported wrong ACPI id " - "for the processor\n"); - result = -ENODEV; - goto err_free_cpumask; - } - per_cpu(processor_device_array, pr->id) = device; - - per_cpu(processors, pr->id) = pr; - - result = acpi_processor_add_fs(device); - if (result) - goto err_free_cpumask; - - sysdev = get_cpu_sysdev(pr->id); - if (sysfs_create_link(&device->dev.kobj, &sysdev->kobj, "sysdev")) { - result = -EFAULT; - goto err_remove_fs; - } - -#ifdef CONFIG_CPU_FREQ - acpi_processor_ppc_has_changed(pr, 0); -#endif - acpi_processor_get_throttling_info(pr); - acpi_processor_get_limit_info(pr); - - - acpi_processor_power_init(pr, device); - - pr->cdev = thermal_cooling_device_register("Processor", device, - &processor_cooling_ops); - if (IS_ERR(pr->cdev)) { - result = PTR_ERR(pr->cdev); - goto err_power_exit; - } - - dev_dbg(&device->dev, "registered as cooling_device%d\n", - pr->cdev->id); - - result = sysfs_create_link(&device->dev.kobj, - &pr->cdev->device.kobj, - "thermal_cooling"); - if (result) { - printk(KERN_ERR PREFIX "Create sysfs link\n"); - goto err_thermal_unregister; - } - result = sysfs_create_link(&pr->cdev->device.kobj, - &device->dev.kobj, - "device"); - if (result) { - printk(KERN_ERR PREFIX "Create sysfs link\n"); - goto err_remove_sysfs; - } - - return 0; - -err_remove_sysfs: - sysfs_remove_link(&device->dev.kobj, "thermal_cooling"); -err_thermal_unregister: - thermal_cooling_device_unregister(pr->cdev); -err_power_exit: - acpi_processor_power_exit(pr, device); -err_remove_fs: - acpi_processor_remove_fs(device); -err_free_cpumask: - free_cpumask_var(pr->throttling.shared_cpu_map); - - return result; -} - -static int acpi_processor_remove(struct acpi_device *device, int type) -{ - struct acpi_processor *pr = NULL; - - - if (!device || !acpi_driver_data(device)) - return -EINVAL; - - pr = acpi_driver_data(device); - - if (pr->id >= nr_cpu_ids) - goto free; - - if (type == ACPI_BUS_REMOVAL_EJECT) { - if (acpi_processor_handle_eject(pr)) - return -EINVAL; - } - - acpi_processor_power_exit(pr, device); - - sysfs_remove_link(&device->dev.kobj, "sysdev"); - - acpi_processor_remove_fs(device); - - if (pr->cdev) { - sysfs_remove_link(&device->dev.kobj, "thermal_cooling"); - sysfs_remove_link(&pr->cdev->device.kobj, "device"); - thermal_cooling_device_unregister(pr->cdev); - pr->cdev = NULL; - } - - per_cpu(processors, pr->id) = NULL; - per_cpu(processor_device_array, pr->id) = NULL; - -free: - free_cpumask_var(pr->throttling.shared_cpu_map); - kfree(pr); - - return 0; -} - -#ifdef CONFIG_ACPI_HOTPLUG_CPU -/**************************************************************************** - * Acpi processor hotplug support * - ****************************************************************************/ - -static int is_processor_present(acpi_handle handle) -{ - acpi_status status; - unsigned long long sta = 0; - - - status = acpi_evaluate_integer(handle, "_STA", NULL, &sta); - - if (ACPI_SUCCESS(status) && (sta & ACPI_STA_DEVICE_PRESENT)) - return 1; - - /* - * _STA is mandatory for a processor that supports hot plug - */ - if (status == AE_NOT_FOUND) - ACPI_DEBUG_PRINT((ACPI_DB_INFO, - "Processor does not support hot plug\n")); - else - ACPI_EXCEPTION((AE_INFO, status, - "Processor Device is not present")); - return 0; -} - -static -int acpi_processor_device_add(acpi_handle handle, struct acpi_device **device) -{ - acpi_handle phandle; - struct acpi_device *pdev; - - - if (acpi_get_parent(handle, &phandle)) { - return -ENODEV; - } - - if (acpi_bus_get_device(phandle, &pdev)) { - return -ENODEV; - } - - if (acpi_bus_add(device, pdev, handle, ACPI_BUS_TYPE_PROCESSOR)) { - return -ENODEV; - } - - return 0; -} - -static void __ref acpi_processor_hotplug_notify(acpi_handle handle, - u32 event, void *data) -{ - struct acpi_processor *pr; - struct acpi_device *device = NULL; - int result; - - - switch (event) { - case ACPI_NOTIFY_BUS_CHECK: - case ACPI_NOTIFY_DEVICE_CHECK: - ACPI_DEBUG_PRINT((ACPI_DB_INFO, - "Processor driver received %s event\n", - (event == ACPI_NOTIFY_BUS_CHECK) ? - "ACPI_NOTIFY_BUS_CHECK" : "ACPI_NOTIFY_DEVICE_CHECK")); - - if (!is_processor_present(handle)) - break; - - if (acpi_bus_get_device(handle, &device)) { - result = acpi_processor_device_add(handle, &device); - if (result) - printk(KERN_ERR PREFIX - "Unable to add the device\n"); - break; - } - break; - case ACPI_NOTIFY_EJECT_REQUEST: - ACPI_DEBUG_PRINT((ACPI_DB_INFO, - "received ACPI_NOTIFY_EJECT_REQUEST\n")); - - if (acpi_bus_get_device(handle, &device)) { - printk(KERN_ERR PREFIX - "Device don't exist, dropping EJECT\n"); - break; - } - pr = acpi_driver_data(device); - if (!pr) { - printk(KERN_ERR PREFIX - "Driver data is NULL, dropping EJECT\n"); - return; - } - break; - default: - ACPI_DEBUG_PRINT((ACPI_DB_INFO, - "Unsupported event [0x%x]\n", event)); - break; - } - - return; -} - -static acpi_status -processor_walk_namespace_cb(acpi_handle handle, - u32 lvl, void *context, void **rv) -{ - acpi_status status; - int *action = context; - acpi_object_type type = 0; - - status = acpi_get_type(handle, &type); - if (ACPI_FAILURE(status)) - return (AE_OK); - - if (type != ACPI_TYPE_PROCESSOR) - return (AE_OK); - - switch (*action) { - case INSTALL_NOTIFY_HANDLER: - acpi_install_notify_handler(handle, - ACPI_SYSTEM_NOTIFY, - acpi_processor_hotplug_notify, - NULL); - break; - case UNINSTALL_NOTIFY_HANDLER: - acpi_remove_notify_handler(handle, - ACPI_SYSTEM_NOTIFY, - acpi_processor_hotplug_notify); - break; - default: - break; - } - - return (AE_OK); -} - -static acpi_status acpi_processor_hotadd_init(acpi_handle handle, int *p_cpu) -{ - - if (!is_processor_present(handle)) { - return AE_ERROR; - } - - if (acpi_map_lsapic(handle, p_cpu)) - return AE_ERROR; - - if (arch_register_cpu(*p_cpu)) { - acpi_unmap_lsapic(*p_cpu); - return AE_ERROR; - } - - return AE_OK; -} - -static int acpi_processor_handle_eject(struct acpi_processor *pr) -{ - if (cpu_online(pr->id)) - cpu_down(pr->id); - - arch_unregister_cpu(pr->id); - acpi_unmap_lsapic(pr->id); - return (0); -} -#else -static acpi_status acpi_processor_hotadd_init(acpi_handle handle, int *p_cpu) -{ - return AE_ERROR; -} -static int acpi_processor_handle_eject(struct acpi_processor *pr) -{ - return (-EINVAL); -} -#endif - -static -void acpi_processor_install_hotplug_notify(void) -{ -#ifdef CONFIG_ACPI_HOTPLUG_CPU - int action = INSTALL_NOTIFY_HANDLER; - acpi_walk_namespace(ACPI_TYPE_PROCESSOR, - ACPI_ROOT_OBJECT, - ACPI_UINT32_MAX, - processor_walk_namespace_cb, NULL, &action, NULL); -#endif - register_hotcpu_notifier(&acpi_cpu_notifier); -} - -static -void acpi_processor_uninstall_hotplug_notify(void) -{ -#ifdef CONFIG_ACPI_HOTPLUG_CPU - int action = UNINSTALL_NOTIFY_HANDLER; - acpi_walk_namespace(ACPI_TYPE_PROCESSOR, - ACPI_ROOT_OBJECT, - ACPI_UINT32_MAX, - processor_walk_namespace_cb, NULL, &action, NULL); -#endif - unregister_hotcpu_notifier(&acpi_cpu_notifier); -} - -/* - * We keep the driver loaded even when ACPI is not running. - * This is needed for the powernow-k8 driver, that works even without - * ACPI, but needs symbols from this driver - */ - -static int __init acpi_processor_init(void) -{ - int result = 0; - - if (acpi_disabled) - return 0; - - memset(&errata, 0, sizeof(errata)); - -#ifdef CONFIG_ACPI_PROCFS - acpi_processor_dir = proc_mkdir(ACPI_PROCESSOR_CLASS, acpi_root_dir); - if (!acpi_processor_dir) - return -ENOMEM; -#endif - result = cpuidle_register_driver(&acpi_idle_driver); - if (result < 0) - goto out_proc; - - result = acpi_bus_register_driver(&acpi_processor_driver); - if (result < 0) - goto out_cpuidle; - - acpi_processor_install_hotplug_notify(); - - acpi_thermal_cpufreq_init(); - - acpi_processor_ppc_init(); - - acpi_processor_throttling_init(); - - return 0; - -out_cpuidle: - cpuidle_unregister_driver(&acpi_idle_driver); - -out_proc: -#ifdef CONFIG_ACPI_PROCFS - remove_proc_entry(ACPI_PROCESSOR_CLASS, acpi_root_dir); -#endif - - return result; -} - -static void __exit acpi_processor_exit(void) -{ - if (acpi_disabled) - return; - - acpi_processor_ppc_exit(); - - acpi_thermal_cpufreq_exit(); - - acpi_processor_uninstall_hotplug_notify(); - - acpi_bus_unregister_driver(&acpi_processor_driver); - - cpuidle_unregister_driver(&acpi_idle_driver); - -#ifdef CONFIG_ACPI_PROCFS - remove_proc_entry(ACPI_PROCESSOR_CLASS, acpi_root_dir); -#endif - - return; -} - -module_init(acpi_processor_init); -module_exit(acpi_processor_exit); - -EXPORT_SYMBOL(acpi_processor_set_thermal_limit); - -MODULE_ALIAS("processor"); diff --git a/trunk/drivers/acpi/processor_pdc.c b/trunk/drivers/acpi/processor_pdc.c new file mode 100644 index 000000000000..e306ba9aa34e --- /dev/null +++ b/trunk/drivers/acpi/processor_pdc.c @@ -0,0 +1,209 @@ +/* + * Copyright (C) 2005 Intel Corporation + * Copyright (C) 2009 Hewlett-Packard Development Company, L.P. + * + * Alex Chiang + * - Unified x86/ia64 implementations + * Venkatesh Pallipadi + * - Added _PDC for platforms with Intel CPUs + */ +#include + +#include +#include + +#include "internal.h" + +#define PREFIX "ACPI: " +#define _COMPONENT ACPI_PROCESSOR_COMPONENT +ACPI_MODULE_NAME("processor_pdc"); + +static int set_no_mwait(const struct dmi_system_id *id) +{ + printk(KERN_NOTICE PREFIX "%s detected - " + "disabling mwait for CPU C-states\n", id->ident); + idle_nomwait = 1; + return 0; +} + +static struct dmi_system_id __cpuinitdata processor_idle_dmi_table[] = { + { + set_no_mwait, "IFL91 board", { + DMI_MATCH(DMI_BIOS_VENDOR, "COMPAL"), + DMI_MATCH(DMI_SYS_VENDOR, "ZEPTO"), + DMI_MATCH(DMI_PRODUCT_VERSION, "3215W"), + DMI_MATCH(DMI_BOARD_NAME, "IFL91") }, NULL}, + { + set_no_mwait, "Extensa 5220", { + DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"), + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), + DMI_MATCH(DMI_PRODUCT_VERSION, "0100"), + DMI_MATCH(DMI_BOARD_NAME, "Columbia") }, NULL}, + {}, +}; + +static void acpi_set_pdc_bits(u32 *buf) +{ + buf[0] = ACPI_PDC_REVISION_ID; + buf[1] = 1; + + /* Enable coordination with firmware's _TSD info */ + buf[2] = ACPI_PDC_SMP_T_SWCOORD; + + /* Twiddle arch-specific bits needed for _PDC */ + arch_acpi_set_pdc_bits(buf); +} + +static struct acpi_object_list *acpi_processor_alloc_pdc(void) +{ + struct acpi_object_list *obj_list; + union acpi_object *obj; + u32 *buf; + + /* allocate and initialize pdc. It will be used later. */ + obj_list = kmalloc(sizeof(struct acpi_object_list), GFP_KERNEL); + if (!obj_list) { + printk(KERN_ERR "Memory allocation error\n"); + return NULL; + } + + obj = kmalloc(sizeof(union acpi_object), GFP_KERNEL); + if (!obj) { + printk(KERN_ERR "Memory allocation error\n"); + kfree(obj_list); + return NULL; + } + + buf = kmalloc(12, GFP_KERNEL); + if (!buf) { + printk(KERN_ERR "Memory allocation error\n"); + kfree(obj); + kfree(obj_list); + return NULL; + } + + acpi_set_pdc_bits(buf); + + obj->type = ACPI_TYPE_BUFFER; + obj->buffer.length = 12; + obj->buffer.pointer = (u8 *) buf; + obj_list->count = 1; + obj_list->pointer = obj; + + return obj_list; +} + +/* + * _PDC is required for a BIOS-OS handshake for most of the newer + * ACPI processor features. + */ +static int +acpi_processor_eval_pdc(acpi_handle handle, struct acpi_object_list *pdc_in) +{ + acpi_status status = AE_OK; + + if (idle_nomwait) { + /* + * If mwait is disabled for CPU C-states, the C2C3_FFH access + * mode will be disabled in the parameter of _PDC object. + * Of course C1_FFH access mode will also be disabled. + */ + union acpi_object *obj; + u32 *buffer = NULL; + + obj = pdc_in->pointer; + buffer = (u32 *)(obj->buffer.pointer); + buffer[2] &= ~(ACPI_PDC_C_C2C3_FFH | ACPI_PDC_C_C1_FFH); + + } + status = acpi_evaluate_object(handle, "_PDC", pdc_in, NULL); + + if (ACPI_FAILURE(status)) + ACPI_DEBUG_PRINT((ACPI_DB_INFO, + "Could not evaluate _PDC, using legacy perf. control.\n")); + + return status; +} + +static int early_pdc_done; + +void acpi_processor_set_pdc(acpi_handle handle) +{ + struct acpi_object_list *obj_list; + + if (arch_has_acpi_pdc() == false) + return; + + if (early_pdc_done) + return; + + obj_list = acpi_processor_alloc_pdc(); + if (!obj_list) + return; + + acpi_processor_eval_pdc(handle, obj_list); + + kfree(obj_list->pointer->buffer.pointer); + kfree(obj_list->pointer); + kfree(obj_list); +} +EXPORT_SYMBOL_GPL(acpi_processor_set_pdc); + +static int early_pdc_optin; +static int set_early_pdc_optin(const struct dmi_system_id *id) +{ + early_pdc_optin = 1; + return 0; +} + +static int param_early_pdc_optin(char *s) +{ + early_pdc_optin = 1; + return 1; +} +__setup("acpi_early_pdc_eval", param_early_pdc_optin); + +static struct dmi_system_id __cpuinitdata early_pdc_optin_table[] = { + { + set_early_pdc_optin, "HP Envy", { + DMI_MATCH(DMI_BIOS_VENDOR, "Hewlett-Packard"), + DMI_MATCH(DMI_PRODUCT_NAME, "HP Envy") }, NULL}, + { + set_early_pdc_optin, "HP Pavilion dv6", { + DMI_MATCH(DMI_BIOS_VENDOR, "Hewlett-Packard"), + DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv6") }, NULL}, + { + set_early_pdc_optin, "HP Pavilion dv7", { + DMI_MATCH(DMI_BIOS_VENDOR, "Hewlett-Packard"), + DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv7") }, NULL}, + {}, +}; + +static acpi_status +early_init_pdc(acpi_handle handle, u32 lvl, void *context, void **rv) +{ + acpi_processor_set_pdc(handle); + return AE_OK; +} + +void __init acpi_early_processor_set_pdc(void) +{ + /* + * Check whether the system is DMI table. If yes, OSPM + * should not use mwait for CPU-states. + */ + dmi_check_system(processor_idle_dmi_table); + + /* + * Allow systems to opt-in to early _PDC evaluation. + */ + dmi_check_system(early_pdc_optin_table); + if (!early_pdc_optin) + return; + + acpi_walk_namespace(ACPI_TYPE_PROCESSOR, ACPI_ROOT_OBJECT, + ACPI_UINT32_MAX, + early_init_pdc, NULL, NULL, NULL); + + early_pdc_done = 1; +} diff --git a/trunk/drivers/acpi/processor_throttling.c b/trunk/drivers/acpi/processor_throttling.c index 29c6f5766dcf..7ded7542fc9d 100644 --- a/trunk/drivers/acpi/processor_throttling.c +++ b/trunk/drivers/acpi/processor_throttling.c @@ -1133,6 +1133,9 @@ int acpi_processor_get_throttling_info(struct acpi_processor *pr) int result = 0; struct acpi_processor_throttling *pthrottling; + if (!pr) + return -EINVAL; + ACPI_DEBUG_PRINT((ACPI_DB_INFO, "pblk_address[0x%08x] duty_offset[%d] duty_width[%d]\n", pr->throttling.address, diff --git a/trunk/drivers/acpi/sbs.c b/trunk/drivers/acpi/sbs.c index 89ad11138e48..b16ddbf23a9c 100644 --- a/trunk/drivers/acpi/sbs.c +++ b/trunk/drivers/acpi/sbs.c @@ -217,9 +217,6 @@ static int acpi_sbs_battery_get_property(struct power_supply *psy, case POWER_SUPPLY_PROP_TECHNOLOGY: val->intval = acpi_battery_technology(battery); break; - case POWER_SUPPLY_PROP_CYCLE_COUNT: - val->intval = battery->cycle_count; - break; case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN: val->intval = battery->design_voltage * acpi_battery_vscale(battery) * 1000; @@ -279,7 +276,6 @@ static enum power_supply_property sbs_charge_battery_props[] = { POWER_SUPPLY_PROP_STATUS, POWER_SUPPLY_PROP_PRESENT, POWER_SUPPLY_PROP_TECHNOLOGY, - POWER_SUPPLY_PROP_CYCLE_COUNT, POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN, POWER_SUPPLY_PROP_VOLTAGE_NOW, POWER_SUPPLY_PROP_CURRENT_NOW, @@ -564,7 +560,6 @@ static int acpi_battery_read_info(struct seq_file *seq, void *offset) battery->design_voltage * acpi_battery_vscale(battery)); seq_printf(seq, "design capacity warning: unknown\n"); seq_printf(seq, "design capacity low: unknown\n"); - seq_printf(seq, "cycle count: %i\n", battery->cycle_count); seq_printf(seq, "capacity granularity 1: unknown\n"); seq_printf(seq, "capacity granularity 2: unknown\n"); seq_printf(seq, "model number: %s\n", battery->device_name); diff --git a/trunk/drivers/acpi/sleep.c b/trunk/drivers/acpi/sleep.c index f74834a544fd..3bde594a9979 100644 --- a/trunk/drivers/acpi/sleep.c +++ b/trunk/drivers/acpi/sleep.c @@ -552,17 +552,8 @@ static void acpi_hibernation_leave(void) hibernate_nvs_restore(); } -static int acpi_pm_pre_restore(void) +static void acpi_pm_enable_gpes(void) { - acpi_disable_all_gpes(); - acpi_os_wait_events_complete(NULL); - acpi_ec_suspend_transactions(); - return 0; -} - -static void acpi_pm_restore_cleanup(void) -{ - acpi_ec_resume_transactions(); acpi_enable_all_runtime_gpes(); } @@ -574,8 +565,8 @@ static struct platform_hibernation_ops acpi_hibernation_ops = { .prepare = acpi_pm_prepare, .enter = acpi_hibernation_enter, .leave = acpi_hibernation_leave, - .pre_restore = acpi_pm_pre_restore, - .restore_cleanup = acpi_pm_restore_cleanup, + .pre_restore = acpi_pm_disable_gpes, + .restore_cleanup = acpi_pm_enable_gpes, }; /** @@ -627,8 +618,8 @@ static struct platform_hibernation_ops acpi_hibernation_ops_old = { .prepare = acpi_pm_disable_gpes, .enter = acpi_hibernation_enter, .leave = acpi_hibernation_leave, - .pre_restore = acpi_pm_pre_restore, - .restore_cleanup = acpi_pm_restore_cleanup, + .pre_restore = acpi_pm_disable_gpes, + .restore_cleanup = acpi_pm_enable_gpes, .recover = acpi_pm_finish, }; #endif /* CONFIG_HIBERNATION */ diff --git a/trunk/drivers/acpi/thermal.c b/trunk/drivers/acpi/thermal.c index 5d3893558cf7..9073ada88835 100644 --- a/trunk/drivers/acpi/thermal.c +++ b/trunk/drivers/acpi/thermal.c @@ -368,7 +368,7 @@ static int acpi_thermal_trips_update(struct acpi_thermal *tz, int flag) int valid = 0; int i; - /* Critical Shutdown */ + /* Critical Shutdown (required) */ if (flag & ACPI_TRIPS_CRITICAL) { status = acpi_evaluate_integer(tz->device->handle, "_CRT", NULL, &tmp); @@ -379,19 +379,17 @@ static int acpi_thermal_trips_update(struct acpi_thermal *tz, int flag) * Below zero (Celsius) values clearly aren't right for sure.. * ... so lets discard those as invalid. */ - if (ACPI_FAILURE(status)) { - tz->trips.critical.flags.valid = 0; - ACPI_DEBUG_PRINT((ACPI_DB_INFO, - "No critical threshold\n")); - } else if (tmp <= 2732) { - printk(KERN_WARNING FW_BUG "Invalid critical threshold " - "(%llu)\n", tmp); + if (ACPI_FAILURE(status) || + tz->trips.critical.temperature <= 2732) { tz->trips.critical.flags.valid = 0; + ACPI_EXCEPTION((AE_INFO, status, + "No or invalid critical threshold")); + return -ENODEV; } else { tz->trips.critical.flags.valid = 1; ACPI_DEBUG_PRINT((ACPI_DB_INFO, - "Found critical threshold [%lu]\n", - tz->trips.critical.temperature)); + "Found critical threshold [%lu]\n", + tz->trips.critical.temperature)); } if (tz->trips.critical.flags.valid == 1) { if (crt == -1) { @@ -577,23 +575,7 @@ static int acpi_thermal_trips_update(struct acpi_thermal *tz, int flag) static int acpi_thermal_get_trip_points(struct acpi_thermal *tz) { - int i, valid, ret = acpi_thermal_trips_update(tz, ACPI_TRIPS_INIT); - - if (ret) - return ret; - - valid = tz->trips.critical.flags.valid | - tz->trips.hot.flags.valid | - tz->trips.passive.flags.valid; - - for (i = 0; i < ACPI_THERMAL_MAX_ACTIVE; i++) - valid |= tz->trips.active[i].flags.valid; - - if (!valid) { - printk(KERN_WARNING FW_BUG "No valid trip found\n"); - return -ENODEV; - } - return 0; + return acpi_thermal_trips_update(tz, ACPI_TRIPS_INIT); } static void acpi_thermal_check(void *data) diff --git a/trunk/drivers/acpi/utils.c b/trunk/drivers/acpi/utils.c index c9a49f4747e6..11882dbe2094 100644 --- a/trunk/drivers/acpi/utils.c +++ b/trunk/drivers/acpi/utils.c @@ -289,6 +289,51 @@ acpi_evaluate_integer(acpi_handle handle, EXPORT_SYMBOL(acpi_evaluate_integer); +#if 0 +acpi_status +acpi_evaluate_string(acpi_handle handle, + acpi_string pathname, + acpi_object_list * arguments, acpi_string * data) +{ + acpi_status status = AE_OK; + acpi_object *element = NULL; + acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; + + + if (!data) + return AE_BAD_PARAMETER; + + status = acpi_evaluate_object(handle, pathname, arguments, &buffer); + if (ACPI_FAILURE(status)) { + acpi_util_eval_error(handle, pathname, status); + return status; + } + + element = (acpi_object *) buffer.pointer; + + if ((element->type != ACPI_TYPE_STRING) + || (element->type != ACPI_TYPE_BUFFER) + || !element->string.length) { + acpi_util_eval_error(handle, pathname, AE_BAD_DATA); + return AE_BAD_DATA; + } + + *data = kzalloc(element->string.length + 1, GFP_KERNEL); + if (!data) { + printk(KERN_ERR PREFIX "Memory allocation\n"); + return -ENOMEM; + } + + memcpy(*data, element->string.pointer, element->string.length); + + ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Return value [%s]\n", *data)); + + kfree(buffer.pointer); + + return AE_OK; +} +#endif + acpi_status acpi_evaluate_reference(acpi_handle handle, acpi_string pathname, diff --git a/trunk/drivers/acpi/video.c b/trunk/drivers/acpi/video.c index cbe6f3924a10..6e9b49149fce 100644 --- a/trunk/drivers/acpi/video.c +++ b/trunk/drivers/acpi/video.c @@ -327,7 +327,7 @@ static int acpi_video_device_lcd_set_level(struct acpi_video_device *device, int level); static int acpi_video_device_lcd_get_level_current( struct acpi_video_device *device, - unsigned long long *level, int init); + unsigned long long *level); static int acpi_video_get_next_level(struct acpi_video_device *device, u32 level_current, u32 event); static int acpi_video_switch_brightness(struct acpi_video_device *device, @@ -345,7 +345,7 @@ static int acpi_video_get_brightness(struct backlight_device *bd) struct acpi_video_device *vd = (struct acpi_video_device *)bl_get_data(bd); - if (acpi_video_device_lcd_get_level_current(vd, &cur_level, 0)) + if (acpi_video_device_lcd_get_level_current(vd, &cur_level)) return -EINVAL; for (i = 2; i < vd->brightness->count; i++) { if (vd->brightness->levels[i] == cur_level) @@ -414,7 +414,7 @@ static int video_get_cur_state(struct thermal_cooling_device *cooling_dev, unsig unsigned long long level; int offset; - if (acpi_video_device_lcd_get_level_current(video, &level, 0)) + if (acpi_video_device_lcd_get_level_current(video, &level)) return -EINVAL; for (offset = 2; offset < video->brightness->count; offset++) if (level == video->brightness->levels[offset]) { @@ -609,7 +609,7 @@ static struct dmi_system_id video_dmi_table[] __initdata = { static int acpi_video_device_lcd_get_level_current(struct acpi_video_device *device, - unsigned long long *level, int init) + unsigned long long *level) { acpi_status status = AE_OK; int i; @@ -633,16 +633,10 @@ acpi_video_device_lcd_get_level_current(struct acpi_video_device *device, device->brightness->curr = *level; return 0; } - if (!init) { - /* - * BQC returned an invalid level. - * Stop using it. - */ - ACPI_WARNING((AE_INFO, - "%s returned an invalid level", - buf)); - device->cap._BQC = device->cap._BCQ = 0; - } + /* BQC returned an invalid level. Stop using it. */ + ACPI_WARNING((AE_INFO, "%s returned an invalid level", + buf)); + device->cap._BQC = device->cap._BCQ = 0; } else { /* Fixme: * should we return an error or ignore this failure? @@ -898,7 +892,7 @@ acpi_video_init_brightness(struct acpi_video_device *device) if (!device->cap._BQC) goto set_level; - result = acpi_video_device_lcd_get_level_current(device, &level_old, 1); + result = acpi_video_device_lcd_get_level_current(device, &level_old); if (result) goto out_free_levels; @@ -909,7 +903,7 @@ acpi_video_init_brightness(struct acpi_video_device *device) if (result) goto out_free_levels; - result = acpi_video_device_lcd_get_level_current(device, &level, 0); + result = acpi_video_device_lcd_get_level_current(device, &level); if (result) goto out_free_levels; @@ -998,7 +992,6 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device) } if (acpi_video_backlight_support()) { - struct backlight_properties props; int result; static int count = 0; char *name; @@ -1011,14 +1004,12 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device) return; sprintf(name, "acpi_video%d", count++); - memset(&props, 0, sizeof(struct backlight_properties)); - props.max_brightness = device->brightness->count - 3; - device->backlight = backlight_device_register(name, NULL, device, - &acpi_backlight_ops, - &props); + device->backlight = backlight_device_register(name, + NULL, device, &acpi_backlight_ops); kfree(name); if (IS_ERR(device->backlight)) return; + device->backlight->props.max_brightness = device->brightness->count-3; result = sysfs_create_link(&device->backlight->dev.kobj, &device->dev->dev.kobj, "device"); @@ -2005,7 +1996,7 @@ acpi_video_switch_brightness(struct acpi_video_device *device, int event) goto out; result = acpi_video_device_lcd_get_level_current(device, - &level_current, 0); + &level_current); if (result) goto out; diff --git a/trunk/drivers/ata/ahci.c b/trunk/drivers/ata/ahci.c index fdc9bcbe55a2..6bd930b93bcc 100644 --- a/trunk/drivers/ata/ahci.c +++ b/trunk/drivers/ata/ahci.c @@ -641,21 +641,6 @@ static const struct pci_device_id ahci_pci_tbl[] = { { PCI_VDEVICE(NVIDIA, 0x055a), board_ahci_yesncq }, /* MCP67 */ { PCI_VDEVICE(NVIDIA, 0x055b), board_ahci_yesncq }, /* MCP67 */ { PCI_VDEVICE(NVIDIA, 0x0580), board_ahci_yesncq }, /* Linux ID */ - { PCI_VDEVICE(NVIDIA, 0x0581), board_ahci_yesncq }, /* Linux ID */ - { PCI_VDEVICE(NVIDIA, 0x0582), board_ahci_yesncq }, /* Linux ID */ - { PCI_VDEVICE(NVIDIA, 0x0583), board_ahci_yesncq }, /* Linux ID */ - { PCI_VDEVICE(NVIDIA, 0x0584), board_ahci_yesncq }, /* Linux ID */ - { PCI_VDEVICE(NVIDIA, 0x0585), board_ahci_yesncq }, /* Linux ID */ - { PCI_VDEVICE(NVIDIA, 0x0586), board_ahci_yesncq }, /* Linux ID */ - { PCI_VDEVICE(NVIDIA, 0x0587), board_ahci_yesncq }, /* Linux ID */ - { PCI_VDEVICE(NVIDIA, 0x0588), board_ahci_yesncq }, /* Linux ID */ - { PCI_VDEVICE(NVIDIA, 0x0589), board_ahci_yesncq }, /* Linux ID */ - { PCI_VDEVICE(NVIDIA, 0x058a), board_ahci_yesncq }, /* Linux ID */ - { PCI_VDEVICE(NVIDIA, 0x058b), board_ahci_yesncq }, /* Linux ID */ - { PCI_VDEVICE(NVIDIA, 0x058c), board_ahci_yesncq }, /* Linux ID */ - { PCI_VDEVICE(NVIDIA, 0x058d), board_ahci_yesncq }, /* Linux ID */ - { PCI_VDEVICE(NVIDIA, 0x058e), board_ahci_yesncq }, /* Linux ID */ - { PCI_VDEVICE(NVIDIA, 0x058f), board_ahci_yesncq }, /* Linux ID */ { PCI_VDEVICE(NVIDIA, 0x07f0), board_ahci_yesncq }, /* MCP73 */ { PCI_VDEVICE(NVIDIA, 0x07f1), board_ahci_yesncq }, /* MCP73 */ { PCI_VDEVICE(NVIDIA, 0x07f2), board_ahci_yesncq }, /* MCP73 */ @@ -2278,7 +2263,7 @@ static void ahci_port_intr(struct ata_port *ap) struct ahci_port_priv *pp = ap->private_data; struct ahci_host_priv *hpriv = ap->host->private_data; int resetting = !!(ap->pflags & ATA_PFLAG_RESETTING); - u32 status, qc_active = 0; + u32 status, qc_active; int rc; status = readl(port_mmio + PORT_IRQ_STAT); @@ -2336,22 +2321,11 @@ static void ahci_port_intr(struct ata_port *ap) } } - /* pp->active_link is not reliable once FBS is enabled, both - * PORT_SCR_ACT and PORT_CMD_ISSUE should be checked because - * NCQ and non-NCQ commands may be in flight at the same time. - */ - if (pp->fbs_enabled) { - if (ap->qc_active) { - qc_active = readl(port_mmio + PORT_SCR_ACT); - qc_active |= readl(port_mmio + PORT_CMD_ISSUE); - } - } else { - /* pp->active_link is valid iff any command is in flight */ - if (ap->qc_active && pp->active_link->sactive) - qc_active = readl(port_mmio + PORT_SCR_ACT); - else - qc_active = readl(port_mmio + PORT_CMD_ISSUE); - } + /* pp->active_link is valid iff any command is in flight */ + if (ap->qc_active && pp->active_link->sactive) + qc_active = readl(port_mmio + PORT_SCR_ACT); + else + qc_active = readl(port_mmio + PORT_CMD_ISSUE); rc = ata_qc_complete_multiple(ap, qc_active); @@ -3048,14 +3022,6 @@ static bool ahci_broken_suspend(struct pci_dev *pdev) * On HP dv[4-6] and HDX18 with earlier BIOSen, link * to the harddisk doesn't become online after * resuming from STR. Warn and fail suspend. - * - * http://bugzilla.kernel.org/show_bug.cgi?id=12276 - * - * Use dates instead of versions to match as HP is - * apparently recycling both product and version - * strings. - * - * http://bugzilla.kernel.org/show_bug.cgi?id=15462 */ { .ident = "dv4", @@ -3064,7 +3030,7 @@ static bool ahci_broken_suspend(struct pci_dev *pdev) DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv4 Notebook PC"), }, - .driver_data = "20090105", /* F.30 */ + .driver_data = "F.30", /* cutoff BIOS version */ }, { .ident = "dv5", @@ -3073,7 +3039,7 @@ static bool ahci_broken_suspend(struct pci_dev *pdev) DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv5 Notebook PC"), }, - .driver_data = "20090506", /* F.16 */ + .driver_data = "F.16", /* cutoff BIOS version */ }, { .ident = "dv6", @@ -3082,7 +3048,7 @@ static bool ahci_broken_suspend(struct pci_dev *pdev) DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv6 Notebook PC"), }, - .driver_data = "20090423", /* F.21 */ + .driver_data = "F.21", /* cutoff BIOS version */ }, { .ident = "HDX18", @@ -3091,7 +3057,7 @@ static bool ahci_broken_suspend(struct pci_dev *pdev) DMI_MATCH(DMI_PRODUCT_NAME, "HP HDX18 Notebook PC"), }, - .driver_data = "20090430", /* F.23 */ + .driver_data = "F.23", /* cutoff BIOS version */ }, /* * Acer eMachines G725 has the same problem. BIOS @@ -3099,8 +3065,6 @@ static bool ahci_broken_suspend(struct pci_dev *pdev) * work. Inbetween, there are V1.06, V2.06 and V3.03 * that we don't have much idea about. For now, * blacklist anything older than V3.04. - * - * http://bugzilla.kernel.org/show_bug.cgi?id=15104 */ { .ident = "G725", @@ -3108,21 +3072,19 @@ static bool ahci_broken_suspend(struct pci_dev *pdev) DMI_MATCH(DMI_SYS_VENDOR, "eMachines"), DMI_MATCH(DMI_PRODUCT_NAME, "eMachines G725"), }, - .driver_data = "20091216", /* V3.04 */ + .driver_data = "V3.04", /* cutoff BIOS version */ }, { } /* terminate list */ }; const struct dmi_system_id *dmi = dmi_first_match(sysids); - int year, month, date; - char buf[9]; + const char *ver; if (!dmi || pdev->bus->number || pdev->devfn != PCI_DEVFN(0x1f, 2)) return false; - dmi_get_date(DMI_BIOS_DATE, &year, &month, &date); - snprintf(buf, sizeof(buf), "%04d%02d%02d", year, month, date); + ver = dmi_get_system_info(DMI_BIOS_VERSION); - return strcmp(buf, dmi->driver_data) < 0; + return !ver || strcmp(ver, dmi->driver_data) < 0; } static bool ahci_broken_online(struct pci_dev *pdev) diff --git a/trunk/drivers/atm/lanai.c b/trunk/drivers/atm/lanai.c index 23d95054705b..7fe7c324e7ef 100644 --- a/trunk/drivers/atm/lanai.c +++ b/trunk/drivers/atm/lanai.c @@ -306,10 +306,11 @@ static void vci_bitfield_iterate(struct lanai_dev *lanai, const unsigned long *lp, void (*func)(struct lanai_dev *,vci_t vci)) { - vci_t vci; - - for_each_set_bit(vci, lp, NUM_VCI) + vci_t vci = find_first_bit(lp, NUM_VCI); + while (vci < NUM_VCI) { func(lanai, vci); + vci = find_next_bit(lp, NUM_VCI, vci + 1); + } } /* -------------------- BUFFER UTILITIES: */ diff --git a/trunk/drivers/base/memory.c b/trunk/drivers/base/memory.c index db0848e54cc6..2f8691511190 100644 --- a/trunk/drivers/base/memory.c +++ b/trunk/drivers/base/memory.c @@ -429,16 +429,12 @@ static inline int memory_fail_init(void) * differentiation between which *physical* devices each * section belongs to... */ -int __weak arch_get_memory_phys_device(unsigned long start_pfn) -{ - return 0; -} static int add_memory_block(int nid, struct mem_section *section, - unsigned long state, enum mem_add_context context) + unsigned long state, int phys_device, + enum mem_add_context context) { struct memory_block *mem = kzalloc(sizeof(*mem), GFP_KERNEL); - unsigned long start_pfn; int ret = 0; if (!mem) @@ -447,8 +443,7 @@ static int add_memory_block(int nid, struct mem_section *section, mem->phys_index = __section_nr(section); mem->state = state; mutex_init(&mem->state_mutex); - start_pfn = section_nr_to_pfn(mem->phys_index); - mem->phys_device = arch_get_memory_phys_device(start_pfn); + mem->phys_device = phys_device; ret = register_memory(mem, section); if (!ret) @@ -520,7 +515,7 @@ int remove_memory_block(unsigned long node_id, struct mem_section *section, */ int register_new_memory(int nid, struct mem_section *section) { - return add_memory_block(nid, section, MEM_OFFLINE, HOTPLUG); + return add_memory_block(nid, section, MEM_OFFLINE, 0, HOTPLUG); } int unregister_memory_section(struct mem_section *section) @@ -553,7 +548,7 @@ int __init memory_dev_init(void) if (!present_section_nr(i)) continue; err = add_memory_block(0, __nr_to_section(i), MEM_ONLINE, - BOOT); + 0, BOOT); if (!ret) ret = err; } diff --git a/trunk/drivers/char/agp/Kconfig b/trunk/drivers/char/agp/Kconfig index 4b66c69eaf57..2fb3a480f6b0 100644 --- a/trunk/drivers/char/agp/Kconfig +++ b/trunk/drivers/char/agp/Kconfig @@ -57,7 +57,7 @@ config AGP_AMD config AGP_AMD64 tristate "AMD Opteron/Athlon64 on-CPU GART support" - depends on AGP && X86 && K8_NB + depends on AGP && X86 help This option gives you AGP support for the GLX component of X using the on-CPU northbridge of the AMD Athlon64/Opteron CPUs. diff --git a/trunk/drivers/char/hpet.c b/trunk/drivers/char/hpet.c index 9c5eea3ea4de..e481c5938bad 100644 --- a/trunk/drivers/char/hpet.c +++ b/trunk/drivers/char/hpet.c @@ -215,7 +215,9 @@ static void hpet_timer_set_irq(struct hpet_dev *devp) else v &= ~0xffff; - for_each_set_bit(irq, &v, HPET_MAX_IRQ) { + for (irq = find_first_bit(&v, HPET_MAX_IRQ); irq < HPET_MAX_IRQ; + irq = find_next_bit(&v, HPET_MAX_IRQ, 1 + irq)) { + if (irq >= nr_irqs) { irq = HPET_MAX_IRQ; break; diff --git a/trunk/drivers/gpu/drm/nouveau/nouveau_backlight.c b/trunk/drivers/gpu/drm/nouveau/nouveau_backlight.c index 406228f4a2a0..20564f8cb0ec 100644 --- a/trunk/drivers/gpu/drm/nouveau/nouveau_backlight.c +++ b/trunk/drivers/gpu/drm/nouveau/nouveau_backlight.c @@ -89,21 +89,19 @@ static struct backlight_ops nv50_bl_ops = { static int nouveau_nv40_backlight_init(struct drm_device *dev) { - struct backlight_properties props; struct drm_nouveau_private *dev_priv = dev->dev_private; struct backlight_device *bd; if (!(nv_rd32(dev, NV40_PMC_BACKLIGHT) & NV40_PMC_BACKLIGHT_MASK)) return 0; - memset(&props, 0, sizeof(struct backlight_properties)); - props.max_brightness = 31; bd = backlight_device_register("nv_backlight", &dev->pdev->dev, dev, - &nv40_bl_ops, &props); + &nv40_bl_ops); if (IS_ERR(bd)) return PTR_ERR(bd); dev_priv->backlight = bd; + bd->props.max_brightness = 31; bd->props.brightness = nv40_get_intensity(bd); backlight_update_status(bd); @@ -112,21 +110,19 @@ static int nouveau_nv40_backlight_init(struct drm_device *dev) static int nouveau_nv50_backlight_init(struct drm_device *dev) { - struct backlight_properties props; struct drm_nouveau_private *dev_priv = dev->dev_private; struct backlight_device *bd; if (!nv_rd32(dev, NV50_PDISPLAY_SOR_BACKLIGHT)) return 0; - memset(&props, 0, sizeof(struct backlight_properties)); - props.max_brightness = 1025; bd = backlight_device_register("nv_backlight", &dev->pdev->dev, dev, - &nv50_bl_ops, &props); + &nv50_bl_ops); if (IS_ERR(bd)) return PTR_ERR(bd); dev_priv->backlight = bd; + bd->props.max_brightness = 1025; bd->props.brightness = nv50_get_intensity(bd); backlight_update_status(bd); return 0; diff --git a/trunk/drivers/hid/hid-core.c b/trunk/drivers/hid/hid-core.c index 2e2aa759d230..368fbb0c4ca6 100644 --- a/trunk/drivers/hid/hid-core.c +++ b/trunk/drivers/hid/hid-core.c @@ -1357,7 +1357,6 @@ static const struct hid_device_id hid_blacklist[] = { { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb323) }, { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb324) }, { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb651) }, - { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb653) }, { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb654) }, { HID_USB_DEVICE(USB_VENDOR_ID_TOPSEED, USB_DEVICE_ID_TOPSEED_CYBERLINK) }, { HID_USB_DEVICE(USB_VENDOR_ID_TWINHAN, USB_DEVICE_ID_TWINHAN_IR_REMOTE) }, diff --git a/trunk/drivers/hid/hid-debug.c b/trunk/drivers/hid/hid-debug.c index 0c4e75573186..cd4ece6fdfb9 100644 --- a/trunk/drivers/hid/hid-debug.c +++ b/trunk/drivers/hid/hid-debug.c @@ -564,10 +564,10 @@ void hid_debug_event(struct hid_device *hdev, char *buf) struct hid_debug_list *list; list_for_each_entry(list, &hdev->debug_list, node) { - for (i = 0; i < strlen(buf); i++) - list->hid_debug_buf[(list->tail + i) % HID_DEBUG_BUFSIZE] = + for (i = 0; i <= strlen(buf); i++) + list->hid_debug_buf[(list->tail + i) % (HID_DEBUG_BUFSIZE - 1)] = buf[i]; - list->tail = (list->tail + i) % HID_DEBUG_BUFSIZE; + list->tail = (list->tail + i) % (HID_DEBUG_BUFSIZE - 1); } } EXPORT_SYMBOL_GPL(hid_debug_event); diff --git a/trunk/drivers/hid/hid-ids.h b/trunk/drivers/hid/hid-ids.h index 797e06470356..72c05f90553c 100644 --- a/trunk/drivers/hid/hid-ids.h +++ b/trunk/drivers/hid/hid-ids.h @@ -445,7 +445,6 @@ #define USB_VENDOR_ID_UCLOGIC 0x5543 #define USB_DEVICE_ID_UCLOGIC_TABLET_PF1209 0x0042 -#define USB_DEVICE_ID_UCLOGIC_TABLET_WP4030U 0x0003 #define USB_VENDOR_ID_VERNIER 0x08f7 #define USB_DEVICE_ID_VERNIER_LABPRO 0x0001 diff --git a/trunk/drivers/hid/hid-input.c b/trunk/drivers/hid/hid-input.c index 7a0d2e4661a1..79d9edd0bdfa 100644 --- a/trunk/drivers/hid/hid-input.c +++ b/trunk/drivers/hid/hid-input.c @@ -68,25 +68,22 @@ static const struct { #define map_key_clear(c) hid_map_usage_clear(hidinput, usage, &bit, \ &max, EV_KEY, (c)) -static inline int match_scancode(unsigned int code, unsigned int scancode) +static inline int match_scancode(int code, int scancode) { if (scancode == 0) return 1; - - return (code & (HID_USAGE_PAGE | HID_USAGE)) == scancode; + return ((code & (HID_USAGE_PAGE | HID_USAGE)) == scancode); } -static inline int match_keycode(unsigned int code, unsigned int keycode) +static inline int match_keycode(int code, int keycode) { if (keycode == 0) return 1; - - return code == keycode; + return (code == keycode); } static struct hid_usage *hidinput_find_key(struct hid_device *hid, - unsigned int scancode, - unsigned int keycode) + int scancode, int keycode) { int i, j, k; struct hid_report *report; @@ -108,8 +105,8 @@ static struct hid_usage *hidinput_find_key(struct hid_device *hid, return NULL; } -static int hidinput_getkeycode(struct input_dev *dev, - unsigned int scancode, unsigned int *keycode) +static int hidinput_getkeycode(struct input_dev *dev, int scancode, + int *keycode) { struct hid_device *hid = input_get_drvdata(dev); struct hid_usage *usage; @@ -122,13 +119,16 @@ static int hidinput_getkeycode(struct input_dev *dev, return -EINVAL; } -static int hidinput_setkeycode(struct input_dev *dev, - unsigned int scancode, unsigned int keycode) +static int hidinput_setkeycode(struct input_dev *dev, int scancode, + int keycode) { struct hid_device *hid = input_get_drvdata(dev); struct hid_usage *usage; int old_keycode; + if (keycode < 0 || keycode > KEY_MAX) + return -EINVAL; + usage = hidinput_find_key(hid, scancode, 0); if (usage) { old_keycode = usage->code; diff --git a/trunk/drivers/hid/hid-magicmouse.c b/trunk/drivers/hid/hid-magicmouse.c index c174b64c3810..4a3a94f2b10c 100644 --- a/trunk/drivers/hid/hid-magicmouse.c +++ b/trunk/drivers/hid/hid-magicmouse.c @@ -353,7 +353,7 @@ static int magicmouse_probe(struct hid_device *hdev, goto err_free; } - ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT & ~HID_CONNECT_HIDINPUT); + ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT); if (ret) { dev_err(&hdev->dev, "magicmouse hw start failed\n"); goto err_free; @@ -409,11 +409,8 @@ static int magicmouse_probe(struct hid_device *hdev, static void magicmouse_remove(struct hid_device *hdev) { - struct magicmouse_sc *msc = hid_get_drvdata(hdev); - hid_hw_stop(hdev); - input_unregister_device(msc->input); - kfree(msc); + kfree(hid_get_drvdata(hdev)); } static const struct hid_device_id magic_mice[] = { diff --git a/trunk/drivers/hid/hid-ntrig.c b/trunk/drivers/hid/hid-ntrig.c index edcc0c4247bb..3234c729a895 100644 --- a/trunk/drivers/hid/hid-ntrig.c +++ b/trunk/drivers/hid/hid-ntrig.c @@ -140,9 +140,6 @@ static int ntrig_event (struct hid_device *hid, struct hid_field *field, nd->reading_mt = 1; nd->first_contact_confidence = 0; break; - case HID_DG_TIPSWITCH: - /* Prevent emission of touch until validated */ - return 1; case HID_DG_CONFIDENCE: nd->confidence = value; break; @@ -262,7 +259,6 @@ static int ntrig_event (struct hid_device *hid, struct hid_field *field, BTN_TOOL_TRIPLETAP, 0); input_report_key(input, BTN_TOOL_QUADTAP, 0); - input_report_key(input, BTN_TOUCH, 0); } break; @@ -312,20 +308,13 @@ static int ntrig_probe(struct hid_device *hdev, const struct hid_device_id *id) list_for_each_entry(hidinput, &hdev->inputs, list) { - if (hidinput->report->maxfield < 1) - continue; - input = hidinput->input; switch (hidinput->report->field[0]->application) { case HID_DG_PEN: input->name = "N-Trig Pen"; break; case HID_DG_TOUCHSCREEN: - /* These keys are redundant for fingers, clear them - * to prevent incorrect identification */ __clear_bit(BTN_TOOL_PEN, input->keybit); - __clear_bit(BTN_TOOL_FINGER, input->keybit); - __clear_bit(BTN_0, input->keybit); /* * A little something special to enable * two and three finger taps. diff --git a/trunk/drivers/hid/hid-tmff.c b/trunk/drivers/hid/hid-tmff.c index c32f32c84ac8..167ea746fb9c 100644 --- a/trunk/drivers/hid/hid-tmff.c +++ b/trunk/drivers/hid/hid-tmff.c @@ -251,8 +251,6 @@ static const struct hid_device_id tm_devices[] = { .driver_data = (unsigned long)ff_rumble }, { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb651), /* FGT Rumble Force Wheel */ .driver_data = (unsigned long)ff_rumble }, - { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb653), /* RGT Force Feedback CLUTCH Raging Wheel */ - .driver_data = (unsigned long)ff_joystick }, { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb654), /* FGT Force Feedback Wheel */ .driver_data = (unsigned long)ff_joystick }, { } diff --git a/trunk/drivers/hid/usbhid/hid-quirks.c b/trunk/drivers/hid/usbhid/hid-quirks.c index 928943c7ce9a..7844280897d1 100644 --- a/trunk/drivers/hid/usbhid/hid-quirks.c +++ b/trunk/drivers/hid/usbhid/hid-quirks.c @@ -63,7 +63,6 @@ static const struct hid_blacklist { { USB_VENDOR_ID_SUN, USB_DEVICE_ID_RARITAN_KVM_DONGLE, HID_QUIRK_NOGET }, { USB_VENDOR_ID_TURBOX, USB_DEVICE_ID_TURBOX_KEYBOARD, HID_QUIRK_NOGET }, { USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_PF1209, HID_QUIRK_MULTI_INPUT }, - { USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_WP4030U, HID_QUIRK_MULTI_INPUT }, { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_DUAL_USB_JOYPAD, HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT | HID_QUIRK_SKIP_OUTPUT_REPORTS }, { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_QUAD_USB_JOYPAD, HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT }, diff --git a/trunk/drivers/i2c/Kconfig b/trunk/drivers/i2c/Kconfig index d06083fdffbb..02ce9cff5fcf 100644 --- a/trunk/drivers/i2c/Kconfig +++ b/trunk/drivers/i2c/Kconfig @@ -73,6 +73,7 @@ config I2C_SMBUS source drivers/i2c/algos/Kconfig source drivers/i2c/busses/Kconfig +source drivers/i2c/chips/Kconfig config I2C_DEBUG_CORE bool "I2C Core debugging messages" @@ -97,4 +98,12 @@ config I2C_DEBUG_BUS a problem with I2C support and want to see more of what is going on. +config I2C_DEBUG_CHIP + bool "I2C Chip debugging messages" + help + Say Y here if you want the I2C chip drivers to produce a bunch of + debug messages to the system log. Select this if you are having + a problem with I2C support and want to see more of what is going + on. + endif # I2C diff --git a/trunk/drivers/i2c/Makefile b/trunk/drivers/i2c/Makefile index a7d9b4be9bb3..acd0250c16a0 100644 --- a/trunk/drivers/i2c/Makefile +++ b/trunk/drivers/i2c/Makefile @@ -6,7 +6,7 @@ obj-$(CONFIG_I2C_BOARDINFO) += i2c-boardinfo.o obj-$(CONFIG_I2C) += i2c-core.o obj-$(CONFIG_I2C_SMBUS) += i2c-smbus.o obj-$(CONFIG_I2C_CHARDEV) += i2c-dev.o -obj-y += algos/ busses/ +obj-y += busses/ chips/ algos/ ifeq ($(CONFIG_I2C_DEBUG_CORE),y) EXTRA_CFLAGS += -DDEBUG diff --git a/trunk/drivers/i2c/algos/i2c-algo-bit.c b/trunk/drivers/i2c/algos/i2c-algo-bit.c index e8d568c3fb09..e25e13980af3 100644 --- a/trunk/drivers/i2c/algos/i2c-algo-bit.c +++ b/trunk/drivers/i2c/algos/i2c-algo-bit.c @@ -522,12 +522,6 @@ static int bit_xfer(struct i2c_adapter *i2c_adap, int i, ret; unsigned short nak_ok; - if (adap->pre_xfer) { - ret = adap->pre_xfer(i2c_adap); - if (ret < 0) - return ret; - } - bit_dbg(3, &i2c_adap->dev, "emitting start condition\n"); i2c_start(adap); for (i = 0; i < num; i++) { @@ -576,9 +570,6 @@ static int bit_xfer(struct i2c_adapter *i2c_adap, bailout: bit_dbg(3, &i2c_adap->dev, "emitting stop condition\n"); i2c_stop(adap); - - if (adap->post_xfer) - adap->post_xfer(i2c_adap); return ret; } diff --git a/trunk/drivers/i2c/busses/i2c-i801.c b/trunk/drivers/i2c/busses/i2c-i801.c index 299b918455a3..9da5b05cdb52 100644 --- a/trunk/drivers/i2c/busses/i2c-i801.c +++ b/trunk/drivers/i2c/busses/i2c-i801.c @@ -416,11 +416,9 @@ static int i801_block_transaction(union i2c_smbus_data *data, char read_write, data->block[0] = 32; /* max for SMBus block reads */ } - /* Experience has shown that the block buffer can only be used for - SMBus (not I2C) block transactions, even though the datasheet - doesn't mention this limitation. */ if ((i801_features & FEATURE_BLOCK_BUFFER) - && command != I2C_SMBUS_I2C_BLOCK_DATA + && !(command == I2C_SMBUS_I2C_BLOCK_DATA + && read_write == I2C_SMBUS_READ) && i801_set_block_buffer_mode() == 0) result = i801_block_transaction_by_block(data, read_write, hwpec); diff --git a/trunk/drivers/i2c/busses/i2c-powermac.c b/trunk/drivers/i2c/busses/i2c-powermac.c index b289ec99eeba..1c440a70ec61 100644 --- a/trunk/drivers/i2c/busses/i2c-powermac.c +++ b/trunk/drivers/i2c/busses/i2c-powermac.c @@ -122,14 +122,9 @@ static s32 i2c_powermac_smbus_xfer( struct i2c_adapter* adap, rc = pmac_i2c_xfer(bus, addrdir, subsize, subaddr, buf, len); if (rc) { - if (rc == -ENXIO) - dev_dbg(&adap->dev, - "I2C transfer at 0x%02x failed, size %d, " - "err %d\n", addrdir >> 1, size, rc); - else - dev_err(&adap->dev, - "I2C transfer at 0x%02x failed, size %d, " - "err %d\n", addrdir >> 1, size, rc); + dev_err(&adap->dev, + "I2C transfer at 0x%02x failed, size %d, err %d\n", + addrdir >> 1, size, rc); goto bail; } @@ -180,16 +175,10 @@ static int i2c_powermac_master_xfer( struct i2c_adapter *adap, goto bail; } rc = pmac_i2c_xfer(bus, addrdir, 0, 0, msgs->buf, msgs->len); - if (rc < 0) { - if (rc == -ENXIO) - dev_dbg(&adap->dev, "I2C %s 0x%02x failed, err %d\n", - addrdir & 1 ? "read from" : "write to", - addrdir >> 1, rc); - else - dev_err(&adap->dev, "I2C %s 0x%02x failed, err %d\n", - addrdir & 1 ? "read from" : "write to", - addrdir >> 1, rc); - } + if (rc < 0) + dev_err(&adap->dev, "I2C %s 0x%02x failed, err %d\n", + addrdir & 1 ? "read from" : "write to", addrdir >> 1, + rc); bail: pmac_i2c_close(bus); return rc < 0 ? rc : 1; diff --git a/trunk/drivers/i2c/busses/i2c-xiic.c b/trunk/drivers/i2c/busses/i2c-xiic.c index f0ef8da6c554..eece39a5a30e 100644 --- a/trunk/drivers/i2c/busses/i2c-xiic.c +++ b/trunk/drivers/i2c/busses/i2c-xiic.c @@ -32,7 +32,6 @@ #include #include #include -#include #include #include #include diff --git a/trunk/drivers/i2c/chips/Kconfig b/trunk/drivers/i2c/chips/Kconfig new file mode 100644 index 000000000000..ae4539d99bef --- /dev/null +++ b/trunk/drivers/i2c/chips/Kconfig @@ -0,0 +1,19 @@ +# +# Miscellaneous I2C chip drivers configuration +# +# *** DEPRECATED! Do not add new entries! See Makefile *** +# + +menu "Miscellaneous I2C Chip support" + +config SENSORS_TSL2550 + tristate "Taos TSL2550 ambient light sensor" + depends on EXPERIMENTAL + help + If you say yes here you get support for the Taos TSL2550 + ambient light sensor. + + This driver can also be built as a module. If so, the module + will be called tsl2550. + +endmenu diff --git a/trunk/drivers/i2c/chips/Makefile b/trunk/drivers/i2c/chips/Makefile new file mode 100644 index 000000000000..fe0af0f81f2d --- /dev/null +++ b/trunk/drivers/i2c/chips/Makefile @@ -0,0 +1,18 @@ +# +# Makefile for miscellaneous I2C chip drivers. +# +# Do not add new drivers to this directory! It is DEPRECATED. +# +# Device drivers are better grouped according to the functionality they +# implement rather than to the bus they are connected to. In particular: +# * Hardware monitoring chip drivers go to drivers/hwmon +# * RTC chip drivers go to drivers/rtc +# * I/O expander drivers go to drivers/gpio +# + +obj-$(CONFIG_SENSORS_TSL2550) += tsl2550.o + +ifeq ($(CONFIG_I2C_DEBUG_CHIP),y) +EXTRA_CFLAGS += -DDEBUG +endif + diff --git a/trunk/drivers/misc/tsl2550.c b/trunk/drivers/i2c/chips/tsl2550.c similarity index 99% rename from trunk/drivers/misc/tsl2550.c rename to trunk/drivers/i2c/chips/tsl2550.c index 483ae5f7f68e..a0702f36a72f 100644 --- a/trunk/drivers/misc/tsl2550.c +++ b/trunk/drivers/i2c/chips/tsl2550.c @@ -47,8 +47,8 @@ struct tsl2550_data { struct i2c_client *client; struct mutex update_lock; - unsigned int power_state:1; - unsigned int operating_mode:1; + unsigned int power_state : 1; + unsigned int operating_mode : 1; }; /* diff --git a/trunk/drivers/i2c/i2c-smbus.c b/trunk/drivers/i2c/i2c-smbus.c index 7a8201ed2181..421278221243 100644 --- a/trunk/drivers/i2c/i2c-smbus.c +++ b/trunk/drivers/i2c/i2c-smbus.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -54,7 +55,7 @@ static int smbus_do_alert(struct device *dev, void *addrp) * Drivers should either disable alerts, or provide at least * a minimal handler. Lock so client->driver won't change. */ - device_lock(dev); + down(&dev->sem); if (client->driver) { if (client->driver->alert) client->driver->alert(client, data->flag); @@ -62,7 +63,7 @@ static int smbus_do_alert(struct device *dev, void *addrp) dev_warn(&client->dev, "no driver alert()!\n"); } else dev_dbg(&client->dev, "alert with no driver\n"); - device_unlock(dev); + up(&dev->sem); /* Stop iterating after we find the device */ return -EBUSY; diff --git a/trunk/drivers/infiniband/core/mad.c b/trunk/drivers/infiniband/core/mad.c index e351b1548535..58463da814d1 100644 --- a/trunk/drivers/infiniband/core/mad.c +++ b/trunk/drivers/infiniband/core/mad.c @@ -2953,9 +2953,6 @@ static void ib_mad_remove_device(struct ib_device *device) { int i, num_ports, cur_port; - if (rdma_node_get_transport(device->node_type) != RDMA_TRANSPORT_IB) - return; - if (device->node_type == RDMA_NODE_IB_SWITCH) { num_ports = 1; cur_port = 0; diff --git a/trunk/drivers/infiniband/hw/cxgb3/iwch.c b/trunk/drivers/infiniband/hw/cxgb3/iwch.c index 63f975f3e30f..ee1d8b4d4541 100644 --- a/trunk/drivers/infiniband/hw/cxgb3/iwch.c +++ b/trunk/drivers/infiniband/hw/cxgb3/iwch.c @@ -189,7 +189,6 @@ static void close_rnic_dev(struct t3cdev *tdev) list_for_each_entry_safe(dev, tmp, &dev_list, entry) { if (dev->rdev.t3cdev_p == tdev) { dev->rdev.flags = CXIO_ERROR_FATAL; - synchronize_net(); cancel_delayed_work_sync(&dev->db_drop_task); list_del(&dev->entry); iwch_unregister_device(dev); @@ -218,7 +217,6 @@ static void iwch_event_handler(struct t3cdev *tdev, u32 evt, u32 port_id) switch (evt) { case OFFLOAD_STATUS_DOWN: { rdev->flags = CXIO_ERROR_FATAL; - synchronize_net(); event.event = IB_EVENT_DEVICE_FATAL; dispatch = 1; break; diff --git a/trunk/drivers/infiniband/hw/nes/nes_hw.c b/trunk/drivers/infiniband/hw/nes/nes_hw.c index 925075557dc2..ce7f53833577 100644 --- a/trunk/drivers/infiniband/hw/nes/nes_hw.c +++ b/trunk/drivers/infiniband/hw/nes/nes_hw.c @@ -1899,14 +1899,9 @@ void nes_destroy_nic_qp(struct nes_vnic *nesvnic) u16 wqe_fragment_index; u64 wqe_frag; u32 cqp_head; - u32 wqm_cfg0; unsigned long flags; int ret; - /* clear wqe stall before destroying NIC QP */ - wqm_cfg0 = nes_read_indexed(nesdev, NES_IDX_WQM_CONFIG0); - nes_write_indexed(nesdev, NES_IDX_WQM_CONFIG0, wqm_cfg0 & 0xFFFF7FFF); - /* Free remaining NIC receive buffers */ while (nesvnic->nic.rq_head != nesvnic->nic.rq_tail) { nic_rqe = &nesvnic->nic.rq_vbase[nesvnic->nic.rq_tail]; @@ -2025,9 +2020,6 @@ void nes_destroy_nic_qp(struct nes_vnic *nesvnic) pci_free_consistent(nesdev->pcidev, nesvnic->nic_mem_size, nesvnic->nic_vbase, nesvnic->nic_pbase); - - /* restore old wqm_cfg0 value */ - nes_write_indexed(nesdev, NES_IDX_WQM_CONFIG0, wqm_cfg0); } /** diff --git a/trunk/drivers/infiniband/hw/nes/nes_hw.h b/trunk/drivers/infiniband/hw/nes/nes_hw.h index bbbfe9fc5a5a..9b1e7f869d83 100644 --- a/trunk/drivers/infiniband/hw/nes/nes_hw.h +++ b/trunk/drivers/infiniband/hw/nes/nes_hw.h @@ -160,7 +160,6 @@ enum indexed_regs { NES_IDX_ENDNODE0_NSTAT_TX_OCTETS_HI = 0x7004, NES_IDX_ENDNODE0_NSTAT_TX_FRAMES_LO = 0x7008, NES_IDX_ENDNODE0_NSTAT_TX_FRAMES_HI = 0x700c, - NES_IDX_WQM_CONFIG0 = 0x5000, NES_IDX_WQM_CONFIG1 = 0x5004, NES_IDX_CM_CONFIG = 0x5100, NES_IDX_NIC_LOGPORT_TO_PHYPORT = 0x6000, diff --git a/trunk/drivers/infiniband/hw/nes/nes_nic.c b/trunk/drivers/infiniband/hw/nes/nes_nic.c index 91fdde382e82..a1d79b6856ac 100644 --- a/trunk/drivers/infiniband/hw/nes/nes_nic.c +++ b/trunk/drivers/infiniband/hw/nes/nes_nic.c @@ -1595,6 +1595,7 @@ struct net_device *nes_netdev_init(struct nes_device *nesdev, struct nes_vnic *nesvnic; struct net_device *netdev; struct nic_qp_map *curr_qp_map; + u32 u32temp; u8 phy_type = nesdev->nesadapter->phy_type[nesdev->mac_index]; netdev = alloc_etherdev(sizeof(struct nes_vnic)); @@ -1706,10 +1707,6 @@ struct net_device *nes_netdev_init(struct nes_device *nesdev, ((phy_type == NES_PHY_TYPE_PUMA_1G) && (((PCI_FUNC(nesdev->pcidev->devfn) == 1) && (nesdev->mac_index == 2)) || ((PCI_FUNC(nesdev->pcidev->devfn) == 2) && (nesdev->mac_index == 1)))))) { - u32 u32temp; - u32 link_mask; - u32 link_val; - u32temp = nes_read_indexed(nesdev, NES_IDX_PHY_PCS_CONTROL_STATUS0 + (0x200 * (nesdev->mac_index & 1))); if (phy_type != NES_PHY_TYPE_PUMA_1G) { @@ -1718,36 +1715,13 @@ struct net_device *nes_netdev_init(struct nes_device *nesdev, (0x200 * (nesdev->mac_index & 1)), u32temp); } - /* Check and set linkup here. This is for back to back */ - /* configuration where second port won't get link interrupt */ - switch (phy_type) { - case NES_PHY_TYPE_PUMA_1G: - if (nesdev->mac_index < 2) { - link_mask = 0x01010000; - link_val = 0x01010000; - } else { - link_mask = 0x02020000; - link_val = 0x02020000; - } - break; - default: - link_mask = 0x0f1f0000; - link_val = 0x0f0f0000; - break; - } - - u32temp = nes_read_indexed(nesdev, - NES_IDX_PHY_PCS_CONTROL_STATUS0 + - (0x200 * (nesdev->mac_index & 1))); - if ((u32temp & link_mask) == link_val) - nesvnic->linkup = 1; - /* clear the MAC interrupt status, assumes direct logical to physical mapping */ u32temp = nes_read_indexed(nesdev, NES_IDX_MAC_INT_STATUS + (0x200 * nesdev->mac_index)); nes_debug(NES_DBG_INIT, "Phy interrupt status = 0x%X.\n", u32temp); nes_write_indexed(nesdev, NES_IDX_MAC_INT_STATUS + (0x200 * nesdev->mac_index), u32temp); nes_init_phy(nesdev); + } return netdev; diff --git a/trunk/drivers/infiniband/hw/nes/nes_verbs.c b/trunk/drivers/infiniband/hw/nes/nes_verbs.c index 69928296d74b..815725f886c4 100644 --- a/trunk/drivers/infiniband/hw/nes/nes_verbs.c +++ b/trunk/drivers/infiniband/hw/nes/nes_verbs.c @@ -1323,7 +1323,6 @@ static struct ib_qp *nes_create_qp(struct ib_pd *ibpd, nesqp->nesqp_context->aeq_token_low = cpu_to_le32((u32)((unsigned long)(nesqp))); nesqp->nesqp_context->aeq_token_high = cpu_to_le32((u32)(upper_32_bits((unsigned long)(nesqp)))); nesqp->nesqp_context->ird_ord_sizes = cpu_to_le32(NES_QPCONTEXT_ORDIRD_ALSMM | - NES_QPCONTEXT_ORDIRD_AAH | ((((u32)nesadapter->max_irrq_wr) << NES_QPCONTEXT_ORDIRD_IRDSIZE_SHIFT) & NES_QPCONTEXT_ORDIRD_IRDSIZE_MASK)); if (disable_mpa_crc) { diff --git a/trunk/drivers/infiniband/ulp/ipoib/ipoib_cm.c b/trunk/drivers/infiniband/ulp/ipoib/ipoib_cm.c index bc658373ad55..83a7751c38d6 100644 --- a/trunk/drivers/infiniband/ulp/ipoib/ipoib_cm.c +++ b/trunk/drivers/infiniband/ulp/ipoib/ipoib_cm.c @@ -708,7 +708,6 @@ void ipoib_cm_send(struct net_device *dev, struct sk_buff *skb, struct ipoib_cm_ struct ipoib_dev_priv *priv = netdev_priv(dev); struct ipoib_cm_tx_buf *tx_req; u64 addr; - int rc; if (unlikely(skb->len > tx->mtu)) { ipoib_warn(priv, "packet len %d (> %d) too long to send, dropping\n", @@ -740,10 +739,9 @@ void ipoib_cm_send(struct net_device *dev, struct sk_buff *skb, struct ipoib_cm_ tx_req->mapping = addr; - rc = post_send(priv, tx, tx->tx_head & (ipoib_sendq_size - 1), - addr, skb->len); - if (unlikely(rc)) { - ipoib_warn(priv, "post_send failed, error %d\n", rc); + if (unlikely(post_send(priv, tx, tx->tx_head & (ipoib_sendq_size - 1), + addr, skb->len))) { + ipoib_warn(priv, "post_send failed\n"); ++dev->stats.tx_errors; ib_dma_unmap_single(priv->ca, addr, skb->len, DMA_TO_DEVICE); dev_kfree_skb_any(skb); @@ -754,8 +752,6 @@ void ipoib_cm_send(struct net_device *dev, struct sk_buff *skb, struct ipoib_cm_ if (++priv->tx_outstanding == ipoib_sendq_size) { ipoib_dbg(priv, "TX ring 0x%x full, stopping kernel net queue\n", tx->qp->qp_num); - if (ib_req_notify_cq(priv->send_cq, IB_CQ_NEXT_COMP)) - ipoib_warn(priv, "request notify on send CQ failed\n"); netif_stop_queue(dev); } } diff --git a/trunk/drivers/infiniband/ulp/ipoib/ipoib_ib.c b/trunk/drivers/infiniband/ulp/ipoib/ipoib_ib.c index 5df40b128f81..8c91d9f37ada 100644 --- a/trunk/drivers/infiniband/ulp/ipoib/ipoib_ib.c +++ b/trunk/drivers/infiniband/ulp/ipoib/ipoib_ib.c @@ -529,7 +529,7 @@ void ipoib_send(struct net_device *dev, struct sk_buff *skb, { struct ipoib_dev_priv *priv = netdev_priv(dev); struct ipoib_tx_buf *tx_req; - int hlen, rc; + int hlen; void *phead; if (skb_is_gso(skb)) { @@ -585,10 +585,9 @@ void ipoib_send(struct net_device *dev, struct sk_buff *skb, netif_stop_queue(dev); } - rc = post_send(priv, priv->tx_head & (ipoib_sendq_size - 1), - address->ah, qpn, tx_req, phead, hlen); - if (unlikely(rc)) { - ipoib_warn(priv, "post_send failed, error %d\n", rc); + if (unlikely(post_send(priv, priv->tx_head & (ipoib_sendq_size - 1), + address->ah, qpn, tx_req, phead, hlen))) { + ipoib_warn(priv, "post_send failed\n"); ++dev->stats.tx_errors; --priv->tx_outstanding; ipoib_dma_unmap_tx(priv->ca, tx_req); diff --git a/trunk/drivers/infiniband/ulp/iser/iscsi_iser.c b/trunk/drivers/infiniband/ulp/iser/iscsi_iser.c index e78af36d3a0e..71237f8f78f7 100644 --- a/trunk/drivers/infiniband/ulp/iser/iscsi_iser.c +++ b/trunk/drivers/infiniband/ulp/iser/iscsi_iser.c @@ -613,7 +613,7 @@ static struct scsi_host_template iscsi_iser_sht = { .cmd_per_lun = ISER_DEF_CMD_PER_LUN, .eh_abort_handler = iscsi_eh_abort, .eh_device_reset_handler= iscsi_eh_device_reset, - .eh_target_reset_handler = iscsi_eh_recover_target, + .eh_target_reset_handler= iscsi_eh_target_reset, .target_alloc = iscsi_target_alloc, .use_clustering = DISABLE_CLUSTERING, .proc_name = "iscsi_iser", diff --git a/trunk/drivers/input/evdev.c b/trunk/drivers/input/evdev.c index 2ee6c7a68bdc..9f9816baeb97 100644 --- a/trunk/drivers/input/evdev.c +++ b/trunk/drivers/input/evdev.c @@ -515,7 +515,7 @@ static long evdev_do_ioctl(struct file *file, unsigned int cmd, struct input_absinfo abs; struct ff_effect effect; int __user *ip = (int __user *)p; - unsigned int i, t, u, v; + int i, t, u, v; int error; switch (cmd) { diff --git a/trunk/drivers/input/input.c b/trunk/drivers/input/input.c index e2aad0a51826..41168d5f8c17 100644 --- a/trunk/drivers/input/input.c +++ b/trunk/drivers/input/input.c @@ -582,8 +582,7 @@ static int input_fetch_keycode(struct input_dev *dev, int scancode) } static int input_default_getkeycode(struct input_dev *dev, - unsigned int scancode, - unsigned int *keycode) + int scancode, int *keycode) { if (!dev->keycodesize) return -EINVAL; @@ -597,8 +596,7 @@ static int input_default_getkeycode(struct input_dev *dev, } static int input_default_setkeycode(struct input_dev *dev, - unsigned int scancode, - unsigned int keycode) + int scancode, int keycode) { int old_keycode; int i; @@ -656,9 +654,11 @@ static int input_default_setkeycode(struct input_dev *dev, * This function should be called by anyone interested in retrieving current * keymap. Presently keyboard and evdev handlers use it. */ -int input_get_keycode(struct input_dev *dev, - unsigned int scancode, unsigned int *keycode) +int input_get_keycode(struct input_dev *dev, int scancode, int *keycode) { + if (scancode < 0) + return -EINVAL; + return dev->getkeycode(dev, scancode, keycode); } EXPORT_SYMBOL(input_get_keycode); @@ -672,14 +672,16 @@ EXPORT_SYMBOL(input_get_keycode); * This function should be called by anyone needing to update current * keymap. Presently keyboard and evdev handlers use it. */ -int input_set_keycode(struct input_dev *dev, - unsigned int scancode, unsigned int keycode) +int input_set_keycode(struct input_dev *dev, int scancode, int keycode) { unsigned long flags; int old_keycode; int retval; - if (keycode > KEY_MAX) + if (scancode < 0) + return -EINVAL; + + if (keycode < 0 || keycode > KEY_MAX) return -EINVAL; spin_lock_irqsave(&dev->event_lock, flags); @@ -1879,37 +1881,35 @@ static int input_open_file(struct inode *inode, struct file *file) const struct file_operations *old_fops, *new_fops = NULL; int err; - err = mutex_lock_interruptible(&input_mutex); - if (err) - return err; - + lock_kernel(); /* No load-on-demand here? */ handler = input_table[iminor(inode) >> 5]; - if (handler) - new_fops = fops_get(handler->fops); - - mutex_unlock(&input_mutex); + if (!handler || !(new_fops = fops_get(handler->fops))) { + err = -ENODEV; + goto out; + } /* * That's _really_ odd. Usually NULL ->open means "nothing special", * not "no device". Oh, well... */ - if (!new_fops || !new_fops->open) { + if (!new_fops->open) { fops_put(new_fops); err = -ENODEV; goto out; } - old_fops = file->f_op; file->f_op = new_fops; err = new_fops->open(inode, file); + if (err) { fops_put(file->f_op); file->f_op = fops_get(old_fops); } fops_put(old_fops); out: + unlock_kernel(); return err; } diff --git a/trunk/drivers/input/joystick/gamecon.c b/trunk/drivers/input/joystick/gamecon.c index 7a55714a1486..ae998d99a5ae 100644 --- a/trunk/drivers/input/joystick/gamecon.c +++ b/trunk/drivers/input/joystick/gamecon.c @@ -819,7 +819,7 @@ static int __init gc_setup_pad(struct gc *gc, int idx, int pad_type) int i; int err; - if (pad_type < 1 || pad_type >= GC_MAX) { + if (pad_type < 1 || pad_type > GC_MAX) { pr_err("Pad type %d unknown\n", pad_type); return -EINVAL; } diff --git a/trunk/drivers/input/keyboard/bf54x-keys.c b/trunk/drivers/input/keyboard/bf54x-keys.c index 593c052416b9..fe376a27fe57 100644 --- a/trunk/drivers/input/keyboard/bf54x-keys.c +++ b/trunk/drivers/input/keyboard/bf54x-keys.c @@ -162,7 +162,7 @@ static irqreturn_t bfin_kpad_isr(int irq, void *dev_id) input_sync(input); if (bfin_kpad_get_keypressed(bf54x_kpad)) { - disable_irq_nosync(bf54x_kpad->irq); + disable_irq(bf54x_kpad->irq); bf54x_kpad->lastkey = key; mod_timer(&bf54x_kpad->timer, jiffies + bf54x_kpad->keyup_test_jiffies); diff --git a/trunk/drivers/input/misc/Kconfig b/trunk/drivers/input/misc/Kconfig index 23140a3bb8e0..7097bfe581d7 100644 --- a/trunk/drivers/input/misc/Kconfig +++ b/trunk/drivers/input/misc/Kconfig @@ -214,17 +214,6 @@ config INPUT_TWL4030_PWRBUTTON To compile this driver as a module, choose M here. The module will be called twl4030_pwrbutton. -config INPUT_TWL4030_VIBRA - tristate "Support for TWL4030 Vibrator" - depends on TWL4030_CORE - select TWL4030_CODEC - select INPUT_FF_MEMLESS - help - This option enables support for TWL4030 Vibrator Driver. - - To compile this driver as a module, choose M here. The module will - be called twl4030_vibra. - config INPUT_UINPUT tristate "User level driver support" help diff --git a/trunk/drivers/input/misc/Makefile b/trunk/drivers/input/misc/Makefile index 7e95a5d474dc..b611615e24ad 100644 --- a/trunk/drivers/input/misc/Makefile +++ b/trunk/drivers/input/misc/Makefile @@ -26,7 +26,6 @@ obj-$(CONFIG_INPUT_GPIO_ROTARY_ENCODER) += rotary_encoder.o obj-$(CONFIG_INPUT_SGI_BTNS) += sgi_btns.o obj-$(CONFIG_INPUT_SPARCSPKR) += sparcspkr.o obj-$(CONFIG_INPUT_TWL4030_PWRBUTTON) += twl4030-pwrbutton.o -obj-$(CONFIG_INPUT_TWL4030_VIBRA) += twl4030-vibra.o obj-$(CONFIG_INPUT_UINPUT) += uinput.o obj-$(CONFIG_INPUT_WINBOND_CIR) += winbond-cir.o obj-$(CONFIG_INPUT_WISTRON_BTNS) += wistron_btns.o diff --git a/trunk/drivers/input/misc/ati_remote2.c b/trunk/drivers/input/misc/ati_remote2.c index 15be5430bc6d..0501f0e65157 100644 --- a/trunk/drivers/input/misc/ati_remote2.c +++ b/trunk/drivers/input/misc/ati_remote2.c @@ -474,11 +474,10 @@ static void ati_remote2_complete_key(struct urb *urb) } static int ati_remote2_getkeycode(struct input_dev *idev, - unsigned int scancode, unsigned int *keycode) + int scancode, int *keycode) { struct ati_remote2 *ar2 = input_get_drvdata(idev); - unsigned int mode; - int index; + int index, mode; mode = scancode >> 8; if (mode > ATI_REMOTE2_PC || !((1 << mode) & ar2->mode_mask)) @@ -492,12 +491,10 @@ static int ati_remote2_getkeycode(struct input_dev *idev, return 0; } -static int ati_remote2_setkeycode(struct input_dev *idev, - unsigned int scancode, unsigned int keycode) +static int ati_remote2_setkeycode(struct input_dev *idev, int scancode, int keycode) { struct ati_remote2 *ar2 = input_get_drvdata(idev); - unsigned int mode, old_keycode; - int index; + int index, mode, old_keycode; mode = scancode >> 8; if (mode > ATI_REMOTE2_PC || !((1 << mode) & ar2->mode_mask)) @@ -507,6 +504,9 @@ static int ati_remote2_setkeycode(struct input_dev *idev, if (index < 0) return -EINVAL; + if (keycode < KEY_RESERVED || keycode > KEY_MAX) + return -EINVAL; + old_keycode = ar2->keycode[mode][index]; ar2->keycode[mode][index] = keycode; __set_bit(keycode, idev->keybit); diff --git a/trunk/drivers/input/misc/twl4030-vibra.c b/trunk/drivers/input/misc/twl4030-vibra.c deleted file mode 100644 index 2fb79e064da3..000000000000 --- a/trunk/drivers/input/misc/twl4030-vibra.c +++ /dev/null @@ -1,297 +0,0 @@ -/* - * twl4030-vibra.c - TWL4030 Vibrator driver - * - * Copyright (C) 2008-2010 Nokia Corporation - * - * Written by Henrik Saari - * Updates by Felipe Balbi - * Input by Jari Vanhala - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA - * 02110-1301 USA - * - */ - -#include -#include -#include -#include -#include -#include -#include - -/* MODULE ID2 */ -#define LEDEN 0x00 - -/* ForceFeedback */ -#define EFFECT_DIR_180_DEG 0x8000 /* range is 0 - 0xFFFF */ - -struct vibra_info { - struct device *dev; - struct input_dev *input_dev; - - struct workqueue_struct *workqueue; - struct work_struct play_work; - - bool enabled; - int speed; - int direction; - - bool coexist; -}; - -static void vibra_disable_leds(void) -{ - u8 reg; - - /* Disable LEDA & LEDB, cannot be used with vibra (PWM) */ - twl_i2c_read_u8(TWL4030_MODULE_LED, ®, LEDEN); - reg &= ~0x03; - twl_i2c_write_u8(TWL4030_MODULE_LED, LEDEN, reg); -} - -/* Powers H-Bridge and enables audio clk */ -static void vibra_enable(struct vibra_info *info) -{ - u8 reg; - - twl4030_codec_enable_resource(TWL4030_CODEC_RES_POWER); - - /* turn H-Bridge on */ - twl_i2c_read_u8(TWL4030_MODULE_AUDIO_VOICE, - ®, TWL4030_REG_VIBRA_CTL); - twl_i2c_write_u8(TWL4030_MODULE_AUDIO_VOICE, - (reg | TWL4030_VIBRA_EN), TWL4030_REG_VIBRA_CTL); - - twl4030_codec_enable_resource(TWL4030_CODEC_RES_APLL); - - info->enabled = true; -} - -static void vibra_disable(struct vibra_info *info) -{ - u8 reg; - - /* Power down H-Bridge */ - twl_i2c_read_u8(TWL4030_MODULE_AUDIO_VOICE, - ®, TWL4030_REG_VIBRA_CTL); - twl_i2c_write_u8(TWL4030_MODULE_AUDIO_VOICE, - (reg & ~TWL4030_VIBRA_EN), TWL4030_REG_VIBRA_CTL); - - twl4030_codec_disable_resource(TWL4030_CODEC_RES_POWER); - twl4030_codec_disable_resource(TWL4030_CODEC_RES_APLL); - - info->enabled = false; -} - -static void vibra_play_work(struct work_struct *work) -{ - struct vibra_info *info = container_of(work, - struct vibra_info, play_work); - int dir; - int pwm; - u8 reg; - - dir = info->direction; - pwm = info->speed; - - twl_i2c_read_u8(TWL4030_MODULE_AUDIO_VOICE, - ®, TWL4030_REG_VIBRA_CTL); - if (pwm && (!info->coexist || !(reg & TWL4030_VIBRA_SEL))) { - - if (!info->enabled) - vibra_enable(info); - - /* set vibra rotation direction */ - twl_i2c_read_u8(TWL4030_MODULE_AUDIO_VOICE, - ®, TWL4030_REG_VIBRA_CTL); - reg = (dir) ? (reg | TWL4030_VIBRA_DIR) : - (reg & ~TWL4030_VIBRA_DIR); - twl_i2c_write_u8(TWL4030_MODULE_AUDIO_VOICE, - reg, TWL4030_REG_VIBRA_CTL); - - /* set PWM, 1 = max, 255 = min */ - twl_i2c_write_u8(TWL4030_MODULE_AUDIO_VOICE, - 256 - pwm, TWL4030_REG_VIBRA_SET); - } else { - if (info->enabled) - vibra_disable(info); - } -} - -/*** Input/ForceFeedback ***/ - -static int vibra_play(struct input_dev *input, void *data, - struct ff_effect *effect) -{ - struct vibra_info *info = input_get_drvdata(input); - - info->speed = effect->u.rumble.strong_magnitude >> 8; - if (!info->speed) - info->speed = effect->u.rumble.weak_magnitude >> 9; - info->direction = effect->direction < EFFECT_DIR_180_DEG ? 0 : 1; - queue_work(info->workqueue, &info->play_work); - return 0; -} - -static int twl4030_vibra_open(struct input_dev *input) -{ - struct vibra_info *info = input_get_drvdata(input); - - info->workqueue = create_singlethread_workqueue("vibra"); - if (info->workqueue == NULL) { - dev_err(&input->dev, "couldn't create workqueue\n"); - return -ENOMEM; - } - return 0; -} - -static void twl4030_vibra_close(struct input_dev *input) -{ - struct vibra_info *info = input_get_drvdata(input); - - cancel_work_sync(&info->play_work); - INIT_WORK(&info->play_work, vibra_play_work); /* cleanup */ - destroy_workqueue(info->workqueue); - info->workqueue = NULL; - - if (info->enabled) - vibra_disable(info); -} - -/*** Module ***/ -#if CONFIG_PM -static int twl4030_vibra_suspend(struct device *dev) -{ - struct platform_device *pdev = to_platform_device(dev); - struct vibra_info *info = platform_get_drvdata(pdev); - - if (info->enabled) - vibra_disable(info); - - return 0; -} - -static int twl4030_vibra_resume(struct device *dev) -{ - vibra_disable_leds(); - return 0; -} - -static SIMPLE_DEV_PM_OPS(twl4030_vibra_pm_ops, - twl4030_vibra_suspend, twl4030_vibra_resume); -#endif - -static int __devinit twl4030_vibra_probe(struct platform_device *pdev) -{ - struct twl4030_codec_vibra_data *pdata = pdev->dev.platform_data; - struct vibra_info *info; - int ret; - - if (!pdata) { - dev_dbg(&pdev->dev, "platform_data not available\n"); - return -EINVAL; - } - - info = kzalloc(sizeof(*info), GFP_KERNEL); - if (!info) - return -ENOMEM; - - info->dev = &pdev->dev; - info->coexist = pdata->coexist; - INIT_WORK(&info->play_work, vibra_play_work); - - info->input_dev = input_allocate_device(); - if (info->input_dev == NULL) { - dev_err(&pdev->dev, "couldn't allocate input device\n"); - ret = -ENOMEM; - goto err_kzalloc; - } - - input_set_drvdata(info->input_dev, info); - - info->input_dev->name = "twl4030:vibrator"; - info->input_dev->id.version = 1; - info->input_dev->dev.parent = pdev->dev.parent; - info->input_dev->open = twl4030_vibra_open; - info->input_dev->close = twl4030_vibra_close; - __set_bit(FF_RUMBLE, info->input_dev->ffbit); - - ret = input_ff_create_memless(info->input_dev, NULL, vibra_play); - if (ret < 0) { - dev_dbg(&pdev->dev, "couldn't register vibrator to FF\n"); - goto err_ialloc; - } - - ret = input_register_device(info->input_dev); - if (ret < 0) { - dev_dbg(&pdev->dev, "couldn't register input device\n"); - goto err_iff; - } - - vibra_disable_leds(); - - platform_set_drvdata(pdev, info); - return 0; - -err_iff: - input_ff_destroy(info->input_dev); -err_ialloc: - input_free_device(info->input_dev); -err_kzalloc: - kfree(info); - return ret; -} - -static int __devexit twl4030_vibra_remove(struct platform_device *pdev) -{ - struct vibra_info *info = platform_get_drvdata(pdev); - - /* this also free ff-memless and calls close if needed */ - input_unregister_device(info->input_dev); - kfree(info); - platform_set_drvdata(pdev, NULL); - - return 0; -} - -static struct platform_driver twl4030_vibra_driver = { - .probe = twl4030_vibra_probe, - .remove = __devexit_p(twl4030_vibra_remove), - .driver = { - .name = "twl4030_codec_vibra", - .owner = THIS_MODULE, -#ifdef CONFIG_PM - .pm = &twl4030_vibra_pm_ops, -#endif - }, -}; - -static int __init twl4030_vibra_init(void) -{ - return platform_driver_register(&twl4030_vibra_driver); -} -module_init(twl4030_vibra_init); - -static void __exit twl4030_vibra_exit(void) -{ - platform_driver_unregister(&twl4030_vibra_driver); -} -module_exit(twl4030_vibra_exit); - -MODULE_ALIAS("platform:twl4030_codec_vibra"); - -MODULE_DESCRIPTION("TWL4030 Vibra driver"); -MODULE_LICENSE("GPL"); -MODULE_AUTHOR("Nokia Corporation"); diff --git a/trunk/drivers/input/misc/winbond-cir.c b/trunk/drivers/input/misc/winbond-cir.c index 9c155a43abc2..cbec3dfdd42b 100644 --- a/trunk/drivers/input/misc/winbond-cir.c +++ b/trunk/drivers/input/misc/winbond-cir.c @@ -385,24 +385,26 @@ wbcir_do_getkeycode(struct wbcir_data *data, u32 scancode) } static int -wbcir_getkeycode(struct input_dev *dev, - unsigned int scancode, unsigned int *keycode) +wbcir_getkeycode(struct input_dev *dev, int scancode, int *keycode) { struct wbcir_data *data = input_get_drvdata(dev); - *keycode = wbcir_do_getkeycode(data, scancode); + *keycode = (int)wbcir_do_getkeycode(data, (u32)scancode); return 0; } static int -wbcir_setkeycode(struct input_dev *dev, - unsigned int scancode, unsigned int keycode) +wbcir_setkeycode(struct input_dev *dev, int sscancode, int keycode) { struct wbcir_data *data = input_get_drvdata(dev); struct wbcir_keyentry *keyentry; struct wbcir_keyentry *new_keyentry; unsigned long flags; unsigned int old_keycode = KEY_RESERVED; + u32 scancode = (u32)sscancode; + + if (keycode < 0 || keycode > KEY_MAX) + return -EINVAL; new_keyentry = kmalloc(sizeof(*new_keyentry), GFP_KERNEL); if (!new_keyentry) diff --git a/trunk/drivers/input/misc/wm831x-on.c b/trunk/drivers/input/misc/wm831x-on.c index 1e54bce72db5..ba4f5dd7c60e 100644 --- a/trunk/drivers/input/misc/wm831x-on.c +++ b/trunk/drivers/input/misc/wm831x-on.c @@ -97,9 +97,8 @@ static int __devinit wm831x_on_probe(struct platform_device *pdev) wm831x_on->dev->phys = "wm831x_on/input0"; wm831x_on->dev->dev.parent = &pdev->dev; - ret = request_threaded_irq(irq, NULL, wm831x_on_irq, - IRQF_TRIGGER_RISING, "wm831x_on", - wm831x_on); + ret = wm831x_request_irq(wm831x, irq, wm831x_on_irq, + IRQF_TRIGGER_RISING, "wm831x_on", wm831x_on); if (ret < 0) { dev_err(&pdev->dev, "Unable to request IRQ: %d\n", ret); goto err_input_dev; @@ -115,7 +114,7 @@ static int __devinit wm831x_on_probe(struct platform_device *pdev) return 0; err_irq: - free_irq(irq, wm831x_on); + wm831x_free_irq(wm831x, irq, NULL); err_input_dev: input_free_device(wm831x_on->dev); err: @@ -128,7 +127,7 @@ static int __devexit wm831x_on_remove(struct platform_device *pdev) struct wm831x_on *wm831x_on = platform_get_drvdata(pdev); int irq = platform_get_irq(pdev, 0); - free_irq(irq, wm831x_on); + wm831x_free_irq(wm831x_on->wm831x, irq, wm831x_on); cancel_delayed_work_sync(&wm831x_on->work); input_unregister_device(wm831x_on->dev); kfree(wm831x_on); diff --git a/trunk/drivers/input/mouse/alps.c b/trunk/drivers/input/mouse/alps.c index 7490f1da4a53..f93c2c0daf1f 100644 --- a/trunk/drivers/input/mouse/alps.c +++ b/trunk/drivers/input/mouse/alps.c @@ -63,8 +63,6 @@ static const struct alps_model_info alps_model_data[] = { { { 0x62, 0x02, 0x14 }, 0xcf, 0xcf, ALPS_PASS | ALPS_DUALPOINT | ALPS_PS2_INTERLEAVED }, { { 0x73, 0x02, 0x50 }, 0xcf, 0xcf, ALPS_FOUR_BUTTONS }, /* Dell Vostro 1400 */ - { { 0x52, 0x01, 0x14 }, 0xff, 0xff, - ALPS_PASS | ALPS_DUALPOINT | ALPS_PS2_INTERLEAVED }, /* Toshiba Tecra A11-11L */ }; /* @@ -120,27 +118,40 @@ static void alps_report_buttons(struct psmouse *psmouse, struct input_dev *dev1, struct input_dev *dev2, int left, int right, int middle) { - struct input_dev *dev; + struct alps_data *priv = psmouse->private; + const struct alps_model_info *model = priv->i; - /* - * If shared button has already been reported on the - * other device (dev2) then this event should be also - * sent through that device. - */ - dev = test_bit(BTN_LEFT, dev2->key) ? dev2 : dev1; - input_report_key(dev, BTN_LEFT, left); + if (model->flags & ALPS_PS2_INTERLEAVED) { + struct input_dev *dev; - dev = test_bit(BTN_RIGHT, dev2->key) ? dev2 : dev1; - input_report_key(dev, BTN_RIGHT, right); + /* + * If shared button has already been reported on the + * other device (dev2) then this event should be also + * sent through that device. + */ + dev = test_bit(BTN_LEFT, dev2->key) ? dev2 : dev1; + input_report_key(dev, BTN_LEFT, left); - dev = test_bit(BTN_MIDDLE, dev2->key) ? dev2 : dev1; - input_report_key(dev, BTN_MIDDLE, middle); + dev = test_bit(BTN_RIGHT, dev2->key) ? dev2 : dev1; + input_report_key(dev, BTN_RIGHT, right); - /* - * Sync the _other_ device now, we'll do the first - * device later once we report the rest of the events. - */ - input_sync(dev2); + dev = test_bit(BTN_MIDDLE, dev2->key) ? dev2 : dev1; + input_report_key(dev, BTN_MIDDLE, middle); + + /* + * Sync the _other_ device now, we'll do the first + * device later once we report the rest of the events. + */ + input_sync(dev2); + } else { + /* + * For devices with non-interleaved packets we know what + * device buttons belong to so we can simply report them. + */ + input_report_key(dev1, BTN_LEFT, left); + input_report_key(dev1, BTN_RIGHT, right); + input_report_key(dev1, BTN_MIDDLE, middle); + } } static void alps_process_packet(struct psmouse *psmouse) diff --git a/trunk/drivers/input/mouse/appletouch.c b/trunk/drivers/input/mouse/appletouch.c index 53ec7ddd1826..908b5b44052f 100644 --- a/trunk/drivers/input/mouse/appletouch.c +++ b/trunk/drivers/input/mouse/appletouch.c @@ -205,8 +205,8 @@ struct atp { bool overflow_warned; int x_old; /* last reported x/y, */ int y_old; /* used for smoothing */ - u8 xy_cur[ATP_XSENSORS + ATP_YSENSORS]; - u8 xy_old[ATP_XSENSORS + ATP_YSENSORS]; + signed char xy_cur[ATP_XSENSORS + ATP_YSENSORS]; + signed char xy_old[ATP_XSENSORS + ATP_YSENSORS]; int xy_acc[ATP_XSENSORS + ATP_YSENSORS]; int idlecount; /* number of empty packets */ struct work_struct work; @@ -531,7 +531,7 @@ static void atp_complete_geyser_1_2(struct urb *urb) for (i = 0; i < ATP_XSENSORS + ATP_YSENSORS; i++) { /* accumulate the change */ - int change = dev->xy_old[i] - dev->xy_cur[i]; + signed char change = dev->xy_old[i] - dev->xy_cur[i]; dev->xy_acc[i] -= change; /* prevent down drifting */ diff --git a/trunk/drivers/input/mousedev.c b/trunk/drivers/input/mousedev.c index f34b22bce4ff..a13d80f7da17 100644 --- a/trunk/drivers/input/mousedev.c +++ b/trunk/drivers/input/mousedev.c @@ -15,6 +15,7 @@ #include #include +#include #include #include #include @@ -541,8 +542,10 @@ static int mousedev_open(struct inode *inode, struct file *file) if (i >= MOUSEDEV_MINORS) return -ENODEV; + lock_kernel(); error = mutex_lock_interruptible(&mousedev_table_mutex); if (error) { + unlock_kernel(); return error; } mousedev = mousedev_table[i]; @@ -551,6 +554,7 @@ static int mousedev_open(struct inode *inode, struct file *file) mutex_unlock(&mousedev_table_mutex); if (!mousedev) { + unlock_kernel(); return -ENODEV; } @@ -571,6 +575,7 @@ static int mousedev_open(struct inode *inode, struct file *file) goto err_free_client; file->private_data = client; + unlock_kernel(); return 0; err_free_client: @@ -578,6 +583,7 @@ static int mousedev_open(struct inode *inode, struct file *file) kfree(client); err_put_mousedev: put_device(&mousedev->dev); + unlock_kernel(); return error; } diff --git a/trunk/drivers/input/serio/i8042-x86ia64io.h b/trunk/drivers/input/serio/i8042-x86ia64io.h index ead0494721d0..2a5982e532f8 100644 --- a/trunk/drivers/input/serio/i8042-x86ia64io.h +++ b/trunk/drivers/input/serio/i8042-x86ia64io.h @@ -441,13 +441,6 @@ static const struct dmi_system_id __initconst i8042_dmi_reset_table[] = { DMI_MATCH(DMI_PRODUCT_NAME, "E1210"), }, }, - { - /* Medion Akoya E1222 */ - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "MEDION"), - DMI_MATCH(DMI_PRODUCT_NAME, "E122X"), - }, - }, { /* Mivvy M310 */ .matches = { @@ -631,9 +624,6 @@ static int i8042_pnp_kbd_probe(struct pnp_dev *dev, const struct pnp_device_id * strlcat(i8042_pnp_kbd_name, pnp_dev_name(dev), sizeof(i8042_pnp_kbd_name)); } - /* Keyboard ports are always supposed to be wakeup-enabled */ - device_set_wakeup_enable(&dev->dev, true); - i8042_pnp_kbd_devices++; return 0; } diff --git a/trunk/drivers/input/serio/i8042.c b/trunk/drivers/input/serio/i8042.c index 9302ba0e48f8..ff4d77c4de11 100644 --- a/trunk/drivers/input/serio/i8042.c +++ b/trunk/drivers/input/serio/i8042.c @@ -1386,8 +1386,6 @@ static int __init i8042_probe(struct platform_device *dev) { int error; - i8042_platform_device = dev; - error = i8042_controller_selftest(); if (error) return error; @@ -1423,7 +1421,6 @@ static int __init i8042_probe(struct platform_device *dev) i8042_free_aux_ports(); /* in case KBD failed but AUX not */ i8042_free_irqs(); i8042_controller_reset(); - i8042_platform_device = NULL; return error; } @@ -1433,7 +1430,6 @@ static int __devexit i8042_remove(struct platform_device *dev) i8042_unregister_ports(); i8042_free_irqs(); i8042_controller_reset(); - i8042_platform_device = NULL; return 0; } @@ -1452,7 +1448,6 @@ static struct platform_driver i8042_driver = { static int __init i8042_init(void) { - struct platform_device *pdev; int err; dbg_init(); @@ -1465,18 +1460,31 @@ static int __init i8042_init(void) if (err) goto err_platform_exit; - pdev = platform_create_bundle(&i8042_driver, i8042_probe, NULL, 0, NULL, 0); - if (IS_ERR(pdev)) { - err = PTR_ERR(pdev); + i8042_platform_device = platform_device_alloc("i8042", -1); + if (!i8042_platform_device) { + err = -ENOMEM; goto err_platform_exit; } + err = platform_device_add(i8042_platform_device); + if (err) + goto err_free_device; + + err = platform_driver_probe(&i8042_driver, i8042_probe); + if (err) + goto err_del_device; + panic_blink = i8042_panic_blink; return 0; + err_del_device: + platform_device_del(i8042_platform_device); + err_free_device: + platform_device_put(i8042_platform_device); err_platform_exit: i8042_platform_exit(); + return err; } diff --git a/trunk/drivers/input/serio/serio_raw.c b/trunk/drivers/input/serio/serio_raw.c index 998664854440..27fdaaffbb40 100644 --- a/trunk/drivers/input/serio/serio_raw.c +++ b/trunk/drivers/input/serio/serio_raw.c @@ -81,12 +81,12 @@ static int serio_raw_open(struct inode *inode, struct file *file) struct serio_raw_list *list; int retval = 0; + lock_kernel(); retval = mutex_lock_interruptible(&serio_raw_mutex); if (retval) - return retval; + goto out_bkl; - serio_raw = serio_raw_locate(iminor(inode)); - if (!serio_raw) { + if (!(serio_raw = serio_raw_locate(iminor(inode)))) { retval = -ENODEV; goto out; } @@ -96,8 +96,7 @@ static int serio_raw_open(struct inode *inode, struct file *file) goto out; } - list = kzalloc(sizeof(struct serio_raw_list), GFP_KERNEL); - if (!list) { + if (!(list = kzalloc(sizeof(struct serio_raw_list), GFP_KERNEL))) { retval = -ENOMEM; goto out; } @@ -110,6 +109,8 @@ static int serio_raw_open(struct inode *inode, struct file *file) out: mutex_unlock(&serio_raw_mutex); +out_bkl: + unlock_kernel(); return retval; } diff --git a/trunk/drivers/input/sparse-keymap.c b/trunk/drivers/input/sparse-keymap.c index e6bde55e5203..fbd3987af57f 100644 --- a/trunk/drivers/input/sparse-keymap.c +++ b/trunk/drivers/input/sparse-keymap.c @@ -64,8 +64,7 @@ struct key_entry *sparse_keymap_entry_from_keycode(struct input_dev *dev, EXPORT_SYMBOL(sparse_keymap_entry_from_keycode); static int sparse_keymap_getkeycode(struct input_dev *dev, - unsigned int scancode, - unsigned int *keycode) + int scancode, int *keycode) { const struct key_entry *key = sparse_keymap_entry_from_scancode(dev, scancode); @@ -79,8 +78,7 @@ static int sparse_keymap_getkeycode(struct input_dev *dev, } static int sparse_keymap_setkeycode(struct input_dev *dev, - unsigned int scancode, - unsigned int keycode) + int scancode, int keycode) { struct key_entry *key; int old_keycode; diff --git a/trunk/drivers/input/tablet/wacom_sys.c b/trunk/drivers/input/tablet/wacom_sys.c index 8b5d2873f0c4..a1770e6feeec 100644 --- a/trunk/drivers/input/tablet/wacom_sys.c +++ b/trunk/drivers/input/tablet/wacom_sys.c @@ -371,7 +371,7 @@ static int wacom_parse_hid(struct usb_interface *intf, struct hid_descriptor *hi } else if (pen) { /* penabled only accepts exact bytes of data */ if (features->type == TABLETPC2FG) - features->pktlen = WACOM_PKGLEN_GRAPHIRE; + features->pktlen = WACOM_PKGLEN_PENABLED; features->device_type = BTN_TOOL_PEN; features->x_max = wacom_le16_to_cpu(&report[i + 3]); @@ -410,7 +410,7 @@ static int wacom_parse_hid(struct usb_interface *intf, struct hid_descriptor *hi } else if (pen) { /* penabled only accepts exact bytes of data */ if (features->type == TABLETPC2FG) - features->pktlen = WACOM_PKGLEN_GRAPHIRE; + features->pktlen = WACOM_PKGLEN_PENABLED; features->device_type = BTN_TOOL_PEN; features->y_max = wacom_le16_to_cpu(&report[i + 3]); diff --git a/trunk/drivers/input/tablet/wacom_wac.c b/trunk/drivers/input/tablet/wacom_wac.c index b3ba3437a2eb..3d81443e683a 100644 --- a/trunk/drivers/input/tablet/wacom_wac.c +++ b/trunk/drivers/input/tablet/wacom_wac.c @@ -155,19 +155,19 @@ static int wacom_graphire_irq(struct wacom_wac *wacom, void *wcombo) { struct wacom_features *features = &wacom->features; unsigned char *data = wacom->data; - int x, y, prox; - int rw = 0; - int retval = 0; + int x, y, rw; + static int penData = 0; if (data[0] != WACOM_REPORT_PENABLED) { dbg("wacom_graphire_irq: received unknown report #%d", data[0]); - goto exit; + return 0; } - prox = data[1] & 0x80; - if (prox || wacom->id[0]) { - if (prox) { - switch ((data[1] >> 5) & 3) { + if (data[1] & 0x80) { + /* in prox and not a pad data */ + penData = 1; + + switch ((data[1] >> 5) & 3) { case 0: /* Pen */ wacom->tool[0] = BTN_TOOL_PEN; @@ -181,13 +181,23 @@ static int wacom_graphire_irq(struct wacom_wac *wacom, void *wcombo) case 2: /* Mouse with wheel */ wacom_report_key(wcombo, BTN_MIDDLE, data[1] & 0x04); + if (features->type == WACOM_G4 || features->type == WACOM_MO) { + rw = data[7] & 0x04 ? (data[7] & 0x03)-4 : (data[7] & 0x03); + wacom_report_rel(wcombo, REL_WHEEL, -rw); + } else + wacom_report_rel(wcombo, REL_WHEEL, -(signed char) data[6]); /* fall through */ case 3: /* Mouse without wheel */ wacom->tool[0] = BTN_TOOL_MOUSE; wacom->id[0] = CURSOR_DEVICE_ID; + wacom_report_key(wcombo, BTN_LEFT, data[1] & 0x01); + wacom_report_key(wcombo, BTN_RIGHT, data[1] & 0x02); + if (features->type == WACOM_G4 || features->type == WACOM_MO) + wacom_report_abs(wcombo, ABS_DISTANCE, data[6] & 0x3f); + else + wacom_report_abs(wcombo, ABS_DISTANCE, data[7] & 0x3f); break; - } } x = wacom_le16_to_cpu(&data[2]); y = wacom_le16_to_cpu(&data[4]); @@ -198,32 +208,36 @@ static int wacom_graphire_irq(struct wacom_wac *wacom, void *wcombo) wacom_report_key(wcombo, BTN_TOUCH, data[1] & 0x01); wacom_report_key(wcombo, BTN_STYLUS, data[1] & 0x02); wacom_report_key(wcombo, BTN_STYLUS2, data[1] & 0x04); - } else { - wacom_report_key(wcombo, BTN_LEFT, data[1] & 0x01); - wacom_report_key(wcombo, BTN_RIGHT, data[1] & 0x02); - if (features->type == WACOM_G4 || - features->type == WACOM_MO) { - wacom_report_abs(wcombo, ABS_DISTANCE, data[6] & 0x3f); - rw = (signed)(data[7] & 0x04) - (data[7] & 0x03); - } else { - wacom_report_abs(wcombo, ABS_DISTANCE, data[7] & 0x3f); - rw = -(signed)data[6]; - } - wacom_report_rel(wcombo, REL_WHEEL, rw); } - - if (!prox) - wacom->id[0] = 0; wacom_report_abs(wcombo, ABS_MISC, wacom->id[0]); /* report tool id */ - wacom_report_key(wcombo, wacom->tool[0], prox); - wacom_input_sync(wcombo); /* sync last event */ + wacom_report_key(wcombo, wacom->tool[0], 1); + } else if (wacom->id[0]) { + wacom_report_abs(wcombo, ABS_X, 0); + wacom_report_abs(wcombo, ABS_Y, 0); + if (wacom->tool[0] == BTN_TOOL_MOUSE) { + wacom_report_key(wcombo, BTN_LEFT, 0); + wacom_report_key(wcombo, BTN_RIGHT, 0); + wacom_report_abs(wcombo, ABS_DISTANCE, 0); + } else { + wacom_report_abs(wcombo, ABS_PRESSURE, 0); + wacom_report_key(wcombo, BTN_TOUCH, 0); + wacom_report_key(wcombo, BTN_STYLUS, 0); + wacom_report_key(wcombo, BTN_STYLUS2, 0); + } + wacom->id[0] = 0; + wacom_report_abs(wcombo, ABS_MISC, 0); /* reset tool id */ + wacom_report_key(wcombo, wacom->tool[0], 0); } /* send pad data */ switch (features->type) { case WACOM_G4: - prox = data[7] & 0xf8; - if (prox || wacom->id[1]) { + if (data[7] & 0xf8) { + if (penData) { + wacom_input_sync(wcombo); /* sync last event */ + if (!wacom->id[0]) + penData = 0; + } wacom->id[1] = PAD_DEVICE_ID; wacom_report_key(wcombo, BTN_0, (data[7] & 0x40)); wacom_report_key(wcombo, BTN_4, (data[7] & 0x80)); @@ -231,16 +245,29 @@ static int wacom_graphire_irq(struct wacom_wac *wacom, void *wcombo) wacom_report_rel(wcombo, REL_WHEEL, rw); wacom_report_key(wcombo, BTN_TOOL_FINGER, 0xf0); wacom_report_abs(wcombo, ABS_MISC, wacom->id[1]); - if (!prox) - wacom->id[1] = 0; - wacom_report_abs(wcombo, ABS_MISC, wacom->id[1]); + wacom_input_event(wcombo, EV_MSC, MSC_SERIAL, 0xf0); + } else if (wacom->id[1]) { + if (penData) { + wacom_input_sync(wcombo); /* sync last event */ + if (!wacom->id[0]) + penData = 0; + } + wacom->id[1] = 0; + wacom_report_key(wcombo, BTN_0, (data[7] & 0x40)); + wacom_report_key(wcombo, BTN_4, (data[7] & 0x80)); + wacom_report_rel(wcombo, REL_WHEEL, 0); + wacom_report_key(wcombo, BTN_TOOL_FINGER, 0); + wacom_report_abs(wcombo, ABS_MISC, 0); wacom_input_event(wcombo, EV_MSC, MSC_SERIAL, 0xf0); } - retval = 1; break; case WACOM_MO: - prox = (data[7] & 0xf8) || data[8]; - if (prox || wacom->id[1]) { + if ((data[7] & 0xf8) || (data[8] & 0xff)) { + if (penData) { + wacom_input_sync(wcombo); /* sync last event */ + if (!wacom->id[0]) + penData = 0; + } wacom->id[1] = PAD_DEVICE_ID; wacom_report_key(wcombo, BTN_0, (data[7] & 0x08)); wacom_report_key(wcombo, BTN_1, (data[7] & 0x20)); @@ -248,16 +275,27 @@ static int wacom_graphire_irq(struct wacom_wac *wacom, void *wcombo) wacom_report_key(wcombo, BTN_5, (data[7] & 0x40)); wacom_report_abs(wcombo, ABS_WHEEL, (data[8] & 0x7f)); wacom_report_key(wcombo, BTN_TOOL_FINGER, 0xf0); - if (!prox) - wacom->id[1] = 0; wacom_report_abs(wcombo, ABS_MISC, wacom->id[1]); wacom_input_event(wcombo, EV_MSC, MSC_SERIAL, 0xf0); + } else if (wacom->id[1]) { + if (penData) { + wacom_input_sync(wcombo); /* sync last event */ + if (!wacom->id[0]) + penData = 0; + } + wacom->id[1] = 0; + wacom_report_key(wcombo, BTN_0, (data[7] & 0x08)); + wacom_report_key(wcombo, BTN_1, (data[7] & 0x20)); + wacom_report_key(wcombo, BTN_4, (data[7] & 0x10)); + wacom_report_key(wcombo, BTN_5, (data[7] & 0x40)); + wacom_report_abs(wcombo, ABS_WHEEL, (data[8] & 0x7f)); + wacom_report_key(wcombo, BTN_TOOL_FINGER, 0); + wacom_report_abs(wcombo, ABS_MISC, 0); + wacom_input_event(wcombo, EV_MSC, MSC_SERIAL, 0xf0); } - retval = 1; break; } -exit: - return retval; + return 1; } static int wacom_intuos_inout(struct wacom_wac *wacom, void *wcombo) @@ -598,9 +636,9 @@ static int wacom_intuos_irq(struct wacom_wac *wacom, void *wcombo) static void wacom_tpc_finger_in(struct wacom_wac *wacom, void *wcombo, char *data, int idx) { wacom_report_abs(wcombo, ABS_X, - data[2 + idx * 2] | ((data[3 + idx * 2] & 0x7f) << 8)); + (data[2 + idx * 2] & 0xff) | ((data[3 + idx * 2] & 0x7f) << 8)); wacom_report_abs(wcombo, ABS_Y, - data[6 + idx * 2] | ((data[7 + idx * 2] & 0x7f) << 8)); + (data[6 + idx * 2] & 0xff) | ((data[7 + idx * 2] & 0x7f) << 8)); wacom_report_abs(wcombo, ABS_MISC, wacom->id[0]); wacom_report_key(wcombo, wacom->tool[idx], 1); if (idx) @@ -744,24 +782,31 @@ static int wacom_tpc_irq(struct wacom_wac *wacom, void *wcombo) touchInProx = 0; - if (!wacom->id[0]) { /* first in prox */ - /* Going into proximity select tool */ - wacom->tool[0] = (data[1] & 0x0c) ? BTN_TOOL_RUBBER : BTN_TOOL_PEN; - if (wacom->tool[0] == BTN_TOOL_PEN) - wacom->id[0] = STYLUS_DEVICE_ID; - else - wacom->id[0] = ERASER_DEVICE_ID; - } - wacom_report_key(wcombo, BTN_STYLUS, data[1] & 0x02); - wacom_report_key(wcombo, BTN_STYLUS2, data[1] & 0x10); - wacom_report_abs(wcombo, ABS_X, wacom_le16_to_cpu(&data[2])); - wacom_report_abs(wcombo, ABS_Y, wacom_le16_to_cpu(&data[4])); - pressure = ((data[7] & 0x01) << 8) | data[6]; - if (pressure < 0) - pressure = features->pressure_max + pressure + 1; - wacom_report_abs(wcombo, ABS_PRESSURE, pressure); - wacom_report_key(wcombo, BTN_TOUCH, data[1] & 0x05); - if (!prox) { /* out-prox */ + if (prox) { /* in prox */ + if (!wacom->id[0]) { + /* Going into proximity select tool */ + wacom->tool[0] = (data[1] & 0x0c) ? BTN_TOOL_RUBBER : BTN_TOOL_PEN; + if (wacom->tool[0] == BTN_TOOL_PEN) + wacom->id[0] = STYLUS_DEVICE_ID; + else + wacom->id[0] = ERASER_DEVICE_ID; + } + wacom_report_key(wcombo, BTN_STYLUS, data[1] & 0x02); + wacom_report_key(wcombo, BTN_STYLUS2, data[1] & 0x10); + wacom_report_abs(wcombo, ABS_X, wacom_le16_to_cpu(&data[2])); + wacom_report_abs(wcombo, ABS_Y, wacom_le16_to_cpu(&data[4])); + pressure = ((data[7] & 0x01) << 8) | data[6]; + if (pressure < 0) + pressure = features->pressure_max + pressure + 1; + wacom_report_abs(wcombo, ABS_PRESSURE, pressure); + wacom_report_key(wcombo, BTN_TOUCH, data[1] & 0x05); + } else { + wacom_report_abs(wcombo, ABS_X, 0); + wacom_report_abs(wcombo, ABS_Y, 0); + wacom_report_abs(wcombo, ABS_PRESSURE, 0); + wacom_report_key(wcombo, BTN_STYLUS, 0); + wacom_report_key(wcombo, BTN_STYLUS2, 0); + wacom_report_key(wcombo, BTN_TOUCH, 0); wacom->id[0] = 0; /* pen is out so touch can be enabled now */ touchInProx = 1; @@ -983,7 +1028,7 @@ static const struct wacom_features wacom_features_0x93 = static const struct wacom_features wacom_features_0x9A = { "Wacom ISDv4 9A", WACOM_PKGLEN_GRAPHIRE, 26202, 16325, 255, 0, TABLETPC }; static const struct wacom_features wacom_features_0x9F = - { "Wacom ISDv4 9F", WACOM_PKGLEN_GRAPHIRE, 26202, 16325, 255, 0, TABLETPC }; + { "Wacom ISDv4 9F", WACOM_PKGLEN_PENABLED, 26202, 16325, 255, 0, TABLETPC }; static const struct wacom_features wacom_features_0xE2 = { "Wacom ISDv4 E2", WACOM_PKGLEN_TPC2FG, 26202, 16325, 255, 0, TABLETPC2FG }; static const struct wacom_features wacom_features_0xE3 = diff --git a/trunk/drivers/input/tablet/wacom_wac.h b/trunk/drivers/input/tablet/wacom_wac.h index b50cf04e61a8..8590b1e8ec37 100644 --- a/trunk/drivers/input/tablet/wacom_wac.h +++ b/trunk/drivers/input/tablet/wacom_wac.h @@ -17,6 +17,7 @@ #define WACOM_PKGLEN_GRAPHIRE 8 #define WACOM_PKGLEN_BBFUN 9 #define WACOM_PKGLEN_INTUOS 10 +#define WACOM_PKGLEN_PENABLED 8 #define WACOM_PKGLEN_TPC1FG 5 #define WACOM_PKGLEN_TPC2FG 14 diff --git a/trunk/drivers/input/touchscreen/Kconfig b/trunk/drivers/input/touchscreen/Kconfig index 8a8fa4d2d6a8..7208654a94ae 100644 --- a/trunk/drivers/input/touchscreen/Kconfig +++ b/trunk/drivers/input/touchscreen/Kconfig @@ -24,18 +24,17 @@ config TOUCHSCREEN_88PM860X module will be called 88pm860x-ts. config TOUCHSCREEN_ADS7846 - tristate "ADS7846/TSC2046/AD7873 and AD(S)7843 based touchscreens" + tristate "ADS7846/TSC2046 and ADS7843 based touchscreens" depends on SPI_MASTER depends on HWMON = n || HWMON help Say Y here if you have a touchscreen interface using the - ADS7846/TSC2046/AD7873 or ADS7843/AD7843 controller, - and your board-specific setup code includes that in its - table of SPI devices. + ADS7846/TSC2046 or ADS7843 controller, and your board-specific + setup code includes that in its table of SPI devices. If HWMON is selected, and the driver is told the reference voltage on your board, you will also get hwmon interfaces for the voltage - (and on ads7846/tsc2046/ad7873, temperature) sensors of this chip. + (and on ads7846/tsc2046, temperature) sensors of this chip. If unsure, say N (but it's safe to say "Y"). diff --git a/trunk/drivers/input/touchscreen/ad7877.c b/trunk/drivers/input/touchscreen/ad7877.c index e019d53d1ab4..eb83939c705e 100644 --- a/trunk/drivers/input/touchscreen/ad7877.c +++ b/trunk/drivers/input/touchscreen/ad7877.c @@ -46,7 +46,7 @@ #include #include -#define TS_PEN_UP_TIMEOUT msecs_to_jiffies(100) +#define TS_PEN_UP_TIMEOUT msecs_to_jiffies(50) #define MAX_SPI_FREQ_HZ 20000000 #define MAX_12BIT ((1<<12)-1) diff --git a/trunk/drivers/input/touchscreen/ads7846.c b/trunk/drivers/input/touchscreen/ads7846.c index 532279cda0e4..8b05d8e97543 100644 --- a/trunk/drivers/input/touchscreen/ads7846.c +++ b/trunk/drivers/input/touchscreen/ads7846.c @@ -36,7 +36,6 @@ * TSC2046 is just newer ads7846 silicon. * Support for ads7843 tested on Atmel at91sam926x-EK. * Support for ads7845 has only been stubbed in. - * Support for Analog Devices AD7873 and AD7843 tested. * * IRQ handling needs a workaround because of a shortcoming in handling * edge triggered IRQs on some platforms like the OMAP1/2. These @@ -822,9 +821,6 @@ static int ads7846_suspend(struct spi_device *spi, pm_message_t message) spin_unlock_irq(&ts->lock); - if (device_may_wakeup(&ts->spi->dev)) - enable_irq_wake(ts->spi->irq); - return 0; } @@ -833,9 +829,6 @@ static int ads7846_resume(struct spi_device *spi) { struct ads7846 *ts = dev_get_drvdata(&spi->dev); - if (device_may_wakeup(&ts->spi->dev)) - disable_irq_wake(ts->spi->irq); - spin_lock_irq(&ts->lock); ts->is_suspended = 0; @@ -991,15 +984,6 @@ static int __devinit ads7846_probe(struct spi_device *spi) vref = pdata->keep_vref_on; - if (ts->model == 7873) { - /* The AD7873 is almost identical to the ADS7846 - * keep VREF off during differential/ratiometric - * conversion modes - */ - ts->model = 7846; - vref = 0; - } - /* set up the transfers to read touchscreen state; this assumes we * use formula #2 for pressure, not #3. */ @@ -1207,8 +1191,6 @@ static int __devinit ads7846_probe(struct spi_device *spi) if (err) goto err_remove_attr_group; - device_init_wakeup(&spi->dev, pdata->wakeup); - return 0; err_remove_attr_group: @@ -1238,8 +1220,6 @@ static int __devexit ads7846_remove(struct spi_device *spi) { struct ads7846 *ts = dev_get_drvdata(&spi->dev); - device_init_wakeup(&spi->dev, false); - ads784x_hwmon_unregister(spi, ts); input_unregister_device(ts->input); diff --git a/trunk/drivers/isdn/gigaset/capi.c b/trunk/drivers/isdn/gigaset/capi.c index 0220c19351d9..6643d6533ccb 100644 --- a/trunk/drivers/isdn/gigaset/capi.c +++ b/trunk/drivers/isdn/gigaset/capi.c @@ -1301,7 +1301,7 @@ static void do_connect_req(struct gigaset_capi_ctr *iif, } /* check parameter: CIP Value */ - if (cmsg->CIPValue >= ARRAY_SIZE(cip2bchlc) || + if (cmsg->CIPValue > ARRAY_SIZE(cip2bchlc) || (cmsg->CIPValue > 0 && cip2bchlc[cmsg->CIPValue].bc == NULL)) { dev_notice(cs->dev, "%s: unknown CIP value %d\n", "CONNECT_REQ", cmsg->CIPValue); @@ -2191,24 +2191,36 @@ static const struct file_operations gigaset_proc_fops = { .release = single_release, }; +static struct capi_driver capi_driver_gigaset = { + .name = "gigaset", + .revision = "1.0", +}; + /** - * gigaset_isdn_regdev() - register device to LL + * gigaset_isdn_register() - register to LL * @cs: device descriptor structure. * @isdnid: device name. * + * Called by main module to register the device with the LL. + * * Return value: 1 for success, 0 for failure */ -int gigaset_isdn_regdev(struct cardstate *cs, const char *isdnid) +int gigaset_isdn_register(struct cardstate *cs, const char *isdnid) { struct gigaset_capi_ctr *iif; int rc; + pr_info("Kernel CAPI interface\n"); + iif = kmalloc(sizeof(*iif), GFP_KERNEL); if (!iif) { pr_err("%s: out of memory\n", __func__); return 0; } + /* register driver with CAPI (ToDo: what for?) */ + register_capi_driver(&capi_driver_gigaset); + /* prepare controller structure */ iif->ctr.owner = THIS_MODULE; iif->ctr.driverdata = cs; @@ -2229,6 +2241,7 @@ int gigaset_isdn_regdev(struct cardstate *cs, const char *isdnid) rc = attach_capi_ctr(&iif->ctr); if (rc) { pr_err("attach_capi_ctr failed (%d)\n", rc); + unregister_capi_driver(&capi_driver_gigaset); kfree(iif); return 0; } @@ -2239,36 +2252,17 @@ int gigaset_isdn_regdev(struct cardstate *cs, const char *isdnid) } /** - * gigaset_isdn_unregdev() - unregister device from LL + * gigaset_isdn_unregister() - unregister from LL * @cs: device descriptor structure. + * + * Called by main module to unregister the device from the LL. */ -void gigaset_isdn_unregdev(struct cardstate *cs) +void gigaset_isdn_unregister(struct cardstate *cs) { struct gigaset_capi_ctr *iif = cs->iif; detach_capi_ctr(&iif->ctr); kfree(iif); cs->iif = NULL; -} - -static struct capi_driver capi_driver_gigaset = { - .name = "gigaset", - .revision = "1.0", -}; - -/** - * gigaset_isdn_regdrv() - register driver to LL - */ -void gigaset_isdn_regdrv(void) -{ - pr_info("Kernel CAPI interface\n"); - register_capi_driver(&capi_driver_gigaset); -} - -/** - * gigaset_isdn_unregdrv() - unregister driver from LL - */ -void gigaset_isdn_unregdrv(void) -{ unregister_capi_driver(&capi_driver_gigaset); } diff --git a/trunk/drivers/isdn/gigaset/common.c b/trunk/drivers/isdn/gigaset/common.c index bdc01cb9f0ab..85de3399a2f2 100644 --- a/trunk/drivers/isdn/gigaset/common.c +++ b/trunk/drivers/isdn/gigaset/common.c @@ -507,7 +507,7 @@ void gigaset_freecs(struct cardstate *cs) case 2: /* error in initcshw */ /* Deregister from LL */ make_invalid(cs, VALID_ID); - gigaset_isdn_unregdev(cs); + gigaset_isdn_unregister(cs); /* fall through */ case 1: /* error when registering to LL */ @@ -769,7 +769,7 @@ struct cardstate *gigaset_initcs(struct gigaset_driver *drv, int channels, cs->cmdbytes = 0; gig_dbg(DEBUG_INIT, "setting up iif"); - if (!gigaset_isdn_regdev(cs, modulename)) { + if (!gigaset_isdn_register(cs, modulename)) { pr_err("error registering ISDN device\n"); goto error; } @@ -1205,13 +1205,11 @@ static int __init gigaset_init_module(void) gigaset_debuglevel = DEBUG_DEFAULT; pr_info(DRIVER_DESC DRIVER_DESC_DEBUG "\n"); - gigaset_isdn_regdrv(); return 0; } static void __exit gigaset_exit_module(void) { - gigaset_isdn_unregdrv(); } module_init(gigaset_init_module); diff --git a/trunk/drivers/isdn/gigaset/dummyll.c b/trunk/drivers/isdn/gigaset/dummyll.c index bd0b1eaa7572..5b27c996af6d 100644 --- a/trunk/drivers/isdn/gigaset/dummyll.c +++ b/trunk/drivers/isdn/gigaset/dummyll.c @@ -57,20 +57,12 @@ void gigaset_isdn_stop(struct cardstate *cs) { } -int gigaset_isdn_regdev(struct cardstate *cs, const char *isdnid) -{ - return 1; -} - -void gigaset_isdn_unregdev(struct cardstate *cs) -{ -} - -void gigaset_isdn_regdrv(void) +int gigaset_isdn_register(struct cardstate *cs, const char *isdnid) { pr_info("no ISDN subsystem interface\n"); + return 1; } -void gigaset_isdn_unregdrv(void) +void gigaset_isdn_unregister(struct cardstate *cs) { } diff --git a/trunk/drivers/isdn/gigaset/ev-layer.c b/trunk/drivers/isdn/gigaset/ev-layer.c index 206c380c5235..c8f89b78b233 100644 --- a/trunk/drivers/isdn/gigaset/ev-layer.c +++ b/trunk/drivers/isdn/gigaset/ev-layer.c @@ -1258,10 +1258,14 @@ static void do_action(int action, struct cardstate *cs, * note that bcs may be NULL if no B channel is free */ at_state2->ConState = 700; - for (i = 0; i < STR_NUM; ++i) { - kfree(at_state2->str_var[i]); - at_state2->str_var[i] = NULL; - } + kfree(at_state2->str_var[STR_NMBR]); + at_state2->str_var[STR_NMBR] = NULL; + kfree(at_state2->str_var[STR_ZCPN]); + at_state2->str_var[STR_ZCPN] = NULL; + kfree(at_state2->str_var[STR_ZBC]); + at_state2->str_var[STR_ZBC] = NULL; + kfree(at_state2->str_var[STR_ZHLC]); + at_state2->str_var[STR_ZHLC] = NULL; at_state2->int_var[VAR_ZCTP] = -1; spin_lock_irqsave(&cs->lock, flags); diff --git a/trunk/drivers/isdn/gigaset/gigaset.h b/trunk/drivers/isdn/gigaset/gigaset.h index cdd144ecdc5f..1875ab80b335 100644 --- a/trunk/drivers/isdn/gigaset/gigaset.h +++ b/trunk/drivers/isdn/gigaset/gigaset.h @@ -675,10 +675,8 @@ int gigaset_isowbuf_getbytes(struct isowbuf_t *iwb, int size); */ /* Called from common.c for setting up/shutting down with the ISDN subsystem */ -void gigaset_isdn_regdrv(void); -void gigaset_isdn_unregdrv(void); -int gigaset_isdn_regdev(struct cardstate *cs, const char *isdnid); -void gigaset_isdn_unregdev(struct cardstate *cs); +int gigaset_isdn_register(struct cardstate *cs, const char *isdnid); +void gigaset_isdn_unregister(struct cardstate *cs); /* Called from hardware module to indicate completion of an skb */ void gigaset_skb_sent(struct bc_state *bcs, struct sk_buff *skb); diff --git a/trunk/drivers/isdn/gigaset/i4l.c b/trunk/drivers/isdn/gigaset/i4l.c index c22e5ace8276..f0acb9dc9e33 100644 --- a/trunk/drivers/isdn/gigaset/i4l.c +++ b/trunk/drivers/isdn/gigaset/i4l.c @@ -592,13 +592,15 @@ void gigaset_isdn_stop(struct cardstate *cs) } /** - * gigaset_isdn_regdev() - register to LL + * gigaset_isdn_register() - register to LL * @cs: device descriptor structure. * @isdnid: device name. * + * Called by main module to register the device with the LL. + * * Return value: 1 for success, 0 for failure */ -int gigaset_isdn_regdev(struct cardstate *cs, const char *isdnid) +int gigaset_isdn_register(struct cardstate *cs, const char *isdnid) { isdn_if *iif; @@ -648,29 +650,15 @@ int gigaset_isdn_regdev(struct cardstate *cs, const char *isdnid) } /** - * gigaset_isdn_unregdev() - unregister device from LL + * gigaset_isdn_unregister() - unregister from LL * @cs: device descriptor structure. + * + * Called by main module to unregister the device from the LL. */ -void gigaset_isdn_unregdev(struct cardstate *cs) +void gigaset_isdn_unregister(struct cardstate *cs) { gig_dbg(DEBUG_CMD, "sending UNLOAD"); gigaset_i4l_cmd(cs, ISDN_STAT_UNLOAD); kfree(cs->iif); cs->iif = NULL; } - -/** - * gigaset_isdn_regdrv() - register driver to LL - */ -void gigaset_isdn_regdrv(void) -{ - /* nothing to do */ -} - -/** - * gigaset_isdn_unregdrv() - unregister driver from LL - */ -void gigaset_isdn_unregdrv(void) -{ - /* nothing to do */ -} diff --git a/trunk/drivers/isdn/gigaset/interface.c b/trunk/drivers/isdn/gigaset/interface.c index f0dc6c9cc283..a1bcbc21ff71 100644 --- a/trunk/drivers/isdn/gigaset/interface.c +++ b/trunk/drivers/isdn/gigaset/interface.c @@ -628,6 +628,7 @@ void gigaset_if_receive(struct cardstate *cs, if (tty == NULL) gig_dbg(DEBUG_IF, "receive on closed device"); else { + tty_buffer_request_room(tty, len); tty_insert_flip_string(tty, buffer, len); tty_flip_buffer_push(tty); } diff --git a/trunk/drivers/isdn/hardware/eicon/message.c b/trunk/drivers/isdn/hardware/eicon/message.c index 341ef17c22ac..ae89fb89da64 100644 --- a/trunk/drivers/isdn/hardware/eicon/message.c +++ b/trunk/drivers/isdn/hardware/eicon/message.c @@ -2754,7 +2754,7 @@ static byte connect_b3_req(dword Id, word Number, DIVA_CAPI_ADAPTER *a, for (i = 0; i < w; i++) ((T30_INFO *)(plci->fax_connect_info_buffer))->station_id[i] = fax_parms[4].info[1+i]; ((T30_INFO *)(plci->fax_connect_info_buffer))->head_line_len = 0; - len = offsetof(T30_INFO, station_id) + T30_MAX_STATION_ID_LENGTH; + len = offsetof(T30_INFO, station_id) + 20; w = fax_parms[5].length; if (w > 20) w = 20; @@ -2892,7 +2892,7 @@ static byte connect_b3_res(dword Id, word Number, DIVA_CAPI_ADAPTER *a, && (plci->nsf_control_bits & T30_NSF_CONTROL_BIT_ENABLE_NSF) && (plci->nsf_control_bits & T30_NSF_CONTROL_BIT_NEGOTIATE_RESP)) { - len = offsetof(T30_INFO, station_id) + T30_MAX_STATION_ID_LENGTH; + len = offsetof(T30_INFO, station_id) + 20; if (plci->fax_connect_info_length < len) { ((T30_INFO *)(plci->fax_connect_info_buffer))->station_id_len = 0; @@ -3802,7 +3802,7 @@ static byte manufacturer_res(dword Id, word Number, DIVA_CAPI_ADAPTER *a, break; } ncpi = &m_parms[1]; - len = offsetof(T30_INFO, station_id) + T30_MAX_STATION_ID_LENGTH; + len = offsetof(T30_INFO, station_id) + 20; if (plci->fax_connect_info_length < len) { ((T30_INFO *)(plci->fax_connect_info_buffer))->station_id_len = 0; @@ -6830,7 +6830,7 @@ static void nl_ind(PLCI *plci) if(((T30_INFO *)plci->NL.RBuffer->P)->station_id_len) { plci->ncpi_buffer[len] = 20; - for (i = 0; i < T30_MAX_STATION_ID_LENGTH; i++) + for (i = 0; i < 20; i++) plci->ncpi_buffer[++len] = ((T30_INFO *)plci->NL.RBuffer->P)->station_id[i]; } if (((plci->NL.Ind & 0x0f) == N_DISC) || ((plci->NL.Ind & 0x0f) == N_DISC_ACK)) @@ -6844,7 +6844,7 @@ static void nl_ind(PLCI *plci) if ((plci->requested_options_conn | plci->requested_options | a->requested_options_table[plci->appl->Id-1]) & ((1L << PRIVATE_FAX_SUB_SEP_PWD) | (1L << PRIVATE_FAX_NONSTANDARD))) { - i = offsetof(T30_INFO, station_id) + T30_MAX_STATION_ID_LENGTH + ((T30_INFO *)plci->NL.RBuffer->P)->head_line_len; + i = offsetof(T30_INFO, station_id) + 20 + ((T30_INFO *)plci->NL.RBuffer->P)->head_line_len; while (i < plci->NL.RBuffer->length) plci->ncpi_buffer[++len] = plci->NL.RBuffer->P[i++]; } @@ -8400,7 +8400,7 @@ static word add_b23(PLCI *plci, API_PARSE *bp) } } /* copy station id to NLC */ - for(i=0; i < T30_MAX_STATION_ID_LENGTH; i++) + for(i=0; i<20; i++) { if(istation_id[i] = ' '; } } - ((T30_INFO *)&nlc[1])->station_id_len = T30_MAX_STATION_ID_LENGTH; + ((T30_INFO *)&nlc[1])->station_id_len = 20; /* copy head line to NLC */ if(b3_config_parms[3].length) { - pos = (byte)(fax_head_line_time (&(((T30_INFO *)&nlc[1])->station_id[T30_MAX_STATION_ID_LENGTH]))); + pos = (byte)(fax_head_line_time (&(((T30_INFO *)&nlc[1])->station_id[20]))); if (pos != 0) { if (CAPI_MAX_DATE_TIME_LENGTH + 2 + b3_config_parms[3].length > CAPI_MAX_HEAD_LINE_SPACE) pos = 0; else { - nlc[1 + offsetof(T30_INFO, station_id) + T30_MAX_STATION_ID_LENGTH + pos++] = ' '; - nlc[1 + offsetof(T30_INFO, station_id) + T30_MAX_STATION_ID_LENGTH + pos++] = ' '; + ((T30_INFO *)&nlc[1])->station_id[20 + pos++] = ' '; + ((T30_INFO *)&nlc[1])->station_id[20 + pos++] = ' '; len = (byte)b3_config_parms[2].length; if (len > 20) len = 20; if (CAPI_MAX_DATE_TIME_LENGTH + 2 + len + 2 + b3_config_parms[3].length <= CAPI_MAX_HEAD_LINE_SPACE) { for (i = 0; i < len; i++) - nlc[1 + offsetof(T30_INFO, station_id) + T30_MAX_STATION_ID_LENGTH + pos++] = ((byte *)b3_config_parms[2].info)[1+i]; - nlc[1 + offsetof(T30_INFO, station_id) + T30_MAX_STATION_ID_LENGTH + pos++] = ' '; - nlc[1 + offsetof(T30_INFO, station_id) + T30_MAX_STATION_ID_LENGTH + pos++] = ' '; + ((T30_INFO *)&nlc[1])->station_id[20 + pos++] = ((byte *)b3_config_parms[2].info)[1+i]; + ((T30_INFO *)&nlc[1])->station_id[20 + pos++] = ' '; + ((T30_INFO *)&nlc[1])->station_id[20 + pos++] = ' '; } } } @@ -8444,8 +8444,9 @@ static word add_b23(PLCI *plci, API_PARSE *bp) ((T30_INFO *)&nlc[1])->head_line_len = (byte)(pos + len); nlc[0] += (byte)(pos + len); for (i = 0; i < len; i++) - nlc[1 + offsetof(T30_INFO, station_id) + T30_MAX_STATION_ID_LENGTH + pos++] = ((byte *)b3_config_parms[3].info)[1+i]; - } else + ((T30_INFO *)&nlc[1])->station_id[20 + pos++] = ((byte *)b3_config_parms[3].info)[1+i]; + } + else ((T30_INFO *)&nlc[1])->head_line_len = 0; plci->nsf_control_bits = 0; @@ -8472,7 +8473,7 @@ static word add_b23(PLCI *plci, API_PARSE *bp) fax_control_bits |= T30_CONTROL_BIT_ACCEPT_SEL_POLLING; } len = nlc[0]; - pos = offsetof(T30_INFO, station_id) + T30_MAX_STATION_ID_LENGTH; + pos = offsetof(T30_INFO, station_id) + 20; if (pos < plci->fax_connect_info_length) { for (i = 1 + plci->fax_connect_info_buffer[pos]; i != 0; i--) @@ -8524,7 +8525,7 @@ static word add_b23(PLCI *plci, API_PARSE *bp) } PUT_WORD(&(((T30_INFO *)&nlc[1])->control_bits_low), fax_control_bits); - len = offsetof(T30_INFO, station_id) + T30_MAX_STATION_ID_LENGTH; + len = offsetof(T30_INFO, station_id) + 20; for (i = 0; i < len; i++) plci->fax_connect_info_buffer[i] = nlc[1+i]; ((T30_INFO *) plci->fax_connect_info_buffer)->head_line_len = 0; diff --git a/trunk/drivers/isdn/hardware/mISDN/hfcmulti.c b/trunk/drivers/isdn/hardware/mISDN/hfcmulti.c index 8affba3e569d..ad36df9b759c 100644 --- a/trunk/drivers/isdn/hardware/mISDN/hfcmulti.c +++ b/trunk/drivers/isdn/hardware/mISDN/hfcmulti.c @@ -5265,8 +5265,6 @@ static const struct hm_map hfcm_map[] = { /*31*/ {VENDOR_CCD, "XHFC-4S Speech Design", 5, 4, 0, 0, 0, 0, HFC_IO_MODE_EMBSD, XHFC_IRQ}, /*32*/ {VENDOR_JH, "HFC-8S (junghanns)", 8, 8, 1, 0, 0, 0, 0, 0}, -/*33*/ {VENDOR_BN, "HFC-2S Beronet Card PCIe", 4, 2, 1, 3, 0, DIP_4S, 0, 0}, -/*34*/ {VENDOR_BN, "HFC-4S Beronet Card PCIe", 4, 4, 1, 2, 0, DIP_4S, 0, 0}, }; #undef H @@ -5302,10 +5300,6 @@ static struct pci_device_id hfmultipci_ids[] __devinitdata = { PCI_SUBDEVICE_ID_CCD_OV4S, 0, 0, H(28)}, /* OpenVox 4 */ { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC4S, PCI_VENDOR_ID_CCD, PCI_SUBDEVICE_ID_CCD_OV2S, 0, 0, H(29)}, /* OpenVox 2 */ - { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC4S, PCI_VENDOR_ID_CCD, - 0xb761, 0, 0, H(33)}, /* BN2S PCIe */ - { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC4S, PCI_VENDOR_ID_CCD, - 0xb762, 0, 0, H(34)}, /* BN4S PCIe */ /* Cards with HFC-8S Chip */ { PCI_VENDOR_ID_CCD, PCI_DEVICE_ID_CCD_HFC8S, PCI_VENDOR_ID_CCD, diff --git a/trunk/drivers/isdn/hysdn/hysdn_boot.c b/trunk/drivers/isdn/hysdn/hysdn_boot.c index 4f541ef14f9e..be787e16bb79 100644 --- a/trunk/drivers/isdn/hysdn/hysdn_boot.c +++ b/trunk/drivers/isdn/hysdn/hysdn_boot.c @@ -143,7 +143,7 @@ pof_handle_data(hysdn_card * card, int datlen) (boot->pof_recid == TAG_CABSDATA) ? "CABSDATA" : "ABSDATA", datlen, boot->pof_recoffset); - if ((boot->last_error = card->writebootseq(card, boot->buf.BootBuf, datlen)) < 0) + if ((boot->last_error = card->writebootseq(card, boot->buf.BootBuf, datlen) < 0)) return (boot->last_error); /* error writing data */ if (boot->pof_recoffset + datlen >= boot->pof_reclen) diff --git a/trunk/drivers/leds/Kconfig b/trunk/drivers/leds/Kconfig index 505eb64c329c..e0b64312e66a 100644 --- a/trunk/drivers/leds/Kconfig +++ b/trunk/drivers/leds/Kconfig @@ -15,8 +15,6 @@ config LEDS_CLASS This option enables the led sysfs class in /sys/class/leds. You'll need this to do anything useful with LEDs. If unsure, say N. -if LEDS_CLASS - comment "LED drivers" config LEDS_88PM860X @@ -28,73 +26,73 @@ config LEDS_88PM860X config LEDS_ATMEL_PWM tristate "LED Support using Atmel PWM outputs" - depends on ATMEL_PWM + depends on LEDS_CLASS && ATMEL_PWM help This option enables support for LEDs driven using outputs of the dedicated PWM controller found on newer Atmel SOCs. config LEDS_LOCOMO tristate "LED Support for Locomo device" - depends on SHARP_LOCOMO + depends on LEDS_CLASS && SHARP_LOCOMO help This option enables support for the LEDs on Sharp Locomo. Zaurus models SL-5500 and SL-5600. config LEDS_MIKROTIK_RB532 tristate "LED Support for Mikrotik Routerboard 532" - depends on MIKROTIK_RB532 + depends on LEDS_CLASS && MIKROTIK_RB532 help This option enables support for the so called "User LED" of Mikrotik's Routerboard 532. config LEDS_S3C24XX tristate "LED Support for Samsung S3C24XX GPIO LEDs" - depends on ARCH_S3C2410 + depends on LEDS_CLASS && ARCH_S3C2410 help This option enables support for LEDs connected to GPIO lines on Samsung S3C24XX series CPUs, such as the S3C2410 and S3C2440. config LEDS_AMS_DELTA tristate "LED Support for the Amstrad Delta (E3)" - depends on MACH_AMS_DELTA + depends on LEDS_CLASS && MACH_AMS_DELTA help This option enables support for the LEDs on Amstrad Delta (E3). config LEDS_NET48XX tristate "LED Support for Soekris net48xx series Error LED" - depends on SCx200_GPIO + depends on LEDS_CLASS && SCx200_GPIO help This option enables support for the Soekris net4801 and net4826 error LED. config LEDS_FSG tristate "LED Support for the Freecom FSG-3" - depends on MACH_FSG + depends on LEDS_CLASS && MACH_FSG help This option enables support for the LEDs on the Freecom FSG-3. config LEDS_WRAP tristate "LED Support for the WRAP series LEDs" - depends on SCx200_GPIO + depends on LEDS_CLASS && SCx200_GPIO help This option enables support for the PCEngines WRAP programmable LEDs. config LEDS_ALIX2 tristate "LED Support for ALIX.2 and ALIX.3 series" - depends on X86 && !GPIO_CS5535 && !CS5535_GPIO + depends on LEDS_CLASS && X86 && EXPERIMENTAL help This option enables support for the PCEngines ALIX.2 and ALIX.3 LEDs. You have to set leds-alix2.force=1 for boards with Award BIOS. config LEDS_H1940 tristate "LED Support for iPAQ H1940 device" - depends on ARCH_H1940 + depends on LEDS_CLASS && ARCH_H1940 help This option enables support for the LEDs on the h1940. config LEDS_COBALT_QUBE tristate "LED Support for the Cobalt Qube series front LED" - depends on MIPS_COBALT + depends on LEDS_CLASS && MIPS_COBALT help This option enables support for the front LED on Cobalt Qube series @@ -107,7 +105,7 @@ config LEDS_COBALT_RAQ config LEDS_SUNFIRE tristate "LED support for SunFire servers." - depends on SPARC64 + depends on LEDS_CLASS && SPARC64 select LEDS_TRIGGERS help This option enables support for the Left, Middle, and Right @@ -115,14 +113,14 @@ config LEDS_SUNFIRE config LEDS_HP6XX tristate "LED Support for the HP Jornada 6xx" - depends on SH_HP6XX + depends on LEDS_CLASS && SH_HP6XX help This option enables LED support for the handheld HP Jornada 620/660/680/690. config LEDS_PCA9532 tristate "LED driver for PCA9532 dimmer" - depends on I2C && INPUT && EXPERIMENTAL + depends on LEDS_CLASS && I2C && INPUT && EXPERIMENTAL help This option enables support for NXP pca9532 LED controller. It is generally only useful @@ -130,7 +128,7 @@ config LEDS_PCA9532 config LEDS_GPIO tristate "LED Support for GPIO connected LEDs" - depends on GENERIC_GPIO + depends on LEDS_CLASS && GENERIC_GPIO help This option enables support for the LEDs connected to GPIO outputs. To be useful the particular board must have LEDs @@ -157,7 +155,7 @@ config LEDS_GPIO_OF config LEDS_LP3944 tristate "LED Support for N.S. LP3944 (Fun Light) I2C chip" - depends on I2C + depends on LEDS_CLASS && I2C help This option enables support for LEDs connected to the National Semiconductor LP3944 Lighting Management Unit (LMU) also known as @@ -168,7 +166,7 @@ config LEDS_LP3944 config LEDS_CLEVO_MAIL tristate "Mail LED on Clevo notebook" - depends on X86 && SERIO_I8042 && DMI + depends on LEDS_CLASS && X86 && SERIO_I8042 && DMI help This driver makes the mail LED accessible from userspace programs through the leds subsystem. This LED have three @@ -198,7 +196,7 @@ config LEDS_CLEVO_MAIL config LEDS_PCA955X tristate "LED Support for PCA955x I2C chips" - depends on I2C + depends on LEDS_CLASS && I2C help This option enables support for LEDs connected to PCA955x LED driver chips accessed via the I2C bus. Supported @@ -206,54 +204,54 @@ config LEDS_PCA955X config LEDS_WM831X_STATUS tristate "LED support for status LEDs on WM831x PMICs" - depends on MFD_WM831X + depends on LEDS_CLASS && MFD_WM831X help This option enables support for the status LEDs of the WM831x series of PMICs. config LEDS_WM8350 tristate "LED Support for WM8350 AudioPlus PMIC" - depends on MFD_WM8350 + depends on LEDS_CLASS && MFD_WM8350 help This option enables support for LEDs driven by the Wolfson Microelectronics WM8350 AudioPlus PMIC. config LEDS_DA903X tristate "LED Support for DA9030/DA9034 PMIC" - depends on PMIC_DA903X + depends on LEDS_CLASS && PMIC_DA903X help This option enables support for on-chip LED drivers found on Dialog Semiconductor DA9030/DA9034 PMICs. config LEDS_DAC124S085 tristate "LED Support for DAC124S085 SPI DAC" - depends on SPI + depends on LEDS_CLASS && SPI help This option enables support for DAC124S085 SPI DAC from NatSemi, which can be used to control up to four LEDs. config LEDS_PWM tristate "PWM driven LED Support" - depends on HAVE_PWM + depends on LEDS_CLASS && HAVE_PWM help This option enables support for pwm driven LEDs config LEDS_REGULATOR tristate "REGULATOR driven LED support" - depends on REGULATOR + depends on LEDS_CLASS && REGULATOR help This option enables support for regulator driven LEDs. config LEDS_BD2802 tristate "LED driver for BD2802 RGB LED" - depends on I2C + depends on LEDS_CLASS && I2C help This option enables support for BD2802GU RGB LED driver chips accessed via the I2C bus. config LEDS_INTEL_SS4200 tristate "LED driver for Intel NAS SS4200 series" - depends on PCI && DMI + depends on LEDS_CLASS && PCI && DMI help This option enables support for the Intel SS4200 series of Network Attached Storage servers. You may control the hard @@ -262,7 +260,7 @@ config LEDS_INTEL_SS4200 config LEDS_LT3593 tristate "LED driver for LT3593 controllers" - depends on GENERIC_GPIO + depends on LEDS_CLASS && GENERIC_GPIO help This option enables support for LEDs driven by a Linear Technology LT3593 controller. This controller uses a special one-wire pulse @@ -270,7 +268,7 @@ config LEDS_LT3593 config LEDS_ADP5520 tristate "LED Support for ADP5520/ADP5501 PMIC" - depends on PMIC_ADP5520 + depends on LEDS_CLASS && PMIC_ADP5520 help This option enables support for on-chip LED drivers found on Analog Devices ADP5520/ADP5501 PMICs. @@ -278,12 +276,7 @@ config LEDS_ADP5520 To compile this driver as a module, choose M here: the module will be called leds-adp5520. -config LEDS_DELL_NETBOOKS - tristate "External LED on Dell Business Netbooks" - depends on X86 && ACPI_WMI - help - This adds support for the Latitude 2100 and similar - notebooks that have an external LED. +comment "LED Triggers" config LEDS_TRIGGERS bool "LED Trigger support" @@ -292,12 +285,9 @@ config LEDS_TRIGGERS These triggers allow kernel events to drive the LEDs and can be configured via sysfs. If unsure, say Y. -if LEDS_TRIGGERS - -comment "LED Triggers" - config LEDS_TRIGGER_TIMER tristate "LED Timer Trigger" + depends on LEDS_TRIGGERS help This allows LEDs to be controlled by a programmable timer via sysfs. Some LED hardware can be programmed to start @@ -308,13 +298,14 @@ config LEDS_TRIGGER_TIMER config LEDS_TRIGGER_IDE_DISK bool "LED IDE Disk Trigger" - depends on IDE_GD_ATA + depends on LEDS_TRIGGERS && IDE_GD_ATA help This allows LEDs to be controlled by IDE disk activity. If unsure, say Y. config LEDS_TRIGGER_HEARTBEAT tristate "LED Heartbeat Trigger" + depends on LEDS_TRIGGERS help This allows LEDs to be controlled by a CPU load average. The flash frequency is a hyperbolic function of the 1-minute @@ -323,6 +314,7 @@ config LEDS_TRIGGER_HEARTBEAT config LEDS_TRIGGER_BACKLIGHT tristate "LED backlight Trigger" + depends on LEDS_TRIGGERS help This allows LEDs to be controlled as a backlight device: they turn off and on when the display is blanked and unblanked. @@ -331,6 +323,7 @@ config LEDS_TRIGGER_BACKLIGHT config LEDS_TRIGGER_GPIO tristate "LED GPIO Trigger" + depends on LEDS_TRIGGERS depends on GPIOLIB help This allows LEDs to be controlled by gpio events. It's good @@ -343,6 +336,7 @@ config LEDS_TRIGGER_GPIO config LEDS_TRIGGER_DEFAULT_ON tristate "LED Default ON Trigger" + depends on LEDS_TRIGGERS help This allows LEDs to be initialised in the ON state. If unsure, say Y. @@ -350,8 +344,4 @@ config LEDS_TRIGGER_DEFAULT_ON comment "iptables trigger is under Netfilter config (LED target)" depends on LEDS_TRIGGERS -endif # LEDS_TRIGGERS - -endif # LEDS_CLASS - endif # NEW_LEDS diff --git a/trunk/drivers/leds/Makefile b/trunk/drivers/leds/Makefile index 0cd8b9957380..d76fb32b77c0 100644 --- a/trunk/drivers/leds/Makefile +++ b/trunk/drivers/leds/Makefile @@ -34,7 +34,6 @@ obj-$(CONFIG_LEDS_REGULATOR) += leds-regulator.o obj-$(CONFIG_LEDS_INTEL_SS4200) += leds-ss4200.o obj-$(CONFIG_LEDS_LT3593) += leds-lt3593.o obj-$(CONFIG_LEDS_ADP5520) += leds-adp5520.o -obj-$(CONFIG_LEDS_DELL_NETBOOKS) += dell-led.o # LED SPI Drivers obj-$(CONFIG_LEDS_DAC124S085) += leds-dac124s085.o diff --git a/trunk/drivers/leds/dell-led.c b/trunk/drivers/leds/dell-led.c deleted file mode 100644 index ee310891fff8..000000000000 --- a/trunk/drivers/leds/dell-led.c +++ /dev/null @@ -1,200 +0,0 @@ -/* - * dell_led.c - Dell LED Driver - * - * Copyright (C) 2010 Dell Inc. - * Louis Davis - * Jim Dailey - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as - * published by the Free Software Foundation. - * - */ - -#include -#include - -MODULE_AUTHOR("Louis Davis/Jim Dailey"); -MODULE_DESCRIPTION("Dell LED Control Driver"); -MODULE_LICENSE("GPL"); - -#define DELL_LED_BIOS_GUID "F6E4FE6E-909D-47cb-8BAB-C9F6F2F8D396" -MODULE_ALIAS("wmi:" DELL_LED_BIOS_GUID); - -/* Error Result Codes: */ -#define INVALID_DEVICE_ID 250 -#define INVALID_PARAMETER 251 -#define INVALID_BUFFER 252 -#define INTERFACE_ERROR 253 -#define UNSUPPORTED_COMMAND 254 -#define UNSPECIFIED_ERROR 255 - -/* Device ID */ -#define DEVICE_ID_PANEL_BACK 1 - -/* LED Commands */ -#define CMD_LED_ON 16 -#define CMD_LED_OFF 17 -#define CMD_LED_BLINK 18 - -struct bios_args { - unsigned char length; - unsigned char result_code; - unsigned char device_id; - unsigned char command; - unsigned char on_time; - unsigned char off_time; -}; - -static int dell_led_perform_fn(u8 length, - u8 result_code, - u8 device_id, - u8 command, - u8 on_time, - u8 off_time) -{ - struct bios_args *bios_return; - u8 return_code; - union acpi_object *obj; - struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL }; - struct acpi_buffer input; - acpi_status status; - - struct bios_args args; - args.length = length; - args.result_code = result_code; - args.device_id = device_id; - args.command = command; - args.on_time = on_time; - args.off_time = off_time; - - input.length = sizeof(struct bios_args); - input.pointer = &args; - - status = wmi_evaluate_method(DELL_LED_BIOS_GUID, - 1, - 1, - &input, - &output); - - if (ACPI_FAILURE(status)) - return status; - - obj = output.pointer; - - if (!obj) - return -EINVAL; - else if (obj->type != ACPI_TYPE_BUFFER) { - kfree(obj); - return -EINVAL; - } - - bios_return = ((struct bios_args *)obj->buffer.pointer); - return_code = bios_return->result_code; - - kfree(obj); - - return return_code; -} - -static int led_on(void) -{ - return dell_led_perform_fn(3, /* Length of command */ - INTERFACE_ERROR, /* Init to INTERFACE_ERROR */ - DEVICE_ID_PANEL_BACK, /* Device ID */ - CMD_LED_ON, /* Command */ - 0, /* not used */ - 0); /* not used */ -} - -static int led_off(void) -{ - return dell_led_perform_fn(3, /* Length of command */ - INTERFACE_ERROR, /* Init to INTERFACE_ERROR */ - DEVICE_ID_PANEL_BACK, /* Device ID */ - CMD_LED_OFF, /* Command */ - 0, /* not used */ - 0); /* not used */ -} - -static int led_blink(unsigned char on_eighths, - unsigned char off_eighths) -{ - return dell_led_perform_fn(5, /* Length of command */ - INTERFACE_ERROR, /* Init to INTERFACE_ERROR */ - DEVICE_ID_PANEL_BACK, /* Device ID */ - CMD_LED_BLINK, /* Command */ - on_eighths, /* blink on in eigths of a second */ - off_eighths); /* blink off in eights of a second */ -} - -static void dell_led_set(struct led_classdev *led_cdev, - enum led_brightness value) -{ - if (value == LED_OFF) - led_off(); - else - led_on(); -} - -static int dell_led_blink(struct led_classdev *led_cdev, - unsigned long *delay_on, - unsigned long *delay_off) -{ - unsigned long on_eighths; - unsigned long off_eighths; - - /* The Dell LED delay is based on 125ms intervals. - Need to round up to next interval. */ - - on_eighths = (*delay_on + 124) / 125; - if (0 == on_eighths) - on_eighths = 1; - if (on_eighths > 255) - on_eighths = 255; - *delay_on = on_eighths * 125; - - off_eighths = (*delay_off + 124) / 125; - if (0 == off_eighths) - off_eighths = 1; - if (off_eighths > 255) - off_eighths = 255; - *delay_off = off_eighths * 125; - - led_blink(on_eighths, off_eighths); - - return 0; -} - -static struct led_classdev dell_led = { - .name = "dell::lid", - .brightness = LED_OFF, - .max_brightness = 1, - .brightness_set = dell_led_set, - .blink_set = dell_led_blink, - .flags = LED_CORE_SUSPENDRESUME, -}; - -static int __init dell_led_init(void) -{ - int error = 0; - - if (!wmi_has_guid(DELL_LED_BIOS_GUID)) - return -ENODEV; - - error = led_off(); - if (error != 0) - return -ENODEV; - - return led_classdev_register(NULL, &dell_led); -} - -static void __exit dell_led_exit(void) -{ - led_classdev_unregister(&dell_led); - - led_off(); -} - -module_init(dell_led_init); -module_exit(dell_led_exit); diff --git a/trunk/drivers/leds/led-class.c b/trunk/drivers/leds/led-class.c index 69e7d86a5143..782f95822eab 100644 --- a/trunk/drivers/leds/led-class.c +++ b/trunk/drivers/leds/led-class.c @@ -72,14 +72,11 @@ static ssize_t led_max_brightness_show(struct device *dev, return sprintf(buf, "%u\n", led_cdev->max_brightness); } -static struct device_attribute led_class_attrs[] = { - __ATTR(brightness, 0644, led_brightness_show, led_brightness_store), - __ATTR(max_brightness, 0644, led_max_brightness_show, NULL), +static DEVICE_ATTR(brightness, 0644, led_brightness_show, led_brightness_store); +static DEVICE_ATTR(max_brightness, 0444, led_max_brightness_show, NULL); #ifdef CONFIG_LEDS_TRIGGERS - __ATTR(trigger, 0644, led_trigger_show, led_trigger_store), +static DEVICE_ATTR(trigger, 0644, led_trigger_show, led_trigger_store); #endif - __ATTR_NULL, -}; /** * led_classdev_suspend - suspend an led_classdev. @@ -130,11 +127,18 @@ static int led_resume(struct device *dev) */ int led_classdev_register(struct device *parent, struct led_classdev *led_cdev) { + int rc; + led_cdev->dev = device_create(leds_class, parent, 0, led_cdev, "%s", led_cdev->name); if (IS_ERR(led_cdev->dev)) return PTR_ERR(led_cdev->dev); + /* register the attributes */ + rc = device_create_file(led_cdev->dev, &dev_attr_brightness); + if (rc) + goto err_out; + #ifdef CONFIG_LEDS_TRIGGERS init_rwsem(&led_cdev->trigger_lock); #endif @@ -146,18 +150,36 @@ int led_classdev_register(struct device *parent, struct led_classdev *led_cdev) if (!led_cdev->max_brightness) led_cdev->max_brightness = LED_FULL; + rc = device_create_file(led_cdev->dev, &dev_attr_max_brightness); + if (rc) + goto err_out_attr_max; + led_update_brightness(led_cdev); #ifdef CONFIG_LEDS_TRIGGERS + rc = device_create_file(led_cdev->dev, &dev_attr_trigger); + if (rc) + goto err_out_led_list; + led_trigger_set_default(led_cdev); #endif - printk(KERN_DEBUG "Registered led device: %s\n", + printk(KERN_INFO "Registered led device: %s\n", led_cdev->name); return 0; -} +#ifdef CONFIG_LEDS_TRIGGERS +err_out_led_list: + device_remove_file(led_cdev->dev, &dev_attr_max_brightness); +#endif +err_out_attr_max: + device_remove_file(led_cdev->dev, &dev_attr_brightness); + list_del(&led_cdev->node); +err_out: + device_unregister(led_cdev->dev); + return rc; +} EXPORT_SYMBOL_GPL(led_classdev_register); /** @@ -168,7 +190,10 @@ EXPORT_SYMBOL_GPL(led_classdev_register); */ void led_classdev_unregister(struct led_classdev *led_cdev) { + device_remove_file(led_cdev->dev, &dev_attr_max_brightness); + device_remove_file(led_cdev->dev, &dev_attr_brightness); #ifdef CONFIG_LEDS_TRIGGERS + device_remove_file(led_cdev->dev, &dev_attr_trigger); down_write(&led_cdev->trigger_lock); if (led_cdev->trigger) led_trigger_set(led_cdev, NULL); @@ -190,7 +215,6 @@ static int __init leds_init(void) return PTR_ERR(leds_class); leds_class->suspend = led_suspend; leds_class->resume = led_resume; - leds_class->dev_attrs = led_class_attrs; return 0; } diff --git a/trunk/drivers/leds/leds-gpio.c b/trunk/drivers/leds/leds-gpio.c index 0823e2622e8c..e5225d28f392 100644 --- a/trunk/drivers/leds/leds-gpio.c +++ b/trunk/drivers/leds/leds-gpio.c @@ -211,6 +211,7 @@ static int __devinit of_gpio_leds_probe(struct of_device *ofdev, const struct of_device_id *match) { struct device_node *np = ofdev->node, *child; + struct gpio_led led; struct gpio_led_of_platform_data *pdata; int count = 0, ret; @@ -225,8 +226,8 @@ static int __devinit of_gpio_leds_probe(struct of_device *ofdev, if (!pdata) return -ENOMEM; + memset(&led, 0, sizeof(led)); for_each_child_of_node(np, child) { - struct gpio_led led = {}; enum of_gpio_flags flags; const char *state; diff --git a/trunk/drivers/leds/leds-ss4200.c b/trunk/drivers/leds/leds-ss4200.c index 51477ec71391..97f04984c1ca 100644 --- a/trunk/drivers/leds/leds-ss4200.c +++ b/trunk/drivers/leds/leds-ss4200.c @@ -63,7 +63,7 @@ MODULE_LICENSE("GPL"); /* * PCI ID of the Intel ICH7 LPC Device within which the GPIO block lives. */ -static const struct pci_device_id ich7_lpc_pci_id[] = +static struct pci_device_id ich7_lpc_pci_id[] = { { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_0) }, { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_1) }, diff --git a/trunk/drivers/macintosh/via-pmu-backlight.c b/trunk/drivers/macintosh/via-pmu-backlight.c index 1cec02f6c431..4f3c4479c16a 100644 --- a/trunk/drivers/macintosh/via-pmu-backlight.c +++ b/trunk/drivers/macintosh/via-pmu-backlight.c @@ -144,7 +144,6 @@ void pmu_backlight_set_sleep(int sleep) void __init pmu_backlight_init() { - struct backlight_properties props; struct backlight_device *bd; char name[10]; int level, autosave; @@ -162,15 +161,13 @@ void __init pmu_backlight_init() snprintf(name, sizeof(name), "pmubl"); - memset(&props, 0, sizeof(struct backlight_properties)); - props.max_brightness = FB_BACKLIGHT_LEVELS - 1; - bd = backlight_device_register(name, NULL, NULL, &pmu_backlight_data, - &props); + bd = backlight_device_register(name, NULL, NULL, &pmu_backlight_data); if (IS_ERR(bd)) { printk(KERN_ERR "PMU Backlight registration failed\n"); return; } uses_pmu_bl = 1; + bd->props.max_brightness = FB_BACKLIGHT_LEVELS - 1; pmu_backlight_init_curve(0x7F, 0x46, 0x0E); level = bd->props.max_brightness; diff --git a/trunk/drivers/md/linear.c b/trunk/drivers/md/linear.c index bb2a23159b21..af2d39d603c7 100644 --- a/trunk/drivers/md/linear.c +++ b/trunk/drivers/md/linear.c @@ -172,14 +172,12 @@ static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks) disk_stack_limits(mddev->gendisk, rdev->bdev, rdev->data_offset << 9); /* as we don't honour merge_bvec_fn, we must never risk - * violating it, so limit max_segments to 1 lying within - * a single page. + * violating it, so limit ->max_sector to one PAGE, as + * a one page request is never in violation. */ - if (rdev->bdev->bd_disk->queue->merge_bvec_fn) { - blk_queue_max_segments(mddev->queue, 1); - blk_queue_segment_boundary(mddev->queue, - PAGE_CACHE_SIZE - 1); - } + if (rdev->bdev->bd_disk->queue->merge_bvec_fn && + queue_max_sectors(mddev->queue) > (PAGE_SIZE>>9)) + blk_queue_max_hw_sectors(mddev->queue, PAGE_SIZE>>9); conf->array_sectors += rdev->sectors; cnt++; diff --git a/trunk/drivers/md/multipath.c b/trunk/drivers/md/multipath.c index 5558ebc705c8..4b323f45ad74 100644 --- a/trunk/drivers/md/multipath.c +++ b/trunk/drivers/md/multipath.c @@ -301,16 +301,14 @@ static int multipath_add_disk(mddev_t *mddev, mdk_rdev_t *rdev) rdev->data_offset << 9); /* as we don't honour merge_bvec_fn, we must never risk - * violating it, so limit ->max_segments to one, lying - * within a single page. + * violating it, so limit ->max_sector to one PAGE, as + * a one page request is never in violation. * (Note: it is very unlikely that a device with * merge_bvec_fn will be involved in multipath.) */ - if (q->merge_bvec_fn) { - blk_queue_max_segments(mddev->queue, 1); - blk_queue_segment_boundary(mddev->queue, - PAGE_CACHE_SIZE - 1); - } + if (q->merge_bvec_fn && + queue_max_sectors(q) > (PAGE_SIZE>>9)) + blk_queue_max_hw_sectors(mddev->queue, PAGE_SIZE>>9); conf->working_disks++; mddev->degraded--; @@ -478,11 +476,9 @@ static int multipath_run (mddev_t *mddev) /* as we don't honour merge_bvec_fn, we must never risk * violating it, not that we ever expect a device with * a merge_bvec_fn to be involved in multipath */ - if (rdev->bdev->bd_disk->queue->merge_bvec_fn) { - blk_queue_max_segments(mddev->queue, 1); - blk_queue_segment_boundary(mddev->queue, - PAGE_CACHE_SIZE - 1); - } + if (rdev->bdev->bd_disk->queue->merge_bvec_fn && + queue_max_sectors(mddev->queue) > (PAGE_SIZE>>9)) + blk_queue_max_hw_sectors(mddev->queue, PAGE_SIZE>>9); if (!test_bit(Faulty, &rdev->flags)) conf->working_disks++; diff --git a/trunk/drivers/md/raid0.c b/trunk/drivers/md/raid0.c index 377cf2a3c333..a1f7147b757f 100644 --- a/trunk/drivers/md/raid0.c +++ b/trunk/drivers/md/raid0.c @@ -176,15 +176,14 @@ static int create_strip_zones(mddev_t *mddev) disk_stack_limits(mddev->gendisk, rdev1->bdev, rdev1->data_offset << 9); /* as we don't honour merge_bvec_fn, we must never risk - * violating it, so limit ->max_segments to 1, lying within - * a single page. + * violating it, so limit ->max_sector to one PAGE, as + * a one page request is never in violation. */ - if (rdev1->bdev->bd_disk->queue->merge_bvec_fn) { - blk_queue_max_segments(mddev->queue, 1); - blk_queue_segment_boundary(mddev->queue, - PAGE_CACHE_SIZE - 1); - } + if (rdev1->bdev->bd_disk->queue->merge_bvec_fn && + queue_max_sectors(mddev->queue) > (PAGE_SIZE>>9)) + blk_queue_max_hw_sectors(mddev->queue, PAGE_SIZE>>9); + if (!smallest || (rdev1->sectors < smallest->sectors)) smallest = rdev1; cnt++; diff --git a/trunk/drivers/md/raid1.c b/trunk/drivers/md/raid1.c index f741f77eeb2b..5a06122abd3b 100644 --- a/trunk/drivers/md/raid1.c +++ b/trunk/drivers/md/raid1.c @@ -1152,17 +1152,13 @@ static int raid1_add_disk(mddev_t *mddev, mdk_rdev_t *rdev) disk_stack_limits(mddev->gendisk, rdev->bdev, rdev->data_offset << 9); - /* as we don't honour merge_bvec_fn, we must - * never risk violating it, so limit - * ->max_segments to one lying with a single - * page, as a one page request is never in - * violation. + /* as we don't honour merge_bvec_fn, we must never risk + * violating it, so limit ->max_sector to one PAGE, as + * a one page request is never in violation. */ - if (rdev->bdev->bd_disk->queue->merge_bvec_fn) { - blk_queue_max_segments(mddev->queue, 1); - blk_queue_segment_boundary(mddev->queue, - PAGE_CACHE_SIZE - 1); - } + if (rdev->bdev->bd_disk->queue->merge_bvec_fn && + queue_max_sectors(mddev->queue) > (PAGE_SIZE>>9)) + blk_queue_max_hw_sectors(mddev->queue, PAGE_SIZE>>9); p->head_position = 0; rdev->raid_disk = mirror; @@ -2102,14 +2098,12 @@ static int run(mddev_t *mddev) disk_stack_limits(mddev->gendisk, rdev->bdev, rdev->data_offset << 9); /* as we don't honour merge_bvec_fn, we must never risk - * violating it, so limit ->max_segments to 1 lying within - * a single page, as a one page request is never in violation. + * violating it, so limit ->max_sector to one PAGE, as + * a one page request is never in violation. */ - if (rdev->bdev->bd_disk->queue->merge_bvec_fn) { - blk_queue_max_segments(mddev->queue, 1); - blk_queue_segment_boundary(mddev->queue, - PAGE_CACHE_SIZE - 1); - } + if (rdev->bdev->bd_disk->queue->merge_bvec_fn && + queue_max_sectors(mddev->queue) > (PAGE_SIZE>>9)) + blk_queue_max_hw_sectors(mddev->queue, PAGE_SIZE>>9); } mddev->degraded = 0; diff --git a/trunk/drivers/md/raid10.c b/trunk/drivers/md/raid10.c index b4ba41ecbd20..7584f9ab9bcf 100644 --- a/trunk/drivers/md/raid10.c +++ b/trunk/drivers/md/raid10.c @@ -1155,17 +1155,13 @@ static int raid10_add_disk(mddev_t *mddev, mdk_rdev_t *rdev) disk_stack_limits(mddev->gendisk, rdev->bdev, rdev->data_offset << 9); - /* as we don't honour merge_bvec_fn, we must - * never risk violating it, so limit - * ->max_segments to one lying with a single - * page, as a one page request is never in - * violation. + /* as we don't honour merge_bvec_fn, we must never risk + * violating it, so limit ->max_sector to one PAGE, as + * a one page request is never in violation. */ - if (rdev->bdev->bd_disk->queue->merge_bvec_fn) { - blk_queue_max_segments(mddev->queue, 1); - blk_queue_segment_boundary(mddev->queue, - PAGE_CACHE_SIZE - 1); - } + if (rdev->bdev->bd_disk->queue->merge_bvec_fn && + queue_max_sectors(mddev->queue) > (PAGE_SIZE>>9)) + blk_queue_max_hw_sectors(mddev->queue, PAGE_SIZE>>9); p->head_position = 0; rdev->raid_disk = mirror; @@ -2259,14 +2255,12 @@ static int run(mddev_t *mddev) disk_stack_limits(mddev->gendisk, rdev->bdev, rdev->data_offset << 9); /* as we don't honour merge_bvec_fn, we must never risk - * violating it, so limit max_segments to 1 lying - * within a single page. + * violating it, so limit ->max_sector to one PAGE, as + * a one page request is never in violation. */ - if (rdev->bdev->bd_disk->queue->merge_bvec_fn) { - blk_queue_max_segments(mddev->queue, 1); - blk_queue_segment_boundary(mddev->queue, - PAGE_CACHE_SIZE - 1); - } + if (rdev->bdev->bd_disk->queue->merge_bvec_fn && + queue_max_sectors(mddev->queue) > (PAGE_SIZE>>9)) + blk_queue_max_hw_sectors(mddev->queue, PAGE_SIZE>>9); disk->head_position = 0; } diff --git a/trunk/drivers/media/IR/ir-keytable.c b/trunk/drivers/media/IR/ir-keytable.c index 0a3b4ed38e48..0903f539bf68 100644 --- a/trunk/drivers/media/IR/ir-keytable.c +++ b/trunk/drivers/media/IR/ir-keytable.c @@ -123,7 +123,7 @@ static int ir_copy_table(struct ir_scancode_table *destin, * If the key is not found, returns -EINVAL, otherwise, returns 0. */ static int ir_getkeycode(struct input_dev *dev, - unsigned int scancode, unsigned int *keycode) + int scancode, int *keycode) { int elem; struct ir_input_dev *ir_dev = input_get_drvdata(dev); @@ -291,7 +291,7 @@ static int ir_insert_key(struct ir_scancode_table *rc_tab, * If the key is not found, returns -EINVAL, otherwise, returns 0. */ static int ir_setkeycode(struct input_dev *dev, - unsigned int scancode, unsigned int keycode) + int scancode, int keycode) { int rc = 0; struct ir_input_dev *ir_dev = input_get_drvdata(dev); diff --git a/trunk/drivers/media/dvb/dvb-usb/dvb-usb-remote.c b/trunk/drivers/media/dvb/dvb-usb/dvb-usb-remote.c index 852fe89539cf..a03ef7efec9a 100644 --- a/trunk/drivers/media/dvb/dvb-usb/dvb-usb-remote.c +++ b/trunk/drivers/media/dvb/dvb-usb/dvb-usb-remote.c @@ -9,7 +9,7 @@ #include static int dvb_usb_getkeycode(struct input_dev *dev, - unsigned int scancode, unsigned int *keycode) + int scancode, int *keycode) { struct dvb_usb_device *d = input_get_drvdata(dev); @@ -39,7 +39,7 @@ static int dvb_usb_getkeycode(struct input_dev *dev, } static int dvb_usb_setkeycode(struct input_dev *dev, - unsigned int scancode, unsigned int keycode) + int scancode, int keycode) { struct dvb_usb_device *d = input_get_drvdata(dev); diff --git a/trunk/drivers/misc/Kconfig b/trunk/drivers/misc/Kconfig index 2191c8d896a0..d16af6a423fb 100644 --- a/trunk/drivers/misc/Kconfig +++ b/trunk/drivers/misc/Kconfig @@ -268,16 +268,6 @@ config ISL29003 This driver can also be built as a module. If so, the module will be called isl29003. -config SENSORS_TSL2550 - tristate "Taos TSL2550 ambient light sensor" - depends on I2C && SYSFS - help - If you say yes here you get support for the Taos TSL2550 - ambient light sensor. - - This driver can also be built as a module. If so, the module - will be called tsl2550. - config EP93XX_PWM tristate "EP93xx PWM support" depends on ARCH_EP93XX diff --git a/trunk/drivers/misc/Makefile b/trunk/drivers/misc/Makefile index 27c484355414..049ff2482f30 100644 --- a/trunk/drivers/misc/Makefile +++ b/trunk/drivers/misc/Makefile @@ -21,7 +21,6 @@ obj-$(CONFIG_SGI_GRU) += sgi-gru/ obj-$(CONFIG_CS5535_MFGPT) += cs5535-mfgpt.o obj-$(CONFIG_HP_ILO) += hpilo.o obj-$(CONFIG_ISL29003) += isl29003.o -obj-$(CONFIG_SENSORS_TSL2550) += tsl2550.o obj-$(CONFIG_EP93XX_PWM) += ep93xx_pwm.o obj-$(CONFIG_DS1682) += ds1682.o obj-$(CONFIG_TI_DAC7512) += ti_dac7512.o diff --git a/trunk/drivers/misc/eeprom/at24.c b/trunk/drivers/misc/eeprom/at24.c index db7d0f21b65d..2cb2736d65aa 100644 --- a/trunk/drivers/misc/eeprom/at24.c +++ b/trunk/drivers/misc/eeprom/at24.c @@ -505,7 +505,6 @@ static int at24_probe(struct i2c_client *client, const struct i2c_device_id *id) * Export the EEPROM bytes through sysfs, since that's convenient. * By default, only root should see the data (maybe passwords etc) */ - sysfs_bin_attr_init(&at24->bin); at24->bin.attr.name = "eeprom"; at24->bin.attr.mode = chip.flags & AT24_FLAG_IRUGO ? S_IRUGO : S_IRUSR; at24->bin.read = at24_bin_read; diff --git a/trunk/drivers/misc/eeprom/at25.c b/trunk/drivers/misc/eeprom/at25.c index d194212a41f6..d902d81dde39 100644 --- a/trunk/drivers/misc/eeprom/at25.c +++ b/trunk/drivers/misc/eeprom/at25.c @@ -347,7 +347,6 @@ static int at25_probe(struct spi_device *spi) * that's sensitive for read and/or write, like ethernet addresses, * security codes, board-specific manufacturing calibrations, etc. */ - sysfs_bin_attr_init(&at25->bin); at25->bin.attr.name = "eeprom"; at25->bin.attr.mode = S_IRUSR; at25->bin.read = at25_bin_read; diff --git a/trunk/drivers/net/Kconfig b/trunk/drivers/net/Kconfig index 0ba5b8e50a7c..7029cd50c458 100644 --- a/trunk/drivers/net/Kconfig +++ b/trunk/drivers/net/Kconfig @@ -907,7 +907,7 @@ config SMC91X select CRC32 select MII depends on ARM || REDWOOD_5 || REDWOOD_6 || M32R || SUPERH || \ - MIPS || BLACKFIN || MN10300 || COLDFIRE + MIPS || BLACKFIN || MN10300 help This is a driver for SMC's 91x series of Ethernet chipsets, including the SMC91C94 and the SMC91C111. Say Y if you want it diff --git a/trunk/drivers/net/arm/ks8695net.c b/trunk/drivers/net/arm/ks8695net.c index a1d4188c430b..8ca639127dbc 100644 --- a/trunk/drivers/net/arm/ks8695net.c +++ b/trunk/drivers/net/arm/ks8695net.c @@ -575,9 +575,9 @@ static int ks8695_poll(struct napi_struct *napi, int budget) if (work_done < budget) { unsigned long flags; spin_lock_irqsave(&ksp->rx_lock, flags); - __napi_complete(napi); /*enable rx interrupt*/ writel(isr | mask_bit, KS8695_IRQ_VA + KS8695_INTEN); + __napi_complete(napi); spin_unlock_irqrestore(&ksp->rx_lock, flags); } return work_done; diff --git a/trunk/drivers/net/benet/be.h b/trunk/drivers/net/benet/be.h index 8f0752553681..be81fb2d10f7 100644 --- a/trunk/drivers/net/benet/be.h +++ b/trunk/drivers/net/benet/be.h @@ -290,6 +290,11 @@ extern const struct ethtool_ops be_ethtool_ops; #define drvr_stats(adapter) (&adapter->stats.drvr_stats) +static inline unsigned int be_pci_func(struct be_adapter *adapter) +{ + return PCI_FUNC(adapter->pdev->devfn); +} + #define BE_SET_NETDEV_OPS(netdev, ops) (netdev->netdev_ops = ops) #define PAGE_SHIFT_4K 12 diff --git a/trunk/drivers/net/benet/be_cmds.c b/trunk/drivers/net/benet/be_cmds.c index 50e6259b50e4..4b1f80519ca4 100644 --- a/trunk/drivers/net/benet/be_cmds.c +++ b/trunk/drivers/net/benet/be_cmds.c @@ -465,6 +465,8 @@ int be_cmd_eq_create(struct be_adapter *adapter, req->num_pages = cpu_to_le16(PAGES_4K_SPANNED(q_mem->va, q_mem->size)); + AMAP_SET_BITS(struct amap_eq_context, func, req->context, + be_pci_func(adapter)); AMAP_SET_BITS(struct amap_eq_context, valid, req->context, 1); /* 4byte eqe*/ AMAP_SET_BITS(struct amap_eq_context, size, req->context, 0); @@ -627,6 +629,7 @@ int be_cmd_cq_create(struct be_adapter *adapter, AMAP_SET_BITS(struct amap_cq_context, eventable, ctxt, 1); AMAP_SET_BITS(struct amap_cq_context, eqid, ctxt, eq->id); AMAP_SET_BITS(struct amap_cq_context, armed, ctxt, 1); + AMAP_SET_BITS(struct amap_cq_context, func, ctxt, be_pci_func(adapter)); be_dws_cpu_to_le(ctxt, sizeof(req->context)); be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem); @@ -673,8 +676,9 @@ int be_cmd_mccq_create(struct be_adapter *adapter, be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, OPCODE_COMMON_MCC_CREATE, sizeof(*req)); - req->num_pages = cpu_to_le16(PAGES_4K_SPANNED(q_mem->va, q_mem->size)); + req->num_pages = PAGES_4K_SPANNED(q_mem->va, q_mem->size); + AMAP_SET_BITS(struct amap_mcc_context, fid, ctxt, be_pci_func(adapter)); AMAP_SET_BITS(struct amap_mcc_context, valid, ctxt, 1); AMAP_SET_BITS(struct amap_mcc_context, ring_size, ctxt, be_encoded_q_len(mccq->len)); @@ -723,6 +727,8 @@ int be_cmd_txq_create(struct be_adapter *adapter, AMAP_SET_BITS(struct amap_tx_context, tx_ring_size, ctxt, be_encoded_q_len(txq->len)); + AMAP_SET_BITS(struct amap_tx_context, pci_func_id, ctxt, + be_pci_func(adapter)); AMAP_SET_BITS(struct amap_tx_context, ctx_valid, ctxt, 1); AMAP_SET_BITS(struct amap_tx_context, cq_id_send, ctxt, cq->id); diff --git a/trunk/drivers/net/benet/be_hw.h b/trunk/drivers/net/benet/be_hw.h index 2d4a4b827637..5ffb149181ad 100644 --- a/trunk/drivers/net/benet/be_hw.h +++ b/trunk/drivers/net/benet/be_hw.h @@ -114,7 +114,8 @@ #define IMG_TYPE_ISCSI_BACKUP 9 #define IMG_TYPE_FCOE_FW_ACTIVE 10 #define IMG_TYPE_FCOE_FW_BACKUP 11 -#define IMG_TYPE_NCSI_FW 13 +#define IMG_TYPE_NCSI_BITFILE 13 +#define IMG_TYPE_NCSI_8051 14 #define FLASHROM_OPER_FLASH 1 #define FLASHROM_OPER_SAVE 2 @@ -126,7 +127,6 @@ #define FLASH_IMAGE_MAX_SIZE_g3 (2097152) /* Max fw image size */ #define FLASH_BIOS_IMAGE_MAX_SIZE_g3 (524288) /* Max OPTION ROM img sz */ #define FLASH_REDBOOT_IMAGE_MAX_SIZE_g3 (1048576) /* Max Redboot image sz */ -#define FLASH_NCSI_IMAGE_MAX_SIZE_g3 (262144) /* Max NSCI image sz */ #define FLASH_NCSI_MAGIC (0x16032009) #define FLASH_NCSI_DISABLED (0) @@ -144,7 +144,6 @@ #define FLASH_FCoE_BIOS_START_g2 (524288) #define FLASH_REDBOOT_START_g2 (0) -#define FLASH_NCSI_START_g3 (15990784) #define FLASH_iSCSI_PRIMARY_IMAGE_START_g3 (2097152) #define FLASH_iSCSI_BACKUP_IMAGE_START_g3 (4194304) #define FLASH_FCoE_PRIMARY_IMAGE_START_g3 (6291456) diff --git a/trunk/drivers/net/benet/be_main.c b/trunk/drivers/net/benet/be_main.c index 43e8032f9236..a703ed8e24fe 100644 --- a/trunk/drivers/net/benet/be_main.c +++ b/trunk/drivers/net/benet/be_main.c @@ -1382,7 +1382,7 @@ static int be_rx_queues_create(struct be_adapter *adapter) /* There are 8 evt ids per func. Retruns the evt id's bit number */ static inline int be_evt_bit_get(struct be_adapter *adapter, u32 eq_id) { - return eq_id % 8; + return eq_id - 8 * be_pci_func(adapter); } static irqreturn_t be_intx(int irq, void *dev) @@ -1880,9 +1880,8 @@ static int be_flash_data(struct be_adapter *adapter, const u8 *p = fw->data; struct be_cmd_write_flashrom *req = flash_cmd->va; struct flash_comp *pflashcomp; - int num_comp; - struct flash_comp gen3_flash_types[9] = { + struct flash_comp gen3_flash_types[8] = { { FLASH_iSCSI_PRIMARY_IMAGE_START_g3, IMG_TYPE_ISCSI_ACTIVE, FLASH_IMAGE_MAX_SIZE_g3}, { FLASH_REDBOOT_START_g3, IMG_TYPE_REDBOOT, @@ -1898,9 +1897,7 @@ static int be_flash_data(struct be_adapter *adapter, { FLASH_FCoE_PRIMARY_IMAGE_START_g3, IMG_TYPE_FCOE_FW_ACTIVE, FLASH_IMAGE_MAX_SIZE_g3}, { FLASH_FCoE_BACKUP_IMAGE_START_g3, IMG_TYPE_FCOE_FW_BACKUP, - FLASH_IMAGE_MAX_SIZE_g3}, - { FLASH_NCSI_START_g3, IMG_TYPE_NCSI_FW, - FLASH_NCSI_IMAGE_MAX_SIZE_g3} + FLASH_IMAGE_MAX_SIZE_g3} }; struct flash_comp gen2_flash_types[8] = { { FLASH_iSCSI_PRIMARY_IMAGE_START_g2, IMG_TYPE_ISCSI_ACTIVE, @@ -1924,16 +1921,11 @@ static int be_flash_data(struct be_adapter *adapter, if (adapter->generation == BE_GEN3) { pflashcomp = gen3_flash_types; filehdr_size = sizeof(struct flash_file_hdr_g3); - num_comp = 9; } else { pflashcomp = gen2_flash_types; filehdr_size = sizeof(struct flash_file_hdr_g2); - num_comp = 8; } - for (i = 0; i < num_comp; i++) { - if ((pflashcomp[i].optype == IMG_TYPE_NCSI_FW) && - memcmp(adapter->fw_ver, "3.102.148.0", 11) < 0) - continue; + for (i = 0; i < 8; i++) { if ((pflashcomp[i].optype == IMG_TYPE_REDBOOT) && (!be_flash_redboot(adapter, fw->data, pflashcomp[i].offset, pflashcomp[i].size, @@ -1993,7 +1985,16 @@ int be_load_fw(struct be_adapter *adapter, u8 *func) struct be_dma_mem flash_cmd; int status, i = 0; const u8 *p; + char fw_ver[FW_VER_LEN]; + char fw_cfg; + + status = be_cmd_get_fw_ver(adapter, fw_ver); + if (status) + return status; + fw_cfg = *(fw_ver + 2); + if (fw_cfg == '0') + fw_cfg = '1'; strcpy(fw_file, func); status = request_firmware(&fw, fw_file, &adapter->pdev->dev); diff --git a/trunk/drivers/net/bnx2x_main.c b/trunk/drivers/net/bnx2x_main.c index 6c042a72d6cc..ed785a30e98b 100644 --- a/trunk/drivers/net/bnx2x_main.c +++ b/trunk/drivers/net/bnx2x_main.c @@ -893,6 +893,7 @@ static inline u16 bnx2x_tx_avail(struct bnx2x_fastpath *fp) u16 prod; u16 cons; + barrier(); /* Tell compiler that prod and cons can change */ prod = fp->tx_bd_prod; cons = fp->tx_bd_cons; @@ -962,7 +963,7 @@ static int bnx2x_tx_int(struct bnx2x_fastpath *fp) * start_xmit() will miss it and cause the queue to be stopped * forever. */ - smp_mb(); + smp_wmb(); /* TBD need a thresh? */ if (unlikely(netif_tx_queue_stopped(txq))) { @@ -11428,12 +11429,9 @@ static netdev_tx_t bnx2x_start_xmit(struct sk_buff *skb, struct net_device *dev) if (unlikely(bnx2x_tx_avail(fp) < MAX_SKB_FRAGS + 3)) { netif_tx_stop_queue(txq); - - /* paired memory barrier is in bnx2x_tx_int(), we have to keep - * ordering of set_bit() in netif_tx_stop_queue() and read of - * fp->bd_tx_cons */ + /* We want bnx2x_tx_int to "see" the updated tx_bd_prod + if we put Tx into XOFF state. */ smp_mb(); - fp->eth_q_stats.driver_xoff++; if (bnx2x_tx_avail(fp) >= MAX_SKB_FRAGS + 3) netif_tx_wake_queue(txq); diff --git a/trunk/drivers/net/can/bfin_can.c b/trunk/drivers/net/can/bfin_can.c index 866905fa4119..bf7f9ba2d903 100644 --- a/trunk/drivers/net/can/bfin_can.c +++ b/trunk/drivers/net/can/bfin_can.c @@ -26,7 +26,6 @@ #define DRV_NAME "bfin_can" #define BFIN_CAN_TIMEOUT 100 -#define TX_ECHO_SKB_MAX 1 /* * transmit and receive channels @@ -594,7 +593,7 @@ struct net_device *alloc_bfin_candev(void) struct net_device *dev; struct bfin_can_priv *priv; - dev = alloc_candev(sizeof(*priv), TX_ECHO_SKB_MAX); + dev = alloc_candev(sizeof(*priv)); if (!dev) return NULL; diff --git a/trunk/drivers/net/can/usb/ems_usb.c b/trunk/drivers/net/can/usb/ems_usb.c index 33451092b8e8..11c87840cc00 100644 --- a/trunk/drivers/net/can/usb/ems_usb.c +++ b/trunk/drivers/net/can/usb/ems_usb.c @@ -876,7 +876,9 @@ static netdev_tx_t ems_usb_start_xmit(struct sk_buff *skb, struct net_device *ne return NETDEV_TX_OK; nomem: - dev_kfree_skb(skb); + if (skb) + dev_kfree_skb(skb); + stats->tx_dropped++; return NETDEV_TX_OK; diff --git a/trunk/drivers/net/cassini.c b/trunk/drivers/net/cassini.c index 9bd155e4111c..7cbcfb0ade1c 100644 --- a/trunk/drivers/net/cassini.c +++ b/trunk/drivers/net/cassini.c @@ -5072,7 +5072,7 @@ static int __devinit cas_init_one(struct pci_dev *pdev, INIT_WORK(&cp->reset_task, cas_reset_task); /* Default link parameters */ - if (link_mode >= 0 && link_mode < 6) + if (link_mode >= 0 && link_mode <= 6) cp->link_cntl = link_modes[link_mode]; else cp->link_cntl = BMCR_ANENABLE; diff --git a/trunk/drivers/net/cpmac.c b/trunk/drivers/net/cpmac.c index 60777fd90b33..b85c81f60d10 100644 --- a/trunk/drivers/net/cpmac.c +++ b/trunk/drivers/net/cpmac.c @@ -28,7 +28,6 @@ #include #include -#include #include #include #include @@ -56,9 +55,9 @@ module_param(dumb_switch, int, 0444); MODULE_PARM_DESC(debug_level, "Number of NETIF_MSG bits to enable"); MODULE_PARM_DESC(dumb_switch, "Assume switch is not connected to MDIO bus"); -#define CPMAC_VERSION "0.5.2" -/* frame size + 802.1q tag + FCS size */ -#define CPMAC_SKB_SIZE (ETH_FRAME_LEN + ETH_FCS_LEN + VLAN_HLEN) +#define CPMAC_VERSION "0.5.1" +/* frame size + 802.1q tag */ +#define CPMAC_SKB_SIZE (ETH_FRAME_LEN + 4) #define CPMAC_QUEUES 8 /* Ethernet registers */ @@ -1137,9 +1136,8 @@ static int __devinit cpmac_probe(struct platform_device *pdev) } if (phy_id == PHY_MAX_ADDR) { - dev_err(&pdev->dev, "no PHY present, falling back to switch on MDIO bus 0\n"); - strncpy(mdio_bus_id, "0", MII_BUS_ID_SIZE); /* fixed phys bus */ - phy_id = pdev->id; + dev_err(&pdev->dev, "no PHY present\n"); + return -ENODEV; } dev = alloc_etherdev_mq(sizeof(*priv), CPMAC_QUEUES); @@ -1292,8 +1290,8 @@ void __devexit cpmac_exit(void) { platform_driver_unregister(&cpmac_driver); mdiobus_unregister(cpmac_mii); - iounmap(cpmac_mii->priv); mdiobus_free(cpmac_mii); + iounmap(cpmac_mii->priv); } module_init(cpmac_init); diff --git a/trunk/drivers/net/cxgb3/cxgb3_main.c b/trunk/drivers/net/cxgb3/cxgb3_main.c index 9e3e8750b46a..3e453e1d97e7 100644 --- a/trunk/drivers/net/cxgb3/cxgb3_main.c +++ b/trunk/drivers/net/cxgb3/cxgb3_main.c @@ -1294,7 +1294,6 @@ static void cxgb_down(struct adapter *adapter) free_irq_resources(adapter); quiesce_rx(adapter); - t3_sge_stop(adapter); flush_workqueue(cxgb3_wq); /* wait for external IRQ handler */ } diff --git a/trunk/drivers/net/davinci_emac.c b/trunk/drivers/net/davinci_emac.c index 2b8edd2efbf6..13f9869927e3 100644 --- a/trunk/drivers/net/davinci_emac.c +++ b/trunk/drivers/net/davinci_emac.c @@ -29,6 +29,10 @@ * PHY layer usage */ +/** Pending Items in this driver: + * 1. Use Linux cache infrastcture for DMA'ed memory (dma_xxx functions) + */ + #include #include #include @@ -500,6 +504,12 @@ static unsigned long mdio_max_freq; /* Cache macros - Packet buffers would be from skb pool which is cached */ #define EMAC_VIRT_NOCACHE(addr) (addr) +#define EMAC_CACHE_INVALIDATE(addr, size) \ + dma_cache_maint((void *)addr, size, DMA_FROM_DEVICE) +#define EMAC_CACHE_WRITEBACK(addr, size) \ + dma_cache_maint((void *)addr, size, DMA_TO_DEVICE) +#define EMAC_CACHE_WRITEBACK_INVALIDATE(addr, size) \ + dma_cache_maint((void *)addr, size, DMA_BIDIRECTIONAL) /* DM644x does not have BD's in cached memory - so no cache functions */ #define BD_CACHE_INVALIDATE(addr, size) @@ -1225,10 +1235,6 @@ static void emac_txch_teardown(struct emac_priv *priv, u32 ch) if (1 == txch->queue_active) { curr_bd = txch->active_queue_head; while (curr_bd != NULL) { - dma_unmap_single(emac_dev, curr_bd->buff_ptr, - curr_bd->off_b_len & EMAC_RX_BD_BUF_SIZE, - DMA_TO_DEVICE); - emac_net_tx_complete(priv, (void __force *) &curr_bd->buf_token, 1, ch); if (curr_bd != txch->active_queue_tail) @@ -1321,11 +1327,6 @@ static int emac_tx_bdproc(struct emac_priv *priv, u32 ch, u32 budget) txch->queue_active = 0; /* end of queue */ } } - - dma_unmap_single(emac_dev, curr_bd->buff_ptr, - curr_bd->off_b_len & EMAC_RX_BD_BUF_SIZE, - DMA_TO_DEVICE); - *tx_complete_ptr = (u32) curr_bd->buf_token; ++tx_complete_ptr; ++tx_complete_cnt; @@ -1386,8 +1387,8 @@ static int emac_send(struct emac_priv *priv, struct emac_netpktobj *pkt, u32 ch) txch->bd_pool_head = curr_bd->next; curr_bd->buf_token = buf_list->buf_token; - curr_bd->buff_ptr = dma_map_single(&priv->ndev->dev, buf_list->data_ptr, - buf_list->length, DMA_TO_DEVICE); + /* FIXME buff_ptr = dma_map_single(... data_ptr ...) */ + curr_bd->buff_ptr = virt_to_phys(buf_list->data_ptr); curr_bd->off_b_len = buf_list->length; curr_bd->h_next = 0; curr_bd->next = NULL; @@ -1467,6 +1468,7 @@ static int emac_dev_xmit(struct sk_buff *skb, struct net_device *ndev) tx_buf.length = skb->len; tx_buf.buf_token = (void *)skb; tx_buf.data_ptr = skb->data; + EMAC_CACHE_WRITEBACK((unsigned long)skb->data, skb->len); ndev->trans_start = jiffies; ret_code = emac_send(priv, &tx_packet, EMAC_DEF_TX_CH); if (unlikely(ret_code != 0)) { @@ -1541,6 +1543,7 @@ static void *emac_net_alloc_rx_buf(struct emac_priv *priv, int buf_size, p_skb->dev = ndev; skb_reserve(p_skb, NET_IP_ALIGN); *data_token = (void *) p_skb; + EMAC_CACHE_WRITEBACK_INVALIDATE((unsigned long)p_skb->data, buf_size); return p_skb->data; } @@ -1609,8 +1612,8 @@ static int emac_init_rxch(struct emac_priv *priv, u32 ch, char *param) /* populate the hardware descriptor */ curr_bd->h_next = emac_virt_to_phys(rxch->active_queue_head, priv); - curr_bd->buff_ptr = dma_map_single(emac_dev, curr_bd->data_ptr, - rxch->buf_size, DMA_FROM_DEVICE); + /* FIXME buff_ptr = dma_map_single(... data_ptr ...) */ + curr_bd->buff_ptr = virt_to_phys(curr_bd->data_ptr); curr_bd->off_b_len = rxch->buf_size; curr_bd->mode = EMAC_CPPI_OWNERSHIP_BIT; @@ -1694,12 +1697,6 @@ static void emac_cleanup_rxch(struct emac_priv *priv, u32 ch) curr_bd = rxch->active_queue_head; while (curr_bd) { if (curr_bd->buf_token) { - dma_unmap_single(&priv->ndev->dev, - curr_bd->buff_ptr, - curr_bd->off_b_len - & EMAC_RX_BD_BUF_SIZE, - DMA_FROM_DEVICE); - dev_kfree_skb_any((struct sk_buff *)\ curr_bd->buf_token); } @@ -1874,8 +1871,8 @@ static void emac_addbd_to_rx_queue(struct emac_priv *priv, u32 ch, /* populate the hardware descriptor */ curr_bd->h_next = 0; - curr_bd->buff_ptr = dma_map_single(&priv->ndev->dev, buffer, - rxch->buf_size, DMA_FROM_DEVICE); + /* FIXME buff_ptr = dma_map_single(... buffer ...) */ + curr_bd->buff_ptr = virt_to_phys(buffer); curr_bd->off_b_len = rxch->buf_size; curr_bd->mode = EMAC_CPPI_OWNERSHIP_BIT; curr_bd->next = NULL; @@ -1930,6 +1927,7 @@ static int emac_net_rx_cb(struct emac_priv *priv, p_skb = (struct sk_buff *)net_pkt_list->pkt_token; /* set length of packet */ skb_put(p_skb, net_pkt_list->pkt_length); + EMAC_CACHE_INVALIDATE((unsigned long)p_skb->data, p_skb->len); p_skb->protocol = eth_type_trans(p_skb, priv->ndev); netif_receive_skb(p_skb); priv->net_dev_stats.rx_bytes += net_pkt_list->pkt_length; @@ -1992,11 +1990,6 @@ static int emac_rx_bdproc(struct emac_priv *priv, u32 ch, u32 budget) rx_buf_obj->data_ptr = (char *)curr_bd->data_ptr; rx_buf_obj->length = curr_bd->off_b_len & EMAC_RX_BD_BUF_SIZE; rx_buf_obj->buf_token = curr_bd->buf_token; - - dma_unmap_single(&priv->ndev->dev, curr_bd->buff_ptr, - curr_bd->off_b_len & EMAC_RX_BD_BUF_SIZE, - DMA_FROM_DEVICE); - curr_pkt->pkt_token = curr_pkt->buf_list->buf_token; curr_pkt->num_bufs = 1; curr_pkt->pkt_length = @@ -2392,7 +2385,7 @@ static int emac_dev_open(struct net_device *ndev) struct emac_priv *priv = netdev_priv(ndev); netif_carrier_off(ndev); - for (cnt = 0; cnt < ETH_ALEN; cnt++) + for (cnt = 0; cnt <= ETH_ALEN; cnt++) ndev->dev_addr[cnt] = priv->mac_addr[cnt]; /* Configuration items */ @@ -2827,37 +2820,31 @@ static int __devexit davinci_emac_remove(struct platform_device *pdev) return 0; } -static int davinci_emac_suspend(struct device *dev) +static +int davinci_emac_suspend(struct platform_device *pdev, pm_message_t state) { - struct platform_device *pdev = to_platform_device(dev); - struct net_device *ndev = platform_get_drvdata(pdev); + struct net_device *dev = platform_get_drvdata(pdev); - if (netif_running(ndev)) - emac_dev_stop(ndev); + if (netif_running(dev)) + emac_dev_stop(dev); clk_disable(emac_clk); return 0; } -static int davinci_emac_resume(struct device *dev) +static int davinci_emac_resume(struct platform_device *pdev) { - struct platform_device *pdev = to_platform_device(dev); - struct net_device *ndev = platform_get_drvdata(pdev); + struct net_device *dev = platform_get_drvdata(pdev); clk_enable(emac_clk); - if (netif_running(ndev)) - emac_dev_open(ndev); + if (netif_running(dev)) + emac_dev_open(dev); return 0; } -static const struct dev_pm_ops davinci_emac_pm_ops = { - .suspend = davinci_emac_suspend, - .resume = davinci_emac_resume, -}; - /** * davinci_emac_driver: EMAC platform driver structure */ @@ -2865,10 +2852,11 @@ static struct platform_driver davinci_emac_driver = { .driver = { .name = "davinci_emac", .owner = THIS_MODULE, - .pm = &davinci_emac_pm_ops, }, .probe = davinci_emac_probe, .remove = __devexit_p(davinci_emac_remove), + .suspend = davinci_emac_suspend, + .resume = davinci_emac_resume, }; /** diff --git a/trunk/drivers/net/e100.c b/trunk/drivers/net/e100.c index b997e578e58f..a26ccab057d5 100644 --- a/trunk/drivers/net/e100.c +++ b/trunk/drivers/net/e100.c @@ -2858,7 +2858,7 @@ static int __devinit e100_probe(struct pci_dev *pdev, } nic->cbs_pool = pci_pool_create(netdev->name, nic->pdev, - nic->params.cbs.max * sizeof(struct cb), + nic->params.cbs.count * sizeof(struct cb), sizeof(u32), 0); DPRINTK(PROBE, INFO, "addr 0x%llx, irq %d, MAC addr %pM\n", diff --git a/trunk/drivers/net/e1000e/defines.h b/trunk/drivers/net/e1000e/defines.h index e301e26d6897..db05ec355749 100644 --- a/trunk/drivers/net/e1000e/defines.h +++ b/trunk/drivers/net/e1000e/defines.h @@ -320,8 +320,6 @@ #define E1000_RXCSUM_IPPCSE 0x00001000 /* IP payload checksum enable */ /* Header split receive */ -#define E1000_RFCTL_NFSW_DIS 0x00000040 -#define E1000_RFCTL_NFSR_DIS 0x00000080 #define E1000_RFCTL_ACK_DIS 0x00001000 #define E1000_RFCTL_EXTEN 0x00008000 #define E1000_RFCTL_IPV6_EX_DIS 0x00010000 diff --git a/trunk/drivers/net/e1000e/ich8lan.c b/trunk/drivers/net/e1000e/ich8lan.c index 8b5e157e9c87..54d03a0ce3ce 100644 --- a/trunk/drivers/net/e1000e/ich8lan.c +++ b/trunk/drivers/net/e1000e/ich8lan.c @@ -2740,16 +2740,6 @@ static void e1000_initialize_hw_bits_ich8lan(struct e1000_hw *hw) reg &= ~(1 << 31); ew32(STATUS, reg); } - - /* - * work-around descriptor data corruption issue during nfs v2 udp - * traffic, just disable the nfs filtering capability - */ - reg = er32(RFCTL); - reg |= (E1000_RFCTL_NFSW_DIS | E1000_RFCTL_NFSR_DIS); - ew32(RFCTL, reg); - - return; } /** diff --git a/trunk/drivers/net/gianfar.c b/trunk/drivers/net/gianfar.c index b6715553cf17..61a7b4351e78 100644 --- a/trunk/drivers/net/gianfar.c +++ b/trunk/drivers/net/gianfar.c @@ -2021,6 +2021,7 @@ static int gfar_start_xmit(struct sk_buff *skb, struct net_device *dev) } /* setup the TxBD length and buffer pointer for the first BD */ + tx_queue->tx_skbuff[tx_queue->skb_curtx] = skb; txbdp_start->bufPtr = dma_map_single(&priv->ofdev->dev, skb->data, skb_headlen(skb), DMA_TO_DEVICE); @@ -2052,10 +2053,6 @@ static int gfar_start_xmit(struct sk_buff *skb, struct net_device *dev) txbdp_start->lstatus = lstatus; - eieio(); /* force lstatus write before tx_skbuff */ - - tx_queue->tx_skbuff[tx_queue->skb_curtx] = skb; - /* Update the current skb pointer to the next entry we will use * (wrapping if necessary) */ tx_queue->skb_curtx = (tx_queue->skb_curtx + 1) & diff --git a/trunk/drivers/net/irda/irda-usb.c b/trunk/drivers/net/irda/irda-usb.c index 2c9b3af16612..e8e33bb9d876 100644 --- a/trunk/drivers/net/irda/irda-usb.c +++ b/trunk/drivers/net/irda/irda-usb.c @@ -1651,8 +1651,6 @@ static int irda_usb_probe(struct usb_interface *intf, self->rx_urb = kcalloc(self->max_rx_urb, sizeof(struct urb *), GFP_KERNEL); - if (!self->rx_urb) - goto err_free_net; for (i = 0; i < self->max_rx_urb; i++) { self->rx_urb[i] = usb_alloc_urb(0, GFP_KERNEL); @@ -1785,8 +1783,6 @@ static int irda_usb_probe(struct usb_interface *intf, err_out_1: for (i = 0; i < self->max_rx_urb; i++) usb_free_urb(self->rx_urb[i]); - kfree(self->rx_urb); -err_free_net: free_netdev(net); err_out: return ret; diff --git a/trunk/drivers/net/irda/w83977af_ir.c b/trunk/drivers/net/irda/w83977af_ir.c index 980625feb2c0..551810fd2976 100644 --- a/trunk/drivers/net/irda/w83977af_ir.c +++ b/trunk/drivers/net/irda/w83977af_ir.c @@ -65,6 +65,7 @@ #undef CONFIG_NETWINDER_TX_DMA_PROBLEMS /* Not needed */ #define CONFIG_NETWINDER_RX_DMA_PROBLEMS /* Must have this one! */ #endif +#undef CONFIG_USE_INTERNAL_TIMER /* Just cannot make that timer work */ #define CONFIG_USE_W977_PNP /* Currently needed */ #define PIO_MAX_SPEED 115200 @@ -532,6 +533,25 @@ static netdev_tx_t w83977af_hard_xmit(struct sk_buff *skb, self->tx_buff.len = skb->len; mtt = irda_get_mtt(skb); +#ifdef CONFIG_USE_INTERNAL_TIMER + if (mtt > 50) { + /* Adjust for timer resolution */ + mtt /= 1000+1; + + /* Setup timer */ + switch_bank(iobase, SET4); + outb(mtt & 0xff, iobase+TMRL); + outb((mtt >> 8) & 0x0f, iobase+TMRH); + + /* Start timer */ + outb(IR_MSL_EN_TMR, iobase+IR_MSL); + self->io.direction = IO_XMIT; + + /* Enable timer interrupt */ + switch_bank(iobase, SET0); + outb(ICR_ETMRI, iobase+ICR); + } else { +#endif IRDA_DEBUG(4, "%s(%ld), mtt=%d\n", __func__ , jiffies, mtt); if (mtt) udelay(mtt); @@ -540,6 +560,9 @@ static netdev_tx_t w83977af_hard_xmit(struct sk_buff *skb, switch_bank(iobase, SET0); outb(ICR_EDMAI, iobase+ICR); w83977af_dma_write(self, iobase); +#ifdef CONFIG_USE_INTERNAL_TIMER + } +#endif } else { self->tx_buff.data = self->tx_buff.head; self->tx_buff.len = async_wrap_skb(skb, self->tx_buff.data, @@ -853,7 +876,20 @@ static int w83977af_dma_receive_complete(struct w83977af_ir *self) /* Check if we have transferred all data to memory */ switch_bank(iobase, SET0); if (inb(iobase+USR) & USR_RDR) { +#ifdef CONFIG_USE_INTERNAL_TIMER + /* Put this entry back in fifo */ + st_fifo->head--; + st_fifo->len++; + st_fifo->entries[st_fifo->head].status = status; + st_fifo->entries[st_fifo->head].len = len; + + /* Restore set register */ + outb(set, iobase+SSR); + + return FALSE; /* I'll be back! */ +#else udelay(80); /* Should be enough!? */ +#endif } skb = dev_alloc_skb(len+1); diff --git a/trunk/drivers/net/ksz884x.c b/trunk/drivers/net/ksz884x.c index 0f59099ee72f..7264a3e5c2c0 100644 --- a/trunk/drivers/net/ksz884x.c +++ b/trunk/drivers/net/ksz884x.c @@ -4899,10 +4899,8 @@ static int netdev_tx(struct sk_buff *skb, struct net_device *dev) struct sk_buff *org_skb = skb; skb = dev_alloc_skb(org_skb->len); - if (!skb) { - rc = NETDEV_TX_BUSY; - goto unlock; - } + if (!skb) + return NETDEV_TX_BUSY; skb_copy_and_csum_dev(org_skb, skb->data); org_skb->ip_summed = 0; skb->len = org_skb->len; @@ -4916,7 +4914,7 @@ static int netdev_tx(struct sk_buff *skb, struct net_device *dev) netif_stop_queue(dev); rc = NETDEV_TX_BUSY; } -unlock: + spin_unlock_irq(&hw_priv->hwlock); return rc; diff --git a/trunk/drivers/net/myri10ge/myri10ge.c b/trunk/drivers/net/myri10ge/myri10ge.c index e84dd3ee9c5a..676c513e12fc 100644 --- a/trunk/drivers/net/myri10ge/myri10ge.c +++ b/trunk/drivers/net/myri10ge/myri10ge.c @@ -3687,6 +3687,7 @@ static void myri10ge_probe_slices(struct myri10ge_priv *mgp) if (status != 0) { dev_err(&mgp->pdev->dev, "failed reset\n"); goto abort_with_fw; + return; } mgp->max_intr_slots = cmd.data0 / sizeof(struct mcp_slot); diff --git a/trunk/drivers/net/ne.c b/trunk/drivers/net/ne.c index f4347f88b6f2..992dbfffdb05 100644 --- a/trunk/drivers/net/ne.c +++ b/trunk/drivers/net/ne.c @@ -142,7 +142,7 @@ bad_clone_list[] __initdata = { {"PCM-4823", "PCM-4823", {0x00, 0xc0, 0x6c}}, /* Broken Advantech MoBo */ {"REALTEK", "RTL8019", {0x00, 0x00, 0xe8}}, /* no-name with Realtek chip */ #ifdef CONFIG_MACH_TX49XX - {"RBHMA4X00-RTL8019", "RBHMA4X00-RTL8019", {0x00, 0x60, 0x0a}}, /* Toshiba built-in */ + {"RBHMA4X00-RTL8019", "RBHMA4X00/RTL8019", {0x00, 0x60, 0x0a}}, /* Toshiba built-in */ #endif {"LCS-8834", "LCS-8836", {0x04, 0x04, 0x37}}, /* ShinyNet (SET) */ {NULL,} diff --git a/trunk/drivers/net/pppol2tp.c b/trunk/drivers/net/pppol2tp.c index 449a9825200d..9fbb2eba9a06 100644 --- a/trunk/drivers/net/pppol2tp.c +++ b/trunk/drivers/net/pppol2tp.c @@ -756,7 +756,6 @@ static int pppol2tp_recv_core(struct sock *sock, struct sk_buff *skb) /* Try to dequeue as many skbs from reorder_q as we can. */ pppol2tp_recv_dequeue(session); - sock_put(sock); return 0; @@ -773,7 +772,6 @@ static int pppol2tp_recv_core(struct sock *sock, struct sk_buff *skb) UDP_INC_STATS_USER(&init_net, UDP_MIB_INERRORS, 0); tunnel->stats.rx_errors++; kfree_skb(skb); - sock_put(sock); return 0; @@ -1182,8 +1180,7 @@ static int pppol2tp_xmit(struct ppp_channel *chan, struct sk_buff *skb) /* Calculate UDP checksum if configured to do so */ if (sk_tun->sk_no_check == UDP_CSUM_NOXMIT) skb->ip_summed = CHECKSUM_NONE; - else if ((skb_dst(skb) && skb_dst(skb)->dev) && - (!(skb_dst(skb)->dev->features & NETIF_F_V4_CSUM))) { + else if (!(skb_dst(skb)->dev->features & NETIF_F_V4_CSUM)) { skb->ip_summed = CHECKSUM_COMPLETE; csum = skb_checksum(skb, 0, udp_len, 0); uh->check = csum_tcpudp_magic(inet->inet_saddr, @@ -1664,7 +1661,6 @@ static int pppol2tp_connect(struct socket *sock, struct sockaddr *uservaddr, if (tunnel_sock == NULL) goto end; - sock_hold(tunnel_sock); tunnel = tunnel_sock->sk_user_data; } else { tunnel = pppol2tp_tunnel_find(sock_net(sk), sp->pppol2tp.s_tunnel); diff --git a/trunk/drivers/net/qlcnic/qlcnic.h b/trunk/drivers/net/qlcnic/qlcnic.h index 0da94b208db1..b40a851ec7d1 100644 --- a/trunk/drivers/net/qlcnic/qlcnic.h +++ b/trunk/drivers/net/qlcnic/qlcnic.h @@ -423,11 +423,6 @@ struct qlcnic_adapter_stats { u64 lro_pkts; u64 rxbytes; u64 txbytes; - u64 lrobytes; - u64 lso_frames; - u64 xmit_on; - u64 xmit_off; - u64 skb_alloc_failure; }; /* @@ -1100,11 +1095,11 @@ struct qlcnic_brdinfo { static const struct qlcnic_brdinfo qlcnic_boards[] = { {0x1077, 0x8020, 0x1077, 0x203, - "8200 Series Single Port 10GbE Converged Network Adapter " - "(TCP/IP Networking)"}, + "8200 Series Single Port 10GbE Converged Network Adapter \ + (TCP/IP Networking)"}, {0x1077, 0x8020, 0x1077, 0x207, - "8200 Series Dual Port 10GbE Converged Network Adapter " - "(TCP/IP Networking)"}, + "8200 Series Dual Port 10GbE Converged Network Adapter \ + (TCP/IP Networking)"}, {0x1077, 0x8020, 0x1077, 0x20b, "3200 Series Dual Port 10Gb Intelligent Ethernet Adapter"}, {0x1077, 0x8020, 0x1077, 0x20c, diff --git a/trunk/drivers/net/qlcnic/qlcnic_ethtool.c b/trunk/drivers/net/qlcnic/qlcnic_ethtool.c index f83e15fe3e1b..8da6ec8c13b9 100644 --- a/trunk/drivers/net/qlcnic/qlcnic_ethtool.c +++ b/trunk/drivers/net/qlcnic/qlcnic_ethtool.c @@ -59,17 +59,6 @@ static const struct qlcnic_stats qlcnic_gstrings_stats[] = { QLC_SIZEOF(stats.rxbytes), QLC_OFF(stats.rxbytes)}, {"tx_bytes", QLC_SIZEOF(stats.txbytes), QLC_OFF(stats.txbytes)}, - {"lrobytes", - QLC_SIZEOF(stats.lrobytes), QLC_OFF(stats.lrobytes)}, - {"lso_frames", - QLC_SIZEOF(stats.lso_frames), QLC_OFF(stats.lso_frames)}, - {"xmit_on", - QLC_SIZEOF(stats.xmit_on), QLC_OFF(stats.xmit_on)}, - {"xmit_off", - QLC_SIZEOF(stats.xmit_off), QLC_OFF(stats.xmit_off)}, - {"skb_alloc_failure", QLC_SIZEOF(stats.skb_alloc_failure), - QLC_OFF(stats.skb_alloc_failure)}, - }; #define QLCNIC_STATS_LEN ARRAY_SIZE(qlcnic_gstrings_stats) @@ -796,11 +785,6 @@ qlcnic_get_ethtool_stats(struct net_device *dev, } } -static u32 qlcnic_get_tx_csum(struct net_device *dev) -{ - return dev->features & NETIF_F_IP_CSUM; -} - static u32 qlcnic_get_rx_csum(struct net_device *dev) { struct qlcnic_adapter *adapter = netdev_priv(dev); @@ -1011,7 +995,6 @@ const struct ethtool_ops qlcnic_ethtool_ops = { .set_ringparam = qlcnic_set_ringparam, .get_pauseparam = qlcnic_get_pauseparam, .set_pauseparam = qlcnic_set_pauseparam, - .get_tx_csum = qlcnic_get_tx_csum, .set_tx_csum = ethtool_op_set_tx_csum, .set_sg = ethtool_op_set_sg, .get_tso = qlcnic_get_tso, diff --git a/trunk/drivers/net/qlcnic/qlcnic_hw.c b/trunk/drivers/net/qlcnic/qlcnic_hw.c index da00e162b6d3..99a4d1379d00 100644 --- a/trunk/drivers/net/qlcnic/qlcnic_hw.c +++ b/trunk/drivers/net/qlcnic/qlcnic_hw.c @@ -349,7 +349,6 @@ qlcnic_send_cmd_descs(struct qlcnic_adapter *adapter, if (nr_desc >= qlcnic_tx_avail(tx_ring)) { netif_tx_stop_queue(tx_ring->txq); __netif_tx_unlock_bh(tx_ring->txq); - adapter->stats.xmit_off++; return -EBUSY; } @@ -398,16 +397,20 @@ qlcnic_sre_macaddr_change(struct qlcnic_adapter *adapter, u8 *addr, return qlcnic_send_cmd_descs(adapter, (struct cmd_desc_type0 *)&req, 1); } -static int qlcnic_nic_add_mac(struct qlcnic_adapter *adapter, u8 *addr) +static int qlcnic_nic_add_mac(struct qlcnic_adapter *adapter, + u8 *addr, struct list_head *del_list) { struct list_head *head; struct qlcnic_mac_list_s *cur; /* look up if already exists */ - list_for_each(head, &adapter->mac_list) { + list_for_each(head, del_list) { cur = list_entry(head, struct qlcnic_mac_list_s, list); - if (memcmp(addr, cur->mac_addr, ETH_ALEN) == 0) + + if (memcmp(addr, cur->mac_addr, ETH_ALEN) == 0) { + list_move_tail(head, &adapter->mac_list); return 0; + } } cur = kzalloc(sizeof(struct qlcnic_mac_list_s), GFP_ATOMIC); @@ -429,9 +432,14 @@ void qlcnic_set_multi(struct net_device *netdev) struct dev_mc_list *mc_ptr; u8 bcast_addr[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; u32 mode = VPORT_MISS_MODE_DROP; + LIST_HEAD(del_list); + struct list_head *head; + struct qlcnic_mac_list_s *cur; - qlcnic_nic_add_mac(adapter, adapter->mac_addr); - qlcnic_nic_add_mac(adapter, bcast_addr); + list_splice_tail_init(&adapter->mac_list, &del_list); + + qlcnic_nic_add_mac(adapter, adapter->mac_addr, &del_list); + qlcnic_nic_add_mac(adapter, bcast_addr, &del_list); if (netdev->flags & IFF_PROMISC) { mode = VPORT_MISS_MODE_ACCEPT_ALL; @@ -446,12 +454,22 @@ void qlcnic_set_multi(struct net_device *netdev) if (!netdev_mc_empty(netdev)) { netdev_for_each_mc_addr(mc_ptr, netdev) { - qlcnic_nic_add_mac(adapter, mc_ptr->dmi_addr); + qlcnic_nic_add_mac(adapter, mc_ptr->dmi_addr, + &del_list); } } send_fw_cmd: qlcnic_nic_set_promisc(adapter, mode); + head = &del_list; + while (!list_empty(head)) { + cur = list_entry(head->next, struct qlcnic_mac_list_s, list); + + qlcnic_sre_macaddr_change(adapter, + cur->mac_addr, QLCNIC_MAC_DEL); + list_del(&cur->list); + kfree(cur); + } } int qlcnic_nic_set_promisc(struct qlcnic_adapter *adapter, u32 mode) diff --git a/trunk/drivers/net/qlcnic/qlcnic_init.c b/trunk/drivers/net/qlcnic/qlcnic_init.c index 7c34e4e29b3f..ea00ab4d4feb 100644 --- a/trunk/drivers/net/qlcnic/qlcnic_init.c +++ b/trunk/drivers/net/qlcnic/qlcnic_init.c @@ -568,123 +568,21 @@ struct uni_table_desc *qlcnic_get_table_desc(const u8 *unirom, int section) return NULL; } -#define FILEHEADER_SIZE (14 * 4) - -static int -qlcnic_validate_header(struct qlcnic_adapter *adapter) -{ - const u8 *unirom = adapter->fw->data; - struct uni_table_desc *directory = (struct uni_table_desc *) &unirom[0]; - __le32 fw_file_size = adapter->fw->size; - __le32 entries; - __le32 entry_size; - __le32 tab_size; - - if (fw_file_size < FILEHEADER_SIZE) - return -EINVAL; - - entries = cpu_to_le32(directory->num_entries); - entry_size = cpu_to_le32(directory->entry_size); - tab_size = cpu_to_le32(directory->findex) + (entries * entry_size); - - if (fw_file_size < tab_size) - return -EINVAL; - - return 0; -} - static int -qlcnic_validate_bootld(struct qlcnic_adapter *adapter) -{ - struct uni_table_desc *tab_desc; - struct uni_data_desc *descr; - const u8 *unirom = adapter->fw->data; - int idx = cpu_to_le32(*((int *)&unirom[adapter->file_prd_off] + - QLCNIC_UNI_BOOTLD_IDX_OFF)); - __le32 offs; - __le32 tab_size; - __le32 data_size; - - tab_desc = qlcnic_get_table_desc(unirom, QLCNIC_UNI_DIR_SECT_BOOTLD); - - if (!tab_desc) - return -EINVAL; - - tab_size = cpu_to_le32(tab_desc->findex) + - (cpu_to_le32(tab_desc->entry_size * (idx + 1))); - - if (adapter->fw->size < tab_size) - return -EINVAL; - - offs = cpu_to_le32(tab_desc->findex) + - (cpu_to_le32(tab_desc->entry_size) * (idx)); - descr = (struct uni_data_desc *)&unirom[offs]; - - data_size = descr->findex + cpu_to_le32(descr->size); - - if (adapter->fw->size < data_size) - return -EINVAL; - - return 0; -} - -static int -qlcnic_validate_fw(struct qlcnic_adapter *adapter) -{ - struct uni_table_desc *tab_desc; - struct uni_data_desc *descr; - const u8 *unirom = adapter->fw->data; - int idx = cpu_to_le32(*((int *)&unirom[adapter->file_prd_off] + - QLCNIC_UNI_FIRMWARE_IDX_OFF)); - __le32 offs; - __le32 tab_size; - __le32 data_size; - - tab_desc = qlcnic_get_table_desc(unirom, QLCNIC_UNI_DIR_SECT_FW); - - if (!tab_desc) - return -EINVAL; - - tab_size = cpu_to_le32(tab_desc->findex) + - (cpu_to_le32(tab_desc->entry_size * (idx + 1))); - - if (adapter->fw->size < tab_size) - return -EINVAL; - - offs = cpu_to_le32(tab_desc->findex) + - (cpu_to_le32(tab_desc->entry_size) * (idx)); - descr = (struct uni_data_desc *)&unirom[offs]; - data_size = descr->findex + cpu_to_le32(descr->size); - - if (adapter->fw->size < data_size) - return -EINVAL; - - return 0; -} - -static int -qlcnic_validate_product_offs(struct qlcnic_adapter *adapter) +qlcnic_set_product_offs(struct qlcnic_adapter *adapter) { struct uni_table_desc *ptab_descr; const u8 *unirom = adapter->fw->data; - int mn_present = qlcnic_has_mn(adapter); - __le32 entries; - __le32 entry_size; - __le32 tab_size; u32 i; + __le32 entries; + int mn_present = qlcnic_has_mn(adapter); ptab_descr = qlcnic_get_table_desc(unirom, QLCNIC_UNI_DIR_SECT_PRODUCT_TBL); - if (!ptab_descr) - return -EINVAL; + if (ptab_descr == NULL) + return -1; entries = cpu_to_le32(ptab_descr->num_entries); - entry_size = cpu_to_le32(ptab_descr->entry_size); - tab_size = cpu_to_le32(ptab_descr->findex) + (entries * entry_size); - - if (adapter->fw->size < tab_size) - return -EINVAL; - nomn: for (i = 0; i < entries; i++) { @@ -711,37 +609,7 @@ qlcnic_validate_product_offs(struct qlcnic_adapter *adapter) mn_present = 0; goto nomn; } - return -EINVAL; -} - -static int -qlcnic_validate_unified_romimage(struct qlcnic_adapter *adapter) -{ - if (qlcnic_validate_header(adapter)) { - dev_err(&adapter->pdev->dev, - "unified image: header validation failed\n"); - return -EINVAL; - } - - if (qlcnic_validate_product_offs(adapter)) { - dev_err(&adapter->pdev->dev, - "unified image: product validation failed\n"); - return -EINVAL; - } - - if (qlcnic_validate_bootld(adapter)) { - dev_err(&adapter->pdev->dev, - "unified image: bootld validation failed\n"); - return -EINVAL; - } - - if (qlcnic_validate_fw(adapter)) { - dev_err(&adapter->pdev->dev, - "unified image: firmware validation failed\n"); - return -EINVAL; - } - - return 0; + return -1; } static @@ -847,7 +715,7 @@ qlcnic_get_bios_version(struct qlcnic_adapter *adapter) bios_ver = cpu_to_le32(*((u32 *) (&fw->data[prd_off]) + QLCNIC_UNI_BIOS_VERSION_OFF)); - return (bios_ver << 16) + ((bios_ver >> 8) & 0xff00) + (bios_ver >> 24); + return (bios_ver << 24) + ((bios_ver >> 8) & 0xff00) + (bios_ver >> 24); } int @@ -990,7 +858,7 @@ qlcnic_validate_firmware(struct qlcnic_adapter *adapter) u8 fw_type = adapter->fw_type; if (fw_type == QLCNIC_UNIFIED_ROMIMAGE) { - if (qlcnic_validate_unified_romimage(adapter)) + if (qlcnic_set_product_offs(adapter)) return -EINVAL; min_size = QLCNIC_UNI_FW_MIN_SIZE; @@ -1246,10 +1114,8 @@ qlcnic_alloc_rx_skb(struct qlcnic_adapter *adapter, struct pci_dev *pdev = adapter->pdev; buffer->skb = dev_alloc_skb(rds_ring->skb_size); - if (!buffer->skb) { - adapter->stats.skb_alloc_failure++; + if (!buffer->skb) return -ENOMEM; - } skb = buffer->skb; @@ -1423,7 +1289,7 @@ qlcnic_process_lro(struct qlcnic_adapter *adapter, netif_receive_skb(skb); adapter->stats.lro_pkts++; - adapter->stats.lrobytes += length; + adapter->stats.rxbytes += length; return buffer; } @@ -1639,8 +1505,6 @@ qlcnic_process_rcv_diag(struct qlcnic_adapter *adapter, adapter->diag_cnt++; dev_kfree_skb_any(skb); - adapter->stats.rx_pkts++; - adapter->stats.rxbytes += length; return buffer; } diff --git a/trunk/drivers/net/qlcnic/qlcnic_main.c b/trunk/drivers/net/qlcnic/qlcnic_main.c index fc721564e69e..665e8e56b6a8 100644 --- a/trunk/drivers/net/qlcnic/qlcnic_main.c +++ b/trunk/drivers/net/qlcnic/qlcnic_main.c @@ -118,7 +118,6 @@ qlcnic_update_cmd_producer(struct qlcnic_adapter *adapter, if (qlcnic_tx_avail(tx_ring) <= TX_STOP_THRESH) { netif_stop_queue(adapter->netdev); smp_mb(); - adapter->stats.xmit_off++; } } @@ -1386,7 +1385,6 @@ qlcnic_tso_check(struct net_device *netdev, int copied, offset, copy_len, hdr_len = 0, tso = 0, vlan_oob = 0; struct cmd_desc_type0 *hwdesc; struct vlan_ethhdr *vh; - struct qlcnic_adapter *adapter = netdev_priv(netdev); if (protocol == cpu_to_be16(ETH_P_8021Q)) { @@ -1496,7 +1494,6 @@ qlcnic_tso_check(struct net_device *netdev, tx_ring->producer = producer; barrier(); - adapter->stats.lso_frames++; } static int @@ -1576,7 +1573,6 @@ qlcnic_xmit_frame(struct sk_buff *skb, struct net_device *netdev) if (unlikely(no_of_desc + 2 > qlcnic_tx_avail(tx_ring))) { netif_stop_queue(netdev); - adapter->stats.xmit_off++; return NETDEV_TX_BUSY; } @@ -1884,7 +1880,6 @@ static int qlcnic_process_cmd_ring(struct qlcnic_adapter *adapter) if (qlcnic_tx_avail(tx_ring) > TX_STOP_THRESH) { netif_wake_queue(netdev); adapter->tx_timeo_cnt = 0; - adapter->stats.xmit_on++; } __netif_tx_unlock(tx_ring->txq); } diff --git a/trunk/drivers/net/r8169.c b/trunk/drivers/net/r8169.c index 9d3ebf3e975e..dfc3573c91bb 100644 --- a/trunk/drivers/net/r8169.c +++ b/trunk/drivers/net/r8169.c @@ -4270,7 +4270,7 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb, tp->cur_tx += frags + 1; - wmb(); + smp_wmb(); RTL_W8(TxPoll, NPQ); /* set polling bit */ @@ -4621,7 +4621,7 @@ static int rtl8169_poll(struct napi_struct *napi, int budget) * until it does. */ tp->intr_mask = 0xffff; - wmb(); + smp_wmb(); RTL_W16(IntrMask, tp->intr_event); } diff --git a/trunk/drivers/net/s2io.c b/trunk/drivers/net/s2io.c index 2eb7f8a0d926..43bc66aa8405 100644 --- a/trunk/drivers/net/s2io.c +++ b/trunk/drivers/net/s2io.c @@ -923,8 +923,8 @@ static int init_shared_mem(struct s2io_nic *nic) tmp_v_addr = mac_control->stats_mem; mac_control->stats_info = (struct stat_block *)tmp_v_addr; memset(tmp_v_addr, 0, size); - DBG_PRINT(INIT_DBG, "%s: Ring Mem PHY: 0x%llx\n", - dev_name(&nic->pdev->dev), (unsigned long long)tmp_p_addr); + DBG_PRINT(INIT_DBG, "%s: Ring Mem PHY: 0x%llx\n", dev->name, + (unsigned long long)tmp_p_addr); mac_control->stats_info->sw_stat.mem_allocated += mem_allocated; return SUCCESS; } @@ -3480,7 +3480,7 @@ static void s2io_reset(struct s2io_nic *sp) struct swStat *swstats; DBG_PRINT(INIT_DBG, "%s: Resetting XFrame card %s\n", - __func__, pci_name(sp->pdev)); + __func__, sp->dev->name); /* Back up the PCI-X CMD reg, dont want to lose MMRBC, OST settings */ pci_read_config_word(sp->pdev, PCIX_COMMAND_REGISTER, &(pci_cmd)); @@ -5819,8 +5819,10 @@ static void s2io_vpd_read(struct s2io_nic *nic) } } - if ((!fail) && (vpd_data[1] < VPD_STRING_LEN)) + if ((!fail) && (vpd_data[1] < VPD_STRING_LEN)) { + memset(nic->product_name, 0, vpd_data[1]); memcpy(nic->product_name, &vpd_data[3], vpd_data[1]); + } kfree(vpd_data); swstats->mem_freed += 256; } diff --git a/trunk/drivers/net/sky2.c b/trunk/drivers/net/sky2.c index d8ec4c11fd49..653bdd76ef46 100644 --- a/trunk/drivers/net/sky2.c +++ b/trunk/drivers/net/sky2.c @@ -4863,7 +4863,6 @@ static int sky2_resume(struct pci_dev *pdev) if (!hw) return 0; - rtnl_lock(); err = pci_set_power_state(pdev, PCI_D0); if (err) goto out; @@ -4885,6 +4884,7 @@ static int sky2_resume(struct pci_dev *pdev) sky2_write32(hw, B0_IMSK, Y2_IS_BASE); napi_enable(&hw->napi); + rtnl_lock(); for (i = 0; i < hw->ports; i++) { err = sky2_reattach(hw->dev[i]); if (err) diff --git a/trunk/drivers/net/smc91x.h b/trunk/drivers/net/smc91x.h index 8d2772cc42f2..54799544bda3 100644 --- a/trunk/drivers/net/smc91x.h +++ b/trunk/drivers/net/smc91x.h @@ -330,48 +330,6 @@ static inline void LPD7_SMC_outsw (unsigned char* a, int r, #include -#elif defined(CONFIG_ARCH_MSM) - -#define SMC_CAN_USE_8BIT 0 -#define SMC_CAN_USE_16BIT 1 -#define SMC_CAN_USE_32BIT 0 -#define SMC_NOWAIT 1 - -#define SMC_inw(a, r) readw((a) + (r)) -#define SMC_outw(v, a, r) writew(v, (a) + (r)) -#define SMC_insw(a, r, p, l) readsw((a) + (r), p, l) -#define SMC_outsw(a, r, p, l) writesw((a) + (r), p, l) - -#define SMC_IRQ_FLAGS IRQF_TRIGGER_HIGH - -#elif defined(CONFIG_COLDFIRE) - -#define SMC_CAN_USE_8BIT 0 -#define SMC_CAN_USE_16BIT 1 -#define SMC_CAN_USE_32BIT 0 -#define SMC_NOWAIT 1 - -static inline void mcf_insw(void *a, unsigned char *p, int l) -{ - u16 *wp = (u16 *) p; - while (l-- > 0) - *wp++ = readw(a); -} - -static inline void mcf_outsw(void *a, unsigned char *p, int l) -{ - u16 *wp = (u16 *) p; - while (l-- > 0) - writew(*wp++, a); -} - -#define SMC_inw(a, r) _swapw(readw((a) + (r))) -#define SMC_outw(v, a, r) writew(_swapw(v), (a) + (r)) -#define SMC_insw(a, r, p, l) mcf_insw(a + r, p, l) -#define SMC_outsw(a, r, p, l) mcf_outsw(a + r, p, l) - -#define SMC_IRQ_FLAGS (IRQF_DISABLED) - #else /* diff --git a/trunk/drivers/net/tg3.c b/trunk/drivers/net/tg3.c index 22cf1c446de3..0fa7688ab483 100644 --- a/trunk/drivers/net/tg3.c +++ b/trunk/drivers/net/tg3.c @@ -5279,7 +5279,7 @@ static void tg3_poll_controller(struct net_device *dev) struct tg3 *tp = netdev_priv(dev); for (i = 0; i < tp->irq_cnt; i++) - tg3_interrupt(tp->napi[i].irq_vec, &tp->napi[i]); + tg3_interrupt(tp->napi[i].irq_vec, dev); } #endif @@ -9776,7 +9776,7 @@ static int tg3_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) ADVERTISED_Pause | ADVERTISED_Asym_Pause; - if (!(tp->tg3_flags & TG3_FLAG_10_100_ONLY)) + if (!(tp->tg3_flags2 & TG3_FLAG_10_100_ONLY)) mask |= ADVERTISED_1000baseT_Half | ADVERTISED_1000baseT_Full; diff --git a/trunk/drivers/net/tulip/eeprom.c b/trunk/drivers/net/tulip/eeprom.c index 49f05d1431f5..93f4e8309f81 100644 --- a/trunk/drivers/net/tulip/eeprom.c +++ b/trunk/drivers/net/tulip/eeprom.c @@ -143,12 +143,6 @@ static void __devinit tulip_build_fake_mediatable(struct tulip_private *tp) void __devinit tulip_parse_eeprom(struct net_device *dev) { - /* - dev is not registered at this point, so logging messages can't - use dev_ or netdev_ but dev->name is good via a - hack in the caller - */ - /* The last media info list parsed, for multiport boards. */ static struct mediatable *last_mediatable; static unsigned char *last_ee_data; @@ -167,14 +161,15 @@ void __devinit tulip_parse_eeprom(struct net_device *dev) if (ee_data[0] == 0xff) { if (last_mediatable) { controller_index++; - pr_info("%s: Controller %d of multiport board\n", - dev->name, controller_index); + dev_info(&dev->dev, + "Controller %d of multiport board\n", + controller_index); tp->mtable = last_mediatable; ee_data = last_ee_data; goto subsequent_board; } else - pr_info("%s: Missing EEPROM, this interface may not work correctly!\n", - dev->name); + dev_info(&dev->dev, + "Missing EEPROM, this interface may not work correctly!\n"); return; } /* Do a fix-up based on the vendor half of the station address prefix. */ @@ -186,14 +181,15 @@ void __devinit tulip_parse_eeprom(struct net_device *dev) i++; /* An Accton EN1207, not an outlaw Maxtech. */ memcpy(ee_data + 26, eeprom_fixups[i].newtable, sizeof(eeprom_fixups[i].newtable)); - pr_info("%s: Old format EEPROM on '%s' board. Using substitute media control info\n", - dev->name, eeprom_fixups[i].name); + dev_info(&dev->dev, + "Old format EEPROM on '%s' board. Using substitute media control info\n", + eeprom_fixups[i].name); break; } } if (eeprom_fixups[i].name == NULL) { /* No fixup found. */ - pr_info("%s: Old style EEPROM with no media selection information\n", - dev->name); + dev_info(&dev->dev, + "Old style EEPROM with no media selection information\n"); return; } } @@ -221,8 +217,8 @@ void __devinit tulip_parse_eeprom(struct net_device *dev) /* there is no phy information, don't even try to build mtable */ if (count == 0) { if (tulip_debug > 0) - pr_warning("%s: no phy info, aborting mtable build\n", - dev->name); + dev_warn(&dev->dev, + "no phy info, aborting mtable build\n"); return; } @@ -238,10 +234,8 @@ void __devinit tulip_parse_eeprom(struct net_device *dev) mtable->has_nonmii = mtable->has_mii = mtable->has_reset = 0; mtable->csr15dir = mtable->csr15val = 0; - pr_info("%s: EEPROM default media type %s\n", - dev->name, - media & 0x0800 ? "Autosense" - : medianame[media & MEDIA_MASK]); + dev_info(&dev->dev, "EEPROM default media type %s\n", + media & 0x0800 ? "Autosense" : medianame[media & MEDIA_MASK]); for (i = 0; i < count; i++) { struct medialeaf *leaf = &mtable->mleaf[i]; @@ -304,17 +298,17 @@ void __devinit tulip_parse_eeprom(struct net_device *dev) } if (tulip_debug > 1 && leaf->media == 11) { unsigned char *bp = leaf->leafdata; - pr_info("%s: MII interface PHY %d, setup/reset sequences %d/%d long, capabilities %02x %02x\n", - dev->name, - bp[0], bp[1], bp[2 + bp[1]*2], - bp[5 + bp[2 + bp[1]*2]*2], - bp[4 + bp[2 + bp[1]*2]*2]); + dev_info(&dev->dev, + "MII interface PHY %d, setup/reset sequences %d/%d long, capabilities %02x %02x\n", + bp[0], bp[1], bp[2 + bp[1]*2], + bp[5 + bp[2 + bp[1]*2]*2], + bp[4 + bp[2 + bp[1]*2]*2]); } - pr_info("%s: Index #%d - Media %s (#%d) described by a %s (%d) block\n", - dev->name, - i, medianame[leaf->media & 15], leaf->media, - leaf->type < ARRAY_SIZE(block_name) ? block_name[leaf->type] : "", - leaf->type); + dev_info(&dev->dev, + "Index #%d - Media %s (#%d) described by a %s (%d) block\n", + i, medianame[leaf->media & 15], leaf->media, + leaf->type < ARRAY_SIZE(block_name) ? block_name[leaf->type] : "", + leaf->type); } if (new_advertise) tp->sym_advertise = new_advertise; diff --git a/trunk/drivers/net/typhoon.c b/trunk/drivers/net/typhoon.c index cd24e5f2b2a2..2fbf15235c05 100644 --- a/trunk/drivers/net/typhoon.c +++ b/trunk/drivers/net/typhoon.c @@ -480,7 +480,7 @@ typhoon_hello(struct typhoon *tp) typhoon_inc_cmd_index(&ring->lastWrite, 1); INIT_COMMAND_NO_RESPONSE(cmd, TYPHOON_CMD_HELLO_RESP); - wmb(); + smp_wmb(); iowrite32(ring->lastWrite, tp->ioaddr + TYPHOON_REG_CMD_READY); spin_unlock(&tp->command_lock); } @@ -1311,15 +1311,13 @@ typhoon_init_interface(struct typhoon *tp) tp->txlo_dma_addr = le32_to_cpu(iface->txLoAddr); tp->card_state = Sleeping; + smp_wmb(); tp->offload = TYPHOON_OFFLOAD_IP_CHKSUM | TYPHOON_OFFLOAD_TCP_CHKSUM; tp->offload |= TYPHOON_OFFLOAD_UDP_CHKSUM | TSO_OFFLOAD_ON; spin_lock_init(&tp->command_lock); spin_lock_init(&tp->state_lock); - - /* Force the writes to the shared memory area out before continuing. */ - wmb(); } static void diff --git a/trunk/drivers/net/usb/Kconfig b/trunk/drivers/net/usb/Kconfig index ba56ce4382d9..32d93564a74d 100644 --- a/trunk/drivers/net/usb/Kconfig +++ b/trunk/drivers/net/usb/Kconfig @@ -204,14 +204,6 @@ config USB_NET_DM9601 This option adds support for Davicom DM9601 based USB 1.1 10/100 Ethernet adapters. -config USB_NET_SMSC75XX - tristate "SMSC LAN75XX based USB 2.0 gigabit ethernet devices" - depends on USB_USBNET - select CRC32 - help - This option adds support for SMSC LAN95XX based USB 2.0 - Gigabit Ethernet adapters. - config USB_NET_SMSC95XX tristate "SMSC LAN95XX based USB 2.0 10/100 ethernet devices" depends on USB_USBNET diff --git a/trunk/drivers/net/usb/Makefile b/trunk/drivers/net/usb/Makefile index 82ea62955b56..e17afb78f372 100644 --- a/trunk/drivers/net/usb/Makefile +++ b/trunk/drivers/net/usb/Makefile @@ -11,7 +11,6 @@ obj-$(CONFIG_USB_NET_AX8817X) += asix.o obj-$(CONFIG_USB_NET_CDCETHER) += cdc_ether.o obj-$(CONFIG_USB_NET_CDC_EEM) += cdc_eem.o obj-$(CONFIG_USB_NET_DM9601) += dm9601.o -obj-$(CONFIG_USB_NET_SMSC75XX) += smsc75xx.o obj-$(CONFIG_USB_NET_SMSC95XX) += smsc95xx.o obj-$(CONFIG_USB_NET_GL620A) += gl620a.o obj-$(CONFIG_USB_NET_NET1080) += net1080.o diff --git a/trunk/drivers/net/usb/asix.c b/trunk/drivers/net/usb/asix.c index 9e05639435f2..20e34608fa4a 100644 --- a/trunk/drivers/net/usb/asix.c +++ b/trunk/drivers/net/usb/asix.c @@ -54,7 +54,6 @@ static const char driver_name [] = "asix"; #define AX_CMD_WRITE_IPG0 0x12 #define AX_CMD_WRITE_IPG1 0x13 #define AX_CMD_READ_NODE_ID 0x13 -#define AX_CMD_WRITE_NODE_ID 0x14 #define AX_CMD_WRITE_IPG2 0x14 #define AX_CMD_WRITE_MULTI_FILTER 0x16 #define AX88172_CMD_READ_NODE_ID 0x17 @@ -166,7 +165,6 @@ static const char driver_name [] = "asix"; /* This structure cannot exceed sizeof(unsigned long [5]) AKA 20 bytes */ struct asix_data { u8 multi_filter[AX_MCAST_FILTER_SIZE]; - u8 mac_addr[ETH_ALEN]; u8 phymode; u8 ledmode; u8 eeprom_len; @@ -734,30 +732,6 @@ static int asix_ioctl (struct net_device *net, struct ifreq *rq, int cmd) return generic_mii_ioctl(&dev->mii, if_mii(rq), cmd, NULL); } -static int asix_set_mac_address(struct net_device *net, void *p) -{ - struct usbnet *dev = netdev_priv(net); - struct asix_data *data = (struct asix_data *)&dev->data; - struct sockaddr *addr = p; - - if (netif_running(net)) - return -EBUSY; - if (!is_valid_ether_addr(addr->sa_data)) - return -EADDRNOTAVAIL; - - memcpy(net->dev_addr, addr->sa_data, ETH_ALEN); - - /* We use the 20 byte dev->data - * for our 6 byte mac buffer - * to avoid allocating memory that - * is tricky to free later */ - memcpy(data->mac_addr, addr->sa_data, ETH_ALEN); - asix_write_cmd_async(dev, AX_CMD_WRITE_NODE_ID, 0, 0, ETH_ALEN, - data->mac_addr); - - return 0; -} - /* We need to override some ethtool_ops so we require our own structure so we don't interfere with other usbnet devices that may be connected at the same time. */ @@ -945,7 +919,7 @@ static const struct net_device_ops ax88772_netdev_ops = { .ndo_start_xmit = usbnet_start_xmit, .ndo_tx_timeout = usbnet_tx_timeout, .ndo_change_mtu = usbnet_change_mtu, - .ndo_set_mac_address = asix_set_mac_address, + .ndo_set_mac_address = eth_mac_addr, .ndo_validate_addr = eth_validate_addr, .ndo_do_ioctl = asix_ioctl, .ndo_set_multicast_list = asix_set_multicast, @@ -1239,7 +1213,7 @@ static const struct net_device_ops ax88178_netdev_ops = { .ndo_stop = usbnet_stop, .ndo_start_xmit = usbnet_start_xmit, .ndo_tx_timeout = usbnet_tx_timeout, - .ndo_set_mac_address = asix_set_mac_address, + .ndo_set_mac_address = eth_mac_addr, .ndo_validate_addr = eth_validate_addr, .ndo_set_multicast_list = asix_set_multicast, .ndo_do_ioctl = asix_ioctl, diff --git a/trunk/drivers/net/usb/hso.c b/trunk/drivers/net/usb/hso.c index be0cc99e881a..6895f1531238 100644 --- a/trunk/drivers/net/usb/hso.c +++ b/trunk/drivers/net/usb/hso.c @@ -1155,6 +1155,9 @@ static void _hso_serial_set_termios(struct tty_struct *tty, static void hso_resubmit_rx_bulk_urb(struct hso_serial *serial, struct urb *urb) { int result; +#ifdef CONFIG_HSO_AUTOPM + usb_mark_last_busy(urb->dev); +#endif /* We are done with this URB, resubmit it. Prep the USB to wait for * another frame */ usb_fill_bulk_urb(urb, serial->parent->usb, diff --git a/trunk/drivers/net/usb/pegasus.h b/trunk/drivers/net/usb/pegasus.h index b90d8766ab74..5d02f0200737 100644 --- a/trunk/drivers/net/usb/pegasus.h +++ b/trunk/drivers/net/usb/pegasus.h @@ -177,7 +177,7 @@ PEGASUS_DEV( "USB 10/100 Fast Ethernet", VENDOR_ABOCOM, 0x400c, PEGASUS_DEV( "USB 10/100 Fast Ethernet", VENDOR_ABOCOM, 0xabc1, DEFAULT_GPIO_RESET ) PEGASUS_DEV( "USB 10/100 Fast Ethernet", VENDOR_ABOCOM, 0x200c, - DEFAULT_GPIO_RESET | PEGASUS_II ) + DEFAULT_GPIO_RESET | PEGASUS_II ) PEGASUS_DEV( "Accton USB 10/100 Ethernet Adapter", VENDOR_ACCTON, 0x1046, DEFAULT_GPIO_RESET ) PEGASUS_DEV( "SpeedStream USB 10/100 Ethernet", VENDOR_ACCTON, 0x5046, @@ -208,8 +208,6 @@ PEGASUS_DEV( "Allied Telesyn Int. AT-USB100", VENDOR_ALLIEDTEL, 0xb100, */ PEGASUS_DEV_CLASS( "Belkin F5D5050 USB Ethernet", VENDOR_BELKIN, 0x0121, 0x00, DEFAULT_GPIO_RESET | PEGASUS_II ) -PEGASUS_DEV( "Belkin F5U122 10/100 USB Ethernet", VENDOR_BELKIN, 0x0122, - DEFAULT_GPIO_RESET | PEGASUS_II ) PEGASUS_DEV( "Billionton USB-100", VENDOR_BILLIONTON, 0x0986, DEFAULT_GPIO_RESET ) PEGASUS_DEV( "Billionton USBLP-100", VENDOR_BILLIONTON, 0x0987, @@ -251,7 +249,7 @@ PEGASUS_DEV( "GIGABYTE GN-BR402W Wireless Router", VENDOR_GIGABYTE, 0x8002, PEGASUS_DEV( "Hawking UF100 10/100 Ethernet", VENDOR_HAWKING, 0x400c, DEFAULT_GPIO_RESET | PEGASUS_II ) PEGASUS_DEV( "HP hn210c Ethernet USB", VENDOR_HP, 0x811c, - DEFAULT_GPIO_RESET | PEGASUS_II ) + DEFAULT_GPIO_RESET | PEGASUS_II ) PEGASUS_DEV( "IO DATA USB ET/TX", VENDOR_IODATA, 0x0904, DEFAULT_GPIO_RESET ) PEGASUS_DEV( "IO DATA USB ET/TX-S", VENDOR_IODATA, 0x0913, diff --git a/trunk/drivers/net/usb/smsc75xx.c b/trunk/drivers/net/usb/smsc75xx.c deleted file mode 100644 index 300e3e764fa2..000000000000 --- a/trunk/drivers/net/usb/smsc75xx.c +++ /dev/null @@ -1,1288 +0,0 @@ - /*************************************************************************** - * - * Copyright (C) 2007-2010 SMSC - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - *****************************************************************************/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "smsc75xx.h" - -#define SMSC_CHIPNAME "smsc75xx" -#define SMSC_DRIVER_VERSION "1.0.0" -#define HS_USB_PKT_SIZE (512) -#define FS_USB_PKT_SIZE (64) -#define DEFAULT_HS_BURST_CAP_SIZE (16 * 1024 + 5 * HS_USB_PKT_SIZE) -#define DEFAULT_FS_BURST_CAP_SIZE (6 * 1024 + 33 * FS_USB_PKT_SIZE) -#define DEFAULT_BULK_IN_DELAY (0x00002000) -#define MAX_SINGLE_PACKET_SIZE (9000) -#define LAN75XX_EEPROM_MAGIC (0x7500) -#define EEPROM_MAC_OFFSET (0x01) -#define DEFAULT_TX_CSUM_ENABLE (true) -#define DEFAULT_RX_CSUM_ENABLE (true) -#define DEFAULT_TSO_ENABLE (true) -#define SMSC75XX_INTERNAL_PHY_ID (1) -#define SMSC75XX_TX_OVERHEAD (8) -#define MAX_RX_FIFO_SIZE (20 * 1024) -#define MAX_TX_FIFO_SIZE (12 * 1024) -#define USB_VENDOR_ID_SMSC (0x0424) -#define USB_PRODUCT_ID_LAN7500 (0x7500) -#define USB_PRODUCT_ID_LAN7505 (0x7505) - -#define check_warn(ret, fmt, args...) \ - ({ if (ret < 0) netdev_warn(dev->net, fmt, ##args); }) - -#define check_warn_return(ret, fmt, args...) \ - ({ if (ret < 0) { netdev_warn(dev->net, fmt, ##args); return ret; } }) - -#define check_warn_goto_done(ret, fmt, args...) \ - ({ if (ret < 0) { netdev_warn(dev->net, fmt, ##args); goto done; } }) - -struct smsc75xx_priv { - struct usbnet *dev; - u32 rfe_ctl; - u32 multicast_hash_table[DP_SEL_VHF_HASH_LEN]; - bool use_rx_csum; - struct mutex dataport_mutex; - spinlock_t rfe_ctl_lock; - struct work_struct set_multicast; -}; - -struct usb_context { - struct usb_ctrlrequest req; - struct usbnet *dev; -}; - -static int turbo_mode = true; -module_param(turbo_mode, bool, 0644); -MODULE_PARM_DESC(turbo_mode, "Enable multiple frames per Rx transaction"); - -static int __must_check smsc75xx_read_reg(struct usbnet *dev, u32 index, - u32 *data) -{ - u32 *buf = kmalloc(4, GFP_KERNEL); - int ret; - - BUG_ON(!dev); - - if (!buf) - return -ENOMEM; - - ret = usb_control_msg(dev->udev, usb_rcvctrlpipe(dev->udev, 0), - USB_VENDOR_REQUEST_READ_REGISTER, - USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, - 00, index, buf, 4, USB_CTRL_GET_TIMEOUT); - - if (unlikely(ret < 0)) - netdev_warn(dev->net, - "Failed to read register index 0x%08x", index); - - le32_to_cpus(buf); - *data = *buf; - kfree(buf); - - return ret; -} - -static int __must_check smsc75xx_write_reg(struct usbnet *dev, u32 index, - u32 data) -{ - u32 *buf = kmalloc(4, GFP_KERNEL); - int ret; - - BUG_ON(!dev); - - if (!buf) - return -ENOMEM; - - *buf = data; - cpu_to_le32s(buf); - - ret = usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, 0), - USB_VENDOR_REQUEST_WRITE_REGISTER, - USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, - 00, index, buf, 4, USB_CTRL_SET_TIMEOUT); - - if (unlikely(ret < 0)) - netdev_warn(dev->net, - "Failed to write register index 0x%08x", index); - - kfree(buf); - - return ret; -} - -/* Loop until the read is completed with timeout - * called with phy_mutex held */ -static int smsc75xx_phy_wait_not_busy(struct usbnet *dev) -{ - unsigned long start_time = jiffies; - u32 val; - int ret; - - do { - ret = smsc75xx_read_reg(dev, MII_ACCESS, &val); - check_warn_return(ret, "Error reading MII_ACCESS"); - - if (!(val & MII_ACCESS_BUSY)) - return 0; - } while (!time_after(jiffies, start_time + HZ)); - - return -EIO; -} - -static int smsc75xx_mdio_read(struct net_device *netdev, int phy_id, int idx) -{ - struct usbnet *dev = netdev_priv(netdev); - u32 val, addr; - int ret; - - mutex_lock(&dev->phy_mutex); - - /* confirm MII not busy */ - ret = smsc75xx_phy_wait_not_busy(dev); - check_warn_goto_done(ret, "MII is busy in smsc75xx_mdio_read"); - - /* set the address, index & direction (read from PHY) */ - phy_id &= dev->mii.phy_id_mask; - idx &= dev->mii.reg_num_mask; - addr = ((phy_id << MII_ACCESS_PHY_ADDR_SHIFT) & MII_ACCESS_PHY_ADDR) - | ((idx << MII_ACCESS_REG_ADDR_SHIFT) & MII_ACCESS_REG_ADDR) - | MII_ACCESS_READ; - ret = smsc75xx_write_reg(dev, MII_ACCESS, addr); - check_warn_goto_done(ret, "Error writing MII_ACCESS"); - - ret = smsc75xx_phy_wait_not_busy(dev); - check_warn_goto_done(ret, "Timed out reading MII reg %02X", idx); - - ret = smsc75xx_read_reg(dev, MII_DATA, &val); - check_warn_goto_done(ret, "Error reading MII_DATA"); - - ret = (u16)(val & 0xFFFF); - -done: - mutex_unlock(&dev->phy_mutex); - return ret; -} - -static void smsc75xx_mdio_write(struct net_device *netdev, int phy_id, int idx, - int regval) -{ - struct usbnet *dev = netdev_priv(netdev); - u32 val, addr; - int ret; - - mutex_lock(&dev->phy_mutex); - - /* confirm MII not busy */ - ret = smsc75xx_phy_wait_not_busy(dev); - check_warn_goto_done(ret, "MII is busy in smsc75xx_mdio_write"); - - val = regval; - ret = smsc75xx_write_reg(dev, MII_DATA, val); - check_warn_goto_done(ret, "Error writing MII_DATA"); - - /* set the address, index & direction (write to PHY) */ - phy_id &= dev->mii.phy_id_mask; - idx &= dev->mii.reg_num_mask; - addr = ((phy_id << MII_ACCESS_PHY_ADDR_SHIFT) & MII_ACCESS_PHY_ADDR) - | ((idx << MII_ACCESS_REG_ADDR_SHIFT) & MII_ACCESS_REG_ADDR) - | MII_ACCESS_WRITE; - ret = smsc75xx_write_reg(dev, MII_ACCESS, addr); - check_warn_goto_done(ret, "Error writing MII_ACCESS"); - - ret = smsc75xx_phy_wait_not_busy(dev); - check_warn_goto_done(ret, "Timed out writing MII reg %02X", idx); - -done: - mutex_unlock(&dev->phy_mutex); -} - -static int smsc75xx_wait_eeprom(struct usbnet *dev) -{ - unsigned long start_time = jiffies; - u32 val; - int ret; - - do { - ret = smsc75xx_read_reg(dev, E2P_CMD, &val); - check_warn_return(ret, "Error reading E2P_CMD"); - - if (!(val & E2P_CMD_BUSY) || (val & E2P_CMD_TIMEOUT)) - break; - udelay(40); - } while (!time_after(jiffies, start_time + HZ)); - - if (val & (E2P_CMD_TIMEOUT | E2P_CMD_BUSY)) { - netdev_warn(dev->net, "EEPROM read operation timeout"); - return -EIO; - } - - return 0; -} - -static int smsc75xx_eeprom_confirm_not_busy(struct usbnet *dev) -{ - unsigned long start_time = jiffies; - u32 val; - int ret; - - do { - ret = smsc75xx_read_reg(dev, E2P_CMD, &val); - check_warn_return(ret, "Error reading E2P_CMD"); - - if (!(val & E2P_CMD_BUSY)) - return 0; - - udelay(40); - } while (!time_after(jiffies, start_time + HZ)); - - netdev_warn(dev->net, "EEPROM is busy"); - return -EIO; -} - -static int smsc75xx_read_eeprom(struct usbnet *dev, u32 offset, u32 length, - u8 *data) -{ - u32 val; - int i, ret; - - BUG_ON(!dev); - BUG_ON(!data); - - ret = smsc75xx_eeprom_confirm_not_busy(dev); - if (ret) - return ret; - - for (i = 0; i < length; i++) { - val = E2P_CMD_BUSY | E2P_CMD_READ | (offset & E2P_CMD_ADDR); - ret = smsc75xx_write_reg(dev, E2P_CMD, val); - check_warn_return(ret, "Error writing E2P_CMD"); - - ret = smsc75xx_wait_eeprom(dev); - if (ret < 0) - return ret; - - ret = smsc75xx_read_reg(dev, E2P_DATA, &val); - check_warn_return(ret, "Error reading E2P_DATA"); - - data[i] = val & 0xFF; - offset++; - } - - return 0; -} - -static int smsc75xx_write_eeprom(struct usbnet *dev, u32 offset, u32 length, - u8 *data) -{ - u32 val; - int i, ret; - - BUG_ON(!dev); - BUG_ON(!data); - - ret = smsc75xx_eeprom_confirm_not_busy(dev); - if (ret) - return ret; - - /* Issue write/erase enable command */ - val = E2P_CMD_BUSY | E2P_CMD_EWEN; - ret = smsc75xx_write_reg(dev, E2P_CMD, val); - check_warn_return(ret, "Error writing E2P_CMD"); - - ret = smsc75xx_wait_eeprom(dev); - if (ret < 0) - return ret; - - for (i = 0; i < length; i++) { - - /* Fill data register */ - val = data[i]; - ret = smsc75xx_write_reg(dev, E2P_DATA, val); - check_warn_return(ret, "Error writing E2P_DATA"); - - /* Send "write" command */ - val = E2P_CMD_BUSY | E2P_CMD_WRITE | (offset & E2P_CMD_ADDR); - ret = smsc75xx_write_reg(dev, E2P_CMD, val); - check_warn_return(ret, "Error writing E2P_CMD"); - - ret = smsc75xx_wait_eeprom(dev); - if (ret < 0) - return ret; - - offset++; - } - - return 0; -} - -static int smsc75xx_dataport_wait_not_busy(struct usbnet *dev) -{ - int i, ret; - - for (i = 0; i < 100; i++) { - u32 dp_sel; - ret = smsc75xx_read_reg(dev, DP_SEL, &dp_sel); - check_warn_return(ret, "Error reading DP_SEL"); - - if (dp_sel & DP_SEL_DPRDY) - return 0; - - udelay(40); - } - - netdev_warn(dev->net, "smsc75xx_dataport_wait_not_busy timed out"); - - return -EIO; -} - -static int smsc75xx_dataport_write(struct usbnet *dev, u32 ram_select, u32 addr, - u32 length, u32 *buf) -{ - struct smsc75xx_priv *pdata = (struct smsc75xx_priv *)(dev->data[0]); - u32 dp_sel; - int i, ret; - - mutex_lock(&pdata->dataport_mutex); - - ret = smsc75xx_dataport_wait_not_busy(dev); - check_warn_goto_done(ret, "smsc75xx_dataport_write busy on entry"); - - ret = smsc75xx_read_reg(dev, DP_SEL, &dp_sel); - check_warn_goto_done(ret, "Error reading DP_SEL"); - - dp_sel &= ~DP_SEL_RSEL; - dp_sel |= ram_select; - ret = smsc75xx_write_reg(dev, DP_SEL, dp_sel); - check_warn_goto_done(ret, "Error writing DP_SEL"); - - for (i = 0; i < length; i++) { - ret = smsc75xx_write_reg(dev, DP_ADDR, addr + i); - check_warn_goto_done(ret, "Error writing DP_ADDR"); - - ret = smsc75xx_write_reg(dev, DP_DATA, buf[i]); - check_warn_goto_done(ret, "Error writing DP_DATA"); - - ret = smsc75xx_write_reg(dev, DP_CMD, DP_CMD_WRITE); - check_warn_goto_done(ret, "Error writing DP_CMD"); - - ret = smsc75xx_dataport_wait_not_busy(dev); - check_warn_goto_done(ret, "smsc75xx_dataport_write timeout"); - } - -done: - mutex_unlock(&pdata->dataport_mutex); - return ret; -} - -/* returns hash bit number for given MAC address */ -static u32 smsc75xx_hash(char addr[ETH_ALEN]) -{ - return (ether_crc(ETH_ALEN, addr) >> 23) & 0x1ff; -} - -static void smsc75xx_deferred_multicast_write(struct work_struct *param) -{ - struct smsc75xx_priv *pdata = - container_of(param, struct smsc75xx_priv, set_multicast); - struct usbnet *dev = pdata->dev; - int ret; - - netif_dbg(dev, drv, dev->net, "deferred multicast write 0x%08x", - pdata->rfe_ctl); - - smsc75xx_dataport_write(dev, DP_SEL_VHF, DP_SEL_VHF_VLAN_LEN, - DP_SEL_VHF_HASH_LEN, pdata->multicast_hash_table); - - ret = smsc75xx_write_reg(dev, RFE_CTL, pdata->rfe_ctl); - check_warn(ret, "Error writing RFE_CRL"); -} - -static void smsc75xx_set_multicast(struct net_device *netdev) -{ - struct usbnet *dev = netdev_priv(netdev); - struct smsc75xx_priv *pdata = (struct smsc75xx_priv *)(dev->data[0]); - unsigned long flags; - int i; - - spin_lock_irqsave(&pdata->rfe_ctl_lock, flags); - - pdata->rfe_ctl &= - ~(RFE_CTL_AU | RFE_CTL_AM | RFE_CTL_DPF | RFE_CTL_MHF); - pdata->rfe_ctl |= RFE_CTL_AB; - - for (i = 0; i < DP_SEL_VHF_HASH_LEN; i++) - pdata->multicast_hash_table[i] = 0; - - if (dev->net->flags & IFF_PROMISC) { - netif_dbg(dev, drv, dev->net, "promiscuous mode enabled"); - pdata->rfe_ctl |= RFE_CTL_AM | RFE_CTL_AU; - } else if (dev->net->flags & IFF_ALLMULTI) { - netif_dbg(dev, drv, dev->net, "receive all multicast enabled"); - pdata->rfe_ctl |= RFE_CTL_AM | RFE_CTL_DPF; - } else if (!netdev_mc_empty(dev->net)) { - struct dev_mc_list *mc_list; - - netif_dbg(dev, drv, dev->net, "receive multicast hash filter"); - - pdata->rfe_ctl |= RFE_CTL_MHF | RFE_CTL_DPF; - - netdev_for_each_mc_addr(mc_list, netdev) { - u32 bitnum = smsc75xx_hash(mc_list->dmi_addr); - pdata->multicast_hash_table[bitnum / 32] |= - (1 << (bitnum % 32)); - } - } else { - netif_dbg(dev, drv, dev->net, "receive own packets only"); - pdata->rfe_ctl |= RFE_CTL_DPF; - } - - spin_unlock_irqrestore(&pdata->rfe_ctl_lock, flags); - - /* defer register writes to a sleepable context */ - schedule_work(&pdata->set_multicast); -} - -static int smsc75xx_update_flowcontrol(struct usbnet *dev, u8 duplex, - u16 lcladv, u16 rmtadv) -{ - u32 flow = 0, fct_flow = 0; - int ret; - - if (duplex == DUPLEX_FULL) { - u8 cap = mii_resolve_flowctrl_fdx(lcladv, rmtadv); - - if (cap & FLOW_CTRL_TX) { - flow = (FLOW_TX_FCEN | 0xFFFF); - /* set fct_flow thresholds to 20% and 80% */ - fct_flow = (8 << 8) | 32; - } - - if (cap & FLOW_CTRL_RX) - flow |= FLOW_RX_FCEN; - - netif_dbg(dev, link, dev->net, "rx pause %s, tx pause %s", - (cap & FLOW_CTRL_RX ? "enabled" : "disabled"), - (cap & FLOW_CTRL_TX ? "enabled" : "disabled")); - } else { - netif_dbg(dev, link, dev->net, "half duplex"); - } - - ret = smsc75xx_write_reg(dev, FLOW, flow); - check_warn_return(ret, "Error writing FLOW"); - - ret = smsc75xx_write_reg(dev, FCT_FLOW, fct_flow); - check_warn_return(ret, "Error writing FCT_FLOW"); - - return 0; -} - -static int smsc75xx_link_reset(struct usbnet *dev) -{ - struct mii_if_info *mii = &dev->mii; - struct ethtool_cmd ecmd; - u16 lcladv, rmtadv; - int ret; - - /* clear interrupt status */ - ret = smsc75xx_mdio_read(dev->net, mii->phy_id, PHY_INT_SRC); - check_warn_return(ret, "Error reading PHY_INT_SRC"); - - ret = smsc75xx_write_reg(dev, INT_STS, INT_STS_CLEAR_ALL); - check_warn_return(ret, "Error writing INT_STS"); - - mii_check_media(mii, 1, 1); - mii_ethtool_gset(&dev->mii, &ecmd); - lcladv = smsc75xx_mdio_read(dev->net, mii->phy_id, MII_ADVERTISE); - rmtadv = smsc75xx_mdio_read(dev->net, mii->phy_id, MII_LPA); - - netif_dbg(dev, link, dev->net, "speed: %d duplex: %d lcladv: %04x" - " rmtadv: %04x", ecmd.speed, ecmd.duplex, lcladv, rmtadv); - - return smsc75xx_update_flowcontrol(dev, ecmd.duplex, lcladv, rmtadv); -} - -static void smsc75xx_status(struct usbnet *dev, struct urb *urb) -{ - u32 intdata; - - if (urb->actual_length != 4) { - netdev_warn(dev->net, - "unexpected urb length %d", urb->actual_length); - return; - } - - memcpy(&intdata, urb->transfer_buffer, 4); - le32_to_cpus(&intdata); - - netif_dbg(dev, link, dev->net, "intdata: 0x%08X", intdata); - - if (intdata & INT_ENP_PHY_INT) - usbnet_defer_kevent(dev, EVENT_LINK_RESET); - else - netdev_warn(dev->net, - "unexpected interrupt, intdata=0x%08X", intdata); -} - -/* Enable or disable Rx checksum offload engine */ -static int smsc75xx_set_rx_csum_offload(struct usbnet *dev) -{ - struct smsc75xx_priv *pdata = (struct smsc75xx_priv *)(dev->data[0]); - unsigned long flags; - int ret; - - spin_lock_irqsave(&pdata->rfe_ctl_lock, flags); - - if (pdata->use_rx_csum) - pdata->rfe_ctl |= RFE_CTL_TCPUDP_CKM | RFE_CTL_IP_CKM; - else - pdata->rfe_ctl &= ~(RFE_CTL_TCPUDP_CKM | RFE_CTL_IP_CKM); - - spin_unlock_irqrestore(&pdata->rfe_ctl_lock, flags); - - ret = smsc75xx_write_reg(dev, RFE_CTL, pdata->rfe_ctl); - check_warn_return(ret, "Error writing RFE_CTL"); - - return 0; -} - -static int smsc75xx_ethtool_get_eeprom_len(struct net_device *net) -{ - return MAX_EEPROM_SIZE; -} - -static int smsc75xx_ethtool_get_eeprom(struct net_device *netdev, - struct ethtool_eeprom *ee, u8 *data) -{ - struct usbnet *dev = netdev_priv(netdev); - - ee->magic = LAN75XX_EEPROM_MAGIC; - - return smsc75xx_read_eeprom(dev, ee->offset, ee->len, data); -} - -static int smsc75xx_ethtool_set_eeprom(struct net_device *netdev, - struct ethtool_eeprom *ee, u8 *data) -{ - struct usbnet *dev = netdev_priv(netdev); - - if (ee->magic != LAN75XX_EEPROM_MAGIC) { - netdev_warn(dev->net, - "EEPROM: magic value mismatch: 0x%x", ee->magic); - return -EINVAL; - } - - return smsc75xx_write_eeprom(dev, ee->offset, ee->len, data); -} - -static u32 smsc75xx_ethtool_get_rx_csum(struct net_device *netdev) -{ - struct usbnet *dev = netdev_priv(netdev); - struct smsc75xx_priv *pdata = (struct smsc75xx_priv *)(dev->data[0]); - - return pdata->use_rx_csum; -} - -static int smsc75xx_ethtool_set_rx_csum(struct net_device *netdev, u32 val) -{ - struct usbnet *dev = netdev_priv(netdev); - struct smsc75xx_priv *pdata = (struct smsc75xx_priv *)(dev->data[0]); - - pdata->use_rx_csum = !!val; - - return smsc75xx_set_rx_csum_offload(dev); -} - -static int smsc75xx_ethtool_set_tso(struct net_device *netdev, u32 data) -{ - if (data) - netdev->features |= NETIF_F_TSO | NETIF_F_TSO6; - else - netdev->features &= ~(NETIF_F_TSO | NETIF_F_TSO6); - - return 0; -} - -static const struct ethtool_ops smsc75xx_ethtool_ops = { - .get_link = usbnet_get_link, - .nway_reset = usbnet_nway_reset, - .get_drvinfo = usbnet_get_drvinfo, - .get_msglevel = usbnet_get_msglevel, - .set_msglevel = usbnet_set_msglevel, - .get_settings = usbnet_get_settings, - .set_settings = usbnet_set_settings, - .get_eeprom_len = smsc75xx_ethtool_get_eeprom_len, - .get_eeprom = smsc75xx_ethtool_get_eeprom, - .set_eeprom = smsc75xx_ethtool_set_eeprom, - .get_tx_csum = ethtool_op_get_tx_csum, - .set_tx_csum = ethtool_op_set_tx_hw_csum, - .get_rx_csum = smsc75xx_ethtool_get_rx_csum, - .set_rx_csum = smsc75xx_ethtool_set_rx_csum, - .get_tso = ethtool_op_get_tso, - .set_tso = smsc75xx_ethtool_set_tso, -}; - -static int smsc75xx_ioctl(struct net_device *netdev, struct ifreq *rq, int cmd) -{ - struct usbnet *dev = netdev_priv(netdev); - - if (!netif_running(netdev)) - return -EINVAL; - - return generic_mii_ioctl(&dev->mii, if_mii(rq), cmd, NULL); -} - -static void smsc75xx_init_mac_address(struct usbnet *dev) -{ - /* try reading mac address from EEPROM */ - if (smsc75xx_read_eeprom(dev, EEPROM_MAC_OFFSET, ETH_ALEN, - dev->net->dev_addr) == 0) { - if (is_valid_ether_addr(dev->net->dev_addr)) { - /* eeprom values are valid so use them */ - netif_dbg(dev, ifup, dev->net, - "MAC address read from EEPROM"); - return; - } - } - - /* no eeprom, or eeprom values are invalid. generate random MAC */ - random_ether_addr(dev->net->dev_addr); - netif_dbg(dev, ifup, dev->net, "MAC address set to random_ether_addr"); -} - -static int smsc75xx_set_mac_address(struct usbnet *dev) -{ - u32 addr_lo = dev->net->dev_addr[0] | dev->net->dev_addr[1] << 8 | - dev->net->dev_addr[2] << 16 | dev->net->dev_addr[3] << 24; - u32 addr_hi = dev->net->dev_addr[4] | dev->net->dev_addr[5] << 8; - - int ret = smsc75xx_write_reg(dev, RX_ADDRH, addr_hi); - check_warn_return(ret, "Failed to write RX_ADDRH: %d", ret); - - ret = smsc75xx_write_reg(dev, RX_ADDRL, addr_lo); - check_warn_return(ret, "Failed to write RX_ADDRL: %d", ret); - - addr_hi |= ADDR_FILTX_FB_VALID; - ret = smsc75xx_write_reg(dev, ADDR_FILTX, addr_hi); - check_warn_return(ret, "Failed to write ADDR_FILTX: %d", ret); - - ret = smsc75xx_write_reg(dev, ADDR_FILTX + 4, addr_lo); - check_warn_return(ret, "Failed to write ADDR_FILTX+4: %d", ret); - - return 0; -} - -static int smsc75xx_phy_initialize(struct usbnet *dev) -{ - int bmcr, timeout = 0; - - /* Initialize MII structure */ - dev->mii.dev = dev->net; - dev->mii.mdio_read = smsc75xx_mdio_read; - dev->mii.mdio_write = smsc75xx_mdio_write; - dev->mii.phy_id_mask = 0x1f; - dev->mii.reg_num_mask = 0x1f; - dev->mii.phy_id = SMSC75XX_INTERNAL_PHY_ID; - - /* reset phy and wait for reset to complete */ - smsc75xx_mdio_write(dev->net, dev->mii.phy_id, MII_BMCR, BMCR_RESET); - - do { - msleep(10); - bmcr = smsc75xx_mdio_read(dev->net, dev->mii.phy_id, MII_BMCR); - check_warn_return(bmcr, "Error reading MII_BMCR"); - timeout++; - } while ((bmcr & MII_BMCR) && (timeout < 100)); - - if (timeout >= 100) { - netdev_warn(dev->net, "timeout on PHY Reset"); - return -EIO; - } - - smsc75xx_mdio_write(dev->net, dev->mii.phy_id, MII_ADVERTISE, - ADVERTISE_ALL | ADVERTISE_CSMA | ADVERTISE_PAUSE_CAP | - ADVERTISE_PAUSE_ASYM); - - /* read to clear */ - smsc75xx_mdio_read(dev->net, dev->mii.phy_id, PHY_INT_SRC); - check_warn_return(bmcr, "Error reading PHY_INT_SRC"); - - smsc75xx_mdio_write(dev->net, dev->mii.phy_id, PHY_INT_MASK, - PHY_INT_MASK_DEFAULT); - mii_nway_restart(&dev->mii); - - netif_dbg(dev, ifup, dev->net, "phy initialised successfully"); - return 0; -} - -static int smsc75xx_set_rx_max_frame_length(struct usbnet *dev, int size) -{ - int ret = 0; - u32 buf; - bool rxenabled; - - ret = smsc75xx_read_reg(dev, MAC_RX, &buf); - check_warn_return(ret, "Failed to read MAC_RX: %d", ret); - - rxenabled = ((buf & MAC_RX_RXEN) != 0); - - if (rxenabled) { - buf &= ~MAC_RX_RXEN; - ret = smsc75xx_write_reg(dev, MAC_RX, buf); - check_warn_return(ret, "Failed to write MAC_RX: %d", ret); - } - - /* add 4 to size for FCS */ - buf &= ~MAC_RX_MAX_SIZE; - buf |= (((size + 4) << MAC_RX_MAX_SIZE_SHIFT) & MAC_RX_MAX_SIZE); - - ret = smsc75xx_write_reg(dev, MAC_RX, buf); - check_warn_return(ret, "Failed to write MAC_RX: %d", ret); - - if (rxenabled) { - buf |= MAC_RX_RXEN; - ret = smsc75xx_write_reg(dev, MAC_RX, buf); - check_warn_return(ret, "Failed to write MAC_RX: %d", ret); - } - - return 0; -} - -static int smsc75xx_change_mtu(struct net_device *netdev, int new_mtu) -{ - struct usbnet *dev = netdev_priv(netdev); - - int ret = smsc75xx_set_rx_max_frame_length(dev, new_mtu); - check_warn_return(ret, "Failed to set mac rx frame length"); - - return usbnet_change_mtu(netdev, new_mtu); -} - -static int smsc75xx_reset(struct usbnet *dev) -{ - struct smsc75xx_priv *pdata = (struct smsc75xx_priv *)(dev->data[0]); - u32 buf; - int ret = 0, timeout; - - netif_dbg(dev, ifup, dev->net, "entering smsc75xx_reset"); - - ret = smsc75xx_read_reg(dev, HW_CFG, &buf); - check_warn_return(ret, "Failed to read HW_CFG: %d", ret); - - buf |= HW_CFG_LRST; - - ret = smsc75xx_write_reg(dev, HW_CFG, buf); - check_warn_return(ret, "Failed to write HW_CFG: %d", ret); - - timeout = 0; - do { - msleep(10); - ret = smsc75xx_read_reg(dev, HW_CFG, &buf); - check_warn_return(ret, "Failed to read HW_CFG: %d", ret); - timeout++; - } while ((buf & HW_CFG_LRST) && (timeout < 100)); - - if (timeout >= 100) { - netdev_warn(dev->net, "timeout on completion of Lite Reset"); - return -EIO; - } - - netif_dbg(dev, ifup, dev->net, "Lite reset complete, resetting PHY"); - - ret = smsc75xx_read_reg(dev, PMT_CTL, &buf); - check_warn_return(ret, "Failed to read PMT_CTL: %d", ret); - - buf |= PMT_CTL_PHY_RST; - - ret = smsc75xx_write_reg(dev, PMT_CTL, buf); - check_warn_return(ret, "Failed to write PMT_CTL: %d", ret); - - timeout = 0; - do { - msleep(10); - ret = smsc75xx_read_reg(dev, PMT_CTL, &buf); - check_warn_return(ret, "Failed to read PMT_CTL: %d", ret); - timeout++; - } while ((buf & PMT_CTL_PHY_RST) && (timeout < 100)); - - if (timeout >= 100) { - netdev_warn(dev->net, "timeout waiting for PHY Reset"); - return -EIO; - } - - netif_dbg(dev, ifup, dev->net, "PHY reset complete"); - - smsc75xx_init_mac_address(dev); - - ret = smsc75xx_set_mac_address(dev); - check_warn_return(ret, "Failed to set mac address"); - - netif_dbg(dev, ifup, dev->net, "MAC Address: %pM", dev->net->dev_addr); - - ret = smsc75xx_read_reg(dev, HW_CFG, &buf); - check_warn_return(ret, "Failed to read HW_CFG: %d", ret); - - netif_dbg(dev, ifup, dev->net, "Read Value from HW_CFG : 0x%08x", buf); - - buf |= HW_CFG_BIR; - - ret = smsc75xx_write_reg(dev, HW_CFG, buf); - check_warn_return(ret, "Failed to write HW_CFG: %d", ret); - - ret = smsc75xx_read_reg(dev, HW_CFG, &buf); - check_warn_return(ret, "Failed to read HW_CFG: %d", ret); - - netif_dbg(dev, ifup, dev->net, "Read Value from HW_CFG after " - "writing HW_CFG_BIR: 0x%08x", buf); - - if (!turbo_mode) { - buf = 0; - dev->rx_urb_size = MAX_SINGLE_PACKET_SIZE; - } else if (dev->udev->speed == USB_SPEED_HIGH) { - buf = DEFAULT_HS_BURST_CAP_SIZE / HS_USB_PKT_SIZE; - dev->rx_urb_size = DEFAULT_HS_BURST_CAP_SIZE; - } else { - buf = DEFAULT_FS_BURST_CAP_SIZE / FS_USB_PKT_SIZE; - dev->rx_urb_size = DEFAULT_FS_BURST_CAP_SIZE; - } - - netif_dbg(dev, ifup, dev->net, "rx_urb_size=%ld", - (ulong)dev->rx_urb_size); - - ret = smsc75xx_write_reg(dev, BURST_CAP, buf); - check_warn_return(ret, "Failed to write BURST_CAP: %d", ret); - - ret = smsc75xx_read_reg(dev, BURST_CAP, &buf); - check_warn_return(ret, "Failed to read BURST_CAP: %d", ret); - - netif_dbg(dev, ifup, dev->net, - "Read Value from BURST_CAP after writing: 0x%08x", buf); - - ret = smsc75xx_write_reg(dev, BULK_IN_DLY, DEFAULT_BULK_IN_DELAY); - check_warn_return(ret, "Failed to write BULK_IN_DLY: %d", ret); - - ret = smsc75xx_read_reg(dev, BULK_IN_DLY, &buf); - check_warn_return(ret, "Failed to read BULK_IN_DLY: %d", ret); - - netif_dbg(dev, ifup, dev->net, - "Read Value from BULK_IN_DLY after writing: 0x%08x", buf); - - if (turbo_mode) { - ret = smsc75xx_read_reg(dev, HW_CFG, &buf); - check_warn_return(ret, "Failed to read HW_CFG: %d", ret); - - netif_dbg(dev, ifup, dev->net, "HW_CFG: 0x%08x", buf); - - buf |= (HW_CFG_MEF | HW_CFG_BCE); - - ret = smsc75xx_write_reg(dev, HW_CFG, buf); - check_warn_return(ret, "Failed to write HW_CFG: %d", ret); - - ret = smsc75xx_read_reg(dev, HW_CFG, &buf); - check_warn_return(ret, "Failed to read HW_CFG: %d", ret); - - netif_dbg(dev, ifup, dev->net, "HW_CFG: 0x%08x", buf); - } - - /* set FIFO sizes */ - buf = (MAX_RX_FIFO_SIZE - 512) / 512; - ret = smsc75xx_write_reg(dev, FCT_RX_FIFO_END, buf); - check_warn_return(ret, "Failed to write FCT_RX_FIFO_END: %d", ret); - - netif_dbg(dev, ifup, dev->net, "FCT_RX_FIFO_END set to 0x%08x", buf); - - buf = (MAX_TX_FIFO_SIZE - 512) / 512; - ret = smsc75xx_write_reg(dev, FCT_TX_FIFO_END, buf); - check_warn_return(ret, "Failed to write FCT_TX_FIFO_END: %d", ret); - - netif_dbg(dev, ifup, dev->net, "FCT_TX_FIFO_END set to 0x%08x", buf); - - ret = smsc75xx_write_reg(dev, INT_STS, INT_STS_CLEAR_ALL); - check_warn_return(ret, "Failed to write INT_STS: %d", ret); - - ret = smsc75xx_read_reg(dev, ID_REV, &buf); - check_warn_return(ret, "Failed to read ID_REV: %d", ret); - - netif_dbg(dev, ifup, dev->net, "ID_REV = 0x%08x", buf); - - /* Configure GPIO pins as LED outputs */ - ret = smsc75xx_read_reg(dev, LED_GPIO_CFG, &buf); - check_warn_return(ret, "Failed to read LED_GPIO_CFG: %d", ret); - - buf &= ~(LED_GPIO_CFG_LED2_FUN_SEL | LED_GPIO_CFG_LED10_FUN_SEL); - buf |= LED_GPIO_CFG_LEDGPIO_EN | LED_GPIO_CFG_LED2_FUN_SEL; - - ret = smsc75xx_write_reg(dev, LED_GPIO_CFG, buf); - check_warn_return(ret, "Failed to write LED_GPIO_CFG: %d", ret); - - ret = smsc75xx_write_reg(dev, FLOW, 0); - check_warn_return(ret, "Failed to write FLOW: %d", ret); - - ret = smsc75xx_write_reg(dev, FCT_FLOW, 0); - check_warn_return(ret, "Failed to write FCT_FLOW: %d", ret); - - /* Don't need rfe_ctl_lock during initialisation */ - ret = smsc75xx_read_reg(dev, RFE_CTL, &pdata->rfe_ctl); - check_warn_return(ret, "Failed to read RFE_CTL: %d", ret); - - pdata->rfe_ctl |= RFE_CTL_AB | RFE_CTL_DPF; - - ret = smsc75xx_write_reg(dev, RFE_CTL, pdata->rfe_ctl); - check_warn_return(ret, "Failed to write RFE_CTL: %d", ret); - - ret = smsc75xx_read_reg(dev, RFE_CTL, &pdata->rfe_ctl); - check_warn_return(ret, "Failed to read RFE_CTL: %d", ret); - - netif_dbg(dev, ifup, dev->net, "RFE_CTL set to 0x%08x", pdata->rfe_ctl); - - /* Enable or disable checksum offload engines */ - ethtool_op_set_tx_hw_csum(dev->net, DEFAULT_TX_CSUM_ENABLE); - ret = smsc75xx_set_rx_csum_offload(dev); - check_warn_return(ret, "Failed to set rx csum offload: %d", ret); - - smsc75xx_ethtool_set_tso(dev->net, DEFAULT_TSO_ENABLE); - - smsc75xx_set_multicast(dev->net); - - ret = smsc75xx_phy_initialize(dev); - check_warn_return(ret, "Failed to initialize PHY: %d", ret); - - ret = smsc75xx_read_reg(dev, INT_EP_CTL, &buf); - check_warn_return(ret, "Failed to read INT_EP_CTL: %d", ret); - - /* enable PHY interrupts */ - buf |= INT_ENP_PHY_INT; - - ret = smsc75xx_write_reg(dev, INT_EP_CTL, buf); - check_warn_return(ret, "Failed to write INT_EP_CTL: %d", ret); - - ret = smsc75xx_read_reg(dev, MAC_TX, &buf); - check_warn_return(ret, "Failed to read MAC_TX: %d", ret); - - buf |= MAC_TX_TXEN; - - ret = smsc75xx_write_reg(dev, MAC_TX, buf); - check_warn_return(ret, "Failed to write MAC_TX: %d", ret); - - netif_dbg(dev, ifup, dev->net, "MAC_TX set to 0x%08x", buf); - - ret = smsc75xx_read_reg(dev, FCT_TX_CTL, &buf); - check_warn_return(ret, "Failed to read FCT_TX_CTL: %d", ret); - - buf |= FCT_TX_CTL_EN; - - ret = smsc75xx_write_reg(dev, FCT_TX_CTL, buf); - check_warn_return(ret, "Failed to write FCT_TX_CTL: %d", ret); - - netif_dbg(dev, ifup, dev->net, "FCT_TX_CTL set to 0x%08x", buf); - - ret = smsc75xx_set_rx_max_frame_length(dev, 1514); - check_warn_return(ret, "Failed to set max rx frame length"); - - ret = smsc75xx_read_reg(dev, MAC_RX, &buf); - check_warn_return(ret, "Failed to read MAC_RX: %d", ret); - - buf |= MAC_RX_RXEN; - - ret = smsc75xx_write_reg(dev, MAC_RX, buf); - check_warn_return(ret, "Failed to write MAC_RX: %d", ret); - - netif_dbg(dev, ifup, dev->net, "MAC_RX set to 0x%08x", buf); - - ret = smsc75xx_read_reg(dev, FCT_RX_CTL, &buf); - check_warn_return(ret, "Failed to read FCT_RX_CTL: %d", ret); - - buf |= FCT_RX_CTL_EN; - - ret = smsc75xx_write_reg(dev, FCT_RX_CTL, buf); - check_warn_return(ret, "Failed to write FCT_RX_CTL: %d", ret); - - netif_dbg(dev, ifup, dev->net, "FCT_RX_CTL set to 0x%08x", buf); - - netif_dbg(dev, ifup, dev->net, "smsc75xx_reset, return 0"); - return 0; -} - -static const struct net_device_ops smsc75xx_netdev_ops = { - .ndo_open = usbnet_open, - .ndo_stop = usbnet_stop, - .ndo_start_xmit = usbnet_start_xmit, - .ndo_tx_timeout = usbnet_tx_timeout, - .ndo_change_mtu = smsc75xx_change_mtu, - .ndo_set_mac_address = eth_mac_addr, - .ndo_validate_addr = eth_validate_addr, - .ndo_do_ioctl = smsc75xx_ioctl, - .ndo_set_multicast_list = smsc75xx_set_multicast, -}; - -static int smsc75xx_bind(struct usbnet *dev, struct usb_interface *intf) -{ - struct smsc75xx_priv *pdata = NULL; - int ret; - - printk(KERN_INFO SMSC_CHIPNAME " v" SMSC_DRIVER_VERSION "\n"); - - ret = usbnet_get_endpoints(dev, intf); - check_warn_return(ret, "usbnet_get_endpoints failed: %d", ret); - - dev->data[0] = (unsigned long)kzalloc(sizeof(struct smsc75xx_priv), - GFP_KERNEL); - - pdata = (struct smsc75xx_priv *)(dev->data[0]); - if (!pdata) { - netdev_warn(dev->net, "Unable to allocate smsc75xx_priv"); - return -ENOMEM; - } - - pdata->dev = dev; - - spin_lock_init(&pdata->rfe_ctl_lock); - mutex_init(&pdata->dataport_mutex); - - INIT_WORK(&pdata->set_multicast, smsc75xx_deferred_multicast_write); - - pdata->use_rx_csum = DEFAULT_RX_CSUM_ENABLE; - - /* We have to advertise SG otherwise TSO cannot be enabled */ - dev->net->features |= NETIF_F_SG; - - /* Init all registers */ - ret = smsc75xx_reset(dev); - - dev->net->netdev_ops = &smsc75xx_netdev_ops; - dev->net->ethtool_ops = &smsc75xx_ethtool_ops; - dev->net->flags |= IFF_MULTICAST; - dev->net->hard_header_len += SMSC75XX_TX_OVERHEAD; - return 0; -} - -static void smsc75xx_unbind(struct usbnet *dev, struct usb_interface *intf) -{ - struct smsc75xx_priv *pdata = (struct smsc75xx_priv *)(dev->data[0]); - if (pdata) { - netif_dbg(dev, ifdown, dev->net, "free pdata"); - kfree(pdata); - pdata = NULL; - dev->data[0] = 0; - } -} - -static void smsc75xx_rx_csum_offload(struct sk_buff *skb, u32 rx_cmd_a, - u32 rx_cmd_b) -{ - if (unlikely(rx_cmd_a & RX_CMD_A_LCSM)) { - skb->ip_summed = CHECKSUM_NONE; - } else { - skb->csum = ntohs((u16)(rx_cmd_b >> RX_CMD_B_CSUM_SHIFT)); - skb->ip_summed = CHECKSUM_COMPLETE; - } -} - -static int smsc75xx_rx_fixup(struct usbnet *dev, struct sk_buff *skb) -{ - struct smsc75xx_priv *pdata = (struct smsc75xx_priv *)(dev->data[0]); - - while (skb->len > 0) { - u32 rx_cmd_a, rx_cmd_b, align_count, size; - struct sk_buff *ax_skb; - unsigned char *packet; - - memcpy(&rx_cmd_a, skb->data, sizeof(rx_cmd_a)); - le32_to_cpus(&rx_cmd_a); - skb_pull(skb, 4); - - memcpy(&rx_cmd_b, skb->data, sizeof(rx_cmd_b)); - le32_to_cpus(&rx_cmd_b); - skb_pull(skb, 4 + NET_IP_ALIGN); - - packet = skb->data; - - /* get the packet length */ - size = (rx_cmd_a & RX_CMD_A_LEN) - NET_IP_ALIGN; - align_count = (4 - ((size + NET_IP_ALIGN) % 4)) % 4; - - if (unlikely(rx_cmd_a & RX_CMD_A_RED)) { - netif_dbg(dev, rx_err, dev->net, - "Error rx_cmd_a=0x%08x", rx_cmd_a); - dev->net->stats.rx_errors++; - dev->net->stats.rx_dropped++; - - if (rx_cmd_a & RX_CMD_A_FCS) - dev->net->stats.rx_crc_errors++; - else if (rx_cmd_a & (RX_CMD_A_LONG | RX_CMD_A_RUNT)) - dev->net->stats.rx_frame_errors++; - } else { - /* ETH_FRAME_LEN + 4(CRC) + 2(COE) + 4(Vlan) */ - if (unlikely(size > (ETH_FRAME_LEN + 12))) { - netif_dbg(dev, rx_err, dev->net, - "size err rx_cmd_a=0x%08x", rx_cmd_a); - return 0; - } - - /* last frame in this batch */ - if (skb->len == size) { - if (pdata->use_rx_csum) - smsc75xx_rx_csum_offload(skb, rx_cmd_a, - rx_cmd_b); - else - skb->ip_summed = CHECKSUM_NONE; - - skb_trim(skb, skb->len - 4); /* remove fcs */ - skb->truesize = size + sizeof(struct sk_buff); - - return 1; - } - - ax_skb = skb_clone(skb, GFP_ATOMIC); - if (unlikely(!ax_skb)) { - netdev_warn(dev->net, "Error allocating skb"); - return 0; - } - - ax_skb->len = size; - ax_skb->data = packet; - skb_set_tail_pointer(ax_skb, size); - - if (pdata->use_rx_csum) - smsc75xx_rx_csum_offload(ax_skb, rx_cmd_a, - rx_cmd_b); - else - ax_skb->ip_summed = CHECKSUM_NONE; - - skb_trim(ax_skb, ax_skb->len - 4); /* remove fcs */ - ax_skb->truesize = size + sizeof(struct sk_buff); - - usbnet_skb_return(dev, ax_skb); - } - - skb_pull(skb, size); - - /* padding bytes before the next frame starts */ - if (skb->len) - skb_pull(skb, align_count); - } - - if (unlikely(skb->len < 0)) { - netdev_warn(dev->net, "invalid rx length<0 %d", skb->len); - return 0; - } - - return 1; -} - -static struct sk_buff *smsc75xx_tx_fixup(struct usbnet *dev, - struct sk_buff *skb, gfp_t flags) -{ - u32 tx_cmd_a, tx_cmd_b; - - skb_linearize(skb); - - if (skb_headroom(skb) < SMSC75XX_TX_OVERHEAD) { - struct sk_buff *skb2 = - skb_copy_expand(skb, SMSC75XX_TX_OVERHEAD, 0, flags); - dev_kfree_skb_any(skb); - skb = skb2; - if (!skb) - return NULL; - } - - tx_cmd_a = (u32)(skb->len & TX_CMD_A_LEN) | TX_CMD_A_FCS; - - if (skb->ip_summed == CHECKSUM_PARTIAL) - tx_cmd_a |= TX_CMD_A_IPE | TX_CMD_A_TPE; - - if (skb_is_gso(skb)) { - u16 mss = max(skb_shinfo(skb)->gso_size, TX_MSS_MIN); - tx_cmd_b = (mss << TX_CMD_B_MSS_SHIFT) & TX_CMD_B_MSS; - - tx_cmd_a |= TX_CMD_A_LSO; - } else { - tx_cmd_b = 0; - } - - skb_push(skb, 4); - cpu_to_le32s(&tx_cmd_b); - memcpy(skb->data, &tx_cmd_b, 4); - - skb_push(skb, 4); - cpu_to_le32s(&tx_cmd_a); - memcpy(skb->data, &tx_cmd_a, 4); - - return skb; -} - -static const struct driver_info smsc75xx_info = { - .description = "smsc75xx USB 2.0 Gigabit Ethernet", - .bind = smsc75xx_bind, - .unbind = smsc75xx_unbind, - .link_reset = smsc75xx_link_reset, - .reset = smsc75xx_reset, - .rx_fixup = smsc75xx_rx_fixup, - .tx_fixup = smsc75xx_tx_fixup, - .status = smsc75xx_status, - .flags = FLAG_ETHER | FLAG_SEND_ZLP, -}; - -static const struct usb_device_id products[] = { - { - /* SMSC7500 USB Gigabit Ethernet Device */ - USB_DEVICE(USB_VENDOR_ID_SMSC, USB_PRODUCT_ID_LAN7500), - .driver_info = (unsigned long) &smsc75xx_info, - }, - { - /* SMSC7500 USB Gigabit Ethernet Device */ - USB_DEVICE(USB_VENDOR_ID_SMSC, USB_PRODUCT_ID_LAN7505), - .driver_info = (unsigned long) &smsc75xx_info, - }, - { }, /* END */ -}; -MODULE_DEVICE_TABLE(usb, products); - -static struct usb_driver smsc75xx_driver = { - .name = SMSC_CHIPNAME, - .id_table = products, - .probe = usbnet_probe, - .suspend = usbnet_suspend, - .resume = usbnet_resume, - .disconnect = usbnet_disconnect, -}; - -static int __init smsc75xx_init(void) -{ - return usb_register(&smsc75xx_driver); -} -module_init(smsc75xx_init); - -static void __exit smsc75xx_exit(void) -{ - usb_deregister(&smsc75xx_driver); -} -module_exit(smsc75xx_exit); - -MODULE_AUTHOR("Nancy Lin"); -MODULE_AUTHOR("Steve Glendinning "); -MODULE_DESCRIPTION("SMSC75XX USB 2.0 Gigabit Ethernet Devices"); -MODULE_LICENSE("GPL"); diff --git a/trunk/drivers/net/usb/smsc75xx.h b/trunk/drivers/net/usb/smsc75xx.h deleted file mode 100644 index 16e98c778344..000000000000 --- a/trunk/drivers/net/usb/smsc75xx.h +++ /dev/null @@ -1,421 +0,0 @@ - /*************************************************************************** - * - * Copyright (C) 2007-2010 SMSC - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - *****************************************************************************/ - -#ifndef _SMSC75XX_H -#define _SMSC75XX_H - -/* Tx command words */ -#define TX_CMD_A_LSO (0x08000000) -#define TX_CMD_A_IPE (0x04000000) -#define TX_CMD_A_TPE (0x02000000) -#define TX_CMD_A_IVTG (0x01000000) -#define TX_CMD_A_RVTG (0x00800000) -#define TX_CMD_A_FCS (0x00400000) -#define TX_CMD_A_LEN (0x000FFFFF) - -#define TX_CMD_B_MSS (0x3FFF0000) -#define TX_CMD_B_MSS_SHIFT (16) -#define TX_MSS_MIN ((u16)8) -#define TX_CMD_B_VTAG (0x0000FFFF) - -/* Rx command words */ -#define RX_CMD_A_ICE (0x80000000) -#define RX_CMD_A_TCE (0x40000000) -#define RX_CMD_A_IPV (0x20000000) -#define RX_CMD_A_PID (0x18000000) -#define RX_CMD_A_PID_NIP (0x00000000) -#define RX_CMD_A_PID_TCP (0x08000000) -#define RX_CMD_A_PID_UDP (0x10000000) -#define RX_CMD_A_PID_PP (0x18000000) -#define RX_CMD_A_PFF (0x04000000) -#define RX_CMD_A_BAM (0x02000000) -#define RX_CMD_A_MAM (0x01000000) -#define RX_CMD_A_FVTG (0x00800000) -#define RX_CMD_A_RED (0x00400000) -#define RX_CMD_A_RWT (0x00200000) -#define RX_CMD_A_RUNT (0x00100000) -#define RX_CMD_A_LONG (0x00080000) -#define RX_CMD_A_RXE (0x00040000) -#define RX_CMD_A_DRB (0x00020000) -#define RX_CMD_A_FCS (0x00010000) -#define RX_CMD_A_UAM (0x00008000) -#define RX_CMD_A_LCSM (0x00004000) -#define RX_CMD_A_LEN (0x00003FFF) - -#define RX_CMD_B_CSUM (0xFFFF0000) -#define RX_CMD_B_CSUM_SHIFT (16) -#define RX_CMD_B_VTAG (0x0000FFFF) - -/* SCSRs */ -#define ID_REV (0x0000) - -#define FPGA_REV (0x0004) - -#define BOND_CTL (0x0008) - -#define INT_STS (0x000C) -#define INT_STS_RDFO_INT (0x00400000) -#define INT_STS_TXE_INT (0x00200000) -#define INT_STS_MACRTO_INT (0x00100000) -#define INT_STS_TX_DIS_INT (0x00080000) -#define INT_STS_RX_DIS_INT (0x00040000) -#define INT_STS_PHY_INT_ (0x00020000) -#define INT_STS_MAC_ERR_INT (0x00008000) -#define INT_STS_TDFU (0x00004000) -#define INT_STS_TDFO (0x00002000) -#define INT_STS_GPIOS (0x00000FFF) -#define INT_STS_CLEAR_ALL (0xFFFFFFFF) - -#define HW_CFG (0x0010) -#define HW_CFG_SMDET_STS (0x00008000) -#define HW_CFG_SMDET_EN (0x00004000) -#define HW_CFG_EEM (0x00002000) -#define HW_CFG_RST_PROTECT (0x00001000) -#define HW_CFG_PORT_SWAP (0x00000800) -#define HW_CFG_PHY_BOOST (0x00000600) -#define HW_CFG_PHY_BOOST_NORMAL (0x00000000) -#define HW_CFG_PHY_BOOST_4 (0x00002000) -#define HW_CFG_PHY_BOOST_8 (0x00004000) -#define HW_CFG_PHY_BOOST_12 (0x00006000) -#define HW_CFG_LEDB (0x00000100) -#define HW_CFG_BIR (0x00000080) -#define HW_CFG_SBP (0x00000040) -#define HW_CFG_IME (0x00000020) -#define HW_CFG_MEF (0x00000010) -#define HW_CFG_ETC (0x00000008) -#define HW_CFG_BCE (0x00000004) -#define HW_CFG_LRST (0x00000002) -#define HW_CFG_SRST (0x00000001) - -#define PMT_CTL (0x0014) -#define PMT_CTL_PHY_PWRUP (0x00000400) -#define PMT_CTL_RES_CLR_WKP_EN (0x00000100) -#define PMT_CTL_DEV_RDY (0x00000080) -#define PMT_CTL_SUS_MODE (0x00000060) -#define PMT_CTL_SUS_MODE_0 (0x00000000) -#define PMT_CTL_SUS_MODE_1 (0x00000020) -#define PMT_CTL_SUS_MODE_2 (0x00000040) -#define PMT_CTL_SUS_MODE_3 (0x00000060) -#define PMT_CTL_PHY_RST (0x00000010) -#define PMT_CTL_WOL_EN (0x00000008) -#define PMT_CTL_ED_EN (0x00000004) -#define PMT_CTL_WUPS (0x00000003) -#define PMT_CTL_WUPS_NO (0x00000000) -#define PMT_CTL_WUPS_ED (0x00000001) -#define PMT_CTL_WUPS_WOL (0x00000002) -#define PMT_CTL_WUPS_MULTI (0x00000003) - -#define LED_GPIO_CFG (0x0018) -#define LED_GPIO_CFG_LED2_FUN_SEL (0x80000000) -#define LED_GPIO_CFG_LED10_FUN_SEL (0x40000000) -#define LED_GPIO_CFG_LEDGPIO_EN (0x0000F000) -#define LED_GPIO_CFG_LEDGPIO_EN_0 (0x00001000) -#define LED_GPIO_CFG_LEDGPIO_EN_1 (0x00002000) -#define LED_GPIO_CFG_LEDGPIO_EN_2 (0x00004000) -#define LED_GPIO_CFG_LEDGPIO_EN_3 (0x00008000) -#define LED_GPIO_CFG_GPBUF (0x00000F00) -#define LED_GPIO_CFG_GPBUF_0 (0x00000100) -#define LED_GPIO_CFG_GPBUF_1 (0x00000200) -#define LED_GPIO_CFG_GPBUF_2 (0x00000400) -#define LED_GPIO_CFG_GPBUF_3 (0x00000800) -#define LED_GPIO_CFG_GPDIR (0x000000F0) -#define LED_GPIO_CFG_GPDIR_0 (0x00000010) -#define LED_GPIO_CFG_GPDIR_1 (0x00000020) -#define LED_GPIO_CFG_GPDIR_2 (0x00000040) -#define LED_GPIO_CFG_GPDIR_3 (0x00000080) -#define LED_GPIO_CFG_GPDATA (0x0000000F) -#define LED_GPIO_CFG_GPDATA_0 (0x00000001) -#define LED_GPIO_CFG_GPDATA_1 (0x00000002) -#define LED_GPIO_CFG_GPDATA_2 (0x00000004) -#define LED_GPIO_CFG_GPDATA_3 (0x00000008) - -#define GPIO_CFG (0x001C) -#define GPIO_CFG_SHIFT (24) -#define GPIO_CFG_GPEN (0xFF000000) -#define GPIO_CFG_GPBUF (0x00FF0000) -#define GPIO_CFG_GPDIR (0x0000FF00) -#define GPIO_CFG_GPDATA (0x000000FF) - -#define GPIO_WAKE (0x0020) -#define GPIO_WAKE_PHY_LINKUP_EN (0x80000000) -#define GPIO_WAKE_POL (0x0FFF0000) -#define GPIO_WAKE_POL_SHIFT (16) -#define GPIO_WAKE_WK (0x00000FFF) - -#define DP_SEL (0x0024) -#define DP_SEL_DPRDY (0x80000000) -#define DP_SEL_RSEL (0x0000000F) -#define DP_SEL_URX (0x00000000) -#define DP_SEL_VHF (0x00000001) -#define DP_SEL_VHF_HASH_LEN (16) -#define DP_SEL_VHF_VLAN_LEN (128) -#define DP_SEL_LSO_HEAD (0x00000002) -#define DP_SEL_FCT_RX (0x00000003) -#define DP_SEL_FCT_TX (0x00000004) -#define DP_SEL_DESCRIPTOR (0x00000005) -#define DP_SEL_WOL (0x00000006) - -#define DP_CMD (0x0028) -#define DP_CMD_WRITE (0x01) -#define DP_CMD_READ (0x00) - -#define DP_ADDR (0x002C) - -#define DP_DATA (0x0030) - -#define BURST_CAP (0x0034) -#define BURST_CAP_MASK (0x0000000F) - -#define INT_EP_CTL (0x0038) -#define INT_EP_CTL_INTEP_ON (0x80000000) -#define INT_EP_CTL_RDFO_EN (0x00400000) -#define INT_EP_CTL_TXE_EN (0x00200000) -#define INT_EP_CTL_MACROTO_EN (0x00100000) -#define INT_EP_CTL_TX_DIS_EN (0x00080000) -#define INT_EP_CTL_RX_DIS_EN (0x00040000) -#define INT_EP_CTL_PHY_EN_ (0x00020000) -#define INT_EP_CTL_MAC_ERR_EN (0x00008000) -#define INT_EP_CTL_TDFU_EN (0x00004000) -#define INT_EP_CTL_TDFO_EN (0x00002000) -#define INT_EP_CTL_RX_FIFO_EN (0x00001000) -#define INT_EP_CTL_GPIOX_EN (0x00000FFF) - -#define BULK_IN_DLY (0x003C) -#define BULK_IN_DLY_MASK (0xFFFF) - -#define E2P_CMD (0x0040) -#define E2P_CMD_BUSY (0x80000000) -#define E2P_CMD_MASK (0x70000000) -#define E2P_CMD_READ (0x00000000) -#define E2P_CMD_EWDS (0x10000000) -#define E2P_CMD_EWEN (0x20000000) -#define E2P_CMD_WRITE (0x30000000) -#define E2P_CMD_WRAL (0x40000000) -#define E2P_CMD_ERASE (0x50000000) -#define E2P_CMD_ERAL (0x60000000) -#define E2P_CMD_RELOAD (0x70000000) -#define E2P_CMD_TIMEOUT (0x00000400) -#define E2P_CMD_LOADED (0x00000200) -#define E2P_CMD_ADDR (0x000001FF) - -#define MAX_EEPROM_SIZE (512) - -#define E2P_DATA (0x0044) -#define E2P_DATA_MASK_ (0x000000FF) - -#define RFE_CTL (0x0060) -#define RFE_CTL_TCPUDP_CKM (0x00001000) -#define RFE_CTL_IP_CKM (0x00000800) -#define RFE_CTL_AB (0x00000400) -#define RFE_CTL_AM (0x00000200) -#define RFE_CTL_AU (0x00000100) -#define RFE_CTL_VS (0x00000080) -#define RFE_CTL_UF (0x00000040) -#define RFE_CTL_VF (0x00000020) -#define RFE_CTL_SPF (0x00000010) -#define RFE_CTL_MHF (0x00000008) -#define RFE_CTL_DHF (0x00000004) -#define RFE_CTL_DPF (0x00000002) -#define RFE_CTL_RST_RF (0x00000001) - -#define VLAN_TYPE (0x0064) -#define VLAN_TYPE_MASK (0x0000FFFF) - -#define FCT_RX_CTL (0x0090) -#define FCT_RX_CTL_EN (0x80000000) -#define FCT_RX_CTL_RST (0x40000000) -#define FCT_RX_CTL_SBF (0x02000000) -#define FCT_RX_CTL_OVERFLOW (0x01000000) -#define FCT_RX_CTL_FRM_DROP (0x00800000) -#define FCT_RX_CTL_RX_NOT_EMPTY (0x00400000) -#define FCT_RX_CTL_RX_EMPTY (0x00200000) -#define FCT_RX_CTL_RX_DISABLED (0x00100000) -#define FCT_RX_CTL_RXUSED (0x0000FFFF) - -#define FCT_TX_CTL (0x0094) -#define FCT_TX_CTL_EN (0x80000000) -#define FCT_TX_CTL_RST (0x40000000) -#define FCT_TX_CTL_TX_NOT_EMPTY (0x00400000) -#define FCT_TX_CTL_TX_EMPTY (0x00200000) -#define FCT_TX_CTL_TX_DISABLED (0x00100000) -#define FCT_TX_CTL_TXUSED (0x0000FFFF) - -#define FCT_RX_FIFO_END (0x0098) -#define FCT_RX_FIFO_END_MASK (0x0000007F) - -#define FCT_TX_FIFO_END (0x009C) -#define FCT_TX_FIFO_END_MASK (0x0000003F) - -#define FCT_FLOW (0x00A0) -#define FCT_FLOW_THRESHOLD_OFF (0x00007F00) -#define FCT_FLOW_THRESHOLD_OFF_SHIFT (8) -#define FCT_FLOW_THRESHOLD_ON (0x0000007F) - -/* MAC CSRs */ -#define MAC_CR (0x100) -#define MAC_CR_ADP (0x00002000) -#define MAC_CR_ADD (0x00001000) -#define MAC_CR_ASD (0x00000800) -#define MAC_CR_INT_LOOP (0x00000400) -#define MAC_CR_BOLMT (0x000000C0) -#define MAC_CR_FDPX (0x00000008) -#define MAC_CR_CFG (0x00000006) -#define MAC_CR_CFG_10 (0x00000000) -#define MAC_CR_CFG_100 (0x00000002) -#define MAC_CR_CFG_1000 (0x00000004) -#define MAC_CR_RST (0x00000001) - -#define MAC_RX (0x104) -#define MAC_RX_MAX_SIZE (0x3FFF0000) -#define MAC_RX_MAX_SIZE_SHIFT (16) -#define MAC_RX_FCS_STRIP (0x00000010) -#define MAC_RX_FSE (0x00000004) -#define MAC_RX_RXD (0x00000002) -#define MAC_RX_RXEN (0x00000001) - -#define MAC_TX (0x108) -#define MAC_TX_BFCS (0x00000004) -#define MAC_TX_TXD (0x00000002) -#define MAC_TX_TXEN (0x00000001) - -#define FLOW (0x10C) -#define FLOW_FORCE_FC (0x80000000) -#define FLOW_TX_FCEN (0x40000000) -#define FLOW_RX_FCEN (0x20000000) -#define FLOW_FPF (0x10000000) -#define FLOW_PAUSE_TIME (0x0000FFFF) - -#define RAND_SEED (0x110) -#define RAND_SEED_MASK (0x0000FFFF) - -#define ERR_STS (0x114) -#define ERR_STS_FCS_ERR (0x00000100) -#define ERR_STS_LFRM_ERR (0x00000080) -#define ERR_STS_RUNT_ERR (0x00000040) -#define ERR_STS_COLLISION_ERR (0x00000010) -#define ERR_STS_ALIGN_ERR (0x00000008) -#define ERR_STS_URUN_ERR (0x00000004) - -#define RX_ADDRH (0x118) -#define RX_ADDRH_MASK (0x0000FFFF) - -#define RX_ADDRL (0x11C) - -#define MII_ACCESS (0x120) -#define MII_ACCESS_PHY_ADDR (0x0000F800) -#define MII_ACCESS_PHY_ADDR_SHIFT (11) -#define MII_ACCESS_REG_ADDR (0x000007C0) -#define MII_ACCESS_REG_ADDR_SHIFT (6) -#define MII_ACCESS_READ (0x00000000) -#define MII_ACCESS_WRITE (0x00000002) -#define MII_ACCESS_BUSY (0x00000001) - -#define MII_DATA (0x124) -#define MII_DATA_MASK (0x0000FFFF) - -#define WUCSR (0x140) -#define WUCSR_PFDA_FR (0x00000080) -#define WUCSR_WUFR (0x00000040) -#define WUCSR_MPR (0x00000020) -#define WUCSR_BCAST_FR (0x00000010) -#define WUCSR_PFDA_EN (0x00000008) -#define WUCSR_WUEN (0x00000004) -#define WUCSR_MPEN (0x00000002) -#define WUCSR_BCST_EN (0x00000001) - -#define WUF_CFGX (0x144) -#define WUF_CFGX_EN (0x80000000) -#define WUF_CFGX_ATYPE (0x03000000) -#define WUF_CFGX_ATYPE_UNICAST (0x00000000) -#define WUF_CFGX_ATYPE_MULTICAST (0x02000000) -#define WUF_CFGX_ATYPE_ALL (0x03000000) -#define WUF_CFGX_PATTERN_OFFSET (0x007F0000) -#define WUF_CFGX_PATTERN_OFFSET_SHIFT (16) -#define WUF_CFGX_CRC16 (0x0000FFFF) -#define WUF_NUM (8) - -#define WUF_MASKX (0x170) -#define WUF_MASKX_AVALID (0x80000000) -#define WUF_MASKX_ATYPE (0x40000000) - -#define ADDR_FILTX (0x300) -#define ADDR_FILTX_FB_VALID (0x80000000) -#define ADDR_FILTX_FB_TYPE (0x40000000) -#define ADDR_FILTX_FB_ADDRHI (0x0000FFFF) -#define ADDR_FILTX_SB_ADDRLO (0xFFFFFFFF) - -#define WUCSR2 (0x500) -#define WUCSR2_NS_RCD (0x00000040) -#define WUCSR2_ARP_RCD (0x00000020) -#define WUCSR2_TCPSYN_RCD (0x00000010) -#define WUCSR2_NS_OFFLOAD (0x00000004) -#define WUCSR2_ARP_OFFLOAD (0x00000002) -#define WUCSR2_TCPSYN_OFFLOAD (0x00000001) - -#define WOL_FIFO_STS (0x504) - -#define IPV6_ADDRX (0x510) - -#define IPV4_ADDRX (0x590) - - -/* Vendor-specific PHY Definitions */ - -/* Mode Control/Status Register */ -#define PHY_MODE_CTRL_STS (17) -#define MODE_CTRL_STS_EDPWRDOWN ((u16)0x2000) -#define MODE_CTRL_STS_ENERGYON ((u16)0x0002) - -#define PHY_INT_SRC (29) -#define PHY_INT_SRC_ENERGY_ON ((u16)0x0080) -#define PHY_INT_SRC_ANEG_COMP ((u16)0x0040) -#define PHY_INT_SRC_REMOTE_FAULT ((u16)0x0020) -#define PHY_INT_SRC_LINK_DOWN ((u16)0x0010) - -#define PHY_INT_MASK (30) -#define PHY_INT_MASK_ENERGY_ON ((u16)0x0080) -#define PHY_INT_MASK_ANEG_COMP ((u16)0x0040) -#define PHY_INT_MASK_REMOTE_FAULT ((u16)0x0020) -#define PHY_INT_MASK_LINK_DOWN ((u16)0x0010) -#define PHY_INT_MASK_DEFAULT (PHY_INT_MASK_ANEG_COMP | \ - PHY_INT_MASK_LINK_DOWN) - -#define PHY_SPECIAL (31) -#define PHY_SPECIAL_SPD ((u16)0x001C) -#define PHY_SPECIAL_SPD_10HALF ((u16)0x0004) -#define PHY_SPECIAL_SPD_10FULL ((u16)0x0014) -#define PHY_SPECIAL_SPD_100HALF ((u16)0x0008) -#define PHY_SPECIAL_SPD_100FULL ((u16)0x0018) - -/* USB Vendor Requests */ -#define USB_VENDOR_REQUEST_WRITE_REGISTER 0xA0 -#define USB_VENDOR_REQUEST_READ_REGISTER 0xA1 -#define USB_VENDOR_REQUEST_GET_STATS 0xA2 - -/* Interrupt Endpoint status word bitfields */ -#define INT_ENP_RDFO_INT ((u32)BIT(22)) -#define INT_ENP_TXE_INT ((u32)BIT(21)) -#define INT_ENP_TX_DIS_INT ((u32)BIT(19)) -#define INT_ENP_RX_DIS_INT ((u32)BIT(18)) -#define INT_ENP_PHY_INT ((u32)BIT(17)) -#define INT_ENP_MAC_ERR_INT ((u32)BIT(15)) -#define INT_ENP_RX_FIFO_DATA_INT ((u32)BIT(12)) - -#endif /* _SMSC75XX_H */ diff --git a/trunk/drivers/net/usb/smsc95xx.c b/trunk/drivers/net/usb/smsc95xx.c index d222d7e25273..df9179a1c93b 100644 --- a/trunk/drivers/net/usb/smsc95xx.c +++ b/trunk/drivers/net/usb/smsc95xx.c @@ -709,8 +709,6 @@ static void smsc95xx_start_rx_path(struct usbnet *dev) static int smsc95xx_phy_initialize(struct usbnet *dev) { - int bmcr, timeout = 0; - /* Initialize MII structure */ dev->mii.dev = dev->net; dev->mii.mdio_read = smsc95xx_mdio_read; @@ -719,20 +717,7 @@ static int smsc95xx_phy_initialize(struct usbnet *dev) dev->mii.reg_num_mask = 0x1f; dev->mii.phy_id = SMSC95XX_INTERNAL_PHY_ID; - /* reset phy and wait for reset to complete */ smsc95xx_mdio_write(dev->net, dev->mii.phy_id, MII_BMCR, BMCR_RESET); - - do { - msleep(10); - bmcr = smsc95xx_mdio_read(dev->net, dev->mii.phy_id, MII_BMCR); - timeout++; - } while ((bmcr & MII_BMCR) && (timeout < 100)); - - if (timeout >= 100) { - netdev_warn(dev->net, "timeout on PHY Reset"); - return -EIO; - } - smsc95xx_mdio_write(dev->net, dev->mii.phy_id, MII_ADVERTISE, ADVERTISE_ALL | ADVERTISE_CSMA | ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM); diff --git a/trunk/drivers/net/wireless/airo.c b/trunk/drivers/net/wireless/airo.c index dc5018a6d9ed..698d5672a070 100644 --- a/trunk/drivers/net/wireless/airo.c +++ b/trunk/drivers/net/wireless/airo.c @@ -5255,8 +5255,7 @@ static int set_wep_key(struct airo_info *ai, u16 index, const char *key, WepKeyRid wkr; int rc; - if (WARN_ON(keylen == 0)) - return -1; + WARN_ON(keylen == 0); memset(&wkr, 0, sizeof(wkr)); wkr.len = cpu_to_le16(sizeof(wkr)); diff --git a/trunk/drivers/net/wireless/ath/ar9170/ar9170.h b/trunk/drivers/net/wireless/ath/ar9170/ar9170.h index dc662b76a1c8..8c8ce67971e9 100644 --- a/trunk/drivers/net/wireless/ath/ar9170/ar9170.h +++ b/trunk/drivers/net/wireless/ath/ar9170/ar9170.h @@ -166,7 +166,6 @@ struct ar9170 { struct ath_common common; struct mutex mutex; enum ar9170_device_state state; - bool registered; unsigned long bad_hw_nagger; int (*open)(struct ar9170 *); diff --git a/trunk/drivers/net/wireless/ath/ar9170/main.c b/trunk/drivers/net/wireless/ath/ar9170/main.c index 257c734733d1..08dc42da0f63 100644 --- a/trunk/drivers/net/wireless/ath/ar9170/main.c +++ b/trunk/drivers/net/wireless/ath/ar9170/main.c @@ -2701,8 +2701,7 @@ int ar9170_register(struct ar9170 *ar, struct device *pdev) dev_info(pdev, "Atheros AR9170 is registered as '%s'\n", wiphy_name(ar->hw->wiphy)); - ar->registered = true; - return 0; + return err; err_unreg: ieee80211_unregister_hw(ar->hw); @@ -2713,14 +2712,11 @@ int ar9170_register(struct ar9170 *ar, struct device *pdev) void ar9170_unregister(struct ar9170 *ar) { - if (ar->registered) { #ifdef CONFIG_AR9170_LEDS - ar9170_unregister_leds(ar); + ar9170_unregister_leds(ar); #endif /* CONFIG_AR9170_LEDS */ - ieee80211_unregister_hw(ar->hw); - } - kfree_skb(ar->rx_failover); + ieee80211_unregister_hw(ar->hw); mutex_destroy(&ar->mutex); } diff --git a/trunk/drivers/net/wireless/ath/ar9170/usb.c b/trunk/drivers/net/wireless/ath/ar9170/usb.c index 4e30197afff6..0f361186b78f 100644 --- a/trunk/drivers/net/wireless/ath/ar9170/usb.c +++ b/trunk/drivers/net/wireless/ath/ar9170/usb.c @@ -582,6 +582,43 @@ static int ar9170_usb_upload(struct ar9170_usb *aru, const void *data, return 0; } +static int ar9170_usb_request_firmware(struct ar9170_usb *aru) +{ + int err = 0; + + err = request_firmware(&aru->firmware, "ar9170.fw", + &aru->udev->dev); + if (!err) { + aru->init_values = NULL; + return 0; + } + + if (aru->req_one_stage_fw) { + dev_err(&aru->udev->dev, "ar9170.fw firmware file " + "not found and is required for this device\n"); + return -EINVAL; + } + + dev_err(&aru->udev->dev, "ar9170.fw firmware file " + "not found, trying old firmware...\n"); + + err = request_firmware(&aru->init_values, "ar9170-1.fw", + &aru->udev->dev); + if (err) { + dev_err(&aru->udev->dev, "file with init values not found.\n"); + return err; + } + + err = request_firmware(&aru->firmware, "ar9170-2.fw", &aru->udev->dev); + if (err) { + release_firmware(aru->init_values); + dev_err(&aru->udev->dev, "firmware file not found.\n"); + return err; + } + + return err; +} + static int ar9170_usb_reset(struct ar9170_usb *aru) { int ret, lock = (aru->intf->condition != USB_INTERFACE_BINDING); @@ -720,103 +757,6 @@ static int ar9170_usb_init_device(struct ar9170_usb *aru) return err; } -static void ar9170_usb_firmware_failed(struct ar9170_usb *aru) -{ - struct device *parent = aru->udev->dev.parent; - - /* unbind anything failed */ - if (parent) - down(&parent->sem); - device_release_driver(&aru->udev->dev); - if (parent) - up(&parent->sem); -} - -static void ar9170_usb_firmware_finish(const struct firmware *fw, void *context) -{ - struct ar9170_usb *aru = context; - int err; - - aru->firmware = fw; - - if (!fw) { - dev_err(&aru->udev->dev, "firmware file not found.\n"); - goto err_freefw; - } - - err = ar9170_usb_init_device(aru); - if (err) - goto err_freefw; - - err = ar9170_usb_open(&aru->common); - if (err) - goto err_unrx; - - err = ar9170_register(&aru->common, &aru->udev->dev); - - ar9170_usb_stop(&aru->common); - if (err) - goto err_unrx; - - return; - - err_unrx: - ar9170_usb_cancel_urbs(aru); - - err_freefw: - ar9170_usb_firmware_failed(aru); -} - -static void ar9170_usb_firmware_inits(const struct firmware *fw, - void *context) -{ - struct ar9170_usb *aru = context; - int err; - - if (!fw) { - dev_err(&aru->udev->dev, "file with init values not found.\n"); - ar9170_usb_firmware_failed(aru); - return; - } - - aru->init_values = fw; - - /* ok so we have the init values -- get code for two-stage */ - - err = request_firmware_nowait(THIS_MODULE, 1, "ar9170-2.fw", - &aru->udev->dev, GFP_KERNEL, aru, - ar9170_usb_firmware_finish); - if (err) - ar9170_usb_firmware_failed(aru); -} - -static void ar9170_usb_firmware_step2(const struct firmware *fw, void *context) -{ - struct ar9170_usb *aru = context; - int err; - - if (fw) { - ar9170_usb_firmware_finish(fw, context); - return; - } - - if (aru->req_one_stage_fw) { - dev_err(&aru->udev->dev, "ar9170.fw firmware file " - "not found and is required for this device\n"); - ar9170_usb_firmware_failed(aru); - return; - } - - dev_err(&aru->udev->dev, "ar9170.fw firmware file " - "not found, trying old firmware...\n"); - - err = request_firmware_nowait(THIS_MODULE, 1, "ar9170-1.fw", - &aru->udev->dev, GFP_KERNEL, aru, - ar9170_usb_firmware_inits); - if (err) - ar9170_usb_firmware_failed(aru); -} - static bool ar9170_requires_one_stage(const struct usb_device_id *id) { if (!id->driver_info) @@ -874,9 +814,33 @@ static int ar9170_usb_probe(struct usb_interface *intf, if (err) goto err_freehw; - return request_firmware_nowait(THIS_MODULE, 1, "ar9170.fw", - &aru->udev->dev, GFP_KERNEL, aru, - ar9170_usb_firmware_step2); + err = ar9170_usb_request_firmware(aru); + if (err) + goto err_freehw; + + err = ar9170_usb_init_device(aru); + if (err) + goto err_freefw; + + err = ar9170_usb_open(ar); + if (err) + goto err_unrx; + + err = ar9170_register(ar, &udev->dev); + + ar9170_usb_stop(ar); + if (err) + goto err_unrx; + + return 0; + +err_unrx: + ar9170_usb_cancel_urbs(aru); + +err_freefw: + release_firmware(aru->init_values); + release_firmware(aru->firmware); + err_freehw: usb_set_intfdata(intf, NULL); usb_put_dev(udev); @@ -896,12 +860,12 @@ static void ar9170_usb_disconnect(struct usb_interface *intf) ar9170_unregister(&aru->common); ar9170_usb_cancel_urbs(aru); + release_firmware(aru->init_values); + release_firmware(aru->firmware); + usb_put_dev(aru->udev); usb_set_intfdata(intf, NULL); ieee80211_free_hw(aru->common.hw); - - release_firmware(aru->init_values); - release_firmware(aru->firmware); } #ifdef CONFIG_PM diff --git a/trunk/drivers/net/wireless/ath/ath5k/eeprom.c b/trunk/drivers/net/wireless/ath/ath5k/eeprom.c index 10b52262b232..6a3f4da7fb48 100644 --- a/trunk/drivers/net/wireless/ath/ath5k/eeprom.c +++ b/trunk/drivers/net/wireless/ath/ath5k/eeprom.c @@ -429,8 +429,8 @@ static int ath5k_eeprom_read_modes(struct ath5k_hw *ah, u32 *offset, ee->ee_margin_tx_rx[mode] = (val >> 8) & 0x3f; AR5K_EEPROM_READ(o++, val); - ee->ee_i_cal[mode] = (val >> 5) & 0x3f; - ee->ee_q_cal[mode] = val & 0x1f; + ee->ee_i_cal[mode] = (val >> 8) & 0x3f; + ee->ee_q_cal[mode] = (val >> 3) & 0x1f; if (ah->ah_ee_version >= AR5K_EEPROM_VERSION_4_2) { AR5K_EEPROM_READ(o++, val); diff --git a/trunk/drivers/net/wireless/ath/ath5k/phy.c b/trunk/drivers/net/wireless/ath/ath5k/phy.c index eff3323efb4b..72474c0ccaff 100644 --- a/trunk/drivers/net/wireless/ath/ath5k/phy.c +++ b/trunk/drivers/net/wireless/ath/ath5k/phy.c @@ -1386,39 +1386,38 @@ static int ath5k_hw_rf511x_calibrate(struct ath5k_hw *ah, goto done; /* Calibration has finished, get the results and re-run */ - - /* work around empty results which can apparently happen on 5212 */ for (i = 0; i <= 10; i++) { iq_corr = ath5k_hw_reg_read(ah, AR5K_PHY_IQRES_CAL_CORR); i_pwr = ath5k_hw_reg_read(ah, AR5K_PHY_IQRES_CAL_PWR_I); q_pwr = ath5k_hw_reg_read(ah, AR5K_PHY_IQRES_CAL_PWR_Q); - ATH5K_DBG_UNLIMIT(ah->ah_sc, ATH5K_DEBUG_CALIBRATE, - "iq_corr:%x i_pwr:%x q_pwr:%x", iq_corr, i_pwr, q_pwr); - if (i_pwr && q_pwr) - break; } i_coffd = ((i_pwr >> 1) + (q_pwr >> 1)) >> 7; q_coffd = q_pwr >> 7; - /* protect against divide by 0 and loss of sign bits */ - if (i_coffd == 0 || q_coffd < 2) + /* No correction */ + if (i_coffd == 0 || q_coffd == 0) goto done; - i_coff = (-iq_corr) / i_coffd; - i_coff = clamp(i_coff, -32, 31); /* signed 6 bit */ + i_coff = ((-iq_corr) / i_coffd); + + /* Boundary check */ + if (i_coff > 31) + i_coff = 31; + if (i_coff < -32) + i_coff = -32; - q_coff = (i_pwr / q_coffd) - 128; - q_coff = clamp(q_coff, -16, 15); /* signed 5 bit */ + q_coff = (((s32)i_pwr / q_coffd) - 128); - ATH5K_DBG_UNLIMIT(ah->ah_sc, ATH5K_DEBUG_CALIBRATE, - "new I:%d Q:%d (i_coffd:%x q_coffd:%x)", - i_coff, q_coff, i_coffd, q_coffd); + /* Boundary check */ + if (q_coff > 15) + q_coff = 15; + if (q_coff < -16) + q_coff = -16; - /* Commit new I/Q values (set enable bit last to match HAL sources) */ - AR5K_REG_WRITE_BITS(ah, AR5K_PHY_IQ, AR5K_PHY_IQ_CORR_Q_I_COFF, i_coff); - AR5K_REG_WRITE_BITS(ah, AR5K_PHY_IQ, AR5K_PHY_IQ_CORR_Q_Q_COFF, q_coff); - AR5K_REG_ENABLE_BITS(ah, AR5K_PHY_IQ, AR5K_PHY_IQ_CORR_ENABLE); + /* Commit new I/Q value */ + AR5K_REG_ENABLE_BITS(ah, AR5K_PHY_IQ, AR5K_PHY_IQ_CORR_ENABLE | + ((u32)q_coff) | ((u32)i_coff << AR5K_PHY_IQ_CORR_Q_I_COFF_S)); /* Re-enable calibration -if we don't we'll commit * the same values again and again */ @@ -1874,7 +1873,7 @@ ath5k_hw_set_antenna_mode(struct ath5k_hw *ah, u8 ant_mode) break; case AR5K_ANTMODE_FIXED_A: def_ant = 1; - tx_ant = 1; + tx_ant = 0; use_def_for_tx = true; update_def_on_tx = false; use_def_for_rts = true; @@ -1883,7 +1882,7 @@ ath5k_hw_set_antenna_mode(struct ath5k_hw *ah, u8 ant_mode) break; case AR5K_ANTMODE_FIXED_B: def_ant = 2; - tx_ant = 2; + tx_ant = 0; use_def_for_tx = true; update_def_on_tx = false; use_def_for_rts = true; diff --git a/trunk/drivers/net/wireless/ath/ath5k/reg.h b/trunk/drivers/net/wireless/ath/ath5k/reg.h index 1464f89b249c..4cb9c5df9f46 100644 --- a/trunk/drivers/net/wireless/ath/ath5k/reg.h +++ b/trunk/drivers/net/wireless/ath/ath5k/reg.h @@ -2187,7 +2187,6 @@ */ #define AR5K_PHY_IQ 0x9920 /* Register Address */ #define AR5K_PHY_IQ_CORR_Q_Q_COFF 0x0000001f /* Mask for q correction info */ -#define AR5K_PHY_IQ_CORR_Q_Q_COFF_S 0 #define AR5K_PHY_IQ_CORR_Q_I_COFF 0x000007e0 /* Mask for i correction info */ #define AR5K_PHY_IQ_CORR_Q_I_COFF_S 5 #define AR5K_PHY_IQ_CORR_ENABLE 0x00000800 /* Enable i/q correction */ diff --git a/trunk/drivers/net/wireless/ath/ath5k/reset.c b/trunk/drivers/net/wireless/ath/ath5k/reset.c index cbf28e379843..a35a7db0fc4c 100644 --- a/trunk/drivers/net/wireless/ath/ath5k/reset.c +++ b/trunk/drivers/net/wireless/ath/ath5k/reset.c @@ -851,15 +851,12 @@ static void ath5k_hw_commit_eeprom_settings(struct ath5k_hw *ah, AR5K_PHY_OFDM_SELFCORR_CYPWR_THR1, AR5K_INIT_CYCRSSI_THR1); - /* I/Q correction (set enable bit last to match HAL sources) */ - /* TODO: Per channel i/q infos ? */ - if (ah->ah_ee_version >= AR5K_EEPROM_VERSION_4_0) { - AR5K_REG_WRITE_BITS(ah, AR5K_PHY_IQ, AR5K_PHY_IQ_CORR_Q_I_COFF, - ee->ee_i_cal[ee_mode]); - AR5K_REG_WRITE_BITS(ah, AR5K_PHY_IQ, AR5K_PHY_IQ_CORR_Q_Q_COFF, - ee->ee_q_cal[ee_mode]); - AR5K_REG_ENABLE_BITS(ah, AR5K_PHY_IQ, AR5K_PHY_IQ_CORR_ENABLE); - } + /* I/Q correction + * TODO: Per channel i/q infos ? */ + AR5K_REG_ENABLE_BITS(ah, AR5K_PHY_IQ, + AR5K_PHY_IQ_CORR_ENABLE | + (ee->ee_i_cal[ee_mode] << AR5K_PHY_IQ_CORR_Q_I_COFF_S) | + ee->ee_q_cal[ee_mode]); /* Heavy clipping -disable for now */ if (ah->ah_ee_version >= AR5K_EEPROM_VERSION_5_1) @@ -1382,10 +1379,11 @@ int ath5k_hw_reset(struct ath5k_hw *ah, enum nl80211_iftype op_mode, ath5k_hw_set_sleep_clock(ah, true); /* - * Disable beacons and reset the TSF + * Disable beacons and reset the register */ - AR5K_REG_DISABLE_BITS(ah, AR5K_BEACON, AR5K_BEACON_ENABLE); - ath5k_hw_reset_tsf(ah); + AR5K_REG_DISABLE_BITS(ah, AR5K_BEACON, AR5K_BEACON_ENABLE | + AR5K_BEACON_RESET_TSF); + return 0; } diff --git a/trunk/drivers/net/wireless/ath/ath9k/rc.c b/trunk/drivers/net/wireless/ath/ath9k/rc.c index 0e79e58cf4c9..ac34a055c713 100644 --- a/trunk/drivers/net/wireless/ath/ath9k/rc.c +++ b/trunk/drivers/net/wireless/ath/ath9k/rc.c @@ -1323,7 +1323,7 @@ static void ath_rate_init(void *priv, struct ieee80211_supported_band *sband, static void ath_rate_update(void *priv, struct ieee80211_supported_band *sband, struct ieee80211_sta *sta, void *priv_sta, - u32 changed, enum nl80211_channel_type oper_chan_type) + u32 changed) { struct ath_softc *sc = priv; struct ath_rate_priv *ath_rc_priv = priv_sta; @@ -1340,8 +1340,8 @@ static void ath_rate_update(void *priv, struct ieee80211_supported_band *sband, if (sc->sc_ah->opmode != NL80211_IFTYPE_STATION) return; - if (oper_chan_type == NL80211_CHAN_HT40MINUS || - oper_chan_type == NL80211_CHAN_HT40PLUS) + if (sc->hw->conf.channel_type == NL80211_CHAN_HT40MINUS || + sc->hw->conf.channel_type == NL80211_CHAN_HT40PLUS) oper_cw40 = true; oper_sgi40 = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ? diff --git a/trunk/drivers/net/wireless/ath/ath9k/xmit.c b/trunk/drivers/net/wireless/ath/ath9k/xmit.c index b2c8207f7bc1..47294f90bbe5 100644 --- a/trunk/drivers/net/wireless/ath/ath9k/xmit.c +++ b/trunk/drivers/net/wireless/ath/ath9k/xmit.c @@ -2258,7 +2258,7 @@ void ath_tx_node_cleanup(struct ath_softc *sc, struct ath_node *an) if (ATH_TXQ_SETUP(sc, i)) { txq = &sc->tx.txq[i]; - spin_lock_bh(&txq->axq_lock); + spin_lock(&txq->axq_lock); list_for_each_entry_safe(ac, ac_tmp, &txq->axq_acq, list) { @@ -2279,7 +2279,7 @@ void ath_tx_node_cleanup(struct ath_softc *sc, struct ath_node *an) } } - spin_unlock_bh(&txq->axq_lock); + spin_unlock(&txq->axq_lock); } } } diff --git a/trunk/drivers/net/wireless/ipw2x00/ipw2200.c b/trunk/drivers/net/wireless/ipw2x00/ipw2200.c index 5c7aa1b1eb56..63c2a7ade5fb 100644 --- a/trunk/drivers/net/wireless/ipw2x00/ipw2200.c +++ b/trunk/drivers/net/wireless/ipw2x00/ipw2200.c @@ -3177,27 +3177,14 @@ static int ipw_load_firmware(struct ipw_priv *priv, u8 * data, size_t len) int total_nr = 0; int i; struct pci_pool *pool; - void **virts; - dma_addr_t *phys; + u32 *virts[CB_NUMBER_OF_ELEMENTS_SMALL]; + dma_addr_t phys[CB_NUMBER_OF_ELEMENTS_SMALL]; IPW_DEBUG_TRACE("<< : \n"); - virts = kmalloc(sizeof(void *) * CB_NUMBER_OF_ELEMENTS_SMALL, - GFP_KERNEL); - if (!virts) - return -ENOMEM; - - phys = kmalloc(sizeof(dma_addr_t) * CB_NUMBER_OF_ELEMENTS_SMALL, - GFP_KERNEL); - if (!phys) { - kfree(virts); - return -ENOMEM; - } pool = pci_pool_create("ipw2200", priv->pci_dev, CB_MAX_LENGTH, 0, 0); if (!pool) { IPW_ERROR("pci_pool_create failed\n"); - kfree(phys); - kfree(virts); return -ENOMEM; } @@ -3267,8 +3254,6 @@ static int ipw_load_firmware(struct ipw_priv *priv, u8 * data, size_t len) pci_pool_free(pool, virts[i], phys[i]); pci_pool_destroy(pool); - kfree(phys); - kfree(virts); return ret; } diff --git a/trunk/drivers/net/wireless/ipw2x00/libipw.h b/trunk/drivers/net/wireless/ipw2x00/libipw.h index a6d5e42647e4..bf45391172f3 100644 --- a/trunk/drivers/net/wireless/ipw2x00/libipw.h +++ b/trunk/drivers/net/wireless/ipw2x00/libipw.h @@ -797,7 +797,7 @@ struct libipw_device { /* Probe / Beacon management */ struct list_head network_free_list; struct list_head network_list; - struct libipw_network *networks[MAX_NETWORK_COUNT]; + struct libipw_network *networks; int scans; int scan_age; diff --git a/trunk/drivers/net/wireless/ipw2x00/libipw_module.c b/trunk/drivers/net/wireless/ipw2x00/libipw_module.c index 2fa55867bd8b..1ae0b2b02c38 100644 --- a/trunk/drivers/net/wireless/ipw2x00/libipw_module.c +++ b/trunk/drivers/net/wireless/ipw2x00/libipw_module.c @@ -67,17 +67,16 @@ void *libipw_wiphy_privid = &libipw_wiphy_privid; static int libipw_networks_allocate(struct libipw_device *ieee) { - int i, j; - - for (i = 0; i < MAX_NETWORK_COUNT; i++) { - ieee->networks[i] = kzalloc(sizeof(struct libipw_network), - GFP_KERNEL); - if (!ieee->networks[i]) { - LIBIPW_ERROR("Out of memory allocating beacons\n"); - for (j = 0; j < i; j++) - kfree(ieee->networks[j]); - return -ENOMEM; - } + if (ieee->networks) + return 0; + + ieee->networks = + kzalloc(MAX_NETWORK_COUNT * sizeof(struct libipw_network), + GFP_KERNEL); + if (!ieee->networks) { + printk(KERN_WARNING "%s: Out of memory allocating beacons\n", + ieee->dev->name); + return -ENOMEM; } return 0; @@ -98,11 +97,15 @@ static inline void libipw_networks_free(struct libipw_device *ieee) { int i; - for (i = 0; i < MAX_NETWORK_COUNT; i++) { - if (ieee->networks[i]->ibss_dfs) - kfree(ieee->networks[i]->ibss_dfs); - kfree(ieee->networks[i]); - } + if (!ieee->networks) + return; + + for (i = 0; i < MAX_NETWORK_COUNT; i++) + if (ieee->networks[i].ibss_dfs) + kfree(ieee->networks[i].ibss_dfs); + + kfree(ieee->networks); + ieee->networks = NULL; } void libipw_networks_age(struct libipw_device *ieee, @@ -127,7 +130,7 @@ static void libipw_networks_initialize(struct libipw_device *ieee) INIT_LIST_HEAD(&ieee->network_free_list); INIT_LIST_HEAD(&ieee->network_list); for (i = 0; i < MAX_NETWORK_COUNT; i++) - list_add_tail(&ieee->networks[i]->list, + list_add_tail(&ieee->networks[i].list, &ieee->network_free_list); } diff --git a/trunk/drivers/net/wireless/iwlwifi/iwl-3945.c b/trunk/drivers/net/wireless/iwlwifi/iwl-3945.c index e0678d921055..303cc8193adc 100644 --- a/trunk/drivers/net/wireless/iwlwifi/iwl-3945.c +++ b/trunk/drivers/net/wireless/iwlwifi/iwl-3945.c @@ -184,7 +184,7 @@ static int iwl3945_hwrate_to_plcp_idx(u8 plcp) { int idx; - for (idx = 0; idx < IWL_RATE_COUNT_3945; idx++) + for (idx = 0; idx < IWL_RATE_COUNT; idx++) if (iwl3945_rates[idx].plcp == plcp) return idx; return -1; @@ -805,7 +805,7 @@ void iwl3945_hw_build_tx_cmd_rate(struct iwl_priv *priv, int sta_id, int tx_id) { u16 hw_value = ieee80211_get_tx_rate(priv->hw, info)->hw_value; - u16 rate_index = min(hw_value & 0xffff, IWL_RATE_COUNT_3945); + u16 rate_index = min(hw_value & 0xffff, IWL_RATE_COUNT - 1); u16 rate_mask; int rate; u8 rts_retry_limit; @@ -2146,7 +2146,7 @@ static void iwl3945_hw_reg_init_channel_groups(struct iwl_priv *priv) /* fill in channel group's nominal powers for each rate */ for (rate_index = 0; - rate_index < IWL_RATE_COUNT_3945; rate_index++, clip_pwrs++) { + rate_index < IWL_RATE_COUNT; rate_index++, clip_pwrs++) { switch (rate_index) { case IWL_RATE_36M_INDEX_TABLE: if (i == 0) /* B/G */ diff --git a/trunk/drivers/net/wireless/iwlwifi/iwl-agn.c b/trunk/drivers/net/wireless/iwlwifi/iwl-agn.c index 818367b57bab..6aeb82b6992f 100644 --- a/trunk/drivers/net/wireless/iwlwifi/iwl-agn.c +++ b/trunk/drivers/net/wireless/iwlwifi/iwl-agn.c @@ -1463,66 +1463,59 @@ static void iwl_nic_start(struct iwl_priv *priv) } -static void iwl_ucode_callback(const struct firmware *ucode_raw, void *context); -static int iwl_mac_setup_register(struct iwl_priv *priv); - -static int __must_check iwl_request_firmware(struct iwl_priv *priv, bool first) -{ - const char *name_pre = priv->cfg->fw_name_pre; - - if (first) - priv->fw_index = priv->cfg->ucode_api_max; - else - priv->fw_index--; - - if (priv->fw_index < priv->cfg->ucode_api_min) { - IWL_ERR(priv, "no suitable firmware found!\n"); - return -ENOENT; - } - - sprintf(priv->firmware_name, "%s%d%s", - name_pre, priv->fw_index, ".ucode"); - - IWL_DEBUG_INFO(priv, "attempting to load firmware '%s'\n", - priv->firmware_name); - - return request_firmware_nowait(THIS_MODULE, 1, priv->firmware_name, - &priv->pci_dev->dev, GFP_KERNEL, priv, - iwl_ucode_callback); -} - /** - * iwl_ucode_callback - callback when firmware was loaded + * iwl_read_ucode - Read uCode images from disk file. * - * If loaded successfully, copies the firmware into buffers - * for the card to fetch (via DMA). + * Copy into buffers for card to fetch via bus-mastering */ -static void iwl_ucode_callback(const struct firmware *ucode_raw, void *context) +static int iwl_read_ucode(struct iwl_priv *priv) { - struct iwl_priv *priv = context; struct iwl_ucode_header *ucode; + int ret = -EINVAL, index; + const struct firmware *ucode_raw; + const char *name_pre = priv->cfg->fw_name_pre; const unsigned int api_max = priv->cfg->ucode_api_max; const unsigned int api_min = priv->cfg->ucode_api_min; + char buf[25]; u8 *src; size_t len; u32 api_ver, build; u32 inst_size, data_size, init_size, init_data_size, boot_size; - int err; u16 eeprom_ver; - if (!ucode_raw) { - IWL_ERR(priv, "request for firmware file '%s' failed.\n", - priv->firmware_name); - goto try_again; + /* Ask kernel firmware_class module to get the boot firmware off disk. + * request_firmware() is synchronous, file is in memory on return. */ + for (index = api_max; index >= api_min; index--) { + sprintf(buf, "%s%d%s", name_pre, index, ".ucode"); + ret = request_firmware(&ucode_raw, buf, &priv->pci_dev->dev); + if (ret < 0) { + IWL_ERR(priv, "%s firmware file req failed: %d\n", + buf, ret); + if (ret == -ENOENT) + continue; + else + goto error; + } else { + if (index < api_max) + IWL_ERR(priv, "Loaded firmware %s, " + "which is deprecated. " + "Please use API v%u instead.\n", + buf, api_max); + + IWL_DEBUG_INFO(priv, "Got firmware '%s' file (%zd bytes) from disk\n", + buf, ucode_raw->size); + break; + } } - IWL_DEBUG_INFO(priv, "Loaded firmware file '%s' (%zd bytes).\n", - priv->firmware_name, ucode_raw->size); + if (ret < 0) + goto error; /* Make sure that we got at least the v1 header! */ if (ucode_raw->size < priv->cfg->ops->ucode->get_header_size(1)) { IWL_ERR(priv, "File size way too small!\n"); - goto try_again; + ret = -EINVAL; + goto err_release; } /* Data from ucode file: header followed by uCode images */ @@ -1547,9 +1540,10 @@ static void iwl_ucode_callback(const struct firmware *ucode_raw, void *context) IWL_ERR(priv, "Driver unable to support your firmware API. " "Driver supports v%u, firmware is v%u.\n", api_max, api_ver); - goto try_again; + priv->ucode_ver = 0; + ret = -EINVAL; + goto err_release; } - if (api_ver != api_max) IWL_ERR(priv, "Firmware has old API version. Expected v%u, " "got v%u. New firmware can be obtained " @@ -1591,12 +1585,6 @@ static void iwl_ucode_callback(const struct firmware *ucode_raw, void *context) IWL_DEBUG_INFO(priv, "f/w package hdr boot inst size = %u\n", boot_size); - /* - * For any of the failures below (before allocating pci memory) - * we will try to load a version with a smaller API -- maybe the - * user just got a corrupted version of the latest API. - */ - /* Verify size of file vs. image size info in file's header */ if (ucode_raw->size != priv->cfg->ops->ucode->get_header_size(api_ver) + @@ -1606,35 +1594,41 @@ static void iwl_ucode_callback(const struct firmware *ucode_raw, void *context) IWL_DEBUG_INFO(priv, "uCode file size %d does not match expected size\n", (int)ucode_raw->size); - goto try_again; + ret = -EINVAL; + goto err_release; } /* Verify that uCode images will fit in card's SRAM */ if (inst_size > priv->hw_params.max_inst_size) { IWL_DEBUG_INFO(priv, "uCode instr len %d too large to fit in\n", inst_size); - goto try_again; + ret = -EINVAL; + goto err_release; } if (data_size > priv->hw_params.max_data_size) { IWL_DEBUG_INFO(priv, "uCode data len %d too large to fit in\n", data_size); - goto try_again; + ret = -EINVAL; + goto err_release; } if (init_size > priv->hw_params.max_inst_size) { IWL_INFO(priv, "uCode init instr len %d too large to fit in\n", init_size); - goto try_again; + ret = -EINVAL; + goto err_release; } if (init_data_size > priv->hw_params.max_data_size) { IWL_INFO(priv, "uCode init data len %d too large to fit in\n", init_data_size); - goto try_again; + ret = -EINVAL; + goto err_release; } if (boot_size > priv->hw_params.max_bsm_size) { IWL_INFO(priv, "uCode boot instr len %d too large to fit in\n", boot_size); - goto try_again; + ret = -EINVAL; + goto err_release; } /* Allocate ucode buffers for card's bus-master loading ... */ @@ -1718,36 +1712,20 @@ static void iwl_ucode_callback(const struct firmware *ucode_raw, void *context) IWL_DEBUG_INFO(priv, "Copying (but not loading) boot instr len %Zd\n", len); memcpy(priv->ucode_boot.v_addr, src, len); - /************************************************** - * This is still part of probe() in a sense... - * - * 9. Setup and register with mac80211 and debugfs - **************************************************/ - err = iwl_mac_setup_register(priv); - if (err) - goto out_unbind; - - err = iwl_dbgfs_register(priv, DRV_NAME); - if (err) - IWL_ERR(priv, "failed to create debugfs files. Ignoring error: %d\n", err); - /* We have our copies now, allow OS release its copies */ release_firmware(ucode_raw); - return; - - try_again: - /* try next, if any */ - if (iwl_request_firmware(priv, false)) - goto out_unbind; - release_firmware(ucode_raw); - return; + return 0; err_pci_alloc: IWL_ERR(priv, "failed to allocate pci memory\n"); + ret = -ENOMEM; iwl_dealloc_ucode_pci(priv); - out_unbind: - device_release_driver(&priv->pci_dev->dev); + + err_release: release_firmware(ucode_raw); + + error: + return ret; } static const char *desc_lookup_text[] = { @@ -2653,7 +2631,7 @@ static int iwl_mac_setup_register(struct iwl_priv *priv) */ hw->wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT; - hw->wiphy->max_scan_ssids = PROBE_OPTION_MAX; + hw->wiphy->max_scan_ssids = PROBE_OPTION_MAX + 1; /* we create the 802.11 header and a zero-length SSID element */ hw->wiphy->max_scan_ie_len = IWL_MAX_PROBE_REQUEST - 24 - 2; @@ -2689,7 +2667,21 @@ static int iwl_mac_start(struct ieee80211_hw *hw) /* we should be verifying the device is ready to be opened */ mutex_lock(&priv->mutex); + + /* fetch ucode file from disk, alloc and copy to bus-master buffers ... + * ucode filename and max sizes are card-specific. */ + + if (!priv->ucode_code.len) { + ret = iwl_read_ucode(priv); + if (ret) { + IWL_ERR(priv, "Could not read microcode: %d\n", ret); + mutex_unlock(&priv->mutex); + return ret; + } + } + ret = __iwl_up(priv); + mutex_unlock(&priv->mutex); if (ret) @@ -3662,10 +3654,17 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) iwl_power_initialize(priv); iwl_tt_initialize(priv); - err = iwl_request_firmware(priv, true); + /************************************************** + * 9. Setup and register with mac80211 and debugfs + **************************************************/ + err = iwl_mac_setup_register(priv); if (err) goto out_remove_sysfs; + err = iwl_dbgfs_register(priv, DRV_NAME); + if (err) + IWL_ERR(priv, "failed to create debugfs files. Ignoring error: %d\n", err); + return 0; out_remove_sysfs: diff --git a/trunk/drivers/net/wireless/iwlwifi/iwl-dev.h b/trunk/drivers/net/wireless/iwlwifi/iwl-dev.h index 6054c5fba0c1..ab891b958042 100644 --- a/trunk/drivers/net/wireless/iwlwifi/iwl-dev.h +++ b/trunk/drivers/net/wireless/iwlwifi/iwl-dev.h @@ -1132,7 +1132,6 @@ struct iwl_priv { u8 rev_id; /* uCode images, save to reload in case of failure */ - int fw_index; /* firmware we're trying to load */ u32 ucode_ver; /* version of ucode, copy of iwl_ucode.ver */ struct fw_desc ucode_code; /* runtime inst */ @@ -1143,7 +1142,6 @@ struct iwl_priv { struct fw_desc ucode_boot; /* bootstrap inst */ enum ucode_type ucode_type; u8 ucode_write_complete; /* the image write is complete */ - char firmware_name[25]; struct iwl_rxon_time_cmd rxon_timing; diff --git a/trunk/drivers/net/wireless/iwlwifi/iwl-scan.c b/trunk/drivers/net/wireless/iwlwifi/iwl-scan.c index bd2f7c420563..dd9ff2ed645a 100644 --- a/trunk/drivers/net/wireless/iwlwifi/iwl-scan.c +++ b/trunk/drivers/net/wireless/iwlwifi/iwl-scan.c @@ -638,9 +638,20 @@ u16 iwl_fill_probe_req(struct iwl_priv *priv, struct ieee80211_mgmt *frame, if (left < 0) return 0; *pos++ = WLAN_EID_SSID; - *pos++ = 0; - - len += 2; + if (!priv->is_internal_short_scan && + priv->scan_request->n_ssids) { + struct cfg80211_ssid *ssid = + priv->scan_request->ssids; + + /* Broadcast if ssid_len is 0 */ + *pos++ = ssid->ssid_len; + memcpy(pos, ssid->ssid, ssid->ssid_len); + pos += ssid->ssid_len; + len += 2 + ssid->ssid_len; + } else { + *pos++ = 0; + len += 2; + } if (WARN_ON(left < ie_len)) return len; @@ -769,20 +780,26 @@ static void iwl_bg_request_scan(struct work_struct *data) if (priv->is_internal_short_scan) { IWL_DEBUG_SCAN(priv, "Start internal passive scan.\n"); } else if (priv->scan_request->n_ssids) { - int i, p = 0; IWL_DEBUG_SCAN(priv, "Kicking off active scan\n"); - for (i = 0; i < priv->scan_request->n_ssids; i++) { - /* always does wildcard anyway */ - if (!priv->scan_request->ssids[i].ssid_len) - continue; - scan->direct_scan[p].id = WLAN_EID_SSID; - scan->direct_scan[p].len = - priv->scan_request->ssids[i].ssid_len; - memcpy(scan->direct_scan[p].ssid, - priv->scan_request->ssids[i].ssid, - priv->scan_request->ssids[i].ssid_len); - n_probes++; - p++; + /* + * The first SSID to scan is stuffed into the probe request + * template and the remaining ones are handled through the + * direct_scan array. + */ + if (priv->scan_request->n_ssids > 1) { + int i, p = 0; + for (i = 1; i < priv->scan_request->n_ssids; i++) { + if (!priv->scan_request->ssids[i].ssid_len) + continue; + scan->direct_scan[p].id = WLAN_EID_SSID; + scan->direct_scan[p].len = + priv->scan_request->ssids[i].ssid_len; + memcpy(scan->direct_scan[p].ssid, + priv->scan_request->ssids[i].ssid, + priv->scan_request->ssids[i].ssid_len); + n_probes++; + p++; + } } is_active = true; } else diff --git a/trunk/drivers/net/wireless/rndis_wlan.c b/trunk/drivers/net/wireless/rndis_wlan.c index 2887047069f2..9f6d6bf06b8e 100644 --- a/trunk/drivers/net/wireless/rndis_wlan.c +++ b/trunk/drivers/net/wireless/rndis_wlan.c @@ -1496,67 +1496,51 @@ static void set_multicast_list(struct usbnet *usbdev) { struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev); struct dev_mc_list *mclist; - __le32 filter, basefilter; - int ret; - char *mc_addrs = NULL; - int mc_count; + __le32 filter; + int ret, i, size; + char *buf; - basefilter = filter = RNDIS_PACKET_TYPE_DIRECTED | - RNDIS_PACKET_TYPE_BROADCAST; + filter = RNDIS_PACKET_TYPE_DIRECTED | RNDIS_PACKET_TYPE_BROADCAST; + netif_addr_lock_bh(usbdev->net); if (usbdev->net->flags & IFF_PROMISC) { filter |= RNDIS_PACKET_TYPE_PROMISCUOUS | RNDIS_PACKET_TYPE_ALL_LOCAL; - } else if (usbdev->net->flags & IFF_ALLMULTI) { - filter |= RNDIS_PACKET_TYPE_ALL_MULTICAST; - } - - if (filter != basefilter) - goto set_filter; - - /* - * mc_list should be accessed holding the lock, so copy addresses to - * local buffer first. - */ - netif_addr_lock_bh(usbdev->net); - mc_count = netdev_mc_count(usbdev->net); - if (mc_count > priv->multicast_size) { + } else if (usbdev->net->flags & IFF_ALLMULTI || + netdev_mc_count(usbdev->net) > priv->multicast_size) { filter |= RNDIS_PACKET_TYPE_ALL_MULTICAST; - } else if (mc_count) { - int i = 0; - - mc_addrs = kmalloc(mc_count * ETH_ALEN, GFP_ATOMIC); - if (!mc_addrs) { + } else if (!netdev_mc_empty(usbdev->net)) { + size = min(priv->multicast_size, netdev_mc_count(usbdev->net)); + buf = kmalloc(size * ETH_ALEN, GFP_KERNEL); + if (!buf) { netdev_warn(usbdev->net, "couldn't alloc %d bytes of memory\n", - mc_count * ETH_ALEN); + size * ETH_ALEN); netif_addr_unlock_bh(usbdev->net); return; } - netdev_for_each_mc_addr(mclist, usbdev->net) - memcpy(mc_addrs + i++ * ETH_ALEN, - mclist->dmi_addr, ETH_ALEN); - } - netif_addr_unlock_bh(usbdev->net); - - if (filter != basefilter) - goto set_filter; + i = 0; + netdev_for_each_mc_addr(mclist, usbdev->net) { + if (i == size) + break; + memcpy(buf + i++ * ETH_ALEN, mclist->dmi_addr, ETH_ALEN); + } - if (mc_count) { - ret = rndis_set_oid(usbdev, OID_802_3_MULTICAST_LIST, mc_addrs, - mc_count * ETH_ALEN); - kfree(mc_addrs); - if (ret == 0) + ret = rndis_set_oid(usbdev, OID_802_3_MULTICAST_LIST, buf, + i * ETH_ALEN); + if (ret == 0 && i > 0) filter |= RNDIS_PACKET_TYPE_MULTICAST; else filter |= RNDIS_PACKET_TYPE_ALL_MULTICAST; netdev_dbg(usbdev->net, "OID_802_3_MULTICAST_LIST(%d, max: %d) -> %d\n", - mc_count, priv->multicast_size, ret); + i, priv->multicast_size, ret); + + kfree(buf); } + netif_addr_unlock_bh(usbdev->net); -set_filter: ret = rndis_set_oid(usbdev, OID_GEN_CURRENT_PACKET_FILTER, &filter, sizeof(filter)); if (ret < 0) { diff --git a/trunk/drivers/net/wireless/rt2x00/rt2800pci.c b/trunk/drivers/net/wireless/rt2x00/rt2800pci.c index 91cce2d0f6db..aca8c124f434 100644 --- a/trunk/drivers/net/wireless/rt2x00/rt2800pci.c +++ b/trunk/drivers/net/wireless/rt2x00/rt2800pci.c @@ -1225,7 +1225,7 @@ MODULE_LICENSE("GPL"); #ifdef CONFIG_RT2800PCI_SOC static int rt2800soc_probe(struct platform_device *pdev) { - return rt2x00soc_probe(pdev, &rt2800pci_ops); + return rt2x00soc_probe(pdev, rt2800pci_ops); } static struct platform_driver rt2800soc_driver = { diff --git a/trunk/drivers/net/wireless/rt2x00/rt2x00soc.c b/trunk/drivers/net/wireless/rt2x00/rt2x00soc.c index 111c0ff5c6c7..4efdc96010f6 100644 --- a/trunk/drivers/net/wireless/rt2x00/rt2x00soc.c +++ b/trunk/drivers/net/wireless/rt2x00/rt2x00soc.c @@ -112,7 +112,6 @@ int rt2x00soc_probe(struct platform_device *pdev, const struct rt2x00_ops *ops) return retval; } -EXPORT_SYMBOL_GPL(rt2x00soc_probe); int rt2x00soc_remove(struct platform_device *pdev) { diff --git a/trunk/drivers/net/wireless/rt2x00/rt2x00soc.h b/trunk/drivers/net/wireless/rt2x00/rt2x00soc.h index 474cbfc1efc7..4739edfe2f00 100644 --- a/trunk/drivers/net/wireless/rt2x00/rt2x00soc.h +++ b/trunk/drivers/net/wireless/rt2x00/rt2x00soc.h @@ -26,6 +26,8 @@ #ifndef RT2X00SOC_H #define RT2X00SOC_H +#define KSEG1ADDR(__ptr) __ptr + /* * SoC driver handlers. */ diff --git a/trunk/drivers/net/wireless/rt2x00/rt73usb.c b/trunk/drivers/net/wireless/rt2x00/rt73usb.c index 290d70bc5d22..e77aec8d0a84 100644 --- a/trunk/drivers/net/wireless/rt2x00/rt73usb.c +++ b/trunk/drivers/net/wireless/rt2x00/rt73usb.c @@ -2352,8 +2352,6 @@ static struct usb_device_id rt73usb_device_table[] = { { USB_DEVICE(0x0411, 0x00f4), USB_DEVICE_DATA(&rt73usb_ops) }, { USB_DEVICE(0x0411, 0x0116), USB_DEVICE_DATA(&rt73usb_ops) }, { USB_DEVICE(0x0411, 0x0119), USB_DEVICE_DATA(&rt73usb_ops) }, - /* CEIVA */ - { USB_DEVICE(0x178d, 0x02be), USB_DEVICE_DATA(&rt73usb_ops) }, /* CNet */ { USB_DEVICE(0x1371, 0x9022), USB_DEVICE_DATA(&rt73usb_ops) }, { USB_DEVICE(0x1371, 0x9032), USB_DEVICE_DATA(&rt73usb_ops) }, diff --git a/trunk/drivers/net/wireless/zd1211rw/zd_mac.c b/trunk/drivers/net/wireless/zd1211rw/zd_mac.c index 00e09e26c826..a22a19203120 100644 --- a/trunk/drivers/net/wireless/zd1211rw/zd_mac.c +++ b/trunk/drivers/net/wireless/zd1211rw/zd_mac.c @@ -350,7 +350,7 @@ static void zd_mac_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb, first_idx = info->status.rates[0].idx; ZD_ASSERT(0<=first_idx && first_idxcount); + ZD_ASSERT(0<=retry && retry<=retries->count); info->status.rates[0].idx = retries->rate[0]; info->status.rates[0].count = 1; // (retry > 1 ? 2 : 1); @@ -360,7 +360,7 @@ static void zd_mac_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb, info->status.rates[i].count = 1; // ((i==retry-1) && success ? 1:2); } for (; istatus.rates[i].idx = retries->rate[retry - 1]; + info->status.rates[i].idx = retries->rate[retry-1]; info->status.rates[i].count = 1; // (success ? 1:2); } if (istatus.rates[0].idx; ZD_ASSERT(0<=first_idx && first_idx retries->count) + if (retry < 0 || retry > retries->count) { continue; + } - final_idx = retries->rate[retry - 1]; + ZD_ASSERT(0<=retry && retry<=retries->count); + final_idx = retries->rate[retry-1]; final_rate = zd_rates[final_idx].hw_value; if (final_rate != tx_status->rate) { diff --git a/trunk/drivers/pci/Makefile b/trunk/drivers/pci/Makefile index 0b51857fbaf7..3d102dd87c9f 100644 --- a/trunk/drivers/pci/Makefile +++ b/trunk/drivers/pci/Makefile @@ -48,7 +48,6 @@ obj-$(CONFIG_PPC) += setup-bus.o obj-$(CONFIG_MIPS) += setup-bus.o setup-irq.o obj-$(CONFIG_X86_VISWS) += setup-irq.o obj-$(CONFIG_MN10300) += setup-bus.o -obj-$(CONFIG_MICROBLAZE) += setup-bus.o # # ACPI Related PCI FW Functions diff --git a/trunk/drivers/pci/hotplug/acpiphp_glue.c b/trunk/drivers/pci/hotplug/acpiphp_glue.c index b5dad9f37453..cb2fd01eddae 100644 --- a/trunk/drivers/pci/hotplug/acpiphp_glue.c +++ b/trunk/drivers/pci/hotplug/acpiphp_glue.c @@ -749,24 +749,6 @@ static int acpiphp_bus_trim(acpi_handle handle) return retval; } -static void acpiphp_set_acpi_region(struct acpiphp_slot *slot) -{ - struct acpiphp_func *func; - union acpi_object params[2]; - struct acpi_object_list arg_list; - - list_for_each_entry(func, &slot->funcs, sibling) { - arg_list.count = 2; - arg_list.pointer = params; - params[0].type = ACPI_TYPE_INTEGER; - params[0].integer.value = ACPI_ADR_SPACE_PCI_CONFIG; - params[1].type = ACPI_TYPE_INTEGER; - params[1].integer.value = 1; - /* _REG is optional, we don't care about if there is failure */ - acpi_evaluate_object(func->handle, "_REG", &arg_list, NULL); - } -} - /** * enable_device - enable, configure a slot * @slot: slot to be enabled @@ -823,7 +805,6 @@ static int __ref enable_device(struct acpiphp_slot *slot) pci_bus_assign_resources(bus); acpiphp_sanitize_bus(bus); acpiphp_set_hpp_values(bus); - acpiphp_set_acpi_region(slot); pci_enable_bridges(bus); pci_bus_add_devices(bus); diff --git a/trunk/drivers/pcmcia/i82092.c b/trunk/drivers/pcmcia/i82092.c index f5da62653313..a04f21c8170f 100644 --- a/trunk/drivers/pcmcia/i82092.c +++ b/trunk/drivers/pcmcia/i82092.c @@ -133,7 +133,6 @@ static int __devinit i82092aa_pci_probe(struct pci_dev *dev, const struct pci_de sockets[i].socket.map_size = 0x1000; sockets[i].socket.irq_mask = 0; sockets[i].socket.pci_irq = dev->irq; - sockets[i].socket.cb_dev = dev; sockets[i].socket.owner = THIS_MODULE; sockets[i].number = i; diff --git a/trunk/drivers/pcmcia/i82365.h b/trunk/drivers/pcmcia/i82365.h index 3f84d7a2dc84..849ef1b5d687 100644 --- a/trunk/drivers/pcmcia/i82365.h +++ b/trunk/drivers/pcmcia/i82365.h @@ -95,7 +95,6 @@ #define I365_CSC_DETECT 0x08 #define I365_CSC_ANY 0x0F #define I365_CSC_GPI 0x10 -#define I365_CSC_IRQ_MASK 0xF0 /* Flags for I365_ADDRWIN */ #define I365_ENA_IO(map) (0x40 << (map)) diff --git a/trunk/drivers/pcmcia/pcmcia_resource.c b/trunk/drivers/pcmcia/pcmcia_resource.c index c4612c52e4cb..b2df04199a21 100644 --- a/trunk/drivers/pcmcia/pcmcia_resource.c +++ b/trunk/drivers/pcmcia/pcmcia_resource.c @@ -256,7 +256,6 @@ int pcmcia_modify_configuration(struct pcmcia_device *p_dev, { struct pcmcia_socket *s; config_t *c; - int ret; s = p_dev->socket; @@ -265,13 +264,13 @@ int pcmcia_modify_configuration(struct pcmcia_device *p_dev, if (!(s->state & SOCKET_PRESENT)) { dev_dbg(&s->dev, "No card present\n"); - ret = -ENODEV; - goto unlock; + mutex_unlock(&s->ops_mutex); + return -ENODEV; } if (!(c->state & CONFIG_LOCKED)) { dev_dbg(&s->dev, "Configuration isnt't locked\n"); - ret = -EACCES; - goto unlock; + mutex_unlock(&s->ops_mutex); + return -EACCES; } if (mod->Attributes & CONF_IRQ_CHANGE_VALID) { @@ -287,8 +286,7 @@ int pcmcia_modify_configuration(struct pcmcia_device *p_dev, if (mod->Attributes & CONF_VCC_CHANGE_VALID) { dev_dbg(&s->dev, "changing Vcc is not allowed at this time\n"); - ret = -EINVAL; - goto unlock; + return -EINVAL; } /* We only allow changing Vpp1 and Vpp2 to the same value */ @@ -296,21 +294,21 @@ int pcmcia_modify_configuration(struct pcmcia_device *p_dev, (mod->Attributes & CONF_VPP2_CHANGE_VALID)) { if (mod->Vpp1 != mod->Vpp2) { dev_dbg(&s->dev, "Vpp1 and Vpp2 must be the same\n"); - ret = -EINVAL; - goto unlock; + mutex_unlock(&s->ops_mutex); + return -EINVAL; } s->socket.Vpp = mod->Vpp1; if (s->ops->set_socket(s, &s->socket)) { + mutex_unlock(&s->ops_mutex); dev_printk(KERN_WARNING, &s->dev, "Unable to set VPP\n"); - ret = -EIO; - goto unlock; + return -EIO; } } else if ((mod->Attributes & CONF_VPP1_CHANGE_VALID) || (mod->Attributes & CONF_VPP2_CHANGE_VALID)) { dev_dbg(&s->dev, "changing Vcc is not allowed at this time\n"); - ret = -EINVAL; - goto unlock; + mutex_unlock(&s->ops_mutex); + return -EINVAL; } if (mod->Attributes & CONF_IO_CHANGE_WIDTH) { @@ -334,11 +332,9 @@ int pcmcia_modify_configuration(struct pcmcia_device *p_dev, s->ops->set_io_map(s, &io_on); } } - ret = 0; -unlock: mutex_unlock(&s->ops_mutex); - return ret; + return 0; } /* modify_configuration */ EXPORT_SYMBOL(pcmcia_modify_configuration); @@ -756,6 +752,14 @@ int pcmcia_request_irq(struct pcmcia_device *p_dev, irq_req_t *req) #ifdef CONFIG_PCMCIA_PROBE +#ifdef IRQ_NOAUTOEN + /* if the underlying IRQ infrastructure allows for it, only allocate + * the IRQ, but do not enable it + */ + if (!(req->Handler)) + type |= IRQ_NOAUTOEN; +#endif /* IRQ_NOAUTOEN */ + if (s->irq.AssignedIRQ != 0) { /* If the interrupt is already assigned, it must be the same */ irq = s->irq.AssignedIRQ; diff --git a/trunk/drivers/pcmcia/pd6729.c b/trunk/drivers/pcmcia/pd6729.c index 7ba57a565cd7..7c204910a777 100644 --- a/trunk/drivers/pcmcia/pd6729.c +++ b/trunk/drivers/pcmcia/pd6729.c @@ -671,7 +671,6 @@ static int __devinit pd6729_pci_probe(struct pci_dev *dev, socket[i].socket.map_size = 0x1000; socket[i].socket.irq_mask = mask; socket[i].socket.pci_irq = dev->irq; - socket[i].socket.cb_dev = dev; socket[i].socket.owner = THIS_MODULE; socket[i].number = i; diff --git a/trunk/drivers/pcmcia/ti113x.h b/trunk/drivers/pcmcia/ti113x.h index 9ffa97d0b16c..aaa70227bfb0 100644 --- a/trunk/drivers/pcmcia/ti113x.h +++ b/trunk/drivers/pcmcia/ti113x.h @@ -296,7 +296,7 @@ static int ti_init(struct yenta_socket *socket) u8 new, reg = exca_readb(socket, I365_INTCTL); new = reg & ~I365_INTR_ENA; - if (socket->dev->irq) + if (socket->cb_irq) new |= I365_INTR_ENA; if (new != reg) exca_writeb(socket, I365_INTCTL, new); @@ -316,47 +316,14 @@ static int ti_override(struct yenta_socket *socket) return 0; } -static void ti113x_use_isa_irq(struct yenta_socket *socket) -{ - int isa_irq = -1; - u8 intctl; - u32 isa_irq_mask = 0; - - if (!isa_probe) - return; - - /* get a free isa int */ - isa_irq_mask = yenta_probe_irq(socket, isa_interrupts); - if (!isa_irq_mask) - return; /* no useable isa irq found */ - - /* choose highest available */ - for (; isa_irq_mask; isa_irq++) - isa_irq_mask >>= 1; - socket->cb_irq = isa_irq; - - exca_writeb(socket, I365_CSCINT, (isa_irq << 4)); - - intctl = exca_readb(socket, I365_INTCTL); - intctl &= ~(I365_INTR_ENA | I365_IRQ_MASK); /* CSC Enable */ - exca_writeb(socket, I365_INTCTL, intctl); - - dev_info(&socket->dev->dev, - "Yenta TI113x: using isa irq %d for CardBus\n", isa_irq); -} - - static int ti113x_override(struct yenta_socket *socket) { u8 cardctl; cardctl = config_readb(socket, TI113X_CARD_CONTROL); cardctl &= ~(TI113X_CCR_PCI_IRQ_ENA | TI113X_CCR_PCI_IREQ | TI113X_CCR_PCI_CSC); - if (socket->dev->irq) + if (socket->cb_irq) cardctl |= TI113X_CCR_PCI_IRQ_ENA | TI113X_CCR_PCI_CSC | TI113X_CCR_PCI_IREQ; - else - ti113x_use_isa_irq(socket); - config_writeb(socket, TI113X_CARD_CONTROL, cardctl); return ti_override(socket); diff --git a/trunk/drivers/pcmcia/vrc4171_card.c b/trunk/drivers/pcmcia/vrc4171_card.c index aaccdb9f4ba1..c9fcbdc164ea 100644 --- a/trunk/drivers/pcmcia/vrc4171_card.c +++ b/trunk/drivers/pcmcia/vrc4171_card.c @@ -105,7 +105,6 @@ typedef struct vrc4171_socket { char name[24]; int csc_irq; int io_irq; - spinlock_t lock; } vrc4171_socket_t; static vrc4171_socket_t vrc4171_sockets[CARD_MAX_SLOTS]; @@ -328,7 +327,7 @@ static int pccard_set_socket(struct pcmcia_socket *sock, socket_state_t *state) slot = sock->sock; socket = &vrc4171_sockets[slot]; - spin_lock_irq(&socket->lock); + spin_lock_irq(&sock->lock); voltage = set_Vcc_value(state->Vcc); exca_write_byte(slot, CARD_VOLTAGE_SELECT, voltage); @@ -371,7 +370,7 @@ static int pccard_set_socket(struct pcmcia_socket *sock, socket_state_t *state) cscint |= I365_CSC_DETECT; exca_write_byte(slot, I365_CSCINT, cscint); - spin_unlock_irq(&socket->lock); + spin_unlock_irq(&sock->lock); return 0; } diff --git a/trunk/drivers/pcmcia/yenta_socket.c b/trunk/drivers/pcmcia/yenta_socket.c index 418988ab6edf..967c766f53ba 100644 --- a/trunk/drivers/pcmcia/yenta_socket.c +++ b/trunk/drivers/pcmcia/yenta_socket.c @@ -42,18 +42,6 @@ module_param_string(o2_speedup, o2_speedup, sizeof(o2_speedup), 0444); MODULE_PARM_DESC(o2_speedup, "Use prefetch/burst for O2-bridges: 'on', 'off' " "or 'default' (uses recommended behaviour for the detected bridge)"); -/* - * Only probe "regular" interrupts, don't - * touch dangerous spots like the mouse irq, - * because there are mice that apparently - * get really confused if they get fondled - * too intimately. - * - * Default to 11, 10, 9, 7, 6, 5, 4, 3. - */ -static u32 isa_interrupts = 0x0ef8; - - #define debug(x, s, args...) dev_dbg(&s->dev->dev, x, ##args) /* Don't ask.. */ @@ -66,8 +54,6 @@ static u32 isa_interrupts = 0x0ef8; */ #ifdef CONFIG_YENTA_TI static int yenta_probe_cb_irq(struct yenta_socket *socket); -static unsigned int yenta_probe_irq(struct yenta_socket *socket, - u32 isa_irq_mask); #endif @@ -343,8 +329,8 @@ static int yenta_set_socket(struct pcmcia_socket *sock, socket_state_t *state) /* ISA interrupt control? */ intr = exca_readb(socket, I365_INTCTL); intr = (intr & ~0xf); - if (!socket->dev->irq) { - intr |= socket->cb_irq ? socket->cb_irq : state->io_irq; + if (!socket->cb_irq) { + intr |= state->io_irq; bridge |= CB_BRIDGE_INTR; } exca_writeb(socket, I365_INTCTL, intr); @@ -354,7 +340,7 @@ static int yenta_set_socket(struct pcmcia_socket *sock, socket_state_t *state) reg = exca_readb(socket, I365_INTCTL) & (I365_RING_ENA | I365_INTR_ENA); reg |= (state->flags & SS_RESET) ? 0 : I365_PC_RESET; reg |= (state->flags & SS_IOCARD) ? I365_PC_IOCARD : 0; - if (state->io_irq != socket->dev->irq) { + if (state->io_irq != socket->cb_irq) { reg |= state->io_irq; bridge |= CB_BRIDGE_INTR; } @@ -370,9 +356,7 @@ static int yenta_set_socket(struct pcmcia_socket *sock, socket_state_t *state) exca_writeb(socket, I365_POWER, reg); /* CSC interrupt: no ISA irq for CSC */ - reg = exca_readb(socket, I365_CSCINT); - reg &= I365_CSC_IRQ_MASK; - reg |= I365_CSC_DETECT; + reg = I365_CSC_DETECT; if (state->flags & SS_IOCARD) { if (state->csc_mask & SS_STSCHG) reg |= I365_CSC_STSCHG; @@ -912,12 +896,22 @@ static struct cardbus_type cardbus_type[] = { }; +/* + * Only probe "regular" interrupts, don't + * touch dangerous spots like the mouse irq, + * because there are mice that apparently + * get really confused if they get fondled + * too intimately. + * + * Default to 11, 10, 9, 7, 6, 5, 4, 3. + */ +static u32 isa_interrupts = 0x0ef8; + static unsigned int yenta_probe_irq(struct yenta_socket *socket, u32 isa_irq_mask) { int i; unsigned long val; u32 mask; - u8 reg; /* * Probe for usable interrupts using the force @@ -925,7 +919,6 @@ static unsigned int yenta_probe_irq(struct yenta_socket *socket, u32 isa_irq_mas */ cb_writel(socket, CB_SOCKET_EVENT, -1); cb_writel(socket, CB_SOCKET_MASK, CB_CSTSMASK); - reg = exca_readb(socket, I365_CSCINT); exca_writeb(socket, I365_CSCINT, 0); val = probe_irq_on() & isa_irq_mask; for (i = 1; i < 16; i++) { @@ -937,7 +930,7 @@ static unsigned int yenta_probe_irq(struct yenta_socket *socket, u32 isa_irq_mas cb_writel(socket, CB_SOCKET_EVENT, -1); } cb_writel(socket, CB_SOCKET_MASK, 0); - exca_writeb(socket, I365_CSCINT, reg); + exca_writeb(socket, I365_CSCINT, 0); mask = probe_irq_mask(val) & 0xffff; @@ -974,8 +967,6 @@ static irqreturn_t yenta_probe_handler(int irq, void *dev_id) /* probes the PCI interrupt, use only on override functions */ static int yenta_probe_cb_irq(struct yenta_socket *socket) { - u8 reg; - if (!socket->cb_irq) return -1; @@ -988,8 +979,7 @@ static int yenta_probe_cb_irq(struct yenta_socket *socket) } /* generate interrupt, wait */ - reg = exca_readb(socket, I365_CSCINT); - exca_writeb(socket, I365_CSCINT, reg | I365_CSC_STSCHG); + exca_writeb(socket, I365_CSCINT, I365_CSC_STSCHG); cb_writel(socket, CB_SOCKET_EVENT, -1); cb_writel(socket, CB_SOCKET_MASK, CB_CSTSMASK); cb_writel(socket, CB_SOCKET_FORCE, CB_FCARDSTS); @@ -998,7 +988,7 @@ static int yenta_probe_cb_irq(struct yenta_socket *socket) /* disable interrupts */ cb_writel(socket, CB_SOCKET_MASK, 0); - exca_writeb(socket, I365_CSCINT, reg); + exca_writeb(socket, I365_CSCINT, 0); cb_writel(socket, CB_SOCKET_EVENT, -1); exca_readb(socket, I365_CSC); diff --git a/trunk/drivers/platform/x86/acer-wmi.c b/trunk/drivers/platform/x86/acer-wmi.c index cbca40aa4006..226b3e93498c 100644 --- a/trunk/drivers/platform/x86/acer-wmi.c +++ b/trunk/drivers/platform/x86/acer-wmi.c @@ -922,13 +922,9 @@ static struct backlight_ops acer_bl_ops = { static int __devinit acer_backlight_init(struct device *dev) { - struct backlight_properties props; struct backlight_device *bd; - memset(&props, 0, sizeof(struct backlight_properties)); - props.max_brightness = max_brightness; - bd = backlight_device_register("acer-wmi", dev, NULL, &acer_bl_ops, - &props); + bd = backlight_device_register("acer-wmi", dev, NULL, &acer_bl_ops); if (IS_ERR(bd)) { printk(ACER_ERR "Could not register Acer backlight device\n"); acer_backlight_device = NULL; @@ -939,6 +935,7 @@ static int __devinit acer_backlight_init(struct device *dev) bd->props.power = FB_BLANK_UNBLANK; bd->props.brightness = read_brightness(bd); + bd->props.max_brightness = max_brightness; backlight_update_status(bd); return 0; } diff --git a/trunk/drivers/platform/x86/asus-laptop.c b/trunk/drivers/platform/x86/asus-laptop.c index db5f7db2ba33..791fcf321506 100644 --- a/trunk/drivers/platform/x86/asus-laptop.c +++ b/trunk/drivers/platform/x86/asus-laptop.c @@ -639,16 +639,12 @@ static int asus_backlight_init(struct asus_laptop *asus) { struct backlight_device *bd; struct device *dev = &asus->platform_device->dev; - struct backlight_properties props; if (!acpi_check_handle(asus->handle, METHOD_BRIGHTNESS_GET, NULL) && !acpi_check_handle(asus->handle, METHOD_BRIGHTNESS_SET, NULL) && lcd_switch_handle) { - memset(&props, 0, sizeof(struct backlight_properties)); - props.max_brightness = 15; - bd = backlight_device_register(ASUS_LAPTOP_FILE, dev, - asus, &asusbl_ops, &props); + asus, &asusbl_ops); if (IS_ERR(bd)) { pr_err("Could not register asus backlight device\n"); asus->backlight_device = NULL; @@ -657,6 +653,7 @@ static int asus_backlight_init(struct asus_laptop *asus) asus->backlight_device = bd; + bd->props.max_brightness = 15; bd->props.power = FB_BLANK_UNBLANK; bd->props.brightness = asus_read_brightness(bd); backlight_update_status(bd); diff --git a/trunk/drivers/platform/x86/asus_acpi.c b/trunk/drivers/platform/x86/asus_acpi.c index ee520357abaa..1381430e1105 100644 --- a/trunk/drivers/platform/x86/asus_acpi.c +++ b/trunk/drivers/platform/x86/asus_acpi.c @@ -1481,7 +1481,6 @@ static void asus_acpi_exit(void) static int __init asus_acpi_init(void) { - struct backlight_properties props; int result; result = acpi_bus_register_driver(&asus_hotk_driver); @@ -1508,17 +1507,15 @@ static int __init asus_acpi_init(void) return -ENODEV; } - memset(&props, 0, sizeof(struct backlight_properties)); - props.max_brightness = 15; asus_backlight_device = backlight_device_register("asus", NULL, NULL, - &asus_backlight_data, - &props); + &asus_backlight_data); if (IS_ERR(asus_backlight_device)) { printk(KERN_ERR "Could not register asus backlight device\n"); asus_backlight_device = NULL; asus_acpi_exit(); return -ENODEV; } + asus_backlight_device->props.max_brightness = 15; return 0; } diff --git a/trunk/drivers/platform/x86/classmate-laptop.c b/trunk/drivers/platform/x86/classmate-laptop.c index c696cf1c2616..035a7dd65a3f 100644 --- a/trunk/drivers/platform/x86/classmate-laptop.c +++ b/trunk/drivers/platform/x86/classmate-laptop.c @@ -455,22 +455,18 @@ static int cmpc_bl_update_status(struct backlight_device *bd) return -1; } -static const struct backlight_ops cmpc_bl_ops = { +static struct backlight_ops cmpc_bl_ops = { .get_brightness = cmpc_bl_get_brightness, .update_status = cmpc_bl_update_status }; static int cmpc_bl_add(struct acpi_device *acpi) { - struct backlight_properties props; struct backlight_device *bd; - memset(&props, 0, sizeof(struct backlight_properties)); - props.max_brightness = 7; - bd = backlight_device_register("cmpc_bl", &acpi->dev, acpi->handle, - &cmpc_bl_ops, &props); - if (IS_ERR(bd)) - return PTR_ERR(bd); + bd = backlight_device_register("cmpc_bl", &acpi->dev, + acpi->handle, &cmpc_bl_ops); + bd->props.max_brightness = 7; dev_set_drvdata(&acpi->dev, bd); return 0; } diff --git a/trunk/drivers/platform/x86/compal-laptop.c b/trunk/drivers/platform/x86/compal-laptop.c index 71ff1545a93e..2740b40aad9b 100644 --- a/trunk/drivers/platform/x86/compal-laptop.c +++ b/trunk/drivers/platform/x86/compal-laptop.c @@ -291,15 +291,12 @@ static int __init compal_init(void) /* Register backlight stuff */ if (!acpi_video_backlight_support()) { - struct backlight_properties props; - memset(&props, 0, sizeof(struct backlight_properties)); - props.max_brightness = COMPAL_LCD_LEVEL_MAX - 1; - compalbl_device = backlight_device_register("compal-laptop", - NULL, NULL, - &compalbl_ops, - &props); + compalbl_device = backlight_device_register("compal-laptop", NULL, NULL, + &compalbl_ops); if (IS_ERR(compalbl_device)) return PTR_ERR(compalbl_device); + + compalbl_device->props.max_brightness = COMPAL_LCD_LEVEL_MAX-1; } ret = platform_driver_register(&compal_driver); diff --git a/trunk/drivers/platform/x86/dell-laptop.c b/trunk/drivers/platform/x86/dell-laptop.c index 46435ac4684f..ef614979afe9 100644 --- a/trunk/drivers/platform/x86/dell-laptop.c +++ b/trunk/drivers/platform/x86/dell-laptop.c @@ -559,14 +559,10 @@ static int __init dell_init(void) release_buffer(); if (max_intensity) { - struct backlight_properties props; - memset(&props, 0, sizeof(struct backlight_properties)); - props.max_brightness = max_intensity; - dell_backlight_device = backlight_device_register("dell_backlight", - &platform_device->dev, - NULL, - &dell_ops, - &props); + dell_backlight_device = backlight_device_register( + "dell_backlight", + &platform_device->dev, NULL, + &dell_ops); if (IS_ERR(dell_backlight_device)) { ret = PTR_ERR(dell_backlight_device); @@ -574,6 +570,7 @@ static int __init dell_init(void) goto fail_backlight; } + dell_backlight_device->props.max_brightness = max_intensity; dell_backlight_device->props.brightness = dell_get_intensity(dell_backlight_device); backlight_update_status(dell_backlight_device); diff --git a/trunk/drivers/platform/x86/dell-wmi.c b/trunk/drivers/platform/x86/dell-wmi.c index bed764e3ea2a..1b1dddbd5744 100644 --- a/trunk/drivers/platform/x86/dell-wmi.c +++ b/trunk/drivers/platform/x86/dell-wmi.c @@ -142,7 +142,7 @@ static struct key_entry *dell_wmi_keymap = dell_legacy_wmi_keymap; static struct input_dev *dell_wmi_input_dev; -static struct key_entry *dell_wmi_get_entry_by_scancode(unsigned int code) +static struct key_entry *dell_wmi_get_entry_by_scancode(int code) { struct key_entry *key; @@ -153,7 +153,7 @@ static struct key_entry *dell_wmi_get_entry_by_scancode(unsigned int code) return NULL; } -static struct key_entry *dell_wmi_get_entry_by_keycode(unsigned int keycode) +static struct key_entry *dell_wmi_get_entry_by_keycode(int keycode) { struct key_entry *key; @@ -164,8 +164,8 @@ static struct key_entry *dell_wmi_get_entry_by_keycode(unsigned int keycode) return NULL; } -static int dell_wmi_getkeycode(struct input_dev *dev, - unsigned int scancode, unsigned int *keycode) +static int dell_wmi_getkeycode(struct input_dev *dev, int scancode, + int *keycode) { struct key_entry *key = dell_wmi_get_entry_by_scancode(scancode); @@ -177,11 +177,13 @@ static int dell_wmi_getkeycode(struct input_dev *dev, return -EINVAL; } -static int dell_wmi_setkeycode(struct input_dev *dev, - unsigned int scancode, unsigned int keycode) +static int dell_wmi_setkeycode(struct input_dev *dev, int scancode, int keycode) { struct key_entry *key; - unsigned int old_keycode; + int old_keycode; + + if (keycode < 0 || keycode > KEY_MAX) + return -EINVAL; key = dell_wmi_get_entry_by_scancode(scancode); if (key && key->type == KE_KEY) { diff --git a/trunk/drivers/platform/x86/eeepc-laptop.c b/trunk/drivers/platform/x86/eeepc-laptop.c index 3fdf21e0052e..9a844caa3756 100644 --- a/trunk/drivers/platform/x86/eeepc-laptop.c +++ b/trunk/drivers/platform/x86/eeepc-laptop.c @@ -1131,20 +1131,18 @@ static int eeepc_backlight_notify(struct eeepc_laptop *eeepc) static int eeepc_backlight_init(struct eeepc_laptop *eeepc) { - struct backlight_properties props; struct backlight_device *bd; - memset(&props, 0, sizeof(struct backlight_properties)); - props.max_brightness = 15; bd = backlight_device_register(EEEPC_LAPTOP_FILE, - &eeepc->platform_device->dev, eeepc, - &eeepcbl_ops, &props); + &eeepc->platform_device->dev, + eeepc, &eeepcbl_ops); if (IS_ERR(bd)) { pr_err("Could not register eeepc backlight device\n"); eeepc->backlight_device = NULL; return PTR_ERR(bd); } eeepc->backlight_device = bd; + bd->props.max_brightness = 15; bd->props.brightness = read_brightness(bd); bd->props.power = FB_BLANK_UNBLANK; backlight_update_status(bd); diff --git a/trunk/drivers/platform/x86/fujitsu-laptop.c b/trunk/drivers/platform/x86/fujitsu-laptop.c index c1074b32490e..5f3320d468f6 100644 --- a/trunk/drivers/platform/x86/fujitsu-laptop.c +++ b/trunk/drivers/platform/x86/fujitsu-laptop.c @@ -1126,20 +1126,16 @@ static int __init fujitsu_init(void) /* Register backlight stuff */ if (!acpi_video_backlight_support()) { - struct backlight_properties props; - - memset(&props, 0, sizeof(struct backlight_properties)); - max_brightness = fujitsu->max_brightness; - props.max_brightness = max_brightness - 1; - fujitsu->bl_device = backlight_device_register("fujitsu-laptop", - NULL, NULL, - &fujitsubl_ops, - &props); + fujitsu->bl_device = + backlight_device_register("fujitsu-laptop", NULL, NULL, + &fujitsubl_ops); if (IS_ERR(fujitsu->bl_device)) { ret = PTR_ERR(fujitsu->bl_device); fujitsu->bl_device = NULL; goto fail_sysfs_group; } + max_brightness = fujitsu->max_brightness; + fujitsu->bl_device->props.max_brightness = max_brightness - 1; fujitsu->bl_device->props.brightness = fujitsu->brightness_level; } diff --git a/trunk/drivers/platform/x86/hp-wmi.c b/trunk/drivers/platform/x86/hp-wmi.c index 56086363becc..7ccf33c08967 100644 --- a/trunk/drivers/platform/x86/hp-wmi.c +++ b/trunk/drivers/platform/x86/hp-wmi.c @@ -278,7 +278,7 @@ static DEVICE_ATTR(als, S_IRUGO | S_IWUSR, show_als, set_als); static DEVICE_ATTR(dock, S_IRUGO, show_dock, NULL); static DEVICE_ATTR(tablet, S_IRUGO, show_tablet, NULL); -static struct key_entry *hp_wmi_get_entry_by_scancode(unsigned int code) +static struct key_entry *hp_wmi_get_entry_by_scancode(int code) { struct key_entry *key; @@ -289,7 +289,7 @@ static struct key_entry *hp_wmi_get_entry_by_scancode(unsigned int code) return NULL; } -static struct key_entry *hp_wmi_get_entry_by_keycode(unsigned int keycode) +static struct key_entry *hp_wmi_get_entry_by_keycode(int keycode) { struct key_entry *key; @@ -300,8 +300,7 @@ static struct key_entry *hp_wmi_get_entry_by_keycode(unsigned int keycode) return NULL; } -static int hp_wmi_getkeycode(struct input_dev *dev, - unsigned int scancode, unsigned int *keycode) +static int hp_wmi_getkeycode(struct input_dev *dev, int scancode, int *keycode) { struct key_entry *key = hp_wmi_get_entry_by_scancode(scancode); @@ -313,11 +312,13 @@ static int hp_wmi_getkeycode(struct input_dev *dev, return -EINVAL; } -static int hp_wmi_setkeycode(struct input_dev *dev, - unsigned int scancode, unsigned int keycode) +static int hp_wmi_setkeycode(struct input_dev *dev, int scancode, int keycode) { struct key_entry *key; - unsigned int old_keycode; + int old_keycode; + + if (keycode < 0 || keycode > KEY_MAX) + return -EINVAL; key = hp_wmi_get_entry_by_scancode(scancode); if (key && key->type == KE_KEY) { diff --git a/trunk/drivers/platform/x86/msi-laptop.c b/trunk/drivers/platform/x86/msi-laptop.c index 996223a7c009..c2b05da4289a 100644 --- a/trunk/drivers/platform/x86/msi-laptop.c +++ b/trunk/drivers/platform/x86/msi-laptop.c @@ -683,14 +683,11 @@ static int __init msi_init(void) printk(KERN_INFO "MSI: Brightness ignored, must be controlled " "by ACPI video driver\n"); } else { - struct backlight_properties props; - memset(&props, 0, sizeof(struct backlight_properties)); - props.max_brightness = MSI_LCD_LEVEL_MAX - 1; msibl_device = backlight_device_register("msi-laptop-bl", NULL, - NULL, &msibl_ops, - &props); + NULL, &msibl_ops); if (IS_ERR(msibl_device)) return PTR_ERR(msibl_device); + msibl_device->props.max_brightness = MSI_LCD_LEVEL_MAX-1; } ret = platform_driver_register(&msipf_driver); diff --git a/trunk/drivers/platform/x86/msi-wmi.c b/trunk/drivers/platform/x86/msi-wmi.c index 367caaae2f3c..f5f70d4c6913 100644 --- a/trunk/drivers/platform/x86/msi-wmi.c +++ b/trunk/drivers/platform/x86/msi-wmi.c @@ -138,7 +138,7 @@ static int bl_set_status(struct backlight_device *bd) return msi_wmi_set_block(0, backlight_map[bright]); } -static const struct backlight_ops msi_backlight_ops = { +static struct backlight_ops msi_backlight_ops = { .get_brightness = bl_get, .update_status = bl_set_status, }; @@ -249,17 +249,12 @@ static int __init msi_wmi_init(void) goto err_uninstall_notifier; if (!acpi_video_backlight_support()) { - struct backlight_properties props; - memset(&props, 0, sizeof(struct backlight_properties)); - props.max_brightness = ARRAY_SIZE(backlight_map) - 1; - backlight = backlight_device_register(DRV_NAME, NULL, NULL, - &msi_backlight_ops, - &props); - if (IS_ERR(backlight)) { - err = PTR_ERR(backlight); + backlight = backlight_device_register(DRV_NAME, + NULL, NULL, &msi_backlight_ops); + if (IS_ERR(backlight)) goto err_free_input; - } + backlight->props.max_brightness = ARRAY_SIZE(backlight_map) - 1; err = bl_get(NULL); if (err < 0) goto err_free_backlight; diff --git a/trunk/drivers/platform/x86/panasonic-laptop.c b/trunk/drivers/platform/x86/panasonic-laptop.c index 726f02affcb6..fe7cf0188acc 100644 --- a/trunk/drivers/platform/x86/panasonic-laptop.c +++ b/trunk/drivers/platform/x86/panasonic-laptop.c @@ -200,7 +200,7 @@ static struct acpi_driver acpi_pcc_driver = { }; #define KEYMAP_SIZE 11 -static const unsigned int initial_keymap[KEYMAP_SIZE] = { +static const int initial_keymap[KEYMAP_SIZE] = { /* 0 */ KEY_RESERVED, /* 1 */ KEY_BRIGHTNESSDOWN, /* 2 */ KEY_BRIGHTNESSUP, @@ -222,7 +222,7 @@ struct pcc_acpi { struct acpi_device *device; struct input_dev *input_dev; struct backlight_device *backlight; - unsigned int keymap[KEYMAP_SIZE]; + int keymap[KEYMAP_SIZE]; }; struct pcc_keyinput { @@ -352,7 +352,7 @@ static int bl_set_status(struct backlight_device *bd) return acpi_pcc_write_sset(pcc, SINF_DC_CUR_BRIGHT, bright); } -static const struct backlight_ops pcc_backlight_ops = { +static struct backlight_ops pcc_backlight_ops = { .get_brightness = bl_get, .update_status = bl_set_status, }; @@ -445,8 +445,7 @@ static struct attribute_group pcc_attr_group = { /* hotkey input device driver */ -static int pcc_getkeycode(struct input_dev *dev, - unsigned int scancode, unsigned int *keycode) +static int pcc_getkeycode(struct input_dev *dev, int scancode, int *keycode) { struct pcc_acpi *pcc = input_get_drvdata(dev); @@ -458,7 +457,7 @@ static int pcc_getkeycode(struct input_dev *dev, return 0; } -static int keymap_get_by_keycode(struct pcc_acpi *pcc, unsigned int keycode) +static int keymap_get_by_keycode(struct pcc_acpi *pcc, int keycode) { int i; @@ -470,8 +469,7 @@ static int keymap_get_by_keycode(struct pcc_acpi *pcc, unsigned int keycode) return 0; } -static int pcc_setkeycode(struct input_dev *dev, - unsigned int scancode, unsigned int keycode) +static int pcc_setkeycode(struct input_dev *dev, int scancode, int keycode) { struct pcc_acpi *pcc = input_get_drvdata(dev); int oldkeycode; @@ -479,6 +477,9 @@ static int pcc_setkeycode(struct input_dev *dev, if (scancode >= ARRAY_SIZE(pcc->keymap)) return -EINVAL; + if (keycode < 0 || keycode > KEY_MAX) + return -EINVAL; + oldkeycode = pcc->keymap[scancode]; pcc->keymap[scancode] = keycode; @@ -600,7 +601,6 @@ static int acpi_pcc_hotkey_resume(struct acpi_device *device) static int acpi_pcc_hotkey_add(struct acpi_device *device) { - struct backlight_properties props; struct pcc_acpi *pcc; int num_sifr, result; @@ -638,25 +638,24 @@ static int acpi_pcc_hotkey_add(struct acpi_device *device) if (result) { ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Error installing keyinput handler\n")); - goto out_hotkey; + goto out_sinf; } + /* initialize backlight */ + pcc->backlight = backlight_device_register("panasonic", NULL, pcc, + &pcc_backlight_ops); + if (IS_ERR(pcc->backlight)) + goto out_input; + if (!acpi_pcc_retrieve_biosdata(pcc, pcc->sinf)) { ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Couldn't retrieve BIOS data\n")); - goto out_input; - } - /* initialize backlight */ - memset(&props, 0, sizeof(struct backlight_properties)); - props.max_brightness = pcc->sinf[SINF_AC_MAX_BRIGHT]; - pcc->backlight = backlight_device_register("panasonic", NULL, pcc, - &pcc_backlight_ops, &props); - if (IS_ERR(pcc->backlight)) { - result = PTR_ERR(pcc->backlight); - goto out_sinf; + goto out_backlight; } /* read the initial brightness setting from the hardware */ + pcc->backlight->props.max_brightness = + pcc->sinf[SINF_AC_MAX_BRIGHT]; pcc->backlight->props.brightness = pcc->sinf[SINF_AC_CUR_BRIGHT]; /* read the initial sticky key mode from the hardware */ @@ -671,12 +670,12 @@ static int acpi_pcc_hotkey_add(struct acpi_device *device) out_backlight: backlight_device_unregister(pcc->backlight); -out_sinf: - kfree(pcc->sinf); out_input: input_unregister_device(pcc->input_dev); /* no need to input_free_device() since core input API refcount and * free()s the device */ +out_sinf: + kfree(pcc->sinf); out_hotkey: kfree(pcc); diff --git a/trunk/drivers/platform/x86/sony-laptop.c b/trunk/drivers/platform/x86/sony-laptop.c index 6553b91caaa4..3f71a605a492 100644 --- a/trunk/drivers/platform/x86/sony-laptop.c +++ b/trunk/drivers/platform/x86/sony-laptop.c @@ -145,7 +145,7 @@ struct sony_laptop_input_s { struct input_dev *key_dev; struct kfifo fifo; spinlock_t fifo_lock; - struct timer_list release_key_timer; + struct workqueue_struct *wq; }; static struct sony_laptop_input_s sony_laptop_input = { @@ -299,26 +299,20 @@ static int sony_laptop_input_keycode_map[] = { }; /* release buttons after a short delay if pressed */ -static void do_sony_laptop_release_key(unsigned long unused) +static void do_sony_laptop_release_key(struct work_struct *work) { struct sony_laptop_keypress kp; - unsigned long flags; - - spin_lock_irqsave(&sony_laptop_input.fifo_lock, flags); - if (kfifo_out(&sony_laptop_input.fifo, - (unsigned char *)&kp, sizeof(kp)) == sizeof(kp)) { + while (kfifo_out_locked(&sony_laptop_input.fifo, (unsigned char *)&kp, + sizeof(kp), &sony_laptop_input.fifo_lock) + == sizeof(kp)) { + msleep(10); input_report_key(kp.dev, kp.key, 0); input_sync(kp.dev); } - - /* If there is something in the fifo schedule next release. */ - if (kfifo_len(&sony_laptop_input.fifo) != 0) - mod_timer(&sony_laptop_input.release_key_timer, - jiffies + msecs_to_jiffies(10)); - - spin_unlock_irqrestore(&sony_laptop_input.fifo_lock, flags); } +static DECLARE_WORK(sony_laptop_release_key_work, + do_sony_laptop_release_key); /* forward event to the input subsystem */ static void sony_laptop_report_input_event(u8 event) @@ -372,13 +366,13 @@ static void sony_laptop_report_input_event(u8 event) /* we emit the scancode so we can always remap the key */ input_event(kp.dev, EV_MSC, MSC_SCAN, event); input_sync(kp.dev); - - /* schedule key release */ kfifo_in_locked(&sony_laptop_input.fifo, - (unsigned char *)&kp, sizeof(kp), - &sony_laptop_input.fifo_lock); - mod_timer(&sony_laptop_input.release_key_timer, - jiffies + msecs_to_jiffies(10)); + (unsigned char *)&kp, sizeof(kp), + &sony_laptop_input.fifo_lock); + + if (!work_pending(&sony_laptop_release_key_work)) + queue_work(sony_laptop_input.wq, + &sony_laptop_release_key_work); } else dprintk("unknown input event %.2x\n", event); } @@ -396,21 +390,27 @@ static int sony_laptop_setup_input(struct acpi_device *acpi_device) /* kfifo */ spin_lock_init(&sony_laptop_input.fifo_lock); - error = kfifo_alloc(&sony_laptop_input.fifo, - SONY_LAPTOP_BUF_SIZE, GFP_KERNEL); + error = + kfifo_alloc(&sony_laptop_input.fifo, SONY_LAPTOP_BUF_SIZE, GFP_KERNEL); if (error) { printk(KERN_ERR DRV_PFX "kfifo_alloc failed\n"); goto err_dec_users; } - setup_timer(&sony_laptop_input.release_key_timer, - do_sony_laptop_release_key, 0); + /* init workqueue */ + sony_laptop_input.wq = create_singlethread_workqueue("sony-laptop"); + if (!sony_laptop_input.wq) { + printk(KERN_ERR DRV_PFX + "Unable to create workqueue.\n"); + error = -ENXIO; + goto err_free_kfifo; + } /* input keys */ key_dev = input_allocate_device(); if (!key_dev) { error = -ENOMEM; - goto err_free_kfifo; + goto err_destroy_wq; } key_dev->name = "Sony Vaio Keys"; @@ -419,15 +419,18 @@ static int sony_laptop_setup_input(struct acpi_device *acpi_device) key_dev->dev.parent = &acpi_device->dev; /* Initialize the Input Drivers: special keys */ - input_set_capability(key_dev, EV_MSC, MSC_SCAN); - - __set_bit(EV_KEY, key_dev->evbit); + set_bit(EV_KEY, key_dev->evbit); + set_bit(EV_MSC, key_dev->evbit); + set_bit(MSC_SCAN, key_dev->mscbit); key_dev->keycodesize = sizeof(sony_laptop_input_keycode_map[0]); key_dev->keycodemax = ARRAY_SIZE(sony_laptop_input_keycode_map); key_dev->keycode = &sony_laptop_input_keycode_map; - for (i = 0; i < ARRAY_SIZE(sony_laptop_input_keycode_map); i++) - __set_bit(sony_laptop_input_keycode_map[i], key_dev->keybit); - __clear_bit(KEY_RESERVED, key_dev->keybit); + for (i = 0; i < ARRAY_SIZE(sony_laptop_input_keycode_map); i++) { + if (sony_laptop_input_keycode_map[i] != KEY_RESERVED) { + set_bit(sony_laptop_input_keycode_map[i], + key_dev->keybit); + } + } error = input_register_device(key_dev); if (error) @@ -447,8 +450,9 @@ static int sony_laptop_setup_input(struct acpi_device *acpi_device) jog_dev->id.vendor = PCI_VENDOR_ID_SONY; key_dev->dev.parent = &acpi_device->dev; - input_set_capability(jog_dev, EV_KEY, BTN_MIDDLE); - input_set_capability(jog_dev, EV_REL, REL_WHEEL); + jog_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REL); + jog_dev->keybit[BIT_WORD(BTN_MOUSE)] = BIT_MASK(BTN_MIDDLE); + jog_dev->relbit[0] = BIT_MASK(REL_WHEEL); error = input_register_device(jog_dev); if (error) @@ -469,6 +473,9 @@ static int sony_laptop_setup_input(struct acpi_device *acpi_device) err_free_keydev: input_free_device(key_dev); +err_destroy_wq: + destroy_workqueue(sony_laptop_input.wq); + err_free_kfifo: kfifo_free(&sony_laptop_input.fifo); @@ -479,23 +486,12 @@ static int sony_laptop_setup_input(struct acpi_device *acpi_device) static void sony_laptop_remove_input(void) { - struct sony_laptop_keypress kp = { NULL }; - - /* Cleanup only after the last user has gone */ + /* cleanup only after the last user has gone */ if (!atomic_dec_and_test(&sony_laptop_input.users)) return; - del_timer_sync(&sony_laptop_input.release_key_timer); - - /* - * Generate key-up events for remaining keys. Note that we don't - * need locking since nobody is adding new events to the kfifo. - */ - while (kfifo_out(&sony_laptop_input.fifo, - (unsigned char *)&kp, sizeof(kp)) == sizeof(kp)) { - input_report_key(kp.dev, kp.key, 0); - input_sync(kp.dev); - } + /* flush workqueue first */ + flush_workqueue(sony_laptop_input.wq); /* destroy input devs */ input_unregister_device(sony_laptop_input.key_dev); @@ -506,6 +502,7 @@ static void sony_laptop_remove_input(void) sony_laptop_input.jog_dev = NULL; } + destroy_workqueue(sony_laptop_input.wq); kfifo_free(&sony_laptop_input.fifo); } @@ -1291,13 +1288,9 @@ static int sony_nc_add(struct acpi_device *device) "controlled by ACPI video driver\n"); } else if (ACPI_SUCCESS(acpi_get_handle(sony_nc_acpi_handle, "GBRT", &handle))) { - struct backlight_properties props; - memset(&props, 0, sizeof(struct backlight_properties)); - props.max_brightness = SONY_MAX_BRIGHTNESS - 1; sony_backlight_device = backlight_device_register("sony", NULL, NULL, - &sony_backlight_ops, - &props); + &sony_backlight_ops); if (IS_ERR(sony_backlight_device)) { printk(KERN_WARNING DRV_PFX "unable to register backlight device\n"); @@ -1306,6 +1299,8 @@ static int sony_nc_add(struct acpi_device *device) sony_backlight_device->props.brightness = sony_backlight_get_brightness (sony_backlight_device); + sony_backlight_device->props.max_brightness = + SONY_MAX_BRIGHTNESS - 1; } } diff --git a/trunk/drivers/platform/x86/thinkpad_acpi.c b/trunk/drivers/platform/x86/thinkpad_acpi.c index 770b85327f84..c64e3528889b 100644 --- a/trunk/drivers/platform/x86/thinkpad_acpi.c +++ b/trunk/drivers/platform/x86/thinkpad_acpi.c @@ -6170,7 +6170,6 @@ static const struct tpacpi_quirk brightness_quirk_table[] __initconst = { static int __init brightness_init(struct ibm_init_struct *iibm) { - struct backlight_properties props; int b; unsigned long quirks; @@ -6260,12 +6259,9 @@ static int __init brightness_init(struct ibm_init_struct *iibm) printk(TPACPI_INFO "detected a 16-level brightness capable ThinkPad\n"); - memset(&props, 0, sizeof(struct backlight_properties)); - props.max_brightness = (tp_features.bright_16levels) ? 15 : 7; - ibm_backlight_device = backlight_device_register(TPACPI_BACKLIGHT_DEV_NAME, - NULL, NULL, - &ibm_backlight_data, - &props); + ibm_backlight_device = backlight_device_register( + TPACPI_BACKLIGHT_DEV_NAME, NULL, NULL, + &ibm_backlight_data); if (IS_ERR(ibm_backlight_device)) { int rc = PTR_ERR(ibm_backlight_device); ibm_backlight_device = NULL; @@ -6284,6 +6280,8 @@ static int __init brightness_init(struct ibm_init_struct *iibm) "or not on your ThinkPad\n", TPACPI_MAIL); } + ibm_backlight_device->props.max_brightness = + (tp_features.bright_16levels)? 15 : 7; ibm_backlight_device->props.brightness = b & TP_EC_BACKLIGHT_LVLMSK; backlight_update_status(ibm_backlight_device); diff --git a/trunk/drivers/platform/x86/topstar-laptop.c b/trunk/drivers/platform/x86/topstar-laptop.c index 4d6516fded7e..02f3d4e9e666 100644 --- a/trunk/drivers/platform/x86/topstar-laptop.c +++ b/trunk/drivers/platform/x86/topstar-laptop.c @@ -46,7 +46,7 @@ static struct tps_key_entry topstar_keymap[] = { { } }; -static struct tps_key_entry *tps_get_key_by_scancode(unsigned int code) +static struct tps_key_entry *tps_get_key_by_scancode(int code) { struct tps_key_entry *key; @@ -57,7 +57,7 @@ static struct tps_key_entry *tps_get_key_by_scancode(unsigned int code) return NULL; } -static struct tps_key_entry *tps_get_key_by_keycode(unsigned int code) +static struct tps_key_entry *tps_get_key_by_keycode(int code) { struct tps_key_entry *key; @@ -126,8 +126,7 @@ static int acpi_topstar_fncx_switch(struct acpi_device *device, bool state) return 0; } -static int topstar_getkeycode(struct input_dev *dev, - unsigned int scancode, unsigned int *keycode) +static int topstar_getkeycode(struct input_dev *dev, int scancode, int *keycode) { struct tps_key_entry *key = tps_get_key_by_scancode(scancode); @@ -138,12 +137,14 @@ static int topstar_getkeycode(struct input_dev *dev, return 0; } -static int topstar_setkeycode(struct input_dev *dev, - unsigned int scancode, unsigned int keycode) +static int topstar_setkeycode(struct input_dev *dev, int scancode, int keycode) { struct tps_key_entry *key; int old_keycode; + if (keycode < 0 || keycode > KEY_MAX) + return -EINVAL; + key = tps_get_key_by_scancode(scancode); if (!key) diff --git a/trunk/drivers/platform/x86/toshiba_acpi.c b/trunk/drivers/platform/x86/toshiba_acpi.c index def4841183be..405b969734d6 100644 --- a/trunk/drivers/platform/x86/toshiba_acpi.c +++ b/trunk/drivers/platform/x86/toshiba_acpi.c @@ -745,7 +745,7 @@ static struct backlight_ops toshiba_backlight_data = { .update_status = set_lcd_status, }; -static struct key_entry *toshiba_acpi_get_entry_by_scancode(unsigned int code) +static struct key_entry *toshiba_acpi_get_entry_by_scancode(int code) { struct key_entry *key; @@ -756,7 +756,7 @@ static struct key_entry *toshiba_acpi_get_entry_by_scancode(unsigned int code) return NULL; } -static struct key_entry *toshiba_acpi_get_entry_by_keycode(unsigned int code) +static struct key_entry *toshiba_acpi_get_entry_by_keycode(int code) { struct key_entry *key; @@ -767,8 +767,8 @@ static struct key_entry *toshiba_acpi_get_entry_by_keycode(unsigned int code) return NULL; } -static int toshiba_acpi_getkeycode(struct input_dev *dev, - unsigned int scancode, unsigned int *keycode) +static int toshiba_acpi_getkeycode(struct input_dev *dev, int scancode, + int *keycode) { struct key_entry *key = toshiba_acpi_get_entry_by_scancode(scancode); @@ -780,11 +780,14 @@ static int toshiba_acpi_getkeycode(struct input_dev *dev, return -EINVAL; } -static int toshiba_acpi_setkeycode(struct input_dev *dev, - unsigned int scancode, unsigned int keycode) +static int toshiba_acpi_setkeycode(struct input_dev *dev, int scancode, + int keycode) { struct key_entry *key; - unsigned int old_keycode; + int old_keycode; + + if (keycode < 0 || keycode > KEY_MAX) + return -EINVAL; key = toshiba_acpi_get_entry_by_scancode(scancode); if (key && key->type == KE_KEY) { @@ -924,7 +927,6 @@ static int __init toshiba_acpi_init(void) u32 hci_result; bool bt_present; int ret = 0; - struct backlight_properties props; if (acpi_disabled) return -ENODEV; @@ -975,12 +977,10 @@ static int __init toshiba_acpi_init(void) } } - props.max_brightness = HCI_LCD_BRIGHTNESS_LEVELS - 1; toshiba_backlight_device = backlight_device_register("toshiba", - &toshiba_acpi.p_dev->dev, - NULL, - &toshiba_backlight_data, - &props); + &toshiba_acpi.p_dev->dev, + NULL, + &toshiba_backlight_data); if (IS_ERR(toshiba_backlight_device)) { ret = PTR_ERR(toshiba_backlight_device); @@ -989,6 +989,7 @@ static int __init toshiba_acpi_init(void) toshiba_acpi_exit(); return ret; } + toshiba_backlight_device->props.max_brightness = HCI_LCD_BRIGHTNESS_LEVELS - 1; /* Register rfkill switch for Bluetooth */ if (hci_get_bt_present(&bt_present) == HCI_SUCCESS && bt_present) { diff --git a/trunk/drivers/pnp/base.h b/trunk/drivers/pnp/base.h index 0bab84ebb15d..0b8d14050efa 100644 --- a/trunk/drivers/pnp/base.h +++ b/trunk/drivers/pnp/base.h @@ -166,9 +166,6 @@ struct pnp_resource *pnp_add_io_resource(struct pnp_dev *dev, struct pnp_resource *pnp_add_mem_resource(struct pnp_dev *dev, resource_size_t start, resource_size_t end, int flags); -struct pnp_resource *pnp_add_bus_resource(struct pnp_dev *dev, - resource_size_t start, - resource_size_t end); extern int pnp_debug; diff --git a/trunk/drivers/pnp/interface.c b/trunk/drivers/pnp/interface.c index cfaf5b73540b..68b0c04987e4 100644 --- a/trunk/drivers/pnp/interface.c +++ b/trunk/drivers/pnp/interface.c @@ -278,12 +278,9 @@ static ssize_t pnp_show_current_resources(struct device *dmdev, switch (pnp_resource_type(res)) { case IORESOURCE_IO: case IORESOURCE_MEM: - case IORESOURCE_BUS: - pnp_printf(buffer, " %#llx-%#llx%s\n", + pnp_printf(buffer, " %#llx-%#llx\n", (unsigned long long) res->start, - (unsigned long long) res->end, - res->flags & IORESOURCE_WINDOW ? - " window" : ""); + (unsigned long long) res->end); break; case IORESOURCE_IRQ: case IORESOURCE_DMA: diff --git a/trunk/drivers/pnp/pnpacpi/rsparser.c b/trunk/drivers/pnp/pnpacpi/rsparser.c index 54514aa35b09..5702b2c8691f 100644 --- a/trunk/drivers/pnp/pnpacpi/rsparser.c +++ b/trunk/drivers/pnp/pnpacpi/rsparser.c @@ -177,8 +177,7 @@ static int dma_flags(struct pnp_dev *dev, int type, int bus_master, } static void pnpacpi_parse_allocated_ioresource(struct pnp_dev *dev, u64 start, - u64 len, int io_decode, - int window) + u64 len, int io_decode) { int flags = 0; u64 end = start + len - 1; @@ -187,8 +186,6 @@ static void pnpacpi_parse_allocated_ioresource(struct pnp_dev *dev, u64 start, flags |= IORESOURCE_IO_16BIT_ADDR; if (len == 0 || end >= 0x10003) flags |= IORESOURCE_DISABLED; - if (window) - flags |= IORESOURCE_WINDOW; pnp_add_io_resource(dev, start, end, flags); } @@ -250,7 +247,7 @@ static void pnpacpi_parse_allocated_vendor(struct pnp_dev *dev, static void pnpacpi_parse_allocated_memresource(struct pnp_dev *dev, u64 start, u64 len, - int write_protect, int window) + int write_protect) { int flags = 0; u64 end = start + len - 1; @@ -259,26 +256,15 @@ static void pnpacpi_parse_allocated_memresource(struct pnp_dev *dev, flags |= IORESOURCE_DISABLED; if (write_protect == ACPI_READ_WRITE_MEMORY) flags |= IORESOURCE_MEM_WRITEABLE; - if (window) - flags |= IORESOURCE_WINDOW; pnp_add_mem_resource(dev, start, end, flags); } -static void pnpacpi_parse_allocated_busresource(struct pnp_dev *dev, - u64 start, u64 len) -{ - u64 end = start + len - 1; - - pnp_add_bus_resource(dev, start, end); -} - static void pnpacpi_parse_allocated_address_space(struct pnp_dev *dev, struct acpi_resource *res) { struct acpi_resource_address64 addr, *p = &addr; acpi_status status; - int window; status = acpi_resource_to_address64(res, p); if (!ACPI_SUCCESS(status)) { @@ -287,42 +273,37 @@ static void pnpacpi_parse_allocated_address_space(struct pnp_dev *dev, return; } - window = (p->producer_consumer == ACPI_PRODUCER) ? 1 : 0; + if (p->producer_consumer == ACPI_PRODUCER) + return; if (p->resource_type == ACPI_MEMORY_RANGE) pnpacpi_parse_allocated_memresource(dev, p->minimum, p->address_length, - p->info.mem.write_protect, window); + p->info.mem.write_protect); else if (p->resource_type == ACPI_IO_RANGE) pnpacpi_parse_allocated_ioresource(dev, p->minimum, p->address_length, p->granularity == 0xfff ? ACPI_DECODE_10 : - ACPI_DECODE_16, window); - else if (p->resource_type == ACPI_BUS_NUMBER_RANGE) - pnpacpi_parse_allocated_busresource(dev, p->minimum, - p->address_length); + ACPI_DECODE_16); } static void pnpacpi_parse_allocated_ext_address_space(struct pnp_dev *dev, struct acpi_resource *res) { struct acpi_resource_extended_address64 *p = &res->data.ext_address64; - int window; - window = (p->producer_consumer == ACPI_PRODUCER) ? 1 : 0; + if (p->producer_consumer == ACPI_PRODUCER) + return; if (p->resource_type == ACPI_MEMORY_RANGE) pnpacpi_parse_allocated_memresource(dev, p->minimum, p->address_length, - p->info.mem.write_protect, window); + p->info.mem.write_protect); else if (p->resource_type == ACPI_IO_RANGE) pnpacpi_parse_allocated_ioresource(dev, p->minimum, p->address_length, p->granularity == 0xfff ? ACPI_DECODE_10 : - ACPI_DECODE_16, window); - else if (p->resource_type == ACPI_BUS_NUMBER_RANGE) - pnpacpi_parse_allocated_busresource(dev, p->minimum, - p->address_length); + ACPI_DECODE_16); } static acpi_status pnpacpi_allocated_resource(struct acpi_resource *res, @@ -387,7 +368,7 @@ static acpi_status pnpacpi_allocated_resource(struct acpi_resource *res, pnpacpi_parse_allocated_ioresource(dev, io->minimum, io->address_length, - io->io_decode, 0); + io->io_decode); break; case ACPI_RESOURCE_TYPE_START_DEPENDENT: @@ -399,7 +380,7 @@ static acpi_status pnpacpi_allocated_resource(struct acpi_resource *res, pnpacpi_parse_allocated_ioresource(dev, fixed_io->address, fixed_io->address_length, - ACPI_DECODE_10, 0); + ACPI_DECODE_10); break; case ACPI_RESOURCE_TYPE_VENDOR: @@ -415,21 +396,21 @@ static acpi_status pnpacpi_allocated_resource(struct acpi_resource *res, pnpacpi_parse_allocated_memresource(dev, memory24->minimum, memory24->address_length, - memory24->write_protect, 0); + memory24->write_protect); break; case ACPI_RESOURCE_TYPE_MEMORY32: memory32 = &res->data.memory32; pnpacpi_parse_allocated_memresource(dev, memory32->minimum, memory32->address_length, - memory32->write_protect, 0); + memory32->write_protect); break; case ACPI_RESOURCE_TYPE_FIXED_MEMORY32: fixed_memory32 = &res->data.fixed_memory32; pnpacpi_parse_allocated_memresource(dev, fixed_memory32->address, fixed_memory32->address_length, - fixed_memory32->write_protect, 0); + fixed_memory32->write_protect); break; case ACPI_RESOURCE_TYPE_ADDRESS16: case ACPI_RESOURCE_TYPE_ADDRESS32: diff --git a/trunk/drivers/pnp/resource.c b/trunk/drivers/pnp/resource.c index 5b277dbaacde..64d0596bafb5 100644 --- a/trunk/drivers/pnp/resource.c +++ b/trunk/drivers/pnp/resource.c @@ -470,8 +470,7 @@ int pnp_check_dma(struct pnp_dev *dev, struct resource *res) unsigned long pnp_resource_type(struct resource *res) { return res->flags & (IORESOURCE_IO | IORESOURCE_MEM | - IORESOURCE_IRQ | IORESOURCE_DMA | - IORESOURCE_BUS); + IORESOURCE_IRQ | IORESOURCE_DMA); } struct resource *pnp_get_resource(struct pnp_dev *dev, @@ -591,30 +590,6 @@ struct pnp_resource *pnp_add_mem_resource(struct pnp_dev *dev, return pnp_res; } -struct pnp_resource *pnp_add_bus_resource(struct pnp_dev *dev, - resource_size_t start, - resource_size_t end) -{ - struct pnp_resource *pnp_res; - struct resource *res; - - pnp_res = pnp_new_resource(dev); - if (!pnp_res) { - dev_err(&dev->dev, "can't add resource for BUS %#llx-%#llx\n", - (unsigned long long) start, - (unsigned long long) end); - return NULL; - } - - res = &pnp_res->res; - res->flags = IORESOURCE_BUS; - res->start = start; - res->end = end; - - pnp_dbg(&dev->dev, " add %pr\n", res); - return pnp_res; -} - /* * Determine whether the specified resource is a possible configuration * for this device. diff --git a/trunk/drivers/pnp/support.c b/trunk/drivers/pnp/support.c index f5beb24d036a..9585c1c1cc36 100644 --- a/trunk/drivers/pnp/support.c +++ b/trunk/drivers/pnp/support.c @@ -69,10 +69,8 @@ char *pnp_resource_type_name(struct resource *res) return "irq"; case IORESOURCE_DMA: return "dma"; - case IORESOURCE_BUS: - return "bus"; } - return "unknown"; + return NULL; } void dbg_pnp_show_resources(struct pnp_dev *dev, char *desc) diff --git a/trunk/drivers/power/power_supply_sysfs.c b/trunk/drivers/power/power_supply_sysfs.c index ff05e6189768..c790e0c77d4b 100644 --- a/trunk/drivers/power/power_supply_sysfs.c +++ b/trunk/drivers/power/power_supply_sysfs.c @@ -99,7 +99,6 @@ static struct device_attribute power_supply_attrs[] = { POWER_SUPPLY_ATTR(present), POWER_SUPPLY_ATTR(online), POWER_SUPPLY_ATTR(technology), - POWER_SUPPLY_ATTR(cycle_count), POWER_SUPPLY_ATTR(voltage_max), POWER_SUPPLY_ATTR(voltage_min), POWER_SUPPLY_ATTR(voltage_max_design), diff --git a/trunk/drivers/rtc/rtc-ds1742.c b/trunk/drivers/rtc/rtc-ds1742.c index cad9ceb89baf..a1273360a44e 100644 --- a/trunk/drivers/rtc/rtc-ds1742.c +++ b/trunk/drivers/rtc/rtc-ds1742.c @@ -184,7 +184,6 @@ static int __devinit ds1742_rtc_probe(struct platform_device *pdev) pdata->size_nvram = pdata->size - RTC_SIZE; pdata->ioaddr_rtc = ioaddr + pdata->size_nvram; - sysfs_bin_attr_init(&pdata->nvram_attr); pdata->nvram_attr.attr.name = "nvram"; pdata->nvram_attr.attr.mode = S_IRUGO | S_IWUSR; pdata->nvram_attr.read = ds1742_nvram_read; diff --git a/trunk/drivers/s390/char/sclp_cmd.c b/trunk/drivers/s390/char/sclp_cmd.c index fc7ae05ce48a..b3beab610da4 100644 --- a/trunk/drivers/s390/char/sclp_cmd.c +++ b/trunk/drivers/s390/char/sclp_cmd.c @@ -704,13 +704,6 @@ int sclp_chp_deconfigure(struct chp_id chpid) return do_chp_configure(SCLP_CMDW_DECONFIGURE_CHPATH | chpid.id << 8); } -int arch_get_memory_phys_device(unsigned long start_pfn) -{ - if (!rzm) - return 0; - return PFN_PHYS(start_pfn) / rzm; -} - struct chp_info_sccb { struct sccb_header header; u8 recognized[SCLP_CHP_INFO_MASK_SIZE]; diff --git a/trunk/drivers/s390/net/qeth_core.h b/trunk/drivers/s390/net/qeth_core.h index fcd005aad989..a3ac4456e0b1 100644 --- a/trunk/drivers/s390/net/qeth_core.h +++ b/trunk/drivers/s390/net/qeth_core.h @@ -763,8 +763,7 @@ static inline int qeth_get_micros(void) static inline int qeth_get_ip_version(struct sk_buff *skb) { - struct ethhdr *ehdr = (struct ethhdr *)skb->data; - switch (ehdr->h_proto) { + switch (skb->protocol) { case ETH_P_IPV6: return 6; case ETH_P_IP: diff --git a/trunk/drivers/s390/net/qeth_core_main.c b/trunk/drivers/s390/net/qeth_core_main.c index 3bd4206f3470..7d25bdd443cd 100644 --- a/trunk/drivers/s390/net/qeth_core_main.c +++ b/trunk/drivers/s390/net/qeth_core_main.c @@ -537,8 +537,7 @@ static void qeth_send_control_data_cb(struct qeth_channel *channel, dev_err(&card->gdev->dev, "The qeth device is not configured " "for the OSI layer required by z/VM\n"); - else - qeth_schedule_recovery(card); + qeth_schedule_recovery(card); goto out; } @@ -1114,6 +1113,8 @@ static int qeth_setup_card(struct qeth_card *card) card->ipato.enabled = 0; card->ipato.invert4 = 0; card->ipato.invert6 = 0; + if (card->info.type == QETH_CARD_TYPE_IQD) + card->options.checksum_type = NO_CHECKSUMMING; /* init QDIO stuff */ qeth_init_qdio_info(card); return 0; diff --git a/trunk/drivers/s390/net/qeth_core_sys.c b/trunk/drivers/s390/net/qeth_core_sys.c index 25dfd5abd19b..88ae4357136a 100644 --- a/trunk/drivers/s390/net/qeth_core_sys.c +++ b/trunk/drivers/s390/net/qeth_core_sys.c @@ -8,9 +8,6 @@ * Frank Blaschka */ -#define KMSG_COMPONENT "qeth" -#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt - #include #include #include diff --git a/trunk/drivers/s390/net/qeth_l2_main.c b/trunk/drivers/s390/net/qeth_l2_main.c index 6f1e3036bafd..51fde6f2e0b8 100644 --- a/trunk/drivers/s390/net/qeth_l2_main.c +++ b/trunk/drivers/s390/net/qeth_l2_main.c @@ -1071,9 +1071,11 @@ static int qeth_l2_recover(void *ptr) dev_info(&card->gdev->dev, "Device successfully recovered!\n"); else { - rtnl_lock(); - dev_close(card->dev); - rtnl_unlock(); + if (card->dev) { + rtnl_lock(); + dev_close(card->dev); + rtnl_unlock(); + } dev_warn(&card->gdev->dev, "The qeth device driver " "failed to recover an error on the device\n"); } @@ -1127,9 +1129,11 @@ static int qeth_l2_pm_resume(struct ccwgroup_device *gdev) if (card->state == CARD_STATE_RECOVER) { rc = __qeth_l2_set_online(card->gdev, 1); if (rc) { - rtnl_lock(); - dev_close(card->dev); - rtnl_unlock(); + if (card->dev) { + rtnl_lock(); + dev_close(card->dev); + rtnl_unlock(); + } } } else rc = __qeth_l2_set_online(card->gdev, 0); diff --git a/trunk/drivers/s390/net/qeth_l3_main.c b/trunk/drivers/s390/net/qeth_l3_main.c index b3b6e872d806..5475834ab916 100644 --- a/trunk/drivers/s390/net/qeth_l3_main.c +++ b/trunk/drivers/s390/net/qeth_l3_main.c @@ -1691,43 +1691,39 @@ qeth_diags_trace_cb(struct qeth_card *card, struct qeth_reply *reply, cmd = (struct qeth_ipa_cmd *)data; rc = cmd->hdr.return_code; - if (rc) + if (rc) { QETH_DBF_TEXT_(TRACE, 2, "dxter%x", rc); + if (cmd->data.diagass.action == QETH_DIAGS_CMD_TRACE_ENABLE) { + switch (rc) { + case IPA_RC_HARDWARE_AUTH_ERROR: + dev_warn(&card->gdev->dev, "The device is not " + "authorized to run as a HiperSockets " + "network traffic analyzer\n"); + break; + case IPA_RC_TRACE_ALREADY_ACTIVE: + dev_warn(&card->gdev->dev, "A HiperSockets " + "network traffic analyzer is already " + "active in the HiperSockets LAN\n"); + break; + default: + break; + } + } + return 0; + } + switch (cmd->data.diagass.action) { case QETH_DIAGS_CMD_TRACE_QUERY: break; case QETH_DIAGS_CMD_TRACE_DISABLE: - switch (rc) { - case 0: - case IPA_RC_INVALID_SUBCMD: - card->info.promisc_mode = SET_PROMISC_MODE_OFF; - dev_info(&card->gdev->dev, "The HiperSockets network " - "traffic analyzer is deactivated\n"); - break; - default: - break; - } + card->info.promisc_mode = SET_PROMISC_MODE_OFF; + dev_info(&card->gdev->dev, "The HiperSockets network traffic " + "analyzer is deactivated\n"); break; case QETH_DIAGS_CMD_TRACE_ENABLE: - switch (rc) { - case 0: - card->info.promisc_mode = SET_PROMISC_MODE_ON; - dev_info(&card->gdev->dev, "The HiperSockets network " - "traffic analyzer is activated\n"); - break; - case IPA_RC_HARDWARE_AUTH_ERROR: - dev_warn(&card->gdev->dev, "The device is not " - "authorized to run as a HiperSockets network " - "traffic analyzer\n"); - break; - case IPA_RC_TRACE_ALREADY_ACTIVE: - dev_warn(&card->gdev->dev, "A HiperSockets " - "network traffic analyzer is already " - "active in the HiperSockets LAN\n"); - break; - default: - break; - } + card->info.promisc_mode = SET_PROMISC_MODE_ON; + dev_info(&card->gdev->dev, "The HiperSockets network traffic " + "analyzer is activated\n"); break; default: QETH_DBF_MESSAGE(2, "Unknown sniffer action (0x%04x) on %s\n", @@ -2219,9 +2215,11 @@ static int qeth_l3_stop_card(struct qeth_card *card, int recovery_mode) if (recovery_mode) qeth_l3_stop(card->dev); else { - rtnl_lock(); - dev_close(card->dev); - rtnl_unlock(); + if (card->dev) { + rtnl_lock(); + dev_close(card->dev); + rtnl_unlock(); + } } if (!card->use_hard_stop) { rc = qeth_send_stoplan(card); @@ -2902,8 +2900,10 @@ static int qeth_l3_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) int data_offset = -1; int nr_frags; - if (((card->info.type == QETH_CARD_TYPE_IQD) && (!ipv)) || - card->options.sniffer) + if ((card->info.type == QETH_CARD_TYPE_IQD) && + (((skb->protocol != htons(ETH_P_IPV6)) && + (skb->protocol != htons(ETH_P_IP))) || + card->options.sniffer)) goto tx_drop; if ((card->state != CARD_STATE_UP) || !card->lan_online) { @@ -2949,14 +2949,14 @@ static int qeth_l3_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) if (data_offset < 0) skb_pull(new_skb, ETH_HLEN); } else { - if (ipv == 4) { + if (new_skb->protocol == htons(ETH_P_IP)) { if (card->dev->type == ARPHRD_IEEE802_TR) skb_pull(new_skb, TR_HLEN); else skb_pull(new_skb, ETH_HLEN); } - if (ipv == 6 && card->vlangrp && + if (new_skb->protocol == ETH_P_IPV6 && card->vlangrp && vlan_tx_tag_present(new_skb)) { skb_push(new_skb, VLAN_HLEN); skb_copy_to_linear_data(new_skb, new_skb->data + 4, 4); @@ -3534,9 +3534,11 @@ static int qeth_l3_pm_resume(struct ccwgroup_device *gdev) if (card->state == CARD_STATE_RECOVER) { rc = __qeth_l3_set_online(card->gdev, 1); if (rc) { - rtnl_lock(); - dev_close(card->dev); - rtnl_unlock(); + if (card->dev) { + rtnl_lock(); + dev_close(card->dev); + rtnl_unlock(); + } } } else rc = __qeth_l3_set_online(card->gdev, 0); diff --git a/trunk/drivers/scsi/Kconfig b/trunk/drivers/scsi/Kconfig index 75f2336807cb..9191d1ea6451 100644 --- a/trunk/drivers/scsi/Kconfig +++ b/trunk/drivers/scsi/Kconfig @@ -1,15 +1,9 @@ menu "SCSI device support" -config SCSI_MOD - tristate - default y if SCSI=n || SCSI=y - default m if SCSI=m - config RAID_ATTRS tristate "RAID Transport Class" default n depends on BLOCK - depends on SCSI_MOD ---help--- Provides RAID diff --git a/trunk/drivers/scsi/be2iscsi/be_cmds.c b/trunk/drivers/scsi/be2iscsi/be_cmds.c index cda6642c7368..67098578fba4 100644 --- a/trunk/drivers/scsi/be2iscsi/be_cmds.c +++ b/trunk/drivers/scsi/be2iscsi/be_cmds.c @@ -32,11 +32,18 @@ void be_mcc_notify(struct beiscsi_hba *phba) unsigned int alloc_mcc_tag(struct beiscsi_hba *phba) { unsigned int tag = 0; + unsigned int num = 0; +mcc_tag_rdy: if (phba->ctrl.mcc_tag_available) { tag = phba->ctrl.mcc_tag[phba->ctrl.mcc_alloc_index]; phba->ctrl.mcc_tag[phba->ctrl.mcc_alloc_index] = 0; phba->ctrl.mcc_numtag[tag] = 0; + } else { + udelay(100); + num++; + if (num < mcc_timeout) + goto mcc_tag_rdy; } if (tag) { phba->ctrl.mcc_tag_available--; diff --git a/trunk/drivers/scsi/be2iscsi/be_iscsi.c b/trunk/drivers/scsi/be2iscsi/be_iscsi.c index c3928cb8b042..29a3aaf35f9f 100644 --- a/trunk/drivers/scsi/be2iscsi/be_iscsi.c +++ b/trunk/drivers/scsi/be2iscsi/be_iscsi.c @@ -482,7 +482,7 @@ static int beiscsi_open_conn(struct iscsi_endpoint *ep, tag = mgmt_open_connection(phba, dst_addr, beiscsi_ep); if (!tag) { SE_DEBUG(DBG_LVL_1, - "mgmt_open_connection Failed for cid=%d \n", + "mgmt_invalidate_connection Failed for cid=%d \n", beiscsi_ep->ep_cid); } else { wait_event_interruptible(phba->ctrl.mcc_wait[tag], @@ -701,7 +701,7 @@ void beiscsi_conn_stop(struct iscsi_cls_conn *cls_conn, int flag) if (!tag) { SE_DEBUG(DBG_LVL_1, "mgmt_invalidate_connection Failed for cid=%d \n", - beiscsi_ep->ep_cid); + beiscsi_ep->ep_cid); } else { wait_event_interruptible(phba->ctrl.mcc_wait[tag], phba->ctrl.mcc_numtag[tag]); diff --git a/trunk/drivers/scsi/be2iscsi/be_main.c b/trunk/drivers/scsi/be2iscsi/be_main.c index fcfb29e02d8a..7c22616ab141 100644 --- a/trunk/drivers/scsi/be2iscsi/be_main.c +++ b/trunk/drivers/scsi/be2iscsi/be_main.c @@ -58,123 +58,6 @@ static int beiscsi_slave_configure(struct scsi_device *sdev) return 0; } -static int beiscsi_eh_abort(struct scsi_cmnd *sc) -{ - struct iscsi_cls_session *cls_session; - struct iscsi_task *aborted_task = (struct iscsi_task *)sc->SCp.ptr; - struct beiscsi_io_task *aborted_io_task; - struct iscsi_conn *conn; - struct beiscsi_conn *beiscsi_conn; - struct beiscsi_hba *phba; - struct iscsi_session *session; - struct invalidate_command_table *inv_tbl; - unsigned int cid, tag, num_invalidate; - - cls_session = starget_to_session(scsi_target(sc->device)); - session = cls_session->dd_data; - - spin_lock_bh(&session->lock); - if (!aborted_task || !aborted_task->sc) { - /* we raced */ - spin_unlock_bh(&session->lock); - return SUCCESS; - } - - aborted_io_task = aborted_task->dd_data; - if (!aborted_io_task->scsi_cmnd) { - /* raced or invalid command */ - spin_unlock_bh(&session->lock); - return SUCCESS; - } - spin_unlock_bh(&session->lock); - conn = aborted_task->conn; - beiscsi_conn = conn->dd_data; - phba = beiscsi_conn->phba; - - /* invalidate iocb */ - cid = beiscsi_conn->beiscsi_conn_cid; - inv_tbl = phba->inv_tbl; - memset(inv_tbl, 0x0, sizeof(*inv_tbl)); - inv_tbl->cid = cid; - inv_tbl->icd = aborted_io_task->psgl_handle->sgl_index; - num_invalidate = 1; - tag = mgmt_invalidate_icds(phba, inv_tbl, num_invalidate, cid); - if (!tag) { - shost_printk(KERN_WARNING, phba->shost, - "mgmt_invalidate_icds could not be" - " submitted\n"); - return FAILED; - } else { - wait_event_interruptible(phba->ctrl.mcc_wait[tag], - phba->ctrl.mcc_numtag[tag]); - free_mcc_tag(&phba->ctrl, tag); - } - - return iscsi_eh_abort(sc); -} - -static int beiscsi_eh_device_reset(struct scsi_cmnd *sc) -{ - struct iscsi_task *abrt_task; - struct beiscsi_io_task *abrt_io_task; - struct iscsi_conn *conn; - struct beiscsi_conn *beiscsi_conn; - struct beiscsi_hba *phba; - struct iscsi_session *session; - struct iscsi_cls_session *cls_session; - struct invalidate_command_table *inv_tbl; - unsigned int cid, tag, i, num_invalidate; - int rc = FAILED; - - /* invalidate iocbs */ - cls_session = starget_to_session(scsi_target(sc->device)); - session = cls_session->dd_data; - spin_lock_bh(&session->lock); - if (!session->leadconn || session->state != ISCSI_STATE_LOGGED_IN) - goto unlock; - - conn = session->leadconn; - beiscsi_conn = conn->dd_data; - phba = beiscsi_conn->phba; - cid = beiscsi_conn->beiscsi_conn_cid; - inv_tbl = phba->inv_tbl; - memset(inv_tbl, 0x0, sizeof(*inv_tbl) * BE2_CMDS_PER_CXN); - num_invalidate = 0; - for (i = 0; i < conn->session->cmds_max; i++) { - abrt_task = conn->session->cmds[i]; - abrt_io_task = abrt_task->dd_data; - if (!abrt_task->sc || abrt_task->state == ISCSI_TASK_FREE) - continue; - - if (abrt_task->sc->device->lun != abrt_task->sc->device->lun) - continue; - - inv_tbl->cid = cid; - inv_tbl->icd = abrt_io_task->psgl_handle->sgl_index; - num_invalidate++; - inv_tbl++; - } - spin_unlock_bh(&session->lock); - inv_tbl = phba->inv_tbl; - - tag = mgmt_invalidate_icds(phba, inv_tbl, num_invalidate, cid); - if (!tag) { - shost_printk(KERN_WARNING, phba->shost, - "mgmt_invalidate_icds could not be" - " submitted\n"); - return FAILED; - } else { - wait_event_interruptible(phba->ctrl.mcc_wait[tag], - phba->ctrl.mcc_numtag[tag]); - free_mcc_tag(&phba->ctrl, tag); - } - - return iscsi_eh_device_reset(sc); -unlock: - spin_unlock_bh(&session->lock); - return rc; -} - /*------------------- PCI Driver operations and data ----------------- */ static DEFINE_PCI_DEVICE_TABLE(beiscsi_pci_id_table) = { { PCI_DEVICE(BE_VENDOR_ID, BE_DEVICE_ID1) }, @@ -191,12 +74,12 @@ static struct scsi_host_template beiscsi_sht = { .name = "ServerEngines 10Gbe open-iscsi Initiator Driver", .proc_name = DRV_NAME, .queuecommand = iscsi_queuecommand, + .eh_abort_handler = iscsi_eh_abort, .change_queue_depth = iscsi_change_queue_depth, .slave_configure = beiscsi_slave_configure, .target_alloc = iscsi_target_alloc, - .eh_abort_handler = beiscsi_eh_abort, - .eh_device_reset_handler = beiscsi_eh_device_reset, - .eh_target_reset_handler = iscsi_eh_session_reset, + .eh_device_reset_handler = iscsi_eh_device_reset, + .eh_target_reset_handler = iscsi_eh_target_reset, .sg_tablesize = BEISCSI_SGLIST_ELEMENTS, .can_queue = BE2_IO_DEPTH, .this_id = -1, @@ -359,7 +242,7 @@ static void beiscsi_get_params(struct beiscsi_hba *phba) + BE2_TMFS + BE2_NOPOUT_REQ)); phba->params.cxns_per_ctrl = phba->fw_config.iscsi_cid_count; - phba->params.asyncpdus_per_ctrl = phba->fw_config.iscsi_cid_count * 2; + phba->params.asyncpdus_per_ctrl = phba->fw_config.iscsi_cid_count;; phba->params.icds_per_ctrl = phba->fw_config.iscsi_icd_count;; phba->params.num_sge_per_io = BE2_SGE; phba->params.defpdu_hdr_sz = BE2_DEFPDU_HDR_SZ; @@ -1063,18 +946,14 @@ static void hwi_complete_cmd(struct beiscsi_conn *beiscsi_conn, case HWH_TYPE_IO: case HWH_TYPE_IO_RD: if ((task->hdr->opcode & ISCSI_OPCODE_MASK) == - ISCSI_OP_NOOP_OUT) + ISCSI_OP_NOOP_OUT) { be_complete_nopin_resp(beiscsi_conn, task, psol); - else + } else be_complete_io(beiscsi_conn, task, psol); break; case HWH_TYPE_LOGOUT: - if ((task->hdr->opcode & ISCSI_OPCODE_MASK) == ISCSI_OP_LOGOUT) - be_complete_logout(beiscsi_conn, task, psol); - else - be_complete_tmf(beiscsi_conn, task, psol); - + be_complete_logout(beiscsi_conn, task, psol); break; case HWH_TYPE_LOGIN: @@ -1083,6 +962,10 @@ static void hwi_complete_cmd(struct beiscsi_conn *beiscsi_conn, "- Solicited path \n"); break; + case HWH_TYPE_TMF: + be_complete_tmf(beiscsi_conn, task, psol); + break; + case HWH_TYPE_NOP: be_complete_nopin_resp(beiscsi_conn, task, psol); break; @@ -2169,7 +2052,7 @@ static void beiscsi_init_wrb_handle(struct beiscsi_hba *phba) num_cxn_wrb = (mem_descr_wrb->mem_array[idx].size) / ((sizeof(struct iscsi_wrb) * phba->params.wrbs_per_cxn)); - for (index = 0; index < phba->params.cxns_per_ctrl * 2; index += 2) { + for (index = 0; index < phba->params.cxns_per_ctrl; index += 2) { pwrb_context = &phwi_ctrlr->wrb_context[index]; if (num_cxn_wrb) { for (j = 0; j < phba->params.wrbs_per_cxn; j++) { @@ -3190,18 +3073,14 @@ static unsigned char hwi_enable_intr(struct beiscsi_hba *phba) reg |= MEMBAR_CTRL_INT_CTRL_HOSTINTR_MASK; SE_DEBUG(DBG_LVL_8, "reg =x%08x addr=%p \n", reg, addr); iowrite32(reg, addr); - if (!phba->msix_enabled) { - eq = &phwi_context->be_eq[0].q; + for (i = 0; i <= phba->num_cpus; i++) { + eq = &phwi_context->be_eq[i].q; SE_DEBUG(DBG_LVL_8, "eq->id=%d \n", eq->id); hwi_ring_eq_db(phba, eq->id, 0, 0, 1, 1); - } else { - for (i = 0; i <= phba->num_cpus; i++) { - eq = &phwi_context->be_eq[i].q; - SE_DEBUG(DBG_LVL_8, "eq->id=%d \n", eq->id); - hwi_ring_eq_db(phba, eq->id, 0, 0, 1, 1); - } } - } + } else + shost_printk(KERN_WARNING, phba->shost, + "In hwi_enable_intr, Not Enabled \n"); return true; } @@ -3597,13 +3476,19 @@ static int beiscsi_iotask(struct iscsi_task *task, struct scatterlist *sg, static int beiscsi_mtask(struct iscsi_task *task) { - struct beiscsi_io_task *io_task = task->dd_data; + struct beiscsi_io_task *aborted_io_task, *io_task = task->dd_data; struct iscsi_conn *conn = task->conn; struct beiscsi_conn *beiscsi_conn = conn->dd_data; struct beiscsi_hba *phba = beiscsi_conn->phba; + struct iscsi_session *session; struct iscsi_wrb *pwrb = NULL; + struct hwi_controller *phwi_ctrlr; + struct hwi_wrb_context *pwrb_context; + struct wrb_handle *pwrb_handle; unsigned int doorbell = 0; - unsigned int cid; + unsigned int i, cid; + struct iscsi_task *aborted_task; + unsigned int tag; cid = beiscsi_conn->beiscsi_conn_cid; pwrb = io_task->pwrb_handle->pwrb; @@ -3614,7 +3499,6 @@ static int beiscsi_mtask(struct iscsi_task *task) io_task->pwrb_handle->wrb_index); AMAP_SET_BITS(struct amap_iscsi_wrb, sgl_icd_idx, pwrb, io_task->psgl_handle->sgl_index); - switch (task->hdr->opcode & ISCSI_OPCODE_MASK) { case ISCSI_OP_LOGIN: AMAP_SET_BITS(struct amap_iscsi_wrb, type, pwrb, @@ -3639,6 +3523,33 @@ static int beiscsi_mtask(struct iscsi_task *task) hwi_write_buffer(pwrb, task); break; case ISCSI_OP_SCSI_TMFUNC: + session = conn->session; + i = ((struct iscsi_tm *)task->hdr)->rtt; + phwi_ctrlr = phba->phwi_ctrlr; + pwrb_context = &phwi_ctrlr->wrb_context[cid - + phba->fw_config.iscsi_cid_start]; + pwrb_handle = pwrb_context->pwrb_handle_basestd[be32_to_cpu(i) + >> 16]; + aborted_task = pwrb_handle->pio_handle; + if (!aborted_task) + return 0; + + aborted_io_task = aborted_task->dd_data; + if (!aborted_io_task->scsi_cmnd) + return 0; + + tag = mgmt_invalidate_icds(phba, + aborted_io_task->psgl_handle->sgl_index, + cid); + if (!tag) { + shost_printk(KERN_WARNING, phba->shost, + "mgmt_invalidate_icds could not be" + " submitted\n"); + } else { + wait_event_interruptible(phba->ctrl.mcc_wait[tag], + phba->ctrl.mcc_numtag[tag]); + free_mcc_tag(&phba->ctrl, tag); + } AMAP_SET_BITS(struct amap_iscsi_wrb, type, pwrb, INI_TMF_CMD); AMAP_SET_BITS(struct amap_iscsi_wrb, dmsg, pwrb, 0); @@ -3647,7 +3558,7 @@ static int beiscsi_mtask(struct iscsi_task *task) case ISCSI_OP_LOGOUT: AMAP_SET_BITS(struct amap_iscsi_wrb, dmsg, pwrb, 0); AMAP_SET_BITS(struct amap_iscsi_wrb, type, pwrb, - HWH_TYPE_LOGOUT); + HWH_TYPE_LOGOUT); hwi_write_buffer(pwrb, task); break; @@ -3673,12 +3584,17 @@ static int beiscsi_mtask(struct iscsi_task *task) static int beiscsi_task_xmit(struct iscsi_task *task) { + struct iscsi_conn *conn = task->conn; struct beiscsi_io_task *io_task = task->dd_data; struct scsi_cmnd *sc = task->sc; + struct beiscsi_conn *beiscsi_conn = conn->dd_data; struct scatterlist *sg; int num_sg; unsigned int writedir = 0, xferlen = 0; + SE_DEBUG(DBG_LVL_4, "\n cid=%d In beiscsi_task_xmit task=%p conn=%p \t" + "beiscsi_conn=%p \n", beiscsi_conn->beiscsi_conn_cid, + task, conn, beiscsi_conn); if (!sc) return beiscsi_mtask(task); @@ -3783,6 +3699,7 @@ static int __devinit beiscsi_dev_probe(struct pci_dev *pcidev, " Failed in beiscsi_hba_alloc \n"); goto disable_pci; } + SE_DEBUG(DBG_LVL_8, " phba = %p \n", phba); switch (pcidev->device) { case BE_DEVICE_ID1: diff --git a/trunk/drivers/scsi/be2iscsi/be_main.h b/trunk/drivers/scsi/be2iscsi/be_main.h index 87ec21280a37..c53a80ab796c 100644 --- a/trunk/drivers/scsi/be2iscsi/be_main.h +++ b/trunk/drivers/scsi/be2iscsi/be_main.h @@ -257,11 +257,6 @@ struct hba_parameters { unsigned int num_sge; }; -struct invalidate_command_table { - unsigned short icd; - unsigned short cid; -} __packed; - struct beiscsi_hba { struct hba_parameters params; struct hwi_controller *phwi_ctrlr; @@ -334,8 +329,6 @@ struct beiscsi_hba { struct work_struct work_cqs; /* The work being queued */ struct be_ctrl_info ctrl; unsigned int generation; - struct invalidate_command_table inv_tbl[128]; - }; struct beiscsi_session { @@ -498,6 +491,8 @@ struct hwi_async_entry { struct list_head data_busy_list; }; +#define BE_MIN_ASYNC_ENTRIES 128 + struct hwi_async_pdu_context { struct { struct be_bus_address pa_base; @@ -538,7 +533,7 @@ struct hwi_async_pdu_context { * This is a varying size list! Do not add anything * after this entry!! */ - struct hwi_async_entry async_entry[BE2_MAX_SESSIONS * 2]; + struct hwi_async_entry async_entry[BE_MIN_ASYNC_ENTRIES]; }; #define PDUCQE_CODE_MASK 0x0000003F diff --git a/trunk/drivers/scsi/be2iscsi/be_mgmt.c b/trunk/drivers/scsi/be2iscsi/be_mgmt.c index 72617b650a7e..317bcd042ced 100644 --- a/trunk/drivers/scsi/be2iscsi/be_mgmt.c +++ b/trunk/drivers/scsi/be2iscsi/be_mgmt.c @@ -145,15 +145,14 @@ unsigned char mgmt_epfw_cleanup(struct beiscsi_hba *phba, unsigned short chute) } unsigned char mgmt_invalidate_icds(struct beiscsi_hba *phba, - struct invalidate_command_table *inv_tbl, - unsigned int num_invalidate, unsigned int cid) + unsigned int icd, unsigned int cid) { struct be_dma_mem nonemb_cmd; struct be_ctrl_info *ctrl = &phba->ctrl; struct be_mcc_wrb *wrb; struct be_sge *sge; struct invalidate_commands_params_in *req; - unsigned int i, tag = 0; + unsigned int tag = 0; spin_lock(&ctrl->mbox_lock); tag = alloc_mcc_tag(phba); @@ -184,12 +183,9 @@ unsigned char mgmt_invalidate_icds(struct beiscsi_hba *phba, sizeof(*req)); req->ref_handle = 0; req->cleanup_type = CMD_ISCSI_COMMAND_INVALIDATE; - for (i = 0; i < num_invalidate; i++) { - req->table[i].icd = inv_tbl->icd; - req->table[i].cid = inv_tbl->cid; - req->icd_count++; - inv_tbl++; - } + req->icd_count = 0; + req->table[req->icd_count].icd = icd; + req->table[req->icd_count].cid = cid; sge->pa_hi = cpu_to_le32(upper_32_bits(nonemb_cmd.dma)); sge->pa_lo = cpu_to_le32(nonemb_cmd.dma & 0xFFFFFFFF); sge->len = cpu_to_le32(nonemb_cmd.size); diff --git a/trunk/drivers/scsi/be2iscsi/be_mgmt.h b/trunk/drivers/scsi/be2iscsi/be_mgmt.h index 3d316b82feb1..ecead6a5aa56 100644 --- a/trunk/drivers/scsi/be2iscsi/be_mgmt.h +++ b/trunk/drivers/scsi/be2iscsi/be_mgmt.h @@ -94,8 +94,7 @@ unsigned char mgmt_upload_connection(struct beiscsi_hba *phba, unsigned short cid, unsigned int upload_flag); unsigned char mgmt_invalidate_icds(struct beiscsi_hba *phba, - struct invalidate_command_table *inv_tbl, - unsigned int num_invalidate, unsigned int cid); + unsigned int icd, unsigned int cid); struct iscsi_invalidate_connection_params_in { struct be_cmd_req_hdr hdr; @@ -117,6 +116,11 @@ union iscsi_invalidate_connection_params { struct iscsi_invalidate_connection_params_out response; } __packed; +struct invalidate_command_table { + unsigned short icd; + unsigned short cid; +} __packed; + struct invalidate_commands_params_in { struct be_cmd_req_hdr hdr; unsigned int ref_handle; diff --git a/trunk/drivers/scsi/bfa/Makefile b/trunk/drivers/scsi/bfa/Makefile index 17e06cae71b2..1d6009490d1c 100644 --- a/trunk/drivers/scsi/bfa/Makefile +++ b/trunk/drivers/scsi/bfa/Makefile @@ -2,14 +2,14 @@ obj-$(CONFIG_SCSI_BFA_FC) := bfa.o bfa-y := bfad.o bfad_intr.o bfad_os.o bfad_im.o bfad_attr.o bfad_fwimg.o -bfa-y += bfa_core.o bfa_ioc.o bfa_ioc_ct.o bfa_ioc_cb.o bfa_iocfc.o bfa_fcxp.o -bfa-y += bfa_lps.o bfa_hw_cb.o bfa_hw_ct.o bfa_intr.o bfa_timer.o bfa_rport.o +bfa-y += bfa_core.o bfa_ioc.o bfa_iocfc.o bfa_fcxp.o bfa_lps.o +bfa-y += bfa_hw_cb.o bfa_hw_ct.o bfa_intr.o bfa_timer.o bfa_rport.o bfa-y += bfa_fcport.o bfa_port.o bfa_uf.o bfa_sgpg.o bfa_module.o bfa_ioim.o bfa-y += bfa_itnim.o bfa_fcpim.o bfa_tskim.o bfa_log.o bfa_log_module.o bfa-y += bfa_csdebug.o bfa_sm.o plog.o -bfa-y += fcbuild.o fabric.o fcpim.o vfapi.o fcptm.o bfa_fcs.o bfa_fcs_port.o +bfa-y += fcbuild.o fabric.o fcpim.o vfapi.o fcptm.o bfa_fcs.o bfa_fcs_port.o bfa-y += bfa_fcs_uf.o bfa_fcs_lport.o fab.o fdmi.o ms.o ns.o scn.o loop.o bfa-y += lport_api.o n2n.o rport.o rport_api.o rport_ftrs.o vport.o -ccflags-y := -I$(obj) -I$(obj)/include -I$(obj)/include/cna -DBFA_PERF_BUILD +ccflags-y := -I$(obj) -I$(obj)/include -I$(obj)/include/cna diff --git a/trunk/drivers/scsi/bfa/bfa_core.c b/trunk/drivers/scsi/bfa/bfa_core.c index 0c08e185a766..44e2d1155c51 100644 --- a/trunk/drivers/scsi/bfa/bfa_core.c +++ b/trunk/drivers/scsi/bfa/bfa_core.c @@ -384,15 +384,6 @@ bfa_debug_fwsave(struct bfa_s *bfa, void *trcdata, int *trclen) return bfa_ioc_debug_fwsave(&bfa->ioc, trcdata, trclen); } -/** - * Clear the saved firmware trace information of an IOC. - */ -void -bfa_debug_fwsave_clear(struct bfa_s *bfa) -{ - bfa_ioc_debug_fwsave_clear(&bfa->ioc); -} - /** * Fetch firmware trace data. * @@ -408,14 +399,4 @@ bfa_debug_fwtrc(struct bfa_s *bfa, void *trcdata, int *trclen) { return bfa_ioc_debug_fwtrc(&bfa->ioc, trcdata, trclen); } - -/** - * Reset hw semaphore & usage cnt regs and initialize. - */ -void -bfa_chip_reset(struct bfa_s *bfa) -{ - bfa_ioc_ownership_reset(&bfa->ioc); - bfa_ioc_pll_init(&bfa->ioc); -} #endif diff --git a/trunk/drivers/scsi/bfa/bfa_fcport.c b/trunk/drivers/scsi/bfa/bfa_fcport.c index c589488db0c1..aef648b55dfc 100644 --- a/trunk/drivers/scsi/bfa/bfa_fcport.c +++ b/trunk/drivers/scsi/bfa/bfa_fcport.c @@ -23,33 +23,40 @@ #include #include -BFA_TRC_FILE(HAL, FCPORT); -BFA_MODULE(fcport); +BFA_TRC_FILE(HAL, PPORT); +BFA_MODULE(pport); + +#define bfa_pport_callback(__pport, __event) do { \ + if ((__pport)->bfa->fcs) { \ + (__pport)->event_cbfn((__pport)->event_cbarg, (__event)); \ + } else { \ + (__pport)->hcb_event = (__event); \ + bfa_cb_queue((__pport)->bfa, &(__pport)->hcb_qe, \ + __bfa_cb_port_event, (__pport)); \ + } \ +} while (0) /* * The port is considered disabled if corresponding physical port or IOC are * disabled explicitly */ #define BFA_PORT_IS_DISABLED(bfa) \ - ((bfa_fcport_is_disabled(bfa) == BFA_TRUE) || \ + ((bfa_pport_is_disabled(bfa) == BFA_TRUE) || \ (bfa_ioc_is_disabled(&bfa->ioc) == BFA_TRUE)) /* * forward declarations */ -static bfa_boolean_t bfa_fcport_send_enable(struct bfa_fcport_s *fcport); -static bfa_boolean_t bfa_fcport_send_disable(struct bfa_fcport_s *fcport); -static void bfa_fcport_update_linkinfo(struct bfa_fcport_s *fcport); -static void bfa_fcport_reset_linkinfo(struct bfa_fcport_s *fcport); -static void bfa_fcport_set_wwns(struct bfa_fcport_s *fcport); -static void __bfa_cb_fcport_event(void *cbarg, bfa_boolean_t complete); -static void bfa_fcport_callback(struct bfa_fcport_s *fcport, - enum bfa_pport_linkstate event); -static void bfa_fcport_queue_cb(struct bfa_fcport_ln_s *ln, - enum bfa_pport_linkstate event); -static void __bfa_cb_fcport_stats_clr(void *cbarg, bfa_boolean_t complete); -static void bfa_fcport_stats_get_timeout(void *cbarg); -static void bfa_fcport_stats_clr_timeout(void *cbarg); +static bfa_boolean_t bfa_pport_send_enable(struct bfa_pport_s *port); +static bfa_boolean_t bfa_pport_send_disable(struct bfa_pport_s *port); +static void bfa_pport_update_linkinfo(struct bfa_pport_s *pport); +static void bfa_pport_reset_linkinfo(struct bfa_pport_s *pport); +static void bfa_pport_set_wwns(struct bfa_pport_s *port); +static void __bfa_cb_port_event(void *cbarg, bfa_boolean_t complete); +static void __bfa_cb_port_stats(void *cbarg, bfa_boolean_t complete); +static void __bfa_cb_port_stats_clr(void *cbarg, bfa_boolean_t complete); +static void bfa_port_stats_timeout(void *cbarg); +static void bfa_port_stats_clr_timeout(void *cbarg); /** * bfa_pport_private @@ -58,114 +65,111 @@ static void bfa_fcport_stats_clr_timeout(void *cbarg); /** * BFA port state machine events */ -enum bfa_fcport_sm_event { - BFA_FCPORT_SM_START = 1, /* start port state machine */ - BFA_FCPORT_SM_STOP = 2, /* stop port state machine */ - BFA_FCPORT_SM_ENABLE = 3, /* enable port */ - BFA_FCPORT_SM_DISABLE = 4, /* disable port state machine */ - BFA_FCPORT_SM_FWRSP = 5, /* firmware enable/disable rsp */ - BFA_FCPORT_SM_LINKUP = 6, /* firmware linkup event */ - BFA_FCPORT_SM_LINKDOWN = 7, /* firmware linkup down */ - BFA_FCPORT_SM_QRESUME = 8, /* CQ space available */ - BFA_FCPORT_SM_HWFAIL = 9, /* IOC h/w failure */ +enum bfa_pport_sm_event { + BFA_PPORT_SM_START = 1, /* start port state machine */ + BFA_PPORT_SM_STOP = 2, /* stop port state machine */ + BFA_PPORT_SM_ENABLE = 3, /* enable port */ + BFA_PPORT_SM_DISABLE = 4, /* disable port state machine */ + BFA_PPORT_SM_FWRSP = 5, /* firmware enable/disable rsp */ + BFA_PPORT_SM_LINKUP = 6, /* firmware linkup event */ + BFA_PPORT_SM_LINKDOWN = 7, /* firmware linkup down */ + BFA_PPORT_SM_QRESUME = 8, /* CQ space available */ + BFA_PPORT_SM_HWFAIL = 9, /* IOC h/w failure */ }; -/** - * BFA port link notification state machine events - */ - -enum bfa_fcport_ln_sm_event { - BFA_FCPORT_LN_SM_LINKUP = 1, /* linkup event */ - BFA_FCPORT_LN_SM_LINKDOWN = 2, /* linkdown event */ - BFA_FCPORT_LN_SM_NOTIFICATION = 3 /* done notification */ -}; - -static void bfa_fcport_sm_uninit(struct bfa_fcport_s *fcport, - enum bfa_fcport_sm_event event); -static void bfa_fcport_sm_enabling_qwait(struct bfa_fcport_s *fcport, - enum bfa_fcport_sm_event event); -static void bfa_fcport_sm_enabling(struct bfa_fcport_s *fcport, - enum bfa_fcport_sm_event event); -static void bfa_fcport_sm_linkdown(struct bfa_fcport_s *fcport, - enum bfa_fcport_sm_event event); -static void bfa_fcport_sm_linkup(struct bfa_fcport_s *fcport, - enum bfa_fcport_sm_event event); -static void bfa_fcport_sm_disabling(struct bfa_fcport_s *fcport, - enum bfa_fcport_sm_event event); -static void bfa_fcport_sm_disabling_qwait(struct bfa_fcport_s *fcport, - enum bfa_fcport_sm_event event); -static void bfa_fcport_sm_disabled(struct bfa_fcport_s *fcport, - enum bfa_fcport_sm_event event); -static void bfa_fcport_sm_stopped(struct bfa_fcport_s *fcport, - enum bfa_fcport_sm_event event); -static void bfa_fcport_sm_iocdown(struct bfa_fcport_s *fcport, - enum bfa_fcport_sm_event event); -static void bfa_fcport_sm_iocfail(struct bfa_fcport_s *fcport, - enum bfa_fcport_sm_event event); - -static void bfa_fcport_ln_sm_dn(struct bfa_fcport_ln_s *ln, - enum bfa_fcport_ln_sm_event event); -static void bfa_fcport_ln_sm_dn_nf(struct bfa_fcport_ln_s *ln, - enum bfa_fcport_ln_sm_event event); -static void bfa_fcport_ln_sm_dn_up_nf(struct bfa_fcport_ln_s *ln, - enum bfa_fcport_ln_sm_event event); -static void bfa_fcport_ln_sm_up(struct bfa_fcport_ln_s *ln, - enum bfa_fcport_ln_sm_event event); -static void bfa_fcport_ln_sm_up_nf(struct bfa_fcport_ln_s *ln, - enum bfa_fcport_ln_sm_event event); -static void bfa_fcport_ln_sm_up_dn_nf(struct bfa_fcport_ln_s *ln, - enum bfa_fcport_ln_sm_event event); -static void bfa_fcport_ln_sm_up_dn_up_nf(struct bfa_fcport_ln_s *ln, - enum bfa_fcport_ln_sm_event event); +static void bfa_pport_sm_uninit(struct bfa_pport_s *pport, + enum bfa_pport_sm_event event); +static void bfa_pport_sm_enabling_qwait(struct bfa_pport_s *pport, + enum bfa_pport_sm_event event); +static void bfa_pport_sm_enabling(struct bfa_pport_s *pport, + enum bfa_pport_sm_event event); +static void bfa_pport_sm_linkdown(struct bfa_pport_s *pport, + enum bfa_pport_sm_event event); +static void bfa_pport_sm_linkup(struct bfa_pport_s *pport, + enum bfa_pport_sm_event event); +static void bfa_pport_sm_disabling(struct bfa_pport_s *pport, + enum bfa_pport_sm_event event); +static void bfa_pport_sm_disabling_qwait(struct bfa_pport_s *pport, + enum bfa_pport_sm_event event); +static void bfa_pport_sm_disabled(struct bfa_pport_s *pport, + enum bfa_pport_sm_event event); +static void bfa_pport_sm_stopped(struct bfa_pport_s *pport, + enum bfa_pport_sm_event event); +static void bfa_pport_sm_iocdown(struct bfa_pport_s *pport, + enum bfa_pport_sm_event event); +static void bfa_pport_sm_iocfail(struct bfa_pport_s *pport, + enum bfa_pport_sm_event event); static struct bfa_sm_table_s hal_pport_sm_table[] = { - {BFA_SM(bfa_fcport_sm_uninit), BFA_PPORT_ST_UNINIT}, - {BFA_SM(bfa_fcport_sm_enabling_qwait), BFA_PPORT_ST_ENABLING_QWAIT}, - {BFA_SM(bfa_fcport_sm_enabling), BFA_PPORT_ST_ENABLING}, - {BFA_SM(bfa_fcport_sm_linkdown), BFA_PPORT_ST_LINKDOWN}, - {BFA_SM(bfa_fcport_sm_linkup), BFA_PPORT_ST_LINKUP}, - {BFA_SM(bfa_fcport_sm_disabling_qwait), BFA_PPORT_ST_DISABLING_QWAIT}, - {BFA_SM(bfa_fcport_sm_disabling), BFA_PPORT_ST_DISABLING}, - {BFA_SM(bfa_fcport_sm_disabled), BFA_PPORT_ST_DISABLED}, - {BFA_SM(bfa_fcport_sm_stopped), BFA_PPORT_ST_STOPPED}, - {BFA_SM(bfa_fcport_sm_iocdown), BFA_PPORT_ST_IOCDOWN}, - {BFA_SM(bfa_fcport_sm_iocfail), BFA_PPORT_ST_IOCDOWN}, + {BFA_SM(bfa_pport_sm_uninit), BFA_PPORT_ST_UNINIT}, + {BFA_SM(bfa_pport_sm_enabling_qwait), BFA_PPORT_ST_ENABLING_QWAIT}, + {BFA_SM(bfa_pport_sm_enabling), BFA_PPORT_ST_ENABLING}, + {BFA_SM(bfa_pport_sm_linkdown), BFA_PPORT_ST_LINKDOWN}, + {BFA_SM(bfa_pport_sm_linkup), BFA_PPORT_ST_LINKUP}, + {BFA_SM(bfa_pport_sm_disabling_qwait), + BFA_PPORT_ST_DISABLING_QWAIT}, + {BFA_SM(bfa_pport_sm_disabling), BFA_PPORT_ST_DISABLING}, + {BFA_SM(bfa_pport_sm_disabled), BFA_PPORT_ST_DISABLED}, + {BFA_SM(bfa_pport_sm_stopped), BFA_PPORT_ST_STOPPED}, + {BFA_SM(bfa_pport_sm_iocdown), BFA_PPORT_ST_IOCDOWN}, + {BFA_SM(bfa_pport_sm_iocfail), BFA_PPORT_ST_IOCDOWN}, }; static void -bfa_fcport_aen_post(struct bfa_fcport_s *fcport, enum bfa_port_aen_event event) +bfa_pport_aen_post(struct bfa_pport_s *pport, enum bfa_port_aen_event event) { union bfa_aen_data_u aen_data; - struct bfa_log_mod_s *logmod = fcport->bfa->logm; - wwn_t pwwn = fcport->pwwn; + struct bfa_log_mod_s *logmod = pport->bfa->logm; + wwn_t pwwn = pport->pwwn; char pwwn_ptr[BFA_STRING_32]; + struct bfa_ioc_attr_s ioc_attr; - memset(&aen_data, 0, sizeof(aen_data)); wwn2str(pwwn_ptr, pwwn); - bfa_log(logmod, BFA_LOG_CREATE_ID(BFA_AEN_CAT_PORT, event), pwwn_ptr); + switch (event) { + case BFA_PORT_AEN_ONLINE: + bfa_log(logmod, BFA_AEN_PORT_ONLINE, pwwn_ptr); + break; + case BFA_PORT_AEN_OFFLINE: + bfa_log(logmod, BFA_AEN_PORT_OFFLINE, pwwn_ptr); + break; + case BFA_PORT_AEN_ENABLE: + bfa_log(logmod, BFA_AEN_PORT_ENABLE, pwwn_ptr); + break; + case BFA_PORT_AEN_DISABLE: + bfa_log(logmod, BFA_AEN_PORT_DISABLE, pwwn_ptr); + break; + case BFA_PORT_AEN_DISCONNECT: + bfa_log(logmod, BFA_AEN_PORT_DISCONNECT, pwwn_ptr); + break; + case BFA_PORT_AEN_QOS_NEG: + bfa_log(logmod, BFA_AEN_PORT_QOS_NEG, pwwn_ptr); + break; + default: + break; + } - aen_data.port.ioc_type = bfa_get_type(fcport->bfa); + bfa_ioc_get_attr(&pport->bfa->ioc, &ioc_attr); + aen_data.port.ioc_type = ioc_attr.ioc_type; aen_data.port.pwwn = pwwn; } static void -bfa_fcport_sm_uninit(struct bfa_fcport_s *fcport, - enum bfa_fcport_sm_event event) +bfa_pport_sm_uninit(struct bfa_pport_s *pport, enum bfa_pport_sm_event event) { - bfa_trc(fcport->bfa, event); + bfa_trc(pport->bfa, event); switch (event) { - case BFA_FCPORT_SM_START: + case BFA_PPORT_SM_START: /** * Start event after IOC is configured and BFA is started. */ - if (bfa_fcport_send_enable(fcport)) - bfa_sm_set_state(fcport, bfa_fcport_sm_enabling); + if (bfa_pport_send_enable(pport)) + bfa_sm_set_state(pport, bfa_pport_sm_enabling); else - bfa_sm_set_state(fcport, bfa_fcport_sm_enabling_qwait); + bfa_sm_set_state(pport, bfa_pport_sm_enabling_qwait); break; - case BFA_FCPORT_SM_ENABLE: + case BFA_PPORT_SM_ENABLE: /** * Port is persistently configured to be in enabled state. Do * not change state. Port enabling is done when START event is @@ -173,412 +177,389 @@ bfa_fcport_sm_uninit(struct bfa_fcport_s *fcport, */ break; - case BFA_FCPORT_SM_DISABLE: + case BFA_PPORT_SM_DISABLE: /** * If a port is persistently configured to be disabled, the * first event will a port disable request. */ - bfa_sm_set_state(fcport, bfa_fcport_sm_disabled); + bfa_sm_set_state(pport, bfa_pport_sm_disabled); break; - case BFA_FCPORT_SM_HWFAIL: - bfa_sm_set_state(fcport, bfa_fcport_sm_iocdown); + case BFA_PPORT_SM_HWFAIL: + bfa_sm_set_state(pport, bfa_pport_sm_iocdown); break; default: - bfa_sm_fault(fcport->bfa, event); + bfa_sm_fault(pport->bfa, event); } } static void -bfa_fcport_sm_enabling_qwait(struct bfa_fcport_s *fcport, - enum bfa_fcport_sm_event event) +bfa_pport_sm_enabling_qwait(struct bfa_pport_s *pport, + enum bfa_pport_sm_event event) { - bfa_trc(fcport->bfa, event); + bfa_trc(pport->bfa, event); switch (event) { - case BFA_FCPORT_SM_QRESUME: - bfa_sm_set_state(fcport, bfa_fcport_sm_enabling); - bfa_fcport_send_enable(fcport); + case BFA_PPORT_SM_QRESUME: + bfa_sm_set_state(pport, bfa_pport_sm_enabling); + bfa_pport_send_enable(pport); break; - case BFA_FCPORT_SM_STOP: - bfa_reqq_wcancel(&fcport->reqq_wait); - bfa_sm_set_state(fcport, bfa_fcport_sm_stopped); + case BFA_PPORT_SM_STOP: + bfa_reqq_wcancel(&pport->reqq_wait); + bfa_sm_set_state(pport, bfa_pport_sm_stopped); break; - case BFA_FCPORT_SM_ENABLE: + case BFA_PPORT_SM_ENABLE: /** * Already enable is in progress. */ break; - case BFA_FCPORT_SM_DISABLE: + case BFA_PPORT_SM_DISABLE: /** * Just send disable request to firmware when room becomes * available in request queue. */ - bfa_sm_set_state(fcport, bfa_fcport_sm_disabled); - bfa_reqq_wcancel(&fcport->reqq_wait); - bfa_plog_str(fcport->bfa->plog, BFA_PL_MID_HAL, + bfa_sm_set_state(pport, bfa_pport_sm_disabled); + bfa_reqq_wcancel(&pport->reqq_wait); + bfa_plog_str(pport->bfa->plog, BFA_PL_MID_HAL, BFA_PL_EID_PORT_DISABLE, 0, "Port Disable"); - bfa_fcport_aen_post(fcport, BFA_PORT_AEN_DISABLE); + bfa_pport_aen_post(pport, BFA_PORT_AEN_DISABLE); break; - case BFA_FCPORT_SM_LINKUP: - case BFA_FCPORT_SM_LINKDOWN: + case BFA_PPORT_SM_LINKUP: + case BFA_PPORT_SM_LINKDOWN: /** * Possible to get link events when doing back-to-back * enable/disables. */ break; - case BFA_FCPORT_SM_HWFAIL: - bfa_reqq_wcancel(&fcport->reqq_wait); - bfa_sm_set_state(fcport, bfa_fcport_sm_iocdown); + case BFA_PPORT_SM_HWFAIL: + bfa_reqq_wcancel(&pport->reqq_wait); + bfa_sm_set_state(pport, bfa_pport_sm_iocdown); break; default: - bfa_sm_fault(fcport->bfa, event); + bfa_sm_fault(pport->bfa, event); } } static void -bfa_fcport_sm_enabling(struct bfa_fcport_s *fcport, - enum bfa_fcport_sm_event event) +bfa_pport_sm_enabling(struct bfa_pport_s *pport, enum bfa_pport_sm_event event) { - bfa_trc(fcport->bfa, event); + bfa_trc(pport->bfa, event); switch (event) { - case BFA_FCPORT_SM_FWRSP: - case BFA_FCPORT_SM_LINKDOWN: - bfa_sm_set_state(fcport, bfa_fcport_sm_linkdown); + case BFA_PPORT_SM_FWRSP: + case BFA_PPORT_SM_LINKDOWN: + bfa_sm_set_state(pport, bfa_pport_sm_linkdown); break; - case BFA_FCPORT_SM_LINKUP: - bfa_fcport_update_linkinfo(fcport); - bfa_sm_set_state(fcport, bfa_fcport_sm_linkup); + case BFA_PPORT_SM_LINKUP: + bfa_pport_update_linkinfo(pport); + bfa_sm_set_state(pport, bfa_pport_sm_linkup); - bfa_assert(fcport->event_cbfn); - bfa_fcport_callback(fcport, BFA_PPORT_LINKUP); + bfa_assert(pport->event_cbfn); + bfa_pport_callback(pport, BFA_PPORT_LINKUP); break; - case BFA_FCPORT_SM_ENABLE: + case BFA_PPORT_SM_ENABLE: /** * Already being enabled. */ break; - case BFA_FCPORT_SM_DISABLE: - if (bfa_fcport_send_disable(fcport)) - bfa_sm_set_state(fcport, bfa_fcport_sm_disabling); + case BFA_PPORT_SM_DISABLE: + if (bfa_pport_send_disable(pport)) + bfa_sm_set_state(pport, bfa_pport_sm_disabling); else - bfa_sm_set_state(fcport, bfa_fcport_sm_disabling_qwait); + bfa_sm_set_state(pport, bfa_pport_sm_disabling_qwait); - bfa_plog_str(fcport->bfa->plog, BFA_PL_MID_HAL, + bfa_plog_str(pport->bfa->plog, BFA_PL_MID_HAL, BFA_PL_EID_PORT_DISABLE, 0, "Port Disable"); - bfa_fcport_aen_post(fcport, BFA_PORT_AEN_DISABLE); + bfa_pport_aen_post(pport, BFA_PORT_AEN_DISABLE); break; - case BFA_FCPORT_SM_STOP: - bfa_sm_set_state(fcport, bfa_fcport_sm_stopped); + case BFA_PPORT_SM_STOP: + bfa_sm_set_state(pport, bfa_pport_sm_stopped); break; - case BFA_FCPORT_SM_HWFAIL: - bfa_sm_set_state(fcport, bfa_fcport_sm_iocdown); + case BFA_PPORT_SM_HWFAIL: + bfa_sm_set_state(pport, bfa_pport_sm_iocdown); break; default: - bfa_sm_fault(fcport->bfa, event); + bfa_sm_fault(pport->bfa, event); } } static void -bfa_fcport_sm_linkdown(struct bfa_fcport_s *fcport, - enum bfa_fcport_sm_event event) +bfa_pport_sm_linkdown(struct bfa_pport_s *pport, enum bfa_pport_sm_event event) { - struct bfi_fcport_event_s *pevent = fcport->event_arg.i2hmsg.event; - bfa_trc(fcport->bfa, event); + bfa_trc(pport->bfa, event); switch (event) { - case BFA_FCPORT_SM_LINKUP: - bfa_fcport_update_linkinfo(fcport); - bfa_sm_set_state(fcport, bfa_fcport_sm_linkup); - bfa_assert(fcport->event_cbfn); - bfa_plog_str(fcport->bfa->plog, BFA_PL_MID_HAL, + case BFA_PPORT_SM_LINKUP: + bfa_pport_update_linkinfo(pport); + bfa_sm_set_state(pport, bfa_pport_sm_linkup); + bfa_assert(pport->event_cbfn); + bfa_plog_str(pport->bfa->plog, BFA_PL_MID_HAL, BFA_PL_EID_PORT_ST_CHANGE, 0, "Port Linkup"); - - if (!bfa_ioc_get_fcmode(&fcport->bfa->ioc)) { - - bfa_trc(fcport->bfa, pevent->link_state.fcf.fipenabled); - bfa_trc(fcport->bfa, pevent->link_state.fcf.fipfailed); - - if (pevent->link_state.fcf.fipfailed) - bfa_plog_str(fcport->bfa->plog, BFA_PL_MID_HAL, - BFA_PL_EID_FIP_FCF_DISC, 0, - "FIP FCF Discovery Failed"); - else - bfa_plog_str(fcport->bfa->plog, BFA_PL_MID_HAL, - BFA_PL_EID_FIP_FCF_DISC, 0, - "FIP FCF Discovered"); - } - - bfa_fcport_callback(fcport, BFA_PPORT_LINKUP); - bfa_fcport_aen_post(fcport, BFA_PORT_AEN_ONLINE); + bfa_pport_callback(pport, BFA_PPORT_LINKUP); + bfa_pport_aen_post(pport, BFA_PORT_AEN_ONLINE); /** * If QoS is enabled and it is not online, * Send a separate event. */ - if ((fcport->cfg.qos_enabled) - && (bfa_os_ntohl(fcport->qos_attr.state) != BFA_QOS_ONLINE)) - bfa_fcport_aen_post(fcport, BFA_PORT_AEN_QOS_NEG); + if ((pport->cfg.qos_enabled) + && (bfa_os_ntohl(pport->qos_attr.state) != BFA_QOS_ONLINE)) + bfa_pport_aen_post(pport, BFA_PORT_AEN_QOS_NEG); break; - case BFA_FCPORT_SM_LINKDOWN: + case BFA_PPORT_SM_LINKDOWN: /** * Possible to get link down event. */ break; - case BFA_FCPORT_SM_ENABLE: + case BFA_PPORT_SM_ENABLE: /** * Already enabled. */ break; - case BFA_FCPORT_SM_DISABLE: - if (bfa_fcport_send_disable(fcport)) - bfa_sm_set_state(fcport, bfa_fcport_sm_disabling); + case BFA_PPORT_SM_DISABLE: + if (bfa_pport_send_disable(pport)) + bfa_sm_set_state(pport, bfa_pport_sm_disabling); else - bfa_sm_set_state(fcport, bfa_fcport_sm_disabling_qwait); + bfa_sm_set_state(pport, bfa_pport_sm_disabling_qwait); - bfa_plog_str(fcport->bfa->plog, BFA_PL_MID_HAL, + bfa_plog_str(pport->bfa->plog, BFA_PL_MID_HAL, BFA_PL_EID_PORT_DISABLE, 0, "Port Disable"); - bfa_fcport_aen_post(fcport, BFA_PORT_AEN_DISABLE); + bfa_pport_aen_post(pport, BFA_PORT_AEN_DISABLE); break; - case BFA_FCPORT_SM_STOP: - bfa_sm_set_state(fcport, bfa_fcport_sm_stopped); + case BFA_PPORT_SM_STOP: + bfa_sm_set_state(pport, bfa_pport_sm_stopped); break; - case BFA_FCPORT_SM_HWFAIL: - bfa_sm_set_state(fcport, bfa_fcport_sm_iocdown); + case BFA_PPORT_SM_HWFAIL: + bfa_sm_set_state(pport, bfa_pport_sm_iocdown); break; default: - bfa_sm_fault(fcport->bfa, event); + bfa_sm_fault(pport->bfa, event); } } static void -bfa_fcport_sm_linkup(struct bfa_fcport_s *fcport, - enum bfa_fcport_sm_event event) +bfa_pport_sm_linkup(struct bfa_pport_s *pport, enum bfa_pport_sm_event event) { - bfa_trc(fcport->bfa, event); + bfa_trc(pport->bfa, event); switch (event) { - case BFA_FCPORT_SM_ENABLE: + case BFA_PPORT_SM_ENABLE: /** * Already enabled. */ break; - case BFA_FCPORT_SM_DISABLE: - if (bfa_fcport_send_disable(fcport)) - bfa_sm_set_state(fcport, bfa_fcport_sm_disabling); + case BFA_PPORT_SM_DISABLE: + if (bfa_pport_send_disable(pport)) + bfa_sm_set_state(pport, bfa_pport_sm_disabling); else - bfa_sm_set_state(fcport, bfa_fcport_sm_disabling_qwait); + bfa_sm_set_state(pport, bfa_pport_sm_disabling_qwait); - bfa_fcport_reset_linkinfo(fcport); - bfa_fcport_callback(fcport, BFA_PPORT_LINKDOWN); - bfa_plog_str(fcport->bfa->plog, BFA_PL_MID_HAL, + bfa_pport_reset_linkinfo(pport); + bfa_pport_callback(pport, BFA_PPORT_LINKDOWN); + bfa_plog_str(pport->bfa->plog, BFA_PL_MID_HAL, BFA_PL_EID_PORT_DISABLE, 0, "Port Disable"); - bfa_fcport_aen_post(fcport, BFA_PORT_AEN_OFFLINE); - bfa_fcport_aen_post(fcport, BFA_PORT_AEN_DISABLE); + bfa_pport_aen_post(pport, BFA_PORT_AEN_OFFLINE); + bfa_pport_aen_post(pport, BFA_PORT_AEN_DISABLE); break; - case BFA_FCPORT_SM_LINKDOWN: - bfa_sm_set_state(fcport, bfa_fcport_sm_linkdown); - bfa_fcport_reset_linkinfo(fcport); - bfa_fcport_callback(fcport, BFA_PPORT_LINKDOWN); - bfa_plog_str(fcport->bfa->plog, BFA_PL_MID_HAL, + case BFA_PPORT_SM_LINKDOWN: + bfa_sm_set_state(pport, bfa_pport_sm_linkdown); + bfa_pport_reset_linkinfo(pport); + bfa_pport_callback(pport, BFA_PPORT_LINKDOWN); + bfa_plog_str(pport->bfa->plog, BFA_PL_MID_HAL, BFA_PL_EID_PORT_ST_CHANGE, 0, "Port Linkdown"); - if (BFA_PORT_IS_DISABLED(fcport->bfa)) - bfa_fcport_aen_post(fcport, BFA_PORT_AEN_OFFLINE); + if (BFA_PORT_IS_DISABLED(pport->bfa)) + bfa_pport_aen_post(pport, BFA_PORT_AEN_OFFLINE); else - bfa_fcport_aen_post(fcport, BFA_PORT_AEN_DISCONNECT); + bfa_pport_aen_post(pport, BFA_PORT_AEN_DISCONNECT); break; - case BFA_FCPORT_SM_STOP: - bfa_sm_set_state(fcport, bfa_fcport_sm_stopped); - bfa_fcport_reset_linkinfo(fcport); - if (BFA_PORT_IS_DISABLED(fcport->bfa)) - bfa_fcport_aen_post(fcport, BFA_PORT_AEN_OFFLINE); + case BFA_PPORT_SM_STOP: + bfa_sm_set_state(pport, bfa_pport_sm_stopped); + bfa_pport_reset_linkinfo(pport); + if (BFA_PORT_IS_DISABLED(pport->bfa)) + bfa_pport_aen_post(pport, BFA_PORT_AEN_OFFLINE); else - bfa_fcport_aen_post(fcport, BFA_PORT_AEN_DISCONNECT); + bfa_pport_aen_post(pport, BFA_PORT_AEN_DISCONNECT); break; - case BFA_FCPORT_SM_HWFAIL: - bfa_sm_set_state(fcport, bfa_fcport_sm_iocdown); - bfa_fcport_reset_linkinfo(fcport); - bfa_fcport_callback(fcport, BFA_PPORT_LINKDOWN); - if (BFA_PORT_IS_DISABLED(fcport->bfa)) - bfa_fcport_aen_post(fcport, BFA_PORT_AEN_OFFLINE); + case BFA_PPORT_SM_HWFAIL: + bfa_sm_set_state(pport, bfa_pport_sm_iocdown); + bfa_pport_reset_linkinfo(pport); + bfa_pport_callback(pport, BFA_PPORT_LINKDOWN); + if (BFA_PORT_IS_DISABLED(pport->bfa)) + bfa_pport_aen_post(pport, BFA_PORT_AEN_OFFLINE); else - bfa_fcport_aen_post(fcport, BFA_PORT_AEN_DISCONNECT); + bfa_pport_aen_post(pport, BFA_PORT_AEN_DISCONNECT); break; default: - bfa_sm_fault(fcport->bfa, event); + bfa_sm_fault(pport->bfa, event); } } static void -bfa_fcport_sm_disabling_qwait(struct bfa_fcport_s *fcport, - enum bfa_fcport_sm_event event) +bfa_pport_sm_disabling_qwait(struct bfa_pport_s *pport, + enum bfa_pport_sm_event event) { - bfa_trc(fcport->bfa, event); + bfa_trc(pport->bfa, event); switch (event) { - case BFA_FCPORT_SM_QRESUME: - bfa_sm_set_state(fcport, bfa_fcport_sm_disabling); - bfa_fcport_send_disable(fcport); + case BFA_PPORT_SM_QRESUME: + bfa_sm_set_state(pport, bfa_pport_sm_disabling); + bfa_pport_send_disable(pport); break; - case BFA_FCPORT_SM_STOP: - bfa_sm_set_state(fcport, bfa_fcport_sm_stopped); - bfa_reqq_wcancel(&fcport->reqq_wait); + case BFA_PPORT_SM_STOP: + bfa_sm_set_state(pport, bfa_pport_sm_stopped); + bfa_reqq_wcancel(&pport->reqq_wait); break; - case BFA_FCPORT_SM_DISABLE: + case BFA_PPORT_SM_DISABLE: /** * Already being disabled. */ break; - case BFA_FCPORT_SM_LINKUP: - case BFA_FCPORT_SM_LINKDOWN: + case BFA_PPORT_SM_LINKUP: + case BFA_PPORT_SM_LINKDOWN: /** * Possible to get link events when doing back-to-back * enable/disables. */ break; - case BFA_FCPORT_SM_HWFAIL: - bfa_sm_set_state(fcport, bfa_fcport_sm_iocfail); - bfa_reqq_wcancel(&fcport->reqq_wait); + case BFA_PPORT_SM_HWFAIL: + bfa_sm_set_state(pport, bfa_pport_sm_iocfail); + bfa_reqq_wcancel(&pport->reqq_wait); break; default: - bfa_sm_fault(fcport->bfa, event); + bfa_sm_fault(pport->bfa, event); } } static void -bfa_fcport_sm_disabling(struct bfa_fcport_s *fcport, - enum bfa_fcport_sm_event event) +bfa_pport_sm_disabling(struct bfa_pport_s *pport, enum bfa_pport_sm_event event) { - bfa_trc(fcport->bfa, event); + bfa_trc(pport->bfa, event); switch (event) { - case BFA_FCPORT_SM_FWRSP: - bfa_sm_set_state(fcport, bfa_fcport_sm_disabled); + case BFA_PPORT_SM_FWRSP: + bfa_sm_set_state(pport, bfa_pport_sm_disabled); break; - case BFA_FCPORT_SM_DISABLE: + case BFA_PPORT_SM_DISABLE: /** * Already being disabled. */ break; - case BFA_FCPORT_SM_ENABLE: - if (bfa_fcport_send_enable(fcport)) - bfa_sm_set_state(fcport, bfa_fcport_sm_enabling); + case BFA_PPORT_SM_ENABLE: + if (bfa_pport_send_enable(pport)) + bfa_sm_set_state(pport, bfa_pport_sm_enabling); else - bfa_sm_set_state(fcport, bfa_fcport_sm_enabling_qwait); + bfa_sm_set_state(pport, bfa_pport_sm_enabling_qwait); - bfa_plog_str(fcport->bfa->plog, BFA_PL_MID_HAL, + bfa_plog_str(pport->bfa->plog, BFA_PL_MID_HAL, BFA_PL_EID_PORT_ENABLE, 0, "Port Enable"); - bfa_fcport_aen_post(fcport, BFA_PORT_AEN_ENABLE); + bfa_pport_aen_post(pport, BFA_PORT_AEN_ENABLE); break; - case BFA_FCPORT_SM_STOP: - bfa_sm_set_state(fcport, bfa_fcport_sm_stopped); + case BFA_PPORT_SM_STOP: + bfa_sm_set_state(pport, bfa_pport_sm_stopped); break; - case BFA_FCPORT_SM_LINKUP: - case BFA_FCPORT_SM_LINKDOWN: + case BFA_PPORT_SM_LINKUP: + case BFA_PPORT_SM_LINKDOWN: /** * Possible to get link events when doing back-to-back * enable/disables. */ break; - case BFA_FCPORT_SM_HWFAIL: - bfa_sm_set_state(fcport, bfa_fcport_sm_iocfail); + case BFA_PPORT_SM_HWFAIL: + bfa_sm_set_state(pport, bfa_pport_sm_iocfail); break; default: - bfa_sm_fault(fcport->bfa, event); + bfa_sm_fault(pport->bfa, event); } } static void -bfa_fcport_sm_disabled(struct bfa_fcport_s *fcport, - enum bfa_fcport_sm_event event) +bfa_pport_sm_disabled(struct bfa_pport_s *pport, enum bfa_pport_sm_event event) { - bfa_trc(fcport->bfa, event); + bfa_trc(pport->bfa, event); switch (event) { - case BFA_FCPORT_SM_START: + case BFA_PPORT_SM_START: /** * Ignore start event for a port that is disabled. */ break; - case BFA_FCPORT_SM_STOP: - bfa_sm_set_state(fcport, bfa_fcport_sm_stopped); + case BFA_PPORT_SM_STOP: + bfa_sm_set_state(pport, bfa_pport_sm_stopped); break; - case BFA_FCPORT_SM_ENABLE: - if (bfa_fcport_send_enable(fcport)) - bfa_sm_set_state(fcport, bfa_fcport_sm_enabling); + case BFA_PPORT_SM_ENABLE: + if (bfa_pport_send_enable(pport)) + bfa_sm_set_state(pport, bfa_pport_sm_enabling); else - bfa_sm_set_state(fcport, bfa_fcport_sm_enabling_qwait); + bfa_sm_set_state(pport, bfa_pport_sm_enabling_qwait); - bfa_plog_str(fcport->bfa->plog, BFA_PL_MID_HAL, + bfa_plog_str(pport->bfa->plog, BFA_PL_MID_HAL, BFA_PL_EID_PORT_ENABLE, 0, "Port Enable"); - bfa_fcport_aen_post(fcport, BFA_PORT_AEN_ENABLE); + bfa_pport_aen_post(pport, BFA_PORT_AEN_ENABLE); break; - case BFA_FCPORT_SM_DISABLE: + case BFA_PPORT_SM_DISABLE: /** * Already disabled. */ break; - case BFA_FCPORT_SM_HWFAIL: - bfa_sm_set_state(fcport, bfa_fcport_sm_iocfail); + case BFA_PPORT_SM_HWFAIL: + bfa_sm_set_state(pport, bfa_pport_sm_iocfail); break; default: - bfa_sm_fault(fcport->bfa, event); + bfa_sm_fault(pport->bfa, event); } } static void -bfa_fcport_sm_stopped(struct bfa_fcport_s *fcport, - enum bfa_fcport_sm_event event) +bfa_pport_sm_stopped(struct bfa_pport_s *pport, enum bfa_pport_sm_event event) { - bfa_trc(fcport->bfa, event); + bfa_trc(pport->bfa, event); switch (event) { - case BFA_FCPORT_SM_START: - if (bfa_fcport_send_enable(fcport)) - bfa_sm_set_state(fcport, bfa_fcport_sm_enabling); + case BFA_PPORT_SM_START: + if (bfa_pport_send_enable(pport)) + bfa_sm_set_state(pport, bfa_pport_sm_enabling); else - bfa_sm_set_state(fcport, bfa_fcport_sm_enabling_qwait); + bfa_sm_set_state(pport, bfa_pport_sm_enabling_qwait); break; default: @@ -593,17 +574,16 @@ bfa_fcport_sm_stopped(struct bfa_fcport_s *fcport, * Port is enabled. IOC is down/failed. */ static void -bfa_fcport_sm_iocdown(struct bfa_fcport_s *fcport, - enum bfa_fcport_sm_event event) +bfa_pport_sm_iocdown(struct bfa_pport_s *pport, enum bfa_pport_sm_event event) { - bfa_trc(fcport->bfa, event); + bfa_trc(pport->bfa, event); switch (event) { - case BFA_FCPORT_SM_START: - if (bfa_fcport_send_enable(fcport)) - bfa_sm_set_state(fcport, bfa_fcport_sm_enabling); + case BFA_PPORT_SM_START: + if (bfa_pport_send_enable(pport)) + bfa_sm_set_state(pport, bfa_pport_sm_enabling); else - bfa_sm_set_state(fcport, bfa_fcport_sm_enabling_qwait); + bfa_sm_set_state(pport, bfa_pport_sm_enabling_qwait); break; default: @@ -618,18 +598,17 @@ bfa_fcport_sm_iocdown(struct bfa_fcport_s *fcport, * Port is disabled. IOC is down/failed. */ static void -bfa_fcport_sm_iocfail(struct bfa_fcport_s *fcport, - enum bfa_fcport_sm_event event) +bfa_pport_sm_iocfail(struct bfa_pport_s *pport, enum bfa_pport_sm_event event) { - bfa_trc(fcport->bfa, event); + bfa_trc(pport->bfa, event); switch (event) { - case BFA_FCPORT_SM_START: - bfa_sm_set_state(fcport, bfa_fcport_sm_disabled); + case BFA_PPORT_SM_START: + bfa_sm_set_state(pport, bfa_pport_sm_disabled); break; - case BFA_FCPORT_SM_ENABLE: - bfa_sm_set_state(fcport, bfa_fcport_sm_iocdown); + case BFA_PPORT_SM_ENABLE: + bfa_sm_set_state(pport, bfa_pport_sm_iocdown); break; default: @@ -640,226 +619,41 @@ bfa_fcport_sm_iocfail(struct bfa_fcport_s *fcport, } } -/** - * Link state is down - */ -static void -bfa_fcport_ln_sm_dn(struct bfa_fcport_ln_s *ln, - enum bfa_fcport_ln_sm_event event) -{ - bfa_trc(ln->fcport->bfa, event); - - switch (event) { - case BFA_FCPORT_LN_SM_LINKUP: - bfa_sm_set_state(ln, bfa_fcport_ln_sm_up_nf); - bfa_fcport_queue_cb(ln, BFA_PPORT_LINKUP); - break; - - default: - bfa_sm_fault(ln->fcport->bfa, event); - } -} - -/** - * Link state is waiting for down notification - */ -static void -bfa_fcport_ln_sm_dn_nf(struct bfa_fcport_ln_s *ln, - enum bfa_fcport_ln_sm_event event) -{ - bfa_trc(ln->fcport->bfa, event); - - switch (event) { - case BFA_FCPORT_LN_SM_LINKUP: - bfa_sm_set_state(ln, bfa_fcport_ln_sm_dn_up_nf); - break; - - case BFA_FCPORT_LN_SM_NOTIFICATION: - bfa_sm_set_state(ln, bfa_fcport_ln_sm_dn); - break; - - default: - bfa_sm_fault(ln->fcport->bfa, event); - } -} - -/** - * Link state is waiting for down notification and there is a pending up - */ -static void -bfa_fcport_ln_sm_dn_up_nf(struct bfa_fcport_ln_s *ln, - enum bfa_fcport_ln_sm_event event) -{ - bfa_trc(ln->fcport->bfa, event); - - switch (event) { - case BFA_FCPORT_LN_SM_LINKDOWN: - bfa_sm_set_state(ln, bfa_fcport_ln_sm_dn_nf); - break; - - case BFA_FCPORT_LN_SM_NOTIFICATION: - bfa_sm_set_state(ln, bfa_fcport_ln_sm_up_nf); - bfa_fcport_queue_cb(ln, BFA_PPORT_LINKUP); - break; - - default: - bfa_sm_fault(ln->fcport->bfa, event); - } -} - -/** - * Link state is up - */ -static void -bfa_fcport_ln_sm_up(struct bfa_fcport_ln_s *ln, - enum bfa_fcport_ln_sm_event event) -{ - bfa_trc(ln->fcport->bfa, event); - - switch (event) { - case BFA_FCPORT_LN_SM_LINKDOWN: - bfa_sm_set_state(ln, bfa_fcport_ln_sm_dn_nf); - bfa_fcport_queue_cb(ln, BFA_PPORT_LINKDOWN); - break; - default: - bfa_sm_fault(ln->fcport->bfa, event); - } -} - -/** - * Link state is waiting for up notification - */ -static void -bfa_fcport_ln_sm_up_nf(struct bfa_fcport_ln_s *ln, - enum bfa_fcport_ln_sm_event event) -{ - bfa_trc(ln->fcport->bfa, event); - - switch (event) { - case BFA_FCPORT_LN_SM_LINKDOWN: - bfa_sm_set_state(ln, bfa_fcport_ln_sm_up_dn_nf); - break; - - case BFA_FCPORT_LN_SM_NOTIFICATION: - bfa_sm_set_state(ln, bfa_fcport_ln_sm_up); - break; - - default: - bfa_sm_fault(ln->fcport->bfa, event); - } -} - -/** - * Link state is waiting for up notification and there is a pending down - */ -static void -bfa_fcport_ln_sm_up_dn_nf(struct bfa_fcport_ln_s *ln, - enum bfa_fcport_ln_sm_event event) -{ - bfa_trc(ln->fcport->bfa, event); - - switch (event) { - case BFA_FCPORT_LN_SM_LINKUP: - bfa_sm_set_state(ln, bfa_fcport_ln_sm_up_dn_up_nf); - break; - - case BFA_FCPORT_LN_SM_NOTIFICATION: - bfa_sm_set_state(ln, bfa_fcport_ln_sm_dn_nf); - bfa_fcport_queue_cb(ln, BFA_PPORT_LINKDOWN); - break; - - default: - bfa_sm_fault(ln->fcport->bfa, event); - } -} - -/** - * Link state is waiting for up notification and there are pending down and up - */ -static void -bfa_fcport_ln_sm_up_dn_up_nf(struct bfa_fcport_ln_s *ln, - enum bfa_fcport_ln_sm_event event) -{ - bfa_trc(ln->fcport->bfa, event); - - switch (event) { - case BFA_FCPORT_LN_SM_LINKDOWN: - bfa_sm_set_state(ln, bfa_fcport_ln_sm_up_dn_nf); - break; - - case BFA_FCPORT_LN_SM_NOTIFICATION: - bfa_sm_set_state(ln, bfa_fcport_ln_sm_dn_up_nf); - bfa_fcport_queue_cb(ln, BFA_PPORT_LINKDOWN); - break; - - default: - bfa_sm_fault(ln->fcport->bfa, event); - } -} /** * bfa_pport_private */ static void -__bfa_cb_fcport_event(void *cbarg, bfa_boolean_t complete) +__bfa_cb_port_event(void *cbarg, bfa_boolean_t complete) { - struct bfa_fcport_ln_s *ln = cbarg; + struct bfa_pport_s *pport = cbarg; if (complete) - ln->fcport->event_cbfn(ln->fcport->event_cbarg, ln->ln_event); - else - bfa_sm_send_event(ln, BFA_FCPORT_LN_SM_NOTIFICATION); + pport->event_cbfn(pport->event_cbarg, pport->hcb_event); } -static void -bfa_fcport_callback(struct bfa_fcport_s *fcport, enum bfa_pport_linkstate event) -{ - if (fcport->bfa->fcs) { - fcport->event_cbfn(fcport->event_cbarg, event); - return; - } - - switch (event) { - case BFA_PPORT_LINKUP: - bfa_sm_send_event(&fcport->ln, BFA_FCPORT_LN_SM_LINKUP); - break; - case BFA_PPORT_LINKDOWN: - bfa_sm_send_event(&fcport->ln, BFA_FCPORT_LN_SM_LINKDOWN); - break; - default: - bfa_assert(0); - } -} - -static void -bfa_fcport_queue_cb(struct bfa_fcport_ln_s *ln, enum bfa_pport_linkstate event) -{ - ln->ln_event = event; - bfa_cb_queue(ln->fcport->bfa, &ln->ln_qe, __bfa_cb_fcport_event, ln); -} - -#define FCPORT_STATS_DMA_SZ (BFA_ROUNDUP(sizeof(union bfa_fcport_stats_u), \ +#define PPORT_STATS_DMA_SZ (BFA_ROUNDUP(sizeof(union bfa_pport_stats_u), \ BFA_CACHELINE_SZ)) static void -bfa_fcport_meminfo(struct bfa_iocfc_cfg_s *cfg, u32 *ndm_len, +bfa_pport_meminfo(struct bfa_iocfc_cfg_s *cfg, u32 *ndm_len, u32 *dm_len) { - *dm_len += FCPORT_STATS_DMA_SZ; + *dm_len += PPORT_STATS_DMA_SZ; } static void -bfa_fcport_qresume(void *cbarg) +bfa_pport_qresume(void *cbarg) { - struct bfa_fcport_s *fcport = cbarg; + struct bfa_pport_s *port = cbarg; - bfa_sm_send_event(fcport, BFA_FCPORT_SM_QRESUME); + bfa_sm_send_event(port, BFA_PPORT_SM_QRESUME); } static void -bfa_fcport_mem_claim(struct bfa_fcport_s *fcport, struct bfa_meminfo_s *meminfo) +bfa_pport_mem_claim(struct bfa_pport_s *pport, struct bfa_meminfo_s *meminfo) { u8 *dm_kva; u64 dm_pa; @@ -867,12 +661,12 @@ bfa_fcport_mem_claim(struct bfa_fcport_s *fcport, struct bfa_meminfo_s *meminfo) dm_kva = bfa_meminfo_dma_virt(meminfo); dm_pa = bfa_meminfo_dma_phys(meminfo); - fcport->stats_kva = dm_kva; - fcport->stats_pa = dm_pa; - fcport->stats = (union bfa_fcport_stats_u *)dm_kva; + pport->stats_kva = dm_kva; + pport->stats_pa = dm_pa; + pport->stats = (union bfa_pport_stats_u *)dm_kva; - dm_kva += FCPORT_STATS_DMA_SZ; - dm_pa += FCPORT_STATS_DMA_SZ; + dm_kva += PPORT_STATS_DMA_SZ; + dm_pa += PPORT_STATS_DMA_SZ; bfa_meminfo_dma_virt(meminfo) = dm_kva; bfa_meminfo_dma_phys(meminfo) = dm_pa; @@ -882,21 +676,18 @@ bfa_fcport_mem_claim(struct bfa_fcport_s *fcport, struct bfa_meminfo_s *meminfo) * Memory initialization. */ static void -bfa_fcport_attach(struct bfa_s *bfa, void *bfad, struct bfa_iocfc_cfg_s *cfg, +bfa_pport_attach(struct bfa_s *bfa, void *bfad, struct bfa_iocfc_cfg_s *cfg, struct bfa_meminfo_s *meminfo, struct bfa_pcidev_s *pcidev) { - struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); - struct bfa_pport_cfg_s *port_cfg = &fcport->cfg; - struct bfa_fcport_ln_s *ln = &fcport->ln; + struct bfa_pport_s *pport = BFA_PORT_MOD(bfa); + struct bfa_pport_cfg_s *port_cfg = &pport->cfg; - bfa_os_memset(fcport, 0, sizeof(struct bfa_fcport_s)); - fcport->bfa = bfa; - ln->fcport = fcport; + bfa_os_memset(pport, 0, sizeof(struct bfa_pport_s)); + pport->bfa = bfa; - bfa_fcport_mem_claim(fcport, meminfo); + bfa_pport_mem_claim(pport, meminfo); - bfa_sm_set_state(fcport, bfa_fcport_sm_uninit); - bfa_sm_set_state(ln, bfa_fcport_ln_sm_dn); + bfa_sm_set_state(pport, bfa_pport_sm_uninit); /** * initialize and set default configuration @@ -908,30 +699,30 @@ bfa_fcport_attach(struct bfa_s *bfa, void *bfad, struct bfa_iocfc_cfg_s *cfg, port_cfg->trl_def_speed = BFA_PPORT_SPEED_1GBPS; - bfa_reqq_winit(&fcport->reqq_wait, bfa_fcport_qresume, fcport); + bfa_reqq_winit(&pport->reqq_wait, bfa_pport_qresume, pport); } static void -bfa_fcport_initdone(struct bfa_s *bfa) +bfa_pport_initdone(struct bfa_s *bfa) { - struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); + struct bfa_pport_s *pport = BFA_PORT_MOD(bfa); /** * Initialize port attributes from IOC hardware data. */ - bfa_fcport_set_wwns(fcport); - if (fcport->cfg.maxfrsize == 0) - fcport->cfg.maxfrsize = bfa_ioc_maxfrsize(&bfa->ioc); - fcport->cfg.rx_bbcredit = bfa_ioc_rx_bbcredit(&bfa->ioc); - fcport->speed_sup = bfa_ioc_speed_sup(&bfa->ioc); + bfa_pport_set_wwns(pport); + if (pport->cfg.maxfrsize == 0) + pport->cfg.maxfrsize = bfa_ioc_maxfrsize(&bfa->ioc); + pport->cfg.rx_bbcredit = bfa_ioc_rx_bbcredit(&bfa->ioc); + pport->speed_sup = bfa_ioc_speed_sup(&bfa->ioc); - bfa_assert(fcport->cfg.maxfrsize); - bfa_assert(fcport->cfg.rx_bbcredit); - bfa_assert(fcport->speed_sup); + bfa_assert(pport->cfg.maxfrsize); + bfa_assert(pport->cfg.rx_bbcredit); + bfa_assert(pport->speed_sup); } static void -bfa_fcport_detach(struct bfa_s *bfa) +bfa_pport_detach(struct bfa_s *bfa) { } @@ -939,97 +730,95 @@ bfa_fcport_detach(struct bfa_s *bfa) * Called when IOC is ready. */ static void -bfa_fcport_start(struct bfa_s *bfa) +bfa_pport_start(struct bfa_s *bfa) { - bfa_sm_send_event(BFA_FCPORT_MOD(bfa), BFA_FCPORT_SM_START); + bfa_sm_send_event(BFA_PORT_MOD(bfa), BFA_PPORT_SM_START); } /** * Called before IOC is stopped. */ static void -bfa_fcport_stop(struct bfa_s *bfa) +bfa_pport_stop(struct bfa_s *bfa) { - bfa_sm_send_event(BFA_FCPORT_MOD(bfa), BFA_FCPORT_SM_STOP); + bfa_sm_send_event(BFA_PORT_MOD(bfa), BFA_PPORT_SM_STOP); } /** * Called when IOC failure is detected. */ static void -bfa_fcport_iocdisable(struct bfa_s *bfa) +bfa_pport_iocdisable(struct bfa_s *bfa) { - bfa_sm_send_event(BFA_FCPORT_MOD(bfa), BFA_FCPORT_SM_HWFAIL); + bfa_sm_send_event(BFA_PORT_MOD(bfa), BFA_PPORT_SM_HWFAIL); } static void -bfa_fcport_update_linkinfo(struct bfa_fcport_s *fcport) +bfa_pport_update_linkinfo(struct bfa_pport_s *pport) { - struct bfi_fcport_event_s *pevent = fcport->event_arg.i2hmsg.event; + struct bfi_pport_event_s *pevent = pport->event_arg.i2hmsg.event; - fcport->speed = pevent->link_state.speed; - fcport->topology = pevent->link_state.topology; + pport->speed = pevent->link_state.speed; + pport->topology = pevent->link_state.topology; - if (fcport->topology == BFA_PPORT_TOPOLOGY_LOOP) - fcport->myalpa = - pevent->link_state.tl.loop_info.myalpa; + if (pport->topology == BFA_PPORT_TOPOLOGY_LOOP) + pport->myalpa = pevent->link_state.tl.loop_info.myalpa; /* * QoS Details */ - bfa_os_assign(fcport->qos_attr, pevent->link_state.qos_attr); - bfa_os_assign(fcport->qos_vc_attr, pevent->link_state.qos_vc_attr); + bfa_os_assign(pport->qos_attr, pevent->link_state.qos_attr); + bfa_os_assign(pport->qos_vc_attr, pevent->link_state.qos_vc_attr); - bfa_trc(fcport->bfa, fcport->speed); - bfa_trc(fcport->bfa, fcport->topology); + bfa_trc(pport->bfa, pport->speed); + bfa_trc(pport->bfa, pport->topology); } static void -bfa_fcport_reset_linkinfo(struct bfa_fcport_s *fcport) +bfa_pport_reset_linkinfo(struct bfa_pport_s *pport) { - fcport->speed = BFA_PPORT_SPEED_UNKNOWN; - fcport->topology = BFA_PPORT_TOPOLOGY_NONE; + pport->speed = BFA_PPORT_SPEED_UNKNOWN; + pport->topology = BFA_PPORT_TOPOLOGY_NONE; } /** * Send port enable message to firmware. */ static bfa_boolean_t -bfa_fcport_send_enable(struct bfa_fcport_s *fcport) +bfa_pport_send_enable(struct bfa_pport_s *port) { - struct bfi_fcport_enable_req_s *m; + struct bfi_pport_enable_req_s *m; /** * Increment message tag before queue check, so that responses to old * requests are discarded. */ - fcport->msgtag++; + port->msgtag++; /** * check for room in queue to send request now */ - m = bfa_reqq_next(fcport->bfa, BFA_REQQ_PORT); + m = bfa_reqq_next(port->bfa, BFA_REQQ_PORT); if (!m) { - bfa_reqq_wait(fcport->bfa, BFA_REQQ_PORT, - &fcport->reqq_wait); + bfa_reqq_wait(port->bfa, BFA_REQQ_PORT, &port->reqq_wait); return BFA_FALSE; } - bfi_h2i_set(m->mh, BFI_MC_FCPORT, BFI_FCPORT_H2I_ENABLE_REQ, - bfa_lpuid(fcport->bfa)); - m->nwwn = fcport->nwwn; - m->pwwn = fcport->pwwn; - m->port_cfg = fcport->cfg; - m->msgtag = fcport->msgtag; - m->port_cfg.maxfrsize = bfa_os_htons(fcport->cfg.maxfrsize); - bfa_dma_be_addr_set(m->stats_dma_addr, fcport->stats_pa); - bfa_trc(fcport->bfa, m->stats_dma_addr.a32.addr_lo); - bfa_trc(fcport->bfa, m->stats_dma_addr.a32.addr_hi); + bfi_h2i_set(m->mh, BFI_MC_FC_PORT, BFI_PPORT_H2I_ENABLE_REQ, + bfa_lpuid(port->bfa)); + m->nwwn = port->nwwn; + m->pwwn = port->pwwn; + m->port_cfg = port->cfg; + m->msgtag = port->msgtag; + m->port_cfg.maxfrsize = bfa_os_htons(port->cfg.maxfrsize); + bfa_dma_be_addr_set(m->stats_dma_addr, port->stats_pa); + bfa_trc(port->bfa, m->stats_dma_addr.a32.addr_lo); + bfa_trc(port->bfa, m->stats_dma_addr.a32.addr_hi); /** * queue I/O message to firmware */ - bfa_reqq_produce(fcport->bfa, BFA_REQQ_PORT); + bfa_reqq_produce(port->bfa, BFA_REQQ_PORT); return BFA_TRUE; } @@ -1037,226 +826,74 @@ bfa_fcport_send_enable(struct bfa_fcport_s *fcport) * Send port disable message to firmware. */ static bfa_boolean_t -bfa_fcport_send_disable(struct bfa_fcport_s *fcport) +bfa_pport_send_disable(struct bfa_pport_s *port) { - struct bfi_fcport_req_s *m; + bfi_pport_disable_req_t *m; /** * Increment message tag before queue check, so that responses to old * requests are discarded. */ - fcport->msgtag++; + port->msgtag++; /** * check for room in queue to send request now */ - m = bfa_reqq_next(fcport->bfa, BFA_REQQ_PORT); + m = bfa_reqq_next(port->bfa, BFA_REQQ_PORT); if (!m) { - bfa_reqq_wait(fcport->bfa, BFA_REQQ_PORT, - &fcport->reqq_wait); + bfa_reqq_wait(port->bfa, BFA_REQQ_PORT, &port->reqq_wait); return BFA_FALSE; } - bfi_h2i_set(m->mh, BFI_MC_FCPORT, BFI_FCPORT_H2I_DISABLE_REQ, - bfa_lpuid(fcport->bfa)); - m->msgtag = fcport->msgtag; + bfi_h2i_set(m->mh, BFI_MC_FC_PORT, BFI_PPORT_H2I_DISABLE_REQ, + bfa_lpuid(port->bfa)); + m->msgtag = port->msgtag; /** * queue I/O message to firmware */ - bfa_reqq_produce(fcport->bfa, BFA_REQQ_PORT); + bfa_reqq_produce(port->bfa, BFA_REQQ_PORT); return BFA_TRUE; } static void -bfa_fcport_set_wwns(struct bfa_fcport_s *fcport) +bfa_pport_set_wwns(struct bfa_pport_s *port) { - fcport->pwwn = bfa_ioc_get_pwwn(&fcport->bfa->ioc); - fcport->nwwn = bfa_ioc_get_nwwn(&fcport->bfa->ioc); + port->pwwn = bfa_ioc_get_pwwn(&port->bfa->ioc); + port->nwwn = bfa_ioc_get_nwwn(&port->bfa->ioc); - bfa_trc(fcport->bfa, fcport->pwwn); - bfa_trc(fcport->bfa, fcport->nwwn); + bfa_trc(port->bfa, port->pwwn); + bfa_trc(port->bfa, port->nwwn); } static void -bfa_fcport_send_txcredit(void *port_cbarg) +bfa_port_send_txcredit(void *port_cbarg) { - struct bfa_fcport_s *fcport = port_cbarg; - struct bfi_fcport_set_svc_params_req_s *m; + struct bfa_pport_s *port = port_cbarg; + struct bfi_pport_set_svc_params_req_s *m; /** * check for room in queue to send request now */ - m = bfa_reqq_next(fcport->bfa, BFA_REQQ_PORT); + m = bfa_reqq_next(port->bfa, BFA_REQQ_PORT); if (!m) { - bfa_trc(fcport->bfa, fcport->cfg.tx_bbcredit); + bfa_trc(port->bfa, port->cfg.tx_bbcredit); return; } - bfi_h2i_set(m->mh, BFI_MC_FCPORT, BFI_FCPORT_H2I_SET_SVC_PARAMS_REQ, - bfa_lpuid(fcport->bfa)); - m->tx_bbcredit = bfa_os_htons((u16) fcport->cfg.tx_bbcredit); + bfi_h2i_set(m->mh, BFI_MC_FC_PORT, BFI_PPORT_H2I_SET_SVC_PARAMS_REQ, + bfa_lpuid(port->bfa)); + m->tx_bbcredit = bfa_os_htons((u16) port->cfg.tx_bbcredit); /** * queue I/O message to firmware */ - bfa_reqq_produce(fcport->bfa, BFA_REQQ_PORT); + bfa_reqq_produce(port->bfa, BFA_REQQ_PORT); } -static void -bfa_fcport_qos_stats_swap(struct bfa_qos_stats_s *d, - struct bfa_qos_stats_s *s) -{ - u32 *dip = (u32 *) d; - u32 *sip = (u32 *) s; - int i; - - /* Now swap the 32 bit fields */ - for (i = 0; i < (sizeof(struct bfa_qos_stats_s)/sizeof(u32)); ++i) - dip[i] = bfa_os_ntohl(sip[i]); -} -static void -bfa_fcport_fcoe_stats_swap(struct bfa_fcoe_stats_s *d, - struct bfa_fcoe_stats_s *s) -{ - u32 *dip = (u32 *) d; - u32 *sip = (u32 *) s; - int i; - - for (i = 0; i < ((sizeof(struct bfa_fcoe_stats_s))/sizeof(u32)); - i = i + 2) { -#ifdef __BIGENDIAN - dip[i] = bfa_os_ntohl(sip[i]); - dip[i + 1] = bfa_os_ntohl(sip[i + 1]); -#else - dip[i] = bfa_os_ntohl(sip[i + 1]); - dip[i + 1] = bfa_os_ntohl(sip[i]); -#endif - } -} - -static void -__bfa_cb_fcport_stats_get(void *cbarg, bfa_boolean_t complete) -{ - struct bfa_fcport_s *fcport = cbarg; - - if (complete) { - if (fcport->stats_status == BFA_STATUS_OK) { - - /* Swap FC QoS or FCoE stats */ - if (bfa_ioc_get_fcmode(&fcport->bfa->ioc)) - bfa_fcport_qos_stats_swap( - &fcport->stats_ret->fcqos, - &fcport->stats->fcqos); - else - bfa_fcport_fcoe_stats_swap( - &fcport->stats_ret->fcoe, - &fcport->stats->fcoe); - } - fcport->stats_cbfn(fcport->stats_cbarg, fcport->stats_status); - } else { - fcport->stats_busy = BFA_FALSE; - fcport->stats_status = BFA_STATUS_OK; - } -} - -static void -bfa_fcport_stats_get_timeout(void *cbarg) -{ - struct bfa_fcport_s *fcport = (struct bfa_fcport_s *) cbarg; - - bfa_trc(fcport->bfa, fcport->stats_qfull); - - if (fcport->stats_qfull) { - bfa_reqq_wcancel(&fcport->stats_reqq_wait); - fcport->stats_qfull = BFA_FALSE; - } - - fcport->stats_status = BFA_STATUS_ETIMER; - bfa_cb_queue(fcport->bfa, &fcport->hcb_qe, __bfa_cb_fcport_stats_get, - fcport); -} - -static void -bfa_fcport_send_stats_get(void *cbarg) -{ - struct bfa_fcport_s *fcport = (struct bfa_fcport_s *) cbarg; - struct bfi_fcport_req_s *msg; - - msg = bfa_reqq_next(fcport->bfa, BFA_REQQ_PORT); - - if (!msg) { - fcport->stats_qfull = BFA_TRUE; - bfa_reqq_winit(&fcport->stats_reqq_wait, - bfa_fcport_send_stats_get, fcport); - bfa_reqq_wait(fcport->bfa, BFA_REQQ_PORT, - &fcport->stats_reqq_wait); - return; - } - fcport->stats_qfull = BFA_FALSE; - - bfa_os_memset(msg, 0, sizeof(struct bfi_fcport_req_s)); - bfi_h2i_set(msg->mh, BFI_MC_FCPORT, BFI_FCPORT_H2I_STATS_GET_REQ, - bfa_lpuid(fcport->bfa)); - bfa_reqq_produce(fcport->bfa, BFA_REQQ_PORT); -} - -static void -__bfa_cb_fcport_stats_clr(void *cbarg, bfa_boolean_t complete) -{ - struct bfa_fcport_s *fcport = cbarg; - - if (complete) { - fcport->stats_cbfn(fcport->stats_cbarg, fcport->stats_status); - } else { - fcport->stats_busy = BFA_FALSE; - fcport->stats_status = BFA_STATUS_OK; - } -} - -static void -bfa_fcport_stats_clr_timeout(void *cbarg) -{ - struct bfa_fcport_s *fcport = (struct bfa_fcport_s *) cbarg; - - bfa_trc(fcport->bfa, fcport->stats_qfull); - - if (fcport->stats_qfull) { - bfa_reqq_wcancel(&fcport->stats_reqq_wait); - fcport->stats_qfull = BFA_FALSE; - } - - fcport->stats_status = BFA_STATUS_ETIMER; - bfa_cb_queue(fcport->bfa, &fcport->hcb_qe, - __bfa_cb_fcport_stats_clr, fcport); -} - -static void -bfa_fcport_send_stats_clear(void *cbarg) -{ - struct bfa_fcport_s *fcport = (struct bfa_fcport_s *) cbarg; - struct bfi_fcport_req_s *msg; - - msg = bfa_reqq_next(fcport->bfa, BFA_REQQ_PORT); - - if (!msg) { - fcport->stats_qfull = BFA_TRUE; - bfa_reqq_winit(&fcport->stats_reqq_wait, - bfa_fcport_send_stats_clear, fcport); - bfa_reqq_wait(fcport->bfa, BFA_REQQ_PORT, - &fcport->stats_reqq_wait); - return; - } - fcport->stats_qfull = BFA_FALSE; - - bfa_os_memset(msg, 0, sizeof(struct bfi_fcport_req_s)); - bfi_h2i_set(msg->mh, BFI_MC_FCPORT, BFI_FCPORT_H2I_STATS_CLEAR_REQ, - bfa_lpuid(fcport->bfa)); - bfa_reqq_produce(fcport->bfa, BFA_REQQ_PORT); -} /** * bfa_pport_public @@ -1266,32 +903,32 @@ bfa_fcport_send_stats_clear(void *cbarg) * Firmware message handler. */ void -bfa_fcport_isr(struct bfa_s *bfa, struct bfi_msg_s *msg) +bfa_pport_isr(struct bfa_s *bfa, struct bfi_msg_s *msg) { - struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); - union bfi_fcport_i2h_msg_u i2hmsg; + struct bfa_pport_s *pport = BFA_PORT_MOD(bfa); + union bfi_pport_i2h_msg_u i2hmsg; i2hmsg.msg = msg; - fcport->event_arg.i2hmsg = i2hmsg; + pport->event_arg.i2hmsg = i2hmsg; switch (msg->mhdr.msg_id) { - case BFI_FCPORT_I2H_ENABLE_RSP: - if (fcport->msgtag == i2hmsg.penable_rsp->msgtag) - bfa_sm_send_event(fcport, BFA_FCPORT_SM_FWRSP); + case BFI_PPORT_I2H_ENABLE_RSP: + if (pport->msgtag == i2hmsg.enable_rsp->msgtag) + bfa_sm_send_event(pport, BFA_PPORT_SM_FWRSP); break; - case BFI_FCPORT_I2H_DISABLE_RSP: - if (fcport->msgtag == i2hmsg.penable_rsp->msgtag) - bfa_sm_send_event(fcport, BFA_FCPORT_SM_FWRSP); + case BFI_PPORT_I2H_DISABLE_RSP: + if (pport->msgtag == i2hmsg.enable_rsp->msgtag) + bfa_sm_send_event(pport, BFA_PPORT_SM_FWRSP); break; - case BFI_FCPORT_I2H_EVENT: + case BFI_PPORT_I2H_EVENT: switch (i2hmsg.event->link_state.linkstate) { case BFA_PPORT_LINKUP: - bfa_sm_send_event(fcport, BFA_FCPORT_SM_LINKUP); + bfa_sm_send_event(pport, BFA_PPORT_SM_LINKUP); break; case BFA_PPORT_LINKDOWN: - bfa_sm_send_event(fcport, BFA_FCPORT_SM_LINKDOWN); + bfa_sm_send_event(pport, BFA_PPORT_SM_LINKDOWN); break; case BFA_PPORT_TRUNK_LINKDOWN: /** todo: event notification */ @@ -1299,40 +936,42 @@ bfa_fcport_isr(struct bfa_s *bfa, struct bfi_msg_s *msg) } break; - case BFI_FCPORT_I2H_STATS_GET_RSP: + case BFI_PPORT_I2H_GET_STATS_RSP: + case BFI_PPORT_I2H_GET_QOS_STATS_RSP: /* * check for timer pop before processing the rsp */ - if (fcport->stats_busy == BFA_FALSE || - fcport->stats_status == BFA_STATUS_ETIMER) + if (pport->stats_busy == BFA_FALSE + || pport->stats_status == BFA_STATUS_ETIMER) break; - bfa_timer_stop(&fcport->timer); - fcport->stats_status = i2hmsg.pstatsget_rsp->status; - bfa_cb_queue(fcport->bfa, &fcport->hcb_qe, - __bfa_cb_fcport_stats_get, fcport); + bfa_timer_stop(&pport->timer); + pport->stats_status = i2hmsg.getstats_rsp->status; + bfa_cb_queue(pport->bfa, &pport->hcb_qe, __bfa_cb_port_stats, + pport); break; - - case BFI_FCPORT_I2H_STATS_CLEAR_RSP: + case BFI_PPORT_I2H_CLEAR_STATS_RSP: + case BFI_PPORT_I2H_CLEAR_QOS_STATS_RSP: /* * check for timer pop before processing the rsp */ - if (fcport->stats_busy == BFA_FALSE || - fcport->stats_status == BFA_STATUS_ETIMER) + if (pport->stats_busy == BFA_FALSE + || pport->stats_status == BFA_STATUS_ETIMER) break; - bfa_timer_stop(&fcport->timer); - fcport->stats_status = BFA_STATUS_OK; - bfa_cb_queue(fcport->bfa, &fcport->hcb_qe, - __bfa_cb_fcport_stats_clr, fcport); + bfa_timer_stop(&pport->timer); + pport->stats_status = BFA_STATUS_OK; + bfa_cb_queue(pport->bfa, &pport->hcb_qe, + __bfa_cb_port_stats_clr, pport); break; default: bfa_assert(0); - break; } } + + /** * bfa_pport_api */ @@ -1341,35 +980,35 @@ bfa_fcport_isr(struct bfa_s *bfa, struct bfi_msg_s *msg) * Registered callback for port events. */ void -bfa_fcport_event_register(struct bfa_s *bfa, +bfa_pport_event_register(struct bfa_s *bfa, void (*cbfn) (void *cbarg, bfa_pport_event_t event), void *cbarg) { - struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); + struct bfa_pport_s *pport = BFA_PORT_MOD(bfa); - fcport->event_cbfn = cbfn; - fcport->event_cbarg = cbarg; + pport->event_cbfn = cbfn; + pport->event_cbarg = cbarg; } bfa_status_t -bfa_fcport_enable(struct bfa_s *bfa) +bfa_pport_enable(struct bfa_s *bfa) { - struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); + struct bfa_pport_s *pport = BFA_PORT_MOD(bfa); - if (fcport->diag_busy) + if (pport->diag_busy) return BFA_STATUS_DIAG_BUSY; else if (bfa_sm_cmp_state - (BFA_FCPORT_MOD(bfa), bfa_fcport_sm_disabling_qwait)) + (BFA_PORT_MOD(bfa), bfa_pport_sm_disabling_qwait)) return BFA_STATUS_DEVBUSY; - bfa_sm_send_event(BFA_FCPORT_MOD(bfa), BFA_FCPORT_SM_ENABLE); + bfa_sm_send_event(BFA_PORT_MOD(bfa), BFA_PPORT_SM_ENABLE); return BFA_STATUS_OK; } bfa_status_t -bfa_fcport_disable(struct bfa_s *bfa) +bfa_pport_disable(struct bfa_s *bfa) { - bfa_sm_send_event(BFA_FCPORT_MOD(bfa), BFA_FCPORT_SM_DISABLE); + bfa_sm_send_event(BFA_PORT_MOD(bfa), BFA_PPORT_SM_DISABLE); return BFA_STATUS_OK; } @@ -1377,18 +1016,18 @@ bfa_fcport_disable(struct bfa_s *bfa) * Configure port speed. */ bfa_status_t -bfa_fcport_cfg_speed(struct bfa_s *bfa, enum bfa_pport_speed speed) +bfa_pport_cfg_speed(struct bfa_s *bfa, enum bfa_pport_speed speed) { - struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); + struct bfa_pport_s *pport = BFA_PORT_MOD(bfa); bfa_trc(bfa, speed); - if ((speed != BFA_PPORT_SPEED_AUTO) && (speed > fcport->speed_sup)) { - bfa_trc(bfa, fcport->speed_sup); + if ((speed != BFA_PPORT_SPEED_AUTO) && (speed > pport->speed_sup)) { + bfa_trc(bfa, pport->speed_sup); return BFA_STATUS_UNSUPP_SPEED; } - fcport->cfg.speed = speed; + pport->cfg.speed = speed; return BFA_STATUS_OK; } @@ -1397,23 +1036,23 @@ bfa_fcport_cfg_speed(struct bfa_s *bfa, enum bfa_pport_speed speed) * Get current speed. */ enum bfa_pport_speed -bfa_fcport_get_speed(struct bfa_s *bfa) +bfa_pport_get_speed(struct bfa_s *bfa) { - struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); + struct bfa_pport_s *port = BFA_PORT_MOD(bfa); - return fcport->speed; + return port->speed; } /** * Configure port topology. */ bfa_status_t -bfa_fcport_cfg_topology(struct bfa_s *bfa, enum bfa_pport_topology topology) +bfa_pport_cfg_topology(struct bfa_s *bfa, enum bfa_pport_topology topology) { - struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); + struct bfa_pport_s *pport = BFA_PORT_MOD(bfa); bfa_trc(bfa, topology); - bfa_trc(bfa, fcport->cfg.topology); + bfa_trc(bfa, pport->cfg.topology); switch (topology) { case BFA_PPORT_TOPOLOGY_P2P: @@ -1425,7 +1064,7 @@ bfa_fcport_cfg_topology(struct bfa_s *bfa, enum bfa_pport_topology topology) return BFA_STATUS_EINVAL; } - fcport->cfg.topology = topology; + pport->cfg.topology = topology; return BFA_STATUS_OK; } @@ -1433,64 +1072,64 @@ bfa_fcport_cfg_topology(struct bfa_s *bfa, enum bfa_pport_topology topology) * Get current topology. */ enum bfa_pport_topology -bfa_fcport_get_topology(struct bfa_s *bfa) +bfa_pport_get_topology(struct bfa_s *bfa) { - struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); + struct bfa_pport_s *port = BFA_PORT_MOD(bfa); - return fcport->topology; + return port->topology; } bfa_status_t -bfa_fcport_cfg_hardalpa(struct bfa_s *bfa, u8 alpa) +bfa_pport_cfg_hardalpa(struct bfa_s *bfa, u8 alpa) { - struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); + struct bfa_pport_s *pport = BFA_PORT_MOD(bfa); bfa_trc(bfa, alpa); - bfa_trc(bfa, fcport->cfg.cfg_hardalpa); - bfa_trc(bfa, fcport->cfg.hardalpa); + bfa_trc(bfa, pport->cfg.cfg_hardalpa); + bfa_trc(bfa, pport->cfg.hardalpa); - fcport->cfg.cfg_hardalpa = BFA_TRUE; - fcport->cfg.hardalpa = alpa; + pport->cfg.cfg_hardalpa = BFA_TRUE; + pport->cfg.hardalpa = alpa; return BFA_STATUS_OK; } bfa_status_t -bfa_fcport_clr_hardalpa(struct bfa_s *bfa) +bfa_pport_clr_hardalpa(struct bfa_s *bfa) { - struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); + struct bfa_pport_s *pport = BFA_PORT_MOD(bfa); - bfa_trc(bfa, fcport->cfg.cfg_hardalpa); - bfa_trc(bfa, fcport->cfg.hardalpa); + bfa_trc(bfa, pport->cfg.cfg_hardalpa); + bfa_trc(bfa, pport->cfg.hardalpa); - fcport->cfg.cfg_hardalpa = BFA_FALSE; + pport->cfg.cfg_hardalpa = BFA_FALSE; return BFA_STATUS_OK; } bfa_boolean_t -bfa_fcport_get_hardalpa(struct bfa_s *bfa, u8 *alpa) +bfa_pport_get_hardalpa(struct bfa_s *bfa, u8 *alpa) { - struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); + struct bfa_pport_s *port = BFA_PORT_MOD(bfa); - *alpa = fcport->cfg.hardalpa; - return fcport->cfg.cfg_hardalpa; + *alpa = port->cfg.hardalpa; + return port->cfg.cfg_hardalpa; } u8 -bfa_fcport_get_myalpa(struct bfa_s *bfa) +bfa_pport_get_myalpa(struct bfa_s *bfa) { - struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); + struct bfa_pport_s *port = BFA_PORT_MOD(bfa); - return fcport->myalpa; + return port->myalpa; } bfa_status_t -bfa_fcport_cfg_maxfrsize(struct bfa_s *bfa, u16 maxfrsize) +bfa_pport_cfg_maxfrsize(struct bfa_s *bfa, u16 maxfrsize) { - struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); + struct bfa_pport_s *pport = BFA_PORT_MOD(bfa); bfa_trc(bfa, maxfrsize); - bfa_trc(bfa, fcport->cfg.maxfrsize); + bfa_trc(bfa, pport->cfg.maxfrsize); /* * with in range @@ -1504,41 +1143,41 @@ bfa_fcport_cfg_maxfrsize(struct bfa_s *bfa, u16 maxfrsize) if ((maxfrsize != FC_MAX_PDUSZ) && (maxfrsize & (maxfrsize - 1))) return BFA_STATUS_INVLD_DFSZ; - fcport->cfg.maxfrsize = maxfrsize; + pport->cfg.maxfrsize = maxfrsize; return BFA_STATUS_OK; } u16 -bfa_fcport_get_maxfrsize(struct bfa_s *bfa) +bfa_pport_get_maxfrsize(struct bfa_s *bfa) { - struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); + struct bfa_pport_s *port = BFA_PORT_MOD(bfa); - return fcport->cfg.maxfrsize; + return port->cfg.maxfrsize; } u32 -bfa_fcport_mypid(struct bfa_s *bfa) +bfa_pport_mypid(struct bfa_s *bfa) { - struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); + struct bfa_pport_s *port = BFA_PORT_MOD(bfa); - return fcport->mypid; + return port->mypid; } u8 -bfa_fcport_get_rx_bbcredit(struct bfa_s *bfa) +bfa_pport_get_rx_bbcredit(struct bfa_s *bfa) { - struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); + struct bfa_pport_s *port = BFA_PORT_MOD(bfa); - return fcport->cfg.rx_bbcredit; + return port->cfg.rx_bbcredit; } void -bfa_fcport_set_tx_bbcredit(struct bfa_s *bfa, u16 tx_bbcredit) +bfa_pport_set_tx_bbcredit(struct bfa_s *bfa, u16 tx_bbcredit) { - struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); + struct bfa_pport_s *port = BFA_PORT_MOD(bfa); - fcport->cfg.tx_bbcredit = (u8) tx_bbcredit; - bfa_fcport_send_txcredit(fcport); + port->cfg.tx_bbcredit = (u8) tx_bbcredit; + bfa_port_send_txcredit(port); } /** @@ -1546,192 +1185,302 @@ bfa_fcport_set_tx_bbcredit(struct bfa_s *bfa, u16 tx_bbcredit) */ wwn_t -bfa_fcport_get_wwn(struct bfa_s *bfa, bfa_boolean_t node) +bfa_pport_get_wwn(struct bfa_s *bfa, bfa_boolean_t node) { - struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); + struct bfa_pport_s *pport = BFA_PORT_MOD(bfa); if (node) - return fcport->nwwn; + return pport->nwwn; else - return fcport->pwwn; + return pport->pwwn; } void -bfa_fcport_get_attr(struct bfa_s *bfa, struct bfa_pport_attr_s *attr) +bfa_pport_get_attr(struct bfa_s *bfa, struct bfa_pport_attr_s *attr) { - struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); + struct bfa_pport_s *pport = BFA_PORT_MOD(bfa); bfa_os_memset(attr, 0, sizeof(struct bfa_pport_attr_s)); - attr->nwwn = fcport->nwwn; - attr->pwwn = fcport->pwwn; + attr->nwwn = pport->nwwn; + attr->pwwn = pport->pwwn; - bfa_os_memcpy(&attr->pport_cfg, &fcport->cfg, + bfa_os_memcpy(&attr->pport_cfg, &pport->cfg, sizeof(struct bfa_pport_cfg_s)); /* * speed attributes */ - attr->pport_cfg.speed = fcport->cfg.speed; - attr->speed_supported = fcport->speed_sup; - attr->speed = fcport->speed; + attr->pport_cfg.speed = pport->cfg.speed; + attr->speed_supported = pport->speed_sup; + attr->speed = pport->speed; attr->cos_supported = FC_CLASS_3; /* * topology attributes */ - attr->pport_cfg.topology = fcport->cfg.topology; - attr->topology = fcport->topology; + attr->pport_cfg.topology = pport->cfg.topology; + attr->topology = pport->topology; /* * beacon attributes */ - attr->beacon = fcport->beacon; - attr->link_e2e_beacon = fcport->link_e2e_beacon; - attr->plog_enabled = bfa_plog_get_setting(fcport->bfa->plog); + attr->beacon = pport->beacon; + attr->link_e2e_beacon = pport->link_e2e_beacon; + attr->plog_enabled = bfa_plog_get_setting(pport->bfa->plog); attr->pport_cfg.path_tov = bfa_fcpim_path_tov_get(bfa); attr->pport_cfg.q_depth = bfa_fcpim_qdepth_get(bfa); - attr->port_state = bfa_sm_to_state(hal_pport_sm_table, fcport->sm); - if (bfa_ioc_is_disabled(&fcport->bfa->ioc)) + attr->port_state = bfa_sm_to_state(hal_pport_sm_table, pport->sm); + if (bfa_ioc_is_disabled(&pport->bfa->ioc)) attr->port_state = BFA_PPORT_ST_IOCDIS; - else if (bfa_ioc_fw_mismatch(&fcport->bfa->ioc)) + else if (bfa_ioc_fw_mismatch(&pport->bfa->ioc)) attr->port_state = BFA_PPORT_ST_FWMISMATCH; } -#define BFA_FCPORT_STATS_TOV 1000 +static void +bfa_port_stats_query(void *cbarg) +{ + struct bfa_pport_s *port = (struct bfa_pport_s *)cbarg; + bfi_pport_get_stats_req_t *msg; -/** - * Fetch port attributes (FCQoS or FCoE). - */ -bfa_status_t -bfa_fcport_get_stats(struct bfa_s *bfa, union bfa_fcport_stats_u *stats, - bfa_cb_pport_t cbfn, void *cbarg) + msg = bfa_reqq_next(port->bfa, BFA_REQQ_PORT); + + if (!msg) { + port->stats_qfull = BFA_TRUE; + bfa_reqq_winit(&port->stats_reqq_wait, bfa_port_stats_query, + port); + bfa_reqq_wait(port->bfa, BFA_REQQ_PORT, &port->stats_reqq_wait); + return; + } + port->stats_qfull = BFA_FALSE; + + bfa_os_memset(msg, 0, sizeof(bfi_pport_get_stats_req_t)); + bfi_h2i_set(msg->mh, BFI_MC_FC_PORT, BFI_PPORT_H2I_GET_STATS_REQ, + bfa_lpuid(port->bfa)); + bfa_reqq_produce(port->bfa, BFA_REQQ_PORT); + + return; +} + +static void +bfa_port_stats_clear(void *cbarg) { - struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); + struct bfa_pport_s *port = (struct bfa_pport_s *)cbarg; + bfi_pport_clear_stats_req_t *msg; - if (fcport->stats_busy) { - bfa_trc(bfa, fcport->stats_busy); - return BFA_STATUS_DEVBUSY; + msg = bfa_reqq_next(port->bfa, BFA_REQQ_PORT); + + if (!msg) { + port->stats_qfull = BFA_TRUE; + bfa_reqq_winit(&port->stats_reqq_wait, bfa_port_stats_clear, + port); + bfa_reqq_wait(port->bfa, BFA_REQQ_PORT, &port->stats_reqq_wait); + return; } + port->stats_qfull = BFA_FALSE; - fcport->stats_busy = BFA_TRUE; - fcport->stats_ret = stats; - fcport->stats_cbfn = cbfn; - fcport->stats_cbarg = cbarg; + bfa_os_memset(msg, 0, sizeof(bfi_pport_clear_stats_req_t)); + bfi_h2i_set(msg->mh, BFI_MC_FC_PORT, BFI_PPORT_H2I_CLEAR_STATS_REQ, + bfa_lpuid(port->bfa)); + bfa_reqq_produce(port->bfa, BFA_REQQ_PORT); + return; +} - bfa_fcport_send_stats_get(fcport); +static void +bfa_port_qos_stats_clear(void *cbarg) +{ + struct bfa_pport_s *port = (struct bfa_pport_s *)cbarg; + bfi_pport_clear_qos_stats_req_t *msg; - bfa_timer_start(bfa, &fcport->timer, bfa_fcport_stats_get_timeout, - fcport, BFA_FCPORT_STATS_TOV); - return BFA_STATUS_OK; + msg = bfa_reqq_next(port->bfa, BFA_REQQ_PORT); + + if (!msg) { + port->stats_qfull = BFA_TRUE; + bfa_reqq_winit(&port->stats_reqq_wait, bfa_port_qos_stats_clear, + port); + bfa_reqq_wait(port->bfa, BFA_REQQ_PORT, &port->stats_reqq_wait); + return; + } + port->stats_qfull = BFA_FALSE; + + bfa_os_memset(msg, 0, sizeof(bfi_pport_clear_qos_stats_req_t)); + bfi_h2i_set(msg->mh, BFI_MC_FC_PORT, BFI_PPORT_H2I_CLEAR_QOS_STATS_REQ, + bfa_lpuid(port->bfa)); + bfa_reqq_produce(port->bfa, BFA_REQQ_PORT); + return; } -/** - * Reset port statistics (FCQoS or FCoE). - */ -bfa_status_t -bfa_fcport_clear_stats(struct bfa_s *bfa, bfa_cb_pport_t cbfn, void *cbarg) +static void +bfa_pport_stats_swap(union bfa_pport_stats_u *d, union bfa_pport_stats_u *s) +{ + u32 *dip = (u32 *) d; + u32 *sip = (u32 *) s; + int i; + + /* + * Do 64 bit fields swap first + */ + for (i = 0; + i < + ((sizeof(union bfa_pport_stats_u) - + sizeof(struct bfa_qos_stats_s)) / sizeof(u32)); i = i + 2) { +#ifdef __BIGENDIAN + dip[i] = bfa_os_ntohl(sip[i]); + dip[i + 1] = bfa_os_ntohl(sip[i + 1]); +#else + dip[i] = bfa_os_ntohl(sip[i + 1]); + dip[i + 1] = bfa_os_ntohl(sip[i]); +#endif + } + + /* + * Now swap the 32 bit fields + */ + for (; i < (sizeof(union bfa_pport_stats_u) / sizeof(u32)); ++i) + dip[i] = bfa_os_ntohl(sip[i]); +} + +static void +__bfa_cb_port_stats_clr(void *cbarg, bfa_boolean_t complete) { - struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); + struct bfa_pport_s *port = cbarg; - if (fcport->stats_busy) { - bfa_trc(bfa, fcport->stats_busy); - return BFA_STATUS_DEVBUSY; + if (complete) { + port->stats_cbfn(port->stats_cbarg, port->stats_status); + } else { + port->stats_busy = BFA_FALSE; + port->stats_status = BFA_STATUS_OK; } +} + +static void +bfa_port_stats_clr_timeout(void *cbarg) +{ + struct bfa_pport_s *port = (struct bfa_pport_s *)cbarg; - fcport->stats_busy = BFA_TRUE; - fcport->stats_cbfn = cbfn; - fcport->stats_cbarg = cbarg; + bfa_trc(port->bfa, port->stats_qfull); - bfa_fcport_send_stats_clear(fcport); + if (port->stats_qfull) { + bfa_reqq_wcancel(&port->stats_reqq_wait); + port->stats_qfull = BFA_FALSE; + } - bfa_timer_start(bfa, &fcport->timer, bfa_fcport_stats_clr_timeout, - fcport, BFA_FCPORT_STATS_TOV); - return BFA_STATUS_OK; + port->stats_status = BFA_STATUS_ETIMER; + bfa_cb_queue(port->bfa, &port->hcb_qe, __bfa_cb_port_stats_clr, port); } -/** - * Fetch FCQoS port statistics - */ -bfa_status_t -bfa_fcport_get_qos_stats(struct bfa_s *bfa, union bfa_fcport_stats_u *stats, - bfa_cb_pport_t cbfn, void *cbarg) +static void +__bfa_cb_port_stats(void *cbarg, bfa_boolean_t complete) { - /* Meaningful only for FC mode */ - bfa_assert(bfa_ioc_get_fcmode(&bfa->ioc)); + struct bfa_pport_s *port = cbarg; - return bfa_fcport_get_stats(bfa, stats, cbfn, cbarg); + if (complete) { + if (port->stats_status == BFA_STATUS_OK) + bfa_pport_stats_swap(port->stats_ret, port->stats); + port->stats_cbfn(port->stats_cbarg, port->stats_status); + } else { + port->stats_busy = BFA_FALSE; + port->stats_status = BFA_STATUS_OK; + } } -/** - * Reset FCoE port statistics - */ -bfa_status_t -bfa_fcport_clear_qos_stats(struct bfa_s *bfa, bfa_cb_pport_t cbfn, void *cbarg) +static void +bfa_port_stats_timeout(void *cbarg) { - /* Meaningful only for FC mode */ - bfa_assert(bfa_ioc_get_fcmode(&bfa->ioc)); + struct bfa_pport_s *port = (struct bfa_pport_s *)cbarg; + + bfa_trc(port->bfa, port->stats_qfull); - return bfa_fcport_clear_stats(bfa, cbfn, cbarg); + if (port->stats_qfull) { + bfa_reqq_wcancel(&port->stats_reqq_wait); + port->stats_qfull = BFA_FALSE; + } + + port->stats_status = BFA_STATUS_ETIMER; + bfa_cb_queue(port->bfa, &port->hcb_qe, __bfa_cb_port_stats, port); } +#define BFA_PORT_STATS_TOV 1000 + /** - * Fetch FCQoS port statistics + * Fetch port attributes. */ bfa_status_t -bfa_fcport_get_fcoe_stats(struct bfa_s *bfa, union bfa_fcport_stats_u *stats, - bfa_cb_pport_t cbfn, void *cbarg) +bfa_pport_get_stats(struct bfa_s *bfa, union bfa_pport_stats_u *stats, + bfa_cb_pport_t cbfn, void *cbarg) { - /* Meaningful only for FCoE mode */ - bfa_assert(!bfa_ioc_get_fcmode(&bfa->ioc)); + struct bfa_pport_s *port = BFA_PORT_MOD(bfa); + + if (port->stats_busy) { + bfa_trc(bfa, port->stats_busy); + return BFA_STATUS_DEVBUSY; + } + + port->stats_busy = BFA_TRUE; + port->stats_ret = stats; + port->stats_cbfn = cbfn; + port->stats_cbarg = cbarg; + + bfa_port_stats_query(port); - return bfa_fcport_get_stats(bfa, stats, cbfn, cbarg); + bfa_timer_start(bfa, &port->timer, bfa_port_stats_timeout, port, + BFA_PORT_STATS_TOV); + return BFA_STATUS_OK; } -/** - * Reset FCoE port statistics - */ bfa_status_t -bfa_fcport_clear_fcoe_stats(struct bfa_s *bfa, bfa_cb_pport_t cbfn, void *cbarg) +bfa_pport_clear_stats(struct bfa_s *bfa, bfa_cb_pport_t cbfn, void *cbarg) { - /* Meaningful only for FCoE mode */ - bfa_assert(!bfa_ioc_get_fcmode(&bfa->ioc)); + struct bfa_pport_s *port = BFA_PORT_MOD(bfa); + + if (port->stats_busy) { + bfa_trc(bfa, port->stats_busy); + return BFA_STATUS_DEVBUSY; + } + + port->stats_busy = BFA_TRUE; + port->stats_cbfn = cbfn; + port->stats_cbarg = cbarg; + + bfa_port_stats_clear(port); - return bfa_fcport_clear_stats(bfa, cbfn, cbarg); + bfa_timer_start(bfa, &port->timer, bfa_port_stats_clr_timeout, port, + BFA_PORT_STATS_TOV); + return BFA_STATUS_OK; } bfa_status_t -bfa_fcport_trunk_enable(struct bfa_s *bfa, u8 bitmap) +bfa_pport_trunk_enable(struct bfa_s *bfa, u8 bitmap) { - struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); + struct bfa_pport_s *pport = BFA_PORT_MOD(bfa); bfa_trc(bfa, bitmap); - bfa_trc(bfa, fcport->cfg.trunked); - bfa_trc(bfa, fcport->cfg.trunk_ports); + bfa_trc(bfa, pport->cfg.trunked); + bfa_trc(bfa, pport->cfg.trunk_ports); if (!bitmap || (bitmap & (bitmap - 1))) return BFA_STATUS_EINVAL; - fcport->cfg.trunked = BFA_TRUE; - fcport->cfg.trunk_ports = bitmap; + pport->cfg.trunked = BFA_TRUE; + pport->cfg.trunk_ports = bitmap; return BFA_STATUS_OK; } void -bfa_fcport_qos_get_attr(struct bfa_s *bfa, struct bfa_qos_attr_s *qos_attr) +bfa_pport_qos_get_attr(struct bfa_s *bfa, struct bfa_qos_attr_s *qos_attr) { - struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); + struct bfa_pport_s *pport = BFA_PORT_MOD(bfa); - qos_attr->state = bfa_os_ntohl(fcport->qos_attr.state); - qos_attr->total_bb_cr = bfa_os_ntohl(fcport->qos_attr.total_bb_cr); + qos_attr->state = bfa_os_ntohl(pport->qos_attr.state); + qos_attr->total_bb_cr = bfa_os_ntohl(pport->qos_attr.total_bb_cr); } void -bfa_fcport_qos_get_vc_attr(struct bfa_s *bfa, +bfa_pport_qos_get_vc_attr(struct bfa_s *bfa, struct bfa_qos_vc_attr_s *qos_vc_attr) { - struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); - struct bfa_qos_vc_attr_s *bfa_vc_attr = &fcport->qos_vc_attr; + struct bfa_pport_s *pport = BFA_PORT_MOD(bfa); + struct bfa_qos_vc_attr_s *bfa_vc_attr = &pport->qos_vc_attr; u32 i = 0; qos_vc_attr->total_vc_count = bfa_os_ntohs(bfa_vc_attr->total_vc_count); @@ -1753,90 +1502,120 @@ bfa_fcport_qos_get_vc_attr(struct bfa_s *bfa, } } +/** + * Fetch QoS Stats. + */ +bfa_status_t +bfa_pport_get_qos_stats(struct bfa_s *bfa, union bfa_pport_stats_u *stats, + bfa_cb_pport_t cbfn, void *cbarg) +{ + /* + * QoS stats is embedded in port stats + */ + return bfa_pport_get_stats(bfa, stats, cbfn, cbarg); +} + +bfa_status_t +bfa_pport_clear_qos_stats(struct bfa_s *bfa, bfa_cb_pport_t cbfn, void *cbarg) +{ + struct bfa_pport_s *port = BFA_PORT_MOD(bfa); + + if (port->stats_busy) { + bfa_trc(bfa, port->stats_busy); + return BFA_STATUS_DEVBUSY; + } + + port->stats_busy = BFA_TRUE; + port->stats_cbfn = cbfn; + port->stats_cbarg = cbarg; + + bfa_port_qos_stats_clear(port); + + bfa_timer_start(bfa, &port->timer, bfa_port_stats_clr_timeout, port, + BFA_PORT_STATS_TOV); + return BFA_STATUS_OK; +} + /** * Fetch port attributes. */ bfa_status_t -bfa_fcport_trunk_disable(struct bfa_s *bfa) +bfa_pport_trunk_disable(struct bfa_s *bfa) { return BFA_STATUS_OK; } bfa_boolean_t -bfa_fcport_trunk_query(struct bfa_s *bfa, u32 *bitmap) +bfa_pport_trunk_query(struct bfa_s *bfa, u32 *bitmap) { - struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); + struct bfa_pport_s *port = BFA_PORT_MOD(bfa); - *bitmap = fcport->cfg.trunk_ports; - return fcport->cfg.trunked; + *bitmap = port->cfg.trunk_ports; + return port->cfg.trunked; } bfa_boolean_t -bfa_fcport_is_disabled(struct bfa_s *bfa) +bfa_pport_is_disabled(struct bfa_s *bfa) { - struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); + struct bfa_pport_s *port = BFA_PORT_MOD(bfa); - return bfa_sm_to_state(hal_pport_sm_table, fcport->sm) == + return bfa_sm_to_state(hal_pport_sm_table, port->sm) == BFA_PPORT_ST_DISABLED; } bfa_boolean_t -bfa_fcport_is_ratelim(struct bfa_s *bfa) +bfa_pport_is_ratelim(struct bfa_s *bfa) { - struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); + struct bfa_pport_s *pport = BFA_PORT_MOD(bfa); - return fcport->cfg.ratelimit ? BFA_TRUE : BFA_FALSE; + return pport->cfg.ratelimit ? BFA_TRUE : BFA_FALSE; } void -bfa_fcport_cfg_qos(struct bfa_s *bfa, bfa_boolean_t on_off) +bfa_pport_cfg_qos(struct bfa_s *bfa, bfa_boolean_t on_off) { - struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); - enum bfa_ioc_type_e ioc_type = bfa_get_type(bfa); + struct bfa_pport_s *pport = BFA_PORT_MOD(bfa); bfa_trc(bfa, on_off); - bfa_trc(bfa, fcport->cfg.qos_enabled); - - bfa_trc(bfa, ioc_type); + bfa_trc(bfa, pport->cfg.qos_enabled); - if (ioc_type == BFA_IOC_TYPE_FC) - fcport->cfg.qos_enabled = on_off; + pport->cfg.qos_enabled = on_off; } void -bfa_fcport_cfg_ratelim(struct bfa_s *bfa, bfa_boolean_t on_off) +bfa_pport_cfg_ratelim(struct bfa_s *bfa, bfa_boolean_t on_off) { - struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); + struct bfa_pport_s *pport = BFA_PORT_MOD(bfa); bfa_trc(bfa, on_off); - bfa_trc(bfa, fcport->cfg.ratelimit); + bfa_trc(bfa, pport->cfg.ratelimit); - fcport->cfg.ratelimit = on_off; - if (fcport->cfg.trl_def_speed == BFA_PPORT_SPEED_UNKNOWN) - fcport->cfg.trl_def_speed = BFA_PPORT_SPEED_1GBPS; + pport->cfg.ratelimit = on_off; + if (pport->cfg.trl_def_speed == BFA_PPORT_SPEED_UNKNOWN) + pport->cfg.trl_def_speed = BFA_PPORT_SPEED_1GBPS; } /** * Configure default minimum ratelim speed */ bfa_status_t -bfa_fcport_cfg_ratelim_speed(struct bfa_s *bfa, enum bfa_pport_speed speed) +bfa_pport_cfg_ratelim_speed(struct bfa_s *bfa, enum bfa_pport_speed speed) { - struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); + struct bfa_pport_s *pport = BFA_PORT_MOD(bfa); bfa_trc(bfa, speed); /* * Auto and speeds greater than the supported speed, are invalid */ - if ((speed == BFA_PPORT_SPEED_AUTO) || (speed > fcport->speed_sup)) { - bfa_trc(bfa, fcport->speed_sup); + if ((speed == BFA_PPORT_SPEED_AUTO) || (speed > pport->speed_sup)) { + bfa_trc(bfa, pport->speed_sup); return BFA_STATUS_UNSUPP_SPEED; } - fcport->cfg.trl_def_speed = speed; + pport->cfg.trl_def_speed = speed; return BFA_STATUS_OK; } @@ -1845,45 +1624,45 @@ bfa_fcport_cfg_ratelim_speed(struct bfa_s *bfa, enum bfa_pport_speed speed) * Get default minimum ratelim speed */ enum bfa_pport_speed -bfa_fcport_get_ratelim_speed(struct bfa_s *bfa) +bfa_pport_get_ratelim_speed(struct bfa_s *bfa) { - struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); + struct bfa_pport_s *pport = BFA_PORT_MOD(bfa); - bfa_trc(bfa, fcport->cfg.trl_def_speed); - return fcport->cfg.trl_def_speed; + bfa_trc(bfa, pport->cfg.trl_def_speed); + return pport->cfg.trl_def_speed; } void -bfa_fcport_busy(struct bfa_s *bfa, bfa_boolean_t status) +bfa_pport_busy(struct bfa_s *bfa, bfa_boolean_t status) { - struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); + struct bfa_pport_s *pport = BFA_PORT_MOD(bfa); bfa_trc(bfa, status); - bfa_trc(bfa, fcport->diag_busy); + bfa_trc(bfa, pport->diag_busy); - fcport->diag_busy = status; + pport->diag_busy = status; } void -bfa_fcport_beacon(struct bfa_s *bfa, bfa_boolean_t beacon, +bfa_pport_beacon(struct bfa_s *bfa, bfa_boolean_t beacon, bfa_boolean_t link_e2e_beacon) { - struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(bfa); + struct bfa_pport_s *pport = BFA_PORT_MOD(bfa); bfa_trc(bfa, beacon); bfa_trc(bfa, link_e2e_beacon); - bfa_trc(bfa, fcport->beacon); - bfa_trc(bfa, fcport->link_e2e_beacon); + bfa_trc(bfa, pport->beacon); + bfa_trc(bfa, pport->link_e2e_beacon); - fcport->beacon = beacon; - fcport->link_e2e_beacon = link_e2e_beacon; + pport->beacon = beacon; + pport->link_e2e_beacon = link_e2e_beacon; } bfa_boolean_t -bfa_fcport_is_linkup(struct bfa_s *bfa) +bfa_pport_is_linkup(struct bfa_s *bfa) { - return bfa_sm_cmp_state(BFA_FCPORT_MOD(bfa), bfa_fcport_sm_linkup); + return bfa_sm_cmp_state(BFA_PORT_MOD(bfa), bfa_pport_sm_linkup); } diff --git a/trunk/drivers/scsi/bfa/bfa_fcs.c b/trunk/drivers/scsi/bfa/bfa_fcs.c index 3516172c597c..7cb39a306ea9 100644 --- a/trunk/drivers/scsi/bfa/bfa_fcs.c +++ b/trunk/drivers/scsi/bfa/bfa_fcs.c @@ -36,7 +36,6 @@ * FCS sub-modules */ struct bfa_fcs_mod_s { - void (*attach) (struct bfa_fcs_s *fcs); void (*modinit) (struct bfa_fcs_s *fcs); void (*modexit) (struct bfa_fcs_s *fcs); }; @@ -44,10 +43,12 @@ struct bfa_fcs_mod_s { #define BFA_FCS_MODULE(_mod) { _mod ## _modinit, _mod ## _modexit } static struct bfa_fcs_mod_s fcs_modules[] = { - { bfa_fcs_pport_attach, NULL, NULL }, - { bfa_fcs_uf_attach, NULL, NULL }, - { bfa_fcs_fabric_attach, bfa_fcs_fabric_modinit, - bfa_fcs_fabric_modexit }, + BFA_FCS_MODULE(bfa_fcs_pport), + BFA_FCS_MODULE(bfa_fcs_uf), + BFA_FCS_MODULE(bfa_fcs_fabric), + BFA_FCS_MODULE(bfa_fcs_vport), + BFA_FCS_MODULE(bfa_fcs_rport), + BFA_FCS_MODULE(bfa_fcs_fcpim), }; /** @@ -70,10 +71,16 @@ bfa_fcs_exit_comp(void *fcs_cbarg) */ /** - * fcs attach -- called once to initialize data structures at driver attach time + * FCS instance initialization. + * + * param[in] fcs FCS instance + * param[in] bfa BFA instance + * param[in] bfad BFA driver instance + * + * return None */ void -bfa_fcs_attach(struct bfa_fcs_s *fcs, struct bfa_s *bfa, struct bfad_s *bfad, +bfa_fcs_init(struct bfa_fcs_s *fcs, struct bfa_s *bfa, struct bfad_s *bfad, bfa_boolean_t min_cfg) { int i; @@ -88,24 +95,7 @@ bfa_fcs_attach(struct bfa_fcs_s *fcs, struct bfa_s *bfa, struct bfad_s *bfad, for (i = 0; i < sizeof(fcs_modules) / sizeof(fcs_modules[0]); i++) { mod = &fcs_modules[i]; - if (mod->attach) - mod->attach(fcs); - } -} - -/** - * fcs initialization, called once after bfa initialization is complete - */ -void -bfa_fcs_init(struct bfa_fcs_s *fcs) -{ - int i; - struct bfa_fcs_mod_s *mod; - - for (i = 0; i < sizeof(fcs_modules) / sizeof(fcs_modules[0]); i++) { - mod = &fcs_modules[i]; - if (mod->modinit) - mod->modinit(fcs); + mod->modinit(fcs); } } @@ -136,23 +126,6 @@ bfa_fcs_driver_info_init(struct bfa_fcs_s *fcs, bfa_fcs_fabric_psymb_init(&fcs->fabric); } -/** - * @brief - * FCS FDMI Driver Parameter Initialization - * - * @param[in] fcs FCS instance - * @param[in] fdmi_enable TRUE/FALSE - * - * @return None - */ -void -bfa_fcs_set_fdmi_param(struct bfa_fcs_s *fcs, bfa_boolean_t fdmi_enable) -{ - - fcs->fdmi_enabled = fdmi_enable; - -} - /** * FCS instance cleanup and exit. * @@ -170,12 +143,10 @@ bfa_fcs_exit(struct bfa_fcs_s *fcs) nmods = sizeof(fcs_modules) / sizeof(fcs_modules[0]); for (i = 0; i < nmods; i++) { + bfa_wc_up(&fcs->wc); mod = &fcs_modules[i]; - if (mod->modexit) { - bfa_wc_up(&fcs->wc); - mod->modexit(fcs); - } + mod->modexit(fcs); } bfa_wc_wait(&fcs->wc); diff --git a/trunk/drivers/scsi/bfa/bfa_fcs_lport.c b/trunk/drivers/scsi/bfa/bfa_fcs_lport.c index 7c1251c682d8..c7ab257f10a7 100644 --- a/trunk/drivers/scsi/bfa/bfa_fcs_lport.c +++ b/trunk/drivers/scsi/bfa/bfa_fcs_lport.c @@ -114,7 +114,7 @@ bfa_fcs_port_sm_uninit(struct bfa_fcs_port_s *port, break; default: - bfa_sm_fault(port->fcs, event); + bfa_assert(0); } } @@ -136,7 +136,7 @@ bfa_fcs_port_sm_init(struct bfa_fcs_port_s *port, enum bfa_fcs_port_event event) break; default: - bfa_sm_fault(port->fcs, event); + bfa_assert(0); } } @@ -176,7 +176,7 @@ bfa_fcs_port_sm_online(struct bfa_fcs_port_s *port, break; default: - bfa_sm_fault(port->fcs, event); + bfa_assert(0); } } @@ -214,7 +214,7 @@ bfa_fcs_port_sm_offline(struct bfa_fcs_port_s *port, break; default: - bfa_sm_fault(port->fcs, event); + bfa_assert(0); } } @@ -234,7 +234,7 @@ bfa_fcs_port_sm_deleting(struct bfa_fcs_port_s *port, break; default: - bfa_sm_fault(port->fcs, event); + bfa_assert(0); } } @@ -263,8 +263,30 @@ bfa_fcs_port_aen_post(struct bfa_fcs_port_s *port, bfa_assert(role <= BFA_PORT_ROLE_FCP_MAX); - bfa_log(logmod, BFA_LOG_CREATE_ID(BFA_AEN_CAT_LPORT, event), lpwwn_ptr, - role_str[role/2]); + switch (event) { + case BFA_LPORT_AEN_ONLINE: + bfa_log(logmod, BFA_AEN_LPORT_ONLINE, lpwwn_ptr, + role_str[role / 2]); + break; + case BFA_LPORT_AEN_OFFLINE: + bfa_log(logmod, BFA_AEN_LPORT_OFFLINE, lpwwn_ptr, + role_str[role / 2]); + break; + case BFA_LPORT_AEN_NEW: + bfa_log(logmod, BFA_AEN_LPORT_NEW, lpwwn_ptr, + role_str[role / 2]); + break; + case BFA_LPORT_AEN_DELETE: + bfa_log(logmod, BFA_AEN_LPORT_DELETE, lpwwn_ptr, + role_str[role / 2]); + break; + case BFA_LPORT_AEN_DISCONNECT: + bfa_log(logmod, BFA_AEN_LPORT_DISCONNECT, lpwwn_ptr, + role_str[role / 2]); + break; + default: + break; + } aen_data.lport.vf_id = port->fabric->vf_id; aen_data.lport.roles = role; @@ -851,46 +873,36 @@ bfa_fcs_port_is_online(struct bfa_fcs_port_s *port) } /** - * Attach time initialization of logical ports. + * Logical port initialization of base or virtual port. + * Called by fabric for base port or by vport for virtual ports. */ void -bfa_fcs_lport_attach(struct bfa_fcs_port_s *lport, struct bfa_fcs_s *fcs, - uint16_t vf_id, struct bfa_fcs_vport_s *vport) +bfa_fcs_lport_init(struct bfa_fcs_port_s *lport, struct bfa_fcs_s *fcs, + u16 vf_id, struct bfa_port_cfg_s *port_cfg, + struct bfa_fcs_vport_s *vport) { lport->fcs = fcs; lport->fabric = bfa_fcs_vf_lookup(fcs, vf_id); + bfa_os_assign(lport->port_cfg, *port_cfg); lport->vport = vport; lport->lp_tag = (vport) ? bfa_lps_get_tag(vport->lps) : bfa_lps_get_tag(lport->fabric->lps); INIT_LIST_HEAD(&lport->rport_q); lport->num_rports = 0; -} - -/** - * Logical port initialization of base or virtual port. - * Called by fabric for base port or by vport for virtual ports. - */ -void -bfa_fcs_lport_init(struct bfa_fcs_port_s *lport, - struct bfa_port_cfg_s *port_cfg) -{ - struct bfa_fcs_vport_s *vport = lport->vport; - - bfa_os_assign(lport->port_cfg, *port_cfg); - - lport->bfad_port = bfa_fcb_port_new(lport->fcs->bfad, lport, - lport->port_cfg.roles, + lport->bfad_port = + bfa_fcb_port_new(fcs->bfad, lport, lport->port_cfg.roles, lport->fabric->vf_drv, vport ? vport->vport_drv : NULL); - bfa_fcs_port_aen_post(lport, BFA_LPORT_AEN_NEW); bfa_sm_set_state(lport, bfa_fcs_port_sm_uninit); bfa_sm_send_event(lport, BFA_FCS_PORT_SM_CREATE); } + + /** * fcs_lport_api */ @@ -909,20 +921,13 @@ bfa_fcs_port_get_attr(struct bfa_fcs_port_s *port, if (port->fabric) { port_attr->port_type = bfa_fcs_fabric_port_type(port->fabric); port_attr->loopback = bfa_fcs_fabric_is_loopback(port->fabric); - port_attr->authfail = - bfa_fcs_fabric_is_auth_failed(port->fabric); port_attr->fabric_name = bfa_fcs_port_get_fabric_name(port); memcpy(port_attr->fabric_ip_addr, bfa_fcs_port_get_fabric_ipaddr(port), BFA_FCS_FABRIC_IPADDR_SZ); - if (port->vport != NULL) { + if (port->vport != NULL) port_attr->port_type = BFA_PPORT_TYPE_VPORT; - port_attr->fpma_mac = - bfa_lps_get_lp_mac(port->vport->lps); - } else - port_attr->fpma_mac = - bfa_lps_get_lp_mac(port->fabric->lps); } else { port_attr->port_type = BFA_PPORT_TYPE_UNKNOWN; diff --git a/trunk/drivers/scsi/bfa/bfa_fcs_port.c b/trunk/drivers/scsi/bfa/bfa_fcs_port.c index 3c27788cd527..9c4b24e62de1 100644 --- a/trunk/drivers/scsi/bfa/bfa_fcs_port.c +++ b/trunk/drivers/scsi/bfa/bfa_fcs_port.c @@ -55,7 +55,14 @@ bfa_fcs_pport_event_handler(void *cbarg, bfa_pport_event_t event) } void -bfa_fcs_pport_attach(struct bfa_fcs_s *fcs) +bfa_fcs_pport_modinit(struct bfa_fcs_s *fcs) { - bfa_fcport_event_register(fcs->bfa, bfa_fcs_pport_event_handler, fcs); + bfa_pport_event_register(fcs->bfa, bfa_fcs_pport_event_handler, + fcs); +} + +void +bfa_fcs_pport_modexit(struct bfa_fcs_s *fcs) +{ + bfa_fcs_modexit_comp(fcs); } diff --git a/trunk/drivers/scsi/bfa/bfa_fcs_uf.c b/trunk/drivers/scsi/bfa/bfa_fcs_uf.c index 3d57d48bbae4..ad01db6444b2 100644 --- a/trunk/drivers/scsi/bfa/bfa_fcs_uf.c +++ b/trunk/drivers/scsi/bfa/bfa_fcs_uf.c @@ -93,7 +93,13 @@ bfa_fcs_uf_recv(void *cbarg, struct bfa_uf_s *uf) } void -bfa_fcs_uf_attach(struct bfa_fcs_s *fcs) +bfa_fcs_uf_modinit(struct bfa_fcs_s *fcs) { bfa_uf_recv_register(fcs->bfa, bfa_fcs_uf_recv, fcs); } + +void +bfa_fcs_uf_modexit(struct bfa_fcs_s *fcs) +{ + bfa_fcs_modexit_comp(fcs); +} diff --git a/trunk/drivers/scsi/bfa/bfa_hw_cb.c b/trunk/drivers/scsi/bfa/bfa_hw_cb.c index 871a4e28575c..ede1438619e2 100644 --- a/trunk/drivers/scsi/bfa/bfa_hw_cb.c +++ b/trunk/drivers/scsi/bfa/bfa_hw_cb.c @@ -52,18 +52,6 @@ bfa_hwcb_reginit(struct bfa_s *bfa) } } -void -bfa_hwcb_reqq_ack(struct bfa_s *bfa, int reqq) -{ -} - -static void -bfa_hwcb_reqq_ack_msix(struct bfa_s *bfa, int reqq) -{ - bfa_reg_write(bfa->iocfc.bfa_regs.intr_status, - __HFN_INT_CPE_Q0 << CPE_Q_NUM(bfa_ioc_pcifn(&bfa->ioc), reqq)); -} - void bfa_hwcb_rspq_ack(struct bfa_s *bfa, int rspq) { @@ -148,7 +136,6 @@ bfa_hwcb_msix_uninstall(struct bfa_s *bfa) void bfa_hwcb_isr_mode_set(struct bfa_s *bfa, bfa_boolean_t msix) { - bfa->iocfc.hwif.hw_reqq_ack = bfa_hwcb_reqq_ack_msix; bfa->iocfc.hwif.hw_rspq_ack = bfa_hwcb_rspq_ack_msix; } diff --git a/trunk/drivers/scsi/bfa/bfa_hw_ct.c b/trunk/drivers/scsi/bfa/bfa_hw_ct.c index 76ceb9a4bf2f..51ae5740e6e9 100644 --- a/trunk/drivers/scsi/bfa/bfa_hw_ct.c +++ b/trunk/drivers/scsi/bfa/bfa_hw_ct.c @@ -84,15 +84,6 @@ bfa_hwct_reginit(struct bfa_s *bfa) } } -void -bfa_hwct_reqq_ack(struct bfa_s *bfa, int reqq) -{ - u32 r32; - - r32 = bfa_reg_read(bfa->iocfc.bfa_regs.cpe_q_ctrl[reqq]); - bfa_reg_write(bfa->iocfc.bfa_regs.cpe_q_ctrl[reqq], r32); -} - void bfa_hwct_rspq_ack(struct bfa_s *bfa, int rspq) { diff --git a/trunk/drivers/scsi/bfa/bfa_intr.c b/trunk/drivers/scsi/bfa/bfa_intr.c index 0eba3f930d5b..b36540e4ed76 100644 --- a/trunk/drivers/scsi/bfa/bfa_intr.c +++ b/trunk/drivers/scsi/bfa/bfa_intr.c @@ -15,7 +15,7 @@ * General Public License for more details. */ #include -#include +#include #include #include #include @@ -34,26 +34,6 @@ bfa_msix_lpu(struct bfa_s *bfa) bfa_ioc_mbox_isr(&bfa->ioc); } -static void -bfa_reqq_resume(struct bfa_s *bfa, int qid) -{ - struct list_head *waitq, *qe, *qen; - struct bfa_reqq_wait_s *wqe; - - waitq = bfa_reqq(bfa, qid); - list_for_each_safe(qe, qen, waitq) { - /** - * Callback only as long as there is room in request queue - */ - if (bfa_reqq_full(bfa, qid)) - break; - - list_del(qe); - wqe = (struct bfa_reqq_wait_s *) qe; - wqe->qresume(wqe->cbarg); - } -} - void bfa_msix_all(struct bfa_s *bfa, int vec) { @@ -116,8 +96,7 @@ bfa_isr_enable(struct bfa_s *bfa) bfa_msix_install(bfa); intr_unmask = (__HFN_INT_ERR_EMC | __HFN_INT_ERR_LPU0 | - __HFN_INT_ERR_LPU1 | __HFN_INT_ERR_PSS | - __HFN_INT_LL_HALT); + __HFN_INT_ERR_LPU1 | __HFN_INT_ERR_PSS); if (pci_func == 0) intr_unmask |= (__HFN_INT_CPE_Q0 | __HFN_INT_CPE_Q1 | @@ -148,18 +127,23 @@ bfa_isr_disable(struct bfa_s *bfa) void bfa_msix_reqq(struct bfa_s *bfa, int qid) { - struct list_head *waitq; + struct list_head *waitq, *qe, *qen; + struct bfa_reqq_wait_s *wqe; qid &= (BFI_IOC_MAX_CQS - 1); - bfa->iocfc.hwif.hw_reqq_ack(bfa, qid); - - /** - * Resume any pending requests in the corresponding reqq. - */ waitq = bfa_reqq(bfa, qid); - if (!list_empty(waitq)) - bfa_reqq_resume(bfa, qid); + list_for_each_safe(qe, qen, waitq) { + /** + * Callback only as long as there is room in request queue + */ + if (bfa_reqq_full(bfa, qid)) + break; + + list_del(qe); + wqe = (struct bfa_reqq_wait_s *) qe; + wqe->qresume(wqe->cbarg); + } } void @@ -173,27 +157,26 @@ bfa_isr_unhandled(struct bfa_s *bfa, struct bfi_msg_s *m) } void -bfa_msix_rspq(struct bfa_s *bfa, int qid) +bfa_msix_rspq(struct bfa_s *bfa, int rsp_qid) { - struct bfi_msg_s *m; - u32 pi, ci; - struct list_head *waitq; + struct bfi_msg_s *m; + u32 pi, ci; - bfa_trc_fp(bfa, qid); + bfa_trc_fp(bfa, rsp_qid); - qid &= (BFI_IOC_MAX_CQS - 1); + rsp_qid &= (BFI_IOC_MAX_CQS - 1); - bfa->iocfc.hwif.hw_rspq_ack(bfa, qid); + bfa->iocfc.hwif.hw_rspq_ack(bfa, rsp_qid); - ci = bfa_rspq_ci(bfa, qid); - pi = bfa_rspq_pi(bfa, qid); + ci = bfa_rspq_ci(bfa, rsp_qid); + pi = bfa_rspq_pi(bfa, rsp_qid); bfa_trc_fp(bfa, ci); bfa_trc_fp(bfa, pi); if (bfa->rme_process) { while (ci != pi) { - m = bfa_rspq_elem(bfa, qid, ci); + m = bfa_rspq_elem(bfa, rsp_qid, ci); bfa_assert_fp(m->mhdr.msg_class < BFI_MC_MAX); bfa_isrs[m->mhdr.msg_class] (bfa, m); @@ -205,59 +188,25 @@ bfa_msix_rspq(struct bfa_s *bfa, int qid) /** * update CI */ - bfa_rspq_ci(bfa, qid) = pi; - bfa_reg_write(bfa->iocfc.bfa_regs.rme_q_ci[qid], pi); + bfa_rspq_ci(bfa, rsp_qid) = pi; + bfa_reg_write(bfa->iocfc.bfa_regs.rme_q_ci[rsp_qid], pi); bfa_os_mmiowb(); - - /** - * Resume any pending requests in the corresponding reqq. - */ - waitq = bfa_reqq(bfa, qid); - if (!list_empty(waitq)) - bfa_reqq_resume(bfa, qid); } void bfa_msix_lpu_err(struct bfa_s *bfa, int vec) { - u32 intr, curr_value; + u32 intr; intr = bfa_reg_read(bfa->iocfc.bfa_regs.intr_status); if (intr & (__HFN_INT_MBOX_LPU0 | __HFN_INT_MBOX_LPU1)) bfa_msix_lpu(bfa); - intr &= (__HFN_INT_ERR_EMC | __HFN_INT_ERR_LPU0 | - __HFN_INT_ERR_LPU1 | __HFN_INT_ERR_PSS | __HFN_INT_LL_HALT); - - if (intr) { - if (intr & __HFN_INT_LL_HALT) { - /** - * If LL_HALT bit is set then FW Init Halt LL Port - * Register needs to be cleared as well so Interrupt - * Status Register will be cleared. - */ - curr_value = bfa_reg_read(bfa->ioc.ioc_regs.ll_halt); - curr_value &= ~__FW_INIT_HALT_P; - bfa_reg_write(bfa->ioc.ioc_regs.ll_halt, curr_value); - } - - if (intr & __HFN_INT_ERR_PSS) { - /** - * ERR_PSS bit needs to be cleared as well in case - * interrups are shared so driver's interrupt handler is - * still called eventhough it is already masked out. - */ - curr_value = bfa_reg_read( - bfa->ioc.ioc_regs.pss_err_status_reg); - curr_value &= __PSS_ERR_STATUS_SET; - bfa_reg_write(bfa->ioc.ioc_regs.pss_err_status_reg, - curr_value); - } - - bfa_reg_write(bfa->iocfc.bfa_regs.intr_status, intr); + if (intr & (__HFN_INT_ERR_EMC | + __HFN_INT_ERR_LPU0 | __HFN_INT_ERR_LPU1 | + __HFN_INT_ERR_PSS)) bfa_msix_errint(bfa, intr); - } } void diff --git a/trunk/drivers/scsi/bfa/bfa_ioc.c b/trunk/drivers/scsi/bfa/bfa_ioc.c index e038bc9769f6..397d7e9eade5 100644 --- a/trunk/drivers/scsi/bfa/bfa_ioc.c +++ b/trunk/drivers/scsi/bfa/bfa_ioc.c @@ -18,7 +18,7 @@ #include #include #include -#include +#include #include #include #include @@ -27,17 +27,18 @@ #include #include -BFA_TRC_FILE(CNA, IOC); +BFA_TRC_FILE(HAL, IOC); /** * IOC local definitions */ #define BFA_IOC_TOV 2000 /* msecs */ -#define BFA_IOC_HWSEM_TOV 500 /* msecs */ -#define BFA_IOC_HB_TOV 500 /* msecs */ -#define BFA_IOC_HWINIT_MAX 2 +#define BFA_IOC_HB_TOV 1000 /* msecs */ +#define BFA_IOC_HB_FAIL_MAX 4 +#define BFA_IOC_HWINIT_MAX 2 #define BFA_IOC_FWIMG_MINSZ (16 * 1024) -#define BFA_IOC_TOV_RECOVER BFA_IOC_HB_TOV +#define BFA_IOC_TOV_RECOVER (BFA_IOC_HB_FAIL_MAX * BFA_IOC_HB_TOV \ + + BFA_IOC_TOV) #define bfa_ioc_timer_start(__ioc) \ bfa_timer_begin((__ioc)->timer_mod, &(__ioc)->ioc_timer, \ @@ -50,25 +51,12 @@ BFA_TRC_FILE(CNA, IOC); (sizeof(struct bfa_trc_mod_s) - \ BFA_TRC_MAX * sizeof(struct bfa_trc_s))) #define BFA_DBG_FWTRC_OFF(_fn) (BFI_IOC_TRC_OFF + BFA_DBG_FWTRC_LEN * (_fn)) +#define bfa_ioc_stats(_ioc, _stats) ((_ioc)->stats._stats++) -/** - * Asic specific macros : see bfa_hw_cb.c and bfa_hw_ct.c for details. - */ - -#define bfa_ioc_firmware_lock(__ioc) \ - ((__ioc)->ioc_hwif->ioc_firmware_lock(__ioc)) -#define bfa_ioc_firmware_unlock(__ioc) \ - ((__ioc)->ioc_hwif->ioc_firmware_unlock(__ioc)) -#define bfa_ioc_fwimg_get_chunk(__ioc, __off) \ - ((__ioc)->ioc_hwif->ioc_fwimg_get_chunk(__ioc, __off)) -#define bfa_ioc_fwimg_get_size(__ioc) \ - ((__ioc)->ioc_hwif->ioc_fwimg_get_size(__ioc)) -#define bfa_ioc_reg_init(__ioc) ((__ioc)->ioc_hwif->ioc_reg_init(__ioc)) -#define bfa_ioc_map_port(__ioc) ((__ioc)->ioc_hwif->ioc_map_port(__ioc)) -#define bfa_ioc_notify_hbfail(__ioc) \ - ((__ioc)->ioc_hwif->ioc_notify_hbfail(__ioc)) - -bfa_boolean_t bfa_auto_recover = BFA_TRUE; +#define BFA_FLASH_CHUNK_NO(off) (off / BFI_FLASH_CHUNK_SZ_WORDS) +#define BFA_FLASH_OFFSET_IN_CHUNK(off) (off % BFI_FLASH_CHUNK_SZ_WORDS) +#define BFA_FLASH_CHUNK_ADDR(chunkno) (chunkno * BFI_FLASH_CHUNK_SZ_WORDS) +bfa_boolean_t bfa_auto_recover = BFA_FALSE; /* * forward declarations @@ -76,6 +64,7 @@ bfa_boolean_t bfa_auto_recover = BFA_TRUE; static void bfa_ioc_aen_post(struct bfa_ioc_s *bfa, enum bfa_ioc_aen_event event); static void bfa_ioc_hw_sem_get(struct bfa_ioc_s *ioc); +static void bfa_ioc_hw_sem_release(struct bfa_ioc_s *ioc); static void bfa_ioc_hw_sem_get_cancel(struct bfa_ioc_s *ioc); static void bfa_ioc_hwinit(struct bfa_ioc_s *ioc, bfa_boolean_t force); static void bfa_ioc_timeout(void *ioc); @@ -88,6 +77,8 @@ static void bfa_ioc_reset(struct bfa_ioc_s *ioc, bfa_boolean_t force); static void bfa_ioc_mbox_poll(struct bfa_ioc_s *ioc); static void bfa_ioc_mbox_hbfail(struct bfa_ioc_s *ioc); static void bfa_ioc_recover(struct bfa_ioc_s *ioc); +static bfa_boolean_t bfa_ioc_firmware_lock(struct bfa_ioc_s *ioc); +static void bfa_ioc_firmware_unlock(struct bfa_ioc_s *ioc); static void bfa_ioc_disable_comp(struct bfa_ioc_s *ioc); static void bfa_ioc_lpu_stop(struct bfa_ioc_s *ioc); @@ -517,19 +508,14 @@ bfa_ioc_sm_disabling(struct bfa_ioc_s *ioc, enum ioc_event event) bfa_trc(ioc, event); switch (event) { - case IOC_E_FWRSP_DISABLE: - bfa_ioc_timer_stop(ioc); - bfa_fsm_set_state(ioc, bfa_ioc_sm_disabled); - break; - case IOC_E_HWERROR: + case IOC_E_FWRSP_DISABLE: bfa_ioc_timer_stop(ioc); /* * !!! fall through !!! */ case IOC_E_TIMEOUT: - bfa_reg_write(ioc->ioc_regs.ioc_fwstate, BFI_IOC_FAIL); bfa_fsm_set_state(ioc, bfa_ioc_sm_disabled); break; @@ -622,12 +608,15 @@ bfa_ioc_sm_hbfail_entry(struct bfa_ioc_s *ioc) * Mark IOC as failed in hardware and stop firmware. */ bfa_ioc_lpu_stop(ioc); - bfa_reg_write(ioc->ioc_regs.ioc_fwstate, BFI_IOC_FAIL); + bfa_reg_write(ioc->ioc_regs.ioc_fwstate, BFI_IOC_HBFAIL); - /** - * Notify other functions on HB failure. - */ - bfa_ioc_notify_hbfail(ioc); + if (ioc->pcidev.device_id == BFA_PCI_DEVICE_ID_CT) { + bfa_reg_write(ioc->ioc_regs.ll_halt, __FW_INIT_HALT_P); + /* + * Wait for halt to take effect + */ + bfa_reg_read(ioc->ioc_regs.ll_halt); + } /** * Notify driver and common modules registered for notification. @@ -683,12 +672,6 @@ bfa_ioc_sm_hbfail(struct bfa_ioc_s *ioc, enum ioc_event event) */ break; - case IOC_E_HWERROR: - /* - * HB failure notification, ignore. - */ - break; - default: bfa_sm_fault(ioc, event); } @@ -717,7 +700,7 @@ bfa_ioc_disable_comp(struct bfa_ioc_s *ioc) } } -void +static void bfa_ioc_sem_timeout(void *ioc_arg) { struct bfa_ioc_s *ioc = (struct bfa_ioc_s *)ioc_arg; @@ -725,32 +708,26 @@ bfa_ioc_sem_timeout(void *ioc_arg) bfa_ioc_hw_sem_get(ioc); } -bfa_boolean_t -bfa_ioc_sem_get(bfa_os_addr_t sem_reg) +static void +bfa_ioc_usage_sem_get(struct bfa_ioc_s *ioc) { - u32 r32; - int cnt = 0; -#define BFA_SEM_SPINCNT 3000 - - r32 = bfa_reg_read(sem_reg); + u32 r32; + int cnt = 0; +#define BFA_SEM_SPINCNT 1000 - while (r32 && (cnt < BFA_SEM_SPINCNT)) { + do { + r32 = bfa_reg_read(ioc->ioc_regs.ioc_usage_sem_reg); cnt++; - bfa_os_udelay(2); - r32 = bfa_reg_read(sem_reg); - } - - if (r32 == 0) - return BFA_TRUE; - + if (cnt > BFA_SEM_SPINCNT) + break; + } while (r32 != 0); bfa_assert(cnt < BFA_SEM_SPINCNT); - return BFA_FALSE; } -void -bfa_ioc_sem_release(bfa_os_addr_t sem_reg) +static void +bfa_ioc_usage_sem_release(struct bfa_ioc_s *ioc) { - bfa_reg_write(sem_reg, 1); + bfa_reg_write(ioc->ioc_regs.ioc_usage_sem_reg, 1); } static void @@ -760,7 +737,7 @@ bfa_ioc_hw_sem_get(struct bfa_ioc_s *ioc) /** * First read to the semaphore register will return 0, subsequent reads - * will return 1. Semaphore is released by writing 1 to the register + * will return 1. Semaphore is released by writing 0 to the register */ r32 = bfa_reg_read(ioc->ioc_regs.ioc_sem_reg); if (r32 == 0) { @@ -769,10 +746,10 @@ bfa_ioc_hw_sem_get(struct bfa_ioc_s *ioc) } bfa_timer_begin(ioc->timer_mod, &ioc->sem_timer, bfa_ioc_sem_timeout, - ioc, BFA_IOC_HWSEM_TOV); + ioc, BFA_IOC_TOV); } -void +static void bfa_ioc_hw_sem_release(struct bfa_ioc_s *ioc) { bfa_reg_write(ioc->ioc_regs.ioc_sem_reg, 1); @@ -851,7 +828,7 @@ bfa_ioc_lpu_stop(struct bfa_ioc_s *ioc) /** * Get driver and firmware versions. */ -void +static void bfa_ioc_fwver_get(struct bfa_ioc_s *ioc, struct bfi_ioc_image_hdr_s *fwhdr) { u32 pgnum, pgoff; @@ -870,10 +847,24 @@ bfa_ioc_fwver_get(struct bfa_ioc_s *ioc, struct bfi_ioc_image_hdr_s *fwhdr) } } +static u32 * +bfa_ioc_fwimg_get_chunk(struct bfa_ioc_s *ioc, u32 off) +{ + if (ioc->ctdev) + return bfi_image_ct_get_chunk(off); + return bfi_image_cb_get_chunk(off); +} + +static u32 +bfa_ioc_fwimg_get_size(struct bfa_ioc_s *ioc) +{ +return (ioc->ctdev) ? bfi_image_ct_size : bfi_image_cb_size; +} + /** * Returns TRUE if same. */ -bfa_boolean_t +static bfa_boolean_t bfa_ioc_fwver_cmp(struct bfa_ioc_s *ioc, struct bfi_ioc_image_hdr_s *fwhdr) { struct bfi_ioc_image_hdr_s *drv_fwhdr; @@ -929,6 +920,95 @@ bfa_ioc_fwver_valid(struct bfa_ioc_s *ioc) return bfa_ioc_fwver_cmp(ioc, &fwhdr); } +/** + * Return true if firmware of current driver matches the running firmware. + */ +static bfa_boolean_t +bfa_ioc_firmware_lock(struct bfa_ioc_s *ioc) +{ + enum bfi_ioc_state ioc_fwstate; + u32 usecnt; + struct bfi_ioc_image_hdr_s fwhdr; + + /** + * Firmware match check is relevant only for CNA. + */ + if (!ioc->cna) + return BFA_TRUE; + + /** + * If bios boot (flash based) -- do not increment usage count + */ + if (bfa_ioc_fwimg_get_size(ioc) < BFA_IOC_FWIMG_MINSZ) + return BFA_TRUE; + + bfa_ioc_usage_sem_get(ioc); + usecnt = bfa_reg_read(ioc->ioc_regs.ioc_usage_reg); + + /** + * If usage count is 0, always return TRUE. + */ + if (usecnt == 0) { + bfa_reg_write(ioc->ioc_regs.ioc_usage_reg, 1); + bfa_ioc_usage_sem_release(ioc); + bfa_trc(ioc, usecnt); + return BFA_TRUE; + } + + ioc_fwstate = bfa_reg_read(ioc->ioc_regs.ioc_fwstate); + bfa_trc(ioc, ioc_fwstate); + + /** + * Use count cannot be non-zero and chip in uninitialized state. + */ + bfa_assert(ioc_fwstate != BFI_IOC_UNINIT); + + /** + * Check if another driver with a different firmware is active + */ + bfa_ioc_fwver_get(ioc, &fwhdr); + if (!bfa_ioc_fwver_cmp(ioc, &fwhdr)) { + bfa_ioc_usage_sem_release(ioc); + bfa_trc(ioc, usecnt); + return BFA_FALSE; + } + + /** + * Same firmware version. Increment the reference count. + */ + usecnt++; + bfa_reg_write(ioc->ioc_regs.ioc_usage_reg, usecnt); + bfa_ioc_usage_sem_release(ioc); + bfa_trc(ioc, usecnt); + return BFA_TRUE; +} + +static void +bfa_ioc_firmware_unlock(struct bfa_ioc_s *ioc) +{ + u32 usecnt; + + /** + * Firmware lock is relevant only for CNA. + * If bios boot (flash based) -- do not decrement usage count + */ + if (!ioc->cna || (bfa_ioc_fwimg_get_size(ioc) < BFA_IOC_FWIMG_MINSZ)) + return; + + /** + * decrement usage count + */ + bfa_ioc_usage_sem_get(ioc); + usecnt = bfa_reg_read(ioc->ioc_regs.ioc_usage_reg); + bfa_assert(usecnt > 0); + + usecnt--; + bfa_reg_write(ioc->ioc_regs.ioc_usage_reg, usecnt); + bfa_trc(ioc, usecnt); + + bfa_ioc_usage_sem_release(ioc); +} + /** * Conditionally flush any pending message from firmware at start. */ @@ -1072,27 +1152,33 @@ bfa_ioc_send_getattr(struct bfa_ioc_s *ioc) static void bfa_ioc_hb_check(void *cbarg) { - struct bfa_ioc_s *ioc = cbarg; - u32 hb_count; + struct bfa_ioc_s *ioc = cbarg; + u32 hb_count; hb_count = bfa_reg_read(ioc->ioc_regs.heartbeat); if (ioc->hb_count == hb_count) { - bfa_log(ioc->logm, BFA_LOG_HAL_HEARTBEAT_FAILURE, - hb_count); - bfa_ioc_recover(ioc); - return; + ioc->hb_fail++; } else { ioc->hb_count = hb_count; + ioc->hb_fail = 0; + } + + if (ioc->hb_fail >= BFA_IOC_HB_FAIL_MAX) { + bfa_log(ioc->logm, BFA_LOG_HAL_HEARTBEAT_FAILURE, hb_count); + ioc->hb_fail = 0; + bfa_ioc_recover(ioc); + return; } bfa_ioc_mbox_poll(ioc); - bfa_timer_begin(ioc->timer_mod, &ioc->ioc_timer, bfa_ioc_hb_check, - ioc, BFA_IOC_HB_TOV); + bfa_timer_begin(ioc->timer_mod, &ioc->ioc_timer, bfa_ioc_hb_check, ioc, + BFA_IOC_HB_TOV); } static void bfa_ioc_hb_monitor(struct bfa_ioc_s *ioc) { + ioc->hb_fail = 0; ioc->hb_count = bfa_reg_read(ioc->ioc_regs.heartbeat); bfa_timer_begin(ioc->timer_mod, &ioc->ioc_timer, bfa_ioc_hb_check, ioc, BFA_IOC_HB_TOV); @@ -1104,6 +1190,112 @@ bfa_ioc_hb_stop(struct bfa_ioc_s *ioc) bfa_timer_stop(&ioc->ioc_timer); } +/** + * Host to LPU mailbox message addresses + */ +static struct { + u32 hfn_mbox, lpu_mbox, hfn_pgn; +} iocreg_fnreg[] = { + { + HOSTFN0_LPU_MBOX0_0, LPU_HOSTFN0_MBOX0_0, HOST_PAGE_NUM_FN0}, { + HOSTFN1_LPU_MBOX0_8, LPU_HOSTFN1_MBOX0_8, HOST_PAGE_NUM_FN1}, { + HOSTFN2_LPU_MBOX0_0, LPU_HOSTFN2_MBOX0_0, HOST_PAGE_NUM_FN2}, { + HOSTFN3_LPU_MBOX0_8, LPU_HOSTFN3_MBOX0_8, HOST_PAGE_NUM_FN3} +}; + +/** + * Host <-> LPU mailbox command/status registers - port 0 + */ +static struct { + u32 hfn, lpu; +} iocreg_mbcmd_p0[] = { + { + HOSTFN0_LPU0_MBOX0_CMD_STAT, LPU0_HOSTFN0_MBOX0_CMD_STAT}, { + HOSTFN1_LPU0_MBOX0_CMD_STAT, LPU0_HOSTFN1_MBOX0_CMD_STAT}, { + HOSTFN2_LPU0_MBOX0_CMD_STAT, LPU0_HOSTFN2_MBOX0_CMD_STAT}, { + HOSTFN3_LPU0_MBOX0_CMD_STAT, LPU0_HOSTFN3_MBOX0_CMD_STAT} +}; + +/** + * Host <-> LPU mailbox command/status registers - port 1 + */ +static struct { + u32 hfn, lpu; +} iocreg_mbcmd_p1[] = { + { + HOSTFN0_LPU1_MBOX0_CMD_STAT, LPU1_HOSTFN0_MBOX0_CMD_STAT}, { + HOSTFN1_LPU1_MBOX0_CMD_STAT, LPU1_HOSTFN1_MBOX0_CMD_STAT}, { + HOSTFN2_LPU1_MBOX0_CMD_STAT, LPU1_HOSTFN2_MBOX0_CMD_STAT}, { + HOSTFN3_LPU1_MBOX0_CMD_STAT, LPU1_HOSTFN3_MBOX0_CMD_STAT} +}; + +/** + * Shared IRQ handling in INTX mode + */ +static struct { + u32 isr, msk; +} iocreg_shirq_next[] = { + { + HOSTFN1_INT_STATUS, HOSTFN1_INT_MSK}, { + HOSTFN2_INT_STATUS, HOSTFN2_INT_MSK}, { + HOSTFN3_INT_STATUS, HOSTFN3_INT_MSK}, { +HOSTFN0_INT_STATUS, HOSTFN0_INT_MSK},}; + +static void +bfa_ioc_reg_init(struct bfa_ioc_s *ioc) +{ + bfa_os_addr_t rb; + int pcifn = bfa_ioc_pcifn(ioc); + + rb = bfa_ioc_bar0(ioc); + + ioc->ioc_regs.hfn_mbox = rb + iocreg_fnreg[pcifn].hfn_mbox; + ioc->ioc_regs.lpu_mbox = rb + iocreg_fnreg[pcifn].lpu_mbox; + ioc->ioc_regs.host_page_num_fn = rb + iocreg_fnreg[pcifn].hfn_pgn; + + if (ioc->port_id == 0) { + ioc->ioc_regs.heartbeat = rb + BFA_IOC0_HBEAT_REG; + ioc->ioc_regs.ioc_fwstate = rb + BFA_IOC0_STATE_REG; + ioc->ioc_regs.hfn_mbox_cmd = rb + iocreg_mbcmd_p0[pcifn].hfn; + ioc->ioc_regs.lpu_mbox_cmd = rb + iocreg_mbcmd_p0[pcifn].lpu; + ioc->ioc_regs.ll_halt = rb + FW_INIT_HALT_P0; + } else { + ioc->ioc_regs.heartbeat = (rb + BFA_IOC1_HBEAT_REG); + ioc->ioc_regs.ioc_fwstate = (rb + BFA_IOC1_STATE_REG); + ioc->ioc_regs.hfn_mbox_cmd = rb + iocreg_mbcmd_p1[pcifn].hfn; + ioc->ioc_regs.lpu_mbox_cmd = rb + iocreg_mbcmd_p1[pcifn].lpu; + ioc->ioc_regs.ll_halt = rb + FW_INIT_HALT_P1; + } + + /** + * Shared IRQ handling in INTX mode + */ + ioc->ioc_regs.shirq_isr_next = rb + iocreg_shirq_next[pcifn].isr; + ioc->ioc_regs.shirq_msk_next = rb + iocreg_shirq_next[pcifn].msk; + + /* + * PSS control registers + */ + ioc->ioc_regs.pss_ctl_reg = (rb + PSS_CTL_REG); + ioc->ioc_regs.app_pll_fast_ctl_reg = (rb + APP_PLL_425_CTL_REG); + ioc->ioc_regs.app_pll_slow_ctl_reg = (rb + APP_PLL_312_CTL_REG); + + /* + * IOC semaphore registers and serialization + */ + ioc->ioc_regs.ioc_sem_reg = (rb + HOST_SEM0_REG); + ioc->ioc_regs.ioc_usage_sem_reg = (rb + HOST_SEM1_REG); + ioc->ioc_regs.ioc_usage_reg = (rb + BFA_FW_USE_COUNT); + + /** + * sram memory access + */ + ioc->ioc_regs.smem_page_start = (rb + PSS_SMEM_PAGE_START); + ioc->ioc_regs.smem_pg0 = BFI_IOC_SMEM_PG0_CB; + if (ioc->pcidev.device_id == BFA_PCI_DEVICE_ID_CT) + ioc->ioc_regs.smem_pg0 = BFI_IOC_SMEM_PG0_CT; +} + /** * Initiate a full firmware download. */ @@ -1129,6 +1321,9 @@ bfa_ioc_download_fw(struct bfa_ioc_s *ioc, u32 boot_type, if (bfa_ioc_fwimg_get_size(ioc) < BFA_IOC_FWIMG_MINSZ) boot_type = BFI_BOOT_TYPE_FLASH; fwimg = bfa_ioc_fwimg_get_chunk(ioc, chunkno); + fwimg[BFI_BOOT_TYPE_OFF / sizeof(u32)] = bfa_os_swap32(boot_type); + fwimg[BFI_BOOT_PARAM_OFF / sizeof(u32)] = + bfa_os_swap32(boot_param); pgnum = bfa_ioc_smem_pgnum(ioc, loff); pgoff = bfa_ioc_smem_pgoff(ioc, loff); @@ -1137,17 +1332,17 @@ bfa_ioc_download_fw(struct bfa_ioc_s *ioc, u32 boot_type, for (i = 0; i < bfa_ioc_fwimg_get_size(ioc); i++) { - if (BFA_IOC_FLASH_CHUNK_NO(i) != chunkno) { - chunkno = BFA_IOC_FLASH_CHUNK_NO(i); + if (BFA_FLASH_CHUNK_NO(i) != chunkno) { + chunkno = BFA_FLASH_CHUNK_NO(i); fwimg = bfa_ioc_fwimg_get_chunk(ioc, - BFA_IOC_FLASH_CHUNK_ADDR(chunkno)); + BFA_FLASH_CHUNK_ADDR(chunkno)); } /** * write smem */ bfa_mem_write(ioc->ioc_regs.smem_page_start, loff, - fwimg[BFA_IOC_FLASH_OFFSET_IN_CHUNK(i)]); + fwimg[BFA_FLASH_OFFSET_IN_CHUNK(i)]); loff += sizeof(u32); @@ -1163,14 +1358,6 @@ bfa_ioc_download_fw(struct bfa_ioc_s *ioc, u32 boot_type, bfa_reg_write(ioc->ioc_regs.host_page_num_fn, bfa_ioc_smem_pgnum(ioc, 0)); - - /* - * Set boot type and boot param at the end. - */ - bfa_mem_write(ioc->ioc_regs.smem_page_start, BFI_BOOT_TYPE_OFF, - bfa_os_swap32(boot_type)); - bfa_mem_write(ioc->ioc_regs.smem_page_start, BFI_BOOT_PARAM_OFF, - bfa_os_swap32(boot_param)); } static void @@ -1252,10 +1439,168 @@ bfa_ioc_mbox_hbfail(struct bfa_ioc_s *ioc) bfa_q_deq(&mod->cmd_q, &cmd); } +/** + * Initialize IOC to port mapping. + */ + +#define FNC_PERS_FN_SHIFT(__fn) ((__fn) * 8) +static void +bfa_ioc_map_port(struct bfa_ioc_s *ioc) +{ + bfa_os_addr_t rb = ioc->pcidev.pci_bar_kva; + u32 r32; + + /** + * For crossbow, port id is same as pci function. + */ + if (ioc->pcidev.device_id != BFA_PCI_DEVICE_ID_CT) { + ioc->port_id = bfa_ioc_pcifn(ioc); + return; + } + + /** + * For catapult, base port id on personality register and IOC type + */ + r32 = bfa_reg_read(rb + FNC_PERS_REG); + r32 >>= FNC_PERS_FN_SHIFT(bfa_ioc_pcifn(ioc)); + ioc->port_id = (r32 & __F0_PORT_MAP_MK) >> __F0_PORT_MAP_SH; + + bfa_trc(ioc, bfa_ioc_pcifn(ioc)); + bfa_trc(ioc, ioc->port_id); +} + + + /** * bfa_ioc_public */ +/** +* Set interrupt mode for a function: INTX or MSIX + */ +void +bfa_ioc_isr_mode_set(struct bfa_ioc_s *ioc, bfa_boolean_t msix) +{ + bfa_os_addr_t rb = ioc->pcidev.pci_bar_kva; + u32 r32, mode; + + r32 = bfa_reg_read(rb + FNC_PERS_REG); + bfa_trc(ioc, r32); + + mode = (r32 >> FNC_PERS_FN_SHIFT(bfa_ioc_pcifn(ioc))) & + __F0_INTX_STATUS; + + /** + * If already in desired mode, do not change anything + */ + if (!msix && mode) + return; + + if (msix) + mode = __F0_INTX_STATUS_MSIX; + else + mode = __F0_INTX_STATUS_INTA; + + r32 &= ~(__F0_INTX_STATUS << FNC_PERS_FN_SHIFT(bfa_ioc_pcifn(ioc))); + r32 |= (mode << FNC_PERS_FN_SHIFT(bfa_ioc_pcifn(ioc))); + bfa_trc(ioc, r32); + + bfa_reg_write(rb + FNC_PERS_REG, r32); +} + +bfa_status_t +bfa_ioc_pll_init(struct bfa_ioc_s *ioc) +{ + bfa_os_addr_t rb = ioc->pcidev.pci_bar_kva; + u32 pll_sclk, pll_fclk, r32; + + if (ioc->pcidev.device_id == BFA_PCI_DEVICE_ID_CT) { + pll_sclk = + __APP_PLL_312_ENABLE | __APP_PLL_312_LRESETN | + __APP_PLL_312_RSEL200500 | __APP_PLL_312_P0_1(0U) | + __APP_PLL_312_JITLMT0_1(3U) | + __APP_PLL_312_CNTLMT0_1(1U); + pll_fclk = + __APP_PLL_425_ENABLE | __APP_PLL_425_LRESETN | + __APP_PLL_425_RSEL200500 | __APP_PLL_425_P0_1(0U) | + __APP_PLL_425_JITLMT0_1(3U) | + __APP_PLL_425_CNTLMT0_1(1U); + + /** + * For catapult, choose operational mode FC/FCoE + */ + if (ioc->fcmode) { + bfa_reg_write((rb + OP_MODE), 0); + bfa_reg_write((rb + ETH_MAC_SER_REG), + __APP_EMS_CMLCKSEL | __APP_EMS_REFCKBUFEN2 + | __APP_EMS_CHANNEL_SEL); + } else { + ioc->pllinit = BFA_TRUE; + bfa_reg_write((rb + OP_MODE), __GLOBAL_FCOE_MODE); + bfa_reg_write((rb + ETH_MAC_SER_REG), + __APP_EMS_REFCKBUFEN1); + } + } else { + pll_sclk = + __APP_PLL_312_ENABLE | __APP_PLL_312_LRESETN | + __APP_PLL_312_P0_1(3U) | __APP_PLL_312_JITLMT0_1(3U) | + __APP_PLL_312_CNTLMT0_1(3U); + pll_fclk = + __APP_PLL_425_ENABLE | __APP_PLL_425_LRESETN | + __APP_PLL_425_RSEL200500 | __APP_PLL_425_P0_1(3U) | + __APP_PLL_425_JITLMT0_1(3U) | + __APP_PLL_425_CNTLMT0_1(3U); + } + + bfa_reg_write((rb + BFA_IOC0_STATE_REG), BFI_IOC_UNINIT); + bfa_reg_write((rb + BFA_IOC1_STATE_REG), BFI_IOC_UNINIT); + + bfa_reg_write((rb + HOSTFN0_INT_MSK), 0xffffffffU); + bfa_reg_write((rb + HOSTFN1_INT_MSK), 0xffffffffU); + bfa_reg_write((rb + HOSTFN0_INT_STATUS), 0xffffffffU); + bfa_reg_write((rb + HOSTFN1_INT_STATUS), 0xffffffffU); + bfa_reg_write((rb + HOSTFN0_INT_MSK), 0xffffffffU); + bfa_reg_write((rb + HOSTFN1_INT_MSK), 0xffffffffU); + + bfa_reg_write(ioc->ioc_regs.app_pll_slow_ctl_reg, + __APP_PLL_312_LOGIC_SOFT_RESET); + bfa_reg_write(ioc->ioc_regs.app_pll_slow_ctl_reg, + __APP_PLL_312_BYPASS | __APP_PLL_312_LOGIC_SOFT_RESET); + bfa_reg_write(ioc->ioc_regs.app_pll_fast_ctl_reg, + __APP_PLL_425_LOGIC_SOFT_RESET); + bfa_reg_write(ioc->ioc_regs.app_pll_fast_ctl_reg, + __APP_PLL_425_BYPASS | __APP_PLL_425_LOGIC_SOFT_RESET); + bfa_os_udelay(2); + bfa_reg_write(ioc->ioc_regs.app_pll_slow_ctl_reg, + __APP_PLL_312_LOGIC_SOFT_RESET); + bfa_reg_write(ioc->ioc_regs.app_pll_fast_ctl_reg, + __APP_PLL_425_LOGIC_SOFT_RESET); + + bfa_reg_write(ioc->ioc_regs.app_pll_slow_ctl_reg, + pll_sclk | __APP_PLL_312_LOGIC_SOFT_RESET); + bfa_reg_write(ioc->ioc_regs.app_pll_fast_ctl_reg, + pll_fclk | __APP_PLL_425_LOGIC_SOFT_RESET); + + /** + * Wait for PLLs to lock. + */ + bfa_os_udelay(2000); + bfa_reg_write((rb + HOSTFN0_INT_STATUS), 0xffffffffU); + bfa_reg_write((rb + HOSTFN1_INT_STATUS), 0xffffffffU); + + bfa_reg_write(ioc->ioc_regs.app_pll_slow_ctl_reg, pll_sclk); + bfa_reg_write(ioc->ioc_regs.app_pll_fast_ctl_reg, pll_fclk); + + if (ioc->pcidev.device_id == BFA_PCI_DEVICE_ID_CT) { + bfa_reg_write((rb + MBIST_CTL_REG), __EDRAM_BISTR_START); + bfa_os_udelay(1000); + r32 = bfa_reg_read((rb + MBIST_STAT_REG)); + bfa_trc(ioc, r32); + } + + return BFA_STATUS_OK; +} + /** * Interface used by diag module to do firmware boot with memory test * as the entry vector. @@ -1297,7 +1642,7 @@ bfa_ioc_boot(struct bfa_ioc_s *ioc, u32 boot_type, u32 boot_param) void bfa_ioc_auto_recover(bfa_boolean_t auto_recover) { - bfa_auto_recover = auto_recover; + bfa_auto_recover = BFA_FALSE; } @@ -1419,14 +1764,6 @@ bfa_ioc_pci_init(struct bfa_ioc_s *ioc, struct bfa_pcidev_s *pcidev, ioc->ctdev = (ioc->pcidev.device_id == BFA_PCI_DEVICE_ID_CT); ioc->cna = ioc->ctdev && !ioc->fcmode; - /** - * Set asic specific interfaces. See bfa_ioc_cb.c and bfa_ioc_ct.c - */ - if (ioc->ctdev) - bfa_ioc_set_ct_hwif(ioc); - else - bfa_ioc_set_cb_hwif(ioc); - bfa_ioc_map_port(ioc); bfa_ioc_reg_init(ioc); } @@ -1493,6 +1830,7 @@ return (auto_recover) ? BFA_DBG_FWTRC_LEN : 0; void bfa_ioc_debug_memclaim(struct bfa_ioc_s *ioc, void *dbg_fwsave) { + bfa_assert(ioc->auto_recover); ioc->dbg_fwsave = dbg_fwsave; ioc->dbg_fwsave_len = bfa_ioc_debug_trcsz(ioc->auto_recover); } @@ -1635,7 +1973,7 @@ bfa_ioc_fw_mismatch(struct bfa_ioc_s *ioc) ((__sm) == BFI_IOC_INITING) || \ ((__sm) == BFI_IOC_HWINIT) || \ ((__sm) == BFI_IOC_DISABLED) || \ - ((__sm) == BFI_IOC_FAIL) || \ + ((__sm) == BFI_IOC_HBFAIL) || \ ((__sm) == BFI_IOC_CFG_DISABLED)) /** @@ -1679,28 +2017,46 @@ bfa_ioc_get_adapter_attr(struct bfa_ioc_s *ioc, struct bfa_adapter_attr_s *ad_attr) { struct bfi_ioc_attr_s *ioc_attr; + char model[BFA_ADAPTER_MODEL_NAME_LEN]; ioc_attr = ioc->attr; - - bfa_ioc_get_adapter_serial_num(ioc, ad_attr->serial_num); - bfa_ioc_get_adapter_fw_ver(ioc, ad_attr->fw_ver); - bfa_ioc_get_adapter_optrom_ver(ioc, ad_attr->optrom_ver); - bfa_ioc_get_adapter_manufacturer(ioc, ad_attr->manufacturer); + bfa_os_memcpy((void *)&ad_attr->serial_num, + (void *)ioc_attr->brcd_serialnum, + BFA_ADAPTER_SERIAL_NUM_LEN); + + bfa_os_memcpy(&ad_attr->fw_ver, ioc_attr->fw_version, BFA_VERSION_LEN); + bfa_os_memcpy(&ad_attr->optrom_ver, ioc_attr->optrom_version, + BFA_VERSION_LEN); + bfa_os_memcpy(&ad_attr->manufacturer, BFA_MFG_NAME, + BFA_ADAPTER_MFG_NAME_LEN); bfa_os_memcpy(&ad_attr->vpd, &ioc_attr->vpd, sizeof(struct bfa_mfg_vpd_s)); - ad_attr->nports = bfa_ioc_get_nports(ioc); - ad_attr->max_speed = bfa_ioc_speed_sup(ioc); + ad_attr->nports = BFI_ADAPTER_GETP(NPORTS, ioc_attr->adapter_prop); + ad_attr->max_speed = BFI_ADAPTER_GETP(SPEED, ioc_attr->adapter_prop); - bfa_ioc_get_adapter_model(ioc, ad_attr->model); - /* For now, model descr uses same model string */ - bfa_ioc_get_adapter_model(ioc, ad_attr->model_descr); + /** + * model name + */ + if (BFI_ADAPTER_GETP(SPEED, ioc_attr->adapter_prop) == 10) { + strcpy(model, "BR-10?0"); + model[5] = '0' + ad_attr->nports; + } else { + strcpy(model, "Brocade-??5"); + model[8] = + '0' + BFI_ADAPTER_GETP(SPEED, ioc_attr->adapter_prop); + model[9] = '0' + ad_attr->nports; + } if (BFI_ADAPTER_IS_SPECIAL(ioc_attr->adapter_prop)) ad_attr->prototype = 1; else ad_attr->prototype = 0; + bfa_os_memcpy(&ad_attr->model, model, BFA_ADAPTER_MODEL_NAME_LEN); + bfa_os_memcpy(&ad_attr->model_descr, &ad_attr->model, + BFA_ADAPTER_MODEL_NAME_LEN); + ad_attr->pwwn = bfa_ioc_get_pwwn(ioc); ad_attr->mac = bfa_ioc_get_mac(ioc); @@ -1708,122 +2064,41 @@ bfa_ioc_get_adapter_attr(struct bfa_ioc_s *ioc, ad_attr->pcie_lanes = ioc_attr->pcie_lanes; ad_attr->pcie_lanes_orig = ioc_attr->pcie_lanes_orig; ad_attr->asic_rev = ioc_attr->asic_rev; - - bfa_ioc_get_pci_chip_rev(ioc, ad_attr->hw_ver); + ad_attr->hw_ver[0] = 'R'; + ad_attr->hw_ver[1] = 'e'; + ad_attr->hw_ver[2] = 'v'; + ad_attr->hw_ver[3] = '-'; + ad_attr->hw_ver[4] = ioc_attr->asic_rev; + ad_attr->hw_ver[5] = '\0'; ad_attr->cna_capable = ioc->cna; } -enum bfa_ioc_type_e -bfa_ioc_get_type(struct bfa_ioc_s *ioc) -{ - if (!ioc->ctdev || ioc->fcmode) - return BFA_IOC_TYPE_FC; - else if (ioc->ioc_mc == BFI_MC_IOCFC) - return BFA_IOC_TYPE_FCoE; - else if (ioc->ioc_mc == BFI_MC_LL) - return BFA_IOC_TYPE_LL; - else { - bfa_assert(ioc->ioc_mc == BFI_MC_LL); - return BFA_IOC_TYPE_LL; - } -} - -void -bfa_ioc_get_adapter_serial_num(struct bfa_ioc_s *ioc, char *serial_num) -{ - bfa_os_memset((void *)serial_num, 0, BFA_ADAPTER_SERIAL_NUM_LEN); - bfa_os_memcpy((void *)serial_num, - (void *)ioc->attr->brcd_serialnum, - BFA_ADAPTER_SERIAL_NUM_LEN); -} - -void -bfa_ioc_get_adapter_fw_ver(struct bfa_ioc_s *ioc, char *fw_ver) -{ - bfa_os_memset((void *)fw_ver, 0, BFA_VERSION_LEN); - bfa_os_memcpy(fw_ver, ioc->attr->fw_version, BFA_VERSION_LEN); -} - -void -bfa_ioc_get_pci_chip_rev(struct bfa_ioc_s *ioc, char *chip_rev) -{ - bfa_assert(chip_rev); - - bfa_os_memset((void *)chip_rev, 0, BFA_IOC_CHIP_REV_LEN); - - chip_rev[0] = 'R'; - chip_rev[1] = 'e'; - chip_rev[2] = 'v'; - chip_rev[3] = '-'; - chip_rev[4] = ioc->attr->asic_rev; - chip_rev[5] = '\0'; -} - -void -bfa_ioc_get_adapter_optrom_ver(struct bfa_ioc_s *ioc, char *optrom_ver) -{ - bfa_os_memset((void *)optrom_ver, 0, BFA_VERSION_LEN); - bfa_os_memcpy(optrom_ver, ioc->attr->optrom_version, - BFA_VERSION_LEN); -} - -void -bfa_ioc_get_adapter_manufacturer(struct bfa_ioc_s *ioc, char *manufacturer) -{ - bfa_os_memset((void *)manufacturer, 0, BFA_ADAPTER_MFG_NAME_LEN); - bfa_os_memcpy(manufacturer, BFA_MFG_NAME, BFA_ADAPTER_MFG_NAME_LEN); -} - -void -bfa_ioc_get_adapter_model(struct bfa_ioc_s *ioc, char *model) -{ - struct bfi_ioc_attr_s *ioc_attr; - u8 nports; - u8 max_speed; - - bfa_assert(model); - bfa_os_memset((void *)model, 0, BFA_ADAPTER_MODEL_NAME_LEN); - - ioc_attr = ioc->attr; - - nports = bfa_ioc_get_nports(ioc); - max_speed = bfa_ioc_speed_sup(ioc); - - /** - * model name - */ - if (max_speed == 10) { - strcpy(model, "BR-10?0"); - model[5] = '0' + nports; - } else { - strcpy(model, "Brocade-??5"); - model[8] = '0' + max_speed; - model[9] = '0' + nports; - } -} - -enum bfa_ioc_state -bfa_ioc_get_state(struct bfa_ioc_s *ioc) -{ - return bfa_sm_to_state(ioc_sm_table, ioc->fsm); -} - void bfa_ioc_get_attr(struct bfa_ioc_s *ioc, struct bfa_ioc_attr_s *ioc_attr) { bfa_os_memset((void *)ioc_attr, 0, sizeof(struct bfa_ioc_attr_s)); - ioc_attr->state = bfa_ioc_get_state(ioc); + ioc_attr->state = bfa_sm_to_state(ioc_sm_table, ioc->fsm); ioc_attr->port_id = ioc->port_id; - ioc_attr->ioc_type = bfa_ioc_get_type(ioc); + if (!ioc->ctdev) + ioc_attr->ioc_type = BFA_IOC_TYPE_FC; + else if (ioc->ioc_mc == BFI_MC_IOCFC) + ioc_attr->ioc_type = BFA_IOC_TYPE_FCoE; + else if (ioc->ioc_mc == BFI_MC_LL) + ioc_attr->ioc_type = BFA_IOC_TYPE_LL; bfa_ioc_get_adapter_attr(ioc, &ioc_attr->adapter_attr); ioc_attr->pci_attr.device_id = ioc->pcidev.device_id; ioc_attr->pci_attr.pcifn = ioc->pcidev.pci_func; - bfa_ioc_get_pci_chip_rev(ioc, ioc_attr->pci_attr.chip_rev); + ioc_attr->pci_attr.chip_rev[0] = 'R'; + ioc_attr->pci_attr.chip_rev[1] = 'e'; + ioc_attr->pci_attr.chip_rev[2] = 'v'; + ioc_attr->pci_attr.chip_rev[3] = '-'; + ioc_attr->pci_attr.chip_rev[4] = ioc_attr->adapter_attr.asic_rev; + ioc_attr->pci_attr.chip_rev[5] = '\0'; } /** @@ -1919,6 +2194,29 @@ bfa_ioc_get_fcmode(struct bfa_ioc_s *ioc) return ioc->fcmode || (ioc->pcidev.device_id != BFA_PCI_DEVICE_ID_CT); } +/** + * Return true if interrupt should be claimed. + */ +bfa_boolean_t +bfa_ioc_intx_claim(struct bfa_ioc_s *ioc) +{ + u32 isr, msk; + + /** + * Always claim if not catapult. + */ + if (!ioc->ctdev) + return BFA_TRUE; + + /** + * FALSE if next device is claiming interrupt. + * TRUE if next device is not interrupting or not present. + */ + msk = bfa_reg_read(ioc->ioc_regs.shirq_msk_next); + isr = bfa_reg_read(ioc->ioc_regs.shirq_isr_next); + return !(isr & ~msk); +} + /** * Send AEN notification */ @@ -1928,14 +2226,32 @@ bfa_ioc_aen_post(struct bfa_ioc_s *ioc, enum bfa_ioc_aen_event event) union bfa_aen_data_u aen_data; struct bfa_log_mod_s *logmod = ioc->logm; s32 inst_num = 0; - enum bfa_ioc_type_e ioc_type; + struct bfa_ioc_attr_s ioc_attr; - bfa_log(logmod, BFA_LOG_CREATE_ID(BFA_AEN_CAT_IOC, event), inst_num); + switch (event) { + case BFA_IOC_AEN_HBGOOD: + bfa_log(logmod, BFA_AEN_IOC_HBGOOD, inst_num); + break; + case BFA_IOC_AEN_HBFAIL: + bfa_log(logmod, BFA_AEN_IOC_HBFAIL, inst_num); + break; + case BFA_IOC_AEN_ENABLE: + bfa_log(logmod, BFA_AEN_IOC_ENABLE, inst_num); + break; + case BFA_IOC_AEN_DISABLE: + bfa_log(logmod, BFA_AEN_IOC_DISABLE, inst_num); + break; + case BFA_IOC_AEN_FWMISMATCH: + bfa_log(logmod, BFA_AEN_IOC_FWMISMATCH, inst_num); + break; + default: + break; + } memset(&aen_data.ioc.pwwn, 0, sizeof(aen_data.ioc.pwwn)); memset(&aen_data.ioc.mac, 0, sizeof(aen_data.ioc.mac)); - ioc_type = bfa_ioc_get_type(ioc); - switch (ioc_type) { + bfa_ioc_get_attr(ioc, &ioc_attr); + switch (ioc_attr.ioc_type) { case BFA_IOC_TYPE_FC: aen_data.ioc.pwwn = bfa_ioc_get_pwwn(ioc); break; @@ -1947,10 +2263,10 @@ bfa_ioc_aen_post(struct bfa_ioc_s *ioc, enum bfa_ioc_aen_event event) aen_data.ioc.mac = bfa_ioc_get_mac(ioc); break; default: - bfa_assert(ioc_type == BFA_IOC_TYPE_FC); + bfa_assert(ioc_attr.ioc_type == BFA_IOC_TYPE_FC); break; } - aen_data.ioc.ioc_type = ioc_type; + aen_data.ioc.ioc_type = ioc_attr.ioc_type; } /** @@ -1973,15 +2289,6 @@ bfa_ioc_debug_fwsave(struct bfa_ioc_s *ioc, void *trcdata, int *trclen) return BFA_STATUS_OK; } -/** - * Clear saved firmware trace - */ -void -bfa_ioc_debug_fwsave_clear(struct bfa_ioc_s *ioc) -{ - ioc->dbg_fwsave_once = BFA_TRUE; -} - /** * Retrieve saved firmware trace from a prior IOC failure. */ @@ -1997,13 +2304,6 @@ bfa_ioc_debug_fwtrc(struct bfa_ioc_s *ioc, void *trcdata, int *trclen) pgnum = bfa_ioc_smem_pgnum(ioc, loff); loff = bfa_ioc_smem_pgoff(ioc, loff); - - /* - * Hold semaphore to serialize pll init and fwtrc. - */ - if (BFA_FALSE == bfa_ioc_sem_get(ioc->ioc_regs.ioc_init_sem_reg)) - return BFA_STATUS_FAILED; - bfa_reg_write(ioc->ioc_regs.host_page_num_fn, pgnum); tlen = *trclen; @@ -2029,12 +2329,6 @@ bfa_ioc_debug_fwtrc(struct bfa_ioc_s *ioc, void *trcdata, int *trclen) } bfa_reg_write(ioc->ioc_regs.host_page_num_fn, bfa_ioc_smem_pgnum(ioc, 0)); - - /* - * release semaphore. - */ - bfa_ioc_sem_release(ioc->ioc_regs.ioc_init_sem_reg); - bfa_trc(ioc, pgnum); *trclen = tlen * sizeof(u32); diff --git a/trunk/drivers/scsi/bfa/bfa_ioc.h b/trunk/drivers/scsi/bfa/bfa_ioc.h index d0804406ea1a..7c30f05ab137 100644 --- a/trunk/drivers/scsi/bfa/bfa_ioc.h +++ b/trunk/drivers/scsi/bfa/bfa_ioc.h @@ -74,18 +74,15 @@ struct bfa_ioc_regs_s { bfa_os_addr_t lpu_mbox_cmd; bfa_os_addr_t lpu_mbox; bfa_os_addr_t pss_ctl_reg; - bfa_os_addr_t pss_err_status_reg; bfa_os_addr_t app_pll_fast_ctl_reg; bfa_os_addr_t app_pll_slow_ctl_reg; bfa_os_addr_t ioc_sem_reg; bfa_os_addr_t ioc_usage_sem_reg; - bfa_os_addr_t ioc_init_sem_reg; bfa_os_addr_t ioc_usage_reg; bfa_os_addr_t host_page_num_fn; bfa_os_addr_t heartbeat; bfa_os_addr_t ioc_fwstate; bfa_os_addr_t ll_halt; - bfa_os_addr_t err_set; bfa_os_addr_t shirq_isr_next; bfa_os_addr_t shirq_msk_next; bfa_os_addr_t smem_page_start; @@ -157,6 +154,7 @@ struct bfa_ioc_s { struct bfa_timer_s ioc_timer; struct bfa_timer_s sem_timer; u32 hb_count; + u32 hb_fail; u32 retry_count; struct list_head hb_notify_q; void *dbg_fwsave; @@ -179,22 +177,6 @@ struct bfa_ioc_s { struct bfi_ioc_attr_s *attr; struct bfa_ioc_cbfn_s *cbfn; struct bfa_ioc_mbox_mod_s mbox_mod; - struct bfa_ioc_hwif_s *ioc_hwif; -}; - -struct bfa_ioc_hwif_s { - bfa_status_t (*ioc_pll_init) (struct bfa_ioc_s *ioc); - bfa_boolean_t (*ioc_firmware_lock) (struct bfa_ioc_s *ioc); - void (*ioc_firmware_unlock) (struct bfa_ioc_s *ioc); - u32 * (*ioc_fwimg_get_chunk) (struct bfa_ioc_s *ioc, - u32 off); - u32 (*ioc_fwimg_get_size) (struct bfa_ioc_s *ioc); - void (*ioc_reg_init) (struct bfa_ioc_s *ioc); - void (*ioc_map_port) (struct bfa_ioc_s *ioc); - void (*ioc_isr_mode_set) (struct bfa_ioc_s *ioc, - bfa_boolean_t msix); - void (*ioc_notify_hbfail) (struct bfa_ioc_s *ioc); - void (*ioc_ownership_reset) (struct bfa_ioc_s *ioc); }; #define bfa_ioc_pcifn(__ioc) ((__ioc)->pcidev.pci_func) @@ -209,15 +191,6 @@ struct bfa_ioc_hwif_s { #define bfa_ioc_rx_bbcredit(__ioc) ((__ioc)->attr->rx_bbcredit) #define bfa_ioc_speed_sup(__ioc) \ BFI_ADAPTER_GETP(SPEED, (__ioc)->attr->adapter_prop) -#define bfa_ioc_get_nports(__ioc) \ - BFI_ADAPTER_GETP(NPORTS, (__ioc)->attr->adapter_prop) - -#define bfa_ioc_stats(_ioc, _stats) ((_ioc)->stats._stats++) -#define BFA_IOC_FWIMG_MINSZ (16 * 1024) - -#define BFA_IOC_FLASH_CHUNK_NO(off) (off / BFI_FLASH_CHUNK_SZ_WORDS) -#define BFA_IOC_FLASH_OFFSET_IN_CHUNK(off) (off % BFI_FLASH_CHUNK_SZ_WORDS) -#define BFA_IOC_FLASH_CHUNK_ADDR(chunkno) (chunkno * BFI_FLASH_CHUNK_SZ_WORDS) /** * IOC mailbox interface @@ -234,14 +207,6 @@ void bfa_ioc_mbox_regisr(struct bfa_ioc_s *ioc, enum bfi_mclass mc, /** * IOC interfaces */ -#define bfa_ioc_pll_init(__ioc) ((__ioc)->ioc_hwif->ioc_pll_init(__ioc)) -#define bfa_ioc_isr_mode_set(__ioc, __msix) \ - ((__ioc)->ioc_hwif->ioc_isr_mode_set(__ioc, __msix)) -#define bfa_ioc_ownership_reset(__ioc) \ - ((__ioc)->ioc_hwif->ioc_ownership_reset(__ioc)) - -void bfa_ioc_set_ct_hwif(struct bfa_ioc_s *ioc); -void bfa_ioc_set_cb_hwif(struct bfa_ioc_s *ioc); void bfa_ioc_attach(struct bfa_ioc_s *ioc, void *bfa, struct bfa_ioc_cbfn_s *cbfn, struct bfa_timer_mod_s *timer_mod, struct bfa_trc_mod_s *trcmod, @@ -258,21 +223,13 @@ bfa_boolean_t bfa_ioc_intx_claim(struct bfa_ioc_s *ioc); void bfa_ioc_boot(struct bfa_ioc_s *ioc, u32 boot_type, u32 boot_param); void bfa_ioc_isr(struct bfa_ioc_s *ioc, struct bfi_mbmsg_s *msg); void bfa_ioc_error_isr(struct bfa_ioc_s *ioc); +void bfa_ioc_isr_mode_set(struct bfa_ioc_s *ioc, bfa_boolean_t intx); +bfa_status_t bfa_ioc_pll_init(struct bfa_ioc_s *ioc); bfa_boolean_t bfa_ioc_is_operational(struct bfa_ioc_s *ioc); bfa_boolean_t bfa_ioc_is_disabled(struct bfa_ioc_s *ioc); bfa_boolean_t bfa_ioc_fw_mismatch(struct bfa_ioc_s *ioc); bfa_boolean_t bfa_ioc_adapter_is_disabled(struct bfa_ioc_s *ioc); void bfa_ioc_cfg_complete(struct bfa_ioc_s *ioc); -enum bfa_ioc_type_e bfa_ioc_get_type(struct bfa_ioc_s *ioc); -void bfa_ioc_get_adapter_serial_num(struct bfa_ioc_s *ioc, char *serial_num); -void bfa_ioc_get_adapter_fw_ver(struct bfa_ioc_s *ioc, char *fw_ver); -void bfa_ioc_get_adapter_optrom_ver(struct bfa_ioc_s *ioc, char *optrom_ver); -void bfa_ioc_get_adapter_model(struct bfa_ioc_s *ioc, char *model); -void bfa_ioc_get_adapter_manufacturer(struct bfa_ioc_s *ioc, - char *manufacturer); -void bfa_ioc_get_pci_chip_rev(struct bfa_ioc_s *ioc, char *chip_rev); -enum bfa_ioc_state bfa_ioc_get_state(struct bfa_ioc_s *ioc); - void bfa_ioc_get_attr(struct bfa_ioc_s *ioc, struct bfa_ioc_attr_s *ioc_attr); void bfa_ioc_get_adapter_attr(struct bfa_ioc_s *ioc, struct bfa_adapter_attr_s *ad_attr); @@ -280,7 +237,6 @@ int bfa_ioc_debug_trcsz(bfa_boolean_t auto_recover); void bfa_ioc_debug_memclaim(struct bfa_ioc_s *ioc, void *dbg_fwsave); bfa_status_t bfa_ioc_debug_fwsave(struct bfa_ioc_s *ioc, void *trcdata, int *trclen); -void bfa_ioc_debug_fwsave_clear(struct bfa_ioc_s *ioc); bfa_status_t bfa_ioc_debug_fwtrc(struct bfa_ioc_s *ioc, void *trcdata, int *trclen); u32 bfa_ioc_smem_pgnum(struct bfa_ioc_s *ioc, u32 fmaddr); @@ -289,13 +245,6 @@ void bfa_ioc_set_fcmode(struct bfa_ioc_s *ioc); bfa_boolean_t bfa_ioc_get_fcmode(struct bfa_ioc_s *ioc); void bfa_ioc_hbfail_register(struct bfa_ioc_s *ioc, struct bfa_ioc_hbfail_notify_s *notify); -bfa_boolean_t bfa_ioc_sem_get(bfa_os_addr_t sem_reg); -void bfa_ioc_sem_release(bfa_os_addr_t sem_reg); -void bfa_ioc_hw_sem_release(struct bfa_ioc_s *ioc); -void bfa_ioc_fwver_get(struct bfa_ioc_s *ioc, - struct bfi_ioc_image_hdr_s *fwhdr); -bfa_boolean_t bfa_ioc_fwver_cmp(struct bfa_ioc_s *ioc, - struct bfi_ioc_image_hdr_s *fwhdr); /* * bfa mfg wwn API functions diff --git a/trunk/drivers/scsi/bfa/bfa_ioc_cb.c b/trunk/drivers/scsi/bfa/bfa_ioc_cb.c deleted file mode 100644 index 3ce85319f739..000000000000 --- a/trunk/drivers/scsi/bfa/bfa_ioc_cb.c +++ /dev/null @@ -1,274 +0,0 @@ -/* - * Copyright (c) 2005-2009 Brocade Communications Systems, Inc. - * All rights reserved - * www.brocade.com - * - * Linux driver for Brocade Fibre Channel Host Bus Adapter. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License (GPL) Version 2 as - * published by the Free Software Foundation - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -BFA_TRC_FILE(CNA, IOC_CB); - -/* - * forward declarations - */ -static bfa_status_t bfa_ioc_cb_pll_init(struct bfa_ioc_s *ioc); -static bfa_boolean_t bfa_ioc_cb_firmware_lock(struct bfa_ioc_s *ioc); -static void bfa_ioc_cb_firmware_unlock(struct bfa_ioc_s *ioc); -static u32 *bfa_ioc_cb_fwimg_get_chunk(struct bfa_ioc_s *ioc, u32 off); -static u32 bfa_ioc_cb_fwimg_get_size(struct bfa_ioc_s *ioc); -static void bfa_ioc_cb_reg_init(struct bfa_ioc_s *ioc); -static void bfa_ioc_cb_map_port(struct bfa_ioc_s *ioc); -static void bfa_ioc_cb_isr_mode_set(struct bfa_ioc_s *ioc, bfa_boolean_t msix); -static void bfa_ioc_cb_notify_hbfail(struct bfa_ioc_s *ioc); -static void bfa_ioc_cb_ownership_reset(struct bfa_ioc_s *ioc); - -struct bfa_ioc_hwif_s hwif_cb = { - bfa_ioc_cb_pll_init, - bfa_ioc_cb_firmware_lock, - bfa_ioc_cb_firmware_unlock, - bfa_ioc_cb_fwimg_get_chunk, - bfa_ioc_cb_fwimg_get_size, - bfa_ioc_cb_reg_init, - bfa_ioc_cb_map_port, - bfa_ioc_cb_isr_mode_set, - bfa_ioc_cb_notify_hbfail, - bfa_ioc_cb_ownership_reset, -}; - -/** - * Called from bfa_ioc_attach() to map asic specific calls. - */ -void -bfa_ioc_set_cb_hwif(struct bfa_ioc_s *ioc) -{ - ioc->ioc_hwif = &hwif_cb; -} - -static u32 * -bfa_ioc_cb_fwimg_get_chunk(struct bfa_ioc_s *ioc, u32 off) -{ - return bfi_image_cb_get_chunk(off); -} - -static u32 -bfa_ioc_cb_fwimg_get_size(struct bfa_ioc_s *ioc) -{ - return bfi_image_cb_size; -} - -/** - * Return true if firmware of current driver matches the running firmware. - */ -static bfa_boolean_t -bfa_ioc_cb_firmware_lock(struct bfa_ioc_s *ioc) -{ - return BFA_TRUE; -} - -static void -bfa_ioc_cb_firmware_unlock(struct bfa_ioc_s *ioc) -{ -} - -/** - * Notify other functions on HB failure. - */ -static void -bfa_ioc_cb_notify_hbfail(struct bfa_ioc_s *ioc) -{ - bfa_reg_write(ioc->ioc_regs.err_set, __PSS_ERR_STATUS_SET); - bfa_reg_read(ioc->ioc_regs.err_set); -} - -/** - * Host to LPU mailbox message addresses - */ -static struct { u32 hfn_mbox, lpu_mbox, hfn_pgn; } iocreg_fnreg[] = { - { HOSTFN0_LPU_MBOX0_0, LPU_HOSTFN0_MBOX0_0, HOST_PAGE_NUM_FN0 }, - { HOSTFN1_LPU_MBOX0_8, LPU_HOSTFN1_MBOX0_8, HOST_PAGE_NUM_FN1 } -}; - -/** - * Host <-> LPU mailbox command/status registers - */ -static struct { u32 hfn, lpu; } iocreg_mbcmd[] = { - { HOSTFN0_LPU0_CMD_STAT, LPU0_HOSTFN0_CMD_STAT }, - { HOSTFN1_LPU1_CMD_STAT, LPU1_HOSTFN1_CMD_STAT } -}; - -static void -bfa_ioc_cb_reg_init(struct bfa_ioc_s *ioc) -{ - bfa_os_addr_t rb; - int pcifn = bfa_ioc_pcifn(ioc); - - rb = bfa_ioc_bar0(ioc); - - ioc->ioc_regs.hfn_mbox = rb + iocreg_fnreg[pcifn].hfn_mbox; - ioc->ioc_regs.lpu_mbox = rb + iocreg_fnreg[pcifn].lpu_mbox; - ioc->ioc_regs.host_page_num_fn = rb + iocreg_fnreg[pcifn].hfn_pgn; - - if (ioc->port_id == 0) { - ioc->ioc_regs.heartbeat = rb + BFA_IOC0_HBEAT_REG; - ioc->ioc_regs.ioc_fwstate = rb + BFA_IOC0_STATE_REG; - } else { - ioc->ioc_regs.heartbeat = (rb + BFA_IOC1_HBEAT_REG); - ioc->ioc_regs.ioc_fwstate = (rb + BFA_IOC1_STATE_REG); - } - - /** - * Host <-> LPU mailbox command/status registers - */ - ioc->ioc_regs.hfn_mbox_cmd = rb + iocreg_mbcmd[pcifn].hfn; - ioc->ioc_regs.lpu_mbox_cmd = rb + iocreg_mbcmd[pcifn].lpu; - - /* - * PSS control registers - */ - ioc->ioc_regs.pss_ctl_reg = (rb + PSS_CTL_REG); - ioc->ioc_regs.pss_err_status_reg = (rb + PSS_ERR_STATUS_REG); - ioc->ioc_regs.app_pll_fast_ctl_reg = (rb + APP_PLL_400_CTL_REG); - ioc->ioc_regs.app_pll_slow_ctl_reg = (rb + APP_PLL_212_CTL_REG); - - /* - * IOC semaphore registers and serialization - */ - ioc->ioc_regs.ioc_sem_reg = (rb + HOST_SEM0_REG); - ioc->ioc_regs.ioc_init_sem_reg = (rb + HOST_SEM2_REG); - - /** - * sram memory access - */ - ioc->ioc_regs.smem_page_start = (rb + PSS_SMEM_PAGE_START); - ioc->ioc_regs.smem_pg0 = BFI_IOC_SMEM_PG0_CB; - - /* - * err set reg : for notification of hb failure - */ - ioc->ioc_regs.err_set = (rb + ERR_SET_REG); -} - -/** - * Initialize IOC to port mapping. - */ -static void -bfa_ioc_cb_map_port(struct bfa_ioc_s *ioc) -{ - /** - * For crossbow, port id is same as pci function. - */ - ioc->port_id = bfa_ioc_pcifn(ioc); - bfa_trc(ioc, ioc->port_id); -} - -/** - * Set interrupt mode for a function: INTX or MSIX - */ -static void -bfa_ioc_cb_isr_mode_set(struct bfa_ioc_s *ioc, bfa_boolean_t msix) -{ -} - -static bfa_status_t -bfa_ioc_cb_pll_init(struct bfa_ioc_s *ioc) -{ - bfa_os_addr_t rb = ioc->pcidev.pci_bar_kva; - u32 pll_sclk, pll_fclk; - - /* - * Hold semaphore so that nobody can access the chip during init. - */ - bfa_ioc_sem_get(ioc->ioc_regs.ioc_init_sem_reg); - - pll_sclk = __APP_PLL_212_ENABLE | __APP_PLL_212_LRESETN | - __APP_PLL_212_P0_1(3U) | - __APP_PLL_212_JITLMT0_1(3U) | - __APP_PLL_212_CNTLMT0_1(3U); - pll_fclk = __APP_PLL_400_ENABLE | __APP_PLL_400_LRESETN | - __APP_PLL_400_RSEL200500 | __APP_PLL_400_P0_1(3U) | - __APP_PLL_400_JITLMT0_1(3U) | - __APP_PLL_400_CNTLMT0_1(3U); - - bfa_reg_write((rb + BFA_IOC0_STATE_REG), BFI_IOC_UNINIT); - bfa_reg_write((rb + BFA_IOC1_STATE_REG), BFI_IOC_UNINIT); - - bfa_reg_write((rb + HOSTFN0_INT_MSK), 0xffffffffU); - bfa_reg_write((rb + HOSTFN1_INT_MSK), 0xffffffffU); - bfa_reg_write((rb + HOSTFN0_INT_STATUS), 0xffffffffU); - bfa_reg_write((rb + HOSTFN1_INT_STATUS), 0xffffffffU); - bfa_reg_write((rb + HOSTFN0_INT_MSK), 0xffffffffU); - bfa_reg_write((rb + HOSTFN1_INT_MSK), 0xffffffffU); - - bfa_reg_write(ioc->ioc_regs.app_pll_slow_ctl_reg, - __APP_PLL_212_LOGIC_SOFT_RESET); - bfa_reg_write(ioc->ioc_regs.app_pll_slow_ctl_reg, - __APP_PLL_212_BYPASS | - __APP_PLL_212_LOGIC_SOFT_RESET); - bfa_reg_write(ioc->ioc_regs.app_pll_fast_ctl_reg, - __APP_PLL_400_LOGIC_SOFT_RESET); - bfa_reg_write(ioc->ioc_regs.app_pll_fast_ctl_reg, - __APP_PLL_400_BYPASS | - __APP_PLL_400_LOGIC_SOFT_RESET); - bfa_os_udelay(2); - bfa_reg_write(ioc->ioc_regs.app_pll_slow_ctl_reg, - __APP_PLL_212_LOGIC_SOFT_RESET); - bfa_reg_write(ioc->ioc_regs.app_pll_fast_ctl_reg, - __APP_PLL_400_LOGIC_SOFT_RESET); - - bfa_reg_write(ioc->ioc_regs.app_pll_slow_ctl_reg, - pll_sclk | __APP_PLL_212_LOGIC_SOFT_RESET); - bfa_reg_write(ioc->ioc_regs.app_pll_fast_ctl_reg, - pll_fclk | __APP_PLL_400_LOGIC_SOFT_RESET); - - /** - * Wait for PLLs to lock. - */ - bfa_os_udelay(2000); - bfa_reg_write((rb + HOSTFN0_INT_STATUS), 0xffffffffU); - bfa_reg_write((rb + HOSTFN1_INT_STATUS), 0xffffffffU); - - bfa_reg_write(ioc->ioc_regs.app_pll_slow_ctl_reg, pll_sclk); - bfa_reg_write(ioc->ioc_regs.app_pll_fast_ctl_reg, pll_fclk); - - /* - * release semaphore. - */ - bfa_ioc_sem_release(ioc->ioc_regs.ioc_init_sem_reg); - - return BFA_STATUS_OK; -} - -/** - * Cleanup hw semaphore and usecnt registers - */ -static void -bfa_ioc_cb_ownership_reset(struct bfa_ioc_s *ioc) -{ - - /* - * Read the hw sem reg to make sure that it is locked - * before we clear it. If it is not locked, writing 1 - * will lock it instead of clearing it. - */ - bfa_reg_read(ioc->ioc_regs.ioc_sem_reg); - bfa_ioc_hw_sem_release(ioc); -} diff --git a/trunk/drivers/scsi/bfa/bfa_ioc_ct.c b/trunk/drivers/scsi/bfa/bfa_ioc_ct.c deleted file mode 100644 index 20b58ad5f95c..000000000000 --- a/trunk/drivers/scsi/bfa/bfa_ioc_ct.c +++ /dev/null @@ -1,423 +0,0 @@ -/* - * Copyright (c) 2005-2009 Brocade Communications Systems, Inc. - * All rights reserved - * www.brocade.com - * - * Linux driver for Brocade Fibre Channel Host Bus Adapter. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License (GPL) Version 2 as - * published by the Free Software Foundation - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -BFA_TRC_FILE(CNA, IOC_CT); - -/* - * forward declarations - */ -static bfa_status_t bfa_ioc_ct_pll_init(struct bfa_ioc_s *ioc); -static bfa_boolean_t bfa_ioc_ct_firmware_lock(struct bfa_ioc_s *ioc); -static void bfa_ioc_ct_firmware_unlock(struct bfa_ioc_s *ioc); -static u32* bfa_ioc_ct_fwimg_get_chunk(struct bfa_ioc_s *ioc, - u32 off); -static u32 bfa_ioc_ct_fwimg_get_size(struct bfa_ioc_s *ioc); -static void bfa_ioc_ct_reg_init(struct bfa_ioc_s *ioc); -static void bfa_ioc_ct_map_port(struct bfa_ioc_s *ioc); -static void bfa_ioc_ct_isr_mode_set(struct bfa_ioc_s *ioc, bfa_boolean_t msix); -static void bfa_ioc_ct_notify_hbfail(struct bfa_ioc_s *ioc); -static void bfa_ioc_ct_ownership_reset(struct bfa_ioc_s *ioc); - -struct bfa_ioc_hwif_s hwif_ct = { - bfa_ioc_ct_pll_init, - bfa_ioc_ct_firmware_lock, - bfa_ioc_ct_firmware_unlock, - bfa_ioc_ct_fwimg_get_chunk, - bfa_ioc_ct_fwimg_get_size, - bfa_ioc_ct_reg_init, - bfa_ioc_ct_map_port, - bfa_ioc_ct_isr_mode_set, - bfa_ioc_ct_notify_hbfail, - bfa_ioc_ct_ownership_reset, -}; - -/** - * Called from bfa_ioc_attach() to map asic specific calls. - */ -void -bfa_ioc_set_ct_hwif(struct bfa_ioc_s *ioc) -{ - ioc->ioc_hwif = &hwif_ct; -} - -static u32* -bfa_ioc_ct_fwimg_get_chunk(struct bfa_ioc_s *ioc, u32 off) -{ - return bfi_image_ct_get_chunk(off); -} - -static u32 -bfa_ioc_ct_fwimg_get_size(struct bfa_ioc_s *ioc) -{ - return bfi_image_ct_size; -} - -/** - * Return true if firmware of current driver matches the running firmware. - */ -static bfa_boolean_t -bfa_ioc_ct_firmware_lock(struct bfa_ioc_s *ioc) -{ - enum bfi_ioc_state ioc_fwstate; - u32 usecnt; - struct bfi_ioc_image_hdr_s fwhdr; - - /** - * Firmware match check is relevant only for CNA. - */ - if (!ioc->cna) - return BFA_TRUE; - - /** - * If bios boot (flash based) -- do not increment usage count - */ - if (bfa_ioc_ct_fwimg_get_size(ioc) < BFA_IOC_FWIMG_MINSZ) - return BFA_TRUE; - - bfa_ioc_sem_get(ioc->ioc_regs.ioc_usage_sem_reg); - usecnt = bfa_reg_read(ioc->ioc_regs.ioc_usage_reg); - - /** - * If usage count is 0, always return TRUE. - */ - if (usecnt == 0) { - bfa_reg_write(ioc->ioc_regs.ioc_usage_reg, 1); - bfa_ioc_sem_release(ioc->ioc_regs.ioc_usage_sem_reg); - bfa_trc(ioc, usecnt); - return BFA_TRUE; - } - - ioc_fwstate = bfa_reg_read(ioc->ioc_regs.ioc_fwstate); - bfa_trc(ioc, ioc_fwstate); - - /** - * Use count cannot be non-zero and chip in uninitialized state. - */ - bfa_assert(ioc_fwstate != BFI_IOC_UNINIT); - - /** - * Check if another driver with a different firmware is active - */ - bfa_ioc_fwver_get(ioc, &fwhdr); - if (!bfa_ioc_fwver_cmp(ioc, &fwhdr)) { - bfa_ioc_sem_release(ioc->ioc_regs.ioc_usage_sem_reg); - bfa_trc(ioc, usecnt); - return BFA_FALSE; - } - - /** - * Same firmware version. Increment the reference count. - */ - usecnt++; - bfa_reg_write(ioc->ioc_regs.ioc_usage_reg, usecnt); - bfa_ioc_sem_release(ioc->ioc_regs.ioc_usage_sem_reg); - bfa_trc(ioc, usecnt); - return BFA_TRUE; -} - -static void -bfa_ioc_ct_firmware_unlock(struct bfa_ioc_s *ioc) -{ - u32 usecnt; - - /** - * Firmware lock is relevant only for CNA. - * If bios boot (flash based) -- do not decrement usage count - */ - if (!ioc->cna || bfa_ioc_ct_fwimg_get_size(ioc) < BFA_IOC_FWIMG_MINSZ) - return; - - /** - * decrement usage count - */ - bfa_ioc_sem_get(ioc->ioc_regs.ioc_usage_sem_reg); - usecnt = bfa_reg_read(ioc->ioc_regs.ioc_usage_reg); - bfa_assert(usecnt > 0); - - usecnt--; - bfa_reg_write(ioc->ioc_regs.ioc_usage_reg, usecnt); - bfa_trc(ioc, usecnt); - - bfa_ioc_sem_release(ioc->ioc_regs.ioc_usage_sem_reg); -} - -/** - * Notify other functions on HB failure. - */ -static void -bfa_ioc_ct_notify_hbfail(struct bfa_ioc_s *ioc) -{ - if (ioc->cna) { - bfa_reg_write(ioc->ioc_regs.ll_halt, __FW_INIT_HALT_P); - /* Wait for halt to take effect */ - bfa_reg_read(ioc->ioc_regs.ll_halt); - } else { - bfa_reg_write(ioc->ioc_regs.err_set, __PSS_ERR_STATUS_SET); - bfa_reg_read(ioc->ioc_regs.err_set); - } -} - -/** - * Host to LPU mailbox message addresses - */ -static struct { u32 hfn_mbox, lpu_mbox, hfn_pgn; } iocreg_fnreg[] = { - { HOSTFN0_LPU_MBOX0_0, LPU_HOSTFN0_MBOX0_0, HOST_PAGE_NUM_FN0 }, - { HOSTFN1_LPU_MBOX0_8, LPU_HOSTFN1_MBOX0_8, HOST_PAGE_NUM_FN1 }, - { HOSTFN2_LPU_MBOX0_0, LPU_HOSTFN2_MBOX0_0, HOST_PAGE_NUM_FN2 }, - { HOSTFN3_LPU_MBOX0_8, LPU_HOSTFN3_MBOX0_8, HOST_PAGE_NUM_FN3 } -}; - -/** - * Host <-> LPU mailbox command/status registers - port 0 - */ -static struct { u32 hfn, lpu; } iocreg_mbcmd_p0[] = { - { HOSTFN0_LPU0_MBOX0_CMD_STAT, LPU0_HOSTFN0_MBOX0_CMD_STAT }, - { HOSTFN1_LPU0_MBOX0_CMD_STAT, LPU0_HOSTFN1_MBOX0_CMD_STAT }, - { HOSTFN2_LPU0_MBOX0_CMD_STAT, LPU0_HOSTFN2_MBOX0_CMD_STAT }, - { HOSTFN3_LPU0_MBOX0_CMD_STAT, LPU0_HOSTFN3_MBOX0_CMD_STAT } -}; - -/** - * Host <-> LPU mailbox command/status registers - port 1 - */ -static struct { u32 hfn, lpu; } iocreg_mbcmd_p1[] = { - { HOSTFN0_LPU1_MBOX0_CMD_STAT, LPU1_HOSTFN0_MBOX0_CMD_STAT }, - { HOSTFN1_LPU1_MBOX0_CMD_STAT, LPU1_HOSTFN1_MBOX0_CMD_STAT }, - { HOSTFN2_LPU1_MBOX0_CMD_STAT, LPU1_HOSTFN2_MBOX0_CMD_STAT }, - { HOSTFN3_LPU1_MBOX0_CMD_STAT, LPU1_HOSTFN3_MBOX0_CMD_STAT } -}; - -static void -bfa_ioc_ct_reg_init(struct bfa_ioc_s *ioc) -{ - bfa_os_addr_t rb; - int pcifn = bfa_ioc_pcifn(ioc); - - rb = bfa_ioc_bar0(ioc); - - ioc->ioc_regs.hfn_mbox = rb + iocreg_fnreg[pcifn].hfn_mbox; - ioc->ioc_regs.lpu_mbox = rb + iocreg_fnreg[pcifn].lpu_mbox; - ioc->ioc_regs.host_page_num_fn = rb + iocreg_fnreg[pcifn].hfn_pgn; - - if (ioc->port_id == 0) { - ioc->ioc_regs.heartbeat = rb + BFA_IOC0_HBEAT_REG; - ioc->ioc_regs.ioc_fwstate = rb + BFA_IOC0_STATE_REG; - ioc->ioc_regs.hfn_mbox_cmd = rb + iocreg_mbcmd_p0[pcifn].hfn; - ioc->ioc_regs.lpu_mbox_cmd = rb + iocreg_mbcmd_p0[pcifn].lpu; - ioc->ioc_regs.ll_halt = rb + FW_INIT_HALT_P0; - } else { - ioc->ioc_regs.heartbeat = (rb + BFA_IOC1_HBEAT_REG); - ioc->ioc_regs.ioc_fwstate = (rb + BFA_IOC1_STATE_REG); - ioc->ioc_regs.hfn_mbox_cmd = rb + iocreg_mbcmd_p1[pcifn].hfn; - ioc->ioc_regs.lpu_mbox_cmd = rb + iocreg_mbcmd_p1[pcifn].lpu; - ioc->ioc_regs.ll_halt = rb + FW_INIT_HALT_P1; - } - - /* - * PSS control registers - */ - ioc->ioc_regs.pss_ctl_reg = (rb + PSS_CTL_REG); - ioc->ioc_regs.pss_err_status_reg = (rb + PSS_ERR_STATUS_REG); - ioc->ioc_regs.app_pll_fast_ctl_reg = (rb + APP_PLL_425_CTL_REG); - ioc->ioc_regs.app_pll_slow_ctl_reg = (rb + APP_PLL_312_CTL_REG); - - /* - * IOC semaphore registers and serialization - */ - ioc->ioc_regs.ioc_sem_reg = (rb + HOST_SEM0_REG); - ioc->ioc_regs.ioc_usage_sem_reg = (rb + HOST_SEM1_REG); - ioc->ioc_regs.ioc_init_sem_reg = (rb + HOST_SEM2_REG); - ioc->ioc_regs.ioc_usage_reg = (rb + BFA_FW_USE_COUNT); - - /** - * sram memory access - */ - ioc->ioc_regs.smem_page_start = (rb + PSS_SMEM_PAGE_START); - ioc->ioc_regs.smem_pg0 = BFI_IOC_SMEM_PG0_CT; - - /* - * err set reg : for notification of hb failure in fcmode - */ - ioc->ioc_regs.err_set = (rb + ERR_SET_REG); -} - -/** - * Initialize IOC to port mapping. - */ - -#define FNC_PERS_FN_SHIFT(__fn) ((__fn) * 8) -static void -bfa_ioc_ct_map_port(struct bfa_ioc_s *ioc) -{ - bfa_os_addr_t rb = ioc->pcidev.pci_bar_kva; - u32 r32; - - /** - * For catapult, base port id on personality register and IOC type - */ - r32 = bfa_reg_read(rb + FNC_PERS_REG); - r32 >>= FNC_PERS_FN_SHIFT(bfa_ioc_pcifn(ioc)); - ioc->port_id = (r32 & __F0_PORT_MAP_MK) >> __F0_PORT_MAP_SH; - - bfa_trc(ioc, bfa_ioc_pcifn(ioc)); - bfa_trc(ioc, ioc->port_id); -} - -/** - * Set interrupt mode for a function: INTX or MSIX - */ -static void -bfa_ioc_ct_isr_mode_set(struct bfa_ioc_s *ioc, bfa_boolean_t msix) -{ - bfa_os_addr_t rb = ioc->pcidev.pci_bar_kva; - u32 r32, mode; - - r32 = bfa_reg_read(rb + FNC_PERS_REG); - bfa_trc(ioc, r32); - - mode = (r32 >> FNC_PERS_FN_SHIFT(bfa_ioc_pcifn(ioc))) & - __F0_INTX_STATUS; - - /** - * If already in desired mode, do not change anything - */ - if (!msix && mode) - return; - - if (msix) - mode = __F0_INTX_STATUS_MSIX; - else - mode = __F0_INTX_STATUS_INTA; - - r32 &= ~(__F0_INTX_STATUS << FNC_PERS_FN_SHIFT(bfa_ioc_pcifn(ioc))); - r32 |= (mode << FNC_PERS_FN_SHIFT(bfa_ioc_pcifn(ioc))); - bfa_trc(ioc, r32); - - bfa_reg_write(rb + FNC_PERS_REG, r32); -} - -static bfa_status_t -bfa_ioc_ct_pll_init(struct bfa_ioc_s *ioc) -{ - bfa_os_addr_t rb = ioc->pcidev.pci_bar_kva; - u32 pll_sclk, pll_fclk, r32; - - /* - * Hold semaphore so that nobody can access the chip during init. - */ - bfa_ioc_sem_get(ioc->ioc_regs.ioc_init_sem_reg); - - pll_sclk = __APP_PLL_312_LRESETN | __APP_PLL_312_ENARST | - __APP_PLL_312_RSEL200500 | __APP_PLL_312_P0_1(3U) | - __APP_PLL_312_JITLMT0_1(3U) | - __APP_PLL_312_CNTLMT0_1(1U); - pll_fclk = __APP_PLL_425_LRESETN | __APP_PLL_425_ENARST | - __APP_PLL_425_RSEL200500 | __APP_PLL_425_P0_1(3U) | - __APP_PLL_425_JITLMT0_1(3U) | - __APP_PLL_425_CNTLMT0_1(1U); - - /** - * For catapult, choose operational mode FC/FCoE - */ - if (ioc->fcmode) { - bfa_reg_write((rb + OP_MODE), 0); - bfa_reg_write((rb + ETH_MAC_SER_REG), - __APP_EMS_CMLCKSEL | - __APP_EMS_REFCKBUFEN2 | - __APP_EMS_CHANNEL_SEL); - } else { - ioc->pllinit = BFA_TRUE; - bfa_reg_write((rb + OP_MODE), __GLOBAL_FCOE_MODE); - bfa_reg_write((rb + ETH_MAC_SER_REG), - __APP_EMS_REFCKBUFEN1); - } - - bfa_reg_write((rb + BFA_IOC0_STATE_REG), BFI_IOC_UNINIT); - bfa_reg_write((rb + BFA_IOC1_STATE_REG), BFI_IOC_UNINIT); - - bfa_reg_write((rb + HOSTFN0_INT_MSK), 0xffffffffU); - bfa_reg_write((rb + HOSTFN1_INT_MSK), 0xffffffffU); - bfa_reg_write((rb + HOSTFN0_INT_STATUS), 0xffffffffU); - bfa_reg_write((rb + HOSTFN1_INT_STATUS), 0xffffffffU); - bfa_reg_write((rb + HOSTFN0_INT_MSK), 0xffffffffU); - bfa_reg_write((rb + HOSTFN1_INT_MSK), 0xffffffffU); - - bfa_reg_write(ioc->ioc_regs.app_pll_slow_ctl_reg, pll_sclk | - __APP_PLL_312_LOGIC_SOFT_RESET); - bfa_reg_write(ioc->ioc_regs.app_pll_fast_ctl_reg, pll_fclk | - __APP_PLL_425_LOGIC_SOFT_RESET); - bfa_reg_write(ioc->ioc_regs.app_pll_slow_ctl_reg, pll_sclk | - __APP_PLL_312_LOGIC_SOFT_RESET | __APP_PLL_312_ENABLE); - bfa_reg_write(ioc->ioc_regs.app_pll_fast_ctl_reg, pll_fclk | - __APP_PLL_425_LOGIC_SOFT_RESET | __APP_PLL_425_ENABLE); - - /** - * Wait for PLLs to lock. - */ - bfa_reg_read(rb + HOSTFN0_INT_MSK); - bfa_os_udelay(2000); - bfa_reg_write((rb + HOSTFN0_INT_STATUS), 0xffffffffU); - bfa_reg_write((rb + HOSTFN1_INT_STATUS), 0xffffffffU); - - bfa_reg_write(ioc->ioc_regs.app_pll_slow_ctl_reg, pll_sclk | - __APP_PLL_312_ENABLE); - bfa_reg_write(ioc->ioc_regs.app_pll_fast_ctl_reg, pll_fclk | - __APP_PLL_425_ENABLE); - - bfa_reg_write((rb + MBIST_CTL_REG), __EDRAM_BISTR_START); - bfa_os_udelay(1000); - r32 = bfa_reg_read((rb + MBIST_STAT_REG)); - bfa_trc(ioc, r32); - /* - * release semaphore. - */ - bfa_ioc_sem_release(ioc->ioc_regs.ioc_init_sem_reg); - - return BFA_STATUS_OK; -} - -/** - * Cleanup hw semaphore and usecnt registers - */ -static void -bfa_ioc_ct_ownership_reset(struct bfa_ioc_s *ioc) -{ - - if (ioc->cna) { - bfa_ioc_sem_get(ioc->ioc_regs.ioc_usage_sem_reg); - bfa_reg_write(ioc->ioc_regs.ioc_usage_reg, 0); - bfa_ioc_sem_release(ioc->ioc_regs.ioc_usage_sem_reg); - } - - /* - * Read the hw sem reg to make sure that it is locked - * before we clear it. If it is not locked, writing 1 - * will lock it instead of clearing it. - */ - bfa_reg_read(ioc->ioc_regs.ioc_sem_reg); - bfa_ioc_hw_sem_release(ioc); -} diff --git a/trunk/drivers/scsi/bfa/bfa_iocfc.c b/trunk/drivers/scsi/bfa/bfa_iocfc.c index a76de2669bfc..d7ab792a9e54 100644 --- a/trunk/drivers/scsi/bfa/bfa_iocfc.c +++ b/trunk/drivers/scsi/bfa/bfa_iocfc.c @@ -172,7 +172,6 @@ bfa_iocfc_init_mem(struct bfa_s *bfa, void *bfad, struct bfa_iocfc_cfg_s *cfg, */ if (bfa_ioc_devid(&bfa->ioc) == BFA_PCI_DEVICE_ID_CT) { iocfc->hwif.hw_reginit = bfa_hwct_reginit; - iocfc->hwif.hw_reqq_ack = bfa_hwct_reqq_ack; iocfc->hwif.hw_rspq_ack = bfa_hwct_rspq_ack; iocfc->hwif.hw_msix_init = bfa_hwct_msix_init; iocfc->hwif.hw_msix_install = bfa_hwct_msix_install; @@ -181,7 +180,6 @@ bfa_iocfc_init_mem(struct bfa_s *bfa, void *bfad, struct bfa_iocfc_cfg_s *cfg, iocfc->hwif.hw_msix_getvecs = bfa_hwct_msix_getvecs; } else { iocfc->hwif.hw_reginit = bfa_hwcb_reginit; - iocfc->hwif.hw_reqq_ack = bfa_hwcb_reqq_ack; iocfc->hwif.hw_rspq_ack = bfa_hwcb_rspq_ack; iocfc->hwif.hw_msix_init = bfa_hwcb_msix_init; iocfc->hwif.hw_msix_install = bfa_hwcb_msix_install; @@ -338,10 +336,8 @@ bfa_iocfc_init_cb(void *bfa_arg, bfa_boolean_t complete) bfa_cb_init(bfa->bfad, BFA_STATUS_OK); else bfa_cb_init(bfa->bfad, BFA_STATUS_FAILED); - } else { - if (bfa->iocfc.cfgdone) - bfa->iocfc.action = BFA_IOCFC_ACT_NONE; - } + } else + bfa->iocfc.action = BFA_IOCFC_ACT_NONE; } static void @@ -623,6 +619,8 @@ bfa_iocfc_attach(struct bfa_s *bfa, void *bfad, struct bfa_iocfc_cfg_s *cfg, bfa_ioc_attach(&bfa->ioc, bfa, &bfa_iocfc_cbfn, &bfa->timer_mod, bfa->trcmod, bfa->aen, bfa->logm); + bfa_ioc_pci_init(&bfa->ioc, pcidev, BFI_MC_IOCFC); + bfa_ioc_mbox_register(&bfa->ioc, bfa_mbox_isrs); /** * Choose FC (ssid: 0x1C) v/s FCoE (ssid: 0x14) mode. @@ -630,9 +628,6 @@ bfa_iocfc_attach(struct bfa_s *bfa, void *bfad, struct bfa_iocfc_cfg_s *cfg, if (0) bfa_ioc_set_fcmode(&bfa->ioc); - bfa_ioc_pci_init(&bfa->ioc, pcidev, BFI_MC_IOCFC); - bfa_ioc_mbox_register(&bfa->ioc, bfa_mbox_isrs); - bfa_iocfc_init_mem(bfa, bfad, cfg, pcidev); bfa_iocfc_mem_claim(bfa, cfg, meminfo); bfa_timer_init(&bfa->timer_mod); @@ -659,6 +654,7 @@ bfa_iocfc_init(struct bfa_s *bfa) { bfa->iocfc.action = BFA_IOCFC_ACT_INIT; bfa_ioc_enable(&bfa->ioc); + bfa_msix_install(bfa); } /** @@ -801,11 +797,6 @@ bfa_iocfc_get_stats(struct bfa_s *bfa, struct bfa_iocfc_stats_s *stats, return BFA_STATUS_DEVBUSY; } - if (!bfa_iocfc_is_operational(bfa)) { - bfa_trc(bfa, 0); - return BFA_STATUS_IOC_NON_OP; - } - iocfc->stats_busy = BFA_TRUE; iocfc->stats_ret = stats; iocfc->stats_cbfn = cbfn; @@ -826,11 +817,6 @@ bfa_iocfc_clear_stats(struct bfa_s *bfa, bfa_cb_ioc_t cbfn, void *cbarg) return BFA_STATUS_DEVBUSY; } - if (!bfa_iocfc_is_operational(bfa)) { - bfa_trc(bfa, 0); - return BFA_STATUS_IOC_NON_OP; - } - iocfc->stats_busy = BFA_TRUE; iocfc->stats_cbfn = cbfn; iocfc->stats_cbarg = cbarg; diff --git a/trunk/drivers/scsi/bfa/bfa_iocfc.h b/trunk/drivers/scsi/bfa/bfa_iocfc.h index fbb4bdc9d600..ce9a830a4207 100644 --- a/trunk/drivers/scsi/bfa/bfa_iocfc.h +++ b/trunk/drivers/scsi/bfa/bfa_iocfc.h @@ -54,7 +54,6 @@ struct bfa_msix_s { */ struct bfa_hwif_s { void (*hw_reginit)(struct bfa_s *bfa); - void (*hw_reqq_ack)(struct bfa_s *bfa, int reqq); void (*hw_rspq_ack)(struct bfa_s *bfa, int rspq); void (*hw_msix_init)(struct bfa_s *bfa, int nvecs); void (*hw_msix_install)(struct bfa_s *bfa); @@ -144,7 +143,6 @@ void bfa_msix_rspq(struct bfa_s *bfa, int vec); void bfa_msix_lpu_err(struct bfa_s *bfa, int vec); void bfa_hwcb_reginit(struct bfa_s *bfa); -void bfa_hwcb_reqq_ack(struct bfa_s *bfa, int rspq); void bfa_hwcb_rspq_ack(struct bfa_s *bfa, int rspq); void bfa_hwcb_msix_init(struct bfa_s *bfa, int nvecs); void bfa_hwcb_msix_install(struct bfa_s *bfa); @@ -153,7 +151,6 @@ void bfa_hwcb_isr_mode_set(struct bfa_s *bfa, bfa_boolean_t msix); void bfa_hwcb_msix_getvecs(struct bfa_s *bfa, u32 *vecmap, u32 *nvecs, u32 *maxvec); void bfa_hwct_reginit(struct bfa_s *bfa); -void bfa_hwct_reqq_ack(struct bfa_s *bfa, int rspq); void bfa_hwct_rspq_ack(struct bfa_s *bfa, int rspq); void bfa_hwct_msix_init(struct bfa_s *bfa, int nvecs); void bfa_hwct_msix_install(struct bfa_s *bfa); diff --git a/trunk/drivers/scsi/bfa/bfa_ioim.c b/trunk/drivers/scsi/bfa/bfa_ioim.c index 5b107abe46e5..f81d359b7089 100644 --- a/trunk/drivers/scsi/bfa/bfa_ioim.c +++ b/trunk/drivers/scsi/bfa/bfa_ioim.c @@ -149,7 +149,7 @@ bfa_ioim_sm_uninit(struct bfa_ioim_s *ioim, enum bfa_ioim_event event) break; default: - bfa_sm_fault(ioim->bfa, event); + bfa_assert(0); } } @@ -194,7 +194,7 @@ bfa_ioim_sm_sgalloc(struct bfa_ioim_s *ioim, enum bfa_ioim_event event) break; default: - bfa_sm_fault(ioim->bfa, event); + bfa_assert(0); } } @@ -259,7 +259,7 @@ bfa_ioim_sm_active(struct bfa_ioim_s *ioim, enum bfa_ioim_event event) break; default: - bfa_sm_fault(ioim->bfa, event); + bfa_assert(0); } } @@ -317,7 +317,7 @@ bfa_ioim_sm_abort(struct bfa_ioim_s *ioim, enum bfa_ioim_event event) break; default: - bfa_sm_fault(ioim->bfa, event); + bfa_assert(0); } } @@ -377,7 +377,7 @@ bfa_ioim_sm_cleanup(struct bfa_ioim_s *ioim, enum bfa_ioim_event event) break; default: - bfa_sm_fault(ioim->bfa, event); + bfa_assert(0); } } @@ -419,7 +419,7 @@ bfa_ioim_sm_qfull(struct bfa_ioim_s *ioim, enum bfa_ioim_event event) break; default: - bfa_sm_fault(ioim->bfa, event); + bfa_assert(0); } } @@ -467,7 +467,7 @@ bfa_ioim_sm_abort_qfull(struct bfa_ioim_s *ioim, enum bfa_ioim_event event) break; default: - bfa_sm_fault(ioim->bfa, event); + bfa_assert(0); } } @@ -516,7 +516,7 @@ bfa_ioim_sm_cleanup_qfull(struct bfa_ioim_s *ioim, enum bfa_ioim_event event) break; default: - bfa_sm_fault(ioim->bfa, event); + bfa_assert(0); } } @@ -544,7 +544,7 @@ bfa_ioim_sm_hcb(struct bfa_ioim_s *ioim, enum bfa_ioim_event event) break; default: - bfa_sm_fault(ioim->bfa, event); + bfa_assert(0); } } @@ -577,7 +577,7 @@ bfa_ioim_sm_hcb_free(struct bfa_ioim_s *ioim, enum bfa_ioim_event event) break; default: - bfa_sm_fault(ioim->bfa, event); + bfa_assert(0); } } @@ -605,7 +605,7 @@ bfa_ioim_sm_resfree(struct bfa_ioim_s *ioim, enum bfa_ioim_event event) break; default: - bfa_sm_fault(ioim->bfa, event); + bfa_assert(0); } } diff --git a/trunk/drivers/scsi/bfa/bfa_itnim.c b/trunk/drivers/scsi/bfa/bfa_itnim.c index a914ff255135..eabf7d38bd09 100644 --- a/trunk/drivers/scsi/bfa/bfa_itnim.c +++ b/trunk/drivers/scsi/bfa/bfa_itnim.c @@ -144,7 +144,7 @@ bfa_itnim_sm_uninit(struct bfa_itnim_s *itnim, enum bfa_itnim_event event) break; default: - bfa_sm_fault(itnim->bfa, event); + bfa_assert(0); } } @@ -175,7 +175,7 @@ bfa_itnim_sm_created(struct bfa_itnim_s *itnim, enum bfa_itnim_event event) break; default: - bfa_sm_fault(itnim->bfa, event); + bfa_assert(0); } } @@ -212,7 +212,7 @@ bfa_itnim_sm_fwcreate(struct bfa_itnim_s *itnim, enum bfa_itnim_event event) break; default: - bfa_sm_fault(itnim->bfa, event); + bfa_assert(0); } } @@ -247,7 +247,7 @@ bfa_itnim_sm_fwcreate_qfull(struct bfa_itnim_s *itnim, break; default: - bfa_sm_fault(itnim->bfa, event); + bfa_assert(0); } } @@ -275,7 +275,7 @@ bfa_itnim_sm_delete_pending(struct bfa_itnim_s *itnim, break; default: - bfa_sm_fault(itnim->bfa, event); + bfa_assert(0); } } @@ -317,7 +317,7 @@ bfa_itnim_sm_online(struct bfa_itnim_s *itnim, enum bfa_itnim_event event) break; default: - bfa_sm_fault(itnim->bfa, event); + bfa_assert(0); } } @@ -348,7 +348,7 @@ bfa_itnim_sm_sler(struct bfa_itnim_s *itnim, enum bfa_itnim_event event) break; default: - bfa_sm_fault(itnim->bfa, event); + bfa_assert(0); } } @@ -385,7 +385,7 @@ bfa_itnim_sm_cleanup_offline(struct bfa_itnim_s *itnim, break; default: - bfa_sm_fault(itnim->bfa, event); + bfa_assert(0); } } @@ -413,7 +413,7 @@ bfa_itnim_sm_cleanup_delete(struct bfa_itnim_s *itnim, break; default: - bfa_sm_fault(itnim->bfa, event); + bfa_assert(0); } } @@ -442,7 +442,7 @@ bfa_itnim_sm_fwdelete(struct bfa_itnim_s *itnim, enum bfa_itnim_event event) break; default: - bfa_sm_fault(itnim->bfa, event); + bfa_assert(0); } } @@ -470,7 +470,7 @@ bfa_itnim_sm_fwdelete_qfull(struct bfa_itnim_s *itnim, break; default: - bfa_sm_fault(itnim->bfa, event); + bfa_assert(0); } } @@ -502,7 +502,7 @@ bfa_itnim_sm_offline(struct bfa_itnim_s *itnim, enum bfa_itnim_event event) break; default: - bfa_sm_fault(itnim->bfa, event); + bfa_assert(0); } } @@ -538,7 +538,7 @@ bfa_itnim_sm_iocdisable(struct bfa_itnim_s *itnim, break; default: - bfa_sm_fault(itnim->bfa, event); + bfa_assert(0); } } @@ -559,7 +559,7 @@ bfa_itnim_sm_deleting(struct bfa_itnim_s *itnim, enum bfa_itnim_event event) break; default: - bfa_sm_fault(itnim->bfa, event); + bfa_assert(0); } } @@ -583,7 +583,7 @@ bfa_itnim_sm_deleting_qfull(struct bfa_itnim_s *itnim, break; default: - bfa_sm_fault(itnim->bfa, event); + bfa_assert(0); } } diff --git a/trunk/drivers/scsi/bfa/bfa_lps.c b/trunk/drivers/scsi/bfa/bfa_lps.c index ad06f6189092..9844b45412b6 100644 --- a/trunk/drivers/scsi/bfa/bfa_lps.c +++ b/trunk/drivers/scsi/bfa/bfa_lps.c @@ -18,7 +18,6 @@ #include #include #include -#include BFA_TRC_FILE(HAL, LPS); BFA_MODULE(lps); @@ -26,12 +25,6 @@ BFA_MODULE(lps); #define BFA_LPS_MIN_LPORTS (1) #define BFA_LPS_MAX_LPORTS (256) -/* - * Maximum Vports supported per physical port or vf. - */ -#define BFA_LPS_MAX_VPORTS_SUPP_CB 255 -#define BFA_LPS_MAX_VPORTS_SUPP_CT 190 - /** * forward declarations */ @@ -56,7 +49,7 @@ static void bfa_lps_send_login(struct bfa_lps_s *lps); static void bfa_lps_send_logout(struct bfa_lps_s *lps); static void bfa_lps_login_comp(struct bfa_lps_s *lps); static void bfa_lps_logout_comp(struct bfa_lps_s *lps); -static void bfa_lps_cvl_event(struct bfa_lps_s *lps); + /** * lps_pvt BFA LPS private functions @@ -69,7 +62,6 @@ enum bfa_lps_event { BFA_LPS_SM_RESUME = 4, /* space present in reqq queue */ BFA_LPS_SM_DELETE = 5, /* lps delete from user */ BFA_LPS_SM_OFFLINE = 6, /* Link is offline */ - BFA_LPS_SM_RX_CVL = 7, /* Rx clear virtual link */ }; static void bfa_lps_sm_init(struct bfa_lps_s *lps, enum bfa_lps_event event); @@ -99,12 +91,6 @@ bfa_lps_sm_init(struct bfa_lps_s *lps, enum bfa_lps_event event) bfa_sm_set_state(lps, bfa_lps_sm_login); bfa_lps_send_login(lps); } - if (lps->fdisc) - bfa_plog_str(lps->bfa->plog, BFA_PL_MID_LPS, - BFA_PL_EID_LOGIN, 0, "FDISC Request"); - else - bfa_plog_str(lps->bfa->plog, BFA_PL_MID_LPS, - BFA_PL_EID_LOGIN, 0, "FLOGI Request"); break; case BFA_LPS_SM_LOGOUT: @@ -115,7 +101,6 @@ bfa_lps_sm_init(struct bfa_lps_s *lps, enum bfa_lps_event event) bfa_lps_free(lps); break; - case BFA_LPS_SM_RX_CVL: case BFA_LPS_SM_OFFLINE: break; @@ -127,7 +112,7 @@ bfa_lps_sm_init(struct bfa_lps_s *lps, enum bfa_lps_event event) break; default: - bfa_sm_fault(lps->bfa, event); + bfa_assert(0); } } @@ -142,25 +127,10 @@ bfa_lps_sm_login(struct bfa_lps_s *lps, enum bfa_lps_event event) switch (event) { case BFA_LPS_SM_FWRSP: - if (lps->status == BFA_STATUS_OK) { + if (lps->status == BFA_STATUS_OK) bfa_sm_set_state(lps, bfa_lps_sm_online); - if (lps->fdisc) - bfa_plog_str(lps->bfa->plog, BFA_PL_MID_LPS, - BFA_PL_EID_LOGIN, 0, "FDISC Accept"); - else - bfa_plog_str(lps->bfa->plog, BFA_PL_MID_LPS, - BFA_PL_EID_LOGIN, 0, "FLOGI Accept"); - } else { + else bfa_sm_set_state(lps, bfa_lps_sm_init); - if (lps->fdisc) - bfa_plog_str(lps->bfa->plog, BFA_PL_MID_LPS, - BFA_PL_EID_LOGIN, 0, - "FDISC Fail (RJT or timeout)"); - else - bfa_plog_str(lps->bfa->plog, BFA_PL_MID_LPS, - BFA_PL_EID_LOGIN, 0, - "FLOGI Fail (RJT or timeout)"); - } bfa_lps_login_comp(lps); break; @@ -169,7 +139,7 @@ bfa_lps_sm_login(struct bfa_lps_s *lps, enum bfa_lps_event event) break; default: - bfa_sm_fault(lps->bfa, event); + bfa_assert(0); } } @@ -192,16 +162,8 @@ bfa_lps_sm_loginwait(struct bfa_lps_s *lps, enum bfa_lps_event event) bfa_reqq_wcancel(&lps->wqe); break; - case BFA_LPS_SM_RX_CVL: - /* - * Login was not even sent out; so when getting out - * of this state, it will appear like a login retry - * after Clear virtual link - */ - break; - default: - bfa_sm_fault(lps->bfa, event); + bfa_assert(0); } } @@ -223,17 +185,6 @@ bfa_lps_sm_online(struct bfa_lps_s *lps, enum bfa_lps_event event) bfa_sm_set_state(lps, bfa_lps_sm_logout); bfa_lps_send_logout(lps); } - bfa_plog_str(lps->bfa->plog, BFA_PL_MID_LPS, - BFA_PL_EID_LOGO, 0, "Logout"); - break; - - case BFA_LPS_SM_RX_CVL: - bfa_sm_set_state(lps, bfa_lps_sm_init); - - /* Let the vport module know about this event */ - bfa_lps_cvl_event(lps); - bfa_plog_str(lps->bfa->plog, BFA_PL_MID_LPS, - BFA_PL_EID_FIP_FCF_CVL, 0, "FCF Clear Virt. Link Rx"); break; case BFA_LPS_SM_OFFLINE: @@ -242,7 +193,7 @@ bfa_lps_sm_online(struct bfa_lps_s *lps, enum bfa_lps_event event) break; default: - bfa_sm_fault(lps->bfa, event); + bfa_assert(0); } } @@ -266,7 +217,7 @@ bfa_lps_sm_logout(struct bfa_lps_s *lps, enum bfa_lps_event event) break; default: - bfa_sm_fault(lps->bfa, event); + bfa_assert(0); } } @@ -291,7 +242,7 @@ bfa_lps_sm_logowait(struct bfa_lps_s *lps, enum bfa_lps_event event) break; default: - bfa_sm_fault(lps->bfa, event); + bfa_assert(0); } } @@ -444,20 +395,6 @@ bfa_lps_logout_rsp(struct bfa_s *bfa, struct bfi_lps_logout_rsp_s *rsp) bfa_sm_send_event(lps, BFA_LPS_SM_FWRSP); } -/** - * Firmware received a Clear virtual link request (for FCoE) - */ -static void -bfa_lps_rx_cvl_event(struct bfa_s *bfa, struct bfi_lps_cvl_event_s *cvl) -{ - struct bfa_lps_mod_s *mod = BFA_LPS_MOD(bfa); - struct bfa_lps_s *lps; - - lps = BFA_LPS_FROM_TAG(mod, cvl->lp_tag); - - bfa_sm_send_event(lps, BFA_LPS_SM_RX_CVL); -} - /** * Space is available in request queue, resume queueing request to firmware. */ @@ -594,48 +531,7 @@ bfa_lps_logout_comp(struct bfa_lps_s *lps) bfa_cb_lps_flogo_comp(lps->bfa->bfad, lps->uarg); } -/** - * Clear virtual link completion handler for non-fcs - */ -static void -bfa_lps_cvl_event_cb(void *arg, bfa_boolean_t complete) -{ - struct bfa_lps_s *lps = arg; - - if (!complete) - return; - - /* Clear virtual link to base port will result in link down */ - if (lps->fdisc) - bfa_cb_lps_cvl_event(lps->bfa->bfad, lps->uarg); -} - -/** - * Received Clear virtual link event --direct call for fcs, - * queue for others - */ -static void -bfa_lps_cvl_event(struct bfa_lps_s *lps) -{ - if (!lps->bfa->fcs) { - bfa_cb_queue(lps->bfa, &lps->hcb_qe, bfa_lps_cvl_event_cb, - lps); - return; - } - - /* Clear virtual link to base port will result in link down */ - if (lps->fdisc) - bfa_cb_lps_cvl_event(lps->bfa->bfad, lps->uarg); -} -u32 -bfa_lps_get_max_vport(struct bfa_s *bfa) -{ - if (bfa_ioc_devid(&bfa->ioc) == BFA_PCI_DEVICE_ID_CT) - return BFA_LPS_MAX_VPORTS_SUPP_CT; - else - return BFA_LPS_MAX_VPORTS_SUPP_CB; -} /** * lps_public BFA LPS public functions @@ -856,14 +752,6 @@ bfa_lps_get_lsrjt_expl(struct bfa_lps_s *lps) return lps->lsrjt_expl; } -/** - * Return fpma/spma MAC for lport - */ -struct mac_s -bfa_lps_get_lp_mac(struct bfa_lps_s *lps) -{ - return lps->lp_mac; -} /** * LPS firmware message class handler. @@ -885,10 +773,6 @@ bfa_lps_isr(struct bfa_s *bfa, struct bfi_msg_s *m) bfa_lps_logout_rsp(bfa, msg.logout_rsp); break; - case BFI_LPS_H2I_CVL_EVENT: - bfa_lps_rx_cvl_event(bfa, msg.cvl_event); - break; - default: bfa_trc(bfa, m->mhdr.msg_id); bfa_assert(0); diff --git a/trunk/drivers/scsi/bfa/bfa_module.c b/trunk/drivers/scsi/bfa/bfa_module.c index a7fcc80c177e..32eda8e1ec65 100644 --- a/trunk/drivers/scsi/bfa/bfa_module.c +++ b/trunk/drivers/scsi/bfa/bfa_module.c @@ -24,7 +24,7 @@ */ struct bfa_module_s *hal_mods[] = { &hal_mod_sgpg, - &hal_mod_fcport, + &hal_mod_pport, &hal_mod_fcxp, &hal_mod_lps, &hal_mod_uf, @@ -45,7 +45,7 @@ bfa_isr_func_t bfa_isrs[BFI_MC_MAX] = { bfa_isr_unhandled, /* BFI_MC_DIAG */ bfa_isr_unhandled, /* BFI_MC_FLASH */ bfa_isr_unhandled, /* BFI_MC_CEE */ - bfa_fcport_isr, /* BFI_MC_FCPORT */ + bfa_pport_isr, /* BFI_MC_PORT */ bfa_isr_unhandled, /* BFI_MC_IOCFC */ bfa_isr_unhandled, /* BFI_MC_LL */ bfa_uf_isr, /* BFI_MC_UF */ diff --git a/trunk/drivers/scsi/bfa/bfa_modules_priv.h b/trunk/drivers/scsi/bfa/bfa_modules_priv.h index f554c2fad6a9..96f70534593c 100644 --- a/trunk/drivers/scsi/bfa/bfa_modules_priv.h +++ b/trunk/drivers/scsi/bfa/bfa_modules_priv.h @@ -29,7 +29,7 @@ struct bfa_modules_s { - struct bfa_fcport_s fcport; /* fc port module */ + struct bfa_pport_s pport; /* physical port module */ struct bfa_fcxp_mod_s fcxp_mod; /* fcxp module */ struct bfa_lps_mod_s lps_mod; /* fcxp module */ struct bfa_uf_mod_s uf_mod; /* unsolicited frame module */ diff --git a/trunk/drivers/scsi/bfa/bfa_port_priv.h b/trunk/drivers/scsi/bfa/bfa_port_priv.h index 40e256ec67ff..51f698a06b6d 100644 --- a/trunk/drivers/scsi/bfa/bfa_port_priv.h +++ b/trunk/drivers/scsi/bfa/bfa_port_priv.h @@ -23,19 +23,9 @@ #include "bfa_intr_priv.h" /** - * Link notification data structure + * BFA physical port data structure */ -struct bfa_fcport_ln_s { - struct bfa_fcport_s *fcport; - bfa_sm_t sm; - struct bfa_cb_qe_s ln_qe; /* BFA callback queue elem for ln */ - enum bfa_pport_linkstate ln_event; /* ln event for callback */ -}; - -/** - * BFA FC port data structure - */ -struct bfa_fcport_s { +struct bfa_pport_s { struct bfa_s *bfa; /* parent BFA instance */ bfa_sm_t sm; /* port state machine */ wwn_t nwwn; /* node wwn of physical port */ @@ -46,8 +36,6 @@ struct bfa_fcport_s { enum bfa_pport_topology topology; /* current topology */ u8 myalpa; /* my ALPA in LOOP topology */ u8 rsvd[3]; - u32 mypid:24; - u32 rsvd_b:8; struct bfa_pport_cfg_s cfg; /* current port configuration */ struct bfa_qos_attr_s qos_attr; /* QoS Attributes */ struct bfa_qos_vc_attr_s qos_vc_attr; /* VC info from ELP */ @@ -61,31 +49,42 @@ struct bfa_fcport_s { void (*event_cbfn) (void *cbarg, bfa_pport_event_t event); union { - union bfi_fcport_i2h_msg_u i2hmsg; + union bfi_pport_i2h_msg_u i2hmsg; } event_arg; void *bfad; /* BFA driver handle */ - struct bfa_fcport_ln_s ln; /* Link Notification */ struct bfa_cb_qe_s hcb_qe; /* BFA callback queue elem */ - struct bfa_timer_s timer; /* timer */ + enum bfa_pport_linkstate hcb_event; + /* link event for callback */ u32 msgtag; /* fimrware msg tag for reply */ u8 *stats_kva; u64 stats_pa; - union bfa_fcport_stats_u *stats; - union bfa_fcport_stats_u *stats_ret; /* driver stats location */ - bfa_status_t stats_status; /* stats/statsclr status */ - bfa_boolean_t stats_busy; /* outstanding stats/statsclr */ - bfa_boolean_t stats_qfull; - bfa_cb_pport_t stats_cbfn; /* driver callback function */ - void *stats_cbarg; /* *!< user callback arg */ - bfa_boolean_t diag_busy; /* diag busy status */ - bfa_boolean_t beacon; /* port beacon status */ - bfa_boolean_t link_e2e_beacon; /* link beacon status */ + union bfa_pport_stats_u *stats; /* pport stats */ + u32 mypid:24; + u32 rsvd_b:8; + struct bfa_timer_s timer; /* timer */ + union bfa_pport_stats_u *stats_ret; + /* driver stats location */ + bfa_status_t stats_status; + /* stats/statsclr status */ + bfa_boolean_t stats_busy; + /* outstanding stats/statsclr */ + bfa_boolean_t stats_qfull; + bfa_boolean_t diag_busy; + /* diag busy status */ + bfa_boolean_t beacon; + /* port beacon status */ + bfa_boolean_t link_e2e_beacon; + /* link beacon status */ + bfa_cb_pport_t stats_cbfn; + /* driver callback function */ + void *stats_cbarg; + /* *!< user callback arg */ }; -#define BFA_FCPORT_MOD(__bfa) (&(__bfa)->modules.fcport) +#define BFA_PORT_MOD(__bfa) (&(__bfa)->modules.pport) /* * public functions */ -void bfa_fcport_isr(struct bfa_s *bfa, struct bfi_msg_s *msg); +void bfa_pport_isr(struct bfa_s *bfa, struct bfi_msg_s *msg); #endif /* __BFA_PORT_PRIV_H__ */ diff --git a/trunk/drivers/scsi/bfa/bfa_priv.h b/trunk/drivers/scsi/bfa/bfa_priv.h index be80fc7e1b0e..0747a6b26f7b 100644 --- a/trunk/drivers/scsi/bfa/bfa_priv.h +++ b/trunk/drivers/scsi/bfa/bfa_priv.h @@ -101,7 +101,7 @@ extern bfa_boolean_t bfa_auto_recover; extern struct bfa_module_s hal_mod_flash; extern struct bfa_module_s hal_mod_fcdiag; extern struct bfa_module_s hal_mod_sgpg; -extern struct bfa_module_s hal_mod_fcport; +extern struct bfa_module_s hal_mod_pport; extern struct bfa_module_s hal_mod_fcxp; extern struct bfa_module_s hal_mod_lps; extern struct bfa_module_s hal_mod_uf; diff --git a/trunk/drivers/scsi/bfa/bfa_rport.c b/trunk/drivers/scsi/bfa/bfa_rport.c index 7c509fa244e4..3e1990a74258 100644 --- a/trunk/drivers/scsi/bfa/bfa_rport.c +++ b/trunk/drivers/scsi/bfa/bfa_rport.c @@ -114,7 +114,7 @@ bfa_rport_sm_uninit(struct bfa_rport_s *rp, enum bfa_rport_event event) default: bfa_stats(rp, sm_un_unexp); - bfa_sm_fault(rp->bfa, event); + bfa_assert(0); } } @@ -146,7 +146,7 @@ bfa_rport_sm_created(struct bfa_rport_s *rp, enum bfa_rport_event event) default: bfa_stats(rp, sm_cr_unexp); - bfa_sm_fault(rp->bfa, event); + bfa_assert(0); } } @@ -183,7 +183,7 @@ bfa_rport_sm_fwcreate(struct bfa_rport_s *rp, enum bfa_rport_event event) default: bfa_stats(rp, sm_fwc_unexp); - bfa_sm_fault(rp->bfa, event); + bfa_assert(0); } } @@ -224,7 +224,7 @@ bfa_rport_sm_fwcreate_qfull(struct bfa_rport_s *rp, enum bfa_rport_event event) default: bfa_stats(rp, sm_fwc_unexp); - bfa_sm_fault(rp->bfa, event); + bfa_assert(0); } } @@ -296,7 +296,7 @@ bfa_rport_sm_online(struct bfa_rport_s *rp, enum bfa_rport_event event) default: bfa_stats(rp, sm_on_unexp); - bfa_sm_fault(rp->bfa, event); + bfa_assert(0); } } @@ -329,7 +329,7 @@ bfa_rport_sm_fwdelete(struct bfa_rport_s *rp, enum bfa_rport_event event) default: bfa_stats(rp, sm_fwd_unexp); - bfa_sm_fault(rp->bfa, event); + bfa_assert(0); } } @@ -359,7 +359,7 @@ bfa_rport_sm_fwdelete_qfull(struct bfa_rport_s *rp, enum bfa_rport_event event) default: bfa_stats(rp, sm_fwd_unexp); - bfa_sm_fault(rp->bfa, event); + bfa_assert(0); } } @@ -394,7 +394,7 @@ bfa_rport_sm_offline(struct bfa_rport_s *rp, enum bfa_rport_event event) default: bfa_stats(rp, sm_off_unexp); - bfa_sm_fault(rp->bfa, event); + bfa_assert(0); } } @@ -421,7 +421,7 @@ bfa_rport_sm_deleting(struct bfa_rport_s *rp, enum bfa_rport_event event) break; default: - bfa_sm_fault(rp->bfa, event); + bfa_assert(0); } } @@ -446,7 +446,7 @@ bfa_rport_sm_deleting_qfull(struct bfa_rport_s *rp, enum bfa_rport_event event) break; default: - bfa_sm_fault(rp->bfa, event); + bfa_assert(0); } } @@ -477,7 +477,7 @@ bfa_rport_sm_delete_pending(struct bfa_rport_s *rp, default: bfa_stats(rp, sm_delp_unexp); - bfa_sm_fault(rp->bfa, event); + bfa_assert(0); } } @@ -512,7 +512,7 @@ bfa_rport_sm_offline_pending(struct bfa_rport_s *rp, default: bfa_stats(rp, sm_offp_unexp); - bfa_sm_fault(rp->bfa, event); + bfa_assert(0); } } @@ -550,7 +550,7 @@ bfa_rport_sm_iocdisable(struct bfa_rport_s *rp, enum bfa_rport_event event) default: bfa_stats(rp, sm_iocd_unexp); - bfa_sm_fault(rp->bfa, event); + bfa_assert(0); } } diff --git a/trunk/drivers/scsi/bfa/bfa_trcmod_priv.h b/trunk/drivers/scsi/bfa/bfa_trcmod_priv.h index a7a82610db85..b3562dce7e9f 100644 --- a/trunk/drivers/scsi/bfa/bfa_trcmod_priv.h +++ b/trunk/drivers/scsi/bfa/bfa_trcmod_priv.h @@ -29,36 +29,38 @@ * !!! needed between trace utility and driver version */ enum { - BFA_TRC_HAL_INTR = 1, - BFA_TRC_HAL_FCXP = 2, - BFA_TRC_HAL_UF = 3, - BFA_TRC_HAL_RPORT = 4, - BFA_TRC_HAL_FCPIM = 5, - BFA_TRC_HAL_IOIM = 6, - BFA_TRC_HAL_TSKIM = 7, - BFA_TRC_HAL_ITNIM = 8, - BFA_TRC_HAL_FCPORT = 9, - BFA_TRC_HAL_SGPG = 10, - BFA_TRC_HAL_FLASH = 11, - BFA_TRC_HAL_DEBUG = 12, - BFA_TRC_HAL_WWN = 13, - BFA_TRC_HAL_FLASH_RAW = 14, - BFA_TRC_HAL_SBOOT = 15, - BFA_TRC_HAL_SBOOT_IO = 16, - BFA_TRC_HAL_SBOOT_INTR = 17, - BFA_TRC_HAL_SBTEST = 18, - BFA_TRC_HAL_IPFC = 19, - BFA_TRC_HAL_IOCFC = 20, - BFA_TRC_HAL_FCPTM = 21, - BFA_TRC_HAL_IOTM = 22, - BFA_TRC_HAL_TSKTM = 23, - BFA_TRC_HAL_TIN = 24, - BFA_TRC_HAL_LPS = 25, - BFA_TRC_HAL_FCDIAG = 26, - BFA_TRC_HAL_PBIND = 27, - BFA_TRC_HAL_IOCFC_CT = 28, - BFA_TRC_HAL_IOCFC_CB = 29, - BFA_TRC_HAL_IOCFC_Q = 30, + BFA_TRC_HAL_IOC = 1, + BFA_TRC_HAL_INTR = 2, + BFA_TRC_HAL_FCXP = 3, + BFA_TRC_HAL_UF = 4, + BFA_TRC_HAL_DIAG = 5, + BFA_TRC_HAL_RPORT = 6, + BFA_TRC_HAL_FCPIM = 7, + BFA_TRC_HAL_IOIM = 8, + BFA_TRC_HAL_TSKIM = 9, + BFA_TRC_HAL_ITNIM = 10, + BFA_TRC_HAL_PPORT = 11, + BFA_TRC_HAL_SGPG = 12, + BFA_TRC_HAL_FLASH = 13, + BFA_TRC_HAL_DEBUG = 14, + BFA_TRC_HAL_WWN = 15, + BFA_TRC_HAL_FLASH_RAW = 16, + BFA_TRC_HAL_SBOOT = 17, + BFA_TRC_HAL_SBOOT_IO = 18, + BFA_TRC_HAL_SBOOT_INTR = 19, + BFA_TRC_HAL_SBTEST = 20, + BFA_TRC_HAL_IPFC = 21, + BFA_TRC_HAL_IOCFC = 22, + BFA_TRC_HAL_FCPTM = 23, + BFA_TRC_HAL_IOTM = 24, + BFA_TRC_HAL_TSKTM = 25, + BFA_TRC_HAL_TIN = 26, + BFA_TRC_HAL_LPS = 27, + BFA_TRC_HAL_FCDIAG = 28, + BFA_TRC_HAL_PBIND = 29, + BFA_TRC_HAL_IOCFC_CT = 30, + BFA_TRC_HAL_IOCFC_CB = 31, + BFA_TRC_HAL_IOCFC_Q = 32, }; #endif /* __BFA_TRCMOD_PRIV_H__ */ diff --git a/trunk/drivers/scsi/bfa/bfa_tskim.c b/trunk/drivers/scsi/bfa/bfa_tskim.c index ad9aaaedd3f1..ff7a4dc0bf3c 100644 --- a/trunk/drivers/scsi/bfa/bfa_tskim.c +++ b/trunk/drivers/scsi/bfa/bfa_tskim.c @@ -110,7 +110,7 @@ bfa_tskim_sm_uninit(struct bfa_tskim_s *tskim, enum bfa_tskim_event event) break; default: - bfa_sm_fault(tskim->bfa, event); + bfa_assert(0); } } @@ -146,7 +146,7 @@ bfa_tskim_sm_active(struct bfa_tskim_s *tskim, enum bfa_tskim_event event) break; default: - bfa_sm_fault(tskim->bfa, event); + bfa_assert(0); } } @@ -178,7 +178,7 @@ bfa_tskim_sm_cleanup(struct bfa_tskim_s *tskim, enum bfa_tskim_event event) break; default: - bfa_sm_fault(tskim->bfa, event); + bfa_assert(0); } } @@ -207,7 +207,7 @@ bfa_tskim_sm_iocleanup(struct bfa_tskim_s *tskim, enum bfa_tskim_event event) break; default: - bfa_sm_fault(tskim->bfa, event); + bfa_assert(0); } } @@ -242,7 +242,7 @@ bfa_tskim_sm_qfull(struct bfa_tskim_s *tskim, enum bfa_tskim_event event) break; default: - bfa_sm_fault(tskim->bfa, event); + bfa_assert(0); } } @@ -277,7 +277,7 @@ bfa_tskim_sm_cleanup_qfull(struct bfa_tskim_s *tskim, break; default: - bfa_sm_fault(tskim->bfa, event); + bfa_assert(0); } } @@ -303,7 +303,7 @@ bfa_tskim_sm_hcb(struct bfa_tskim_s *tskim, enum bfa_tskim_event event) break; default: - bfa_sm_fault(tskim->bfa, event); + bfa_assert(0); } } diff --git a/trunk/drivers/scsi/bfa/bfad.c b/trunk/drivers/scsi/bfa/bfad.c index 6bff08ea4029..b52b773d49d9 100644 --- a/trunk/drivers/scsi/bfa/bfad.c +++ b/trunk/drivers/scsi/bfa/bfad.c @@ -20,7 +20,6 @@ */ #include -#include #include "bfad_drv.h" #include "bfad_im.h" #include "bfad_tm.h" @@ -54,7 +53,6 @@ static int log_level = BFA_LOG_WARNING; static int ioc_auto_recover = BFA_TRUE; static int ipfc_enable = BFA_FALSE; static int ipfc_mtu = -1; -static int fdmi_enable = BFA_TRUE; int bfa_lun_queue_depth = BFAD_LUN_QUEUE_DEPTH; int bfa_linkup_delay = -1; @@ -76,7 +74,6 @@ module_param(log_level, int, S_IRUGO | S_IWUSR); module_param(ioc_auto_recover, int, S_IRUGO | S_IWUSR); module_param(ipfc_enable, int, S_IRUGO | S_IWUSR); module_param(ipfc_mtu, int, S_IRUGO | S_IWUSR); -module_param(fdmi_enable, int, S_IRUGO | S_IWUSR); module_param(bfa_linkup_delay, int, S_IRUGO | S_IWUSR); /* @@ -98,8 +95,6 @@ bfad_fc4_probe(struct bfad_s *bfad) if (ipfc_enable) bfad_ipfc_probe(bfad); - - bfad->bfad_flags |= BFAD_FC4_PROBE_DONE; ext: return rc; } @@ -111,7 +106,6 @@ bfad_fc4_probe_undo(struct bfad_s *bfad) bfad_tm_probe_undo(bfad); if (ipfc_enable) bfad_ipfc_probe_undo(bfad); - bfad->bfad_flags &= ~BFAD_FC4_PROBE_DONE; } static void @@ -179,19 +173,9 @@ bfa_cb_init(void *drv, bfa_status_t init_status) { struct bfad_s *bfad = drv; - if (init_status == BFA_STATUS_OK) { + if (init_status == BFA_STATUS_OK) bfad->bfad_flags |= BFAD_HAL_INIT_DONE; - /* If BFAD_HAL_INIT_FAIL flag is set: - * Wake up the kernel thread to start - * the bfad operations after HAL init done - */ - if ((bfad->bfad_flags & BFAD_HAL_INIT_FAIL)) { - bfad->bfad_flags &= ~BFAD_HAL_INIT_FAIL; - wake_up_process(bfad->bfad_tsk); - } - } - complete(&bfad->comp); } @@ -664,7 +648,7 @@ bfad_fcs_port_cfg(struct bfad_s *bfad) sprintf(symname, "%s-%d", BFAD_DRIVER_NAME, bfad->inst_no); memcpy(port_cfg.sym_name.symname, symname, strlen(symname)); - bfa_fcport_get_attr(&bfad->bfa, &attr); + bfa_pport_get_attr(&bfad->bfa, &attr); port_cfg.nwwn = attr.nwwn; port_cfg.pwwn = attr.pwwn; @@ -677,6 +661,7 @@ bfad_drv_init(struct bfad_s *bfad) bfa_status_t rc; unsigned long flags; struct bfa_fcs_driver_info_s driver_info; + int i; bfad->cfg_data.rport_del_timeout = rport_del_timeout; bfad->cfg_data.lun_queue_depth = bfa_lun_queue_depth; @@ -696,7 +681,12 @@ bfad_drv_init(struct bfad_s *bfad) bfa_init_log(&bfad->bfa, bfad->logmod); bfa_init_trc(&bfad->bfa, bfad->trcmod); bfa_init_aen(&bfad->bfa, bfad->aen); - memset(bfad->file_map, 0, sizeof(bfad->file_map)); + INIT_LIST_HEAD(&bfad->file_q); + INIT_LIST_HEAD(&bfad->file_free_q); + for (i = 0; i < BFAD_AEN_MAX_APPS; i++) { + bfa_q_qe_init(&bfad->file_buf[i].qe); + list_add_tail(&bfad->file_buf[i].qe, &bfad->file_free_q); + } bfa_init_plog(&bfad->bfa, &bfad->plog_buf); bfa_plog_init(&bfad->plog_buf); bfa_plog_str(&bfad->plog_buf, BFA_PL_MID_DRVR, BFA_PL_EID_DRIVER_START, @@ -756,16 +746,8 @@ bfad_drv_init(struct bfad_s *bfad) bfa_fcs_log_init(&bfad->bfa_fcs, bfad->logmod); bfa_fcs_trc_init(&bfad->bfa_fcs, bfad->trcmod); bfa_fcs_aen_init(&bfad->bfa_fcs, bfad->aen); - bfa_fcs_attach(&bfad->bfa_fcs, &bfad->bfa, bfad, BFA_FALSE); - - /* Do FCS init only when HAL init is done */ - if ((bfad->bfad_flags & BFAD_HAL_INIT_DONE)) { - bfa_fcs_init(&bfad->bfa_fcs); - bfad->bfad_flags |= BFAD_FCS_INIT_DONE; - } - + bfa_fcs_init(&bfad->bfa_fcs, &bfad->bfa, bfad, BFA_FALSE); bfa_fcs_driver_info_init(&bfad->bfa_fcs, &driver_info); - bfa_fcs_set_fdmi_param(&bfad->bfa_fcs, fdmi_enable); spin_unlock_irqrestore(&bfad->bfad_lock, flags); bfad->bfad_flags |= BFAD_DRV_INIT_DONE; @@ -781,21 +763,12 @@ bfad_drv_init(struct bfad_s *bfad) void bfad_drv_uninit(struct bfad_s *bfad) { - unsigned long flags; - - spin_lock_irqsave(&bfad->bfad_lock, flags); - init_completion(&bfad->comp); - bfa_stop(&bfad->bfa); - spin_unlock_irqrestore(&bfad->bfad_lock, flags); - wait_for_completion(&bfad->comp); - del_timer_sync(&bfad->hal_tmo); bfa_isr_disable(&bfad->bfa); bfa_detach(&bfad->bfa); bfad_remove_intr(bfad); + bfa_assert(list_empty(&bfad->file_q)); bfad_hal_mem_release(bfad); - - bfad->bfad_flags &= ~BFAD_DRV_INIT_DONE; } void @@ -886,86 +859,6 @@ bfad_drv_log_level_set(struct bfad_s *bfad) bfa_log_set_level_all(&bfad->log_data, log_level); } -bfa_status_t -bfad_start_ops(struct bfad_s *bfad) -{ - int retval; - - /* PPORT FCS config */ - bfad_fcs_port_cfg(bfad); - - retval = bfad_cfg_pport(bfad, BFA_PORT_ROLE_FCP_IM); - if (retval != BFA_STATUS_OK) - goto out_cfg_pport_failure; - - /* BFAD level FC4 (IM/TM/IPFC) specific resource allocation */ - retval = bfad_fc4_probe(bfad); - if (retval != BFA_STATUS_OK) { - printk(KERN_WARNING "bfad_fc4_probe failed\n"); - goto out_fc4_probe_failure; - } - - bfad_drv_start(bfad); - - /* - * If bfa_linkup_delay is set to -1 default; try to retrive the - * value using the bfad_os_get_linkup_delay(); else use the - * passed in module param value as the bfa_linkup_delay. - */ - if (bfa_linkup_delay < 0) { - - bfa_linkup_delay = bfad_os_get_linkup_delay(bfad); - bfad_os_rport_online_wait(bfad); - bfa_linkup_delay = -1; - - } else { - bfad_os_rport_online_wait(bfad); - } - - bfa_log(bfad->logmod, BFA_LOG_LINUX_DEVICE_CLAIMED, bfad->pci_name); - - return BFA_STATUS_OK; - -out_fc4_probe_failure: - bfad_fc4_probe_undo(bfad); - bfad_uncfg_pport(bfad); -out_cfg_pport_failure: - return BFA_STATUS_FAILED; -} - -int -bfad_worker (void *ptr) -{ - struct bfad_s *bfad; - unsigned long flags; - - bfad = (struct bfad_s *)ptr; - - while (!kthread_should_stop()) { - - /* Check if the FCS init is done from bfad_drv_init; - * if not done do FCS init and set the flag. - */ - if (!(bfad->bfad_flags & BFAD_FCS_INIT_DONE)) { - spin_lock_irqsave(&bfad->bfad_lock, flags); - bfa_fcs_init(&bfad->bfa_fcs); - bfad->bfad_flags |= BFAD_FCS_INIT_DONE; - spin_unlock_irqrestore(&bfad->bfad_lock, flags); - } - - /* Start the bfad operations after HAL init done */ - bfad_start_ops(bfad); - - spin_lock_irqsave(&bfad->bfad_lock, flags); - bfad->bfad_tsk = NULL; - spin_unlock_irqrestore(&bfad->bfad_lock, flags); - - break; - } - - return 0; -} - /* * PCI_entry PCI driver entries * { */ @@ -978,6 +871,7 @@ bfad_pci_probe(struct pci_dev *pdev, const struct pci_device_id *pid) { struct bfad_s *bfad; int error = -ENODEV, retval; + char buf[16]; /* * For single port cards - only claim function 0 @@ -1008,7 +902,8 @@ bfad_pci_probe(struct pci_dev *pdev, const struct pci_device_id *pid) bfa_trc(bfad, bfad_inst); bfad->logmod = &bfad->log_data; - bfa_log_init(bfad->logmod, (char *)pci_name(pdev), bfa_os_printf); + sprintf(buf, "%d", bfad_inst); + bfa_log_init(bfad->logmod, buf, bfa_os_printf); bfad_drv_log_level_set(bfad); @@ -1038,39 +933,57 @@ bfad_pci_probe(struct pci_dev *pdev, const struct pci_device_id *pid) bfad->ref_count = 0; bfad->pport.bfad = bfad; - bfad->bfad_tsk = kthread_create(bfad_worker, (void *) bfad, "%s", - "bfad_worker"); - if (IS_ERR(bfad->bfad_tsk)) { - printk(KERN_INFO "bfad[%d]: Kernel thread" - " creation failed!\n", - bfad->inst_no); - goto out_kthread_create_failure; - } - retval = bfad_drv_init(bfad); if (retval != BFA_STATUS_OK) goto out_drv_init_failure; if (!(bfad->bfad_flags & BFAD_HAL_INIT_DONE)) { - bfad->bfad_flags |= BFAD_HAL_INIT_FAIL; printk(KERN_WARNING "bfad%d: hal init failed\n", bfad->inst_no); goto ok; } - retval = bfad_start_ops(bfad); + /* + * PPORT FCS config + */ + bfad_fcs_port_cfg(bfad); + + retval = bfad_cfg_pport(bfad, BFA_PORT_ROLE_FCP_IM); if (retval != BFA_STATUS_OK) - goto out_start_ops_failure; + goto out_cfg_pport_failure; + + /* + * BFAD level FC4 (IM/TM/IPFC) specific resource allocation + */ + retval = bfad_fc4_probe(bfad); + if (retval != BFA_STATUS_OK) { + printk(KERN_WARNING "bfad_fc4_probe failed\n"); + goto out_fc4_probe_failure; + } - kthread_stop(bfad->bfad_tsk); - bfad->bfad_tsk = NULL; + bfad_drv_start(bfad); + + /* + * If bfa_linkup_delay is set to -1 default; try to retrive the + * value using the bfad_os_get_linkup_delay(); else use the + * passed in module param value as the bfa_linkup_delay. + */ + if (bfa_linkup_delay < 0) { + bfa_linkup_delay = bfad_os_get_linkup_delay(bfad); + bfad_os_rport_online_wait(bfad); + bfa_linkup_delay = -1; + } else { + bfad_os_rport_online_wait(bfad); + } + bfa_log(bfad->logmod, BFA_LOG_LINUX_DEVICE_CLAIMED, bfad->pci_name); ok: return 0; -out_start_ops_failure: +out_fc4_probe_failure: + bfad_fc4_probe_undo(bfad); + bfad_uncfg_pport(bfad); +out_cfg_pport_failure: bfad_drv_uninit(bfad); out_drv_init_failure: - kthread_stop(bfad->bfad_tsk); -out_kthread_create_failure: mutex_lock(&bfad_mutex); bfad_inst--; list_del(&bfad->list_entry); @@ -1095,11 +1008,6 @@ bfad_pci_remove(struct pci_dev *pdev) bfa_trc(bfad, bfad->inst_no); - spin_lock_irqsave(&bfad->bfad_lock, flags); - if (bfad->bfad_tsk != NULL) - kthread_stop(bfad->bfad_tsk); - spin_unlock_irqrestore(&bfad->bfad_lock, flags); - if ((bfad->bfad_flags & BFAD_DRV_INIT_DONE) && !(bfad->bfad_flags & BFAD_HAL_INIT_DONE)) { @@ -1116,25 +1024,13 @@ bfad_pci_remove(struct pci_dev *pdev) goto remove_sysfs; } - if (bfad->bfad_flags & BFAD_HAL_START_DONE) { + if (bfad->bfad_flags & BFAD_HAL_START_DONE) bfad_drv_stop(bfad); - } else if (bfad->bfad_flags & BFAD_DRV_INIT_DONE) { - /* Invoking bfa_stop() before bfa_detach - * when HAL and DRV init are success - * but HAL start did not occur. - */ - spin_lock_irqsave(&bfad->bfad_lock, flags); - init_completion(&bfad->comp); - bfa_stop(&bfad->bfa); - spin_unlock_irqrestore(&bfad->bfad_lock, flags); - wait_for_completion(&bfad->comp); - } bfad_remove_intr(bfad); - del_timer_sync(&bfad->hal_tmo); - if (bfad->bfad_flags & BFAD_FC4_PROBE_DONE) - bfad_fc4_probe_undo(bfad); + del_timer_sync(&bfad->hal_tmo); + bfad_fc4_probe_undo(bfad); if (bfad->bfad_flags & BFAD_CFG_PPORT_DONE) bfad_uncfg_pport(bfad); diff --git a/trunk/drivers/scsi/bfa/bfad_attr.c b/trunk/drivers/scsi/bfa/bfad_attr.c index d97f69191838..9129ae3040ff 100644 --- a/trunk/drivers/scsi/bfa/bfad_attr.c +++ b/trunk/drivers/scsi/bfa/bfad_attr.c @@ -141,7 +141,7 @@ bfad_im_get_host_port_type(struct Scsi_Host *shost) struct bfad_s *bfad = im_port->bfad; struct bfa_pport_attr_s attr; - bfa_fcport_get_attr(&bfad->bfa, &attr); + bfa_pport_get_attr(&bfad->bfa, &attr); switch (attr.port_type) { case BFA_PPORT_TYPE_NPORT: @@ -173,7 +173,7 @@ bfad_im_get_host_port_state(struct Scsi_Host *shost) struct bfad_s *bfad = im_port->bfad; struct bfa_pport_attr_s attr; - bfa_fcport_get_attr(&bfad->bfa, &attr); + bfa_pport_get_attr(&bfad->bfa, &attr); switch (attr.port_state) { case BFA_PPORT_ST_LINKDOWN: @@ -229,10 +229,8 @@ bfad_im_get_host_speed(struct Scsi_Host *shost) (struct bfad_im_port_s *) shost->hostdata[0]; struct bfad_s *bfad = im_port->bfad; struct bfa_pport_attr_s attr; - unsigned long flags; - spin_lock_irqsave(shost->host_lock, flags); - bfa_fcport_get_attr(&bfad->bfa, &attr); + bfa_pport_get_attr(&bfad->bfa, &attr); switch (attr.speed) { case BFA_PPORT_SPEED_8GBPS: fc_host_speed(shost) = FC_PORTSPEED_8GBIT; @@ -250,7 +248,6 @@ bfad_im_get_host_speed(struct Scsi_Host *shost) fc_host_speed(shost) = FC_PORTSPEED_UNKNOWN; break; } - spin_unlock_irqrestore(shost->host_lock, flags); } /** @@ -288,7 +285,7 @@ bfad_im_get_stats(struct Scsi_Host *shost) init_completion(&fcomp.comp); spin_lock_irqsave(&bfad->bfad_lock, flags); memset(hstats, 0, sizeof(struct fc_host_statistics)); - rc = bfa_port_get_stats(BFA_FCPORT(&bfad->bfa), + rc = bfa_pport_get_stats(&bfad->bfa, (union bfa_pport_stats_u *) hstats, bfad_hcb_comp, &fcomp); spin_unlock_irqrestore(&bfad->bfad_lock, flags); @@ -315,8 +312,7 @@ bfad_im_reset_stats(struct Scsi_Host *shost) init_completion(&fcomp.comp); spin_lock_irqsave(&bfad->bfad_lock, flags); - rc = bfa_port_clear_stats(BFA_FCPORT(&bfad->bfa), bfad_hcb_comp, - &fcomp); + rc = bfa_pport_clear_stats(&bfad->bfa, bfad_hcb_comp, &fcomp); spin_unlock_irqrestore(&bfad->bfad_lock, flags); if (rc != BFA_STATUS_OK) @@ -425,10 +421,12 @@ bfad_im_serial_num_show(struct device *dev, struct device_attribute *attr, struct bfad_im_port_s *im_port = (struct bfad_im_port_s *) shost->hostdata[0]; struct bfad_s *bfad = im_port->bfad; - char serial_num[BFA_ADAPTER_SERIAL_NUM_LEN]; + struct bfa_ioc_attr_s ioc_attr; - bfa_get_adapter_serial_num(&bfad->bfa, serial_num); - return snprintf(buf, PAGE_SIZE, "%s\n", serial_num); + memset(&ioc_attr, 0, sizeof(ioc_attr)); + bfa_get_attr(&bfad->bfa, &ioc_attr); + return snprintf(buf, PAGE_SIZE, "%s\n", + ioc_attr.adapter_attr.serial_num); } static ssize_t @@ -439,10 +437,11 @@ bfad_im_model_show(struct device *dev, struct device_attribute *attr, struct bfad_im_port_s *im_port = (struct bfad_im_port_s *) shost->hostdata[0]; struct bfad_s *bfad = im_port->bfad; - char model[BFA_ADAPTER_MODEL_NAME_LEN]; + struct bfa_ioc_attr_s ioc_attr; - bfa_get_adapter_model(&bfad->bfa, model); - return snprintf(buf, PAGE_SIZE, "%s\n", model); + memset(&ioc_attr, 0, sizeof(ioc_attr)); + bfa_get_attr(&bfad->bfa, &ioc_attr); + return snprintf(buf, PAGE_SIZE, "%s\n", ioc_attr.adapter_attr.model); } static ssize_t @@ -453,10 +452,12 @@ bfad_im_model_desc_show(struct device *dev, struct device_attribute *attr, struct bfad_im_port_s *im_port = (struct bfad_im_port_s *) shost->hostdata[0]; struct bfad_s *bfad = im_port->bfad; - char model_descr[BFA_ADAPTER_MODEL_DESCR_LEN]; + struct bfa_ioc_attr_s ioc_attr; - bfa_get_adapter_model(&bfad->bfa, model_descr); - return snprintf(buf, PAGE_SIZE, "%s\n", model_descr); + memset(&ioc_attr, 0, sizeof(ioc_attr)); + bfa_get_attr(&bfad->bfa, &ioc_attr); + return snprintf(buf, PAGE_SIZE, "%s\n", + ioc_attr.adapter_attr.model_descr); } static ssize_t @@ -481,13 +482,14 @@ bfad_im_symbolic_name_show(struct device *dev, struct device_attribute *attr, struct bfad_im_port_s *im_port = (struct bfad_im_port_s *) shost->hostdata[0]; struct bfad_s *bfad = im_port->bfad; - char model[BFA_ADAPTER_MODEL_NAME_LEN]; - char fw_ver[BFA_VERSION_LEN]; + struct bfa_ioc_attr_s ioc_attr; + + memset(&ioc_attr, 0, sizeof(ioc_attr)); + bfa_get_attr(&bfad->bfa, &ioc_attr); - bfa_get_adapter_model(&bfad->bfa, model); - bfa_get_adapter_fw_ver(&bfad->bfa, fw_ver); return snprintf(buf, PAGE_SIZE, "Brocade %s FV%s DV%s\n", - model, fw_ver, BFAD_DRIVER_VERSION); + ioc_attr.adapter_attr.model, + ioc_attr.adapter_attr.fw_ver, BFAD_DRIVER_VERSION); } static ssize_t @@ -498,10 +500,11 @@ bfad_im_hw_version_show(struct device *dev, struct device_attribute *attr, struct bfad_im_port_s *im_port = (struct bfad_im_port_s *) shost->hostdata[0]; struct bfad_s *bfad = im_port->bfad; - char hw_ver[BFA_VERSION_LEN]; + struct bfa_ioc_attr_s ioc_attr; - bfa_get_pci_chip_rev(&bfad->bfa, hw_ver); - return snprintf(buf, PAGE_SIZE, "%s\n", hw_ver); + memset(&ioc_attr, 0, sizeof(ioc_attr)); + bfa_get_attr(&bfad->bfa, &ioc_attr); + return snprintf(buf, PAGE_SIZE, "%s\n", ioc_attr.adapter_attr.hw_ver); } static ssize_t @@ -519,10 +522,12 @@ bfad_im_optionrom_version_show(struct device *dev, struct bfad_im_port_s *im_port = (struct bfad_im_port_s *) shost->hostdata[0]; struct bfad_s *bfad = im_port->bfad; - char optrom_ver[BFA_VERSION_LEN]; + struct bfa_ioc_attr_s ioc_attr; - bfa_get_adapter_optrom_ver(&bfad->bfa, optrom_ver); - return snprintf(buf, PAGE_SIZE, "%s\n", optrom_ver); + memset(&ioc_attr, 0, sizeof(ioc_attr)); + bfa_get_attr(&bfad->bfa, &ioc_attr); + return snprintf(buf, PAGE_SIZE, "%s\n", + ioc_attr.adapter_attr.optrom_ver); } static ssize_t @@ -533,10 +538,11 @@ bfad_im_fw_version_show(struct device *dev, struct device_attribute *attr, struct bfad_im_port_s *im_port = (struct bfad_im_port_s *) shost->hostdata[0]; struct bfad_s *bfad = im_port->bfad; - char fw_ver[BFA_VERSION_LEN]; + struct bfa_ioc_attr_s ioc_attr; - bfa_get_adapter_fw_ver(&bfad->bfa, fw_ver); - return snprintf(buf, PAGE_SIZE, "%s\n", fw_ver); + memset(&ioc_attr, 0, sizeof(ioc_attr)); + bfa_get_attr(&bfad->bfa, &ioc_attr); + return snprintf(buf, PAGE_SIZE, "%s\n", ioc_attr.adapter_attr.fw_ver); } static ssize_t @@ -547,9 +553,11 @@ bfad_im_num_of_ports_show(struct device *dev, struct device_attribute *attr, struct bfad_im_port_s *im_port = (struct bfad_im_port_s *) shost->hostdata[0]; struct bfad_s *bfad = im_port->bfad; + struct bfa_ioc_attr_s ioc_attr; - return snprintf(buf, PAGE_SIZE, "%d\n", - bfa_get_nports(&bfad->bfa)); + memset(&ioc_attr, 0, sizeof(ioc_attr)); + bfa_get_attr(&bfad->bfa, &ioc_attr); + return snprintf(buf, PAGE_SIZE, "%d\n", ioc_attr.adapter_attr.nports); } static ssize_t diff --git a/trunk/drivers/scsi/bfa/bfad_attr.h b/trunk/drivers/scsi/bfa/bfad_attr.h index bf0102076508..4d3312da6a81 100644 --- a/trunk/drivers/scsi/bfa/bfad_attr.h +++ b/trunk/drivers/scsi/bfa/bfad_attr.h @@ -17,6 +17,9 @@ #ifndef __BFAD_ATTR_H__ #define __BFAD_ATTR_H__ +/** + * bfad_attr.h VMware driver configuration interface module. + */ /** * FC_transport_template FC transport template @@ -49,6 +52,12 @@ bfad_im_get_starget_port_name(struct scsi_target *starget); void bfad_im_get_host_port_id(struct Scsi_Host *shost); +/** + * FC transport template entry, issue a LIP. + */ +int +bfad_im_issue_fc_host_lip(struct Scsi_Host *shost); + struct Scsi_Host* bfad_os_starget_to_shost(struct scsi_target *starget); diff --git a/trunk/drivers/scsi/bfa/bfad_drv.h b/trunk/drivers/scsi/bfa/bfad_drv.h index 107848cd3b6d..172c81e25c1c 100644 --- a/trunk/drivers/scsi/bfa/bfad_drv.h +++ b/trunk/drivers/scsi/bfa/bfad_drv.h @@ -46,7 +46,7 @@ #ifdef BFA_DRIVER_VERSION #define BFAD_DRIVER_VERSION BFA_DRIVER_VERSION #else -#define BFAD_DRIVER_VERSION "2.1.2.1" +#define BFAD_DRIVER_VERSION "2.0.0.0" #endif @@ -62,9 +62,7 @@ #define BFAD_HAL_START_DONE 0x00000010 #define BFAD_PORT_ONLINE 0x00000020 #define BFAD_RPORT_ONLINE 0x00000040 -#define BFAD_FCS_INIT_DONE 0x00000080 -#define BFAD_HAL_INIT_FAIL 0x00000100 -#define BFAD_FC4_PROBE_DONE 0x00000200 + #define BFAD_PORT_DELETE 0x00000001 /* @@ -139,16 +137,12 @@ struct bfad_cfg_param_s { u32 binding_method; }; -union bfad_tmp_buf { - /* From struct bfa_adapter_attr_s */ - char manufacturer[BFA_ADAPTER_MFG_NAME_LEN]; - char serial_num[BFA_ADAPTER_SERIAL_NUM_LEN]; - char model[BFA_ADAPTER_MODEL_NAME_LEN]; - char fw_ver[BFA_VERSION_LEN]; - char optrom_ver[BFA_VERSION_LEN]; - - /* From struct bfa_ioc_pci_attr_s */ - u8 chip_rev[BFA_IOC_CHIP_REV_LEN]; /* chip revision */ +#define BFAD_AEN_MAX_APPS 8 +struct bfad_aen_file_s { + struct list_head qe; + struct bfad_s *bfad; + s32 ri; + s32 app_id; }; /* @@ -174,7 +168,6 @@ struct bfad_s { u32 inst_no; /* BFAD instance number */ u32 bfad_flags; spinlock_t bfad_lock; - struct task_struct *bfad_tsk; struct bfad_cfg_param_s cfg_data; struct bfad_msix_s msix_tab[MAX_MSIX_ENTRY]; int nvec; @@ -190,12 +183,18 @@ struct bfad_s { struct bfa_log_mod_s *logmod; struct bfa_aen_s *aen; struct bfa_aen_s aen_buf; - void *file_map[BFA_AEN_MAX_APP]; + struct bfad_aen_file_s file_buf[BFAD_AEN_MAX_APPS]; + struct list_head file_q; + struct list_head file_free_q; struct bfa_plog_s plog_buf; int ref_count; bfa_boolean_t ipfc_enabled; - union bfad_tmp_buf tmp_buf; struct fc_host_statistics link_stats; + + struct kobject *bfa_kobj; + struct kobject *ioc_kobj; + struct kobject *pport_kobj; + struct kobject *lport_kobj; }; /* @@ -259,7 +258,6 @@ bfa_status_t bfad_vf_create(struct bfad_s *bfad, u16 vf_id, struct bfa_port_cfg_s *port_cfg); bfa_status_t bfad_cfg_pport(struct bfad_s *bfad, enum bfa_port_role role); bfa_status_t bfad_drv_init(struct bfad_s *bfad); -bfa_status_t bfad_start_ops(struct bfad_s *bfad); void bfad_drv_start(struct bfad_s *bfad); void bfad_uncfg_pport(struct bfad_s *bfad); void bfad_drv_stop(struct bfad_s *bfad); @@ -281,7 +279,6 @@ void bfad_drv_uninit(struct bfad_s *bfad); void bfad_drv_log_level_set(struct bfad_s *bfad); bfa_status_t bfad_fc4_module_init(void); void bfad_fc4_module_exit(void); -int bfad_worker (void *ptr); void bfad_pci_remove(struct pci_dev *pdev); int bfad_pci_probe(struct pci_dev *pdev, const struct pci_device_id *pid); diff --git a/trunk/drivers/scsi/bfa/bfad_im.c b/trunk/drivers/scsi/bfa/bfad_im.c index f9fc67a25bf2..f788c2a0ab07 100644 --- a/trunk/drivers/scsi/bfa/bfad_im.c +++ b/trunk/drivers/scsi/bfa/bfad_im.c @@ -43,11 +43,11 @@ bfa_cb_ioim_done(void *drv, struct bfad_ioim_s *dio, struct bfad_s *bfad = drv; struct bfad_itnim_data_s *itnim_data; struct bfad_itnim_s *itnim; - u8 host_status = DID_OK; switch (io_status) { case BFI_IOIM_STS_OK: bfa_trc(bfad, scsi_status); + cmnd->result = ScsiResult(DID_OK, scsi_status); scsi_set_resid(cmnd, 0); if (sns_len > 0) { @@ -56,18 +56,8 @@ bfa_cb_ioim_done(void *drv, struct bfad_ioim_s *dio, sns_len = SCSI_SENSE_BUFFERSIZE; memcpy(cmnd->sense_buffer, sns_info, sns_len); } - if (residue > 0) { - bfa_trc(bfad, residue); + if (residue > 0) scsi_set_resid(cmnd, residue); - if (!sns_len && (scsi_status == SAM_STAT_GOOD) && - (scsi_bufflen(cmnd) - residue) < - cmnd->underflow) { - bfa_trc(bfad, 0); - host_status = DID_ERROR; - } - } - cmnd->result = ScsiResult(host_status, scsi_status); - break; case BFI_IOIM_STS_ABORTED: @@ -177,15 +167,17 @@ bfad_im_info(struct Scsi_Host *shost) static char bfa_buf[256]; struct bfad_im_port_s *im_port = (struct bfad_im_port_s *) shost->hostdata[0]; + struct bfa_ioc_attr_s ioc_attr; struct bfad_s *bfad = im_port->bfad; - char model[BFA_ADAPTER_MODEL_NAME_LEN]; - bfa_get_adapter_model(&bfad->bfa, model); + memset(&ioc_attr, 0, sizeof(ioc_attr)); + bfa_get_attr(&bfad->bfa, &ioc_attr); memset(bfa_buf, 0, sizeof(bfa_buf)); snprintf(bfa_buf, sizeof(bfa_buf), - "Brocade FC/FCOE Adapter, " "model: %s hwpath: %s driver: %s", - model, bfad->pci_name, BFAD_DRIVER_VERSION); + "Brocade FC/FCOE Adapter, " "model: %s hwpath: %s driver: %s", + ioc_attr.adapter_attr.model, bfad->pci_name, + BFAD_DRIVER_VERSION); return bfa_buf; } @@ -508,6 +500,16 @@ void bfa_fcb_itnim_tov(struct bfad_itnim_s *itnim) itnim->state = ITNIM_STATE_TIMEOUT; } +/** + * Path TOV processing begin notification -- dummy for linux + */ +void +bfa_fcb_itnim_tov_begin(struct bfad_itnim_s *itnim) +{ +} + + + /** * Allocate a Scsi_Host for a port. */ @@ -929,9 +931,10 @@ bfad_os_fc_host_init(struct bfad_im_port_s *im_port) struct Scsi_Host *host = im_port->shost; struct bfad_s *bfad = im_port->bfad; struct bfad_port_s *port = im_port->port; - struct bfa_pport_attr_s pattr; - char model[BFA_ADAPTER_MODEL_NAME_LEN]; - char fw_ver[BFA_VERSION_LEN]; + union attr { + struct bfa_pport_attr_s pattr; + struct bfa_ioc_attr_s ioc_attr; + } attr; fc_host_node_name(host) = bfa_os_htonll((bfa_fcs_port_get_nwwn(port->fcs_port))); @@ -951,18 +954,20 @@ bfad_os_fc_host_init(struct bfad_im_port_s *im_port) /* For fibre channel services type 0x20 */ fc_host_supported_fc4s(host)[7] = 1; - bfa_get_adapter_model(&bfad->bfa, model); - bfa_get_adapter_fw_ver(&bfad->bfa, fw_ver); + memset(&attr.ioc_attr, 0, sizeof(attr.ioc_attr)); + bfa_get_attr(&bfad->bfa, &attr.ioc_attr); sprintf(fc_host_symbolic_name(host), "Brocade %s FV%s DV%s", - model, fw_ver, BFAD_DRIVER_VERSION); + attr.ioc_attr.adapter_attr.model, + attr.ioc_attr.adapter_attr.fw_ver, BFAD_DRIVER_VERSION); fc_host_supported_speeds(host) = 0; fc_host_supported_speeds(host) |= FC_PORTSPEED_8GBIT | FC_PORTSPEED_4GBIT | FC_PORTSPEED_2GBIT | FC_PORTSPEED_1GBIT; - bfa_fcport_get_attr(&bfad->bfa, &pattr); - fc_host_maxframe_size(host) = pattr.pport_cfg.maxfrsize; + memset(&attr.pattr, 0, sizeof(attr.pattr)); + bfa_pport_get_attr(&bfad->bfa, &attr.pattr); + fc_host_maxframe_size(host) = attr.pattr.pport_cfg.maxfrsize; } static void diff --git a/trunk/drivers/scsi/bfa/bfad_im.h b/trunk/drivers/scsi/bfa/bfad_im.h index 85ab2da21321..189a5b29e21a 100644 --- a/trunk/drivers/scsi/bfa/bfad_im.h +++ b/trunk/drivers/scsi/bfa/bfad_im.h @@ -23,6 +23,7 @@ #define FCPI_NAME " fcpim" +void bfad_flags_set(struct bfad_s *bfad, u32 flags); bfa_status_t bfad_im_module_init(void); void bfad_im_module_exit(void); bfa_status_t bfad_im_probe(struct bfad_s *bfad); @@ -125,6 +126,7 @@ bfa_status_t bfad_os_thread_workq(struct bfad_s *bfad); void bfad_os_destroy_workq(struct bfad_im_s *im); void bfad_os_itnim_process(struct bfad_itnim_s *itnim_drv); void bfad_os_fc_host_init(struct bfad_im_port_s *im_port); +void bfad_os_init_work(struct bfad_im_port_s *im_port); void bfad_os_scsi_host_free(struct bfad_s *bfad, struct bfad_im_port_s *im_port); void bfad_os_ramp_up_qdepth(struct bfad_itnim_s *itnim, @@ -134,6 +136,9 @@ struct bfad_itnim_s *bfad_os_get_itnim(struct bfad_im_port_s *im_port, int id); int bfad_os_scsi_add_host(struct Scsi_Host *shost, struct bfad_im_port_s *im_port, struct bfad_s *bfad); +/* + * scsi_host_template entries + */ void bfad_im_itnim_unmap(struct bfad_im_port_s *im_port, struct bfad_itnim_s *itnim); diff --git a/trunk/drivers/scsi/bfa/bfad_intr.c b/trunk/drivers/scsi/bfa/bfad_intr.c index 2b7dbecbebca..7de8832f6fee 100644 --- a/trunk/drivers/scsi/bfa/bfad_intr.c +++ b/trunk/drivers/scsi/bfa/bfad_intr.c @@ -23,10 +23,8 @@ BFA_TRC_FILE(LDRV, INTR); /** * bfa_isr BFA driver interrupt functions */ -static int msix_disable_cb; -static int msix_disable_ct; -module_param(msix_disable_cb, int, S_IRUGO | S_IWUSR); -module_param(msix_disable_ct, int, S_IRUGO | S_IWUSR); +static int msix_disable; +module_param(msix_disable, int, S_IRUGO | S_IWUSR); /** * Line based interrupt handler. */ @@ -143,7 +141,6 @@ bfad_setup_intr(struct bfad_s *bfad) int error = 0; u32 mask = 0, i, num_bit = 0, max_bit = 0; struct msix_entry msix_entries[MAX_MSIX_ENTRY]; - struct pci_dev *pdev = bfad->pcidev; /* Call BFA to get the msix map for this PCI function. */ bfa_msix_getvecs(&bfad->bfa, &mask, &num_bit, &max_bit); @@ -151,9 +148,7 @@ bfad_setup_intr(struct bfad_s *bfad) /* Set up the msix entry table */ bfad_init_msix_entry(bfad, msix_entries, mask, max_bit); - if ((pdev->device == BFA_PCI_DEVICE_ID_CT && !msix_disable_ct) || - (pdev->device != BFA_PCI_DEVICE_ID_CT && !msix_disable_cb)) { - + if (!msix_disable) { error = pci_enable_msix(bfad->pcidev, msix_entries, bfad->nvec); if (error) { /* diff --git a/trunk/drivers/scsi/bfa/fabric.c b/trunk/drivers/scsi/bfa/fabric.c index 8166e9745ec0..a4b5dd449573 100644 --- a/trunk/drivers/scsi/bfa/fabric.c +++ b/trunk/drivers/scsi/bfa/fabric.c @@ -37,7 +37,7 @@ BFA_TRC_FILE(FCS, FABRIC); #define BFA_FCS_FABRIC_CLEANUP_DELAY (10000) /* Milliseconds */ #define bfa_fcs_fabric_set_opertype(__fabric) do { \ - if (bfa_fcport_get_topology((__fabric)->fcs->bfa) \ + if (bfa_pport_get_topology((__fabric)->fcs->bfa) \ == BFA_PPORT_TOPOLOGY_P2P) \ (__fabric)->oper_type = BFA_PPORT_TYPE_NPORT; \ else \ @@ -136,7 +136,8 @@ bfa_fcs_fabric_sm_uninit(struct bfa_fcs_fabric_s *fabric, case BFA_FCS_FABRIC_SM_CREATE: bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_created); bfa_fcs_fabric_init(fabric); - bfa_fcs_lport_init(&fabric->bport, &fabric->bport.port_cfg); + bfa_fcs_lport_init(&fabric->bport, fabric->fcs, FC_VF_ID_NULL, + &fabric->bport.port_cfg, NULL); break; case BFA_FCS_FABRIC_SM_LINK_UP: @@ -160,7 +161,7 @@ bfa_fcs_fabric_sm_created(struct bfa_fcs_fabric_s *fabric, switch (event) { case BFA_FCS_FABRIC_SM_START: - if (bfa_fcport_is_linkup(fabric->fcs->bfa)) { + if (bfa_pport_is_linkup(fabric->fcs->bfa)) { bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_flogi); bfa_fcs_fabric_login(fabric); } else @@ -224,7 +225,7 @@ bfa_fcs_fabric_sm_flogi(struct bfa_fcs_fabric_s *fabric, switch (event) { case BFA_FCS_FABRIC_SM_CONT_OP: - bfa_fcport_set_tx_bbcredit(fabric->fcs->bfa, fabric->bb_credit); + bfa_pport_set_tx_bbcredit(fabric->fcs->bfa, fabric->bb_credit); fabric->fab_type = BFA_FCS_FABRIC_SWITCHED; if (fabric->auth_reqd && fabric->is_auth) { @@ -251,7 +252,7 @@ bfa_fcs_fabric_sm_flogi(struct bfa_fcs_fabric_s *fabric, case BFA_FCS_FABRIC_SM_NO_FABRIC: fabric->fab_type = BFA_FCS_FABRIC_N2N; - bfa_fcport_set_tx_bbcredit(fabric->fcs->bfa, fabric->bb_credit); + bfa_pport_set_tx_bbcredit(fabric->fcs->bfa, fabric->bb_credit); bfa_fcs_fabric_notify_online(fabric); bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_nofabric); break; @@ -418,7 +419,7 @@ bfa_fcs_fabric_sm_nofabric(struct bfa_fcs_fabric_s *fabric, case BFA_FCS_FABRIC_SM_NO_FABRIC: bfa_trc(fabric->fcs, fabric->bb_credit); - bfa_fcport_set_tx_bbcredit(fabric->fcs->bfa, fabric->bb_credit); + bfa_pport_set_tx_bbcredit(fabric->fcs->bfa, fabric->bb_credit); break; default: @@ -562,15 +563,17 @@ void bfa_fcs_fabric_psymb_init(struct bfa_fcs_fabric_s *fabric) { struct bfa_port_cfg_s *port_cfg = &fabric->bport.port_cfg; - char model[BFA_ADAPTER_MODEL_NAME_LEN] = {0}; + struct bfa_adapter_attr_s adapter_attr; struct bfa_fcs_driver_info_s *driver_info = &fabric->fcs->driver_info; - bfa_ioc_get_adapter_model(&fabric->fcs->bfa->ioc, model); + bfa_os_memset((void *)&adapter_attr, 0, + sizeof(struct bfa_adapter_attr_s)); + bfa_ioc_get_adapter_attr(&fabric->fcs->bfa->ioc, &adapter_attr); /* * Model name/number */ - strncpy((char *)&port_cfg->sym_name, model, + strncpy((char *)&port_cfg->sym_name, adapter_attr.model, BFA_FCS_PORT_SYMBNAME_MODEL_SZ); strncat((char *)&port_cfg->sym_name, BFA_FCS_PORT_SYMBNAME_SEPARATOR, sizeof(BFA_FCS_PORT_SYMBNAME_SEPARATOR)); @@ -716,10 +719,10 @@ bfa_fcs_fabric_login(struct bfa_fcs_fabric_s *fabric) struct bfa_port_cfg_s *pcfg = &fabric->bport.port_cfg; u8 alpa = 0; - if (bfa_fcport_get_topology(bfa) == BFA_PPORT_TOPOLOGY_LOOP) - alpa = bfa_fcport_get_myalpa(bfa); + if (bfa_pport_get_topology(bfa) == BFA_PPORT_TOPOLOGY_LOOP) + alpa = bfa_pport_get_myalpa(bfa); - bfa_lps_flogi(fabric->lps, fabric, alpa, bfa_fcport_get_maxfrsize(bfa), + bfa_lps_flogi(fabric->lps, fabric, alpa, bfa_pport_get_maxfrsize(bfa), pcfg->pwwn, pcfg->nwwn, fabric->auth_reqd); fabric->stats.flogi_sent++; @@ -811,10 +814,10 @@ bfa_fcs_fabric_delete_comp(void *cbarg) */ /** - * Attach time initialization + * Module initialization */ void -bfa_fcs_fabric_attach(struct bfa_fcs_s *fcs) +bfa_fcs_fabric_modinit(struct bfa_fcs_s *fcs) { struct bfa_fcs_fabric_s *fabric; @@ -838,13 +841,7 @@ bfa_fcs_fabric_attach(struct bfa_fcs_s *fcs) bfa_wc_up(&fabric->wc); /* For the base port */ bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_uninit); - bfa_fcs_lport_attach(&fabric->bport, fabric->fcs, FC_VF_ID_NULL, NULL); -} - -void -bfa_fcs_fabric_modinit(struct bfa_fcs_s *fcs) -{ - bfa_sm_send_event(&fcs->fabric, BFA_FCS_FABRIC_SM_CREATE); + bfa_sm_send_event(fabric, BFA_FCS_FABRIC_SM_CREATE); bfa_trc(fcs, 0); } @@ -893,12 +890,6 @@ bfa_fcs_fabric_is_loopback(struct bfa_fcs_fabric_s *fabric) return bfa_sm_cmp_state(fabric, bfa_fcs_fabric_sm_loopback); } -bfa_boolean_t -bfa_fcs_fabric_is_auth_failed(struct bfa_fcs_fabric_s *fabric) -{ - return bfa_sm_cmp_state(fabric, bfa_fcs_fabric_sm_auth_failed); -} - enum bfa_pport_type bfa_fcs_fabric_port_type(struct bfa_fcs_fabric_s *fabric) { @@ -1174,8 +1165,8 @@ bfa_fcs_fabric_send_flogi_acc(struct bfa_fcs_fabric_s *fabric) reqlen = fc_flogi_acc_build(&fchs, bfa_fcxp_get_reqbuf(fcxp), bfa_os_hton3b(FC_FABRIC_PORT), n2n_port->reply_oxid, pcfg->pwwn, - pcfg->nwwn, bfa_fcport_get_maxfrsize(bfa), - bfa_fcport_get_rx_bbcredit(bfa)); + pcfg->nwwn, bfa_pport_get_maxfrsize(bfa), + bfa_pport_get_rx_bbcredit(bfa)); bfa_fcxp_send(fcxp, NULL, fabric->vf_id, bfa_lps_get_tag(fabric->lps), BFA_FALSE, FC_CLASS_3, reqlen, &fchs, @@ -1233,8 +1224,14 @@ bfa_fcs_fabric_aen_post(struct bfa_fcs_port_s *port, wwn2str(pwwn_ptr, pwwn); wwn2str(fwwn_ptr, fwwn); - bfa_log(logmod, BFA_LOG_CREATE_ID(BFA_AEN_CAT_PORT, event), - pwwn_ptr, fwwn_ptr); + switch (event) { + case BFA_PORT_AEN_FABRIC_NAME_CHANGE: + bfa_log(logmod, BFA_AEN_PORT_FABRIC_NAME_CHANGE, pwwn_ptr, + fwwn_ptr); + break; + default: + break; + } aen_data.port.pwwn = pwwn; aen_data.port.fwwn = fwwn; diff --git a/trunk/drivers/scsi/bfa/fcbuild.h b/trunk/drivers/scsi/bfa/fcbuild.h index 981d98d542b9..8fa7f270ef7b 100644 --- a/trunk/drivers/scsi/bfa/fcbuild.h +++ b/trunk/drivers/scsi/bfa/fcbuild.h @@ -72,9 +72,6 @@ fc_rpsc_operspeed_to_bfa_speed(enum fc_rpsc_op_speed_s speed) case RPSC_OP_SPEED_8G: return BFA_PPORT_SPEED_8GBPS; - case RPSC_OP_SPEED_10G: - return BFA_PPORT_SPEED_10GBPS; - default: return BFA_PPORT_SPEED_UNKNOWN; } @@ -100,9 +97,6 @@ fc_bfa_speed_to_rpsc_operspeed(enum bfa_pport_speed op_speed) case BFA_PPORT_SPEED_8GBPS: return RPSC_OP_SPEED_8G; - case BFA_PPORT_SPEED_10GBPS: - return RPSC_OP_SPEED_10G; - default: return RPSC_OP_SPEED_NOT_EST; } diff --git a/trunk/drivers/scsi/bfa/fcpim.c b/trunk/drivers/scsi/bfa/fcpim.c index 8ae4a2cfa85b..1f3c06efaa9e 100644 --- a/trunk/drivers/scsi/bfa/fcpim.c +++ b/trunk/drivers/scsi/bfa/fcpim.c @@ -126,7 +126,7 @@ bfa_fcs_itnim_sm_offline(struct bfa_fcs_itnim_s *itnim, break; default: - bfa_sm_fault(itnim->fcs, event); + bfa_assert(0); } } @@ -161,7 +161,7 @@ bfa_fcs_itnim_sm_prli_send(struct bfa_fcs_itnim_s *itnim, break; default: - bfa_sm_fault(itnim->fcs, event); + bfa_assert(0); } } @@ -205,7 +205,7 @@ bfa_fcs_itnim_sm_prli(struct bfa_fcs_itnim_s *itnim, break; default: - bfa_sm_fault(itnim->fcs, event); + bfa_assert(0); } } @@ -240,7 +240,7 @@ bfa_fcs_itnim_sm_prli_retry(struct bfa_fcs_itnim_s *itnim, break; default: - bfa_sm_fault(itnim->fcs, event); + bfa_assert(0); } } @@ -270,7 +270,7 @@ bfa_fcs_itnim_sm_hcb_online(struct bfa_fcs_itnim_s *itnim, break; default: - bfa_sm_fault(itnim->fcs, event); + bfa_assert(0); } } @@ -298,7 +298,7 @@ bfa_fcs_itnim_sm_online(struct bfa_fcs_itnim_s *itnim, break; default: - bfa_sm_fault(itnim->fcs, event); + bfa_assert(0); } } @@ -321,7 +321,7 @@ bfa_fcs_itnim_sm_hcb_offline(struct bfa_fcs_itnim_s *itnim, break; default: - bfa_sm_fault(itnim->fcs, event); + bfa_assert(0); } } @@ -354,7 +354,7 @@ bfa_fcs_itnim_sm_initiator(struct bfa_fcs_itnim_s *itnim, break; default: - bfa_sm_fault(itnim->fcs, event); + bfa_assert(0); } } @@ -385,8 +385,19 @@ bfa_fcs_itnim_aen_post(struct bfa_fcs_itnim_s *itnim, wwn2str(lpwwn_ptr, lpwwn); wwn2str(rpwwn_ptr, rpwwn); - bfa_log(logmod, BFA_LOG_CREATE_ID(BFA_AEN_CAT_ITNIM, event), - rpwwn_ptr, lpwwn_ptr); + switch (event) { + case BFA_ITNIM_AEN_ONLINE: + bfa_log(logmod, BFA_AEN_ITNIM_ONLINE, rpwwn_ptr, lpwwn_ptr); + break; + case BFA_ITNIM_AEN_OFFLINE: + bfa_log(logmod, BFA_AEN_ITNIM_OFFLINE, rpwwn_ptr, lpwwn_ptr); + break; + case BFA_ITNIM_AEN_DISCONNECT: + bfa_log(logmod, BFA_AEN_ITNIM_DISCONNECT, rpwwn_ptr, lpwwn_ptr); + break; + default: + break; + } aen_data.itnim.vf_id = rport->port->fabric->vf_id; aen_data.itnim.ppwwn = @@ -678,6 +689,7 @@ bfa_cb_itnim_tov_begin(void *cb_arg) struct bfa_fcs_itnim_s *itnim = (struct bfa_fcs_itnim_s *)cb_arg; bfa_trc(itnim->fcs, itnim->rport->pwwn); + bfa_fcb_itnim_tov_begin(itnim->itnim_drv); } /** @@ -810,3 +822,22 @@ void bfa_fcs_itnim_resume(struct bfa_fcs_itnim_s *itnim) { } + +/** + * Module initialization + */ +void +bfa_fcs_fcpim_modinit(struct bfa_fcs_s *fcs) +{ +} + +/** + * Module cleanup + */ +void +bfa_fcs_fcpim_modexit(struct bfa_fcs_s *fcs) +{ + bfa_fcs_modexit_comp(fcs); +} + + diff --git a/trunk/drivers/scsi/bfa/fcs_fabric.h b/trunk/drivers/scsi/bfa/fcs_fabric.h index 244c3f00c50c..eee960820f86 100644 --- a/trunk/drivers/scsi/bfa/fcs_fabric.h +++ b/trunk/drivers/scsi/bfa/fcs_fabric.h @@ -29,7 +29,6 @@ /* * fcs friend functions: only between fcs modules */ -void bfa_fcs_fabric_attach(struct bfa_fcs_s *fcs); void bfa_fcs_fabric_modinit(struct bfa_fcs_s *fcs); void bfa_fcs_fabric_modexit(struct bfa_fcs_s *fcs); void bfa_fcs_fabric_modsusp(struct bfa_fcs_s *fcs); @@ -47,7 +46,6 @@ void bfa_fcs_fabric_uf_recv(struct bfa_fcs_fabric_s *fabric, struct fchs_s *fchs, u16 len); u16 bfa_fcs_fabric_vport_count(struct bfa_fcs_fabric_s *fabric); bfa_boolean_t bfa_fcs_fabric_is_loopback(struct bfa_fcs_fabric_s *fabric); -bfa_boolean_t bfa_fcs_fabric_is_auth_failed(struct bfa_fcs_fabric_s *fabric); enum bfa_pport_type bfa_fcs_fabric_port_type(struct bfa_fcs_fabric_s *fabric); void bfa_fcs_fabric_psymb_init(struct bfa_fcs_fabric_s *fabric); void bfa_fcs_fabric_port_delete_comp(struct bfa_fcs_fabric_s *fabric); diff --git a/trunk/drivers/scsi/bfa/fcs_fcpim.h b/trunk/drivers/scsi/bfa/fcs_fcpim.h index 11e6e7bce9f6..61e9e2687de3 100644 --- a/trunk/drivers/scsi/bfa/fcs_fcpim.h +++ b/trunk/drivers/scsi/bfa/fcs_fcpim.h @@ -34,6 +34,11 @@ void bfa_fcs_itnim_is_initiator(struct bfa_fcs_itnim_s *itnim); void bfa_fcs_itnim_pause(struct bfa_fcs_itnim_s *itnim); void bfa_fcs_itnim_resume(struct bfa_fcs_itnim_s *itnim); +/* + * Modudle init/cleanup routines. + */ +void bfa_fcs_fcpim_modinit(struct bfa_fcs_s *fcs); +void bfa_fcs_fcpim_modexit(struct bfa_fcs_s *fcs); void bfa_fcs_fcpim_uf_recv(struct bfa_fcs_itnim_s *itnim, struct fchs_s *fchs, u16 len); #endif /* __FCS_FCPIM_H__ */ diff --git a/trunk/drivers/scsi/bfa/fcs_lport.h b/trunk/drivers/scsi/bfa/fcs_lport.h index a6508c8ab184..ae744ba35671 100644 --- a/trunk/drivers/scsi/bfa/fcs_lport.h +++ b/trunk/drivers/scsi/bfa/fcs_lport.h @@ -84,10 +84,9 @@ void bfa_fcs_port_uf_recv(struct bfa_fcs_port_s *lport, struct fchs_s *fchs, * Following routines will be called by Fabric to indicate port * online/offline to vport. */ -void bfa_fcs_lport_attach(struct bfa_fcs_port_s *lport, struct bfa_fcs_s *fcs, - uint16_t vf_id, struct bfa_fcs_vport_s *vport); -void bfa_fcs_lport_init(struct bfa_fcs_port_s *lport, - struct bfa_port_cfg_s *port_cfg); +void bfa_fcs_lport_init(struct bfa_fcs_port_s *lport, struct bfa_fcs_s *fcs, + u16 vf_id, struct bfa_port_cfg_s *port_cfg, + struct bfa_fcs_vport_s *vport); void bfa_fcs_port_online(struct bfa_fcs_port_s *port); void bfa_fcs_port_offline(struct bfa_fcs_port_s *port); void bfa_fcs_port_delete(struct bfa_fcs_port_s *port); diff --git a/trunk/drivers/scsi/bfa/fcs_port.h b/trunk/drivers/scsi/bfa/fcs_port.h index 408c06a7d164..abb65191dd27 100644 --- a/trunk/drivers/scsi/bfa/fcs_port.h +++ b/trunk/drivers/scsi/bfa/fcs_port.h @@ -26,6 +26,7 @@ /* * fcs friend functions: only between fcs modules */ -void bfa_fcs_pport_attach(struct bfa_fcs_s *fcs); +void bfa_fcs_pport_modinit(struct bfa_fcs_s *fcs); +void bfa_fcs_pport_modexit(struct bfa_fcs_s *fcs); #endif /* __FCS_PPORT_H__ */ diff --git a/trunk/drivers/scsi/bfa/fcs_rport.h b/trunk/drivers/scsi/bfa/fcs_rport.h index 9c8d1d292380..f601e9d74236 100644 --- a/trunk/drivers/scsi/bfa/fcs_rport.h +++ b/trunk/drivers/scsi/bfa/fcs_rport.h @@ -24,6 +24,9 @@ #include +void bfa_fcs_rport_modinit(struct bfa_fcs_s *fcs); +void bfa_fcs_rport_modexit(struct bfa_fcs_s *fcs); + void bfa_fcs_rport_uf_recv(struct bfa_fcs_rport_s *rport, struct fchs_s *fchs, u16 len); void bfa_fcs_rport_scn(struct bfa_fcs_rport_s *rport); diff --git a/trunk/drivers/scsi/bfa/fcs_uf.h b/trunk/drivers/scsi/bfa/fcs_uf.h index f591072214fe..96f1bdcb31ed 100644 --- a/trunk/drivers/scsi/bfa/fcs_uf.h +++ b/trunk/drivers/scsi/bfa/fcs_uf.h @@ -26,6 +26,7 @@ /* * fcs friend functions: only between fcs modules */ -void bfa_fcs_uf_attach(struct bfa_fcs_s *fcs); +void bfa_fcs_uf_modinit(struct bfa_fcs_s *fcs); +void bfa_fcs_uf_modexit(struct bfa_fcs_s *fcs); #endif /* __FCS_UF_H__ */ diff --git a/trunk/drivers/scsi/bfa/fcs_vport.h b/trunk/drivers/scsi/bfa/fcs_vport.h index 13c32ebf946c..9e80b6a97b7f 100644 --- a/trunk/drivers/scsi/bfa/fcs_vport.h +++ b/trunk/drivers/scsi/bfa/fcs_vport.h @@ -22,10 +22,18 @@ #include #include +/* + * Modudle init/cleanup routines. + */ + +void bfa_fcs_vport_modinit(struct bfa_fcs_s *fcs); +void bfa_fcs_vport_modexit(struct bfa_fcs_s *fcs); + void bfa_fcs_vport_cleanup(struct bfa_fcs_vport_s *vport); void bfa_fcs_vport_online(struct bfa_fcs_vport_s *vport); void bfa_fcs_vport_offline(struct bfa_fcs_vport_s *vport); void bfa_fcs_vport_delete_comp(struct bfa_fcs_vport_s *vport); +u32 bfa_fcs_vport_get_max(struct bfa_fcs_s *fcs); #endif /* __FCS_VPORT_H__ */ diff --git a/trunk/drivers/scsi/bfa/fdmi.c b/trunk/drivers/scsi/bfa/fdmi.c index 8f17076d1a87..df2a1e54e16b 100644 --- a/trunk/drivers/scsi/bfa/fdmi.c +++ b/trunk/drivers/scsi/bfa/fdmi.c @@ -116,9 +116,6 @@ static void bfa_fcs_port_fdmi_sm_rpa_retry(struct bfa_fcs_port_fdmi_s *fdmi, enum port_fdmi_event event); static void bfa_fcs_port_fdmi_sm_online(struct bfa_fcs_port_fdmi_s *fdmi, enum port_fdmi_event event); -static void bfa_fcs_port_fdmi_sm_disabled(struct bfa_fcs_port_fdmi_s *fdmi, - enum port_fdmi_event event); - /** * Start in offline state - awaiting MS to send start. */ @@ -158,7 +155,7 @@ bfa_fcs_port_fdmi_sm_offline(struct bfa_fcs_port_fdmi_s *fdmi, break; default: - bfa_sm_fault(port->fcs, event); + bfa_assert(0); } } @@ -183,7 +180,7 @@ bfa_fcs_port_fdmi_sm_sending_rhba(struct bfa_fcs_port_fdmi_s *fdmi, break; default: - bfa_sm_fault(port->fcs, event); + bfa_assert(0); } } @@ -230,7 +227,7 @@ bfa_fcs_port_fdmi_sm_rhba(struct bfa_fcs_port_fdmi_s *fdmi, break; default: - bfa_sm_fault(port->fcs, event); + bfa_assert(0); } } @@ -258,7 +255,7 @@ bfa_fcs_port_fdmi_sm_rhba_retry(struct bfa_fcs_port_fdmi_s *fdmi, break; default: - bfa_sm_fault(port->fcs, event); + bfa_assert(0); } } @@ -286,7 +283,7 @@ bfa_fcs_port_fdmi_sm_sending_rprt(struct bfa_fcs_port_fdmi_s *fdmi, break; default: - bfa_sm_fault(port->fcs, event); + bfa_assert(0); } } @@ -331,7 +328,7 @@ bfa_fcs_port_fdmi_sm_rprt(struct bfa_fcs_port_fdmi_s *fdmi, break; default: - bfa_sm_fault(port->fcs, event); + bfa_assert(0); } } @@ -359,7 +356,7 @@ bfa_fcs_port_fdmi_sm_rprt_retry(struct bfa_fcs_port_fdmi_s *fdmi, break; default: - bfa_sm_fault(port->fcs, event); + bfa_assert(0); } } @@ -387,7 +384,7 @@ bfa_fcs_port_fdmi_sm_sending_rpa(struct bfa_fcs_port_fdmi_s *fdmi, break; default: - bfa_sm_fault(port->fcs, event); + bfa_assert(0); } } @@ -431,7 +428,7 @@ bfa_fcs_port_fdmi_sm_rpa(struct bfa_fcs_port_fdmi_s *fdmi, break; default: - bfa_sm_fault(port->fcs, event); + bfa_assert(0); } } @@ -459,7 +456,7 @@ bfa_fcs_port_fdmi_sm_rpa_retry(struct bfa_fcs_port_fdmi_s *fdmi, break; default: - bfa_sm_fault(port->fcs, event); + bfa_assert(0); } } @@ -478,24 +475,10 @@ bfa_fcs_port_fdmi_sm_online(struct bfa_fcs_port_fdmi_s *fdmi, break; default: - bfa_sm_fault(port->fcs, event); + bfa_assert(0); } } -/** - * FDMI is disabled state. - */ -static void -bfa_fcs_port_fdmi_sm_disabled(struct bfa_fcs_port_fdmi_s *fdmi, - enum port_fdmi_event event) -{ - struct bfa_fcs_port_s *port = fdmi->ms->port; - - bfa_trc(port->fcs, port->port_cfg.pwwn); - bfa_trc(port->fcs, event); - - /* No op State. It can only be enabled at Driver Init. */ -} /** * RHBA : Register HBA Attributes. @@ -1114,23 +1097,36 @@ bfa_fcs_fdmi_get_hbaattr(struct bfa_fcs_port_fdmi_s *fdmi, { struct bfa_fcs_port_s *port = fdmi->ms->port; struct bfa_fcs_driver_info_s *driver_info = &port->fcs->driver_info; + struct bfa_adapter_attr_s adapter_attr; bfa_os_memset(hba_attr, 0, sizeof(struct bfa_fcs_fdmi_hba_attr_s)); + bfa_os_memset(&adapter_attr, 0, sizeof(struct bfa_adapter_attr_s)); + + bfa_ioc_get_adapter_attr(&port->fcs->bfa->ioc, &adapter_attr); + + strncpy(hba_attr->manufacturer, adapter_attr.manufacturer, + sizeof(adapter_attr.manufacturer)); + + strncpy(hba_attr->serial_num, adapter_attr.serial_num, + sizeof(adapter_attr.serial_num)); - bfa_ioc_get_adapter_manufacturer(&port->fcs->bfa->ioc, - hba_attr->manufacturer); - bfa_ioc_get_adapter_serial_num(&port->fcs->bfa->ioc, - hba_attr->serial_num); - bfa_ioc_get_adapter_model(&port->fcs->bfa->ioc, hba_attr->model); - bfa_ioc_get_adapter_model(&port->fcs->bfa->ioc, hba_attr->model_desc); - bfa_ioc_get_pci_chip_rev(&port->fcs->bfa->ioc, hba_attr->hw_version); - bfa_ioc_get_adapter_optrom_ver(&port->fcs->bfa->ioc, - hba_attr->option_rom_ver); - bfa_ioc_get_adapter_fw_ver(&port->fcs->bfa->ioc, hba_attr->fw_version); + strncpy(hba_attr->model, adapter_attr.model, sizeof(hba_attr->model)); + + strncpy(hba_attr->model_desc, adapter_attr.model_descr, + sizeof(hba_attr->model_desc)); + + strncpy(hba_attr->hw_version, adapter_attr.hw_ver, + sizeof(hba_attr->hw_version)); strncpy(hba_attr->driver_version, (char *)driver_info->version, sizeof(hba_attr->driver_version)); + strncpy(hba_attr->option_rom_ver, adapter_attr.optrom_ver, + sizeof(hba_attr->option_rom_ver)); + + strncpy(hba_attr->fw_version, adapter_attr.fw_ver, + sizeof(hba_attr->fw_version)); + strncpy(hba_attr->os_name, driver_info->host_os_name, sizeof(hba_attr->os_name)); @@ -1162,7 +1158,7 @@ bfa_fcs_fdmi_get_portattr(struct bfa_fcs_port_fdmi_s *fdmi, /* * get pport attributes from hal */ - bfa_fcport_get_attr(port->fcs->bfa, &pport_attr); + bfa_pport_get_attr(port->fcs->bfa, &pport_attr); /* * get FC4 type Bitmask @@ -1205,10 +1201,7 @@ bfa_fcs_port_fdmi_init(struct bfa_fcs_port_ms_s *ms) struct bfa_fcs_port_fdmi_s *fdmi = &ms->fdmi; fdmi->ms = ms; - if (ms->port->fcs->fdmi_enabled) - bfa_sm_set_state(fdmi, bfa_fcs_port_fdmi_sm_offline); - else - bfa_sm_set_state(fdmi, bfa_fcs_port_fdmi_sm_disabled); + bfa_sm_set_state(fdmi, bfa_fcs_port_fdmi_sm_offline); } void diff --git a/trunk/drivers/scsi/bfa/include/aen/bfa_aen.h b/trunk/drivers/scsi/bfa/include/aen/bfa_aen.h index 6abbab005db6..d9cbc2a783d4 100644 --- a/trunk/drivers/scsi/bfa/include/aen/bfa_aen.h +++ b/trunk/drivers/scsi/bfa/include/aen/bfa_aen.h @@ -18,24 +18,21 @@ #define __BFA_AEN_H__ #include "defs/bfa_defs_aen.h" -#include "defs/bfa_defs_status.h" -#include "cs/bfa_debug.h" -#define BFA_AEN_MAX_ENTRY 512 +#define BFA_AEN_MAX_ENTRY 512 -extern int bfa_aen_max_cfg_entry; +extern s32 bfa_aen_max_cfg_entry; struct bfa_aen_s { void *bfad; - int max_entry; - int write_index; - int read_index; - int bfad_num; - int seq_num; + s32 max_entry; + s32 write_index; + s32 read_index; + u32 bfad_num; + u32 seq_num; void (*aen_cb_notify)(void *bfad); void (*gettimeofday)(struct bfa_timeval_s *tv); - struct bfa_trc_mod_s *trcmod; - int app_ri[BFA_AEN_MAX_APP]; /* For multiclient support */ - struct bfa_aen_entry_s list[BFA_AEN_MAX_ENTRY]; /* Must be the last */ + struct bfa_trc_mod_s *trcmod; + struct bfa_aen_entry_s list[BFA_AEN_MAX_ENTRY]; /* Must be the last */ }; @@ -48,49 +45,48 @@ bfa_aen_set_max_cfg_entry(int max_entry) bfa_aen_max_cfg_entry = max_entry; } -static inline int +static inline s32 bfa_aen_get_max_cfg_entry(void) { return bfa_aen_max_cfg_entry; } -static inline int +static inline s32 bfa_aen_get_meminfo(void) { return sizeof(struct bfa_aen_entry_s) * bfa_aen_get_max_cfg_entry(); } -static inline int +static inline s32 bfa_aen_get_wi(struct bfa_aen_s *aen) { return aen->write_index; } -static inline int +static inline s32 bfa_aen_get_ri(struct bfa_aen_s *aen) { return aen->read_index; } -static inline int -bfa_aen_fetch_count(struct bfa_aen_s *aen, enum bfa_aen_app app_id) +static inline s32 +bfa_aen_fetch_count(struct bfa_aen_s *aen, s32 read_index) { - bfa_assert((app_id < BFA_AEN_MAX_APP) && (app_id >= bfa_aen_app_bcu)); - return ((aen->write_index + aen->max_entry) - aen->app_ri[app_id]) + return ((aen->write_index + aen->max_entry) - read_index) % aen->max_entry; } -int bfa_aen_init(struct bfa_aen_s *aen, struct bfa_trc_mod_s *trcmod, - void *bfad, int bfad_num, void (*aen_cb_notify)(void *), +s32 bfa_aen_init(struct bfa_aen_s *aen, struct bfa_trc_mod_s *trcmod, + void *bfad, u32 inst_id, void (*aen_cb_notify)(void *), void (*gettimeofday)(struct bfa_timeval_s *)); -void bfa_aen_post(struct bfa_aen_s *aen, enum bfa_aen_category aen_category, +s32 bfa_aen_post(struct bfa_aen_s *aen, enum bfa_aen_category aen_category, int aen_type, union bfa_aen_data_u *aen_data); -bfa_status_t bfa_aen_fetch(struct bfa_aen_s *aen, - struct bfa_aen_entry_s *aen_entry, - int entry_req, enum bfa_aen_app app_id, int *entry_ret); +s32 bfa_aen_fetch(struct bfa_aen_s *aen, struct bfa_aen_entry_s *aen_entry, + s32 entry_space, s32 rii, s32 *ri_arr, + s32 ri_arr_cnt); -int bfa_aen_get_inst(struct bfa_aen_s *aen); +s32 bfa_aen_get_inst(struct bfa_aen_s *aen); #endif /* __BFA_AEN_H__ */ diff --git a/trunk/drivers/scsi/bfa/include/bfa.h b/trunk/drivers/scsi/bfa/include/bfa.h index 1f5966cfbd16..d4bc0d9fa42c 100644 --- a/trunk/drivers/scsi/bfa/include/bfa.h +++ b/trunk/drivers/scsi/bfa/include/bfa.h @@ -106,26 +106,6 @@ struct bfa_sge_s { bfa_ioc_fetch_stats(&(__bfa)->ioc, __ioc_stats) #define bfa_ioc_clear_stats(__bfa) \ bfa_ioc_clr_stats(&(__bfa)->ioc) -#define bfa_get_nports(__bfa) \ - bfa_ioc_get_nports(&(__bfa)->ioc) -#define bfa_get_adapter_manufacturer(__bfa, __manufacturer) \ - bfa_ioc_get_adapter_manufacturer(&(__bfa)->ioc, __manufacturer) -#define bfa_get_adapter_model(__bfa, __model) \ - bfa_ioc_get_adapter_model(&(__bfa)->ioc, __model) -#define bfa_get_adapter_serial_num(__bfa, __serial_num) \ - bfa_ioc_get_adapter_serial_num(&(__bfa)->ioc, __serial_num) -#define bfa_get_adapter_fw_ver(__bfa, __fw_ver) \ - bfa_ioc_get_adapter_fw_ver(&(__bfa)->ioc, __fw_ver) -#define bfa_get_adapter_optrom_ver(__bfa, __optrom_ver) \ - bfa_ioc_get_adapter_optrom_ver(&(__bfa)->ioc, __optrom_ver) -#define bfa_get_pci_chip_rev(__bfa, __chip_rev) \ - bfa_ioc_get_pci_chip_rev(&(__bfa)->ioc, __chip_rev) -#define bfa_get_ioc_state(__bfa) \ - bfa_ioc_get_state(&(__bfa)->ioc) -#define bfa_get_type(__bfa) \ - bfa_ioc_get_type(&(__bfa)->ioc) -#define bfa_get_mac(__bfa) \ - bfa_ioc_get_mac(&(__bfa)->ioc) /* * bfa API functions @@ -181,7 +161,6 @@ bfa_status_t bfa_iocfc_israttr_set(struct bfa_s *bfa, void bfa_iocfc_enable(struct bfa_s *bfa); void bfa_iocfc_disable(struct bfa_s *bfa); void bfa_ioc_auto_recover(bfa_boolean_t auto_recover); -void bfa_chip_reset(struct bfa_s *bfa); void bfa_cb_ioc_disable(void *bfad); void bfa_timer_tick(struct bfa_s *bfa); #define bfa_timer_start(_bfa, _timer, _timercb, _arg, _timeout) \ @@ -192,7 +171,6 @@ void bfa_timer_tick(struct bfa_s *bfa); */ bfa_status_t bfa_debug_fwtrc(struct bfa_s *bfa, void *trcdata, int *trclen); bfa_status_t bfa_debug_fwsave(struct bfa_s *bfa, void *trcdata, int *trclen); -void bfa_debug_fwsave_clear(struct bfa_s *bfa); #include "bfa_priv.h" diff --git a/trunk/drivers/scsi/bfa/include/bfa_svc.h b/trunk/drivers/scsi/bfa/include/bfa_svc.h index 1349b99a3c6d..268d956bad89 100644 --- a/trunk/drivers/scsi/bfa/include/bfa_svc.h +++ b/trunk/drivers/scsi/bfa/include/bfa_svc.h @@ -26,7 +26,6 @@ struct bfa_fcxp_s; #include #include #include -#include #include #include @@ -36,7 +35,7 @@ struct bfa_fcxp_s; struct bfa_rport_info_s { u16 max_frmsz; /* max rcv pdu size */ u32 pid:24, /* remote port ID */ - lp_tag:8; /* tag */ + lp_tag:8; u32 local_pid:24, /* local port ID */ cisc:8; /* CIRO supported */ u8 fc_class; /* supported FC classes. enum fc_cos */ @@ -55,7 +54,7 @@ struct bfa_rport_s { void *rport_drv; /* fcs/driver rport object */ u16 fw_handle; /* firmware rport handle */ u16 rport_tag; /* BFA rport tag */ - struct bfa_rport_info_s rport_info; /* rport info from fcs/driver */ + struct bfa_rport_info_s rport_info; /* rport info from *fcs/driver */ struct bfa_reqq_wait_s reqq_wait; /* to wait for room in reqq */ struct bfa_cb_qe_s hcb_qe; /* BFA callback qelem */ struct bfa_rport_hal_stats_s stats; /* BFA rport statistics */ @@ -102,7 +101,7 @@ struct bfa_uf_buf_s { struct bfa_uf_s { struct list_head qe; /* queue element */ struct bfa_s *bfa; /* bfa instance */ - u16 uf_tag; /* identifying tag fw msgs */ + u16 uf_tag; /* identifying tag f/w messages */ u16 vf_id; u16 src_rport_handle; u16 rsvd; @@ -128,7 +127,7 @@ struct bfa_lps_s { u8 reqq; /* lport request queue */ u8 alpa; /* ALPA for loop topologies */ u32 lp_pid; /* lport port ID */ - bfa_boolean_t fdisc; /* send FDISC instead of FLOGI */ + bfa_boolean_t fdisc; /* send FDISC instead of FLOGI*/ bfa_boolean_t auth_en; /* enable authentication */ bfa_boolean_t auth_req; /* authentication required */ bfa_boolean_t npiv_en; /* NPIV is allowed by peer */ @@ -152,69 +151,60 @@ struct bfa_lps_s { bfa_eproto_status_t ext_status; }; -#define BFA_FCPORT(_bfa) (&((_bfa)->modules.port)) - /* * bfa pport API functions */ -bfa_status_t bfa_fcport_enable(struct bfa_s *bfa); -bfa_status_t bfa_fcport_disable(struct bfa_s *bfa); -bfa_status_t bfa_fcport_cfg_speed(struct bfa_s *bfa, +bfa_status_t bfa_pport_enable(struct bfa_s *bfa); +bfa_status_t bfa_pport_disable(struct bfa_s *bfa); +bfa_status_t bfa_pport_cfg_speed(struct bfa_s *bfa, enum bfa_pport_speed speed); -enum bfa_pport_speed bfa_fcport_get_speed(struct bfa_s *bfa); -bfa_status_t bfa_fcport_cfg_topology(struct bfa_s *bfa, +enum bfa_pport_speed bfa_pport_get_speed(struct bfa_s *bfa); +bfa_status_t bfa_pport_cfg_topology(struct bfa_s *bfa, enum bfa_pport_topology topo); -enum bfa_pport_topology bfa_fcport_get_topology(struct bfa_s *bfa); -bfa_status_t bfa_fcport_cfg_hardalpa(struct bfa_s *bfa, u8 alpa); -bfa_boolean_t bfa_fcport_get_hardalpa(struct bfa_s *bfa, u8 *alpa); -u8 bfa_fcport_get_myalpa(struct bfa_s *bfa); -bfa_status_t bfa_fcport_clr_hardalpa(struct bfa_s *bfa); -bfa_status_t bfa_fcport_cfg_maxfrsize(struct bfa_s *bfa, u16 maxsize); -u16 bfa_fcport_get_maxfrsize(struct bfa_s *bfa); -u32 bfa_fcport_mypid(struct bfa_s *bfa); -u8 bfa_fcport_get_rx_bbcredit(struct bfa_s *bfa); -bfa_status_t bfa_fcport_trunk_enable(struct bfa_s *bfa, u8 bitmap); -bfa_status_t bfa_fcport_trunk_disable(struct bfa_s *bfa); -bfa_boolean_t bfa_fcport_trunk_query(struct bfa_s *bfa, u32 *bitmap); -void bfa_fcport_get_attr(struct bfa_s *bfa, struct bfa_pport_attr_s *attr); -wwn_t bfa_fcport_get_wwn(struct bfa_s *bfa, bfa_boolean_t node); -void bfa_fcport_event_register(struct bfa_s *bfa, +enum bfa_pport_topology bfa_pport_get_topology(struct bfa_s *bfa); +bfa_status_t bfa_pport_cfg_hardalpa(struct bfa_s *bfa, u8 alpa); +bfa_boolean_t bfa_pport_get_hardalpa(struct bfa_s *bfa, u8 *alpa); +u8 bfa_pport_get_myalpa(struct bfa_s *bfa); +bfa_status_t bfa_pport_clr_hardalpa(struct bfa_s *bfa); +bfa_status_t bfa_pport_cfg_maxfrsize(struct bfa_s *bfa, u16 maxsize); +u16 bfa_pport_get_maxfrsize(struct bfa_s *bfa); +u32 bfa_pport_mypid(struct bfa_s *bfa); +u8 bfa_pport_get_rx_bbcredit(struct bfa_s *bfa); +bfa_status_t bfa_pport_trunk_enable(struct bfa_s *bfa, u8 bitmap); +bfa_status_t bfa_pport_trunk_disable(struct bfa_s *bfa); +bfa_boolean_t bfa_pport_trunk_query(struct bfa_s *bfa, u32 *bitmap); +void bfa_pport_get_attr(struct bfa_s *bfa, struct bfa_pport_attr_s *attr); +wwn_t bfa_pport_get_wwn(struct bfa_s *bfa, bfa_boolean_t node); +bfa_status_t bfa_pport_get_stats(struct bfa_s *bfa, + union bfa_pport_stats_u *stats, + bfa_cb_pport_t cbfn, void *cbarg); +bfa_status_t bfa_pport_clear_stats(struct bfa_s *bfa, bfa_cb_pport_t cbfn, + void *cbarg); +void bfa_pport_event_register(struct bfa_s *bfa, void (*event_cbfn) (void *cbarg, bfa_pport_event_t event), void *event_cbarg); -bfa_boolean_t bfa_fcport_is_disabled(struct bfa_s *bfa); -void bfa_fcport_cfg_qos(struct bfa_s *bfa, bfa_boolean_t on_off); -void bfa_fcport_cfg_ratelim(struct bfa_s *bfa, bfa_boolean_t on_off); -bfa_status_t bfa_fcport_cfg_ratelim_speed(struct bfa_s *bfa, +bfa_boolean_t bfa_pport_is_disabled(struct bfa_s *bfa); +void bfa_pport_cfg_qos(struct bfa_s *bfa, bfa_boolean_t on_off); +void bfa_pport_cfg_ratelim(struct bfa_s *bfa, bfa_boolean_t on_off); +bfa_status_t bfa_pport_cfg_ratelim_speed(struct bfa_s *bfa, enum bfa_pport_speed speed); -enum bfa_pport_speed bfa_fcport_get_ratelim_speed(struct bfa_s *bfa); +enum bfa_pport_speed bfa_pport_get_ratelim_speed(struct bfa_s *bfa); -void bfa_fcport_set_tx_bbcredit(struct bfa_s *bfa, u16 tx_bbcredit); -void bfa_fcport_busy(struct bfa_s *bfa, bfa_boolean_t status); -void bfa_fcport_beacon(struct bfa_s *bfa, bfa_boolean_t beacon, +void bfa_pport_set_tx_bbcredit(struct bfa_s *bfa, u16 tx_bbcredit); +void bfa_pport_busy(struct bfa_s *bfa, bfa_boolean_t status); +void bfa_pport_beacon(struct bfa_s *bfa, bfa_boolean_t beacon, bfa_boolean_t link_e2e_beacon); void bfa_cb_pport_event(void *cbarg, bfa_pport_event_t event); -void bfa_fcport_qos_get_attr(struct bfa_s *bfa, - struct bfa_qos_attr_s *qos_attr); -void bfa_fcport_qos_get_vc_attr(struct bfa_s *bfa, +void bfa_pport_qos_get_attr(struct bfa_s *bfa, struct bfa_qos_attr_s *qos_attr); +void bfa_pport_qos_get_vc_attr(struct bfa_s *bfa, struct bfa_qos_vc_attr_s *qos_vc_attr); -bfa_status_t bfa_fcport_get_qos_stats(struct bfa_s *bfa, - union bfa_fcport_stats_u *stats, +bfa_status_t bfa_pport_get_qos_stats(struct bfa_s *bfa, + union bfa_pport_stats_u *stats, bfa_cb_pport_t cbfn, void *cbarg); -bfa_status_t bfa_fcport_clear_qos_stats(struct bfa_s *bfa, bfa_cb_pport_t cbfn, +bfa_status_t bfa_pport_clear_qos_stats(struct bfa_s *bfa, bfa_cb_pport_t cbfn, void *cbarg); -bfa_status_t bfa_fcport_get_fcoe_stats(struct bfa_s *bfa, - union bfa_fcport_stats_u *stats, - bfa_cb_pport_t cbfn, void *cbarg); -bfa_status_t bfa_fcport_clear_fcoe_stats(struct bfa_s *bfa, bfa_cb_pport_t cbfn, - void *cbarg); - -bfa_boolean_t bfa_fcport_is_ratelim(struct bfa_s *bfa); -bfa_boolean_t bfa_fcport_is_linkup(struct bfa_s *bfa); -bfa_status_t bfa_fcport_get_stats(struct bfa_s *bfa, - union bfa_fcport_stats_u *stats, - bfa_cb_pport_t cbfn, void *cbarg); -bfa_status_t bfa_fcport_clear_stats(struct bfa_s *bfa, bfa_cb_pport_t cbfn, - void *cbarg); +bfa_boolean_t bfa_pport_is_ratelim(struct bfa_s *bfa); +bfa_boolean_t bfa_pport_is_linkup(struct bfa_s *bfa); /* * bfa rport API functions @@ -303,7 +293,6 @@ void bfa_uf_free(struct bfa_uf_s *uf); * bfa lport service api */ -u32 bfa_lps_get_max_vport(struct bfa_s *bfa); struct bfa_lps_s *bfa_lps_alloc(struct bfa_s *bfa); void bfa_lps_delete(struct bfa_lps_s *lps); void bfa_lps_discard(struct bfa_lps_s *lps); @@ -326,12 +315,10 @@ wwn_t bfa_lps_get_peer_pwwn(struct bfa_lps_s *lps); wwn_t bfa_lps_get_peer_nwwn(struct bfa_lps_s *lps); u8 bfa_lps_get_lsrjt_rsn(struct bfa_lps_s *lps); u8 bfa_lps_get_lsrjt_expl(struct bfa_lps_s *lps); -mac_t bfa_lps_get_lp_mac(struct bfa_lps_s *lps); void bfa_cb_lps_flogi_comp(void *bfad, void *uarg, bfa_status_t status); void bfa_cb_lps_flogo_comp(void *bfad, void *uarg); void bfa_cb_lps_fdisc_comp(void *bfad, void *uarg, bfa_status_t status); void bfa_cb_lps_fdisclogo_comp(void *bfad, void *uarg); -void bfa_cb_lps_cvl_event(void *bfad, void *uarg); #endif /* __BFA_SVC_H__ */ diff --git a/trunk/drivers/scsi/bfa/include/bfa_timer.h b/trunk/drivers/scsi/bfa/include/bfa_timer.h index f71087448222..e407103fa565 100644 --- a/trunk/drivers/scsi/bfa/include/bfa_timer.h +++ b/trunk/drivers/scsi/bfa/include/bfa_timer.h @@ -41,7 +41,7 @@ struct bfa_timer_mod_s { struct list_head timer_q; }; -#define BFA_TIMER_FREQ 200 /**< specified in millisecs */ +#define BFA_TIMER_FREQ 500 /**< specified in millisecs */ void bfa_timer_beat(struct bfa_timer_mod_s *mod); void bfa_timer_init(struct bfa_timer_mod_s *mod); diff --git a/trunk/drivers/scsi/bfa/include/bfi/bfi.h b/trunk/drivers/scsi/bfa/include/bfi/bfi.h index a550e80cabd2..7042c18e542d 100644 --- a/trunk/drivers/scsi/bfa/include/bfi/bfi.h +++ b/trunk/drivers/scsi/bfa/include/bfi/bfi.h @@ -143,8 +143,8 @@ enum bfi_mclass { BFI_MC_IOC = 1, /* IO Controller (IOC) */ BFI_MC_DIAG = 2, /* Diagnostic Msgs */ BFI_MC_FLASH = 3, /* Flash message class */ - BFI_MC_CEE = 4, /* CEE */ - BFI_MC_FCPORT = 5, /* FC port */ + BFI_MC_CEE = 4, + BFI_MC_FC_PORT = 5, /* FC port */ BFI_MC_IOCFC = 6, /* FC - IO Controller (IOC) */ BFI_MC_LL = 7, /* Link Layer */ BFI_MC_UF = 8, /* Unsolicited frame receive */ diff --git a/trunk/drivers/scsi/bfa/include/bfi/bfi_cbreg.h b/trunk/drivers/scsi/bfa/include/bfi/bfi_cbreg.h index a51ee61ddb19..b3bb52b565b1 100644 --- a/trunk/drivers/scsi/bfa/include/bfi/bfi_cbreg.h +++ b/trunk/drivers/scsi/bfa/include/bfi/bfi_cbreg.h @@ -177,21 +177,7 @@ #define __PSS_LMEM_INIT_EN 0x00000100 #define __PSS_LPU1_RESET 0x00000002 #define __PSS_LPU0_RESET 0x00000001 -#define PSS_ERR_STATUS_REG 0x00018810 -#define __PSS_LMEM1_CORR_ERR 0x00000800 -#define __PSS_LMEM0_CORR_ERR 0x00000400 -#define __PSS_LMEM1_UNCORR_ERR 0x00000200 -#define __PSS_LMEM0_UNCORR_ERR 0x00000100 -#define __PSS_BAL_PERR 0x00000080 -#define __PSS_DIP_IF_ERR 0x00000040 -#define __PSS_IOH_IF_ERR 0x00000020 -#define __PSS_TDS_IF_ERR 0x00000010 -#define __PSS_RDS_IF_ERR 0x00000008 -#define __PSS_SGM_IF_ERR 0x00000004 -#define __PSS_LPU1_RAM_ERR 0x00000002 -#define __PSS_LPU0_RAM_ERR 0x00000001 -#define ERR_SET_REG 0x00018818 -#define __PSS_ERR_STATUS_SET 0x00000fff + /* * These definitions are either in error/missing in spec. Its auto-generated diff --git a/trunk/drivers/scsi/bfa/include/bfi/bfi_ctreg.h b/trunk/drivers/scsi/bfa/include/bfi/bfi_ctreg.h index 57a8497105af..d3caa58c0a0a 100644 --- a/trunk/drivers/scsi/bfa/include/bfi/bfi_ctreg.h +++ b/trunk/drivers/scsi/bfa/include/bfi/bfi_ctreg.h @@ -430,31 +430,6 @@ enum { #define __PSS_LMEM_INIT_EN 0x00000100 #define __PSS_LPU1_RESET 0x00000002 #define __PSS_LPU0_RESET 0x00000001 -#define PSS_ERR_STATUS_REG 0x00018810 -#define __PSS_LPU1_TCM_READ_ERR 0x00200000 -#define __PSS_LPU0_TCM_READ_ERR 0x00100000 -#define __PSS_LMEM5_CORR_ERR 0x00080000 -#define __PSS_LMEM4_CORR_ERR 0x00040000 -#define __PSS_LMEM3_CORR_ERR 0x00020000 -#define __PSS_LMEM2_CORR_ERR 0x00010000 -#define __PSS_LMEM1_CORR_ERR 0x00008000 -#define __PSS_LMEM0_CORR_ERR 0x00004000 -#define __PSS_LMEM5_UNCORR_ERR 0x00002000 -#define __PSS_LMEM4_UNCORR_ERR 0x00001000 -#define __PSS_LMEM3_UNCORR_ERR 0x00000800 -#define __PSS_LMEM2_UNCORR_ERR 0x00000400 -#define __PSS_LMEM1_UNCORR_ERR 0x00000200 -#define __PSS_LMEM0_UNCORR_ERR 0x00000100 -#define __PSS_BAL_PERR 0x00000080 -#define __PSS_DIP_IF_ERR 0x00000040 -#define __PSS_IOH_IF_ERR 0x00000020 -#define __PSS_TDS_IF_ERR 0x00000010 -#define __PSS_RDS_IF_ERR 0x00000008 -#define __PSS_SGM_IF_ERR 0x00000004 -#define __PSS_LPU1_RAM_ERR 0x00000002 -#define __PSS_LPU0_RAM_ERR 0x00000001 -#define ERR_SET_REG 0x00018818 -#define __PSS_ERR_STATUS_SET 0x003fffff #define HQM_QSET0_RXQ_DRBL_P0 0x00038000 #define __RXQ0_ADD_VECTORS_P 0x80000000 #define __RXQ0_STOP_P 0x40000000 @@ -614,7 +589,6 @@ enum { #define __HFN_INT_MBOX_LPU1 0x00200000U #define __HFN_INT_MBOX1_LPU0 0x00400000U #define __HFN_INT_MBOX1_LPU1 0x00800000U -#define __HFN_INT_LL_HALT 0x01000000U #define __HFN_INT_CPE_MASK 0x000000ffU #define __HFN_INT_RME_MASK 0x0000ff00U diff --git a/trunk/drivers/scsi/bfa/include/bfi/bfi_ioc.h b/trunk/drivers/scsi/bfa/include/bfi/bfi_ioc.h index a0158aac0024..96ef05670659 100644 --- a/trunk/drivers/scsi/bfa/include/bfi/bfi_ioc.h +++ b/trunk/drivers/scsi/bfa/include/bfi/bfi_ioc.h @@ -123,7 +123,7 @@ enum bfi_ioc_state { BFI_IOC_DISABLING = 5, /* IOC is being disabled */ BFI_IOC_DISABLED = 6, /* IOC is disabled */ BFI_IOC_CFG_DISABLED = 7, /* IOC is being disabled;transient */ - BFI_IOC_FAIL = 8, /* IOC heart-beat failure */ + BFI_IOC_HBFAIL = 8, /* IOC heart-beat failure */ BFI_IOC_MEMTEST = 9, /* IOC is doing memtest */ }; diff --git a/trunk/drivers/scsi/bfa/include/bfi/bfi_lps.h b/trunk/drivers/scsi/bfa/include/bfi/bfi_lps.h index 7ed31bbb8696..c59d47badb4b 100644 --- a/trunk/drivers/scsi/bfa/include/bfi/bfi_lps.h +++ b/trunk/drivers/scsi/bfa/include/bfi/bfi_lps.h @@ -30,7 +30,6 @@ enum bfi_lps_h2i_msgs { enum bfi_lps_i2h_msgs { BFI_LPS_H2I_LOGIN_RSP = BFA_I2HM(1), BFI_LPS_H2I_LOGOUT_RSP = BFA_I2HM(2), - BFI_LPS_H2I_CVL_EVENT = BFA_I2HM(3), }; struct bfi_lps_login_req_s { @@ -78,12 +77,6 @@ struct bfi_lps_logout_rsp_s { u8 rsvd[2]; }; -struct bfi_lps_cvl_event_s { - struct bfi_mhdr_s mh; /* common msg header */ - u8 lp_tag; - u8 rsvd[3]; -}; - union bfi_lps_h2i_msg_u { struct bfi_mhdr_s *msg; struct bfi_lps_login_req_s *login_req; @@ -94,7 +87,6 @@ union bfi_lps_i2h_msg_u { struct bfi_msg_s *msg; struct bfi_lps_login_rsp_s *login_rsp; struct bfi_lps_logout_rsp_s *logout_rsp; - struct bfi_lps_cvl_event_s *cvl_event; }; #pragma pack() diff --git a/trunk/drivers/scsi/bfa/include/bfi/bfi_pport.h b/trunk/drivers/scsi/bfa/include/bfi/bfi_pport.h index 50dcf45c7470..c96d246851af 100644 --- a/trunk/drivers/scsi/bfa/include/bfi/bfi_pport.h +++ b/trunk/drivers/scsi/bfa/include/bfi/bfi_pport.h @@ -22,97 +22,163 @@ #pragma pack(1) -enum bfi_fcport_h2i { - BFI_FCPORT_H2I_ENABLE_REQ = (1), - BFI_FCPORT_H2I_DISABLE_REQ = (2), - BFI_FCPORT_H2I_SET_SVC_PARAMS_REQ = (3), - BFI_FCPORT_H2I_STATS_GET_REQ = (4), - BFI_FCPORT_H2I_STATS_CLEAR_REQ = (5), +enum bfi_pport_h2i { + BFI_PPORT_H2I_ENABLE_REQ = (1), + BFI_PPORT_H2I_DISABLE_REQ = (2), + BFI_PPORT_H2I_GET_STATS_REQ = (3), + BFI_PPORT_H2I_CLEAR_STATS_REQ = (4), + BFI_PPORT_H2I_SET_SVC_PARAMS_REQ = (5), + BFI_PPORT_H2I_ENABLE_RX_VF_TAG_REQ = (6), + BFI_PPORT_H2I_ENABLE_TX_VF_TAG_REQ = (7), + BFI_PPORT_H2I_GET_QOS_STATS_REQ = (8), + BFI_PPORT_H2I_CLEAR_QOS_STATS_REQ = (9), }; -enum bfi_fcport_i2h { - BFI_FCPORT_I2H_ENABLE_RSP = BFA_I2HM(1), - BFI_FCPORT_I2H_DISABLE_RSP = BFA_I2HM(2), - BFI_FCPORT_I2H_SET_SVC_PARAMS_RSP = BFA_I2HM(3), - BFI_FCPORT_I2H_STATS_GET_RSP = BFA_I2HM(4), - BFI_FCPORT_I2H_STATS_CLEAR_RSP = BFA_I2HM(5), - BFI_FCPORT_I2H_EVENT = BFA_I2HM(6), +enum bfi_pport_i2h { + BFI_PPORT_I2H_ENABLE_RSP = BFA_I2HM(1), + BFI_PPORT_I2H_DISABLE_RSP = BFA_I2HM(2), + BFI_PPORT_I2H_GET_STATS_RSP = BFA_I2HM(3), + BFI_PPORT_I2H_CLEAR_STATS_RSP = BFA_I2HM(4), + BFI_PPORT_I2H_SET_SVC_PARAMS_RSP = BFA_I2HM(5), + BFI_PPORT_I2H_ENABLE_RX_VF_TAG_RSP = BFA_I2HM(6), + BFI_PPORT_I2H_ENABLE_TX_VF_TAG_RSP = BFA_I2HM(7), + BFI_PPORT_I2H_EVENT = BFA_I2HM(8), + BFI_PPORT_I2H_GET_QOS_STATS_RSP = BFA_I2HM(9), + BFI_PPORT_I2H_CLEAR_QOS_STATS_RSP = BFA_I2HM(10), }; /** * Generic REQ type */ -struct bfi_fcport_req_s { +struct bfi_pport_generic_req_s { struct bfi_mhdr_s mh; /* msg header */ - u32 msgtag; /* msgtag for reply */ + u32 msgtag; /* msgtag for reply */ }; /** * Generic RSP type */ -struct bfi_fcport_rsp_s { +struct bfi_pport_generic_rsp_s { struct bfi_mhdr_s mh; /* common msg header */ - u8 status; /* port enable status */ - u8 rsvd[3]; - u32 msgtag; /* msgtag for reply */ + u8 status; /* port enable status */ + u8 rsvd[3]; + u32 msgtag; /* msgtag for reply */ }; /** - * BFI_FCPORT_H2I_ENABLE_REQ + * BFI_PPORT_H2I_ENABLE_REQ */ -struct bfi_fcport_enable_req_s { +struct bfi_pport_enable_req_s { struct bfi_mhdr_s mh; /* msg header */ - u32 rsvd1; - wwn_t nwwn; /* node wwn of physical port */ - wwn_t pwwn; /* port wwn of physical port */ - struct bfa_pport_cfg_s port_cfg; /* port configuration */ - union bfi_addr_u stats_dma_addr; /* DMA address for stats */ - u32 msgtag; /* msgtag for reply */ - u32 rsvd2; + u32 rsvd1; + wwn_t nwwn; /* node wwn of physical port */ + wwn_t pwwn; /* port wwn of physical port */ + struct bfa_pport_cfg_s port_cfg; /* port configuration */ + union bfi_addr_u stats_dma_addr; /* DMA address for stats */ + u32 msgtag; /* msgtag for reply */ + u32 rsvd2; }; /** - * BFI_FCPORT_H2I_SET_SVC_PARAMS_REQ + * BFI_PPORT_I2H_ENABLE_RSP */ -struct bfi_fcport_set_svc_params_req_s { +#define bfi_pport_enable_rsp_t struct bfi_pport_generic_rsp_s + +/** + * BFI_PPORT_H2I_DISABLE_REQ + */ +#define bfi_pport_disable_req_t struct bfi_pport_generic_req_s + +/** + * BFI_PPORT_I2H_DISABLE_RSP + */ +#define bfi_pport_disable_rsp_t struct bfi_pport_generic_rsp_s + +/** + * BFI_PPORT_H2I_GET_STATS_REQ + */ +#define bfi_pport_get_stats_req_t struct bfi_pport_generic_req_s + +/** + * BFI_PPORT_I2H_GET_STATS_RSP + */ +#define bfi_pport_get_stats_rsp_t struct bfi_pport_generic_rsp_s + +/** + * BFI_PPORT_H2I_CLEAR_STATS_REQ + */ +#define bfi_pport_clear_stats_req_t struct bfi_pport_generic_req_s + +/** + * BFI_PPORT_I2H_CLEAR_STATS_RSP + */ +#define bfi_pport_clear_stats_rsp_t struct bfi_pport_generic_rsp_s + +/** + * BFI_PPORT_H2I_GET_QOS_STATS_REQ + */ +#define bfi_pport_get_qos_stats_req_t struct bfi_pport_generic_req_s + +/** + * BFI_PPORT_H2I_GET_QOS_STATS_RSP + */ +#define bfi_pport_get_qos_stats_rsp_t struct bfi_pport_generic_rsp_s + +/** + * BFI_PPORT_H2I_CLEAR_QOS_STATS_REQ + */ +#define bfi_pport_clear_qos_stats_req_t struct bfi_pport_generic_req_s + +/** + * BFI_PPORT_H2I_CLEAR_QOS_STATS_RSP + */ +#define bfi_pport_clear_qos_stats_rsp_t struct bfi_pport_generic_rsp_s + +/** + * BFI_PPORT_H2I_SET_SVC_PARAMS_REQ + */ +struct bfi_pport_set_svc_params_req_s { struct bfi_mhdr_s mh; /* msg header */ - u16 tx_bbcredit; /* Tx credits */ - u16 rsvd; + u16 tx_bbcredit; /* Tx credits */ + u16 rsvd; }; /** - * BFI_FCPORT_I2H_EVENT + * BFI_PPORT_I2H_SET_SVC_PARAMS_RSP + */ + +/** + * BFI_PPORT_I2H_EVENT */ -struct bfi_fcport_event_s { +struct bfi_pport_event_s { struct bfi_mhdr_s mh; /* common msg header */ struct bfa_pport_link_s link_state; }; -/** - * fcport H2I message - */ -union bfi_fcport_h2i_msg_u { +union bfi_pport_h2i_msg_u { struct bfi_mhdr_s *mhdr; - struct bfi_fcport_enable_req_s *penable; - struct bfi_fcport_req_s *pdisable; - struct bfi_fcport_set_svc_params_req_s *psetsvcparams; - struct bfi_fcport_req_s *pstatsget; - struct bfi_fcport_req_s *pstatsclear; + struct bfi_pport_enable_req_s *penable; + struct bfi_pport_generic_req_s *pdisable; + struct bfi_pport_generic_req_s *pgetstats; + struct bfi_pport_generic_req_s *pclearstats; + struct bfi_pport_set_svc_params_req_s *psetsvcparams; + struct bfi_pport_get_qos_stats_req_s *pgetqosstats; + struct bfi_pport_generic_req_s *pclearqosstats; }; -/** - * fcport I2H message - */ -union bfi_fcport_i2h_msg_u { +union bfi_pport_i2h_msg_u { struct bfi_msg_s *msg; - struct bfi_fcport_rsp_s *penable_rsp; - struct bfi_fcport_rsp_s *pdisable_rsp; - struct bfi_fcport_rsp_s *psetsvcparams_rsp; - struct bfi_fcport_rsp_s *pstatsget_rsp; - struct bfi_fcport_rsp_s *pstatsclear_rsp; - struct bfi_fcport_event_s *event; + struct bfi_pport_generic_rsp_s *enable_rsp; + struct bfi_pport_disable_rsp_s *disable_rsp; + struct bfi_pport_generic_rsp_s *getstats_rsp; + struct bfi_pport_clear_stats_rsp_s *clearstats_rsp; + struct bfi_pport_set_svc_params_rsp_s *setsvcparasm_rsp; + struct bfi_pport_get_qos_stats_rsp_s *getqosstats_rsp; + struct bfi_pport_clear_qos_stats_rsp_s *clearqosstats_rsp; + struct bfi_pport_event_s *event; }; #pragma pack() #endif /* __BFI_PPORT_H__ */ + diff --git a/trunk/drivers/scsi/bfa/include/cna/bfa_cna_trcmod.h b/trunk/drivers/scsi/bfa/include/cna/bfa_cna_trcmod.h index a75a1f3be315..43ba7064e81a 100644 --- a/trunk/drivers/scsi/bfa/include/cna/bfa_cna_trcmod.h +++ b/trunk/drivers/scsi/bfa/include/cna/bfa_cna_trcmod.h @@ -31,10 +31,6 @@ enum { BFA_TRC_CNA_CEE = 1, BFA_TRC_CNA_PORT = 2, - BFA_TRC_CNA_IOC = 3, - BFA_TRC_CNA_DIAG = 4, - BFA_TRC_CNA_IOC_CB = 5, - BFA_TRC_CNA_IOC_CT = 6, }; #endif /* __BFA_CNA_TRCMOD_H__ */ diff --git a/trunk/drivers/scsi/bfa/include/cs/bfa_log.h b/trunk/drivers/scsi/bfa/include/cs/bfa_log.h index bc334e0a93fa..761cbe22130a 100644 --- a/trunk/drivers/scsi/bfa/include/cs/bfa_log.h +++ b/trunk/drivers/scsi/bfa/include/cs/bfa_log.h @@ -157,7 +157,7 @@ typedef void (*bfa_log_cb_t)(struct bfa_log_mod_s *log_mod, u32 msg_id, struct bfa_log_mod_s { - char instance_info[BFA_STRING_32]; /* instance info */ + char instance_info[16]; /* instance info */ int log_level[BFA_LOG_MODULE_ID_MAX + 1]; /* log level for modules */ bfa_log_cb_t cbfn; /* callback function */ diff --git a/trunk/drivers/scsi/bfa/include/cs/bfa_plog.h b/trunk/drivers/scsi/bfa/include/cs/bfa_plog.h index f5bef63b5877..670f86e5fc6e 100644 --- a/trunk/drivers/scsi/bfa/include/cs/bfa_plog.h +++ b/trunk/drivers/scsi/bfa/include/cs/bfa_plog.h @@ -80,8 +80,7 @@ enum bfa_plog_mid { BFA_PL_MID_HAL_FCXP = 4, BFA_PL_MID_HAL_UF = 5, BFA_PL_MID_FCS = 6, - BFA_PL_MID_LPS = 7, - BFA_PL_MID_MAX = 8 + BFA_PL_MID_MAX = 7 }; #define BFA_PL_MID_STRLEN 8 @@ -119,11 +118,7 @@ enum bfa_plog_eid { BFA_PL_EID_RSCN = 17, BFA_PL_EID_DEBUG = 18, BFA_PL_EID_MISC = 19, - BFA_PL_EID_FIP_FCF_DISC = 20, - BFA_PL_EID_FIP_FCF_CVL = 21, - BFA_PL_EID_LOGIN = 22, - BFA_PL_EID_LOGO = 23, - BFA_PL_EID_MAX = 24 + BFA_PL_EID_MAX = 20 }; #define BFA_PL_ENAME_STRLEN 8 diff --git a/trunk/drivers/scsi/bfa/include/cs/bfa_sm.h b/trunk/drivers/scsi/bfa/include/cs/bfa_sm.h index 11fba9082f05..b0a92baf6657 100644 --- a/trunk/drivers/scsi/bfa/include/cs/bfa_sm.h +++ b/trunk/drivers/scsi/bfa/include/cs/bfa_sm.h @@ -23,14 +23,6 @@ #define __BFA_SM_H__ typedef void (*bfa_sm_t)(void *sm, int event); -/** - * oc - object class eg. bfa_ioc - * st - state, eg. reset - * otype - object type, eg. struct bfa_ioc_s - * etype - object type, eg. enum ioc_event - */ -#define bfa_sm_state_decl(oc, st, otype, etype) \ - static void oc ## _sm_ ## st(otype * fsm, etype event) #define bfa_sm_set_state(_sm, _state) ((_sm)->sm = (bfa_sm_t)(_state)) #define bfa_sm_send_event(_sm, _event) ((_sm)->sm((_sm), (_event))) diff --git a/trunk/drivers/scsi/bfa/include/defs/bfa_defs_aen.h b/trunk/drivers/scsi/bfa/include/defs/bfa_defs_aen.h index 35244698fcdc..4c81a613db3d 100644 --- a/trunk/drivers/scsi/bfa/include/defs/bfa_defs_aen.h +++ b/trunk/drivers/scsi/bfa/include/defs/bfa_defs_aen.h @@ -30,16 +30,6 @@ #include #include -#define BFA_AEN_MAX_APP 5 - -enum bfa_aen_app { - bfa_aen_app_bcu = 0, /* No thread for bcu */ - bfa_aen_app_hcm = 1, - bfa_aen_app_cim = 2, - bfa_aen_app_snia = 3, - bfa_aen_app_test = 4, /* To be removed after unit test */ -}; - enum bfa_aen_category { BFA_AEN_CAT_ADAPTER = 1, BFA_AEN_CAT_PORT = 2, diff --git a/trunk/drivers/scsi/bfa/include/defs/bfa_defs_auth.h b/trunk/drivers/scsi/bfa/include/defs/bfa_defs_auth.h index 45df32820911..dd19c83aba58 100644 --- a/trunk/drivers/scsi/bfa/include/defs/bfa_defs_auth.h +++ b/trunk/drivers/scsi/bfa/include/defs/bfa_defs_auth.h @@ -23,7 +23,6 @@ #define PRIVATE_KEY 19009 #define KEY_LEN 32399 #define BFA_AUTH_SECRET_STRING_LEN 256 -#define BFA_AUTH_FAIL_NO_PASSWORD 0xFE #define BFA_AUTH_FAIL_TIMEOUT 0xFF /** @@ -42,27 +41,6 @@ enum bfa_auth_status { BFA_AUTH_STATUS_UNKNOWN = 9, /* authentication status unknown */ }; -enum bfa_auth_rej_code { - BFA_AUTH_RJT_CODE_AUTH_FAILURE = 1, /* auth failure */ - BFA_AUTH_RJT_CODE_LOGICAL_ERR = 2, /* logical error */ -}; - -/** - * Authentication reject codes - */ -enum bfa_auth_rej_code_exp { - BFA_AUTH_MECH_NOT_USABLE = 1, /* auth. mechanism not usable */ - BFA_AUTH_DH_GROUP_NOT_USABLE = 2, /* DH Group not usable */ - BFA_AUTH_HASH_FUNC_NOT_USABLE = 3, /* hash Function not usable */ - BFA_AUTH_AUTH_XACT_STARTED = 4, /* auth xact started */ - BFA_AUTH_AUTH_FAILED = 5, /* auth failed */ - BFA_AUTH_INCORRECT_PLD = 6, /* incorrect payload */ - BFA_AUTH_INCORRECT_PROTO_MSG = 7, /* incorrect proto msg */ - BFA_AUTH_RESTART_AUTH_PROTO = 8, /* restart auth protocol */ - BFA_AUTH_AUTH_CONCAT_NOT_SUPP = 9, /* auth concat not supported */ - BFA_AUTH_PROTO_VER_NOT_SUPP = 10,/* proto version not supported */ -}; - struct auth_proto_stats_s { u32 auth_rjts; u32 auth_negs; diff --git a/trunk/drivers/scsi/bfa/include/defs/bfa_defs_cee.h b/trunk/drivers/scsi/bfa/include/defs/bfa_defs_cee.h index b0ac9ac15c5d..520a22f52dd1 100644 --- a/trunk/drivers/scsi/bfa/include/defs/bfa_defs_cee.h +++ b/trunk/drivers/scsi/bfa/include/defs/bfa_defs_cee.h @@ -28,6 +28,10 @@ #define BFA_CEE_LLDP_MAX_STRING_LEN (128) + +/* FIXME: this is coming from the protocol spec. Can the host & apps share the + protocol .h files ? + */ #define BFA_CEE_LLDP_SYS_CAP_OTHER 0x0001 #define BFA_CEE_LLDP_SYS_CAP_REPEATER 0x0002 #define BFA_CEE_LLDP_SYS_CAP_MAC_BRIDGE 0x0004 @@ -90,10 +94,9 @@ struct bfa_cee_dcbx_cfg_s { /* CEE status */ /* Making this to tri-state for the benefit of port list command */ enum bfa_cee_status_e { - CEE_UP = 0, - CEE_PHY_UP = 1, - CEE_LOOPBACK = 2, - CEE_PHY_DOWN = 3, + CEE_PHY_DOWN = 0, + CEE_PHY_UP = 1, + CEE_UP = 2, }; /* CEE Query */ @@ -104,8 +107,7 @@ struct bfa_cee_attr_s { struct bfa_cee_dcbx_cfg_s dcbx_remote; mac_t src_mac; u8 link_speed; - u8 nw_priority; - u8 filler[2]; + u8 filler[3]; }; diff --git a/trunk/drivers/scsi/bfa/include/defs/bfa_defs_driver.h b/trunk/drivers/scsi/bfa/include/defs/bfa_defs_driver.h index 50382dd2ab41..57049805762b 100644 --- a/trunk/drivers/scsi/bfa/include/defs/bfa_defs_driver.h +++ b/trunk/drivers/scsi/bfa/include/defs/bfa_defs_driver.h @@ -21,7 +21,6 @@ /** * Driver statistics */ -struct bfa_driver_stats_s { u16 tm_io_abort; u16 tm_io_abort_comp; u16 tm_lun_reset; @@ -35,7 +34,7 @@ struct bfa_driver_stats_s { u64 output_req; u64 input_words; u64 output_words; -}; +} bfa_driver_stats_t; #endif /* __BFA_DEFS_DRIVER_H__ */ diff --git a/trunk/drivers/scsi/bfa/include/defs/bfa_defs_ethport.h b/trunk/drivers/scsi/bfa/include/defs/bfa_defs_ethport.h index b4fa0923aa89..79f9b3e146f7 100644 --- a/trunk/drivers/scsi/bfa/include/defs/bfa_defs_ethport.h +++ b/trunk/drivers/scsi/bfa/include/defs/bfa_defs_ethport.h @@ -19,7 +19,6 @@ #define __BFA_DEFS_ETHPORT_H__ #include -#include #include #include #include diff --git a/trunk/drivers/scsi/bfa/include/defs/bfa_defs_fcport.h b/trunk/drivers/scsi/bfa/include/defs/bfa_defs_fcport.h deleted file mode 100644 index a07ef4a3cd78..000000000000 --- a/trunk/drivers/scsi/bfa/include/defs/bfa_defs_fcport.h +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright (c) 2005-2009 Brocade Communications Systems, Inc. - * All rights reserved - * www.brocade.com - * - * bfa_defs_fcport.h - * - * Linux driver for Brocade Fibre Channel Host Bus Adapter. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License (GPL) Version 2 as - * published by the Free Software Foundation - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - */ -#ifndef __BFA_DEFS_FCPORT_H__ -#define __BFA_DEFS_FCPORT_H__ - -#include -#include - -#pragma pack(1) - -/** - * FCoE statistics - */ -struct bfa_fcoe_stats_s { - u64 secs_reset; /* Seconds since stats reset */ - u64 cee_linkups; /* CEE link up */ - u64 cee_linkdns; /* CEE link down */ - u64 fip_linkups; /* FIP link up */ - u64 fip_linkdns; /* FIP link down */ - u64 fip_fails; /* FIP failures */ - u64 mac_invalids; /* Invalid mac assignments */ - u64 vlan_req; /* Vlan requests */ - u64 vlan_notify; /* Vlan notifications */ - u64 vlan_err; /* Vlan notification errors */ - u64 vlan_timeouts; /* Vlan request timeouts */ - u64 vlan_invalids; /* Vlan invalids */ - u64 disc_req; /* Discovery requests */ - u64 disc_rsp; /* Discovery responses */ - u64 disc_err; /* Discovery error frames */ - u64 disc_unsol; /* Discovery unsolicited */ - u64 disc_timeouts; /* Discovery timeouts */ - u64 disc_fcf_unavail; /* Discovery FCF not avail */ - u64 linksvc_unsupp; /* FIP link service req unsupp. */ - u64 linksvc_err; /* FIP link service req errors */ - u64 logo_req; /* FIP logo */ - u64 clrvlink_req; /* Clear virtual link requests */ - u64 op_unsupp; /* FIP operation unsupp. */ - u64 untagged; /* FIP untagged frames */ - u64 txf_ucast; /* Tx FCoE unicast frames */ - u64 txf_ucast_vlan; /* Tx FCoE unicast vlan frames */ - u64 txf_ucast_octets; /* Tx FCoE unicast octets */ - u64 txf_mcast; /* Tx FCoE mutlicast frames */ - u64 txf_mcast_vlan; /* Tx FCoE mutlicast vlan frames */ - u64 txf_mcast_octets; /* Tx FCoE multicast octets */ - u64 txf_bcast; /* Tx FCoE broadcast frames */ - u64 txf_bcast_vlan; /* Tx FCoE broadcast vlan frames */ - u64 txf_bcast_octets; /* Tx FCoE broadcast octets */ - u64 txf_timeout; /* Tx timeouts */ - u64 txf_parity_errors; /* Transmit parity err */ - u64 txf_fid_parity_errors; /* Transmit FID parity err */ - u64 tx_pause; /* Tx pause frames */ - u64 tx_zero_pause; /* Tx zero pause frames */ - u64 tx_first_pause; /* Tx first pause frames */ - u64 rx_pause; /* Rx pause frames */ - u64 rx_zero_pause; /* Rx zero pause frames */ - u64 rx_first_pause; /* Rx first pause frames */ - u64 rxf_ucast_octets; /* Rx unicast octets */ - u64 rxf_ucast; /* Rx unicast frames */ - u64 rxf_ucast_vlan; /* Rx unicast vlan frames */ - u64 rxf_mcast_octets; /* Rx multicast octets */ - u64 rxf_mcast; /* Rx multicast frames */ - u64 rxf_mcast_vlan; /* Rx multicast vlan frames */ - u64 rxf_bcast_octets; /* Rx broadcast octests */ - u64 rxf_bcast; /* Rx broadcast frames */ - u64 rxf_bcast_vlan; /* Rx broadcast vlan frames */ -}; - -/** - * QoS or FCoE stats (fcport stats excluding physical FC port stats) - */ -union bfa_fcport_stats_u { - struct bfa_qos_stats_s fcqos; - struct bfa_fcoe_stats_s fcoe; -}; - -#pragma pack() - -#endif /* __BFA_DEFS_FCPORT_H__ */ diff --git a/trunk/drivers/scsi/bfa/include/defs/bfa_defs_im_common.h b/trunk/drivers/scsi/bfa/include/defs/bfa_defs_im_common.h new file mode 100644 index 000000000000..9ccf53bef65a --- /dev/null +++ b/trunk/drivers/scsi/bfa/include/defs/bfa_defs_im_common.h @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2005-2009 Brocade Communications Systems, Inc. + * All rights reserved + * www.brocade.com + * + * Linux driver for Brocade Fibre Channel Host Bus Adapter. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License (GPL) Version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + */ + +#ifndef __BFA_DEFS_IM_COMMON_H__ +#define __BFA_DEFS_IM_COMMON_H__ + +#define BFA_ADAPTER_NAME_LEN 256 +#define BFA_ADAPTER_GUID_LEN 256 +#define RESERVED_VLAN_NAME L"PORT VLAN" +#define PASSTHRU_VLAN_NAME L"PASSTHRU VLAN" + + u64 tx_pkt_cnt; + u64 rx_pkt_cnt; + u32 duration; + u8 status; +} bfa_im_stats_t, *pbfa_im_stats_t; + +#endif /* __BFA_DEFS_IM_COMMON_H__ */ diff --git a/trunk/drivers/scsi/bfa/include/defs/bfa_defs_im_team.h b/trunk/drivers/scsi/bfa/include/defs/bfa_defs_im_team.h new file mode 100644 index 000000000000..a486a7eb81d6 --- /dev/null +++ b/trunk/drivers/scsi/bfa/include/defs/bfa_defs_im_team.h @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2005-2009 Brocade Communications Systems, Inc. + * All rights reserved + * www.brocade.com + * + * Linux driver for Brocade Fibre Channel Host Bus Adapter. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License (GPL) Version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + */ + +#ifndef __BFA_DEFS_IM_TEAM_H__ +#define __BFA_DEFS_IM_TEAM_H__ + +#include + +#define BFA_TEAM_MAX_PORTS 8 +#define BFA_TEAM_NAME_LEN 256 +#define BFA_MAX_NUM_TEAMS 16 +#define BFA_TEAM_INVALID_DELAY -1 + + BFA_LACP_RATE_SLOW = 1, + BFA_LACP_RATE_FAST +} bfa_im_lacp_rate_t; + + BFA_TEAM_MODE_FAIL_OVER = 1, + BFA_TEAM_MODE_FAIL_BACK, + BFA_TEAM_MODE_LACP, + BFA_TEAM_MODE_NONE +} bfa_im_team_mode_t; + + BFA_XMIT_POLICY_L2 = 1, + BFA_XMIT_POLICY_L3_L4 +} bfa_im_xmit_policy_t; + + bfa_im_team_mode_t team_mode; + bfa_im_lacp_rate_t lacp_rate; + bfa_im_xmit_policy_t xmit_policy; + int delay; + wchar_t primary[BFA_ADAPTER_NAME_LEN]; + wchar_t preferred_primary[BFA_ADAPTER_NAME_LEN]; + mac_t mac; + u16 num_ports; + u16 num_vlans; + u16 vlan_list[BFA_MAX_VLANS_PER_PORT]; + wchar_t team_guid_list[BFA_TEAM_MAX_PORTS][BFA_ADAPTER_GUID_LEN]; + wchar_t ioc_name_list[BFA_TEAM_MAX_PORTS][BFA_ADAPTER_NAME_LEN]; +} bfa_im_team_attr_t; + + wchar_t team_name[BFA_TEAM_NAME_LEN]; + bfa_im_xmit_policy_t xmit_policy; + int delay; + wchar_t primary[BFA_ADAPTER_NAME_LEN]; + wchar_t preferred_primary[BFA_ADAPTER_NAME_LEN]; +} bfa_im_team_edit_t, *pbfa_im_team_edit_t; + + wchar_t team_name[BFA_TEAM_NAME_LEN]; + bfa_im_team_mode_t team_mode; + mac_t mac; +} bfa_im_team_info_t; + + bfa_im_team_info_t team_info[BFA_MAX_NUM_TEAMS]; + u16 num_teams; +} bfa_im_team_list_t, *pbfa_im_team_list_t; + +#endif /* __BFA_DEFS_IM_TEAM_H__ */ diff --git a/trunk/drivers/scsi/bfa/include/defs/bfa_defs_ioc.h b/trunk/drivers/scsi/bfa/include/defs/bfa_defs_ioc.h index 8d8e6a966537..b1d532da3a9d 100644 --- a/trunk/drivers/scsi/bfa/include/defs/bfa_defs_ioc.h +++ b/trunk/drivers/scsi/bfa/include/defs/bfa_defs_ioc.h @@ -126,7 +126,6 @@ struct bfa_ioc_attr_s { struct bfa_ioc_driver_attr_s driver_attr; /* driver attr */ struct bfa_ioc_pci_attr_s pci_attr; u8 port_id; /* port number */ - u8 rsvd[7]; /*!< 64bit align */ }; /** @@ -144,8 +143,8 @@ enum bfa_ioc_aen_event { * BFA IOC level event data, now just a place holder */ struct bfa_ioc_aen_data_s { + enum bfa_ioc_type_e ioc_type; wwn_t pwwn; - s16 ioc_type; mac_t mac; }; diff --git a/trunk/drivers/scsi/bfa/include/defs/bfa_defs_iocfc.h b/trunk/drivers/scsi/bfa/include/defs/bfa_defs_iocfc.h index c290fb13d2d1..d76bcbd9820f 100644 --- a/trunk/drivers/scsi/bfa/include/defs/bfa_defs_iocfc.h +++ b/trunk/drivers/scsi/bfa/include/defs/bfa_defs_iocfc.h @@ -26,8 +26,6 @@ #define BFA_IOCFC_INTR_DELAY 1125 #define BFA_IOCFC_INTR_LATENCY 225 -#define BFA_IOCFCOE_INTR_DELAY 25 -#define BFA_IOCFCOE_INTR_LATENCY 5 /** * Interrupt coalescing configuration. @@ -52,7 +50,7 @@ struct bfa_iocfc_fwcfg_s { u16 num_fcxp_reqs; /* unassisted FC exchanges */ u16 num_uf_bufs; /* unsolicited recv buffers */ u8 num_cqs; - u8 rsvd[5]; + u8 rsvd; }; struct bfa_iocfc_drvcfg_s { @@ -226,24 +224,18 @@ struct bfa_fw_port_physm_stats_s { struct bfa_fw_fip_stats_s { - u32 vlan_req; /* vlan discovery requests */ - u32 vlan_notify; /* vlan notifications */ - u32 vlan_err; /* vlan response error */ - u32 vlan_timeouts; /* vlan disvoery timeouts */ - u32 vlan_invalids; /* invalid vlan in discovery advert. */ u32 disc_req; /* Discovery solicit requests */ u32 disc_rsp; /* Discovery solicit response */ u32 disc_err; /* Discovery advt. parse errors */ u32 disc_unsol; /* Discovery unsolicited */ u32 disc_timeouts; /* Discovery timeouts */ - u32 disc_fcf_unavail; /* Discovery FCF Not Avail. */ u32 linksvc_unsupp; /* Unsupported link service req */ u32 linksvc_err; /* Parse error in link service req */ u32 logo_req; /* Number of FIP logos received */ u32 clrvlink_req; /* Clear virtual link req */ u32 op_unsupp; /* Unsupported FIP operation */ u32 untagged; /* Untagged frames (ignored) */ - u32 invalid_version; /*!< Invalid FIP version */ + u32 rsvd; }; diff --git a/trunk/drivers/scsi/bfa/include/defs/bfa_defs_lport.h b/trunk/drivers/scsi/bfa/include/defs/bfa_defs_lport.h index 0952a139c47c..7359f82aacfc 100644 --- a/trunk/drivers/scsi/bfa/include/defs/bfa_defs_lport.h +++ b/trunk/drivers/scsi/bfa/include/defs/bfa_defs_lport.h @@ -59,8 +59,8 @@ enum bfa_lport_aen_event { */ struct bfa_lport_aen_data_s { u16 vf_id; /* vf_id of this logical port */ - s16 roles; /* Logical port mode,IM/TM/IP etc */ - u32 rsvd; + u16 rsvd; + enum bfa_port_role roles; /* Logical port mode,IM/TM/IP etc */ wwn_t ppwwn; /* WWN of its physical port */ wwn_t lpwwn; /* WWN of this logical port */ }; diff --git a/trunk/drivers/scsi/bfa/include/defs/bfa_defs_mfg.h b/trunk/drivers/scsi/bfa/include/defs/bfa_defs_mfg.h index c5bd9c36ad4d..13fd4ab6aae2 100644 --- a/trunk/drivers/scsi/bfa/include/defs/bfa_defs_mfg.h +++ b/trunk/drivers/scsi/bfa/include/defs/bfa_defs_mfg.h @@ -22,47 +22,7 @@ /** * Manufacturing block version */ -#define BFA_MFG_VERSION 2 - -/** - * Manufacturing block encrypted version - */ -#define BFA_MFG_ENC_VER 2 - -/** - * Manufacturing block version 1 length - */ -#define BFA_MFG_VER1_LEN 128 - -/** - * Manufacturing block header length - */ -#define BFA_MFG_HDR_LEN 4 - -/** - * Checksum size - */ -#define BFA_MFG_CHKSUM_SIZE 16 - -/** - * Manufacturing block encrypted version - */ -#define BFA_MFG_ENC_VER 2 - -/** - * Manufacturing block version 1 length - */ -#define BFA_MFG_VER1_LEN 128 - -/** - * Manufacturing block header length - */ -#define BFA_MFG_HDR_LEN 4 - -/** - * Checksum size - */ -#define BFA_MFG_CHKSUM_SIZE 16 +#define BFA_MFG_VERSION 1 /** * Manufacturing block format @@ -70,74 +30,29 @@ #define BFA_MFG_SERIALNUM_SIZE 11 #define BFA_MFG_PARTNUM_SIZE 14 #define BFA_MFG_SUPPLIER_ID_SIZE 10 -#define BFA_MFG_SUPPLIER_PARTNUM_SIZE 20 -#define BFA_MFG_SUPPLIER_SERIALNUM_SIZE 20 -#define BFA_MFG_SUPPLIER_REVISION_SIZE 4 +#define BFA_MFG_SUPPLIER_PARTNUM_SIZE 20 +#define BFA_MFG_SUPPLIER_SERIALNUM_SIZE 20 +#define BFA_MFG_SUPPLIER_REVISION_SIZE 4 #define STRSZ(_n) (((_n) + 4) & ~3) -/** - * Manufacturing card type - */ -enum { - BFA_MFG_TYPE_CB_MAX = 825, /* Crossbow card type max */ - BFA_MFG_TYPE_FC8P2 = 825, /* 8G 2port FC card */ - BFA_MFG_TYPE_FC8P1 = 815, /* 8G 1port FC card */ - BFA_MFG_TYPE_FC4P2 = 425, /* 4G 2port FC card */ - BFA_MFG_TYPE_FC4P1 = 415, /* 4G 1port FC card */ - BFA_MFG_TYPE_CNA10P2 = 1020, /* 10G 2port CNA card */ - BFA_MFG_TYPE_CNA10P1 = 1010, /* 10G 1port CNA card */ -}; - -#pragma pack(1) - -/** - * Card type to port number conversion - */ -#define bfa_mfg_type2port_num(card_type) (((card_type) / 10) % 10) - - -/** - * All numerical fields are in big-endian format. - */ -struct bfa_mfg_block_s { -}; - /** * VPD data length */ -#define BFA_MFG_VPD_LEN 512 - -#define BFA_MFG_VPD_PCI_HDR_OFF 137 -#define BFA_MFG_VPD_PCI_VER_MASK 0x07 /* version mask 3 bits */ -#define BFA_MFG_VPD_PCI_VDR_MASK 0xf8 /* vendor mask 5 bits */ - -/** - * VPD vendor tag - */ -enum { - BFA_MFG_VPD_UNKNOWN = 0, /* vendor unknown */ - BFA_MFG_VPD_IBM = 1, /* vendor IBM */ - BFA_MFG_VPD_HP = 2, /* vendor HP */ - BFA_MFG_VPD_DELL = 3, /* vendor DELL */ - BFA_MFG_VPD_PCI_IBM = 0x08, /* PCI VPD IBM */ - BFA_MFG_VPD_PCI_HP = 0x10, /* PCI VPD HP */ - BFA_MFG_VPD_PCI_DELL = 0x20, /* PCI VPD DELL */ - BFA_MFG_VPD_PCI_BRCD = 0xf8, /* PCI VPD Brocade */ -}; +#define BFA_MFG_VPD_LEN 256 /** * All numerical fields are in big-endian format. */ struct bfa_mfg_vpd_s { - u8 version; /* vpd data version */ - u8 vpd_sig[3]; /* characters 'V', 'P', 'D' */ - u8 chksum; /* u8 checksum */ - u8 vendor; /* vendor */ - u8 len; /* vpd data length excluding header */ - u8 rsv; - u8 data[BFA_MFG_VPD_LEN]; /* vpd data */ + u8 version; /* vpd data version */ + u8 vpd_sig[3]; /* characters 'V', 'P', 'D' */ + u8 chksum; /* u8 checksum */ + u8 vendor; /* vendor */ + u8 len; /* vpd data length excluding header */ + u8 rsv; + u8 data[BFA_MFG_VPD_LEN]; /* vpd data */ }; -#pragma pack() +#pragma pack(1) #endif /* __BFA_DEFS_MFG_H__ */ diff --git a/trunk/drivers/scsi/bfa/include/defs/bfa_defs_port.h b/trunk/drivers/scsi/bfa/include/defs/bfa_defs_port.h index 501bc9739d9d..de0696c81bc4 100644 --- a/trunk/drivers/scsi/bfa/include/defs/bfa_defs_port.h +++ b/trunk/drivers/scsi/bfa/include/defs/bfa_defs_port.h @@ -185,8 +185,6 @@ struct bfa_port_attr_s { wwn_t fabric_name; /* attached switch's nwwn */ u8 fabric_ip_addr[BFA_FCS_FABRIC_IPADDR_SZ]; /* attached * fabric's ip addr */ - struct mac_s fpma_mac; /* Lport's FPMA Mac address */ - u16 authfail; /* auth failed state */ }; /** @@ -234,15 +232,14 @@ enum bfa_port_aen_sfp_pom { }; struct bfa_port_aen_data_s { - wwn_t pwwn; /* WWN of the physical port */ - wwn_t fwwn; /* WWN of the fabric port */ - s32 phy_port_num; /*! For SFP related events */ - s16 ioc_type; - s16 level; /* Only transitions will - * be informed */ - struct mac_s mac; /* MAC address of the ethernet port, - * applicable to CNA port only */ - s16 rsvd; + enum bfa_ioc_type_e ioc_type; + wwn_t pwwn; /* WWN of the physical port */ + wwn_t fwwn; /* WWN of the fabric port */ + mac_t mac; /* MAC addres of the ethernet port, + * applicable to CNA port only */ + int phy_port_num; /*! For SFP related events */ + enum bfa_port_aen_sfp_pom level; /* Only transitions will + * be informed */ }; #endif /* __BFA_DEFS_PORT_H__ */ diff --git a/trunk/drivers/scsi/bfa/include/defs/bfa_defs_pport.h b/trunk/drivers/scsi/bfa/include/defs/bfa_defs_pport.h index 26e5cc78095d..bf320412ee24 100644 --- a/trunk/drivers/scsi/bfa/include/defs/bfa_defs_pport.h +++ b/trunk/drivers/scsi/bfa/include/defs/bfa_defs_pport.h @@ -232,7 +232,7 @@ struct bfa_pport_attr_s { u32 pid; /* port ID */ enum bfa_pport_type port_type; /* current topology */ u32 loopback; /* external loopback */ - u32 authfail; /* auth fail state */ + u32 rsvd1; u32 rsvd2; /* padding for 64 bit */ }; @@ -240,79 +240,73 @@ struct bfa_pport_attr_s { * FC Port statistics. */ struct bfa_pport_fc_stats_s { - u64 secs_reset; /* Seconds since stats is reset */ - u64 tx_frames; /* Tx frames */ - u64 tx_words; /* Tx words */ - u64 tx_lip; /* TX LIP */ - u64 tx_nos; /* Tx NOS */ - u64 tx_ols; /* Tx OLS */ - u64 tx_lr; /* Tx LR */ - u64 tx_lrr; /* Tx LRR */ - u64 rx_frames; /* Rx frames */ - u64 rx_words; /* Rx words */ - u64 lip_count; /* Rx LIP */ - u64 nos_count; /* Rx NOS */ - u64 ols_count; /* Rx OLS */ - u64 lr_count; /* Rx LR */ - u64 lrr_count; /* Rx LRR */ - u64 invalid_crcs; /* Rx CRC err frames */ - u64 invalid_crc_gd_eof; /* Rx CRC err good EOF frames */ - u64 undersized_frm; /* Rx undersized frames */ - u64 oversized_frm; /* Rx oversized frames */ - u64 bad_eof_frm; /* Rx frames with bad EOF */ - u64 error_frames; /* Errored frames */ - u64 dropped_frames; /* Dropped frames */ - u64 link_failures; /* Link Failure (LF) count */ - u64 loss_of_syncs; /* Loss of sync count */ - u64 loss_of_signals;/* Loss of signal count */ - u64 primseq_errs; /* Primitive sequence protocol err. */ - u64 bad_os_count; /* Invalid ordered sets */ - u64 err_enc_out; /* Encoding err nonframe_8b10b */ - u64 err_enc; /* Encoding err frame_8b10b */ + u64 secs_reset; /* seconds since stats is reset */ + u64 tx_frames; /* transmitted frames */ + u64 tx_words; /* transmitted words */ + u64 rx_frames; /* received frames */ + u64 rx_words; /* received words */ + u64 lip_count; /* LIPs seen */ + u64 nos_count; /* NOS count */ + u64 error_frames; /* errored frames (sent?) */ + u64 dropped_frames; /* dropped frames */ + u64 link_failures; /* link failure count */ + u64 loss_of_syncs; /* loss of sync count */ + u64 loss_of_signals;/* loss of signal count */ + u64 primseq_errs; /* primitive sequence protocol */ + u64 bad_os_count; /* invalid ordered set */ + u64 err_enc_out; /* Encoding error outside frame */ + u64 invalid_crcs; /* frames received with invalid CRC*/ + u64 undersized_frm; /* undersized frames */ + u64 oversized_frm; /* oversized frames */ + u64 bad_eof_frm; /* frames with bad EOF */ + struct bfa_qos_stats_s qos_stats; /* QoS statistics */ }; /** * Eth Port statistics. */ struct bfa_pport_eth_stats_s { - u64 secs_reset; /* Seconds since stats is reset */ - u64 frame_64; /* Frames 64 bytes */ - u64 frame_65_127; /* Frames 65-127 bytes */ - u64 frame_128_255; /* Frames 128-255 bytes */ - u64 frame_256_511; /* Frames 256-511 bytes */ - u64 frame_512_1023; /* Frames 512-1023 bytes */ - u64 frame_1024_1518; /* Frames 1024-1518 bytes */ - u64 frame_1519_1522; /* Frames 1519-1522 bytes */ - u64 tx_bytes; /* Tx bytes */ - u64 tx_packets; /* Tx packets */ - u64 tx_mcast_packets; /* Tx multicast packets */ - u64 tx_bcast_packets; /* Tx broadcast packets */ - u64 tx_control_frame; /* Tx control frame */ - u64 tx_drop; /* Tx drops */ - u64 tx_jabber; /* Tx jabber */ - u64 tx_fcs_error; /* Tx FCS error */ - u64 tx_fragments; /* Tx fragments */ - u64 rx_bytes; /* Rx bytes */ - u64 rx_packets; /* Rx packets */ - u64 rx_mcast_packets; /* Rx multicast packets */ - u64 rx_bcast_packets; /* Rx broadcast packets */ - u64 rx_control_frames; /* Rx control frames */ - u64 rx_unknown_opcode; /* Rx unknown opcode */ - u64 rx_drop; /* Rx drops */ - u64 rx_jabber; /* Rx jabber */ - u64 rx_fcs_error; /* Rx FCS errors */ - u64 rx_alignment_error; /* Rx alignment errors */ - u64 rx_frame_length_error; /* Rx frame len errors */ - u64 rx_code_error; /* Rx code errors */ - u64 rx_fragments; /* Rx fragments */ - u64 rx_pause; /* Rx pause */ - u64 rx_zero_pause; /* Rx zero pause */ - u64 tx_pause; /* Tx pause */ - u64 tx_zero_pause; /* Tx zero pause */ - u64 rx_fcoe_pause; /* Rx fcoe pause */ - u64 rx_fcoe_zero_pause; /* Rx FCoE zero pause */ - u64 tx_fcoe_pause; /* Tx FCoE pause */ - u64 tx_fcoe_zero_pause; /* Tx FCoE zero pause */ + u64 secs_reset; /* seconds since stats is reset */ + u64 frame_64; /* both rx and tx counter */ + u64 frame_65_127; /* both rx and tx counter */ + u64 frame_128_255; /* both rx and tx counter */ + u64 frame_256_511; /* both rx and tx counter */ + u64 frame_512_1023; /* both rx and tx counter */ + u64 frame_1024_1518; /* both rx and tx counter */ + u64 frame_1519_1522; /* both rx and tx counter */ + + u64 tx_bytes; + u64 tx_packets; + u64 tx_mcast_packets; + u64 tx_bcast_packets; + u64 tx_control_frame; + u64 tx_drop; + u64 tx_jabber; + u64 tx_fcs_error; + u64 tx_fragments; + + u64 rx_bytes; + u64 rx_packets; + u64 rx_mcast_packets; + u64 rx_bcast_packets; + u64 rx_control_frames; + u64 rx_unknown_opcode; + u64 rx_drop; + u64 rx_jabber; + u64 rx_fcs_error; + u64 rx_alignment_error; + u64 rx_frame_length_error; + u64 rx_code_error; + u64 rx_fragments; + + u64 rx_pause; /* BPC */ + u64 rx_zero_pause; /* BPC Pause cancellation */ + u64 tx_pause; /* BPC */ + u64 tx_zero_pause; /* BPC Pause cancellation */ + u64 rx_fcoe_pause; /* BPC */ + u64 rx_fcoe_zero_pause; /* BPC Pause cancellation */ + u64 tx_fcoe_pause; /* BPC */ + u64 tx_fcoe_zero_pause; /* BPC Pause cancellation */ }; /** @@ -339,7 +333,8 @@ struct bfa_pport_fcpmap_s { }; /** - * Port RNI */ + * Port RNID info. + */ struct bfa_pport_rnid_s { wwn_t wwn; u32 unittype; @@ -352,23 +347,6 @@ struct bfa_pport_rnid_s { u16 topologydiscoveryflags; }; -struct bfa_fcport_fcf_s { - wwn_t name; /* FCF name */ - wwn_t fabric_name; /* Fabric Name */ - u8 fipenabled; /* FIP enabled or not */ - u8 fipfailed; /* FIP failed or not */ - u8 resv[2]; - u8 pri; /* FCF priority */ - u8 version; /* FIP version used */ - u8 available; /* Available for login */ - u8 fka_disabled; /* FKA is disabled */ - u8 maxsz_verified; /* FCoE max size verified */ - u8 fc_map[3]; /* FC map */ - u16 vlan; /* FCoE vlan tag/priority */ - u32 fka_adv_per; /* FIP ka advert. period */ - struct mac_s mac; /* FCF mac */ -}; - /** * Link state information */ @@ -400,7 +378,6 @@ struct bfa_pport_link_s { struct fc_alpabm_s alpabm; /* alpa bitmap */ } loop_info; } tl; - struct bfa_fcport_fcf_s fcf; /*!< FCF information (for FCoE) */ }; #endif /* __BFA_DEFS_PPORT_H__ */ diff --git a/trunk/drivers/scsi/bfa/include/defs/bfa_defs_status.h b/trunk/drivers/scsi/bfa/include/defs/bfa_defs_status.h index 4374494bd566..cdceaeb9f4b8 100644 --- a/trunk/drivers/scsi/bfa/include/defs/bfa_defs_status.h +++ b/trunk/drivers/scsi/bfa/include/defs/bfa_defs_status.h @@ -180,8 +180,8 @@ enum bfa_status { BFA_STATUS_IM_ADAPT_ALREADY_IN_TEAM = 114, /* Given adapter is part * of another team */ BFA_STATUS_IM_ADAPT_HAS_VLANS = 115, /* Adapter has VLANs configured. - * Delete all VLANs to become - * part of the team */ + * Delete all VLANs before + * creating team */ BFA_STATUS_IM_PVID_MISMATCH = 116, /* Mismatching PVIDs configured * for adapters */ BFA_STATUS_IM_LINK_SPEED_MISMATCH = 117, /* Mismatching link speeds @@ -213,7 +213,7 @@ enum bfa_status { * loaded */ BFA_STATUS_CARD_TYPE_MISMATCH = 131, /* Card type mismatch */ BFA_STATUS_BAD_ASICBLK = 132, /* Bad ASIC block */ - BFA_STATUS_NO_DRIVER = 133, /* Brocade adapter/driver not installed or loaded */ + BFA_STATUS_NO_DRIVER = 133, /* Storage/Ethernet driver not loaded */ BFA_STATUS_INVALID_MAC = 134, /* Invalid mac address */ BFA_STATUS_IM_NO_VLAN = 135, /* No VLANs configured on the adapter */ BFA_STATUS_IM_ETH_LB_FAILED = 136, /* Ethernet loopback test failed */ @@ -228,7 +228,8 @@ enum bfa_status { BFA_STATUS_IM_GET_INETCFG_FAILED = 142, /* Acquiring Network Subsytem * handle Failed. Please try * after some time */ - BFA_STATUS_IM_NOT_BOUND = 143, /* IM driver is not active */ + BFA_STATUS_IM_NOT_BOUND = 143, /* Brocade 10G Ethernet Service is not + * Enabled on this port */ BFA_STATUS_INSUFFICIENT_PERMS = 144, /* User doesn't have sufficient * permissions to execute the BCU * application */ @@ -241,14 +242,6 @@ enum bfa_status { * failed */ BFA_STATUS_IM_UNBIND_FAILED = 149, /* ! < IM Driver unbind operation * failed */ - BFA_STATUS_IM_PORT_IN_TEAM = 150, /* Port is already part of the - * team */ - BFA_STATUS_IM_VLAN_NOT_FOUND = 151, /* VLAN ID doesn't exists */ - BFA_STATUS_IM_TEAM_NOT_FOUND = 152, /* Teaming configuration doesn't - * exists */ - BFA_STATUS_IM_TEAM_CFG_NOT_ALLOWED = 153, /* Given settings are not - * allowed for the current - * Teaming mode */ BFA_STATUS_MAX_VAL /* Unknown error code */ }; #define bfa_status_t enum bfa_status diff --git a/trunk/drivers/scsi/bfa/include/fcb/bfa_fcb_fcpim.h b/trunk/drivers/scsi/bfa/include/fcb/bfa_fcb_fcpim.h index 52585d3dd891..a6c70aee0aa3 100644 --- a/trunk/drivers/scsi/bfa/include/fcb/bfa_fcb_fcpim.h +++ b/trunk/drivers/scsi/bfa/include/fcb/bfa_fcb_fcpim.h @@ -70,6 +70,7 @@ void bfa_fcb_itnim_online(struct bfad_itnim_s *itnim_drv); */ void bfa_fcb_itnim_offline(struct bfad_itnim_s *itnim_drv); +void bfa_fcb_itnim_tov_begin(struct bfad_itnim_s *itnim_drv); void bfa_fcb_itnim_tov(struct bfad_itnim_s *itnim_drv); #endif /* __BFAD_FCB_FCPIM_H__ */ diff --git a/trunk/drivers/scsi/bfa/include/fcs/bfa_fcs.h b/trunk/drivers/scsi/bfa/include/fcs/bfa_fcs.h index f2fd35fdee28..627669c65546 100644 --- a/trunk/drivers/scsi/bfa/include/fcs/bfa_fcs.h +++ b/trunk/drivers/scsi/bfa/include/fcs/bfa_fcs.h @@ -49,7 +49,6 @@ struct bfa_fcs_s { struct bfa_trc_mod_s *trcmod; /* tracing module */ struct bfa_aen_s *aen; /* aen component */ bfa_boolean_t vf_enabled; /* VF mode is enabled */ - bfa_boolean_t fdmi_enabled; /*!< FDMI is enabled */ bfa_boolean_t min_cfg; /* min cfg enabled/disabled */ u16 port_vfid; /* port default VF ID */ struct bfa_fcs_driver_info_s driver_info; @@ -61,12 +60,10 @@ struct bfa_fcs_s { /* * bfa fcs API functions */ -void bfa_fcs_attach(struct bfa_fcs_s *fcs, struct bfa_s *bfa, struct bfad_s *bfad, +void bfa_fcs_init(struct bfa_fcs_s *fcs, struct bfa_s *bfa, struct bfad_s *bfad, bfa_boolean_t min_cfg); -void bfa_fcs_init(struct bfa_fcs_s *fcs); void bfa_fcs_driver_info_init(struct bfa_fcs_s *fcs, struct bfa_fcs_driver_info_s *driver_info); -void bfa_fcs_set_fdmi_param(struct bfa_fcs_s *fcs, bfa_boolean_t fdmi_enable); void bfa_fcs_exit(struct bfa_fcs_s *fcs); void bfa_fcs_trc_init(struct bfa_fcs_s *fcs, struct bfa_trc_mod_s *trcmod); void bfa_fcs_log_init(struct bfa_fcs_s *fcs, struct bfa_log_mod_s *logmod); diff --git a/trunk/drivers/scsi/bfa/include/fcs/bfa_fcs_lport.h b/trunk/drivers/scsi/bfa/include/fcs/bfa_fcs_lport.h index ceaefd3060f4..967ceb0eb074 100644 --- a/trunk/drivers/scsi/bfa/include/fcs/bfa_fcs_lport.h +++ b/trunk/drivers/scsi/bfa/include/fcs/bfa_fcs_lport.h @@ -34,6 +34,14 @@ struct bfa_fcs_s; struct bfa_fcs_fabric_s; /* +* @todo : need to move to a global config file. + * Maximum Vports supported per physical port or vf. + */ +#define BFA_FCS_MAX_VPORTS_SUPP_CB 255 +#define BFA_FCS_MAX_VPORTS_SUPP_CT 191 + +/* +* @todo : need to move to a global config file. * Maximum Rports supported per port (physical/logical). */ #define BFA_FCS_MAX_RPORTS_SUPP 256 /* @todo : tentative value */ diff --git a/trunk/drivers/scsi/bfa/include/log/bfa_log_hal.h b/trunk/drivers/scsi/bfa/include/log/bfa_log_hal.h index 5f8f5e30b9e8..0412aea2ec30 100644 --- a/trunk/drivers/scsi/bfa/include/log/bfa_log_hal.h +++ b/trunk/drivers/scsi/bfa/include/log/bfa_log_hal.h @@ -27,10 +27,4 @@ (((u32) BFA_LOG_HAL_ID << BFA_LOG_MODID_OFFSET) | 3) #define BFA_LOG_HAL_SM_ASSERT \ (((u32) BFA_LOG_HAL_ID << BFA_LOG_MODID_OFFSET) | 4) -#define BFA_LOG_HAL_DRIVER_ERROR \ - (((u32) BFA_LOG_HAL_ID << BFA_LOG_MODID_OFFSET) | 5) -#define BFA_LOG_HAL_DRIVER_CONFIG_ERROR \ - (((u32) BFA_LOG_HAL_ID << BFA_LOG_MODID_OFFSET) | 6) -#define BFA_LOG_HAL_MBOX_ERROR \ - (((u32) BFA_LOG_HAL_ID << BFA_LOG_MODID_OFFSET) | 7) #endif diff --git a/trunk/drivers/scsi/bfa/include/log/bfa_log_linux.h b/trunk/drivers/scsi/bfa/include/log/bfa_log_linux.h index bd451db4c30a..317c0547ee16 100644 --- a/trunk/drivers/scsi/bfa/include/log/bfa_log_linux.h +++ b/trunk/drivers/scsi/bfa/include/log/bfa_log_linux.h @@ -41,20 +41,4 @@ (((u32) BFA_LOG_LINUX_ID << BFA_LOG_MODID_OFFSET) | 10) #define BFA_LOG_LINUX_SCSI_ABORT_COMP \ (((u32) BFA_LOG_LINUX_ID << BFA_LOG_MODID_OFFSET) | 11) -#define BFA_LOG_LINUX_DRIVER_CONFIG_ERROR \ - (((u32) BFA_LOG_LINUX_ID << BFA_LOG_MODID_OFFSET) | 12) -#define BFA_LOG_LINUX_BNA_STATE_MACHINE \ - (((u32) BFA_LOG_LINUX_ID << BFA_LOG_MODID_OFFSET) | 13) -#define BFA_LOG_LINUX_IOC_ERROR \ - (((u32) BFA_LOG_LINUX_ID << BFA_LOG_MODID_OFFSET) | 14) -#define BFA_LOG_LINUX_RESOURCE_ALLOC_ERROR \ - (((u32) BFA_LOG_LINUX_ID << BFA_LOG_MODID_OFFSET) | 15) -#define BFA_LOG_LINUX_RING_BUFFER_ERROR \ - (((u32) BFA_LOG_LINUX_ID << BFA_LOG_MODID_OFFSET) | 16) -#define BFA_LOG_LINUX_DRIVER_ERROR \ - (((u32) BFA_LOG_LINUX_ID << BFA_LOG_MODID_OFFSET) | 17) -#define BFA_LOG_LINUX_DRIVER_DIAG \ - (((u32) BFA_LOG_LINUX_ID << BFA_LOG_MODID_OFFSET) | 18) -#define BFA_LOG_LINUX_DRIVER_AEN \ - (((u32) BFA_LOG_LINUX_ID << BFA_LOG_MODID_OFFSET) | 19) #endif diff --git a/trunk/drivers/scsi/bfa/include/protocol/fc.h b/trunk/drivers/scsi/bfa/include/protocol/fc.h index 8d1038035a76..14969eecf6a9 100644 --- a/trunk/drivers/scsi/bfa/include/protocol/fc.h +++ b/trunk/drivers/scsi/bfa/include/protocol/fc.h @@ -50,11 +50,6 @@ struct fchs_s { u32 ro; /* relative offset */ }; - -#define FC_SOF_LEN 4 -#define FC_EOF_LEN 4 -#define FC_CRC_LEN 4 - /* * Fibre Channel BB_E Header Structure */ diff --git a/trunk/drivers/scsi/bfa/include/protocol/pcifw.h b/trunk/drivers/scsi/bfa/include/protocol/pcifw.h new file mode 100644 index 000000000000..6830dc3ee58a --- /dev/null +++ b/trunk/drivers/scsi/bfa/include/protocol/pcifw.h @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2005-2009 Brocade Communications Systems, Inc. + * All rights reserved + * www.brocade.com + * + * Linux driver for Brocade Fibre Channel Host Bus Adapter. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License (GPL) Version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + */ + +/** + * pcifw.h PCI FW related headers + */ + +#ifndef __PCIFW_H__ +#define __PCIFW_H__ + +#pragma pack(1) + +struct pnp_hdr_s{ + u32 signature; /* "$PnP" */ + u8 rev; /* Struct revision */ + u8 len; /* Header structure len in multiples + * of 16 bytes */ + u16 off; /* Offset to next header 00 if none */ + u8 rsvd; /* Reserved byte */ + u8 cksum; /* 8-bit checksum for this header */ + u32 pnp_dev_id; /* PnP Device Id */ + u16 mfstr; /* Pointer to manufacturer string */ + u16 prstr; /* Pointer to product string */ + u8 devtype[3]; /* Device Type Code */ + u8 devind; /* Device Indicator */ + u16 bcventr; /* Bootstrap entry vector */ + u16 rsvd2; /* Reserved */ + u16 sriv; /* Static resource information vector */ +}; + +struct pci_3_0_ds_s{ + u32 sig; /* Signature "PCIR" */ + u16 vendid; /* Vendor ID */ + u16 devid; /* Device ID */ + u16 devlistoff; /* Device List Offset */ + u16 len; /* PCI Data Structure Length */ + u8 rev; /* PCI Data Structure Revision */ + u8 clcode[3]; /* Class Code */ + u16 imglen; /* Code image length in multiples of + * 512 bytes */ + u16 coderev; /* Revision level of code/data */ + u8 codetype; /* Code type 0x00 - BIOS */ + u8 indr; /* Last image indicator */ + u16 mrtimglen; /* Max Run Time Image Length */ + u16 cuoff; /* Config Utility Code Header Offset */ + u16 dmtfclp; /* DMTF CLP entry point offset */ +}; + +struct pci_optrom_hdr_s{ + u16 sig; /* Signature 0x55AA */ + u8 len; /* Option ROM length in units of 512 bytes */ + u8 inivec[3]; /* Initialization vector */ + u8 rsvd[16]; /* Reserved field */ + u16 verptr; /* Pointer to version string - private */ + u16 pcids; /* Pointer to PCI data structure */ + u16 pnphdr; /* Pointer to PnP expansion header */ +}; + +#pragma pack() + +#endif diff --git a/trunk/drivers/scsi/bfa/loop.c b/trunk/drivers/scsi/bfa/loop.c index f6342efb6a90..f7c7f4f3c640 100644 --- a/trunk/drivers/scsi/bfa/loop.c +++ b/trunk/drivers/scsi/bfa/loop.c @@ -162,7 +162,7 @@ bfa_fcs_port_loop_send_plogi(struct bfa_fcs_port_s *port, u8 alpa) len = fc_plogi_build(&fchs, bfa_fcxp_get_reqbuf(fcxp), alpa, bfa_fcs_port_get_fcid(port), 0, port->port_cfg.pwwn, port->port_cfg.nwwn, - bfa_fcport_get_maxfrsize(port->fcs->bfa)); + bfa_pport_get_maxfrsize(port->fcs->bfa)); bfa_fcxp_send(fcxp, NULL, port->fabric->vf_id, port->lp_tag, BFA_FALSE, FC_CLASS_3, len, &fchs, diff --git a/trunk/drivers/scsi/bfa/lport_api.c b/trunk/drivers/scsi/bfa/lport_api.c index d3907d184e2b..1e06792cd4c2 100644 --- a/trunk/drivers/scsi/bfa/lport_api.c +++ b/trunk/drivers/scsi/bfa/lport_api.c @@ -156,7 +156,7 @@ bfa_fcs_port_get_rport_max_speed(struct bfa_fcs_port_s *port) /* * Get Physical port's current speed */ - bfa_fcport_get_attr(port->fcs->bfa, &pport_attr); + bfa_pport_get_attr(port->fcs->bfa, &pport_attr); pport_speed = pport_attr.speed; bfa_trc(fcs, pport_speed); @@ -235,8 +235,7 @@ bfa_fcs_port_get_info(struct bfa_fcs_port_s *port, port_info->port_wwn = bfa_fcs_port_get_pwwn(port); port_info->node_wwn = bfa_fcs_port_get_nwwn(port); - port_info->max_vports_supp = - bfa_lps_get_max_vport(port->fcs->bfa); + port_info->max_vports_supp = bfa_fcs_vport_get_max(port->fcs); port_info->num_vports_inuse = bfa_fcs_fabric_vport_count(port->fabric); port_info->max_rports_supp = BFA_FCS_MAX_RPORTS_SUPP; diff --git a/trunk/drivers/scsi/bfa/ms.c b/trunk/drivers/scsi/bfa/ms.c index 5e8c8dee6c97..c96b3ca007ae 100644 --- a/trunk/drivers/scsi/bfa/ms.c +++ b/trunk/drivers/scsi/bfa/ms.c @@ -118,7 +118,7 @@ bfa_fcs_port_ms_sm_offline(struct bfa_fcs_port_ms_s *ms, break; default: - bfa_sm_fault(ms->port->fcs, event); + bfa_assert(0); } } @@ -141,7 +141,7 @@ bfa_fcs_port_ms_sm_plogi_sending(struct bfa_fcs_port_ms_s *ms, break; default: - bfa_sm_fault(ms->port->fcs, event); + bfa_assert(0); } } @@ -190,7 +190,7 @@ bfa_fcs_port_ms_sm_plogi(struct bfa_fcs_port_ms_s *ms, enum port_ms_event event) break; default: - bfa_sm_fault(ms->port->fcs, event); + bfa_assert(0); } } @@ -216,7 +216,7 @@ bfa_fcs_port_ms_sm_plogi_retry(struct bfa_fcs_port_ms_s *ms, break; default: - bfa_sm_fault(ms->port->fcs, event); + bfa_assert(0); } } @@ -230,6 +230,10 @@ bfa_fcs_port_ms_sm_online(struct bfa_fcs_port_ms_s *ms, switch (event) { case MSSM_EVENT_PORT_OFFLINE: bfa_sm_set_state(ms, bfa_fcs_port_ms_sm_offline); + /* + * now invoke MS related sub-modules + */ + bfa_fcs_port_fdmi_offline(ms); break; case MSSM_EVENT_PORT_FABRIC_RSCN: @@ -239,7 +243,7 @@ bfa_fcs_port_ms_sm_online(struct bfa_fcs_port_ms_s *ms, break; default: - bfa_sm_fault(ms->port->fcs, event); + bfa_assert(0); } } @@ -262,7 +266,7 @@ bfa_fcs_port_ms_sm_gmal_sending(struct bfa_fcs_port_ms_s *ms, break; default: - bfa_sm_fault(ms->port->fcs, event); + bfa_assert(0); } } @@ -300,7 +304,7 @@ bfa_fcs_port_ms_sm_gmal(struct bfa_fcs_port_ms_s *ms, enum port_ms_event event) break; default: - bfa_sm_fault(ms->port->fcs, event); + bfa_assert(0); } } @@ -326,7 +330,7 @@ bfa_fcs_port_ms_sm_gmal_retry(struct bfa_fcs_port_ms_s *ms, break; default: - bfa_sm_fault(ms->port->fcs, event); + bfa_assert(0); } } @@ -462,7 +466,7 @@ bfa_fcs_port_ms_sm_gfn_sending(struct bfa_fcs_port_ms_s *ms, break; default: - bfa_sm_fault(ms->port->fcs, event); + bfa_assert(0); } } @@ -498,7 +502,7 @@ bfa_fcs_port_ms_sm_gfn(struct bfa_fcs_port_ms_s *ms, enum port_ms_event event) break; default: - bfa_sm_fault(ms->port->fcs, event); + bfa_assert(0); } } @@ -524,7 +528,7 @@ bfa_fcs_port_ms_sm_gfn_retry(struct bfa_fcs_port_ms_s *ms, break; default: - bfa_sm_fault(ms->port->fcs, event); + bfa_assert(0); } } @@ -633,7 +637,7 @@ bfa_fcs_port_ms_send_plogi(void *ms_cbarg, struct bfa_fcxp_s *fcxp_alloced) bfa_os_hton3b(FC_MGMT_SERVER), bfa_fcs_port_get_fcid(port), 0, port->port_cfg.pwwn, port->port_cfg.nwwn, - bfa_fcport_get_maxfrsize(port->fcs->bfa)); + bfa_pport_get_maxfrsize(port->fcs->bfa)); bfa_fcxp_send(fcxp, NULL, port->fabric->vf_id, port->lp_tag, BFA_FALSE, FC_CLASS_3, len, &fchs, bfa_fcs_port_ms_plogi_response, @@ -731,7 +735,6 @@ bfa_fcs_port_ms_offline(struct bfa_fcs_port_s *port) ms->port = port; bfa_sm_send_event(ms, MSSM_EVENT_PORT_OFFLINE); - bfa_fcs_port_fdmi_offline(ms); } void diff --git a/trunk/drivers/scsi/bfa/ns.c b/trunk/drivers/scsi/bfa/ns.c index d20dd7e15742..2f8b880060bb 100644 --- a/trunk/drivers/scsi/bfa/ns.c +++ b/trunk/drivers/scsi/bfa/ns.c @@ -164,7 +164,7 @@ bfa_fcs_port_ns_sm_offline(struct bfa_fcs_port_ns_s *ns, break; default: - bfa_sm_fault(ns->port->fcs, event); + bfa_assert(0); } } @@ -187,7 +187,7 @@ bfa_fcs_port_ns_sm_plogi_sending(struct bfa_fcs_port_ns_s *ns, break; default: - bfa_sm_fault(ns->port->fcs, event); + bfa_assert(0); } } @@ -221,7 +221,7 @@ bfa_fcs_port_ns_sm_plogi(struct bfa_fcs_port_ns_s *ns, break; default: - bfa_sm_fault(ns->port->fcs, event); + bfa_assert(0); } } @@ -247,7 +247,7 @@ bfa_fcs_port_ns_sm_plogi_retry(struct bfa_fcs_port_ns_s *ns, break; default: - bfa_sm_fault(ns->port->fcs, event); + bfa_assert(0); } } @@ -270,7 +270,7 @@ bfa_fcs_port_ns_sm_sending_rspn_id(struct bfa_fcs_port_ns_s *ns, break; default: - bfa_sm_fault(ns->port->fcs, event); + bfa_assert(0); } } @@ -304,7 +304,7 @@ bfa_fcs_port_ns_sm_rspn_id(struct bfa_fcs_port_ns_s *ns, break; default: - bfa_sm_fault(ns->port->fcs, event); + bfa_assert(0); } } @@ -330,7 +330,7 @@ bfa_fcs_port_ns_sm_rspn_id_retry(struct bfa_fcs_port_ns_s *ns, break; default: - bfa_sm_fault(ns->port->fcs, event); + bfa_assert(0); } } @@ -353,7 +353,7 @@ bfa_fcs_port_ns_sm_sending_rft_id(struct bfa_fcs_port_ns_s *ns, break; default: - bfa_sm_fault(ns->port->fcs, event); + bfa_assert(0); } } @@ -390,7 +390,7 @@ bfa_fcs_port_ns_sm_rft_id(struct bfa_fcs_port_ns_s *ns, break; default: - bfa_sm_fault(ns->port->fcs, event); + bfa_assert(0); } } @@ -413,7 +413,7 @@ bfa_fcs_port_ns_sm_rft_id_retry(struct bfa_fcs_port_ns_s *ns, break; default: - bfa_sm_fault(ns->port->fcs, event); + bfa_assert(0); } } @@ -436,7 +436,7 @@ bfa_fcs_port_ns_sm_sending_rff_id(struct bfa_fcs_port_ns_s *ns, break; default: - bfa_sm_fault(ns->port->fcs, event); + bfa_assert(0); } } @@ -494,7 +494,7 @@ bfa_fcs_port_ns_sm_rff_id(struct bfa_fcs_port_ns_s *ns, break; default: - bfa_sm_fault(ns->port->fcs, event); + bfa_assert(0); } } @@ -517,7 +517,7 @@ bfa_fcs_port_ns_sm_rff_id_retry(struct bfa_fcs_port_ns_s *ns, break; default: - bfa_sm_fault(ns->port->fcs, event); + bfa_assert(0); } } static void @@ -539,7 +539,7 @@ bfa_fcs_port_ns_sm_sending_gid_ft(struct bfa_fcs_port_ns_s *ns, break; default: - bfa_sm_fault(ns->port->fcs, event); + bfa_assert(0); } } @@ -575,7 +575,7 @@ bfa_fcs_port_ns_sm_gid_ft(struct bfa_fcs_port_ns_s *ns, break; default: - bfa_sm_fault(ns->port->fcs, event); + bfa_assert(0); } } @@ -598,7 +598,7 @@ bfa_fcs_port_ns_sm_gid_ft_retry(struct bfa_fcs_port_ns_s *ns, break; default: - bfa_sm_fault(ns->port->fcs, event); + bfa_assert(0); } } @@ -626,7 +626,7 @@ bfa_fcs_port_ns_sm_online(struct bfa_fcs_port_ns_s *ns, break; default: - bfa_sm_fault(ns->port->fcs, event); + bfa_assert(0); } } @@ -660,7 +660,7 @@ bfa_fcs_port_ns_send_plogi(void *ns_cbarg, struct bfa_fcxp_s *fcxp_alloced) bfa_os_hton3b(FC_NAME_SERVER), bfa_fcs_port_get_fcid(port), 0, port->port_cfg.pwwn, port->port_cfg.nwwn, - bfa_fcport_get_maxfrsize(port->fcs->bfa)); + bfa_pport_get_maxfrsize(port->fcs->bfa)); bfa_fcxp_send(fcxp, NULL, port->fabric->vf_id, port->lp_tag, BFA_FALSE, FC_CLASS_3, len, &fchs, bfa_fcs_port_ns_plogi_response, diff --git a/trunk/drivers/scsi/bfa/rport.c b/trunk/drivers/scsi/bfa/rport.c index 8e73dd9a625a..9cf58bb138dc 100644 --- a/trunk/drivers/scsi/bfa/rport.c +++ b/trunk/drivers/scsi/bfa/rport.c @@ -224,7 +224,7 @@ bfa_fcs_rport_sm_uninit(struct bfa_fcs_rport_s *rport, enum rport_event event) break; default: - bfa_sm_fault(rport->fcs, event); + bfa_assert(0); } } @@ -276,7 +276,7 @@ bfa_fcs_rport_sm_plogi_sending(struct bfa_fcs_rport_s *rport, break; default: - bfa_sm_fault(rport->fcs, event); + bfa_assert(0); } } @@ -332,7 +332,7 @@ bfa_fcs_rport_sm_plogiacc_sending(struct bfa_fcs_rport_s *rport, break; default: - bfa_sm_fault(rport->fcs, event); + bfa_assert(0); } } @@ -406,7 +406,7 @@ bfa_fcs_rport_sm_plogi_retry(struct bfa_fcs_rport_s *rport, break; default: - bfa_sm_fault(rport->fcs, event); + bfa_assert(0); } } @@ -481,7 +481,7 @@ bfa_fcs_rport_sm_plogi(struct bfa_fcs_rport_s *rport, enum rport_event event) break; default: - bfa_sm_fault(rport->fcs, event); + bfa_assert(0); } } @@ -534,7 +534,7 @@ bfa_fcs_rport_sm_hal_online(struct bfa_fcs_rport_s *rport, break; default: - bfa_sm_fault(rport->fcs, event); + bfa_assert(0); } } @@ -589,7 +589,7 @@ bfa_fcs_rport_sm_online(struct bfa_fcs_rport_s *rport, enum rport_event event) break; default: - bfa_sm_fault(rport->fcs, event); + bfa_assert(0); } } @@ -646,7 +646,7 @@ bfa_fcs_rport_sm_nsquery_sending(struct bfa_fcs_rport_s *rport, break; default: - bfa_sm_fault(rport->fcs, event); + bfa_assert(0); } } @@ -704,7 +704,7 @@ bfa_fcs_rport_sm_nsquery(struct bfa_fcs_rport_s *rport, enum rport_event event) break; default: - bfa_sm_fault(rport->fcs, event); + bfa_assert(0); } } @@ -754,7 +754,7 @@ bfa_fcs_rport_sm_adisc_sending(struct bfa_fcs_rport_s *rport, break; default: - bfa_sm_fault(rport->fcs, event); + bfa_assert(0); } } @@ -816,7 +816,7 @@ bfa_fcs_rport_sm_adisc(struct bfa_fcs_rport_s *rport, enum rport_event event) break; default: - bfa_sm_fault(rport->fcs, event); + bfa_assert(0); } } @@ -846,7 +846,7 @@ bfa_fcs_rport_sm_fc4_logorcv(struct bfa_fcs_rport_s *rport, break; default: - bfa_sm_fault(rport->fcs, event); + bfa_assert(0); } } @@ -869,7 +869,7 @@ bfa_fcs_rport_sm_fc4_logosend(struct bfa_fcs_rport_s *rport, break; default: - bfa_sm_fault(rport->fcs, event); + bfa_assert(0); } } @@ -905,7 +905,7 @@ bfa_fcs_rport_sm_fc4_offline(struct bfa_fcs_rport_s *rport, break; default: - bfa_sm_fault(rport->fcs, event); + bfa_assert(0); } } @@ -925,17 +925,10 @@ bfa_fcs_rport_sm_hcb_offline(struct bfa_fcs_rport_s *rport, case RPSM_EVENT_HCB_OFFLINE: case RPSM_EVENT_ADDRESS_CHANGE: if (bfa_fcs_port_is_online(rport->port)) { - if (bfa_fcs_fabric_is_switched(rport->port->fabric)) { - bfa_sm_set_state(rport, - bfa_fcs_rport_sm_nsdisc_sending); - rport->ns_retries = 0; - bfa_fcs_rport_send_gidpn(rport, NULL); - } else { - bfa_sm_set_state(rport, - bfa_fcs_rport_sm_plogi_sending); - rport->plogi_retries = 0; - bfa_fcs_rport_send_plogi(rport, NULL); - } + bfa_sm_set_state(rport, + bfa_fcs_rport_sm_nsdisc_sending); + rport->ns_retries = 0; + bfa_fcs_rport_send_gidpn(rport, NULL); } else { rport->pid = 0; bfa_sm_set_state(rport, bfa_fcs_rport_sm_offline); @@ -958,7 +951,7 @@ bfa_fcs_rport_sm_hcb_offline(struct bfa_fcs_rport_s *rport, break; default: - bfa_sm_fault(rport->fcs, event); + bfa_assert(0); } } @@ -1018,7 +1011,7 @@ bfa_fcs_rport_sm_hcb_logorcv(struct bfa_fcs_rport_s *rport, break; default: - bfa_sm_fault(rport->fcs, event); + bfa_assert(0); } } @@ -1045,7 +1038,7 @@ bfa_fcs_rport_sm_hcb_logosend(struct bfa_fcs_rport_s *rport, break; default: - bfa_sm_fault(rport->fcs, event); + bfa_assert(0); } } @@ -1080,7 +1073,7 @@ bfa_fcs_rport_sm_logo_sending(struct bfa_fcs_rport_s *rport, break; default: - bfa_sm_fault(rport->fcs, event); + bfa_assert(0); } } @@ -1139,7 +1132,7 @@ bfa_fcs_rport_sm_offline(struct bfa_fcs_rport_s *rport, enum rport_event event) break; default: - bfa_sm_fault(rport->fcs, event); + bfa_assert(0); } } @@ -1195,7 +1188,7 @@ bfa_fcs_rport_sm_nsdisc_sending(struct bfa_fcs_rport_s *rport, break; default: - bfa_sm_fault(rport->fcs, event); + bfa_assert(0); } } @@ -1256,7 +1249,7 @@ bfa_fcs_rport_sm_nsdisc_retry(struct bfa_fcs_rport_s *rport, break; default: - bfa_sm_fault(rport->fcs, event); + bfa_assert(0); } } @@ -1341,7 +1334,7 @@ bfa_fcs_rport_sm_nsdisc_sent(struct bfa_fcs_rport_s *rport, break; default: - bfa_sm_fault(rport->fcs, event); + bfa_assert(0); } } @@ -1373,7 +1366,7 @@ bfa_fcs_rport_send_plogi(void *rport_cbarg, struct bfa_fcxp_s *fcxp_alloced) len = fc_plogi_build(&fchs, bfa_fcxp_get_reqbuf(fcxp), rport->pid, bfa_fcs_port_get_fcid(port), 0, port->port_cfg.pwwn, port->port_cfg.nwwn, - bfa_fcport_get_maxfrsize(port->fcs->bfa)); + bfa_pport_get_maxfrsize(port->fcs->bfa)); bfa_fcxp_send(fcxp, NULL, port->fabric->vf_id, port->lp_tag, BFA_FALSE, FC_CLASS_3, len, &fchs, bfa_fcs_rport_plogi_response, @@ -1485,7 +1478,7 @@ bfa_fcs_rport_send_plogiacc(void *rport_cbarg, struct bfa_fcxp_s *fcxp_alloced) len = fc_plogi_acc_build(&fchs, bfa_fcxp_get_reqbuf(fcxp), rport->pid, bfa_fcs_port_get_fcid(port), rport->reply_oxid, port->port_cfg.pwwn, port->port_cfg.nwwn, - bfa_fcport_get_maxfrsize(port->fcs->bfa)); + bfa_pport_get_maxfrsize(port->fcs->bfa)); bfa_fcxp_send(fcxp, NULL, port->fabric->vf_id, port->lp_tag, BFA_FALSE, FC_CLASS_3, len, &fchs, NULL, NULL, FC_MAX_PDUSZ, 0); @@ -1820,7 +1813,7 @@ bfa_fcs_rport_process_rpsc(struct bfa_fcs_rport_s *rport, /* * get curent speed from pport attributes from BFA */ - bfa_fcport_get_attr(port->fcs->bfa, &pport_attr); + bfa_pport_get_attr(port->fcs->bfa, &pport_attr); speeds.port_op_speed = fc_bfa_speed_to_rpsc_operspeed(pport_attr.speed); @@ -2039,10 +2032,13 @@ bfa_fcs_rport_aen_post(struct bfa_fcs_rport_s *rport, switch (event) { case BFA_RPORT_AEN_ONLINE: + bfa_log(logmod, BFA_AEN_RPORT_ONLINE, rpwwn_ptr, lpwwn_ptr); + break; case BFA_RPORT_AEN_OFFLINE: + bfa_log(logmod, BFA_AEN_RPORT_OFFLINE, rpwwn_ptr, lpwwn_ptr); + break; case BFA_RPORT_AEN_DISCONNECT: - bfa_log(logmod, BFA_LOG_CREATE_ID(BFA_AEN_CAT_RPORT, event), - rpwwn_ptr, lpwwn_ptr); + bfa_log(logmod, BFA_AEN_RPORT_DISCONNECT, rpwwn_ptr, lpwwn_ptr); break; case BFA_RPORT_AEN_QOS_PRIO: aen_data.rport.priv.qos = data->priv.qos; @@ -2168,7 +2164,7 @@ bfa_fcs_rport_update(struct bfa_fcs_rport_s *rport, struct fc_logi_s *plogi) bfa_trc(port->fcs, port->fabric->bb_credit); port->fabric->bb_credit = bfa_os_ntohs(plogi->csp.bbcred); - bfa_fcport_set_tx_bbcredit(port->fcs->bfa, + bfa_pport_set_tx_bbcredit(port->fcs->bfa, port->fabric->bb_credit); } @@ -2578,6 +2574,23 @@ bfa_fcs_rport_send_ls_rjt(struct bfa_fcs_rport_s *rport, struct fchs_s *rx_fchs, FC_CLASS_3, len, &fchs, NULL, NULL, FC_MAX_PDUSZ, 0); } +/** + * Module initialization + */ +void +bfa_fcs_rport_modinit(struct bfa_fcs_s *fcs) +{ +} + +/** + * Module cleanup + */ +void +bfa_fcs_rport_modexit(struct bfa_fcs_s *fcs) +{ + bfa_fcs_modexit_comp(fcs); +} + /** * Return state of rport. */ diff --git a/trunk/drivers/scsi/bfa/rport_api.c b/trunk/drivers/scsi/bfa/rport_api.c index a441f41d2a64..3dae1774181e 100644 --- a/trunk/drivers/scsi/bfa/rport_api.c +++ b/trunk/drivers/scsi/bfa/rport_api.c @@ -102,7 +102,7 @@ bfa_fcs_rport_get_attr(struct bfa_fcs_rport_s *rport, rport_attr->qos_attr = qos_attr; rport_attr->trl_enforced = BFA_FALSE; - if (bfa_fcport_is_ratelim(port->fcs->bfa)) { + if (bfa_pport_is_ratelim(port->fcs->bfa)) { if ((rport->rpf.rpsc_speed == BFA_PPORT_SPEED_UNKNOWN) || (rport->rpf.rpsc_speed < bfa_fcs_port_get_rport_max_speed(port))) diff --git a/trunk/drivers/scsi/bfa/rport_ftrs.c b/trunk/drivers/scsi/bfa/rport_ftrs.c index ae7bba67ae2a..e1932c885ac2 100644 --- a/trunk/drivers/scsi/bfa/rport_ftrs.c +++ b/trunk/drivers/scsi/bfa/rport_ftrs.c @@ -91,7 +91,7 @@ bfa_fcs_rpf_sm_uninit(struct bfa_fcs_rpf_s *rpf, enum rpf_event event) break; default: - bfa_sm_fault(rport->fcs, event); + bfa_assert(0); } } @@ -114,7 +114,7 @@ bfa_fcs_rpf_sm_rpsc_sending(struct bfa_fcs_rpf_s *rpf, enum rpf_event event) break; default: - bfa_sm_fault(rport->fcs, event); + bfa_assert(0); } } @@ -160,7 +160,7 @@ bfa_fcs_rpf_sm_rpsc(struct bfa_fcs_rpf_s *rpf, enum rpf_event event) break; default: - bfa_sm_fault(rport->fcs, event); + bfa_assert(0); } } @@ -186,7 +186,7 @@ bfa_fcs_rpf_sm_rpsc_retry(struct bfa_fcs_rpf_s *rpf, enum rpf_event event) break; default: - bfa_sm_fault(rport->fcs, event); + bfa_assert(0); } } @@ -206,7 +206,7 @@ bfa_fcs_rpf_sm_online(struct bfa_fcs_rpf_s *rpf, enum rpf_event event) break; default: - bfa_sm_fault(rport->fcs, event); + bfa_assert(0); } } @@ -229,7 +229,7 @@ bfa_fcs_rpf_sm_offline(struct bfa_fcs_rpf_s *rpf, enum rpf_event event) break; default: - bfa_sm_fault(rport->fcs, event); + bfa_assert(0); } } /** diff --git a/trunk/drivers/scsi/bfa/scn.c b/trunk/drivers/scsi/bfa/scn.c index 8fe09ba88a91..bd4771ff62c8 100644 --- a/trunk/drivers/scsi/bfa/scn.c +++ b/trunk/drivers/scsi/bfa/scn.c @@ -90,7 +90,7 @@ bfa_fcs_port_scn_sm_offline(struct bfa_fcs_port_scn_s *scn, break; default: - bfa_sm_fault(scn->port->fcs, event); + bfa_assert(0); } } @@ -109,7 +109,7 @@ bfa_fcs_port_scn_sm_sending_scr(struct bfa_fcs_port_scn_s *scn, break; default: - bfa_sm_fault(scn->port->fcs, event); + bfa_assert(0); } } @@ -137,7 +137,7 @@ bfa_fcs_port_scn_sm_scr(struct bfa_fcs_port_scn_s *scn, break; default: - bfa_sm_fault(scn->port->fcs, event); + bfa_assert(0); } } @@ -157,7 +157,7 @@ bfa_fcs_port_scn_sm_scr_retry(struct bfa_fcs_port_scn_s *scn, break; default: - bfa_sm_fault(scn->port->fcs, event); + bfa_assert(0); } } @@ -171,7 +171,7 @@ bfa_fcs_port_scn_sm_online(struct bfa_fcs_port_scn_s *scn, break; default: - bfa_sm_fault(scn->port->fcs, event); + bfa_assert(0); } } diff --git a/trunk/drivers/scsi/bfa/vport.c b/trunk/drivers/scsi/bfa/vport.c index 27cd619a227a..e90f1e38c32d 100644 --- a/trunk/drivers/scsi/bfa/vport.c +++ b/trunk/drivers/scsi/bfa/vport.c @@ -122,7 +122,7 @@ bfa_fcs_vport_sm_uninit(struct bfa_fcs_vport_s *vport, break; default: - bfa_sm_fault(__vport_fcs(vport), event); + bfa_assert(0); } } @@ -165,7 +165,7 @@ bfa_fcs_vport_sm_created(struct bfa_fcs_vport_s *vport, break; default: - bfa_sm_fault(__vport_fcs(vport), event); + bfa_assert(0); } } @@ -202,7 +202,7 @@ bfa_fcs_vport_sm_offline(struct bfa_fcs_vport_s *vport, break; default: - bfa_sm_fault(__vport_fcs(vport), event); + bfa_assert(0); } } @@ -249,7 +249,7 @@ bfa_fcs_vport_sm_fdisc(struct bfa_fcs_vport_s *vport, break; default: - bfa_sm_fault(__vport_fcs(vport), event); + bfa_assert(0); } } @@ -283,7 +283,7 @@ bfa_fcs_vport_sm_fdisc_retry(struct bfa_fcs_vport_s *vport, break; default: - bfa_sm_fault(__vport_fcs(vport), event); + bfa_assert(0); } } @@ -310,7 +310,7 @@ bfa_fcs_vport_sm_online(struct bfa_fcs_vport_s *vport, break; default: - bfa_sm_fault(__vport_fcs(vport), event); + bfa_assert(0); } } @@ -339,7 +339,7 @@ bfa_fcs_vport_sm_deleting(struct bfa_fcs_vport_s *vport, break; default: - bfa_sm_fault(__vport_fcs(vport), event); + bfa_assert(0); } } @@ -387,7 +387,7 @@ bfa_fcs_vport_sm_cleanup(struct bfa_fcs_vport_s *vport, break; default: - bfa_sm_fault(__vport_fcs(vport), event); + bfa_assert(0); } } @@ -419,7 +419,7 @@ bfa_fcs_vport_sm_logo(struct bfa_fcs_vport_s *vport, break; default: - bfa_sm_fault(__vport_fcs(vport), event); + bfa_assert(0); } } @@ -447,8 +447,22 @@ bfa_fcs_vport_aen_post(bfa_fcs_lport_t *port, enum bfa_lport_aen_event event) bfa_assert(role <= BFA_PORT_ROLE_FCP_MAX); - bfa_log(logmod, BFA_LOG_CREATE_ID(BFA_AEN_CAT_LPORT, event), lpwwn_ptr, - role_str[role/2]); + switch (event) { + case BFA_LPORT_AEN_NPIV_DUP_WWN: + bfa_log(logmod, BFA_AEN_LPORT_NPIV_DUP_WWN, lpwwn_ptr, + role_str[role / 2]); + break; + case BFA_LPORT_AEN_NPIV_FABRIC_MAX: + bfa_log(logmod, BFA_AEN_LPORT_NPIV_FABRIC_MAX, lpwwn_ptr, + role_str[role / 2]); + break; + case BFA_LPORT_AEN_NPIV_UNKNOWN: + bfa_log(logmod, BFA_AEN_LPORT_NPIV_UNKNOWN, lpwwn_ptr, + role_str[role / 2]); + break; + default: + break; + } aen_data.lport.vf_id = port->fabric->vf_id; aen_data.lport.roles = role; @@ -464,7 +478,7 @@ static void bfa_fcs_vport_do_fdisc(struct bfa_fcs_vport_s *vport) { bfa_lps_fdisc(vport->lps, vport, - bfa_fcport_get_maxfrsize(__vport_bfa(vport)), + bfa_pport_get_maxfrsize(__vport_bfa(vport)), __vport_pwwn(vport), __vport_nwwn(vport)); vport->vport_stats.fdisc_sent++; } @@ -602,6 +616,38 @@ bfa_fcs_vport_delete_comp(struct bfa_fcs_vport_s *vport) bfa_sm_send_event(vport, BFA_FCS_VPORT_SM_DELCOMP); } +/** + * Module initialization + */ +void +bfa_fcs_vport_modinit(struct bfa_fcs_s *fcs) +{ +} + +/** + * Module cleanup + */ +void +bfa_fcs_vport_modexit(struct bfa_fcs_s *fcs) +{ + bfa_fcs_modexit_comp(fcs); +} + +u32 +bfa_fcs_vport_get_max(struct bfa_fcs_s *fcs) +{ + struct bfa_ioc_attr_s ioc_attr; + + bfa_get_attr(fcs->bfa, &ioc_attr); + + if (ioc_attr.pci_attr.device_id == BFA_PCI_DEVICE_ID_CT) + return BFA_FCS_MAX_VPORTS_SUPP_CT; + else + return BFA_FCS_MAX_VPORTS_SUPP_CB; +} + + + /** * fcs_vport_api Virtual port API */ @@ -638,7 +684,7 @@ bfa_fcs_vport_create(struct bfa_fcs_vport_s *vport, struct bfa_fcs_s *fcs, return BFA_STATUS_VPORT_EXISTS; if (bfa_fcs_fabric_vport_count(&fcs->fabric) == - bfa_lps_get_max_vport(fcs->bfa)) + bfa_fcs_vport_get_max(fcs)) return BFA_STATUS_VPORT_MAX; vport->lps = bfa_lps_alloc(fcs->bfa); @@ -648,8 +694,7 @@ bfa_fcs_vport_create(struct bfa_fcs_vport_s *vport, struct bfa_fcs_s *fcs, vport->vport_drv = vport_drv; bfa_sm_set_state(vport, bfa_fcs_vport_sm_uninit); - bfa_fcs_lport_attach(&vport->lport, fcs, vf_id, vport); - bfa_fcs_lport_init(&vport->lport, vport_cfg); + bfa_fcs_lport_init(&vport->lport, fcs, vf_id, vport_cfg, vport); bfa_sm_send_event(vport, BFA_FCS_VPORT_SM_CREATE); @@ -843,15 +888,4 @@ bfa_cb_lps_fdisclogo_comp(void *bfad, void *uarg) bfa_sm_send_event(vport, BFA_FCS_VPORT_SM_RSP_OK); } -/** - * Received clear virtual link - */ -void -bfa_cb_lps_cvl_event(void *bfad, void *uarg) -{ - struct bfa_fcs_vport_s *vport = uarg; - /* Send an Offline followed by an ONLINE */ - bfa_sm_send_event(vport, BFA_FCS_VPORT_SM_OFFLINE); - bfa_sm_send_event(vport, BFA_FCS_VPORT_SM_ONLINE); -} diff --git a/trunk/drivers/scsi/bnx2i/bnx2i_iscsi.c b/trunk/drivers/scsi/bnx2i/bnx2i_iscsi.c index cb71dc984797..1c4d1215769d 100644 --- a/trunk/drivers/scsi/bnx2i/bnx2i_iscsi.c +++ b/trunk/drivers/scsi/bnx2i/bnx2i_iscsi.c @@ -1989,7 +1989,7 @@ static struct scsi_host_template bnx2i_host_template = { .queuecommand = iscsi_queuecommand, .eh_abort_handler = iscsi_eh_abort, .eh_device_reset_handler = iscsi_eh_device_reset, - .eh_target_reset_handler = iscsi_eh_recover_target, + .eh_target_reset_handler = iscsi_eh_target_reset, .change_queue_depth = iscsi_change_queue_depth, .can_queue = 1024, .max_sectors = 127, diff --git a/trunk/drivers/scsi/cxgb3i/cxgb3i_iscsi.c b/trunk/drivers/scsi/cxgb3i/cxgb3i_iscsi.c index b7c30585dadd..412853c65372 100644 --- a/trunk/drivers/scsi/cxgb3i/cxgb3i_iscsi.c +++ b/trunk/drivers/scsi/cxgb3i/cxgb3i_iscsi.c @@ -915,7 +915,7 @@ static struct scsi_host_template cxgb3i_host_template = { .cmd_per_lun = ISCSI_DEF_CMD_PER_LUN, .eh_abort_handler = iscsi_eh_abort, .eh_device_reset_handler = iscsi_eh_device_reset, - .eh_target_reset_handler = iscsi_eh_recover_target, + .eh_target_reset_handler = iscsi_eh_target_reset, .target_alloc = iscsi_target_alloc, .use_clustering = DISABLE_CLUSTERING, .this_id = -1, diff --git a/trunk/drivers/scsi/device_handler/scsi_dh_emc.c b/trunk/drivers/scsi/device_handler/scsi_dh_emc.c index 63032ec3db92..61966750bd60 100644 --- a/trunk/drivers/scsi/device_handler/scsi_dh_emc.c +++ b/trunk/drivers/scsi/device_handler/scsi_dh_emc.c @@ -272,7 +272,7 @@ static struct request *get_req(struct scsi_device *sdev, int cmd, int len = 0; rq = blk_get_request(sdev->request_queue, - (cmd != INQUIRY) ? WRITE : READ, GFP_NOIO); + (cmd == MODE_SELECT) ? WRITE : READ, GFP_NOIO); if (!rq) { sdev_printk(KERN_INFO, sdev, "get_req: blk_get_request failed"); return NULL; @@ -286,17 +286,14 @@ static struct request *get_req(struct scsi_device *sdev, int cmd, len = sizeof(short_trespass); rq->cmd_flags |= REQ_RW; rq->cmd[1] = 0x10; - rq->cmd[4] = len; break; case MODE_SELECT_10: len = sizeof(long_trespass); rq->cmd_flags |= REQ_RW; rq->cmd[1] = 0x10; - rq->cmd[8] = len; break; case INQUIRY: len = CLARIION_BUFFER_SIZE; - rq->cmd[4] = len; memset(buffer, 0, len); break; default: @@ -304,6 +301,7 @@ static struct request *get_req(struct scsi_device *sdev, int cmd, break; } + rq->cmd[4] = len; rq->cmd_type = REQ_TYPE_BLOCK_PC; rq->cmd_flags |= REQ_FAILFAST_DEV | REQ_FAILFAST_TRANSPORT | REQ_FAILFAST_DRIVER; diff --git a/trunk/drivers/scsi/hpsa.c b/trunk/drivers/scsi/hpsa.c index 183d3a43c280..03697ba94251 100644 --- a/trunk/drivers/scsi/hpsa.c +++ b/trunk/drivers/scsi/hpsa.c @@ -43,7 +43,6 @@ #include #include #include -#include #include #include #include @@ -53,7 +52,7 @@ #include "hpsa.h" /* HPSA_DRIVER_VERSION must be 3 byte values (0-255) separated by '.' */ -#define HPSA_DRIVER_VERSION "2.0.2-1" +#define HPSA_DRIVER_VERSION "2.0.1-3" #define DRIVER_NAME "HP HPSA Driver (v " HPSA_DRIVER_VERSION ")" /* How long to wait (in milliseconds) for board to go into simple mode */ @@ -135,8 +134,6 @@ static int hpsa_scsi_queue_command(struct scsi_cmnd *cmd, static void hpsa_scan_start(struct Scsi_Host *); static int hpsa_scan_finished(struct Scsi_Host *sh, unsigned long elapsed_time); -static int hpsa_change_queue_depth(struct scsi_device *sdev, - int qdepth, int reason); static int hpsa_eh_device_reset_handler(struct scsi_cmnd *scsicmd); static int hpsa_slave_alloc(struct scsi_device *sdev); @@ -185,8 +182,8 @@ static struct scsi_host_template hpsa_driver_template = { .queuecommand = hpsa_scsi_queue_command, .scan_start = hpsa_scan_start, .scan_finished = hpsa_scan_finished, - .change_queue_depth = hpsa_change_queue_depth, .this_id = -1, + .sg_tablesize = MAXSGENTRIES, .use_clustering = ENABLE_CLUSTERING, .eh_device_reset_handler = hpsa_eh_device_reset_handler, .ioctl = hpsa_ioctl, @@ -211,6 +208,133 @@ static inline struct ctlr_info *shost_to_hba(struct Scsi_Host *sh) return (struct ctlr_info *) *priv; } +static struct task_struct *hpsa_scan_thread; +static DEFINE_MUTEX(hpsa_scan_mutex); +static LIST_HEAD(hpsa_scan_q); +static int hpsa_scan_func(void *data); + +/** + * add_to_scan_list() - add controller to rescan queue + * @h: Pointer to the controller. + * + * Adds the controller to the rescan queue if not already on the queue. + * + * returns 1 if added to the queue, 0 if skipped (could be on the + * queue already, or the controller could be initializing or shutting + * down). + **/ +static int add_to_scan_list(struct ctlr_info *h) +{ + struct ctlr_info *test_h; + int found = 0; + int ret = 0; + + if (h->busy_initializing) + return 0; + + /* + * If we don't get the lock, it means the driver is unloading + * and there's no point in scheduling a new scan. + */ + if (!mutex_trylock(&h->busy_shutting_down)) + return 0; + + mutex_lock(&hpsa_scan_mutex); + list_for_each_entry(test_h, &hpsa_scan_q, scan_list) { + if (test_h == h) { + found = 1; + break; + } + } + if (!found && !h->busy_scanning) { + INIT_COMPLETION(h->scan_wait); + list_add_tail(&h->scan_list, &hpsa_scan_q); + ret = 1; + } + mutex_unlock(&hpsa_scan_mutex); + mutex_unlock(&h->busy_shutting_down); + + return ret; +} + +/** + * remove_from_scan_list() - remove controller from rescan queue + * @h: Pointer to the controller. + * + * Removes the controller from the rescan queue if present. Blocks if + * the controller is currently conducting a rescan. The controller + * can be in one of three states: + * 1. Doesn't need a scan + * 2. On the scan list, but not scanning yet (we remove it) + * 3. Busy scanning (and not on the list). In this case we want to wait for + * the scan to complete to make sure the scanning thread for this + * controller is completely idle. + **/ +static void remove_from_scan_list(struct ctlr_info *h) +{ + struct ctlr_info *test_h, *tmp_h; + + mutex_lock(&hpsa_scan_mutex); + list_for_each_entry_safe(test_h, tmp_h, &hpsa_scan_q, scan_list) { + if (test_h == h) { /* state 2. */ + list_del(&h->scan_list); + complete_all(&h->scan_wait); + mutex_unlock(&hpsa_scan_mutex); + return; + } + } + if (h->busy_scanning) { /* state 3. */ + mutex_unlock(&hpsa_scan_mutex); + wait_for_completion(&h->scan_wait); + } else { /* state 1, nothing to do. */ + mutex_unlock(&hpsa_scan_mutex); + } +} + +/* hpsa_scan_func() - kernel thread used to rescan controllers + * @data: Ignored. + * + * A kernel thread used scan for drive topology changes on + * controllers. The thread processes only one controller at a time + * using a queue. Controllers are added to the queue using + * add_to_scan_list() and removed from the queue either after done + * processing or using remove_from_scan_list(). + * + * returns 0. + **/ +static int hpsa_scan_func(__attribute__((unused)) void *data) +{ + struct ctlr_info *h; + int host_no; + + while (1) { + set_current_state(TASK_INTERRUPTIBLE); + schedule(); + if (kthread_should_stop()) + break; + + while (1) { + mutex_lock(&hpsa_scan_mutex); + if (list_empty(&hpsa_scan_q)) { + mutex_unlock(&hpsa_scan_mutex); + break; + } + h = list_entry(hpsa_scan_q.next, struct ctlr_info, + scan_list); + list_del(&h->scan_list); + h->busy_scanning = 1; + mutex_unlock(&hpsa_scan_mutex); + host_no = h->scsi_host ? h->scsi_host->host_no : -1; + hpsa_scan_start(h->scsi_host); + complete_all(&h->scan_wait); + mutex_lock(&hpsa_scan_mutex); + h->busy_scanning = 0; + mutex_unlock(&hpsa_scan_mutex); + } + } + return 0; +} + static int check_for_unit_attention(struct ctlr_info *h, struct CommandList *c) { @@ -228,8 +352,21 @@ static int check_for_unit_attention(struct ctlr_info *h, break; case REPORT_LUNS_CHANGED: dev_warn(&h->pdev->dev, "hpsa%d: report LUN data " - "changed, action required\n", h->ctlr); + "changed\n", h->ctlr); /* + * Here, we could call add_to_scan_list and wake up the scan thread, + * except that it's quite likely that we will get more than one + * REPORT_LUNS_CHANGED condition in quick succession, which means + * that those which occur after the first one will likely happen + * *during* the hpsa_scan_thread's rescan. And the rescan code is not + * robust enough to restart in the middle, undoing what it has already + * done, and it's not clear that it's even possible to do this, since + * part of what it does is notify the SCSI mid layer, which starts + * doing it's own i/o to read partition tables and so on, and the + * driver doesn't have visibility to know what might need undoing. + * In any event, if possible, it is horribly complicated to get right + * so we just don't do it for now. + * * Note: this REPORT_LUNS_CHANGED condition only occurs on the MSA2012. */ break; @@ -256,7 +393,10 @@ static ssize_t host_store_rescan(struct device *dev, struct ctlr_info *h; struct Scsi_Host *shost = class_to_shost(dev); h = shost_to_hba(shost); - hpsa_scan_start(h->scsi_host); + if (add_to_scan_list(h)) { + wake_up_process(hpsa_scan_thread); + wait_for_completion_interruptible(&h->scan_wait); + } return count; } @@ -843,76 +983,6 @@ static void hpsa_scsi_setup(struct ctlr_info *h) spin_lock_init(&h->devlock); } -static void hpsa_free_sg_chain_blocks(struct ctlr_info *h) -{ - int i; - - if (!h->cmd_sg_list) - return; - for (i = 0; i < h->nr_cmds; i++) { - kfree(h->cmd_sg_list[i]); - h->cmd_sg_list[i] = NULL; - } - kfree(h->cmd_sg_list); - h->cmd_sg_list = NULL; -} - -static int hpsa_allocate_sg_chain_blocks(struct ctlr_info *h) -{ - int i; - - if (h->chainsize <= 0) - return 0; - - h->cmd_sg_list = kzalloc(sizeof(*h->cmd_sg_list) * h->nr_cmds, - GFP_KERNEL); - if (!h->cmd_sg_list) - return -ENOMEM; - for (i = 0; i < h->nr_cmds; i++) { - h->cmd_sg_list[i] = kmalloc(sizeof(*h->cmd_sg_list[i]) * - h->chainsize, GFP_KERNEL); - if (!h->cmd_sg_list[i]) - goto clean; - } - return 0; - -clean: - hpsa_free_sg_chain_blocks(h); - return -ENOMEM; -} - -static void hpsa_map_sg_chain_block(struct ctlr_info *h, - struct CommandList *c) -{ - struct SGDescriptor *chain_sg, *chain_block; - u64 temp64; - - chain_sg = &c->SG[h->max_cmd_sg_entries - 1]; - chain_block = h->cmd_sg_list[c->cmdindex]; - chain_sg->Ext = HPSA_SG_CHAIN; - chain_sg->Len = sizeof(*chain_sg) * - (c->Header.SGTotal - h->max_cmd_sg_entries); - temp64 = pci_map_single(h->pdev, chain_block, chain_sg->Len, - PCI_DMA_TODEVICE); - chain_sg->Addr.lower = (u32) (temp64 & 0x0FFFFFFFFULL); - chain_sg->Addr.upper = (u32) ((temp64 >> 32) & 0x0FFFFFFFFULL); -} - -static void hpsa_unmap_sg_chain_block(struct ctlr_info *h, - struct CommandList *c) -{ - struct SGDescriptor *chain_sg; - union u64bit temp64; - - if (c->Header.SGTotal <= h->max_cmd_sg_entries) - return; - - chain_sg = &c->SG[h->max_cmd_sg_entries - 1]; - temp64.val32.lower = chain_sg->Addr.lower; - temp64.val32.upper = chain_sg->Addr.upper; - pci_unmap_single(h->pdev, temp64.val, chain_sg->Len, PCI_DMA_TODEVICE); -} - static void complete_scsi_command(struct CommandList *cp, int timeout, u32 tag) { @@ -929,12 +999,10 @@ static void complete_scsi_command(struct CommandList *cp, h = cp->h; scsi_dma_unmap(cmd); /* undo the DMA mappings */ - if (cp->Header.SGTotal > h->max_cmd_sg_entries) - hpsa_unmap_sg_chain_block(h, cp); cmd->result = (DID_OK << 16); /* host byte */ cmd->result |= (COMMAND_COMPLETE << 8); /* msg byte */ - cmd->result |= ei->ScsiStatus; + cmd->result |= (ei->ScsiStatus << 1); /* copy the sense data whether we need to or not. */ memcpy(cmd->sense_buffer, ei->SenseInfo, @@ -1135,7 +1203,6 @@ static int hpsa_scsi_detect(struct ctlr_info *h) sh->max_id = HPSA_MAX_LUN; sh->can_queue = h->nr_cmds; sh->cmd_per_lun = h->nr_cmds; - sh->sg_tablesize = h->maxsgentries; h->scsi_host = sh; sh->hostdata[0] = (unsigned long) h; sh->irq = h->intr[PERF_MODE_INT]; @@ -1315,7 +1382,7 @@ static int hpsa_send_reset(struct ctlr_info *h, unsigned char *scsi3addr) if (c == NULL) { /* trouble... */ dev_warn(&h->pdev->dev, "cmd_special_alloc returned NULL!\n"); - return -ENOMEM; + return -1; } fill_cmd(c, HPSA_DEVICE_RESET_MSG, h, NULL, 0, 0, scsi3addr, TYPE_MSG); @@ -1837,17 +1904,16 @@ static void hpsa_update_scsi_devices(struct ctlr_info *h, int hostno) * dma mapping and fills in the scatter gather entries of the * hpsa command, cp. */ -static int hpsa_scatter_gather(struct ctlr_info *h, +static int hpsa_scatter_gather(struct pci_dev *pdev, struct CommandList *cp, struct scsi_cmnd *cmd) { unsigned int len; struct scatterlist *sg; u64 addr64; - int use_sg, i, sg_index, chained; - struct SGDescriptor *curr_sg; + int use_sg, i; - BUG_ON(scsi_sg_count(cmd) > h->maxsgentries); + BUG_ON(scsi_sg_count(cmd) > MAXSGENTRIES); use_sg = scsi_dma_map(cmd); if (use_sg < 0) @@ -1856,33 +1922,15 @@ static int hpsa_scatter_gather(struct ctlr_info *h, if (!use_sg) goto sglist_finished; - curr_sg = cp->SG; - chained = 0; - sg_index = 0; scsi_for_each_sg(cmd, sg, use_sg, i) { - if (i == h->max_cmd_sg_entries - 1 && - use_sg > h->max_cmd_sg_entries) { - chained = 1; - curr_sg = h->cmd_sg_list[cp->cmdindex]; - sg_index = 0; - } addr64 = (u64) sg_dma_address(sg); len = sg_dma_len(sg); - curr_sg->Addr.lower = (u32) (addr64 & 0x0FFFFFFFFULL); - curr_sg->Addr.upper = (u32) ((addr64 >> 32) & 0x0FFFFFFFFULL); - curr_sg->Len = len; - curr_sg->Ext = 0; /* we are not chaining */ - curr_sg++; - } - - if (use_sg + chained > h->maxSG) - h->maxSG = use_sg + chained; - - if (chained) { - cp->Header.SGList = h->max_cmd_sg_entries; - cp->Header.SGTotal = (u16) (use_sg + 1); - hpsa_map_sg_chain_block(h, cp); - return 0; + cp->SG[i].Addr.lower = + (u32) (addr64 & (u64) 0x00000000FFFFFFFF); + cp->SG[i].Addr.upper = + (u32) ((addr64 >> 32) & (u64) 0x00000000FFFFFFFF); + cp->SG[i].Len = len; + cp->SG[i].Ext = 0; /* we are not chaining */ } sglist_finished: @@ -1978,7 +2026,7 @@ static int hpsa_scsi_queue_command(struct scsi_cmnd *cmd, break; } - if (hpsa_scatter_gather(h, c, cmd) < 0) { /* Fill SG list */ + if (hpsa_scatter_gather(h->pdev, c, cmd) < 0) { /* Fill SG list */ cmd_free(h, c); return SCSI_MLQUEUE_HOST_BUSY; } @@ -2029,23 +2077,6 @@ static int hpsa_scan_finished(struct Scsi_Host *sh, return finished; } -static int hpsa_change_queue_depth(struct scsi_device *sdev, - int qdepth, int reason) -{ - struct ctlr_info *h = sdev_to_hba(sdev); - - if (reason != SCSI_QDEPTH_DEFAULT) - return -ENOTSUPP; - - if (qdepth < 1) - qdepth = 1; - else - if (qdepth > h->nr_cmds) - qdepth = h->nr_cmds; - scsi_adjust_queue_depth(sdev, scsi_get_tag_type(sdev), qdepth); - return sdev->queue_depth; -} - static void hpsa_unregister_scsi(struct ctlr_info *h) { /* we are being forcibly unloaded, and may not refuse. */ @@ -2930,7 +2961,7 @@ static irqreturn_t do_hpsa_intr(int irq, void *dev_id) return IRQ_HANDLED; } -/* Send a message CDB to the firmware. */ +/* Send a message CDB to the firmwart. */ static __devinit int hpsa_message(struct pci_dev *pdev, unsigned char opcode, unsigned char type) { @@ -3265,7 +3296,7 @@ static void __devinit hpsa_interrupt_mode(struct ctlr_info *h, h->intr[PERF_MODE_INT] = pdev->irq; } -static int __devinit hpsa_pci_init(struct ctlr_info *h, struct pci_dev *pdev) +static int hpsa_pci_init(struct ctlr_info *h, struct pci_dev *pdev) { ushort subsystem_vendor_id, subsystem_device_id, command; u32 board_id, scratchpad = 0; @@ -3374,23 +3405,6 @@ static int __devinit hpsa_pci_init(struct ctlr_info *h, struct pci_dev *pdev) h->board_id = board_id; h->max_commands = readl(&(h->cfgtable->MaxPerformantModeCommands)); - h->maxsgentries = readl(&(h->cfgtable->MaxScatterGatherElements)); - - /* - * Limit in-command s/g elements to 32 save dma'able memory. - * Howvever spec says if 0, use 31 - */ - - h->max_cmd_sg_entries = 31; - if (h->maxsgentries > 512) { - h->max_cmd_sg_entries = 32; - h->chainsize = h->maxsgentries - h->max_cmd_sg_entries + 1; - h->maxsgentries--; /* save one for chain pointer */ - } else { - h->maxsgentries = 31; /* default to traditional values */ - h->chainsize = 0; - } - h->product_name = products[prod_index].product_name; h->access = *(products[prod_index].access); /* Allow room for some ioctls */ @@ -3518,6 +3532,8 @@ static int __devinit hpsa_init_one(struct pci_dev *pdev, h->busy_initializing = 1; INIT_HLIST_HEAD(&h->cmpQ); INIT_HLIST_HEAD(&h->reqQ); + mutex_init(&h->busy_shutting_down); + init_completion(&h->scan_wait); rc = hpsa_pci_init(h, pdev); if (rc != 0) goto clean1; @@ -3571,8 +3587,6 @@ static int __devinit hpsa_init_one(struct pci_dev *pdev, rc = -ENOMEM; goto clean4; } - if (hpsa_allocate_sg_chain_blocks(h)) - goto clean4; spin_lock_init(&h->lock); spin_lock_init(&h->scan_lock); init_waitqueue_head(&h->scan_wait_queue); @@ -3595,7 +3609,6 @@ static int __devinit hpsa_init_one(struct pci_dev *pdev, return 1; clean4: - hpsa_free_sg_chain_blocks(h); kfree(h->cmd_pool_bits); if (h->cmd_pool) pci_free_consistent(h->pdev, @@ -3668,10 +3681,11 @@ static void __devexit hpsa_remove_one(struct pci_dev *pdev) return; } h = pci_get_drvdata(pdev); + mutex_lock(&h->busy_shutting_down); + remove_from_scan_list(h); hpsa_unregister_scsi(h); /* unhook from SCSI subsystem */ hpsa_shutdown(pdev); iounmap(h->vaddr); - hpsa_free_sg_chain_blocks(h); pci_free_consistent(h->pdev, h->nr_cmds * sizeof(struct CommandList), h->cmd_pool, h->cmd_pool_dhandle); @@ -3689,6 +3703,7 @@ static void __devexit hpsa_remove_one(struct pci_dev *pdev) */ pci_release_regions(pdev); pci_set_drvdata(pdev, NULL); + mutex_unlock(&h->busy_shutting_down); kfree(h); } @@ -3842,12 +3857,23 @@ static void hpsa_put_ctlr_into_performant_mode(struct ctlr_info *h) */ static int __init hpsa_init(void) { - return pci_register_driver(&hpsa_pci_driver); + int err; + /* Start the scan thread */ + hpsa_scan_thread = kthread_run(hpsa_scan_func, NULL, "hpsa_scan"); + if (IS_ERR(hpsa_scan_thread)) { + err = PTR_ERR(hpsa_scan_thread); + return -ENODEV; + } + err = pci_register_driver(&hpsa_pci_driver); + if (err) + kthread_stop(hpsa_scan_thread); + return err; } static void __exit hpsa_cleanup(void) { pci_unregister_driver(&hpsa_pci_driver); + kthread_stop(hpsa_scan_thread); } module_init(hpsa_init); diff --git a/trunk/drivers/scsi/hpsa.h b/trunk/drivers/scsi/hpsa.h index 1bb5233b09a0..a0502b3ac17e 100644 --- a/trunk/drivers/scsi/hpsa.h +++ b/trunk/drivers/scsi/hpsa.h @@ -83,10 +83,6 @@ struct ctlr_info { unsigned int maxQsinceinit; unsigned int maxSG; spinlock_t lock; - int maxsgentries; - u8 max_cmd_sg_entries; - int chainsize; - struct SGDescriptor **cmd_sg_list; /* pointers to command and error info pool */ struct CommandList *cmd_pool; @@ -101,6 +97,9 @@ struct ctlr_info { int scan_finished; spinlock_t scan_lock; wait_queue_head_t scan_wait_queue; + struct mutex busy_shutting_down; + struct list_head scan_list; + struct completion scan_wait; struct Scsi_Host *scsi_host; spinlock_t devlock; /* to protect hba[ctlr]->dev[]; */ diff --git a/trunk/drivers/scsi/hpsa_cmd.h b/trunk/drivers/scsi/hpsa_cmd.h index 56fb9827681e..3e0abdf76689 100644 --- a/trunk/drivers/scsi/hpsa_cmd.h +++ b/trunk/drivers/scsi/hpsa_cmd.h @@ -23,8 +23,7 @@ /* general boundary defintions */ #define SENSEINFOBYTES 32 /* may vary between hbas */ -#define MAXSGENTRIES 32 -#define HPSA_SG_CHAIN 0x80000000 +#define MAXSGENTRIES 31 #define MAXREPLYQS 256 /* Command Status value */ @@ -306,23 +305,20 @@ struct CommandList { int cmd_type; long cmdindex; struct hlist_node list; + struct CommandList *prev; + struct CommandList *next; struct request *rq; struct completion *waiting; + int retry_count; void *scsi_cmd; /* on 64 bit architectures, to get this to be 32-byte-aligned - * it so happens we need PAD_64 bytes of padding, on 32 bit systems, - * we need PAD_32 bytes of padding (see below). This does that. - * If it happens that 64 bit and 32 bit systems need different - * padding, PAD_32 and PAD_64 can be set independently, and. - * the code below will do the right thing. + * it so happens we need no padding, on 32 bit systems, + * we need 8 bytes of padding. This does that. */ -#define IS_32_BIT ((8 - sizeof(long))/4) -#define IS_64_BIT (!IS_32_BIT) -#define PAD_32 (4) -#define PAD_64 (4) -#define COMMANDLIST_PAD (IS_32_BIT * PAD_32 + IS_64_BIT * PAD_64) +#define COMMANDLIST_PAD ((8 - sizeof(long))/4 * 8) u8 pad[COMMANDLIST_PAD]; + }; /* Configuration Table Structure */ diff --git a/trunk/drivers/scsi/ibmvscsi/ibmvfc.c b/trunk/drivers/scsi/ibmvscsi/ibmvfc.c index 4e577e2fee38..732f6d35b4a8 100644 --- a/trunk/drivers/scsi/ibmvscsi/ibmvfc.c +++ b/trunk/drivers/scsi/ibmvscsi/ibmvfc.c @@ -29,7 +29,6 @@ #include #include #include -#include #include #include #include @@ -4736,27 +4735,6 @@ static int ibmvfc_remove(struct vio_dev *vdev) return 0; } -/** - * ibmvfc_resume - Resume from suspend - * @dev: device struct - * - * We may have lost an interrupt across suspend/resume, so kick the - * interrupt handler - * - */ -static int ibmvfc_resume(struct device *dev) -{ - unsigned long flags; - struct ibmvfc_host *vhost = dev_get_drvdata(dev); - struct vio_dev *vdev = to_vio_dev(dev); - - spin_lock_irqsave(vhost->host->host_lock, flags); - vio_disable_interrupts(vdev); - tasklet_schedule(&vhost->tasklet); - spin_unlock_irqrestore(vhost->host->host_lock, flags); - return 0; -} - /** * ibmvfc_get_desired_dma - Calculate DMA resources needed by the driver * @vdev: vio device struct @@ -4777,10 +4755,6 @@ static struct vio_device_id ibmvfc_device_table[] __devinitdata = { }; MODULE_DEVICE_TABLE(vio, ibmvfc_device_table); -static struct dev_pm_ops ibmvfc_pm_ops = { - .resume = ibmvfc_resume -}; - static struct vio_driver ibmvfc_driver = { .id_table = ibmvfc_device_table, .probe = ibmvfc_probe, @@ -4789,7 +4763,6 @@ static struct vio_driver ibmvfc_driver = { .driver = { .name = IBMVFC_NAME, .owner = THIS_MODULE, - .pm = &ibmvfc_pm_ops, } }; diff --git a/trunk/drivers/scsi/ibmvscsi/ibmvscsi.c b/trunk/drivers/scsi/ibmvscsi/ibmvscsi.c index dc1bcbe3b176..e3a18e0ef276 100644 --- a/trunk/drivers/scsi/ibmvscsi/ibmvscsi.c +++ b/trunk/drivers/scsi/ibmvscsi/ibmvscsi.c @@ -71,7 +71,6 @@ #include #include #include -#include #include #include #include @@ -1991,19 +1990,6 @@ static int ibmvscsi_remove(struct vio_dev *vdev) return 0; } -/** - * ibmvscsi_resume: Resume from suspend - * @dev: device struct - * - * We may have lost an interrupt across suspend/resume, so kick the - * interrupt handler - */ -static int ibmvscsi_resume(struct device *dev) -{ - struct ibmvscsi_host_data *hostdata = dev_get_drvdata(dev); - return ibmvscsi_ops->resume(hostdata); -} - /** * ibmvscsi_device_table: Used by vio.c to match devices in the device tree we * support. @@ -2014,10 +2000,6 @@ static struct vio_device_id ibmvscsi_device_table[] __devinitdata = { }; MODULE_DEVICE_TABLE(vio, ibmvscsi_device_table); -static struct dev_pm_ops ibmvscsi_pm_ops = { - .resume = ibmvscsi_resume -}; - static struct vio_driver ibmvscsi_driver = { .id_table = ibmvscsi_device_table, .probe = ibmvscsi_probe, @@ -2026,7 +2008,6 @@ static struct vio_driver ibmvscsi_driver = { .driver = { .name = "ibmvscsi", .owner = THIS_MODULE, - .pm = &ibmvscsi_pm_ops, } }; diff --git a/trunk/drivers/scsi/ibmvscsi/ibmvscsi.h b/trunk/drivers/scsi/ibmvscsi/ibmvscsi.h index 9cb7c6a773e1..76425303def0 100644 --- a/trunk/drivers/scsi/ibmvscsi/ibmvscsi.h +++ b/trunk/drivers/scsi/ibmvscsi/ibmvscsi.h @@ -120,7 +120,6 @@ struct ibmvscsi_ops { struct ibmvscsi_host_data *hostdata); int (*send_crq)(struct ibmvscsi_host_data *hostdata, u64 word1, u64 word2); - int (*resume) (struct ibmvscsi_host_data *hostdata); }; extern struct ibmvscsi_ops iseriesvscsi_ops; diff --git a/trunk/drivers/scsi/ibmvscsi/iseries_vscsi.c b/trunk/drivers/scsi/ibmvscsi/iseries_vscsi.c index f4776451a754..0775fdee5fa8 100644 --- a/trunk/drivers/scsi/ibmvscsi/iseries_vscsi.c +++ b/trunk/drivers/scsi/ibmvscsi/iseries_vscsi.c @@ -158,16 +158,10 @@ static int iseriesvscsi_send_crq(struct ibmvscsi_host_data *hostdata, 0); } -static int iseriesvscsi_resume(struct ibmvscsi_host_data *hostdata) -{ - return 0; -} - struct ibmvscsi_ops iseriesvscsi_ops = { .init_crq_queue = iseriesvscsi_init_crq_queue, .release_crq_queue = iseriesvscsi_release_crq_queue, .reset_crq_queue = iseriesvscsi_reset_crq_queue, .reenable_crq_queue = iseriesvscsi_reenable_crq_queue, .send_crq = iseriesvscsi_send_crq, - .resume = iseriesvscsi_resume, }; diff --git a/trunk/drivers/scsi/ibmvscsi/rpa_vscsi.c b/trunk/drivers/scsi/ibmvscsi/rpa_vscsi.c index 63a30cbbf9de..462a8574dad9 100644 --- a/trunk/drivers/scsi/ibmvscsi/rpa_vscsi.c +++ b/trunk/drivers/scsi/ibmvscsi/rpa_vscsi.c @@ -334,23 +334,10 @@ static int rpavscsi_reenable_crq_queue(struct crq_queue *queue, return rc; } -/** - * rpavscsi_resume: - resume after suspend - * @hostdata: ibmvscsi_host_data of host - * - */ -static int rpavscsi_resume(struct ibmvscsi_host_data *hostdata) -{ - vio_disable_interrupts(to_vio_dev(hostdata->dev)); - tasklet_schedule(&hostdata->srp_task); - return 0; -} - struct ibmvscsi_ops rpavscsi_ops = { .init_crq_queue = rpavscsi_init_crq_queue, .release_crq_queue = rpavscsi_release_crq_queue, .reset_crq_queue = rpavscsi_reset_crq_queue, .reenable_crq_queue = rpavscsi_reenable_crq_queue, .send_crq = rpavscsi_send_crq, - .resume = rpavscsi_resume, }; diff --git a/trunk/drivers/scsi/ipr.c b/trunk/drivers/scsi/ipr.c index c79cd98eb6bf..032f0d0e6cb4 100644 --- a/trunk/drivers/scsi/ipr.c +++ b/trunk/drivers/scsi/ipr.c @@ -72,8 +72,6 @@ #include #include #include -#include -#include #include #include #include @@ -93,8 +91,8 @@ static unsigned int ipr_max_speed = 1; static int ipr_testmode = 0; static unsigned int ipr_fastfail = 0; static unsigned int ipr_transop_timeout = 0; +static unsigned int ipr_enable_cache = 1; static unsigned int ipr_debug = 0; -static unsigned int ipr_max_devs = IPR_DEFAULT_SIS64_DEVS; static unsigned int ipr_dual_ioa_raid = 1; static DEFINE_SPINLOCK(ipr_driver_lock); @@ -106,20 +104,13 @@ static const struct ipr_chip_cfg_t ipr_chip_cfg[] = { { .set_interrupt_mask_reg = 0x0022C, .clr_interrupt_mask_reg = 0x00230, - .clr_interrupt_mask_reg32 = 0x00230, .sense_interrupt_mask_reg = 0x0022C, - .sense_interrupt_mask_reg32 = 0x0022C, .clr_interrupt_reg = 0x00228, - .clr_interrupt_reg32 = 0x00228, .sense_interrupt_reg = 0x00224, - .sense_interrupt_reg32 = 0x00224, .ioarrin_reg = 0x00404, .sense_uproc_interrupt_reg = 0x00214, - .sense_uproc_interrupt_reg32 = 0x00214, .set_uproc_interrupt_reg = 0x00214, - .set_uproc_interrupt_reg32 = 0x00214, - .clr_uproc_interrupt_reg = 0x00218, - .clr_uproc_interrupt_reg32 = 0x00218 + .clr_uproc_interrupt_reg = 0x00218 } }, { /* Snipe and Scamp */ @@ -128,59 +119,25 @@ static const struct ipr_chip_cfg_t ipr_chip_cfg[] = { { .set_interrupt_mask_reg = 0x00288, .clr_interrupt_mask_reg = 0x0028C, - .clr_interrupt_mask_reg32 = 0x0028C, .sense_interrupt_mask_reg = 0x00288, - .sense_interrupt_mask_reg32 = 0x00288, .clr_interrupt_reg = 0x00284, - .clr_interrupt_reg32 = 0x00284, .sense_interrupt_reg = 0x00280, - .sense_interrupt_reg32 = 0x00280, .ioarrin_reg = 0x00504, .sense_uproc_interrupt_reg = 0x00290, - .sense_uproc_interrupt_reg32 = 0x00290, .set_uproc_interrupt_reg = 0x00290, - .set_uproc_interrupt_reg32 = 0x00290, - .clr_uproc_interrupt_reg = 0x00294, - .clr_uproc_interrupt_reg32 = 0x00294 - } - }, - { /* CRoC */ - .mailbox = 0x00040, - .cache_line_size = 0x20, - { - .set_interrupt_mask_reg = 0x00010, - .clr_interrupt_mask_reg = 0x00018, - .clr_interrupt_mask_reg32 = 0x0001C, - .sense_interrupt_mask_reg = 0x00010, - .sense_interrupt_mask_reg32 = 0x00014, - .clr_interrupt_reg = 0x00008, - .clr_interrupt_reg32 = 0x0000C, - .sense_interrupt_reg = 0x00000, - .sense_interrupt_reg32 = 0x00004, - .ioarrin_reg = 0x00070, - .sense_uproc_interrupt_reg = 0x00020, - .sense_uproc_interrupt_reg32 = 0x00024, - .set_uproc_interrupt_reg = 0x00020, - .set_uproc_interrupt_reg32 = 0x00024, - .clr_uproc_interrupt_reg = 0x00028, - .clr_uproc_interrupt_reg32 = 0x0002C, - .init_feedback_reg = 0x0005C, - .dump_addr_reg = 0x00064, - .dump_data_reg = 0x00068 + .clr_uproc_interrupt_reg = 0x00294 } }, }; static const struct ipr_chip_t ipr_chip[] = { - { PCI_VENDOR_ID_MYLEX, PCI_DEVICE_ID_IBM_GEMSTONE, IPR_USE_LSI, IPR_SIS32, &ipr_chip_cfg[0] }, - { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CITRINE, IPR_USE_LSI, IPR_SIS32, &ipr_chip_cfg[0] }, - { PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_OBSIDIAN, IPR_USE_LSI, IPR_SIS32, &ipr_chip_cfg[0] }, - { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_OBSIDIAN, IPR_USE_LSI, IPR_SIS32, &ipr_chip_cfg[0] }, - { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_OBSIDIAN_E, IPR_USE_MSI, IPR_SIS32, &ipr_chip_cfg[0] }, - { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_SNIPE, IPR_USE_LSI, IPR_SIS32, &ipr_chip_cfg[1] }, - { PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_SCAMP, IPR_USE_LSI, IPR_SIS32, &ipr_chip_cfg[1] }, - { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CROC_FPGA_E2, IPR_USE_MSI, IPR_SIS64, &ipr_chip_cfg[2] }, - { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CROC_ASIC_E2, IPR_USE_MSI, IPR_SIS64, &ipr_chip_cfg[2] } + { PCI_VENDOR_ID_MYLEX, PCI_DEVICE_ID_IBM_GEMSTONE, IPR_USE_LSI, &ipr_chip_cfg[0] }, + { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CITRINE, IPR_USE_LSI, &ipr_chip_cfg[0] }, + { PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_OBSIDIAN, IPR_USE_LSI, &ipr_chip_cfg[0] }, + { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_OBSIDIAN, IPR_USE_LSI, &ipr_chip_cfg[0] }, + { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_OBSIDIAN_E, IPR_USE_MSI, &ipr_chip_cfg[0] }, + { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_SNIPE, IPR_USE_LSI, &ipr_chip_cfg[1] }, + { PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_SCAMP, IPR_USE_LSI, &ipr_chip_cfg[1] } }; static int ipr_max_bus_speeds [] = { @@ -199,13 +156,12 @@ module_param_named(fastfail, ipr_fastfail, int, S_IRUGO | S_IWUSR); MODULE_PARM_DESC(fastfail, "Reduce timeouts and retries"); module_param_named(transop_timeout, ipr_transop_timeout, int, 0); MODULE_PARM_DESC(transop_timeout, "Time in seconds to wait for adapter to come operational (default: 300)"); +module_param_named(enable_cache, ipr_enable_cache, int, 0); +MODULE_PARM_DESC(enable_cache, "Enable adapter's non-volatile write cache (default: 1)"); module_param_named(debug, ipr_debug, int, S_IRUGO | S_IWUSR); MODULE_PARM_DESC(debug, "Enable device driver debugging logging. Set to 1 to enable. (default: 0)"); module_param_named(dual_ioa_raid, ipr_dual_ioa_raid, int, 0); MODULE_PARM_DESC(dual_ioa_raid, "Enable dual adapter RAID support. Set to 1 to enable. (default: 1)"); -module_param_named(max_devs, ipr_max_devs, int, 0); -MODULE_PARM_DESC(max_devs, "Specify the maximum number of physical devices. " - "[Default=" __stringify(IPR_DEFAULT_SIS64_DEVS) "]"); MODULE_LICENSE("GPL"); MODULE_VERSION(IPR_DRIVER_VERSION); @@ -224,20 +180,6 @@ struct ipr_error_table_t ipr_error_table[] = { "FFFE: Soft device bus error recovered by the IOA"}, {0x01088100, 0, IPR_DEFAULT_LOG_LEVEL, "4101: Soft device bus fabric error"}, - {0x01100100, 0, IPR_DEFAULT_LOG_LEVEL, - "FFFC: Logical block guard error recovered by the device"}, - {0x01100300, 0, IPR_DEFAULT_LOG_LEVEL, - "FFFC: Logical block reference tag error recovered by the device"}, - {0x01108300, 0, IPR_DEFAULT_LOG_LEVEL, - "4171: Recovered scatter list tag / sequence number error"}, - {0x01109000, 0, IPR_DEFAULT_LOG_LEVEL, - "FF3D: Recovered logical block CRC error on IOA to Host transfer"}, - {0x01109200, 0, IPR_DEFAULT_LOG_LEVEL, - "4171: Recovered logical block sequence number error on IOA to Host transfer"}, - {0x0110A000, 0, IPR_DEFAULT_LOG_LEVEL, - "FFFD: Recovered logical block reference tag error detected by the IOA"}, - {0x0110A100, 0, IPR_DEFAULT_LOG_LEVEL, - "FFFD: Logical block guard error recovered by the IOA"}, {0x01170600, 0, IPR_DEFAULT_LOG_LEVEL, "FFF9: Device sector reassign successful"}, {0x01170900, 0, IPR_DEFAULT_LOG_LEVEL, @@ -294,28 +236,12 @@ struct ipr_error_table_t ipr_error_table[] = { "3120: SCSI bus is not operational"}, {0x04088100, 0, IPR_DEFAULT_LOG_LEVEL, "4100: Hard device bus fabric error"}, - {0x04100100, 0, IPR_DEFAULT_LOG_LEVEL, - "310C: Logical block guard error detected by the device"}, - {0x04100300, 0, IPR_DEFAULT_LOG_LEVEL, - "310C: Logical block reference tag error detected by the device"}, - {0x04108300, 1, IPR_DEFAULT_LOG_LEVEL, - "4170: Scatter list tag / sequence number error"}, - {0x04109000, 1, IPR_DEFAULT_LOG_LEVEL, - "8150: Logical block CRC error on IOA to Host transfer"}, - {0x04109200, 1, IPR_DEFAULT_LOG_LEVEL, - "4170: Logical block sequence number error on IOA to Host transfer"}, - {0x0410A000, 0, IPR_DEFAULT_LOG_LEVEL, - "310D: Logical block reference tag error detected by the IOA"}, - {0x0410A100, 0, IPR_DEFAULT_LOG_LEVEL, - "310D: Logical block guard error detected by the IOA"}, {0x04118000, 0, IPR_DEFAULT_LOG_LEVEL, "9000: IOA reserved area data check"}, {0x04118100, 0, IPR_DEFAULT_LOG_LEVEL, "9001: IOA reserved area invalid data pattern"}, {0x04118200, 0, IPR_DEFAULT_LOG_LEVEL, "9002: IOA reserved area LRC error"}, - {0x04118300, 1, IPR_DEFAULT_LOG_LEVEL, - "Hardware Error, IOA metadata access error"}, {0x04320000, 0, IPR_DEFAULT_LOG_LEVEL, "102E: Out of alternate sectors for disk storage"}, {0x04330000, 1, IPR_DEFAULT_LOG_LEVEL, @@ -380,8 +306,6 @@ struct ipr_error_table_t ipr_error_table[] = { "Illegal request, commands not allowed to this device"}, {0x05258100, 0, 0, "Illegal request, command not allowed to a secondary adapter"}, - {0x05258200, 0, 0, - "Illegal request, command not allowed to a non-optimized resource"}, {0x05260000, 0, 0, "Illegal request, invalid field in parameter list"}, {0x05260100, 0, 0, @@ -544,10 +468,7 @@ static void ipr_trc_hook(struct ipr_cmnd *ipr_cmd, trace_entry->time = jiffies; trace_entry->op_code = ipr_cmd->ioarcb.cmd_pkt.cdb[0]; trace_entry->type = type; - if (ipr_cmd->ioa_cfg->sis64) - trace_entry->ata_op_code = ipr_cmd->i.ata_ioadl.regs.command; - else - trace_entry->ata_op_code = ipr_cmd->ioarcb.u.add_data.u.regs.command; + trace_entry->ata_op_code = ipr_cmd->ioarcb.add_data.u.regs.command; trace_entry->cmd_index = ipr_cmd->cmd_index & 0xff; trace_entry->res_handle = ipr_cmd->ioarcb.res_handle; trace_entry->u.add_data = add_data; @@ -567,23 +488,16 @@ static void ipr_reinit_ipr_cmnd(struct ipr_cmnd *ipr_cmd) { struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb; struct ipr_ioasa *ioasa = &ipr_cmd->ioasa; - dma_addr_t dma_addr = ipr_cmd->dma_addr; + dma_addr_t dma_addr = be32_to_cpu(ioarcb->ioarcb_host_pci_addr); memset(&ioarcb->cmd_pkt, 0, sizeof(struct ipr_cmd_pkt)); - ioarcb->data_transfer_length = 0; + ioarcb->write_data_transfer_length = 0; ioarcb->read_data_transfer_length = 0; - ioarcb->ioadl_len = 0; + ioarcb->write_ioadl_len = 0; ioarcb->read_ioadl_len = 0; - - if (ipr_cmd->ioa_cfg->sis64) - ioarcb->u.sis64_addr_data.data_ioadl_addr = - cpu_to_be64(dma_addr + offsetof(struct ipr_cmnd, i.ioadl64)); - else { - ioarcb->write_ioadl_addr = - cpu_to_be32(dma_addr + offsetof(struct ipr_cmnd, i.ioadl)); - ioarcb->read_ioadl_addr = ioarcb->write_ioadl_addr; - } - + ioarcb->write_ioadl_addr = + cpu_to_be32(dma_addr + offsetof(struct ipr_cmnd, ioadl)); + ioarcb->read_ioadl_addr = ioarcb->write_ioadl_addr; ioasa->ioasc = 0; ioasa->residual_data_len = 0; ioasa->u.gata.status = 0; @@ -648,15 +562,10 @@ static void ipr_mask_and_clear_interrupts(struct ipr_ioa_cfg *ioa_cfg, ioa_cfg->allow_interrupts = 0; /* Set interrupt mask to stop all new interrupts */ - if (ioa_cfg->sis64) - writeq(~0, ioa_cfg->regs.set_interrupt_mask_reg); - else - writel(~0, ioa_cfg->regs.set_interrupt_mask_reg); + writel(~0, ioa_cfg->regs.set_interrupt_mask_reg); /* Clear any pending interrupts */ - if (ioa_cfg->sis64) - writel(~0, ioa_cfg->regs.clr_interrupt_reg); - writel(clr_ints, ioa_cfg->regs.clr_interrupt_reg32); + writel(clr_ints, ioa_cfg->regs.clr_interrupt_reg); int_reg = readl(ioa_cfg->regs.sense_interrupt_reg); } @@ -783,35 +692,6 @@ static void ipr_fail_all_ops(struct ipr_ioa_cfg *ioa_cfg) LEAVE; } -/** - * ipr_send_command - Send driver initiated requests. - * @ipr_cmd: ipr command struct - * - * This function sends a command to the adapter using the correct write call. - * In the case of sis64, calculate the ioarcb size required. Then or in the - * appropriate bits. - * - * Return value: - * none - **/ -static void ipr_send_command(struct ipr_cmnd *ipr_cmd) -{ - struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; - dma_addr_t send_dma_addr = ipr_cmd->dma_addr; - - if (ioa_cfg->sis64) { - /* The default size is 256 bytes */ - send_dma_addr |= 0x1; - - /* If the number of ioadls * size of ioadl > 128 bytes, - then use a 512 byte ioarcb */ - if (ipr_cmd->dma_use_sg * sizeof(struct ipr_ioadl64_desc) > 128 ) - send_dma_addr |= 0x4; - writeq(send_dma_addr, ioa_cfg->regs.ioarrin_reg); - } else - writel(send_dma_addr, ioa_cfg->regs.ioarrin_reg); -} - /** * ipr_do_req - Send driver initiated requests. * @ipr_cmd: ipr command struct @@ -844,8 +724,8 @@ static void ipr_do_req(struct ipr_cmnd *ipr_cmd, ipr_trc_hook(ipr_cmd, IPR_TRACE_START, 0); mb(); - - ipr_send_command(ipr_cmd); + writel(be32_to_cpu(ipr_cmd->ioarcb.ioarcb_host_pci_addr), + ioa_cfg->regs.ioarrin_reg); } /** @@ -866,51 +746,6 @@ static void ipr_internal_cmd_done(struct ipr_cmnd *ipr_cmd) complete(&ipr_cmd->completion); } -/** - * ipr_init_ioadl - initialize the ioadl for the correct SIS type - * @ipr_cmd: ipr command struct - * @dma_addr: dma address - * @len: transfer length - * @flags: ioadl flag value - * - * This function initializes an ioadl in the case where there is only a single - * descriptor. - * - * Return value: - * nothing - **/ -static void ipr_init_ioadl(struct ipr_cmnd *ipr_cmd, dma_addr_t dma_addr, - u32 len, int flags) -{ - struct ipr_ioadl_desc *ioadl = ipr_cmd->i.ioadl; - struct ipr_ioadl64_desc *ioadl64 = ipr_cmd->i.ioadl64; - - ipr_cmd->dma_use_sg = 1; - - if (ipr_cmd->ioa_cfg->sis64) { - ioadl64->flags = cpu_to_be32(flags); - ioadl64->data_len = cpu_to_be32(len); - ioadl64->address = cpu_to_be64(dma_addr); - - ipr_cmd->ioarcb.ioadl_len = - cpu_to_be32(sizeof(struct ipr_ioadl64_desc)); - ipr_cmd->ioarcb.data_transfer_length = cpu_to_be32(len); - } else { - ioadl->flags_and_data_len = cpu_to_be32(flags | len); - ioadl->address = cpu_to_be32(dma_addr); - - if (flags == IPR_IOADL_FLAGS_READ_LAST) { - ipr_cmd->ioarcb.read_ioadl_len = - cpu_to_be32(sizeof(struct ipr_ioadl_desc)); - ipr_cmd->ioarcb.read_data_transfer_length = cpu_to_be32(len); - } else { - ipr_cmd->ioarcb.ioadl_len = - cpu_to_be32(sizeof(struct ipr_ioadl_desc)); - ipr_cmd->ioarcb.data_transfer_length = cpu_to_be32(len); - } - } -} - /** * ipr_send_blocking_cmd - Send command and sleep on its completion. * @ipr_cmd: ipr command struct @@ -968,8 +803,11 @@ static void ipr_send_hcam(struct ipr_ioa_cfg *ioa_cfg, u8 type, ioarcb->cmd_pkt.cdb[7] = (sizeof(hostrcb->hcam) >> 8) & 0xff; ioarcb->cmd_pkt.cdb[8] = sizeof(hostrcb->hcam) & 0xff; - ipr_init_ioadl(ipr_cmd, hostrcb->hostrcb_dma, - sizeof(hostrcb->hcam), IPR_IOADL_FLAGS_READ_LAST); + ioarcb->read_data_transfer_length = cpu_to_be32(sizeof(hostrcb->hcam)); + ioarcb->read_ioadl_len = cpu_to_be32(sizeof(struct ipr_ioadl_desc)); + ipr_cmd->ioadl[0].flags_and_data_len = + cpu_to_be32(IPR_IOADL_FLAGS_READ_LAST | sizeof(hostrcb->hcam)); + ipr_cmd->ioadl[0].address = cpu_to_be32(hostrcb->hostrcb_dma); if (type == IPR_HCAM_CDB_OP_CODE_CONFIG_CHANGE) ipr_cmd->done = ipr_process_ccn; @@ -979,54 +817,22 @@ static void ipr_send_hcam(struct ipr_ioa_cfg *ioa_cfg, u8 type, ipr_trc_hook(ipr_cmd, IPR_TRACE_START, IPR_IOA_RES_ADDR); mb(); - - ipr_send_command(ipr_cmd); + writel(be32_to_cpu(ipr_cmd->ioarcb.ioarcb_host_pci_addr), + ioa_cfg->regs.ioarrin_reg); } else { list_add_tail(&hostrcb->queue, &ioa_cfg->hostrcb_free_q); } } -/** - * ipr_update_ata_class - Update the ata class in the resource entry - * @res: resource entry struct - * @proto: cfgte device bus protocol value - * - * Return value: - * none - **/ -static void ipr_update_ata_class(struct ipr_resource_entry *res, unsigned int proto) -{ - switch(proto) { - case IPR_PROTO_SATA: - case IPR_PROTO_SAS_STP: - res->ata_class = ATA_DEV_ATA; - break; - case IPR_PROTO_SATA_ATAPI: - case IPR_PROTO_SAS_STP_ATAPI: - res->ata_class = ATA_DEV_ATAPI; - break; - default: - res->ata_class = ATA_DEV_UNKNOWN; - break; - }; -} - /** * ipr_init_res_entry - Initialize a resource entry struct. * @res: resource entry struct - * @cfgtew: config table entry wrapper struct * * Return value: * none **/ -static void ipr_init_res_entry(struct ipr_resource_entry *res, - struct ipr_config_table_entry_wrapper *cfgtew) +static void ipr_init_res_entry(struct ipr_resource_entry *res) { - int found = 0; - unsigned int proto; - struct ipr_ioa_cfg *ioa_cfg = res->ioa_cfg; - struct ipr_resource_entry *gscsi_res = NULL; - res->needs_sync_complete = 0; res->in_erp = 0; res->add_to_ml = 0; @@ -1034,205 +840,6 @@ static void ipr_init_res_entry(struct ipr_resource_entry *res, res->resetting_device = 0; res->sdev = NULL; res->sata_port = NULL; - - if (ioa_cfg->sis64) { - proto = cfgtew->u.cfgte64->proto; - res->res_flags = cfgtew->u.cfgte64->res_flags; - res->qmodel = IPR_QUEUEING_MODEL64(res); - res->type = cfgtew->u.cfgte64->res_type & 0x0f; - - memcpy(res->res_path, &cfgtew->u.cfgte64->res_path, - sizeof(res->res_path)); - - res->bus = 0; - res->lun = scsilun_to_int(&res->dev_lun); - - if (res->type == IPR_RES_TYPE_GENERIC_SCSI) { - list_for_each_entry(gscsi_res, &ioa_cfg->used_res_q, queue) { - if (gscsi_res->dev_id == cfgtew->u.cfgte64->dev_id) { - found = 1; - res->target = gscsi_res->target; - break; - } - } - if (!found) { - res->target = find_first_zero_bit(ioa_cfg->target_ids, - ioa_cfg->max_devs_supported); - set_bit(res->target, ioa_cfg->target_ids); - } - - memcpy(&res->dev_lun.scsi_lun, &cfgtew->u.cfgte64->lun, - sizeof(res->dev_lun.scsi_lun)); - } else if (res->type == IPR_RES_TYPE_IOAFP) { - res->bus = IPR_IOAFP_VIRTUAL_BUS; - res->target = 0; - } else if (res->type == IPR_RES_TYPE_ARRAY) { - res->bus = IPR_ARRAY_VIRTUAL_BUS; - res->target = find_first_zero_bit(ioa_cfg->array_ids, - ioa_cfg->max_devs_supported); - set_bit(res->target, ioa_cfg->array_ids); - } else if (res->type == IPR_RES_TYPE_VOLUME_SET) { - res->bus = IPR_VSET_VIRTUAL_BUS; - res->target = find_first_zero_bit(ioa_cfg->vset_ids, - ioa_cfg->max_devs_supported); - set_bit(res->target, ioa_cfg->vset_ids); - } else { - res->target = find_first_zero_bit(ioa_cfg->target_ids, - ioa_cfg->max_devs_supported); - set_bit(res->target, ioa_cfg->target_ids); - } - } else { - proto = cfgtew->u.cfgte->proto; - res->qmodel = IPR_QUEUEING_MODEL(res); - res->flags = cfgtew->u.cfgte->flags; - if (res->flags & IPR_IS_IOA_RESOURCE) - res->type = IPR_RES_TYPE_IOAFP; - else - res->type = cfgtew->u.cfgte->rsvd_subtype & 0x0f; - - res->bus = cfgtew->u.cfgte->res_addr.bus; - res->target = cfgtew->u.cfgte->res_addr.target; - res->lun = cfgtew->u.cfgte->res_addr.lun; - } - - ipr_update_ata_class(res, proto); -} - -/** - * ipr_is_same_device - Determine if two devices are the same. - * @res: resource entry struct - * @cfgtew: config table entry wrapper struct - * - * Return value: - * 1 if the devices are the same / 0 otherwise - **/ -static int ipr_is_same_device(struct ipr_resource_entry *res, - struct ipr_config_table_entry_wrapper *cfgtew) -{ - if (res->ioa_cfg->sis64) { - if (!memcmp(&res->dev_id, &cfgtew->u.cfgte64->dev_id, - sizeof(cfgtew->u.cfgte64->dev_id)) && - !memcmp(&res->lun, &cfgtew->u.cfgte64->lun, - sizeof(cfgtew->u.cfgte64->lun))) { - return 1; - } - } else { - if (res->bus == cfgtew->u.cfgte->res_addr.bus && - res->target == cfgtew->u.cfgte->res_addr.target && - res->lun == cfgtew->u.cfgte->res_addr.lun) - return 1; - } - - return 0; -} - -/** - * ipr_format_resource_path - Format the resource path for printing. - * @res_path: resource path - * @buf: buffer - * - * Return value: - * pointer to buffer - **/ -static char *ipr_format_resource_path(u8 *res_path, char *buffer) -{ - int i; - - sprintf(buffer, "%02X", res_path[0]); - for (i=1; res_path[i] != 0xff; i++) - sprintf(buffer, "%s-%02X", buffer, res_path[i]); - - return buffer; -} - -/** - * ipr_update_res_entry - Update the resource entry. - * @res: resource entry struct - * @cfgtew: config table entry wrapper struct - * - * Return value: - * none - **/ -static void ipr_update_res_entry(struct ipr_resource_entry *res, - struct ipr_config_table_entry_wrapper *cfgtew) -{ - char buffer[IPR_MAX_RES_PATH_LENGTH]; - unsigned int proto; - int new_path = 0; - - if (res->ioa_cfg->sis64) { - res->flags = cfgtew->u.cfgte64->flags; - res->res_flags = cfgtew->u.cfgte64->res_flags; - res->type = cfgtew->u.cfgte64->res_type & 0x0f; - - memcpy(&res->std_inq_data, &cfgtew->u.cfgte64->std_inq_data, - sizeof(struct ipr_std_inq_data)); - - res->qmodel = IPR_QUEUEING_MODEL64(res); - proto = cfgtew->u.cfgte64->proto; - res->res_handle = cfgtew->u.cfgte64->res_handle; - res->dev_id = cfgtew->u.cfgte64->dev_id; - - memcpy(&res->dev_lun.scsi_lun, &cfgtew->u.cfgte64->lun, - sizeof(res->dev_lun.scsi_lun)); - - if (memcmp(res->res_path, &cfgtew->u.cfgte64->res_path, - sizeof(res->res_path))) { - memcpy(res->res_path, &cfgtew->u.cfgte64->res_path, - sizeof(res->res_path)); - new_path = 1; - } - - if (res->sdev && new_path) - sdev_printk(KERN_INFO, res->sdev, "Resource path: %s\n", - ipr_format_resource_path(&res->res_path[0], &buffer[0])); - } else { - res->flags = cfgtew->u.cfgte->flags; - if (res->flags & IPR_IS_IOA_RESOURCE) - res->type = IPR_RES_TYPE_IOAFP; - else - res->type = cfgtew->u.cfgte->rsvd_subtype & 0x0f; - - memcpy(&res->std_inq_data, &cfgtew->u.cfgte->std_inq_data, - sizeof(struct ipr_std_inq_data)); - - res->qmodel = IPR_QUEUEING_MODEL(res); - proto = cfgtew->u.cfgte->proto; - res->res_handle = cfgtew->u.cfgte->res_handle; - } - - ipr_update_ata_class(res, proto); -} - -/** - * ipr_clear_res_target - Clear the bit in the bit map representing the target - * for the resource. - * @res: resource entry struct - * @cfgtew: config table entry wrapper struct - * - * Return value: - * none - **/ -static void ipr_clear_res_target(struct ipr_resource_entry *res) -{ - struct ipr_resource_entry *gscsi_res = NULL; - struct ipr_ioa_cfg *ioa_cfg = res->ioa_cfg; - - if (!ioa_cfg->sis64) - return; - - if (res->bus == IPR_ARRAY_VIRTUAL_BUS) - clear_bit(res->target, ioa_cfg->array_ids); - else if (res->bus == IPR_VSET_VIRTUAL_BUS) - clear_bit(res->target, ioa_cfg->vset_ids); - else if (res->bus == 0 && res->type == IPR_RES_TYPE_GENERIC_SCSI) { - list_for_each_entry(gscsi_res, &ioa_cfg->used_res_q, queue) - if (gscsi_res->dev_id == res->dev_id && gscsi_res != res) - return; - clear_bit(res->target, ioa_cfg->target_ids); - - } else if (res->bus == 0) - clear_bit(res->target, ioa_cfg->target_ids); } /** @@ -1244,24 +851,17 @@ static void ipr_clear_res_target(struct ipr_resource_entry *res) * none **/ static void ipr_handle_config_change(struct ipr_ioa_cfg *ioa_cfg, - struct ipr_hostrcb *hostrcb) + struct ipr_hostrcb *hostrcb) { struct ipr_resource_entry *res = NULL; - struct ipr_config_table_entry_wrapper cfgtew; - __be32 cc_res_handle; - + struct ipr_config_table_entry *cfgte; u32 is_ndn = 1; - if (ioa_cfg->sis64) { - cfgtew.u.cfgte64 = &hostrcb->hcam.u.ccn.u.cfgte64; - cc_res_handle = cfgtew.u.cfgte64->res_handle; - } else { - cfgtew.u.cfgte = &hostrcb->hcam.u.ccn.u.cfgte; - cc_res_handle = cfgtew.u.cfgte->res_handle; - } + cfgte = &hostrcb->hcam.u.ccn.cfgte; list_for_each_entry(res, &ioa_cfg->used_res_q, queue) { - if (res->res_handle == cc_res_handle) { + if (!memcmp(&res->cfgte.res_addr, &cfgte->res_addr, + sizeof(cfgte->res_addr))) { is_ndn = 0; break; } @@ -1279,22 +879,20 @@ static void ipr_handle_config_change(struct ipr_ioa_cfg *ioa_cfg, struct ipr_resource_entry, queue); list_del(&res->queue); - ipr_init_res_entry(res, &cfgtew); + ipr_init_res_entry(res); list_add_tail(&res->queue, &ioa_cfg->used_res_q); } - ipr_update_res_entry(res, &cfgtew); + memcpy(&res->cfgte, cfgte, sizeof(struct ipr_config_table_entry)); if (hostrcb->hcam.notify_type == IPR_HOST_RCB_NOTIF_TYPE_REM_ENTRY) { if (res->sdev) { res->del_from_ml = 1; - res->res_handle = IPR_INVALID_RES_HANDLE; + res->cfgte.res_handle = IPR_INVALID_RES_HANDLE; if (ioa_cfg->allow_ml_add_del) schedule_work(&ioa_cfg->work_q); - } else { - ipr_clear_res_target(res); + } else list_move_tail(&res->queue, &ioa_cfg->free_res_q); - } } else if (!res->sdev) { res->add_to_ml = 1; if (ioa_cfg->allow_ml_add_del) @@ -1446,12 +1044,8 @@ static void ipr_log_ext_vpd(struct ipr_ext_vpd *vpd) static void ipr_log_enhanced_cache_error(struct ipr_ioa_cfg *ioa_cfg, struct ipr_hostrcb *hostrcb) { - struct ipr_hostrcb_type_12_error *error; - - if (ioa_cfg->sis64) - error = &hostrcb->hcam.u.error64.u.type_12_error; - else - error = &hostrcb->hcam.u.error.u.type_12_error; + struct ipr_hostrcb_type_12_error *error = + &hostrcb->hcam.u.error.u.type_12_error; ipr_err("-----Current Configuration-----\n"); ipr_err("Cache Directory Card Information:\n"); @@ -1543,48 +1137,6 @@ static void ipr_log_enhanced_config_error(struct ipr_ioa_cfg *ioa_cfg, } } -/** - * ipr_log_sis64_config_error - Log a device error. - * @ioa_cfg: ioa config struct - * @hostrcb: hostrcb struct - * - * Return value: - * none - **/ -static void ipr_log_sis64_config_error(struct ipr_ioa_cfg *ioa_cfg, - struct ipr_hostrcb *hostrcb) -{ - int errors_logged, i; - struct ipr_hostrcb64_device_data_entry_enhanced *dev_entry; - struct ipr_hostrcb_type_23_error *error; - char buffer[IPR_MAX_RES_PATH_LENGTH]; - - error = &hostrcb->hcam.u.error64.u.type_23_error; - errors_logged = be32_to_cpu(error->errors_logged); - - ipr_err("Device Errors Detected/Logged: %d/%d\n", - be32_to_cpu(error->errors_detected), errors_logged); - - dev_entry = error->dev; - - for (i = 0; i < errors_logged; i++, dev_entry++) { - ipr_err_separator; - - ipr_err("Device %d : %s", i + 1, - ipr_format_resource_path(&dev_entry->res_path[0], &buffer[0])); - ipr_log_ext_vpd(&dev_entry->vpd); - - ipr_err("-----New Device Information-----\n"); - ipr_log_ext_vpd(&dev_entry->new_vpd); - - ipr_err("Cache Directory Card Information:\n"); - ipr_log_ext_vpd(&dev_entry->ioa_last_with_dev_vpd); - - ipr_err("Adapter Card Information:\n"); - ipr_log_ext_vpd(&dev_entry->cfc_last_with_dev_vpd); - } -} - /** * ipr_log_config_error - Log a configuration error. * @ioa_cfg: ioa config struct @@ -1779,11 +1331,7 @@ static void ipr_log_enhanced_dual_ioa_error(struct ipr_ioa_cfg *ioa_cfg, { struct ipr_hostrcb_type_17_error *error; - if (ioa_cfg->sis64) - error = &hostrcb->hcam.u.error64.u.type_17_error; - else - error = &hostrcb->hcam.u.error.u.type_17_error; - + error = &hostrcb->hcam.u.error.u.type_17_error; error->failure_reason[sizeof(error->failure_reason) - 1] = '\0'; strim(error->failure_reason); @@ -1890,42 +1438,6 @@ static void ipr_log_fabric_path(struct ipr_hostrcb *hostrcb, fabric->ioa_port, fabric->cascaded_expander, fabric->phy); } -/** - * ipr_log64_fabric_path - Log a fabric path error - * @hostrcb: hostrcb struct - * @fabric: fabric descriptor - * - * Return value: - * none - **/ -static void ipr_log64_fabric_path(struct ipr_hostrcb *hostrcb, - struct ipr_hostrcb64_fabric_desc *fabric) -{ - int i, j; - u8 path_state = fabric->path_state; - u8 active = path_state & IPR_PATH_ACTIVE_MASK; - u8 state = path_state & IPR_PATH_STATE_MASK; - char buffer[IPR_MAX_RES_PATH_LENGTH]; - - for (i = 0; i < ARRAY_SIZE(path_active_desc); i++) { - if (path_active_desc[i].active != active) - continue; - - for (j = 0; j < ARRAY_SIZE(path_state_desc); j++) { - if (path_state_desc[j].state != state) - continue; - - ipr_hcam_err(hostrcb, "%s %s: Resource Path=%s\n", - path_active_desc[i].desc, path_state_desc[j].desc, - ipr_format_resource_path(&fabric->res_path[0], &buffer[0])); - return; - } - } - - ipr_err("Path state=%02X Resource Path=%s\n", path_state, - ipr_format_resource_path(&fabric->res_path[0], &buffer[0])); -} - static const struct { u8 type; char *desc; @@ -2034,49 +1546,6 @@ static void ipr_log_path_elem(struct ipr_hostrcb *hostrcb, be32_to_cpu(cfg->wwid[0]), be32_to_cpu(cfg->wwid[1])); } -/** - * ipr_log64_path_elem - Log a fabric path element. - * @hostrcb: hostrcb struct - * @cfg: fabric path element struct - * - * Return value: - * none - **/ -static void ipr_log64_path_elem(struct ipr_hostrcb *hostrcb, - struct ipr_hostrcb64_config_element *cfg) -{ - int i, j; - u8 desc_id = cfg->descriptor_id & IPR_DESCRIPTOR_MASK; - u8 type = cfg->type_status & IPR_PATH_CFG_TYPE_MASK; - u8 status = cfg->type_status & IPR_PATH_CFG_STATUS_MASK; - char buffer[IPR_MAX_RES_PATH_LENGTH]; - - if (type == IPR_PATH_CFG_NOT_EXIST || desc_id != IPR_DESCRIPTOR_SIS64) - return; - - for (i = 0; i < ARRAY_SIZE(path_type_desc); i++) { - if (path_type_desc[i].type != type) - continue; - - for (j = 0; j < ARRAY_SIZE(path_status_desc); j++) { - if (path_status_desc[j].status != status) - continue; - - ipr_hcam_err(hostrcb, "%s %s: Resource Path=%s, Link rate=%s, WWN=%08X%08X\n", - path_status_desc[j].desc, path_type_desc[i].desc, - ipr_format_resource_path(&cfg->res_path[0], &buffer[0]), - link_rate[cfg->link_rate & IPR_PHY_LINK_RATE_MASK], - be32_to_cpu(cfg->wwid[0]), be32_to_cpu(cfg->wwid[1])); - return; - } - } - ipr_hcam_err(hostrcb, "Path element=%02X: Resource Path=%s, Link rate=%s " - "WWN=%08X%08X\n", cfg->type_status, - ipr_format_resource_path(&cfg->res_path[0], &buffer[0]), - link_rate[cfg->link_rate & IPR_PHY_LINK_RATE_MASK], - be32_to_cpu(cfg->wwid[0]), be32_to_cpu(cfg->wwid[1])); -} - /** * ipr_log_fabric_error - Log a fabric error. * @ioa_cfg: ioa config struct @@ -2114,96 +1583,6 @@ static void ipr_log_fabric_error(struct ipr_ioa_cfg *ioa_cfg, ipr_log_hex_data(ioa_cfg, (u32 *)fabric, add_len); } -/** - * ipr_log_sis64_array_error - Log a sis64 array error. - * @ioa_cfg: ioa config struct - * @hostrcb: hostrcb struct - * - * Return value: - * none - **/ -static void ipr_log_sis64_array_error(struct ipr_ioa_cfg *ioa_cfg, - struct ipr_hostrcb *hostrcb) -{ - int i, num_entries; - struct ipr_hostrcb_type_24_error *error; - struct ipr_hostrcb64_array_data_entry *array_entry; - char buffer[IPR_MAX_RES_PATH_LENGTH]; - const u8 zero_sn[IPR_SERIAL_NUM_LEN] = { [0 ... IPR_SERIAL_NUM_LEN-1] = '0' }; - - error = &hostrcb->hcam.u.error64.u.type_24_error; - - ipr_err_separator; - - ipr_err("RAID %s Array Configuration: %s\n", - error->protection_level, - ipr_format_resource_path(&error->last_res_path[0], &buffer[0])); - - ipr_err_separator; - - array_entry = error->array_member; - num_entries = min_t(u32, be32_to_cpu(error->num_entries), - sizeof(error->array_member)); - - for (i = 0; i < num_entries; i++, array_entry++) { - - if (!memcmp(array_entry->vpd.vpd.sn, zero_sn, IPR_SERIAL_NUM_LEN)) - continue; - - if (error->exposed_mode_adn == i) - ipr_err("Exposed Array Member %d:\n", i); - else - ipr_err("Array Member %d:\n", i); - - ipr_err("Array Member %d:\n", i); - ipr_log_ext_vpd(&array_entry->vpd); - ipr_err("Current Location: %s", - ipr_format_resource_path(&array_entry->res_path[0], &buffer[0])); - ipr_err("Expected Location: %s", - ipr_format_resource_path(&array_entry->expected_res_path[0], &buffer[0])); - - ipr_err_separator; - } -} - -/** - * ipr_log_sis64_fabric_error - Log a sis64 fabric error. - * @ioa_cfg: ioa config struct - * @hostrcb: hostrcb struct - * - * Return value: - * none - **/ -static void ipr_log_sis64_fabric_error(struct ipr_ioa_cfg *ioa_cfg, - struct ipr_hostrcb *hostrcb) -{ - struct ipr_hostrcb_type_30_error *error; - struct ipr_hostrcb64_fabric_desc *fabric; - struct ipr_hostrcb64_config_element *cfg; - int i, add_len; - - error = &hostrcb->hcam.u.error64.u.type_30_error; - - error->failure_reason[sizeof(error->failure_reason) - 1] = '\0'; - ipr_hcam_err(hostrcb, "%s\n", error->failure_reason); - - add_len = be32_to_cpu(hostrcb->hcam.length) - - (offsetof(struct ipr_hostrcb64_error, u) + - offsetof(struct ipr_hostrcb_type_30_error, desc)); - - for (i = 0, fabric = error->desc; i < error->num_entries; i++) { - ipr_log64_fabric_path(hostrcb, fabric); - for_each_fabric_cfg(fabric, cfg) - ipr_log64_path_elem(hostrcb, cfg); - - add_len -= be16_to_cpu(fabric->length); - fabric = (struct ipr_hostrcb64_fabric_desc *) - ((unsigned long)fabric + be16_to_cpu(fabric->length)); - } - - ipr_log_hex_data(ioa_cfg, (u32 *)fabric, add_len); -} - /** * ipr_log_generic_error - Log an adapter error. * @ioa_cfg: ioa config struct @@ -2263,16 +1642,13 @@ static void ipr_handle_log_data(struct ipr_ioa_cfg *ioa_cfg, if (hostrcb->hcam.notifications_lost == IPR_HOST_RCB_NOTIFICATIONS_LOST) dev_err(&ioa_cfg->pdev->dev, "Error notifications lost\n"); - if (ioa_cfg->sis64) - ioasc = be32_to_cpu(hostrcb->hcam.u.error64.fd_ioasc); - else - ioasc = be32_to_cpu(hostrcb->hcam.u.error.fd_ioasc); + ioasc = be32_to_cpu(hostrcb->hcam.u.error.failing_dev_ioasc); - if (!ioa_cfg->sis64 && (ioasc == IPR_IOASC_BUS_WAS_RESET || - ioasc == IPR_IOASC_BUS_WAS_RESET_BY_OTHER)) { + if (ioasc == IPR_IOASC_BUS_WAS_RESET || + ioasc == IPR_IOASC_BUS_WAS_RESET_BY_OTHER) { /* Tell the midlayer we had a bus reset so it will handle the UA properly */ scsi_report_bus_reset(ioa_cfg->host, - hostrcb->hcam.u.error.fd_res_addr.bus); + hostrcb->hcam.u.error.failing_dev_res_addr.bus); } error_index = ipr_get_error(ioasc); @@ -2320,16 +1696,6 @@ static void ipr_handle_log_data(struct ipr_ioa_cfg *ioa_cfg, case IPR_HOST_RCB_OVERLAY_ID_20: ipr_log_fabric_error(ioa_cfg, hostrcb); break; - case IPR_HOST_RCB_OVERLAY_ID_23: - ipr_log_sis64_config_error(ioa_cfg, hostrcb); - break; - case IPR_HOST_RCB_OVERLAY_ID_24: - case IPR_HOST_RCB_OVERLAY_ID_26: - ipr_log_sis64_array_error(ioa_cfg, hostrcb); - break; - case IPR_HOST_RCB_OVERLAY_ID_30: - ipr_log_sis64_fabric_error(ioa_cfg, hostrcb); - break; case IPR_HOST_RCB_OVERLAY_ID_1: case IPR_HOST_RCB_OVERLAY_ID_DEFAULT: default: @@ -2354,12 +1720,7 @@ static void ipr_process_error(struct ipr_cmnd *ipr_cmd) struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; struct ipr_hostrcb *hostrcb = ipr_cmd->u.hostrcb; u32 ioasc = be32_to_cpu(ipr_cmd->ioasa.ioasc); - u32 fd_ioasc; - - if (ioa_cfg->sis64) - fd_ioasc = be32_to_cpu(hostrcb->hcam.u.error64.fd_ioasc); - else - fd_ioasc = be32_to_cpu(hostrcb->hcam.u.error.fd_ioasc); + u32 fd_ioasc = be32_to_cpu(hostrcb->hcam.u.error.failing_dev_ioasc); list_del(&hostrcb->queue); list_add_tail(&ipr_cmd->queue, &ioa_cfg->free_q); @@ -2484,14 +1845,12 @@ static const struct ipr_ses_table_entry * ipr_find_ses_entry(struct ipr_resource_entry *res) { int i, j, matches; - struct ipr_std_inq_vpids *vpids; const struct ipr_ses_table_entry *ste = ipr_ses_table; for (i = 0; i < ARRAY_SIZE(ipr_ses_table); i++, ste++) { for (j = 0, matches = 0; j < IPR_PROD_ID_LEN; j++) { if (ste->compare_product_id_byte[j] == 'X') { - vpids = &res->std_inq_data.vpids; - if (vpids->product_id[j] == ste->product_id[j]) + if (res->cfgte.std_inq_data.vpids.product_id[j] == ste->product_id[j]) matches++; else break; @@ -2526,10 +1885,10 @@ static u32 ipr_get_max_scsi_speed(struct ipr_ioa_cfg *ioa_cfg, u8 bus, u8 bus_wi /* Loop through each config table entry in the config table buffer */ list_for_each_entry(res, &ioa_cfg->used_res_q, queue) { - if (!(IPR_IS_SES_DEVICE(res->std_inq_data))) + if (!(IPR_IS_SES_DEVICE(res->cfgte.std_inq_data))) continue; - if (bus != res->bus) + if (bus != res->cfgte.res_addr.bus) continue; if (!(ste = ipr_find_ses_entry(res))) @@ -2574,31 +1933,6 @@ static int ipr_wait_iodbg_ack(struct ipr_ioa_cfg *ioa_cfg, int max_delay) return -EIO; } -/** - * ipr_get_sis64_dump_data_section - Dump IOA memory - * @ioa_cfg: ioa config struct - * @start_addr: adapter address to dump - * @dest: destination kernel buffer - * @length_in_words: length to dump in 4 byte words - * - * Return value: - * 0 on success - **/ -static int ipr_get_sis64_dump_data_section(struct ipr_ioa_cfg *ioa_cfg, - u32 start_addr, - __be32 *dest, u32 length_in_words) -{ - int i; - - for (i = 0; i < length_in_words; i++) { - writel(start_addr+(i*4), ioa_cfg->regs.dump_addr_reg); - *dest = cpu_to_be32(readl(ioa_cfg->regs.dump_data_reg)); - dest++; - } - - return 0; -} - /** * ipr_get_ldump_data_section - Dump IOA memory * @ioa_cfg: ioa config struct @@ -2616,13 +1950,9 @@ static int ipr_get_ldump_data_section(struct ipr_ioa_cfg *ioa_cfg, volatile u32 temp_pcii_reg; int i, delay = 0; - if (ioa_cfg->sis64) - return ipr_get_sis64_dump_data_section(ioa_cfg, start_addr, - dest, length_in_words); - /* Write IOA interrupt reg starting LDUMP state */ writel((IPR_UPROCI_RESET_ALERT | IPR_UPROCI_IO_DEBUG_ALERT), - ioa_cfg->regs.set_uproc_interrupt_reg32); + ioa_cfg->regs.set_uproc_interrupt_reg); /* Wait for IO debug acknowledge */ if (ipr_wait_iodbg_ack(ioa_cfg, @@ -2641,7 +1971,7 @@ static int ipr_get_ldump_data_section(struct ipr_ioa_cfg *ioa_cfg, /* Signal address valid - clear IOA Reset alert */ writel(IPR_UPROCI_RESET_ALERT, - ioa_cfg->regs.clr_uproc_interrupt_reg32); + ioa_cfg->regs.clr_uproc_interrupt_reg); for (i = 0; i < length_in_words; i++) { /* Wait for IO debug acknowledge */ @@ -2666,10 +1996,10 @@ static int ipr_get_ldump_data_section(struct ipr_ioa_cfg *ioa_cfg, /* Signal end of block transfer. Set reset alert then clear IO debug ack */ writel(IPR_UPROCI_RESET_ALERT, - ioa_cfg->regs.set_uproc_interrupt_reg32); + ioa_cfg->regs.set_uproc_interrupt_reg); writel(IPR_UPROCI_IO_DEBUG_ALERT, - ioa_cfg->regs.clr_uproc_interrupt_reg32); + ioa_cfg->regs.clr_uproc_interrupt_reg); /* Signal dump data received - Clear IO debug Ack */ writel(IPR_PCII_IO_DEBUG_ACKNOWLEDGE, @@ -2678,7 +2008,7 @@ static int ipr_get_ldump_data_section(struct ipr_ioa_cfg *ioa_cfg, /* Wait for IOA to signal LDUMP exit - IOA reset alert will be cleared */ while (delay < IPR_LDUMP_MAX_SHORT_ACK_DELAY_IN_USEC) { temp_pcii_reg = - readl(ioa_cfg->regs.sense_uproc_interrupt_reg32); + readl(ioa_cfg->regs.sense_uproc_interrupt_reg); if (!(temp_pcii_reg & IPR_UPROCI_RESET_ALERT)) return 0; @@ -2877,7 +2207,6 @@ static void ipr_get_ioa_dump(struct ipr_ioa_cfg *ioa_cfg, struct ipr_dump *dump) u32 num_entries, start_off, end_off; u32 bytes_to_copy, bytes_copied, rc; struct ipr_sdt *sdt; - int valid = 1; int i; ENTER; @@ -2891,7 +2220,7 @@ static void ipr_get_ioa_dump(struct ipr_ioa_cfg *ioa_cfg, struct ipr_dump *dump) start_addr = readl(ioa_cfg->ioa_mailbox); - if (!ioa_cfg->sis64 && !ipr_sdt_is_fmt2(start_addr)) { + if (!ipr_sdt_is_fmt2(start_addr)) { dev_err(&ioa_cfg->pdev->dev, "Invalid dump table format: %lx\n", start_addr); spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); @@ -2920,6 +2249,7 @@ static void ipr_get_ioa_dump(struct ipr_ioa_cfg *ioa_cfg, struct ipr_dump *dump) /* IOA Dump entry */ ipr_init_dump_entry_hdr(&ioa_dump->hdr); + ioa_dump->format = IPR_SDT_FMT2; ioa_dump->hdr.len = 0; ioa_dump->hdr.data_type = IPR_DUMP_DATA_TYPE_BINARY; ioa_dump->hdr.id = IPR_DUMP_IOA_DUMP_ID; @@ -2934,8 +2264,7 @@ static void ipr_get_ioa_dump(struct ipr_ioa_cfg *ioa_cfg, struct ipr_dump *dump) sizeof(struct ipr_sdt) / sizeof(__be32)); /* Smart Dump table is ready to use and the first entry is valid */ - if (rc || ((be32_to_cpu(sdt->hdr.state) != IPR_FMT3_SDT_READY_TO_USE) && - (be32_to_cpu(sdt->hdr.state) != IPR_FMT2_SDT_READY_TO_USE))) { + if (rc || (be32_to_cpu(sdt->hdr.state) != IPR_FMT2_SDT_READY_TO_USE)) { dev_err(&ioa_cfg->pdev->dev, "Dump of IOA failed. Dump table not valid: %d, %X.\n", rc, be32_to_cpu(sdt->hdr.state)); @@ -2959,19 +2288,12 @@ static void ipr_get_ioa_dump(struct ipr_ioa_cfg *ioa_cfg, struct ipr_dump *dump) } if (sdt->entry[i].flags & IPR_SDT_VALID_ENTRY) { - sdt_word = be32_to_cpu(sdt->entry[i].start_token); - if (ioa_cfg->sis64) - bytes_to_copy = be32_to_cpu(sdt->entry[i].end_token); - else { - start_off = sdt_word & IPR_FMT2_MBX_ADDR_MASK; - end_off = be32_to_cpu(sdt->entry[i].end_token); - - if (ipr_sdt_is_fmt2(sdt_word) && sdt_word) - bytes_to_copy = end_off - start_off; - else - valid = 0; - } - if (valid) { + sdt_word = be32_to_cpu(sdt->entry[i].bar_str_offset); + start_off = sdt_word & IPR_FMT2_MBX_ADDR_MASK; + end_off = be32_to_cpu(sdt->entry[i].end_offset); + + if (ipr_sdt_is_fmt2(sdt_word) && sdt_word) { + bytes_to_copy = end_off - start_off; if (bytes_to_copy > IPR_MAX_IOA_DUMP_SIZE) { sdt->entry[i].flags &= ~IPR_SDT_VALID_ENTRY; continue; @@ -3100,9 +2422,9 @@ static void ipr_worker_thread(struct work_struct *work) list_for_each_entry(res, &ioa_cfg->used_res_q, queue) { if (res->add_to_ml) { - bus = res->bus; - target = res->target; - lun = res->lun; + bus = res->cfgte.res_addr.bus; + target = res->cfgte.res_addr.target; + lun = res->cfgte.res_addr.lun; res->add_to_ml = 0; spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); scsi_add_device(ioa_cfg->host, bus, target, lun); @@ -3156,6 +2478,105 @@ static struct bin_attribute ipr_trace_attr = { }; #endif +static const struct { + enum ipr_cache_state state; + char *name; +} cache_state [] = { + { CACHE_NONE, "none" }, + { CACHE_DISABLED, "disabled" }, + { CACHE_ENABLED, "enabled" } +}; + +/** + * ipr_show_write_caching - Show the write caching attribute + * @dev: device struct + * @buf: buffer + * + * Return value: + * number of bytes printed to buffer + **/ +static ssize_t ipr_show_write_caching(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct Scsi_Host *shost = class_to_shost(dev); + struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata; + unsigned long lock_flags = 0; + int i, len = 0; + + spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); + for (i = 0; i < ARRAY_SIZE(cache_state); i++) { + if (cache_state[i].state == ioa_cfg->cache_state) { + len = snprintf(buf, PAGE_SIZE, "%s\n", cache_state[i].name); + break; + } + } + spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); + return len; +} + + +/** + * ipr_store_write_caching - Enable/disable adapter write cache + * @dev: device struct + * @buf: buffer + * @count: buffer size + * + * This function will enable/disable adapter write cache. + * + * Return value: + * count on success / other on failure + **/ +static ssize_t ipr_store_write_caching(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct Scsi_Host *shost = class_to_shost(dev); + struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata; + unsigned long lock_flags = 0; + enum ipr_cache_state new_state = CACHE_INVALID; + int i; + + if (!capable(CAP_SYS_ADMIN)) + return -EACCES; + if (ioa_cfg->cache_state == CACHE_NONE) + return -EINVAL; + + for (i = 0; i < ARRAY_SIZE(cache_state); i++) { + if (!strncmp(cache_state[i].name, buf, strlen(cache_state[i].name))) { + new_state = cache_state[i].state; + break; + } + } + + if (new_state != CACHE_DISABLED && new_state != CACHE_ENABLED) + return -EINVAL; + + spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); + if (ioa_cfg->cache_state == new_state) { + spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); + return count; + } + + ioa_cfg->cache_state = new_state; + dev_info(&ioa_cfg->pdev->dev, "%s adapter write cache.\n", + new_state == CACHE_ENABLED ? "Enabling" : "Disabling"); + if (!ioa_cfg->in_reset_reload) + ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NORMAL); + spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); + wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload); + + return count; +} + +static struct device_attribute ipr_ioa_cache_attr = { + .attr = { + .name = "write_cache", + .mode = S_IRUGO | S_IWUSR, + }, + .show = ipr_show_write_caching, + .store = ipr_store_write_caching +}; + /** * ipr_show_fw_version - Show the firmware version * @dev: class device struct @@ -3554,37 +2975,6 @@ static int ipr_copy_ucode_buffer(struct ipr_sglist *sglist, return result; } -/** - * ipr_build_ucode_ioadl64 - Build a microcode download IOADL - * @ipr_cmd: ipr command struct - * @sglist: scatter/gather list - * - * Builds a microcode download IOA data list (IOADL). - * - **/ -static void ipr_build_ucode_ioadl64(struct ipr_cmnd *ipr_cmd, - struct ipr_sglist *sglist) -{ - struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb; - struct ipr_ioadl64_desc *ioadl64 = ipr_cmd->i.ioadl64; - struct scatterlist *scatterlist = sglist->scatterlist; - int i; - - ipr_cmd->dma_use_sg = sglist->num_dma_sg; - ioarcb->cmd_pkt.flags_hi |= IPR_FLAGS_HI_WRITE_NOT_READ; - ioarcb->data_transfer_length = cpu_to_be32(sglist->buffer_len); - - ioarcb->ioadl_len = - cpu_to_be32(sizeof(struct ipr_ioadl64_desc) * ipr_cmd->dma_use_sg); - for (i = 0; i < ipr_cmd->dma_use_sg; i++) { - ioadl64[i].flags = cpu_to_be32(IPR_IOADL_FLAGS_WRITE); - ioadl64[i].data_len = cpu_to_be32(sg_dma_len(&scatterlist[i])); - ioadl64[i].address = cpu_to_be64(sg_dma_address(&scatterlist[i])); - } - - ioadl64[i-1].flags |= cpu_to_be32(IPR_IOADL_FLAGS_LAST); -} - /** * ipr_build_ucode_ioadl - Build a microcode download IOADL * @ipr_cmd: ipr command struct @@ -3597,15 +2987,14 @@ static void ipr_build_ucode_ioadl(struct ipr_cmnd *ipr_cmd, struct ipr_sglist *sglist) { struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb; - struct ipr_ioadl_desc *ioadl = ipr_cmd->i.ioadl; + struct ipr_ioadl_desc *ioadl = ipr_cmd->ioadl; struct scatterlist *scatterlist = sglist->scatterlist; int i; ipr_cmd->dma_use_sg = sglist->num_dma_sg; ioarcb->cmd_pkt.flags_hi |= IPR_FLAGS_HI_WRITE_NOT_READ; - ioarcb->data_transfer_length = cpu_to_be32(sglist->buffer_len); - - ioarcb->ioadl_len = + ioarcb->write_data_transfer_length = cpu_to_be32(sglist->buffer_len); + ioarcb->write_ioadl_len = cpu_to_be32(sizeof(struct ipr_ioadl_desc) * ipr_cmd->dma_use_sg); for (i = 0; i < ipr_cmd->dma_use_sg; i++) { @@ -3757,6 +3146,7 @@ static struct device_attribute *ipr_ioa_attrs[] = { &ipr_ioa_state_attr, &ipr_ioa_reset_attr, &ipr_update_fw_attr, + &ipr_ioa_cache_attr, NULL, }; @@ -4060,7 +3450,7 @@ static ssize_t ipr_show_adapter_handle(struct device *dev, struct device_attribu spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); res = (struct ipr_resource_entry *)sdev->hostdata; if (res) - len = snprintf(buf, PAGE_SIZE, "%08X\n", res->res_handle); + len = snprintf(buf, PAGE_SIZE, "%08X\n", res->cfgte.res_handle); spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); return len; } @@ -4073,43 +3463,8 @@ static struct device_attribute ipr_adapter_handle_attr = { .show = ipr_show_adapter_handle }; -/** - * ipr_show_resource_path - Show the resource path for this device. - * @dev: device struct - * @buf: buffer - * - * Return value: - * number of bytes printed to buffer - **/ -static ssize_t ipr_show_resource_path(struct device *dev, struct device_attribute *attr, char *buf) -{ - struct scsi_device *sdev = to_scsi_device(dev); - struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)sdev->host->hostdata; - struct ipr_resource_entry *res; - unsigned long lock_flags = 0; - ssize_t len = -ENXIO; - char buffer[IPR_MAX_RES_PATH_LENGTH]; - - spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); - res = (struct ipr_resource_entry *)sdev->hostdata; - if (res) - len = snprintf(buf, PAGE_SIZE, "%s\n", - ipr_format_resource_path(&res->res_path[0], &buffer[0])); - spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); - return len; -} - -static struct device_attribute ipr_resource_path_attr = { - .attr = { - .name = "resource_path", - .mode = S_IRUSR, - }, - .show = ipr_show_resource_path -}; - static struct device_attribute *ipr_dev_attrs[] = { &ipr_adapter_handle_attr, - &ipr_resource_path_attr, NULL, }; @@ -4162,9 +3517,9 @@ static struct ipr_resource_entry *ipr_find_starget(struct scsi_target *starget) struct ipr_resource_entry *res; list_for_each_entry(res, &ioa_cfg->used_res_q, queue) { - if ((res->bus == starget->channel) && - (res->target == starget->id) && - (res->lun == 0)) { + if ((res->cfgte.res_addr.bus == starget->channel) && + (res->cfgte.res_addr.target == starget->id) && + (res->cfgte.res_addr.lun == 0)) { return res; } } @@ -4234,17 +3589,6 @@ static int ipr_target_alloc(struct scsi_target *starget) static void ipr_target_destroy(struct scsi_target *starget) { struct ipr_sata_port *sata_port = starget->hostdata; - struct Scsi_Host *shost = dev_to_shost(&starget->dev); - struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *) shost->hostdata; - - if (ioa_cfg->sis64) { - if (starget->channel == IPR_ARRAY_VIRTUAL_BUS) - clear_bit(starget->id, ioa_cfg->array_ids); - else if (starget->channel == IPR_VSET_VIRTUAL_BUS) - clear_bit(starget->id, ioa_cfg->vset_ids); - else if (starget->channel == 0) - clear_bit(starget->id, ioa_cfg->target_ids); - } if (sata_port) { starget->hostdata = NULL; @@ -4266,9 +3610,9 @@ static struct ipr_resource_entry *ipr_find_sdev(struct scsi_device *sdev) struct ipr_resource_entry *res; list_for_each_entry(res, &ioa_cfg->used_res_q, queue) { - if ((res->bus == sdev->channel) && - (res->target == sdev->id) && - (res->lun == sdev->lun)) + if ((res->cfgte.res_addr.bus == sdev->channel) && + (res->cfgte.res_addr.target == sdev->id) && + (res->cfgte.res_addr.lun == sdev->lun)) return res; } @@ -4317,7 +3661,6 @@ static int ipr_slave_configure(struct scsi_device *sdev) struct ipr_resource_entry *res; struct ata_port *ap = NULL; unsigned long lock_flags = 0; - char buffer[IPR_MAX_RES_PATH_LENGTH]; spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); res = sdev->hostdata; @@ -4344,9 +3687,6 @@ static int ipr_slave_configure(struct scsi_device *sdev) ata_sas_slave_configure(sdev, ap); } else scsi_adjust_queue_depth(sdev, 0, sdev->host->cmd_per_lun); - if (ioa_cfg->sis64) - sdev_printk(KERN_INFO, sdev, "Resource path: %s\n", - ipr_format_resource_path(&res->res_path[0], &buffer[0])); return 0; } spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); @@ -4488,19 +3828,14 @@ static int ipr_device_reset(struct ipr_ioa_cfg *ioa_cfg, ipr_cmd = ipr_get_free_ipr_cmnd(ioa_cfg); ioarcb = &ipr_cmd->ioarcb; cmd_pkt = &ioarcb->cmd_pkt; + regs = &ioarcb->add_data.u.regs; - if (ipr_cmd->ioa_cfg->sis64) { - regs = &ipr_cmd->i.ata_ioadl.regs; - ioarcb->add_cmd_parms_offset = cpu_to_be16(sizeof(*ioarcb)); - } else - regs = &ioarcb->u.add_data.u.regs; - - ioarcb->res_handle = res->res_handle; + ioarcb->res_handle = res->cfgte.res_handle; cmd_pkt->request_type = IPR_RQTYPE_IOACMD; cmd_pkt->cdb[0] = IPR_RESET_DEVICE; if (ipr_is_gata(res)) { cmd_pkt->cdb[2] = IPR_ATA_PHY_RESET; - ioarcb->add_cmd_parms_len = cpu_to_be16(sizeof(regs->flags)); + ioarcb->add_cmd_parms_len = cpu_to_be32(sizeof(regs->flags)); regs->flags |= IPR_ATA_FLAG_STATUS_ON_GOOD_COMPLETION; } @@ -4545,7 +3880,19 @@ static int ipr_sata_reset(struct ata_link *link, unsigned int *classes, res = sata_port->res; if (res) { rc = ipr_device_reset(ioa_cfg, res); - *classes = res->ata_class; + switch(res->cfgte.proto) { + case IPR_PROTO_SATA: + case IPR_PROTO_SAS_STP: + *classes = ATA_DEV_ATA; + break; + case IPR_PROTO_SATA_ATAPI: + case IPR_PROTO_SAS_STP_ATAPI: + *classes = ATA_DEV_ATAPI; + break; + default: + *classes = ATA_DEV_UNKNOWN; + break; + }; } spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); @@ -4590,7 +3937,7 @@ static int __ipr_eh_dev_reset(struct scsi_cmnd * scsi_cmd) return FAILED; list_for_each_entry(ipr_cmd, &ioa_cfg->pending_q, queue) { - if (ipr_cmd->ioarcb.res_handle == res->res_handle) { + if (ipr_cmd->ioarcb.res_handle == res->cfgte.res_handle) { if (ipr_cmd->scsi_cmd) ipr_cmd->done = ipr_scsi_eh_done; if (ipr_cmd->qc) @@ -4612,7 +3959,7 @@ static int __ipr_eh_dev_reset(struct scsi_cmnd * scsi_cmd) spin_lock_irq(scsi_cmd->device->host->host_lock); list_for_each_entry(ipr_cmd, &ioa_cfg->pending_q, queue) { - if (ipr_cmd->ioarcb.res_handle == res->res_handle) { + if (ipr_cmd->ioarcb.res_handle == res->cfgte.res_handle) { rc = -EIO; break; } @@ -4651,13 +3998,13 @@ static void ipr_bus_reset_done(struct ipr_cmnd *ipr_cmd) struct ipr_resource_entry *res; ENTER; - if (!ioa_cfg->sis64) - list_for_each_entry(res, &ioa_cfg->used_res_q, queue) { - if (res->res_handle == ipr_cmd->ioarcb.res_handle) { - scsi_report_bus_reset(ioa_cfg->host, res->bus); - break; - } + list_for_each_entry(res, &ioa_cfg->used_res_q, queue) { + if (!memcmp(&res->cfgte.res_handle, &ipr_cmd->ioarcb.res_handle, + sizeof(res->cfgte.res_handle))) { + scsi_report_bus_reset(ioa_cfg->host, res->cfgte.res_addr.bus); + break; } + } /* * If abort has not completed, indicate the reset has, else call the @@ -4755,7 +4102,7 @@ static int ipr_cancel_op(struct scsi_cmnd * scsi_cmd) return SUCCESS; ipr_cmd = ipr_get_free_ipr_cmnd(ioa_cfg); - ipr_cmd->ioarcb.res_handle = res->res_handle; + ipr_cmd->ioarcb.res_handle = res->cfgte.res_handle; cmd_pkt = &ipr_cmd->ioarcb.cmd_pkt; cmd_pkt->request_type = IPR_RQTYPE_IOACMD; cmd_pkt->cdb[0] = IPR_CANCEL_ALL_REQUESTS; @@ -4892,29 +4239,11 @@ static irqreturn_t ipr_isr(int irq, void *devp) return IRQ_NONE; } - int_mask_reg = readl(ioa_cfg->regs.sense_interrupt_mask_reg32); - int_reg = readl(ioa_cfg->regs.sense_interrupt_reg32) & ~int_mask_reg; + int_mask_reg = readl(ioa_cfg->regs.sense_interrupt_mask_reg); + int_reg = readl(ioa_cfg->regs.sense_interrupt_reg) & ~int_mask_reg; - /* If an interrupt on the adapter did not occur, ignore it. - * Or in the case of SIS 64, check for a stage change interrupt. - */ + /* If an interrupt on the adapter did not occur, ignore it */ if (unlikely((int_reg & IPR_PCII_OPER_INTERRUPTS) == 0)) { - if (ioa_cfg->sis64) { - int_mask_reg = readl(ioa_cfg->regs.sense_interrupt_mask_reg); - int_reg = readl(ioa_cfg->regs.sense_interrupt_reg) & ~int_mask_reg; - if (int_reg & IPR_PCII_IPL_STAGE_CHANGE) { - - /* clear stage change */ - writel(IPR_PCII_IPL_STAGE_CHANGE, ioa_cfg->regs.clr_interrupt_reg); - int_reg = readl(ioa_cfg->regs.sense_interrupt_reg) & ~int_mask_reg; - list_del(&ioa_cfg->reset_cmd->queue); - del_timer(&ioa_cfg->reset_cmd->timer); - ipr_reset_ioa_job(ioa_cfg->reset_cmd); - spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); - return IRQ_HANDLED; - } - } - spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); return IRQ_NONE; } @@ -4957,8 +4286,8 @@ static irqreturn_t ipr_isr(int irq, void *devp) if (ipr_cmd != NULL) { /* Clear the PCI interrupt */ do { - writel(IPR_PCII_HRRQ_UPDATED, ioa_cfg->regs.clr_interrupt_reg32); - int_reg = readl(ioa_cfg->regs.sense_interrupt_reg32) & ~int_mask_reg; + writel(IPR_PCII_HRRQ_UPDATED, ioa_cfg->regs.clr_interrupt_reg); + int_reg = readl(ioa_cfg->regs.sense_interrupt_reg) & ~int_mask_reg; } while (int_reg & IPR_PCII_HRRQ_UPDATED && num_hrrq++ < IPR_MAX_HRRQ_RETRIES); @@ -4979,53 +4308,6 @@ static irqreturn_t ipr_isr(int irq, void *devp) return rc; } -/** - * ipr_build_ioadl64 - Build a scatter/gather list and map the buffer - * @ioa_cfg: ioa config struct - * @ipr_cmd: ipr command struct - * - * Return value: - * 0 on success / -1 on failure - **/ -static int ipr_build_ioadl64(struct ipr_ioa_cfg *ioa_cfg, - struct ipr_cmnd *ipr_cmd) -{ - int i, nseg; - struct scatterlist *sg; - u32 length; - u32 ioadl_flags = 0; - struct scsi_cmnd *scsi_cmd = ipr_cmd->scsi_cmd; - struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb; - struct ipr_ioadl64_desc *ioadl64 = ipr_cmd->i.ioadl64; - - length = scsi_bufflen(scsi_cmd); - if (!length) - return 0; - - nseg = scsi_dma_map(scsi_cmd); - if (nseg < 0) { - dev_err(&ioa_cfg->pdev->dev, "pci_map_sg failed!\n"); - return -1; - } - - ipr_cmd->dma_use_sg = nseg; - - if (scsi_cmd->sc_data_direction == DMA_TO_DEVICE) { - ioadl_flags = IPR_IOADL_FLAGS_WRITE; - ioarcb->cmd_pkt.flags_hi |= IPR_FLAGS_HI_WRITE_NOT_READ; - } else if (scsi_cmd->sc_data_direction == DMA_FROM_DEVICE) - ioadl_flags = IPR_IOADL_FLAGS_READ; - - scsi_for_each_sg(scsi_cmd, sg, ipr_cmd->dma_use_sg, i) { - ioadl64[i].flags = cpu_to_be32(ioadl_flags); - ioadl64[i].data_len = cpu_to_be32(sg_dma_len(sg)); - ioadl64[i].address = cpu_to_be64(sg_dma_address(sg)); - } - - ioadl64[i-1].flags |= cpu_to_be32(IPR_IOADL_FLAGS_LAST); - return 0; -} - /** * ipr_build_ioadl - Build a scatter/gather list and map the buffer * @ioa_cfg: ioa config struct @@ -5043,7 +4325,7 @@ static int ipr_build_ioadl(struct ipr_ioa_cfg *ioa_cfg, u32 ioadl_flags = 0; struct scsi_cmnd *scsi_cmd = ipr_cmd->scsi_cmd; struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb; - struct ipr_ioadl_desc *ioadl = ipr_cmd->i.ioadl; + struct ipr_ioadl_desc *ioadl = ipr_cmd->ioadl; length = scsi_bufflen(scsi_cmd); if (!length) @@ -5060,8 +4342,8 @@ static int ipr_build_ioadl(struct ipr_ioa_cfg *ioa_cfg, if (scsi_cmd->sc_data_direction == DMA_TO_DEVICE) { ioadl_flags = IPR_IOADL_FLAGS_WRITE; ioarcb->cmd_pkt.flags_hi |= IPR_FLAGS_HI_WRITE_NOT_READ; - ioarcb->data_transfer_length = cpu_to_be32(length); - ioarcb->ioadl_len = + ioarcb->write_data_transfer_length = cpu_to_be32(length); + ioarcb->write_ioadl_len = cpu_to_be32(sizeof(struct ipr_ioadl_desc) * ipr_cmd->dma_use_sg); } else if (scsi_cmd->sc_data_direction == DMA_FROM_DEVICE) { ioadl_flags = IPR_IOADL_FLAGS_READ; @@ -5070,10 +4352,11 @@ static int ipr_build_ioadl(struct ipr_ioa_cfg *ioa_cfg, cpu_to_be32(sizeof(struct ipr_ioadl_desc) * ipr_cmd->dma_use_sg); } - if (ipr_cmd->dma_use_sg <= ARRAY_SIZE(ioarcb->u.add_data.u.ioadl)) { - ioadl = ioarcb->u.add_data.u.ioadl; - ioarcb->write_ioadl_addr = cpu_to_be32((ipr_cmd->dma_addr) + - offsetof(struct ipr_ioarcb, u.add_data)); + if (ipr_cmd->dma_use_sg <= ARRAY_SIZE(ioarcb->add_data.u.ioadl)) { + ioadl = ioarcb->add_data.u.ioadl; + ioarcb->write_ioadl_addr = + cpu_to_be32(be32_to_cpu(ioarcb->ioarcb_host_pci_addr) + + offsetof(struct ipr_ioarcb, add_data)); ioarcb->read_ioadl_addr = ioarcb->write_ioadl_addr; } @@ -5163,24 +4446,18 @@ static void ipr_reinit_ipr_cmnd_for_erp(struct ipr_cmnd *ipr_cmd) { struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb; struct ipr_ioasa *ioasa = &ipr_cmd->ioasa; - dma_addr_t dma_addr = ipr_cmd->dma_addr; + dma_addr_t dma_addr = be32_to_cpu(ioarcb->ioarcb_host_pci_addr); memset(&ioarcb->cmd_pkt, 0, sizeof(struct ipr_cmd_pkt)); - ioarcb->data_transfer_length = 0; + ioarcb->write_data_transfer_length = 0; ioarcb->read_data_transfer_length = 0; - ioarcb->ioadl_len = 0; + ioarcb->write_ioadl_len = 0; ioarcb->read_ioadl_len = 0; ioasa->ioasc = 0; ioasa->residual_data_len = 0; - - if (ipr_cmd->ioa_cfg->sis64) - ioarcb->u.sis64_addr_data.data_ioadl_addr = - cpu_to_be64(dma_addr + offsetof(struct ipr_cmnd, i.ioadl64)); - else { - ioarcb->write_ioadl_addr = - cpu_to_be32(dma_addr + offsetof(struct ipr_cmnd, i.ioadl)); - ioarcb->read_ioadl_addr = ioarcb->write_ioadl_addr; - } + ioarcb->write_ioadl_addr = + cpu_to_be32(dma_addr + offsetof(struct ipr_cmnd, ioadl)); + ioarcb->read_ioadl_addr = ioarcb->write_ioadl_addr; } /** @@ -5212,8 +4489,15 @@ static void ipr_erp_request_sense(struct ipr_cmnd *ipr_cmd) cmd_pkt->flags_hi |= IPR_FLAGS_HI_NO_ULEN_CHK; cmd_pkt->timeout = cpu_to_be16(IPR_REQUEST_SENSE_TIMEOUT / HZ); - ipr_init_ioadl(ipr_cmd, ipr_cmd->sense_buffer_dma, - SCSI_SENSE_BUFFERSIZE, IPR_IOADL_FLAGS_READ_LAST); + ipr_cmd->ioadl[0].flags_and_data_len = + cpu_to_be32(IPR_IOADL_FLAGS_READ_LAST | SCSI_SENSE_BUFFERSIZE); + ipr_cmd->ioadl[0].address = + cpu_to_be32(ipr_cmd->sense_buffer_dma); + + ipr_cmd->ioarcb.read_ioadl_len = + cpu_to_be32(sizeof(struct ipr_ioadl_desc)); + ipr_cmd->ioarcb.read_data_transfer_length = + cpu_to_be32(SCSI_SENSE_BUFFERSIZE); ipr_do_req(ipr_cmd, ipr_erp_done, ipr_timeout, IPR_REQUEST_SENSE_TIMEOUT * 2); @@ -5609,9 +4893,9 @@ static int ipr_queuecommand(struct scsi_cmnd *scsi_cmd, memcpy(ioarcb->cmd_pkt.cdb, scsi_cmd->cmnd, scsi_cmd->cmd_len); ipr_cmd->scsi_cmd = scsi_cmd; - ioarcb->res_handle = res->res_handle; + ioarcb->res_handle = res->cfgte.res_handle; ipr_cmd->done = ipr_scsi_done; - ipr_trc_hook(ipr_cmd, IPR_TRACE_START, IPR_GET_RES_PHYS_LOC(res)); + ipr_trc_hook(ipr_cmd, IPR_TRACE_START, IPR_GET_PHYS_LOC(res->cfgte.res_addr)); if (ipr_is_gscsi(res) || ipr_is_vset_device(res)) { if (scsi_cmd->underflow == 0) @@ -5632,16 +4916,13 @@ static int ipr_queuecommand(struct scsi_cmnd *scsi_cmd, (!ipr_is_gscsi(res) || scsi_cmd->cmnd[0] == IPR_QUERY_RSRC_STATE)) ioarcb->cmd_pkt.request_type = IPR_RQTYPE_IOACMD; - if (likely(rc == 0)) { - if (ioa_cfg->sis64) - rc = ipr_build_ioadl64(ioa_cfg, ipr_cmd); - else - rc = ipr_build_ioadl(ioa_cfg, ipr_cmd); - } + if (likely(rc == 0)) + rc = ipr_build_ioadl(ioa_cfg, ipr_cmd); if (likely(rc == 0)) { mb(); - ipr_send_command(ipr_cmd); + writel(be32_to_cpu(ipr_cmd->ioarcb.ioarcb_host_pci_addr), + ioa_cfg->regs.ioarrin_reg); } else { list_move_tail(&ipr_cmd->queue, &ioa_cfg->free_q); return SCSI_MLQUEUE_HOST_BUSY; @@ -5754,9 +5035,20 @@ static void ipr_ata_phy_reset(struct ata_port *ap) goto out_unlock; } - ap->link.device[0].class = res->ata_class; - if (ap->link.device[0].class == ATA_DEV_UNKNOWN) + switch(res->cfgte.proto) { + case IPR_PROTO_SATA: + case IPR_PROTO_SAS_STP: + ap->link.device[0].class = ATA_DEV_ATA; + break; + case IPR_PROTO_SATA_ATAPI: + case IPR_PROTO_SAS_STP_ATAPI: + ap->link.device[0].class = ATA_DEV_ATAPI; + break; + default: + ap->link.device[0].class = ATA_DEV_UNKNOWN; ata_port_disable(ap); + break; + }; out_unlock: spin_unlock_irqrestore(ioa_cfg->host->host_lock, flags); @@ -5842,7 +5134,8 @@ static void ipr_sata_done(struct ipr_cmnd *ipr_cmd) ipr_dump_ioasa(ioa_cfg, ipr_cmd, res); if (be32_to_cpu(ipr_cmd->ioasa.ioasc_specific) & IPR_ATA_DEVICE_WAS_RESET) - scsi_report_device_reset(ioa_cfg->host, res->bus, res->target); + scsi_report_device_reset(ioa_cfg->host, res->cfgte.res_addr.bus, + res->cfgte.res_addr.target); if (IPR_IOASC_SENSE_KEY(ioasc) > RECOVERED_ERROR) qc->err_mask |= __ac_err_mask(ipr_cmd->ioasa.u.gata.status); @@ -5852,52 +5145,6 @@ static void ipr_sata_done(struct ipr_cmnd *ipr_cmd) ata_qc_complete(qc); } -/** - * ipr_build_ata_ioadl64 - Build an ATA scatter/gather list - * @ipr_cmd: ipr command struct - * @qc: ATA queued command - * - **/ -static void ipr_build_ata_ioadl64(struct ipr_cmnd *ipr_cmd, - struct ata_queued_cmd *qc) -{ - u32 ioadl_flags = 0; - struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb; - struct ipr_ioadl64_desc *ioadl64 = ipr_cmd->i.ioadl64; - struct ipr_ioadl64_desc *last_ioadl64 = NULL; - int len = qc->nbytes; - struct scatterlist *sg; - unsigned int si; - dma_addr_t dma_addr = ipr_cmd->dma_addr; - - if (len == 0) - return; - - if (qc->dma_dir == DMA_TO_DEVICE) { - ioadl_flags = IPR_IOADL_FLAGS_WRITE; - ioarcb->cmd_pkt.flags_hi |= IPR_FLAGS_HI_WRITE_NOT_READ; - } else if (qc->dma_dir == DMA_FROM_DEVICE) - ioadl_flags = IPR_IOADL_FLAGS_READ; - - ioarcb->data_transfer_length = cpu_to_be32(len); - ioarcb->ioadl_len = - cpu_to_be32(sizeof(struct ipr_ioadl64_desc) * ipr_cmd->dma_use_sg); - ioarcb->u.sis64_addr_data.data_ioadl_addr = - cpu_to_be64(dma_addr + offsetof(struct ipr_cmnd, i.ata_ioadl)); - - for_each_sg(qc->sg, sg, qc->n_elem, si) { - ioadl64->flags = cpu_to_be32(ioadl_flags); - ioadl64->data_len = cpu_to_be32(sg_dma_len(sg)); - ioadl64->address = cpu_to_be64(sg_dma_address(sg)); - - last_ioadl64 = ioadl64; - ioadl64++; - } - - if (likely(last_ioadl64)) - last_ioadl64->flags |= cpu_to_be32(IPR_IOADL_FLAGS_LAST); -} - /** * ipr_build_ata_ioadl - Build an ATA scatter/gather list * @ipr_cmd: ipr command struct @@ -5909,7 +5156,7 @@ static void ipr_build_ata_ioadl(struct ipr_cmnd *ipr_cmd, { u32 ioadl_flags = 0; struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb; - struct ipr_ioadl_desc *ioadl = ipr_cmd->i.ioadl; + struct ipr_ioadl_desc *ioadl = ipr_cmd->ioadl; struct ipr_ioadl_desc *last_ioadl = NULL; int len = qc->nbytes; struct scatterlist *sg; @@ -5921,8 +5168,8 @@ static void ipr_build_ata_ioadl(struct ipr_cmnd *ipr_cmd, if (qc->dma_dir == DMA_TO_DEVICE) { ioadl_flags = IPR_IOADL_FLAGS_WRITE; ioarcb->cmd_pkt.flags_hi |= IPR_FLAGS_HI_WRITE_NOT_READ; - ioarcb->data_transfer_length = cpu_to_be32(len); - ioarcb->ioadl_len = + ioarcb->write_data_transfer_length = cpu_to_be32(len); + ioarcb->write_ioadl_len = cpu_to_be32(sizeof(struct ipr_ioadl_desc) * ipr_cmd->dma_use_sg); } else if (qc->dma_dir == DMA_FROM_DEVICE) { ioadl_flags = IPR_IOADL_FLAGS_READ; @@ -5965,34 +5212,25 @@ static unsigned int ipr_qc_issue(struct ata_queued_cmd *qc) ipr_cmd = ipr_get_free_ipr_cmnd(ioa_cfg); ioarcb = &ipr_cmd->ioarcb; + regs = &ioarcb->add_data.u.regs; - if (ioa_cfg->sis64) { - regs = &ipr_cmd->i.ata_ioadl.regs; - ioarcb->add_cmd_parms_offset = cpu_to_be16(sizeof(*ioarcb)); - } else - regs = &ioarcb->u.add_data.u.regs; - - memset(regs, 0, sizeof(*regs)); - ioarcb->add_cmd_parms_len = cpu_to_be16(sizeof(*regs)); + memset(&ioarcb->add_data, 0, sizeof(ioarcb->add_data)); + ioarcb->add_cmd_parms_len = cpu_to_be32(sizeof(ioarcb->add_data.u.regs)); list_add_tail(&ipr_cmd->queue, &ioa_cfg->pending_q); ipr_cmd->qc = qc; ipr_cmd->done = ipr_sata_done; - ipr_cmd->ioarcb.res_handle = res->res_handle; + ipr_cmd->ioarcb.res_handle = res->cfgte.res_handle; ioarcb->cmd_pkt.request_type = IPR_RQTYPE_ATA_PASSTHRU; ioarcb->cmd_pkt.flags_hi |= IPR_FLAGS_HI_NO_LINK_DESC; ioarcb->cmd_pkt.flags_hi |= IPR_FLAGS_HI_NO_ULEN_CHK; ipr_cmd->dma_use_sg = qc->n_elem; - if (ioa_cfg->sis64) - ipr_build_ata_ioadl64(ipr_cmd, qc); - else - ipr_build_ata_ioadl(ipr_cmd, qc); - + ipr_build_ata_ioadl(ipr_cmd, qc); regs->flags |= IPR_ATA_FLAG_STATUS_ON_GOOD_COMPLETION; ipr_copy_sata_tf(regs, &qc->tf); memcpy(ioarcb->cmd_pkt.cdb, qc->cdb, IPR_MAX_CDB_LEN); - ipr_trc_hook(ipr_cmd, IPR_TRACE_START, IPR_GET_RES_PHYS_LOC(res)); + ipr_trc_hook(ipr_cmd, IPR_TRACE_START, IPR_GET_PHYS_LOC(res->cfgte.res_addr)); switch (qc->tf.protocol) { case ATA_PROT_NODATA: @@ -6019,9 +5257,8 @@ static unsigned int ipr_qc_issue(struct ata_queued_cmd *qc) } mb(); - - ipr_send_command(ipr_cmd); - + writel(be32_to_cpu(ioarcb->ioarcb_host_pci_addr), + ioa_cfg->regs.ioarrin_reg); return 0; } @@ -6222,7 +5459,7 @@ static void ipr_set_sup_dev_dflt(struct ipr_supported_device *supported_dev, * ipr_set_supported_devs - Send Set Supported Devices for a device * @ipr_cmd: ipr command struct * - * This function sends a Set Supported Devices to the adapter + * This function send a Set Supported Devices to the adapter * * Return value: * IPR_RC_JOB_CONTINUE / IPR_RC_JOB_RETURN @@ -6231,6 +5468,7 @@ static int ipr_set_supported_devs(struct ipr_cmnd *ipr_cmd) { struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; struct ipr_supported_device *supp_dev = &ioa_cfg->vpd_cbs->supp_dev; + struct ipr_ioadl_desc *ioadl = ipr_cmd->ioadl; struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb; struct ipr_resource_entry *res = ipr_cmd->u.res; @@ -6241,34 +5479,64 @@ static int ipr_set_supported_devs(struct ipr_cmnd *ipr_cmd) continue; ipr_cmd->u.res = res; - ipr_set_sup_dev_dflt(supp_dev, &res->std_inq_data.vpids); + ipr_set_sup_dev_dflt(supp_dev, &res->cfgte.std_inq_data.vpids); ioarcb->res_handle = cpu_to_be32(IPR_IOA_RES_HANDLE); ioarcb->cmd_pkt.flags_hi |= IPR_FLAGS_HI_WRITE_NOT_READ; ioarcb->cmd_pkt.request_type = IPR_RQTYPE_IOACMD; ioarcb->cmd_pkt.cdb[0] = IPR_SET_SUPPORTED_DEVICES; - ioarcb->cmd_pkt.cdb[1] = IPR_SET_ALL_SUPPORTED_DEVICES; ioarcb->cmd_pkt.cdb[7] = (sizeof(struct ipr_supported_device) >> 8) & 0xff; ioarcb->cmd_pkt.cdb[8] = sizeof(struct ipr_supported_device) & 0xff; - ipr_init_ioadl(ipr_cmd, - ioa_cfg->vpd_cbs_dma + - offsetof(struct ipr_misc_cbs, supp_dev), - sizeof(struct ipr_supported_device), - IPR_IOADL_FLAGS_WRITE_LAST); + ioadl->flags_and_data_len = cpu_to_be32(IPR_IOADL_FLAGS_WRITE_LAST | + sizeof(struct ipr_supported_device)); + ioadl->address = cpu_to_be32(ioa_cfg->vpd_cbs_dma + + offsetof(struct ipr_misc_cbs, supp_dev)); + ioarcb->write_ioadl_len = cpu_to_be32(sizeof(struct ipr_ioadl_desc)); + ioarcb->write_data_transfer_length = + cpu_to_be32(sizeof(struct ipr_supported_device)); ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, IPR_SET_SUP_DEVICE_TIMEOUT); - if (!ioa_cfg->sis64) - ipr_cmd->job_step = ipr_set_supported_devs; + ipr_cmd->job_step = ipr_set_supported_devs; return IPR_RC_JOB_RETURN; } return IPR_RC_JOB_CONTINUE; } +/** + * ipr_setup_write_cache - Disable write cache if needed + * @ipr_cmd: ipr command struct + * + * This function sets up adapters write cache to desired setting + * + * Return value: + * IPR_RC_JOB_CONTINUE / IPR_RC_JOB_RETURN + **/ +static int ipr_setup_write_cache(struct ipr_cmnd *ipr_cmd) +{ + struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; + + ipr_cmd->job_step = ipr_set_supported_devs; + ipr_cmd->u.res = list_entry(ioa_cfg->used_res_q.next, + struct ipr_resource_entry, queue); + + if (ioa_cfg->cache_state != CACHE_DISABLED) + return IPR_RC_JOB_CONTINUE; + + ipr_cmd->ioarcb.res_handle = cpu_to_be32(IPR_IOA_RES_HANDLE); + ipr_cmd->ioarcb.cmd_pkt.request_type = IPR_RQTYPE_IOACMD; + ipr_cmd->ioarcb.cmd_pkt.cdb[0] = IPR_IOA_SHUTDOWN; + ipr_cmd->ioarcb.cmd_pkt.cdb[1] = IPR_SHUTDOWN_PREPARE_FOR_NORMAL; + + ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, IPR_INTERNAL_TIMEOUT); + + return IPR_RC_JOB_RETURN; +} + /** * ipr_get_mode_page - Locate specified mode page * @mode_pages: mode page buffer @@ -6427,9 +5695,10 @@ static void ipr_modify_ioafp_mode_page_28(struct ipr_ioa_cfg *ioa_cfg, * none **/ static void ipr_build_mode_select(struct ipr_cmnd *ipr_cmd, - __be32 res_handle, u8 parm, - dma_addr_t dma_addr, u8 xfer_len) + __be32 res_handle, u8 parm, u32 dma_addr, + u8 xfer_len) { + struct ipr_ioadl_desc *ioadl = ipr_cmd->ioadl; struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb; ioarcb->res_handle = res_handle; @@ -6439,7 +5708,11 @@ static void ipr_build_mode_select(struct ipr_cmnd *ipr_cmd, ioarcb->cmd_pkt.cdb[1] = parm; ioarcb->cmd_pkt.cdb[4] = xfer_len; - ipr_init_ioadl(ipr_cmd, dma_addr, xfer_len, IPR_IOADL_FLAGS_WRITE_LAST); + ioadl->flags_and_data_len = + cpu_to_be32(IPR_IOADL_FLAGS_WRITE_LAST | xfer_len); + ioadl->address = cpu_to_be32(dma_addr); + ioarcb->write_ioadl_len = cpu_to_be32(sizeof(struct ipr_ioadl_desc)); + ioarcb->write_data_transfer_length = cpu_to_be32(xfer_len); } /** @@ -6469,9 +5742,7 @@ static int ipr_ioafp_mode_select_page28(struct ipr_cmnd *ipr_cmd) ioa_cfg->vpd_cbs_dma + offsetof(struct ipr_misc_cbs, mode_pages), length); - ipr_cmd->job_step = ipr_set_supported_devs; - ipr_cmd->u.res = list_entry(ioa_cfg->used_res_q.next, - struct ipr_resource_entry, queue); + ipr_cmd->job_step = ipr_setup_write_cache; ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, IPR_INTERNAL_TIMEOUT); LEAVE; @@ -6491,8 +5762,9 @@ static int ipr_ioafp_mode_select_page28(struct ipr_cmnd *ipr_cmd) **/ static void ipr_build_mode_sense(struct ipr_cmnd *ipr_cmd, __be32 res_handle, - u8 parm, dma_addr_t dma_addr, u8 xfer_len) + u8 parm, u32 dma_addr, u8 xfer_len) { + struct ipr_ioadl_desc *ioadl = ipr_cmd->ioadl; struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb; ioarcb->res_handle = res_handle; @@ -6501,7 +5773,11 @@ static void ipr_build_mode_sense(struct ipr_cmnd *ipr_cmd, ioarcb->cmd_pkt.cdb[4] = xfer_len; ioarcb->cmd_pkt.request_type = IPR_RQTYPE_SCSICDB; - ipr_init_ioadl(ipr_cmd, dma_addr, xfer_len, IPR_IOADL_FLAGS_READ_LAST); + ioadl->flags_and_data_len = + cpu_to_be32(IPR_IOADL_FLAGS_READ_LAST | xfer_len); + ioadl->address = cpu_to_be32(dma_addr); + ioarcb->read_ioadl_len = cpu_to_be32(sizeof(struct ipr_ioadl_desc)); + ioarcb->read_data_transfer_length = cpu_to_be32(xfer_len); } /** @@ -6539,13 +5815,10 @@ static int ipr_reset_cmd_failed(struct ipr_cmnd *ipr_cmd) **/ static int ipr_reset_mode_sense_failed(struct ipr_cmnd *ipr_cmd) { - struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; u32 ioasc = be32_to_cpu(ipr_cmd->ioasa.ioasc); if (ioasc == IPR_IOASC_IR_INVALID_REQ_TYPE_OR_PKT) { - ipr_cmd->job_step = ipr_set_supported_devs; - ipr_cmd->u.res = list_entry(ioa_cfg->used_res_q.next, - struct ipr_resource_entry, queue); + ipr_cmd->job_step = ipr_setup_write_cache; return IPR_RC_JOB_CONTINUE; } @@ -6685,36 +5958,24 @@ static int ipr_init_res_table(struct ipr_cmnd *ipr_cmd) { struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; struct ipr_resource_entry *res, *temp; - struct ipr_config_table_entry_wrapper cfgtew; - int entries, found, flag, i; + struct ipr_config_table_entry *cfgte; + int found, i; LIST_HEAD(old_res); ENTER; - if (ioa_cfg->sis64) - flag = ioa_cfg->u.cfg_table64->hdr64.flags; - else - flag = ioa_cfg->u.cfg_table->hdr.flags; - - if (flag & IPR_UCODE_DOWNLOAD_REQ) + if (ioa_cfg->cfg_table->hdr.flags & IPR_UCODE_DOWNLOAD_REQ) dev_err(&ioa_cfg->pdev->dev, "Microcode download required\n"); list_for_each_entry_safe(res, temp, &ioa_cfg->used_res_q, queue) list_move_tail(&res->queue, &old_res); - if (ioa_cfg->sis64) - entries = ioa_cfg->u.cfg_table64->hdr64.num_entries; - else - entries = ioa_cfg->u.cfg_table->hdr.num_entries; - - for (i = 0; i < entries; i++) { - if (ioa_cfg->sis64) - cfgtew.u.cfgte64 = &ioa_cfg->u.cfg_table64->dev[i]; - else - cfgtew.u.cfgte = &ioa_cfg->u.cfg_table->dev[i]; + for (i = 0; i < ioa_cfg->cfg_table->hdr.num_entries; i++) { + cfgte = &ioa_cfg->cfg_table->dev[i]; found = 0; list_for_each_entry_safe(res, temp, &old_res, queue) { - if (ipr_is_same_device(res, &cfgtew)) { + if (!memcmp(&res->cfgte.res_addr, + &cfgte->res_addr, sizeof(cfgte->res_addr))) { list_move_tail(&res->queue, &ioa_cfg->used_res_q); found = 1; break; @@ -6731,27 +5992,24 @@ static int ipr_init_res_table(struct ipr_cmnd *ipr_cmd) res = list_entry(ioa_cfg->free_res_q.next, struct ipr_resource_entry, queue); list_move_tail(&res->queue, &ioa_cfg->used_res_q); - ipr_init_res_entry(res, &cfgtew); + ipr_init_res_entry(res); res->add_to_ml = 1; } if (found) - ipr_update_res_entry(res, &cfgtew); + memcpy(&res->cfgte, cfgte, sizeof(struct ipr_config_table_entry)); } list_for_each_entry_safe(res, temp, &old_res, queue) { if (res->sdev) { res->del_from_ml = 1; - res->res_handle = IPR_INVALID_RES_HANDLE; + res->cfgte.res_handle = IPR_INVALID_RES_HANDLE; list_move_tail(&res->queue, &ioa_cfg->used_res_q); + } else { + list_move_tail(&res->queue, &ioa_cfg->free_res_q); } } - list_for_each_entry_safe(res, temp, &old_res, queue) { - ipr_clear_res_target(res); - list_move_tail(&res->queue, &ioa_cfg->free_res_q); - } - if (ioa_cfg->dual_raid && ipr_dual_ioa_raid) ipr_cmd->job_step = ipr_ioafp_mode_sense_page24; else @@ -6775,6 +6033,7 @@ static int ipr_ioafp_query_ioa_cfg(struct ipr_cmnd *ipr_cmd) { struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb; + struct ipr_ioadl_desc *ioadl = ipr_cmd->ioadl; struct ipr_inquiry_page3 *ucode_vpd = &ioa_cfg->vpd_cbs->page3_data; struct ipr_inquiry_cap *cap = &ioa_cfg->vpd_cbs->cap; @@ -6788,11 +6047,16 @@ static int ipr_ioafp_query_ioa_cfg(struct ipr_cmnd *ipr_cmd) ioarcb->res_handle = cpu_to_be32(IPR_IOA_RES_HANDLE); ioarcb->cmd_pkt.cdb[0] = IPR_QUERY_IOA_CONFIG; - ioarcb->cmd_pkt.cdb[7] = (ioa_cfg->cfg_table_size >> 8) & 0xff; - ioarcb->cmd_pkt.cdb[8] = ioa_cfg->cfg_table_size & 0xff; + ioarcb->cmd_pkt.cdb[7] = (sizeof(struct ipr_config_table) >> 8) & 0xff; + ioarcb->cmd_pkt.cdb[8] = sizeof(struct ipr_config_table) & 0xff; + + ioarcb->read_ioadl_len = cpu_to_be32(sizeof(struct ipr_ioadl_desc)); + ioarcb->read_data_transfer_length = + cpu_to_be32(sizeof(struct ipr_config_table)); - ipr_init_ioadl(ipr_cmd, ioa_cfg->cfg_table_dma, ioa_cfg->cfg_table_size, - IPR_IOADL_FLAGS_READ_LAST); + ioadl->address = cpu_to_be32(ioa_cfg->cfg_table_dma); + ioadl->flags_and_data_len = + cpu_to_be32(IPR_IOADL_FLAGS_READ_LAST | sizeof(struct ipr_config_table)); ipr_cmd->job_step = ipr_init_res_table; @@ -6812,9 +6076,10 @@ static int ipr_ioafp_query_ioa_cfg(struct ipr_cmnd *ipr_cmd) * none **/ static void ipr_ioafp_inquiry(struct ipr_cmnd *ipr_cmd, u8 flags, u8 page, - dma_addr_t dma_addr, u8 xfer_len) + u32 dma_addr, u8 xfer_len) { struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb; + struct ipr_ioadl_desc *ioadl = ipr_cmd->ioadl; ENTER; ioarcb->cmd_pkt.request_type = IPR_RQTYPE_SCSICDB; @@ -6825,7 +6090,12 @@ static void ipr_ioafp_inquiry(struct ipr_cmnd *ipr_cmd, u8 flags, u8 page, ioarcb->cmd_pkt.cdb[2] = page; ioarcb->cmd_pkt.cdb[4] = xfer_len; - ipr_init_ioadl(ipr_cmd, dma_addr, xfer_len, IPR_IOADL_FLAGS_READ_LAST); + ioarcb->read_ioadl_len = cpu_to_be32(sizeof(struct ipr_ioadl_desc)); + ioarcb->read_data_transfer_length = cpu_to_be32(xfer_len); + + ioadl->address = cpu_to_be32(dma_addr); + ioadl->flags_and_data_len = + cpu_to_be32(IPR_IOADL_FLAGS_READ_LAST | xfer_len); ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, IPR_INTERNAL_TIMEOUT); LEAVE; @@ -6896,9 +6166,13 @@ static int ipr_ioafp_cap_inquiry(struct ipr_cmnd *ipr_cmd) static int ipr_ioafp_page3_inquiry(struct ipr_cmnd *ipr_cmd) { struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; + struct ipr_inquiry_page0 *page0 = &ioa_cfg->vpd_cbs->page0_data; ENTER; + if (!ipr_inquiry_page_supported(page0, 1)) + ioa_cfg->cache_state = CACHE_NONE; + ipr_cmd->job_step = ipr_ioafp_cap_inquiry; ipr_ioafp_inquiry(ipr_cmd, 1, 3, @@ -6966,7 +6240,7 @@ static int ipr_ioafp_std_inquiry(struct ipr_cmnd *ipr_cmd) } /** - * ipr_ioafp_identify_hrrq - Send Identify Host RRQ. + * ipr_ioafp_indentify_hrrq - Send Identify Host RRQ. * @ipr_cmd: ipr command struct * * This function send an Identify Host Request Response Queue @@ -6975,7 +6249,7 @@ static int ipr_ioafp_std_inquiry(struct ipr_cmnd *ipr_cmd) * Return value: * IPR_RC_JOB_RETURN **/ -static int ipr_ioafp_identify_hrrq(struct ipr_cmnd *ipr_cmd) +static int ipr_ioafp_indentify_hrrq(struct ipr_cmnd *ipr_cmd) { struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb; @@ -6987,32 +6261,19 @@ static int ipr_ioafp_identify_hrrq(struct ipr_cmnd *ipr_cmd) ioarcb->res_handle = cpu_to_be32(IPR_IOA_RES_HANDLE); ioarcb->cmd_pkt.request_type = IPR_RQTYPE_IOACMD; - if (ioa_cfg->sis64) - ioarcb->cmd_pkt.cdb[1] = 0x1; ioarcb->cmd_pkt.cdb[2] = - ((u64) ioa_cfg->host_rrq_dma >> 24) & 0xff; + ((u32) ioa_cfg->host_rrq_dma >> 24) & 0xff; ioarcb->cmd_pkt.cdb[3] = - ((u64) ioa_cfg->host_rrq_dma >> 16) & 0xff; + ((u32) ioa_cfg->host_rrq_dma >> 16) & 0xff; ioarcb->cmd_pkt.cdb[4] = - ((u64) ioa_cfg->host_rrq_dma >> 8) & 0xff; + ((u32) ioa_cfg->host_rrq_dma >> 8) & 0xff; ioarcb->cmd_pkt.cdb[5] = - ((u64) ioa_cfg->host_rrq_dma) & 0xff; + ((u32) ioa_cfg->host_rrq_dma) & 0xff; ioarcb->cmd_pkt.cdb[7] = ((sizeof(u32) * IPR_NUM_CMD_BLKS) >> 8) & 0xff; ioarcb->cmd_pkt.cdb[8] = (sizeof(u32) * IPR_NUM_CMD_BLKS) & 0xff; - if (ioa_cfg->sis64) { - ioarcb->cmd_pkt.cdb[10] = - ((u64) ioa_cfg->host_rrq_dma >> 56) & 0xff; - ioarcb->cmd_pkt.cdb[11] = - ((u64) ioa_cfg->host_rrq_dma >> 48) & 0xff; - ioarcb->cmd_pkt.cdb[12] = - ((u64) ioa_cfg->host_rrq_dma >> 40) & 0xff; - ioarcb->cmd_pkt.cdb[13] = - ((u64) ioa_cfg->host_rrq_dma >> 32) & 0xff; - } - ipr_cmd->job_step = ipr_ioafp_std_inquiry; ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, IPR_INTERNAL_TIMEOUT); @@ -7093,58 +6354,7 @@ static void ipr_init_ioa_mem(struct ipr_ioa_cfg *ioa_cfg) ioa_cfg->toggle_bit = 1; /* Zero out config table */ - memset(ioa_cfg->u.cfg_table, 0, ioa_cfg->cfg_table_size); -} - -/** - * ipr_reset_next_stage - Process IPL stage change based on feedback register. - * @ipr_cmd: ipr command struct - * - * Return value: - * IPR_RC_JOB_CONTINUE / IPR_RC_JOB_RETURN - **/ -static int ipr_reset_next_stage(struct ipr_cmnd *ipr_cmd) -{ - unsigned long stage, stage_time; - u32 feedback; - volatile u32 int_reg; - struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; - u64 maskval = 0; - - feedback = readl(ioa_cfg->regs.init_feedback_reg); - stage = feedback & IPR_IPL_INIT_STAGE_MASK; - stage_time = feedback & IPR_IPL_INIT_STAGE_TIME_MASK; - - ipr_dbg("IPL stage = 0x%lx, IPL stage time = %ld\n", stage, stage_time); - - /* sanity check the stage_time value */ - if (stage_time < IPR_IPL_INIT_MIN_STAGE_TIME) - stage_time = IPR_IPL_INIT_MIN_STAGE_TIME; - else if (stage_time > IPR_LONG_OPERATIONAL_TIMEOUT) - stage_time = IPR_LONG_OPERATIONAL_TIMEOUT; - - if (stage == IPR_IPL_INIT_STAGE_UNKNOWN) { - writel(IPR_PCII_IPL_STAGE_CHANGE, ioa_cfg->regs.set_interrupt_mask_reg); - int_reg = readl(ioa_cfg->regs.sense_interrupt_mask_reg); - stage_time = ioa_cfg->transop_timeout; - ipr_cmd->job_step = ipr_ioafp_identify_hrrq; - } else if (stage == IPR_IPL_INIT_STAGE_TRANSOP) { - ipr_cmd->job_step = ipr_ioafp_identify_hrrq; - maskval = IPR_PCII_IPL_STAGE_CHANGE; - maskval = (maskval << 32) | IPR_PCII_IOA_TRANS_TO_OPER; - writeq(maskval, ioa_cfg->regs.set_interrupt_mask_reg); - int_reg = readl(ioa_cfg->regs.sense_interrupt_mask_reg); - return IPR_RC_JOB_CONTINUE; - } - - ipr_cmd->timer.data = (unsigned long) ipr_cmd; - ipr_cmd->timer.expires = jiffies + stage_time * HZ; - ipr_cmd->timer.function = (void (*)(unsigned long))ipr_oper_timeout; - ipr_cmd->done = ipr_reset_ioa_job; - add_timer(&ipr_cmd->timer); - list_add_tail(&ipr_cmd->queue, &ioa_cfg->pending_q); - - return IPR_RC_JOB_RETURN; + memset(ioa_cfg->cfg_table, 0, sizeof(struct ipr_config_table)); } /** @@ -7163,7 +6373,7 @@ static int ipr_reset_enable_ioa(struct ipr_cmnd *ipr_cmd) volatile u32 int_reg; ENTER; - ipr_cmd->job_step = ipr_ioafp_identify_hrrq; + ipr_cmd->job_step = ipr_ioafp_indentify_hrrq; ipr_init_ioa_mem(ioa_cfg); ioa_cfg->allow_interrupts = 1; @@ -7171,27 +6381,19 @@ static int ipr_reset_enable_ioa(struct ipr_cmnd *ipr_cmd) if (int_reg & IPR_PCII_IOA_TRANS_TO_OPER) { writel((IPR_PCII_ERROR_INTERRUPTS | IPR_PCII_HRRQ_UPDATED), - ioa_cfg->regs.clr_interrupt_mask_reg32); + ioa_cfg->regs.clr_interrupt_mask_reg); int_reg = readl(ioa_cfg->regs.sense_interrupt_mask_reg); return IPR_RC_JOB_CONTINUE; } /* Enable destructive diagnostics on IOA */ - writel(ioa_cfg->doorbell, ioa_cfg->regs.set_uproc_interrupt_reg32); - - writel(IPR_PCII_OPER_INTERRUPTS, ioa_cfg->regs.clr_interrupt_mask_reg32); - if (ioa_cfg->sis64) - writel(IPR_PCII_IPL_STAGE_CHANGE, ioa_cfg->regs.clr_interrupt_mask_reg); + writel(ioa_cfg->doorbell, ioa_cfg->regs.set_uproc_interrupt_reg); + writel(IPR_PCII_OPER_INTERRUPTS, ioa_cfg->regs.clr_interrupt_mask_reg); int_reg = readl(ioa_cfg->regs.sense_interrupt_mask_reg); dev_info(&ioa_cfg->pdev->dev, "Initializing IOA.\n"); - if (ioa_cfg->sis64) { - ipr_cmd->job_step = ipr_reset_next_stage; - return IPR_RC_JOB_CONTINUE; - } - ipr_cmd->timer.data = (unsigned long) ipr_cmd; ipr_cmd->timer.expires = jiffies + (ioa_cfg->transop_timeout * HZ); ipr_cmd->timer.function = (void (*)(unsigned long))ipr_oper_timeout; @@ -7261,7 +6463,7 @@ static void ipr_get_unit_check_buffer(struct ipr_ioa_cfg *ioa_cfg) mailbox = readl(ioa_cfg->ioa_mailbox); - if (!ioa_cfg->sis64 && !ipr_sdt_is_fmt2(mailbox)) { + if (!ipr_sdt_is_fmt2(mailbox)) { ipr_unit_check_no_data(ioa_cfg); return; } @@ -7270,20 +6472,15 @@ static void ipr_get_unit_check_buffer(struct ipr_ioa_cfg *ioa_cfg) rc = ipr_get_ldump_data_section(ioa_cfg, mailbox, (__be32 *) &sdt, (sizeof(struct ipr_uc_sdt)) / sizeof(__be32)); - if (rc || !(sdt.entry[0].flags & IPR_SDT_VALID_ENTRY) || - ((be32_to_cpu(sdt.hdr.state) != IPR_FMT3_SDT_READY_TO_USE) && - (be32_to_cpu(sdt.hdr.state) != IPR_FMT2_SDT_READY_TO_USE))) { + if (rc || (be32_to_cpu(sdt.hdr.state) != IPR_FMT2_SDT_READY_TO_USE) || + !(sdt.entry[0].flags & IPR_SDT_VALID_ENTRY)) { ipr_unit_check_no_data(ioa_cfg); return; } /* Find length of the first sdt entry (UC buffer) */ - if (be32_to_cpu(sdt.hdr.state) == IPR_FMT3_SDT_READY_TO_USE) - length = be32_to_cpu(sdt.entry[0].end_token); - else - length = (be32_to_cpu(sdt.entry[0].end_token) - - be32_to_cpu(sdt.entry[0].start_token)) & - IPR_FMT2_MBX_ADDR_MASK; + length = (be32_to_cpu(sdt.entry[0].end_offset) - + be32_to_cpu(sdt.entry[0].bar_str_offset)) & IPR_FMT2_MBX_ADDR_MASK; hostrcb = list_entry(ioa_cfg->hostrcb_free_q.next, struct ipr_hostrcb, queue); @@ -7291,13 +6488,13 @@ static void ipr_get_unit_check_buffer(struct ipr_ioa_cfg *ioa_cfg) memset(&hostrcb->hcam, 0, sizeof(hostrcb->hcam)); rc = ipr_get_ldump_data_section(ioa_cfg, - be32_to_cpu(sdt.entry[0].start_token), + be32_to_cpu(sdt.entry[0].bar_str_offset), (__be32 *)&hostrcb->hcam, min(length, (int)sizeof(hostrcb->hcam)) / sizeof(__be32)); if (!rc) { ipr_handle_log_data(ioa_cfg, hostrcb); - ioasc = be32_to_cpu(hostrcb->hcam.u.error.fd_ioasc); + ioasc = be32_to_cpu(hostrcb->hcam.u.error.failing_dev_ioasc); if (ioasc == IPR_IOASC_NR_IOA_RESET_REQUIRED && ioa_cfg->sdt_state == GET_DUMP) ioa_cfg->sdt_state = WAIT_FOR_DUMP; @@ -7525,7 +6722,7 @@ static int ipr_reset_alert(struct ipr_cmnd *ipr_cmd) if ((rc == PCIBIOS_SUCCESSFUL) && (cmd_reg & PCI_COMMAND_MEMORY)) { ipr_mask_and_clear_interrupts(ioa_cfg, ~0); - writel(IPR_UPROCI_RESET_ALERT, ioa_cfg->regs.set_uproc_interrupt_reg32); + writel(IPR_UPROCI_RESET_ALERT, ioa_cfg->regs.set_uproc_interrupt_reg); ipr_cmd->job_step = ipr_reset_wait_to_start_bist; } else { ipr_cmd->job_step = ioa_cfg->reset; @@ -7588,10 +6785,7 @@ static int ipr_reset_ucode_download(struct ipr_cmnd *ipr_cmd) ipr_cmd->ioarcb.cmd_pkt.cdb[7] = (sglist->buffer_len & 0x00ff00) >> 8; ipr_cmd->ioarcb.cmd_pkt.cdb[8] = sglist->buffer_len & 0x0000ff; - if (ioa_cfg->sis64) - ipr_build_ucode_ioadl64(ipr_cmd, sglist); - else - ipr_build_ucode_ioadl(ipr_cmd, sglist); + ipr_build_ucode_ioadl(ipr_cmd, sglist); ipr_cmd->job_step = ipr_reset_ucode_download_done; ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, @@ -7960,8 +7154,8 @@ static void ipr_free_mem(struct ipr_ioa_cfg *ioa_cfg) ipr_free_cmd_blks(ioa_cfg); pci_free_consistent(ioa_cfg->pdev, sizeof(u32) * IPR_NUM_CMD_BLKS, ioa_cfg->host_rrq, ioa_cfg->host_rrq_dma); - pci_free_consistent(ioa_cfg->pdev, ioa_cfg->cfg_table_size, - ioa_cfg->u.cfg_table, + pci_free_consistent(ioa_cfg->pdev, sizeof(struct ipr_config_table), + ioa_cfg->cfg_table, ioa_cfg->cfg_table_dma); for (i = 0; i < IPR_NUM_HCAMS; i++) { @@ -8015,7 +7209,7 @@ static int __devinit ipr_alloc_cmd_blks(struct ipr_ioa_cfg *ioa_cfg) int i; ioa_cfg->ipr_cmd_pool = pci_pool_create (IPR_NAME, ioa_cfg->pdev, - sizeof(struct ipr_cmnd), 16, 0); + sizeof(struct ipr_cmnd), 8, 0); if (!ioa_cfg->ipr_cmd_pool) return -ENOMEM; @@ -8033,25 +7227,13 @@ static int __devinit ipr_alloc_cmd_blks(struct ipr_ioa_cfg *ioa_cfg) ioa_cfg->ipr_cmnd_list_dma[i] = dma_addr; ioarcb = &ipr_cmd->ioarcb; - ipr_cmd->dma_addr = dma_addr; - if (ioa_cfg->sis64) - ioarcb->a.ioarcb_host_pci_addr64 = cpu_to_be64(dma_addr); - else - ioarcb->a.ioarcb_host_pci_addr = cpu_to_be32(dma_addr); - + ioarcb->ioarcb_host_pci_addr = cpu_to_be32(dma_addr); ioarcb->host_response_handle = cpu_to_be32(i << 2); - if (ioa_cfg->sis64) { - ioarcb->u.sis64_addr_data.data_ioadl_addr = - cpu_to_be64(dma_addr + offsetof(struct ipr_cmnd, i.ioadl64)); - ioarcb->u.sis64_addr_data.ioasa_host_pci_addr = - cpu_to_be64(dma_addr + offsetof(struct ipr_cmnd, ioasa)); - } else { - ioarcb->write_ioadl_addr = - cpu_to_be32(dma_addr + offsetof(struct ipr_cmnd, i.ioadl)); - ioarcb->read_ioadl_addr = ioarcb->write_ioadl_addr; - ioarcb->ioasa_host_pci_addr = - cpu_to_be32(dma_addr + offsetof(struct ipr_cmnd, ioasa)); - } + ioarcb->write_ioadl_addr = + cpu_to_be32(dma_addr + offsetof(struct ipr_cmnd, ioadl)); + ioarcb->read_ioadl_addr = ioarcb->write_ioadl_addr; + ioarcb->ioasa_host_pci_addr = + cpu_to_be32(dma_addr + offsetof(struct ipr_cmnd, ioasa)); ioarcb->ioasa_len = cpu_to_be16(sizeof(struct ipr_ioasa)); ipr_cmd->cmd_index = i; ipr_cmd->ioa_cfg = ioa_cfg; @@ -8078,24 +7260,13 @@ static int __devinit ipr_alloc_mem(struct ipr_ioa_cfg *ioa_cfg) ENTER; ioa_cfg->res_entries = kzalloc(sizeof(struct ipr_resource_entry) * - ioa_cfg->max_devs_supported, GFP_KERNEL); + IPR_MAX_PHYSICAL_DEVS, GFP_KERNEL); if (!ioa_cfg->res_entries) goto out; - if (ioa_cfg->sis64) { - ioa_cfg->target_ids = kzalloc(sizeof(unsigned long) * - BITS_TO_LONGS(ioa_cfg->max_devs_supported), GFP_KERNEL); - ioa_cfg->array_ids = kzalloc(sizeof(unsigned long) * - BITS_TO_LONGS(ioa_cfg->max_devs_supported), GFP_KERNEL); - ioa_cfg->vset_ids = kzalloc(sizeof(unsigned long) * - BITS_TO_LONGS(ioa_cfg->max_devs_supported), GFP_KERNEL); - } - - for (i = 0; i < ioa_cfg->max_devs_supported; i++) { + for (i = 0; i < IPR_MAX_PHYSICAL_DEVS; i++) list_add_tail(&ioa_cfg->res_entries[i].queue, &ioa_cfg->free_res_q); - ioa_cfg->res_entries[i].ioa_cfg = ioa_cfg; - } ioa_cfg->vpd_cbs = pci_alloc_consistent(ioa_cfg->pdev, sizeof(struct ipr_misc_cbs), @@ -8114,11 +7285,11 @@ static int __devinit ipr_alloc_mem(struct ipr_ioa_cfg *ioa_cfg) if (!ioa_cfg->host_rrq) goto out_ipr_free_cmd_blocks; - ioa_cfg->u.cfg_table = pci_alloc_consistent(ioa_cfg->pdev, - ioa_cfg->cfg_table_size, - &ioa_cfg->cfg_table_dma); + ioa_cfg->cfg_table = pci_alloc_consistent(ioa_cfg->pdev, + sizeof(struct ipr_config_table), + &ioa_cfg->cfg_table_dma); - if (!ioa_cfg->u.cfg_table) + if (!ioa_cfg->cfg_table) goto out_free_host_rrq; for (i = 0; i < IPR_NUM_HCAMS; i++) { @@ -8152,9 +7323,8 @@ static int __devinit ipr_alloc_mem(struct ipr_ioa_cfg *ioa_cfg) ioa_cfg->hostrcb[i], ioa_cfg->hostrcb_dma[i]); } - pci_free_consistent(pdev, ioa_cfg->cfg_table_size, - ioa_cfg->u.cfg_table, - ioa_cfg->cfg_table_dma); + pci_free_consistent(pdev, sizeof(struct ipr_config_table), + ioa_cfg->cfg_table, ioa_cfg->cfg_table_dma); out_free_host_rrq: pci_free_consistent(pdev, sizeof(u32) * IPR_NUM_CMD_BLKS, ioa_cfg->host_rrq, ioa_cfg->host_rrq_dma); @@ -8229,21 +7399,15 @@ static void __devinit ipr_init_ioa_cfg(struct ipr_ioa_cfg *ioa_cfg, init_waitqueue_head(&ioa_cfg->reset_wait_q); init_waitqueue_head(&ioa_cfg->msi_wait_q); ioa_cfg->sdt_state = INACTIVE; + if (ipr_enable_cache) + ioa_cfg->cache_state = CACHE_ENABLED; + else + ioa_cfg->cache_state = CACHE_DISABLED; ipr_initialize_bus_attr(ioa_cfg); - ioa_cfg->max_devs_supported = ipr_max_devs; - if (ioa_cfg->sis64) { - host->max_id = IPR_MAX_SIS64_TARGETS_PER_BUS; - host->max_lun = IPR_MAX_SIS64_LUNS_PER_TARGET; - if (ipr_max_devs > IPR_MAX_SIS64_DEVS) - ioa_cfg->max_devs_supported = IPR_MAX_SIS64_DEVS; - } else { - host->max_id = IPR_MAX_NUM_TARGETS_PER_BUS; - host->max_lun = IPR_MAX_NUM_LUNS_PER_TARGET; - if (ipr_max_devs > IPR_MAX_PHYSICAL_DEVS) - ioa_cfg->max_devs_supported = IPR_MAX_PHYSICAL_DEVS; - } + host->max_id = IPR_MAX_NUM_TARGETS_PER_BUS; + host->max_lun = IPR_MAX_NUM_LUNS_PER_TARGET; host->max_channel = IPR_MAX_BUS_TO_SCAN; host->unique_id = host->host_no; host->max_cmd_len = IPR_MAX_CDB_LEN; @@ -8255,26 +7419,13 @@ static void __devinit ipr_init_ioa_cfg(struct ipr_ioa_cfg *ioa_cfg, t->set_interrupt_mask_reg = base + p->set_interrupt_mask_reg; t->clr_interrupt_mask_reg = base + p->clr_interrupt_mask_reg; - t->clr_interrupt_mask_reg32 = base + p->clr_interrupt_mask_reg32; t->sense_interrupt_mask_reg = base + p->sense_interrupt_mask_reg; - t->sense_interrupt_mask_reg32 = base + p->sense_interrupt_mask_reg32; t->clr_interrupt_reg = base + p->clr_interrupt_reg; - t->clr_interrupt_reg32 = base + p->clr_interrupt_reg32; t->sense_interrupt_reg = base + p->sense_interrupt_reg; - t->sense_interrupt_reg32 = base + p->sense_interrupt_reg32; t->ioarrin_reg = base + p->ioarrin_reg; t->sense_uproc_interrupt_reg = base + p->sense_uproc_interrupt_reg; - t->sense_uproc_interrupt_reg32 = base + p->sense_uproc_interrupt_reg32; t->set_uproc_interrupt_reg = base + p->set_uproc_interrupt_reg; - t->set_uproc_interrupt_reg32 = base + p->set_uproc_interrupt_reg32; t->clr_uproc_interrupt_reg = base + p->clr_uproc_interrupt_reg; - t->clr_uproc_interrupt_reg32 = base + p->clr_uproc_interrupt_reg32; - - if (ioa_cfg->sis64) { - t->init_feedback_reg = base + p->init_feedback_reg; - t->dump_addr_reg = base + p->dump_addr_reg; - t->dump_data_reg = base + p->dump_data_reg; - } } /** @@ -8346,7 +7497,7 @@ static int __devinit ipr_test_msi(struct ipr_ioa_cfg *ioa_cfg, init_waitqueue_head(&ioa_cfg->msi_wait_q); ioa_cfg->msi_received = 0; ipr_mask_and_clear_interrupts(ioa_cfg, ~IPR_PCII_IOA_TRANS_TO_OPER); - writel(IPR_PCII_IO_DEBUG_ACKNOWLEDGE, ioa_cfg->regs.clr_interrupt_mask_reg32); + writel(IPR_PCII_IO_DEBUG_ACKNOWLEDGE, ioa_cfg->regs.clr_interrupt_mask_reg); int_reg = readl(ioa_cfg->regs.sense_interrupt_mask_reg); spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); @@ -8357,7 +7508,7 @@ static int __devinit ipr_test_msi(struct ipr_ioa_cfg *ioa_cfg, } else if (ipr_debug) dev_info(&pdev->dev, "IRQ assigned: %d\n", pdev->irq); - writel(IPR_PCII_IO_DEBUG_ACKNOWLEDGE, ioa_cfg->regs.sense_interrupt_reg32); + writel(IPR_PCII_IO_DEBUG_ACKNOWLEDGE, ioa_cfg->regs.sense_interrupt_reg); int_reg = readl(ioa_cfg->regs.sense_interrupt_reg); wait_event_timeout(ioa_cfg->msi_wait_q, ioa_cfg->msi_received, HZ); ipr_mask_and_clear_interrupts(ioa_cfg, ~IPR_PCII_IOA_TRANS_TO_OPER); @@ -8427,8 +7578,6 @@ static int __devinit ipr_probe_ioa(struct pci_dev *pdev, goto out_scsi_host_put; } - /* set SIS 32 or SIS 64 */ - ioa_cfg->sis64 = ioa_cfg->ipr_chip->sis_type == IPR_SIS64 ? 1 : 0; ioa_cfg->chip_cfg = ioa_cfg->ipr_chip->cfg; if (ipr_transop_timeout) @@ -8466,16 +7615,7 @@ static int __devinit ipr_probe_ioa(struct pci_dev *pdev, pci_set_master(pdev); - if (ioa_cfg->sis64) { - rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(64)); - if (rc < 0) { - dev_dbg(&pdev->dev, "Failed to set 64 bit PCI DMA mask\n"); - rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32)); - } - - } else - rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32)); - + rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32)); if (rc < 0) { dev_err(&pdev->dev, "Failed to set PCI DMA mask\n"); goto cleanup_nomem; @@ -8517,15 +7657,6 @@ static int __devinit ipr_probe_ioa(struct pci_dev *pdev, if ((rc = ipr_set_pcix_cmd_reg(ioa_cfg))) goto cleanup_nomem; - if (ioa_cfg->sis64) - ioa_cfg->cfg_table_size = (sizeof(struct ipr_config_table_hdr64) - + ((sizeof(struct ipr_config_table_entry64) - * ioa_cfg->max_devs_supported))); - else - ioa_cfg->cfg_table_size = (sizeof(struct ipr_config_table_hdr) - + ((sizeof(struct ipr_config_table_entry) - * ioa_cfg->max_devs_supported))); - rc = ipr_alloc_mem(ioa_cfg); if (rc < 0) { dev_err(&pdev->dev, @@ -8537,9 +7668,9 @@ static int __devinit ipr_probe_ioa(struct pci_dev *pdev, * If HRRQ updated interrupt is not masked, or reset alert is set, * the card is in an unknown state and needs a hard reset */ - mask = readl(ioa_cfg->regs.sense_interrupt_mask_reg32); - interrupts = readl(ioa_cfg->regs.sense_interrupt_reg32); - uproc = readl(ioa_cfg->regs.sense_uproc_interrupt_reg32); + mask = readl(ioa_cfg->regs.sense_interrupt_mask_reg); + interrupts = readl(ioa_cfg->regs.sense_interrupt_reg); + uproc = readl(ioa_cfg->regs.sense_uproc_interrupt_reg); if ((mask & IPR_PCII_HRRQ_UPDATED) == 0 || (uproc & IPR_UPROCI_RESET_ALERT)) ioa_cfg->needs_hard_reset = 1; if (interrupts & IPR_PCII_ERROR_INTERRUPTS) @@ -8826,6 +7957,9 @@ static struct pci_device_id ipr_pci_table[] __devinitdata = { { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_OBSIDIAN_E, PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_574E, 0, 0, IPR_USE_LONG_TRANSOP_TIMEOUT }, + { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_OBSIDIAN_E, + PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_575D, 0, 0, + IPR_USE_LONG_TRANSOP_TIMEOUT }, { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_OBSIDIAN_E, PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_57B3, 0, 0, 0 }, { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_OBSIDIAN_E, @@ -8841,22 +7975,9 @@ static struct pci_device_id ipr_pci_table[] __devinitdata = { { PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_SCAMP, PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_572F, 0, 0, IPR_USE_LONG_TRANSOP_TIMEOUT }, - { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CROC_FPGA_E2, - PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_57B5, 0, 0, 0 }, - { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CROC_FPGA_E2, - PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_574D, 0, 0, 0 }, - { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CROC_FPGA_E2, - PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_57B2, 0, 0, 0 }, - { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CROC_ASIC_E2, - PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_57B4, 0, 0, 0 }, - { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CROC_ASIC_E2, - PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_57B1, 0, 0, 0 }, - { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CROC_ASIC_E2, - PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_57C6, 0, 0, 0 }, - { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CROC_ASIC_E2, - PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_575D, 0, 0, 0 }, - { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CROC_ASIC_E2, - PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_57CE, 0, 0, 0 }, + { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_SCAMP_E, + PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_574D, 0, 0, + IPR_USE_LONG_TRANSOP_TIMEOUT }, { } }; MODULE_DEVICE_TABLE(pci, ipr_pci_table); @@ -8875,61 +7996,6 @@ static struct pci_driver ipr_driver = { .err_handler = &ipr_err_handler, }; -/** - * ipr_halt_done - Shutdown prepare completion - * - * Return value: - * none - **/ -static void ipr_halt_done(struct ipr_cmnd *ipr_cmd) -{ - struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; - - list_add_tail(&ipr_cmd->queue, &ioa_cfg->free_q); -} - -/** - * ipr_halt - Issue shutdown prepare to all adapters - * - * Return value: - * NOTIFY_OK on success / NOTIFY_DONE on failure - **/ -static int ipr_halt(struct notifier_block *nb, ulong event, void *buf) -{ - struct ipr_cmnd *ipr_cmd; - struct ipr_ioa_cfg *ioa_cfg; - unsigned long flags = 0; - - if (event != SYS_RESTART && event != SYS_HALT && event != SYS_POWER_OFF) - return NOTIFY_DONE; - - spin_lock(&ipr_driver_lock); - - list_for_each_entry(ioa_cfg, &ipr_ioa_head, queue) { - spin_lock_irqsave(ioa_cfg->host->host_lock, flags); - if (!ioa_cfg->allow_cmds) { - spin_unlock_irqrestore(ioa_cfg->host->host_lock, flags); - continue; - } - - ipr_cmd = ipr_get_free_ipr_cmnd(ioa_cfg); - ipr_cmd->ioarcb.res_handle = cpu_to_be32(IPR_IOA_RES_HANDLE); - ipr_cmd->ioarcb.cmd_pkt.request_type = IPR_RQTYPE_IOACMD; - ipr_cmd->ioarcb.cmd_pkt.cdb[0] = IPR_IOA_SHUTDOWN; - ipr_cmd->ioarcb.cmd_pkt.cdb[1] = IPR_SHUTDOWN_PREPARE_FOR_NORMAL; - - ipr_do_req(ipr_cmd, ipr_halt_done, ipr_timeout, IPR_DEVICE_RESET_TIMEOUT); - spin_unlock_irqrestore(ioa_cfg->host->host_lock, flags); - } - spin_unlock(&ipr_driver_lock); - - return NOTIFY_OK; -} - -static struct notifier_block ipr_notifier = { - ipr_halt, NULL, 0 -}; - /** * ipr_init - Module entry point * @@ -8941,7 +8007,6 @@ static int __init ipr_init(void) ipr_info("IBM Power RAID SCSI Device Driver version: %s %s\n", IPR_DRIVER_VERSION, IPR_DRIVER_DATE); - register_reboot_notifier(&ipr_notifier); return pci_register_driver(&ipr_driver); } @@ -8955,7 +8020,6 @@ static int __init ipr_init(void) **/ static void __exit ipr_exit(void) { - unregister_reboot_notifier(&ipr_notifier); pci_unregister_driver(&ipr_driver); } diff --git a/trunk/drivers/scsi/ipr.h b/trunk/drivers/scsi/ipr.h index 4c267b5e0b96..19bbcf39f0c9 100644 --- a/trunk/drivers/scsi/ipr.h +++ b/trunk/drivers/scsi/ipr.h @@ -37,8 +37,8 @@ /* * Literals */ -#define IPR_DRIVER_VERSION "2.5.0" -#define IPR_DRIVER_DATE "(February 11, 2010)" +#define IPR_DRIVER_VERSION "2.4.3" +#define IPR_DRIVER_DATE "(June 10, 2009)" /* * IPR_MAX_CMD_PER_LUN: This defines the maximum number of outstanding @@ -55,9 +55,7 @@ #define IPR_NUM_BASE_CMD_BLKS 100 #define PCI_DEVICE_ID_IBM_OBSIDIAN_E 0x0339 - -#define PCI_DEVICE_ID_IBM_CROC_FPGA_E2 0x033D -#define PCI_DEVICE_ID_IBM_CROC_ASIC_E2 0x034A +#define PCI_DEVICE_ID_IBM_SCAMP_E 0x034A #define IPR_SUBS_DEV_ID_2780 0x0264 #define IPR_SUBS_DEV_ID_5702 0x0266 @@ -72,24 +70,15 @@ #define IPR_SUBS_DEV_ID_572A 0x02C1 #define IPR_SUBS_DEV_ID_572B 0x02C2 #define IPR_SUBS_DEV_ID_572F 0x02C3 +#define IPR_SUBS_DEV_ID_574D 0x030B #define IPR_SUBS_DEV_ID_574E 0x030A #define IPR_SUBS_DEV_ID_575B 0x030D #define IPR_SUBS_DEV_ID_575C 0x0338 +#define IPR_SUBS_DEV_ID_575D 0x033E #define IPR_SUBS_DEV_ID_57B3 0x033A #define IPR_SUBS_DEV_ID_57B7 0x0360 #define IPR_SUBS_DEV_ID_57B8 0x02C2 -#define IPR_SUBS_DEV_ID_57B4 0x033B -#define IPR_SUBS_DEV_ID_57B2 0x035F -#define IPR_SUBS_DEV_ID_57C6 0x0357 - -#define IPR_SUBS_DEV_ID_57B5 0x033C -#define IPR_SUBS_DEV_ID_57CE 0x035E -#define IPR_SUBS_DEV_ID_57B1 0x0355 - -#define IPR_SUBS_DEV_ID_574D 0x0356 -#define IPR_SUBS_DEV_ID_575D 0x035D - #define IPR_NAME "ipr" /* @@ -129,10 +118,6 @@ #define IPR_NUM_LOG_HCAMS 2 #define IPR_NUM_CFG_CHG_HCAMS 2 #define IPR_NUM_HCAMS (IPR_NUM_LOG_HCAMS + IPR_NUM_CFG_CHG_HCAMS) - -#define IPR_MAX_SIS64_TARGETS_PER_BUS 1024 -#define IPR_MAX_SIS64_LUNS_PER_TARGET 0xffffffff - #define IPR_MAX_NUM_TARGETS_PER_BUS 256 #define IPR_MAX_NUM_LUNS_PER_TARGET 256 #define IPR_MAX_NUM_VSET_LUNS_PER_TARGET 8 @@ -147,15 +132,13 @@ /* We need resources for HCAMS, IOA reset, IOA bringdown, and ERP */ #define IPR_NUM_INTERNAL_CMD_BLKS (IPR_NUM_HCAMS + \ - ((IPR_NUM_RESET_RELOAD_RETRIES + 1) * 2) + 4) + ((IPR_NUM_RESET_RELOAD_RETRIES + 1) * 2) + 3) #define IPR_MAX_COMMANDS IPR_NUM_BASE_CMD_BLKS #define IPR_NUM_CMD_BLKS (IPR_NUM_BASE_CMD_BLKS + \ IPR_NUM_INTERNAL_CMD_BLKS) #define IPR_MAX_PHYSICAL_DEVS 192 -#define IPR_DEFAULT_SIS64_DEVS 1024 -#define IPR_MAX_SIS64_DEVS 4096 #define IPR_MAX_SGLIST 64 #define IPR_IOA_MAX_SECTORS 32767 @@ -190,7 +173,6 @@ #define IPR_HCAM_CDB_OP_CODE_CONFIG_CHANGE 0x01 #define IPR_HCAM_CDB_OP_CODE_LOG_DATA 0x02 #define IPR_SET_SUPPORTED_DEVICES 0xFB -#define IPR_SET_ALL_SUPPORTED_DEVICES 0x80 #define IPR_IOA_SHUTDOWN 0xF7 #define IPR_WR_BUF_DOWNLOAD_AND_SAVE 0x05 @@ -239,17 +221,9 @@ #define IPR_SDT_FMT2_BAR5_SEL 0x5 #define IPR_SDT_FMT2_EXP_ROM_SEL 0x8 #define IPR_FMT2_SDT_READY_TO_USE 0xC4D4E3F2 -#define IPR_FMT3_SDT_READY_TO_USE 0xC4D4E3F3 #define IPR_DOORBELL 0x82800000 #define IPR_RUNTIME_RESET 0x40000000 -#define IPR_IPL_INIT_MIN_STAGE_TIME 5 -#define IPR_IPL_INIT_STAGE_UNKNOWN 0x0 -#define IPR_IPL_INIT_STAGE_TRANSOP 0xB0000000 -#define IPR_IPL_INIT_STAGE_MASK 0xff000000 -#define IPR_IPL_INIT_STAGE_TIME_MASK 0x0000ffff -#define IPR_PCII_IPL_STAGE_CHANGE (0x80000000 >> 0) - #define IPR_PCII_IOA_TRANS_TO_OPER (0x80000000 >> 0) #define IPR_PCII_IOARCB_XFER_FAILED (0x80000000 >> 3) #define IPR_PCII_IOA_UNIT_CHECKED (0x80000000 >> 4) @@ -344,27 +318,27 @@ struct ipr_std_inq_data { u8 serial_num[IPR_SERIAL_NUM_LEN]; }__attribute__ ((packed)); -#define IPR_RES_TYPE_AF_DASD 0x00 -#define IPR_RES_TYPE_GENERIC_SCSI 0x01 -#define IPR_RES_TYPE_VOLUME_SET 0x02 -#define IPR_RES_TYPE_REMOTE_AF_DASD 0x03 -#define IPR_RES_TYPE_GENERIC_ATA 0x04 -#define IPR_RES_TYPE_ARRAY 0x05 -#define IPR_RES_TYPE_IOAFP 0xff - struct ipr_config_table_entry { u8 proto; #define IPR_PROTO_SATA 0x02 #define IPR_PROTO_SATA_ATAPI 0x03 #define IPR_PROTO_SAS_STP 0x06 -#define IPR_PROTO_SAS_STP_ATAPI 0x07 +#define IPR_PROTO_SAS_STP_ATAPI 0x07 u8 array_id; u8 flags; -#define IPR_IS_IOA_RESOURCE 0x80 - u8 rsvd_subtype; +#define IPR_IS_IOA_RESOURCE 0x80 +#define IPR_IS_ARRAY_MEMBER 0x20 +#define IPR_IS_HOT_SPARE 0x10 -#define IPR_QUEUEING_MODEL(res) ((((res)->flags) & 0x70) >> 4) -#define IPR_QUEUE_FROZEN_MODEL 0 + u8 rsvd_subtype; +#define IPR_RES_SUBTYPE(res) (((res)->cfgte.rsvd_subtype) & 0x0f) +#define IPR_SUBTYPE_AF_DASD 0 +#define IPR_SUBTYPE_GENERIC_SCSI 1 +#define IPR_SUBTYPE_VOLUME_SET 2 +#define IPR_SUBTYPE_GENERIC_ATA 4 + +#define IPR_QUEUEING_MODEL(res) ((((res)->cfgte.flags) & 0x70) >> 4) +#define IPR_QUEUE_FROZEN_MODEL 0 #define IPR_QUEUE_NACA_MODEL 1 struct ipr_res_addr res_addr; @@ -373,28 +347,6 @@ struct ipr_config_table_entry { struct ipr_std_inq_data std_inq_data; }__attribute__ ((packed, aligned (4))); -struct ipr_config_table_entry64 { - u8 res_type; - u8 proto; - u8 vset_num; - u8 array_id; - __be16 flags; - __be16 res_flags; -#define IPR_QUEUEING_MODEL64(res) ((((res)->res_flags) & 0x7000) >> 12) - __be32 res_handle; - u8 dev_id_type; - u8 reserved[3]; - __be64 dev_id; - __be64 lun; - __be64 lun_wwn[2]; -#define IPR_MAX_RES_PATH_LENGTH 24 - __be64 res_path; - struct ipr_std_inq_data std_inq_data; - u8 reserved2[4]; - __be64 reserved3[2]; // description text - u8 reserved4[8]; -}__attribute__ ((packed, aligned (8))); - struct ipr_config_table_hdr { u8 num_entries; u8 flags; @@ -402,35 +354,13 @@ struct ipr_config_table_hdr { __be16 reserved; }__attribute__((packed, aligned (4))); -struct ipr_config_table_hdr64 { - __be16 num_entries; - __be16 reserved; - u8 flags; - u8 reserved2[11]; -}__attribute__((packed, aligned (4))); - struct ipr_config_table { struct ipr_config_table_hdr hdr; - struct ipr_config_table_entry dev[0]; + struct ipr_config_table_entry dev[IPR_MAX_PHYSICAL_DEVS]; }__attribute__((packed, aligned (4))); -struct ipr_config_table64 { - struct ipr_config_table_hdr64 hdr64; - struct ipr_config_table_entry64 dev[0]; -}__attribute__((packed, aligned (8))); - -struct ipr_config_table_entry_wrapper { - union { - struct ipr_config_table_entry *cfgte; - struct ipr_config_table_entry64 *cfgte64; - } u; -}; - struct ipr_hostrcb_cfg_ch_not { - union { - struct ipr_config_table_entry cfgte; - struct ipr_config_table_entry64 cfgte64; - } u; + struct ipr_config_table_entry cfgte; u8 reserved[936]; }__attribute__((packed, aligned (4))); @@ -451,7 +381,7 @@ struct ipr_cmd_pkt { #define IPR_RQTYPE_HCAM 0x02 #define IPR_RQTYPE_ATA_PASSTHRU 0x04 - u8 reserved2; + u8 luntar_luntrn; u8 flags_hi; #define IPR_FLAGS_HI_WRITE_NOT_READ 0x80 @@ -473,7 +403,7 @@ struct ipr_cmd_pkt { __be16 timeout; }__attribute__ ((packed, aligned(4))); -struct ipr_ioarcb_ata_regs { /* 22 bytes */ +struct ipr_ioarcb_ata_regs { u8 flags; #define IPR_ATA_FLAG_PACKET_CMD 0x80 #define IPR_ATA_FLAG_XFER_TYPE_DMA 0x40 @@ -512,49 +442,28 @@ struct ipr_ioadl_desc { __be32 address; }__attribute__((packed, aligned (8))); -struct ipr_ioadl64_desc { - __be32 flags; - __be32 data_len; - __be64 address; -}__attribute__((packed, aligned (16))); - -struct ipr_ata64_ioadl { - struct ipr_ioarcb_ata_regs regs; - u16 reserved[5]; - struct ipr_ioadl64_desc ioadl64[IPR_NUM_IOADL_ENTRIES]; -}__attribute__((packed, aligned (16))); - struct ipr_ioarcb_add_data { union { struct ipr_ioarcb_ata_regs regs; struct ipr_ioadl_desc ioadl[5]; __be32 add_cmd_parms[10]; - } u; -}__attribute__ ((packed, aligned (4))); - -struct ipr_ioarcb_sis64_add_addr_ecb { - __be64 ioasa_host_pci_addr; - __be64 data_ioadl_addr; - __be64 reserved; - __be32 ext_control_buf[4]; -}__attribute__((packed, aligned (8))); + }u; +}__attribute__ ((packed, aligned(4))); /* IOA Request Control Block 128 bytes */ struct ipr_ioarcb { - union { - __be32 ioarcb_host_pci_addr; - __be64 ioarcb_host_pci_addr64; - } a; + __be32 ioarcb_host_pci_addr; + __be32 reserved; __be32 res_handle; __be32 host_response_handle; __be32 reserved1; __be32 reserved2; __be32 reserved3; - __be32 data_transfer_length; + __be32 write_data_transfer_length; __be32 read_data_transfer_length; __be32 write_ioadl_addr; - __be32 ioadl_len; + __be32 write_ioadl_len; __be32 read_ioadl_addr; __be32 read_ioadl_len; @@ -564,14 +473,8 @@ struct ipr_ioarcb { struct ipr_cmd_pkt cmd_pkt; - __be16 add_cmd_parms_offset; - __be16 add_cmd_parms_len; - - union { - struct ipr_ioarcb_add_data add_data; - struct ipr_ioarcb_sis64_add_addr_ecb sis64_addr_data; - } u; - + __be32 add_cmd_parms_len; + struct ipr_ioarcb_add_data add_data; }__attribute__((packed, aligned (4))); struct ipr_ioasa_vset { @@ -773,29 +676,12 @@ struct ipr_hostrcb_device_data_entry_enhanced { struct ipr_ext_vpd cfc_last_with_dev_vpd; }__attribute__((packed, aligned (4))); -struct ipr_hostrcb64_device_data_entry_enhanced { - struct ipr_ext_vpd vpd; - u8 ccin[4]; - u8 res_path[8]; - struct ipr_ext_vpd new_vpd; - u8 new_ccin[4]; - struct ipr_ext_vpd ioa_last_with_dev_vpd; - struct ipr_ext_vpd cfc_last_with_dev_vpd; -}__attribute__((packed, aligned (4))); - struct ipr_hostrcb_array_data_entry { struct ipr_vpd vpd; struct ipr_res_addr expected_dev_res_addr; struct ipr_res_addr dev_res_addr; }__attribute__((packed, aligned (4))); -struct ipr_hostrcb64_array_data_entry { - struct ipr_ext_vpd vpd; - u8 ccin[4]; - u8 expected_res_path[8]; - u8 res_path[8]; -}__attribute__((packed, aligned (4))); - struct ipr_hostrcb_array_data_entry_enhanced { struct ipr_ext_vpd vpd; u8 ccin[4]; @@ -847,14 +733,6 @@ struct ipr_hostrcb_type_13_error { struct ipr_hostrcb_device_data_entry_enhanced dev[3]; }__attribute__((packed, aligned (4))); -struct ipr_hostrcb_type_23_error { - struct ipr_ext_vpd ioa_vpd; - struct ipr_ext_vpd cfc_vpd; - __be32 errors_detected; - __be32 errors_logged; - struct ipr_hostrcb64_device_data_entry_enhanced dev[3]; -}__attribute__((packed, aligned (4))); - struct ipr_hostrcb_type_04_error { struct ipr_vpd ioa_vpd; struct ipr_vpd cfc_vpd; @@ -882,22 +760,6 @@ struct ipr_hostrcb_type_14_error { struct ipr_hostrcb_array_data_entry_enhanced array_member[18]; }__attribute__((packed, aligned (4))); -struct ipr_hostrcb_type_24_error { - struct ipr_ext_vpd ioa_vpd; - struct ipr_ext_vpd cfc_vpd; - u8 reserved[2]; - u8 exposed_mode_adn; -#define IPR_INVALID_ARRAY_DEV_NUM 0xff - u8 array_id; - u8 last_res_path[8]; - u8 protection_level[8]; - struct ipr_ext_vpd array_vpd; - u8 description[16]; - u8 reserved2[3]; - u8 num_entries; - struct ipr_hostrcb64_array_data_entry array_member[32]; -}__attribute__((packed, aligned (4))); - struct ipr_hostrcb_type_07_error { u8 failure_reason[64]; struct ipr_vpd vpd; @@ -935,22 +797,6 @@ struct ipr_hostrcb_config_element { __be32 wwid[2]; }__attribute__((packed, aligned (4))); -struct ipr_hostrcb64_config_element { - __be16 length; - u8 descriptor_id; -#define IPR_DESCRIPTOR_MASK 0xC0 -#define IPR_DESCRIPTOR_SIS64 0x00 - - u8 reserved; - u8 type_status; - - u8 reserved2[2]; - u8 link_rate; - - u8 res_path[8]; - __be32 wwid[2]; -}__attribute__((packed, aligned (8))); - struct ipr_hostrcb_fabric_desc { __be16 length; u8 ioa_port; @@ -972,20 +818,6 @@ struct ipr_hostrcb_fabric_desc { struct ipr_hostrcb_config_element elem[1]; }__attribute__((packed, aligned (4))); -struct ipr_hostrcb64_fabric_desc { - __be16 length; - u8 descriptor_id; - - u8 reserved; - u8 path_state; - - u8 reserved2[2]; - u8 res_path[8]; - u8 reserved3[6]; - __be16 num_entries; - struct ipr_hostrcb64_config_element elem[1]; -}__attribute__((packed, aligned (8))); - #define for_each_fabric_cfg(fabric, cfg) \ for (cfg = (fabric)->elem; \ cfg < ((fabric)->elem + be16_to_cpu((fabric)->num_entries)); \ @@ -998,17 +830,10 @@ struct ipr_hostrcb_type_20_error { struct ipr_hostrcb_fabric_desc desc[1]; }__attribute__((packed, aligned (4))); -struct ipr_hostrcb_type_30_error { - u8 failure_reason[64]; - u8 reserved[3]; - u8 num_entries; - struct ipr_hostrcb64_fabric_desc desc[1]; -}__attribute__((packed, aligned (4))); - struct ipr_hostrcb_error { - __be32 fd_ioasc; - struct ipr_res_addr fd_res_addr; - __be32 fd_res_handle; + __be32 failing_dev_ioasc; + struct ipr_res_addr failing_dev_res_addr; + __be32 failing_dev_res_handle; __be32 prc; union { struct ipr_hostrcb_type_ff_error type_ff_error; @@ -1025,26 +850,6 @@ struct ipr_hostrcb_error { } u; }__attribute__((packed, aligned (4))); -struct ipr_hostrcb64_error { - __be32 fd_ioasc; - __be32 ioa_fw_level; - __be32 fd_res_handle; - __be32 prc; - __be64 fd_dev_id; - __be64 fd_lun; - u8 fd_res_path[8]; - __be64 time_stamp; - u8 reserved[2]; - union { - struct ipr_hostrcb_type_ff_error type_ff_error; - struct ipr_hostrcb_type_12_error type_12_error; - struct ipr_hostrcb_type_17_error type_17_error; - struct ipr_hostrcb_type_23_error type_23_error; - struct ipr_hostrcb_type_24_error type_24_error; - struct ipr_hostrcb_type_30_error type_30_error; - } u; -}__attribute__((packed, aligned (8))); - struct ipr_hostrcb_raw { __be32 data[sizeof(struct ipr_hostrcb_error)/sizeof(__be32)]; }__attribute__((packed, aligned (4))); @@ -1082,11 +887,7 @@ struct ipr_hcam { #define IPR_HOST_RCB_OVERLAY_ID_16 0x16 #define IPR_HOST_RCB_OVERLAY_ID_17 0x17 #define IPR_HOST_RCB_OVERLAY_ID_20 0x20 -#define IPR_HOST_RCB_OVERLAY_ID_23 0x23 -#define IPR_HOST_RCB_OVERLAY_ID_24 0x24 -#define IPR_HOST_RCB_OVERLAY_ID_26 0x26 -#define IPR_HOST_RCB_OVERLAY_ID_30 0x30 -#define IPR_HOST_RCB_OVERLAY_ID_DEFAULT 0xFF +#define IPR_HOST_RCB_OVERLAY_ID_DEFAULT 0xFF u8 reserved1[3]; __be32 ilid; @@ -1096,7 +897,6 @@ struct ipr_hcam { union { struct ipr_hostrcb_error error; - struct ipr_hostrcb64_error error64; struct ipr_hostrcb_cfg_ch_not ccn; struct ipr_hostrcb_raw raw; } u; @@ -1107,14 +907,14 @@ struct ipr_hostrcb { dma_addr_t hostrcb_dma; struct list_head queue; struct ipr_ioa_cfg *ioa_cfg; - char rp_buffer[IPR_MAX_RES_PATH_LENGTH]; }; /* IPR smart dump table structures */ struct ipr_sdt_entry { - __be32 start_token; - __be32 end_token; - u8 reserved[4]; + __be32 bar_str_offset; + __be32 end_offset; + u8 entry_byte; + u8 reserved[3]; u8 flags; #define IPR_SDT_ENDIAN 0x80 @@ -1160,48 +960,28 @@ struct ipr_sata_port { }; struct ipr_resource_entry { + struct ipr_config_table_entry cfgte; u8 needs_sync_complete:1; u8 in_erp:1; u8 add_to_ml:1; u8 del_from_ml:1; u8 resetting_device:1; - u32 bus; /* AKA channel */ - u32 target; /* AKA id */ - u32 lun; -#define IPR_ARRAY_VIRTUAL_BUS 0x1 -#define IPR_VSET_VIRTUAL_BUS 0x2 -#define IPR_IOAFP_VIRTUAL_BUS 0x3 - -#define IPR_GET_RES_PHYS_LOC(res) \ - (((res)->bus << 24) | ((res)->target << 8) | (res)->lun) - - u8 ata_class; - - u8 flags; - __be16 res_flags; - - __be32 type; - - u8 qmodel; - struct ipr_std_inq_data std_inq_data; - - __be32 res_handle; - __be64 dev_id; - struct scsi_lun dev_lun; - u8 res_path[8]; - - struct ipr_ioa_cfg *ioa_cfg; struct scsi_device *sdev; struct ipr_sata_port *sata_port; struct list_head queue; -}; /* struct ipr_resource_entry */ +}; struct ipr_resource_hdr { u16 num_entries; u16 reserved; }; +struct ipr_resource_table { + struct ipr_resource_hdr hdr; + struct ipr_resource_entry dev[IPR_MAX_PHYSICAL_DEVS]; +}; + struct ipr_misc_cbs { struct ipr_ioa_vpd ioa_vpd; struct ipr_inquiry_page0 page0_data; @@ -1214,51 +994,27 @@ struct ipr_misc_cbs { struct ipr_interrupt_offsets { unsigned long set_interrupt_mask_reg; unsigned long clr_interrupt_mask_reg; - unsigned long clr_interrupt_mask_reg32; unsigned long sense_interrupt_mask_reg; - unsigned long sense_interrupt_mask_reg32; unsigned long clr_interrupt_reg; - unsigned long clr_interrupt_reg32; unsigned long sense_interrupt_reg; - unsigned long sense_interrupt_reg32; unsigned long ioarrin_reg; unsigned long sense_uproc_interrupt_reg; - unsigned long sense_uproc_interrupt_reg32; unsigned long set_uproc_interrupt_reg; - unsigned long set_uproc_interrupt_reg32; unsigned long clr_uproc_interrupt_reg; - unsigned long clr_uproc_interrupt_reg32; - - unsigned long init_feedback_reg; - - unsigned long dump_addr_reg; - unsigned long dump_data_reg; }; struct ipr_interrupts { void __iomem *set_interrupt_mask_reg; void __iomem *clr_interrupt_mask_reg; - void __iomem *clr_interrupt_mask_reg32; void __iomem *sense_interrupt_mask_reg; - void __iomem *sense_interrupt_mask_reg32; void __iomem *clr_interrupt_reg; - void __iomem *clr_interrupt_reg32; void __iomem *sense_interrupt_reg; - void __iomem *sense_interrupt_reg32; void __iomem *ioarrin_reg; void __iomem *sense_uproc_interrupt_reg; - void __iomem *sense_uproc_interrupt_reg32; void __iomem *set_uproc_interrupt_reg; - void __iomem *set_uproc_interrupt_reg32; void __iomem *clr_uproc_interrupt_reg; - void __iomem *clr_uproc_interrupt_reg32; - - void __iomem *init_feedback_reg; - - void __iomem *dump_addr_reg; - void __iomem *dump_data_reg; }; struct ipr_chip_cfg_t { @@ -1273,9 +1029,6 @@ struct ipr_chip_t { u16 intr_type; #define IPR_USE_LSI 0x00 #define IPR_USE_MSI 0x01 - u16 sis_type; -#define IPR_SIS32 0x00 -#define IPR_SIS64 0x01 const struct ipr_chip_cfg_t *cfg; }; @@ -1320,6 +1073,13 @@ enum ipr_sdt_state { DUMP_OBTAINED }; +enum ipr_cache_state { + CACHE_NONE, + CACHE_DISABLED, + CACHE_ENABLED, + CACHE_INVALID +}; + /* Per-controller data */ struct ipr_ioa_cfg { char eye_catcher[8]; @@ -1339,17 +1099,10 @@ struct ipr_ioa_cfg { u8 dual_raid:1; u8 needs_warm_reset:1; u8 msi_received:1; - u8 sis64:1; u8 revid; - /* - * Bitmaps for SIS64 generated target values - */ - unsigned long *target_ids; - unsigned long *array_ids; - unsigned long *vset_ids; - + enum ipr_cache_state cache_state; u16 type; /* CCIN of the card */ u8 log_level; @@ -1380,13 +1133,8 @@ struct ipr_ioa_cfg { char cfg_table_start[8]; #define IPR_CFG_TBL_START "cfg" - union { - struct ipr_config_table *cfg_table; - struct ipr_config_table64 *cfg_table64; - } u; + struct ipr_config_table *cfg_table; dma_addr_t cfg_table_dma; - u32 cfg_table_size; - u32 max_devs_supported; char resource_table_label[8]; #define IPR_RES_TABLE_LABEL "res_tbl" @@ -1454,17 +1202,13 @@ struct ipr_ioa_cfg { char ipr_cmd_label[8]; #define IPR_CMD_LABEL "ipr_cmd" struct ipr_cmnd *ipr_cmnd_list[IPR_NUM_CMD_BLKS]; - dma_addr_t ipr_cmnd_list_dma[IPR_NUM_CMD_BLKS]; -}; /* struct ipr_ioa_cfg */ + u32 ipr_cmnd_list_dma[IPR_NUM_CMD_BLKS]; +}; struct ipr_cmnd { struct ipr_ioarcb ioarcb; - union { - struct ipr_ioadl_desc ioadl[IPR_NUM_IOADL_ENTRIES]; - struct ipr_ioadl64_desc ioadl64[IPR_NUM_IOADL_ENTRIES]; - struct ipr_ata64_ioadl ata_ioadl; - } i; struct ipr_ioasa ioasa; + struct ipr_ioadl_desc ioadl[IPR_NUM_IOADL_ENTRIES]; struct list_head queue; struct scsi_cmnd *scsi_cmd; struct ata_queued_cmd *qc; @@ -1477,7 +1221,7 @@ struct ipr_cmnd { u8 sense_buffer[SCSI_SENSE_BUFFERSIZE]; dma_addr_t sense_buffer_dma; unsigned short dma_use_sg; - dma_addr_t dma_addr; + dma_addr_t dma_handle; struct ipr_cmnd *sibling; union { enum ipr_shutdown_type shutdown_type; @@ -1570,6 +1314,8 @@ struct ipr_ioa_dump { u32 next_page_index; u32 page_offset; u32 format; +#define IPR_SDT_FMT2 2 +#define IPR_SDT_UNKNOWN 3 }__attribute__((packed, aligned (4))); struct ipr_dump { @@ -1631,13 +1377,6 @@ struct ipr_ucode_image_header { #define ipr_info(...) printk(KERN_INFO IPR_NAME ": "__VA_ARGS__) #define ipr_dbg(...) IPR_DBG_CMD(printk(KERN_INFO IPR_NAME ": "__VA_ARGS__)) -#define ipr_res_printk(level, ioa_cfg, bus, target, lun, fmt, ...) \ - printk(level IPR_NAME ": %d:%d:%d:%d: " fmt, (ioa_cfg)->host->host_no, \ - bus, target, lun, ##__VA_ARGS__) - -#define ipr_res_err(ioa_cfg, res, fmt, ...) \ - ipr_res_printk(KERN_ERR, ioa_cfg, (res)->bus, (res)->target, (res)->lun, fmt, ##__VA_ARGS__) - #define ipr_ra_printk(level, ioa_cfg, ra, fmt, ...) \ printk(level IPR_NAME ": %d:%d:%d:%d: " fmt, (ioa_cfg)->host->host_no, \ (ra).bus, (ra).target, (ra).lun, ##__VA_ARGS__) @@ -1645,6 +1384,9 @@ struct ipr_ucode_image_header { #define ipr_ra_err(ioa_cfg, ra, fmt, ...) \ ipr_ra_printk(KERN_ERR, ioa_cfg, ra, fmt, ##__VA_ARGS__) +#define ipr_res_err(ioa_cfg, res, fmt, ...) \ + ipr_ra_err(ioa_cfg, (res)->cfgte.res_addr, fmt, ##__VA_ARGS__) + #define ipr_phys_res_err(ioa_cfg, res, fmt, ...) \ { \ if ((res).bus >= IPR_MAX_NUM_BUSES) { \ @@ -1657,21 +1399,14 @@ struct ipr_ucode_image_header { } #define ipr_hcam_err(hostrcb, fmt, ...) \ -{ \ - if (ipr_is_device(hostrcb)) { \ - if ((hostrcb)->ioa_cfg->sis64) { \ - printk(KERN_ERR IPR_NAME ": %s: " fmt, \ - ipr_format_resource_path(&hostrcb->hcam.u.error64.fd_res_path[0], \ - &hostrcb->rp_buffer[0]), \ - __VA_ARGS__); \ - } else { \ - ipr_ra_err((hostrcb)->ioa_cfg, \ - (hostrcb)->hcam.u.error.fd_res_addr, \ - fmt, __VA_ARGS__); \ - } \ - } else { \ - dev_err(&(hostrcb)->ioa_cfg->pdev->dev, fmt, __VA_ARGS__); \ - } \ +{ \ + if (ipr_is_device(&(hostrcb)->hcam.u.error.failing_dev_res_addr)) { \ + ipr_ra_err((hostrcb)->ioa_cfg, \ + (hostrcb)->hcam.u.error.failing_dev_res_addr, \ + fmt, ##__VA_ARGS__); \ + } else { \ + dev_err(&(hostrcb)->ioa_cfg->pdev->dev, fmt, ##__VA_ARGS__); \ + } \ } #define ipr_trace ipr_dbg("%s: %s: Line: %d\n",\ @@ -1697,7 +1432,7 @@ ipr_err("----------------------------------------------------------\n") **/ static inline int ipr_is_ioa_resource(struct ipr_resource_entry *res) { - return res->type == IPR_RES_TYPE_IOAFP; + return (res->cfgte.flags & IPR_IS_IOA_RESOURCE) ? 1 : 0; } /** @@ -1709,8 +1444,12 @@ static inline int ipr_is_ioa_resource(struct ipr_resource_entry *res) **/ static inline int ipr_is_af_dasd_device(struct ipr_resource_entry *res) { - return res->type == IPR_RES_TYPE_AF_DASD || - res->type == IPR_RES_TYPE_REMOTE_AF_DASD; + if (IPR_IS_DASD_DEVICE(res->cfgte.std_inq_data) && + !ipr_is_ioa_resource(res) && + IPR_RES_SUBTYPE(res) == IPR_SUBTYPE_AF_DASD) + return 1; + else + return 0; } /** @@ -1722,7 +1461,12 @@ static inline int ipr_is_af_dasd_device(struct ipr_resource_entry *res) **/ static inline int ipr_is_vset_device(struct ipr_resource_entry *res) { - return res->type == IPR_RES_TYPE_VOLUME_SET; + if (IPR_IS_DASD_DEVICE(res->cfgte.std_inq_data) && + !ipr_is_ioa_resource(res) && + IPR_RES_SUBTYPE(res) == IPR_SUBTYPE_VOLUME_SET) + return 1; + else + return 0; } /** @@ -1734,7 +1478,11 @@ static inline int ipr_is_vset_device(struct ipr_resource_entry *res) **/ static inline int ipr_is_gscsi(struct ipr_resource_entry *res) { - return res->type == IPR_RES_TYPE_GENERIC_SCSI; + if (!ipr_is_ioa_resource(res) && + IPR_RES_SUBTYPE(res) == IPR_SUBTYPE_GENERIC_SCSI) + return 1; + else + return 0; } /** @@ -1747,7 +1495,7 @@ static inline int ipr_is_gscsi(struct ipr_resource_entry *res) static inline int ipr_is_scsi_disk(struct ipr_resource_entry *res) { if (ipr_is_af_dasd_device(res) || - (ipr_is_gscsi(res) && IPR_IS_DASD_DEVICE(res->std_inq_data))) + (ipr_is_gscsi(res) && IPR_IS_DASD_DEVICE(res->cfgte.std_inq_data))) return 1; else return 0; @@ -1762,7 +1510,11 @@ static inline int ipr_is_scsi_disk(struct ipr_resource_entry *res) **/ static inline int ipr_is_gata(struct ipr_resource_entry *res) { - return res->type == IPR_RES_TYPE_GENERIC_ATA; + if (!ipr_is_ioa_resource(res) && + IPR_RES_SUBTYPE(res) == IPR_SUBTYPE_GENERIC_ATA) + return 1; + else + return 0; } /** @@ -1774,35 +1526,24 @@ static inline int ipr_is_gata(struct ipr_resource_entry *res) **/ static inline int ipr_is_naca_model(struct ipr_resource_entry *res) { - if (ipr_is_gscsi(res) && res->qmodel == IPR_QUEUE_NACA_MODEL) + if (ipr_is_gscsi(res) && IPR_QUEUEING_MODEL(res) == IPR_QUEUE_NACA_MODEL) return 1; return 0; } /** - * ipr_is_device - Determine if the hostrcb structure is related to a device - * @hostrcb: host resource control blocks struct + * ipr_is_device - Determine if resource address is that of a device + * @res_addr: resource address struct * * Return value: * 1 if AF / 0 if not AF **/ -static inline int ipr_is_device(struct ipr_hostrcb *hostrcb) +static inline int ipr_is_device(struct ipr_res_addr *res_addr) { - struct ipr_res_addr *res_addr; - u8 *res_path; - - if (hostrcb->ioa_cfg->sis64) { - res_path = &hostrcb->hcam.u.error64.fd_res_path[0]; - if ((res_path[0] == 0x00 || res_path[0] == 0x80 || - res_path[0] == 0x81) && res_path[2] != 0xFF) - return 1; - } else { - res_addr = &hostrcb->hcam.u.error.fd_res_addr; - - if ((res_addr->bus < IPR_MAX_NUM_BUSES) && - (res_addr->target < (IPR_MAX_NUM_TARGETS_PER_BUS - 1))) - return 1; - } + if ((res_addr->bus < IPR_MAX_NUM_BUSES) && + (res_addr->target < (IPR_MAX_NUM_TARGETS_PER_BUS - 1))) + return 1; + return 0; } diff --git a/trunk/drivers/scsi/iscsi_tcp.c b/trunk/drivers/scsi/iscsi_tcp.c index 249053a9d4fa..8a89ba900588 100644 --- a/trunk/drivers/scsi/iscsi_tcp.c +++ b/trunk/drivers/scsi/iscsi_tcp.c @@ -874,7 +874,7 @@ static struct scsi_host_template iscsi_sw_tcp_sht = { .cmd_per_lun = ISCSI_DEF_CMD_PER_LUN, .eh_abort_handler = iscsi_eh_abort, .eh_device_reset_handler= iscsi_eh_device_reset, - .eh_target_reset_handler = iscsi_eh_recover_target, + .eh_target_reset_handler= iscsi_eh_target_reset, .use_clustering = DISABLE_CLUSTERING, .slave_alloc = iscsi_sw_tcp_slave_alloc, .slave_configure = iscsi_sw_tcp_slave_configure, diff --git a/trunk/drivers/scsi/libiscsi.c b/trunk/drivers/scsi/libiscsi.c index 685eaec53218..703eb6a88790 100644 --- a/trunk/drivers/scsi/libiscsi.c +++ b/trunk/drivers/scsi/libiscsi.c @@ -2338,7 +2338,7 @@ EXPORT_SYMBOL_GPL(iscsi_session_recovery_timedout); * This function will wait for a relogin, session termination from * userspace, or a recovery/replacement timeout. */ -int iscsi_eh_session_reset(struct scsi_cmnd *sc) +static int iscsi_eh_session_reset(struct scsi_cmnd *sc) { struct iscsi_cls_session *cls_session; struct iscsi_session *session; @@ -2389,7 +2389,6 @@ int iscsi_eh_session_reset(struct scsi_cmnd *sc) mutex_unlock(&session->eh_mutex); return SUCCESS; } -EXPORT_SYMBOL_GPL(iscsi_eh_session_reset); static void iscsi_prep_tgt_reset_pdu(struct scsi_cmnd *sc, struct iscsi_tm *hdr) { @@ -2404,7 +2403,8 @@ static void iscsi_prep_tgt_reset_pdu(struct scsi_cmnd *sc, struct iscsi_tm *hdr) * iscsi_eh_target_reset - reset target * @sc: scsi command * - * This will attempt to send a warm target reset. + * This will attempt to send a warm target reset. If that fails + * then we will drop the session and attempt ERL0 recovery. */ int iscsi_eh_target_reset(struct scsi_cmnd *sc) { @@ -2476,27 +2476,12 @@ int iscsi_eh_target_reset(struct scsi_cmnd *sc) ISCSI_DBG_EH(session, "tgt %s reset result = %s\n", session->targetname, rc == SUCCESS ? "SUCCESS" : "FAILED"); mutex_unlock(&session->eh_mutex); - return rc; -} -EXPORT_SYMBOL_GPL(iscsi_eh_target_reset); -/** - * iscsi_eh_recover_target - reset target and possibly the session - * @sc: scsi command - * - * This will attempt to send a warm target reset. If that fails, - * we will escalate to ERL0 session recovery. - */ -int iscsi_eh_recover_target(struct scsi_cmnd *sc) -{ - int rc; - - rc = iscsi_eh_target_reset(sc); if (rc == FAILED) rc = iscsi_eh_session_reset(sc); return rc; } -EXPORT_SYMBOL_GPL(iscsi_eh_recover_target); +EXPORT_SYMBOL_GPL(iscsi_eh_target_reset); /* * Pre-allocate a pool of @max items of @item_size. By default, the pool diff --git a/trunk/drivers/scsi/lpfc/lpfc.h b/trunk/drivers/scsi/lpfc/lpfc.h index 565e16dd74fc..84b696463a58 100644 --- a/trunk/drivers/scsi/lpfc/lpfc.h +++ b/trunk/drivers/scsi/lpfc/lpfc.h @@ -37,9 +37,6 @@ struct lpfc_sli2_slim; the NameServer before giving up. */ #define LPFC_CMD_PER_LUN 3 /* max outstanding cmds per lun */ #define LPFC_DEFAULT_SG_SEG_CNT 64 /* sg element count per scsi cmnd */ -#define LPFC_DEFAULT_MENLO_SG_SEG_CNT 128 /* sg element count per scsi - cmnd for menlo needs nearly twice as for firmware - downloads using bsg */ #define LPFC_DEFAULT_PROT_SG_SEG_CNT 4096 /* sg protection elements count */ #define LPFC_MAX_SG_SEG_CNT 4096 /* sg element count per scsi cmnd */ #define LPFC_MAX_PROT_SG_SEG_CNT 4096 /* prot sg element count per scsi cmd*/ @@ -512,6 +509,7 @@ struct lpfc_hba { int (*lpfc_hba_down_link) (struct lpfc_hba *); + /* SLI4 specific HBA data structure */ struct lpfc_sli4_hba sli4_hba; @@ -625,9 +623,6 @@ struct lpfc_hba { uint32_t cfg_log_verbose; uint32_t cfg_aer_support; uint32_t cfg_suppress_link_up; -#define LPFC_INITIALIZE_LINK 0 /* do normal init_link mbox */ -#define LPFC_DELAY_INIT_LINK 1 /* layered driver hold off */ -#define LPFC_DELAY_INIT_LINK_INDEFINITELY 2 /* wait, manual intervention */ lpfc_vpd_t vpd; /* vital product data */ @@ -809,9 +804,6 @@ struct lpfc_hba { struct list_head ct_ev_waiters; struct unsol_rcv_ct_ctx ct_ctx[64]; uint32_t ctx_idx; - - uint8_t menlo_flag; /* menlo generic flags */ -#define HBA_MENLO_SUPPORT 0x1 /* HBA supports menlo commands */ }; static inline struct Scsi_Host * diff --git a/trunk/drivers/scsi/lpfc/lpfc_attr.c b/trunk/drivers/scsi/lpfc/lpfc_attr.c index 64cd17eedb64..c992e8328f9e 100644 --- a/trunk/drivers/scsi/lpfc/lpfc_attr.c +++ b/trunk/drivers/scsi/lpfc/lpfc_attr.c @@ -1939,9 +1939,7 @@ static DEVICE_ATTR(lpfc_enable_npiv, S_IRUGO, # 0x2 = never bring up link # Default value is 0. */ -LPFC_ATTR_R(suppress_link_up, LPFC_INITIALIZE_LINK, LPFC_INITIALIZE_LINK, - LPFC_DELAY_INIT_LINK_INDEFINITELY, - "Suppress Link Up at initialization"); +LPFC_ATTR_R(suppress_link_up, 0, 0, 2, "Suppress Link Up at initialization"); /* # lpfc_nodev_tmo: If set, it will hold all I/O errors on devices that disappear @@ -1968,7 +1966,8 @@ lpfc_nodev_tmo_show(struct device *dev, struct device_attribute *attr, { struct Scsi_Host *shost = class_to_shost(dev); struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; - + int val = 0; + val = vport->cfg_devloss_tmo; return snprintf(buf, PAGE_SIZE, "%d\n", vport->cfg_devloss_tmo); } diff --git a/trunk/drivers/scsi/lpfc/lpfc_bsg.c b/trunk/drivers/scsi/lpfc/lpfc_bsg.c index 692c29f6048e..f3f1bf1a0a71 100644 --- a/trunk/drivers/scsi/lpfc/lpfc_bsg.c +++ b/trunk/drivers/scsi/lpfc/lpfc_bsg.c @@ -83,28 +83,15 @@ struct lpfc_bsg_mbox { struct fc_bsg_job *set_job; }; -#define MENLO_DID 0x0000FC0E - -struct lpfc_bsg_menlo { - struct lpfc_iocbq *cmdiocbq; - struct lpfc_iocbq *rspiocbq; - struct lpfc_dmabuf *bmp; - - /* job waiting for this iocb to finish */ - struct fc_bsg_job *set_job; -}; - #define TYPE_EVT 1 #define TYPE_IOCB 2 #define TYPE_MBOX 3 -#define TYPE_MENLO 4 struct bsg_job_data { uint32_t type; union { struct lpfc_bsg_event *evt; struct lpfc_bsg_iocb iocb; struct lpfc_bsg_mbox mbox; - struct lpfc_bsg_menlo menlo; } context_un; }; @@ -2469,18 +2456,6 @@ static int lpfc_bsg_check_cmd_access(struct lpfc_hba *phba, case MBX_PORT_IOV_CONTROL: break; case MBX_SET_VARIABLE: - lpfc_printf_log(phba, KERN_INFO, LOG_INIT, - "1226 mbox: set_variable 0x%x, 0x%x\n", - mb->un.varWords[0], - mb->un.varWords[1]); - if ((mb->un.varWords[0] == SETVAR_MLOMNT) - && (mb->un.varWords[1] == 1)) { - phba->wait_4_mlo_maint_flg = 1; - } else if (mb->un.varWords[0] == SETVAR_MLORST) { - phba->link_flag &= ~LS_LOOPBACK_MODE; - phba->fc_topology = TOPOLOGY_PT_PT; - } - break; case MBX_RUN_BIU_DIAG64: case MBX_READ_EVENT_LOG: case MBX_READ_SPARM64: @@ -2662,297 +2637,6 @@ lpfc_bsg_mbox_cmd(struct fc_bsg_job *job) return rc; } -/** - * lpfc_bsg_menlo_cmd_cmp - lpfc_menlo_cmd completion handler - * @phba: Pointer to HBA context object. - * @cmdiocbq: Pointer to command iocb. - * @rspiocbq: Pointer to response iocb. - * - * This function is the completion handler for iocbs issued using - * lpfc_menlo_cmd function. This function is called by the - * ring event handler function without any lock held. This function - * can be called from both worker thread context and interrupt - * context. This function also can be called from another thread which - * cleans up the SLI layer objects. - * This function copies the contents of the response iocb to the - * response iocb memory object provided by the caller of - * lpfc_sli_issue_iocb_wait and then wakes up the thread which - * sleeps for the iocb completion. - **/ -static void -lpfc_bsg_menlo_cmd_cmp(struct lpfc_hba *phba, - struct lpfc_iocbq *cmdiocbq, - struct lpfc_iocbq *rspiocbq) -{ - struct bsg_job_data *dd_data; - struct fc_bsg_job *job; - IOCB_t *rsp; - struct lpfc_dmabuf *bmp; - struct lpfc_bsg_menlo *menlo; - unsigned long flags; - struct menlo_response *menlo_resp; - int rc = 0; - - spin_lock_irqsave(&phba->ct_ev_lock, flags); - dd_data = cmdiocbq->context1; - if (!dd_data) { - spin_unlock_irqrestore(&phba->ct_ev_lock, flags); - return; - } - - menlo = &dd_data->context_un.menlo; - job = menlo->set_job; - job->dd_data = NULL; /* so timeout handler does not reply */ - - spin_lock_irqsave(&phba->hbalock, flags); - cmdiocbq->iocb_flag |= LPFC_IO_WAKE; - if (cmdiocbq->context2 && rspiocbq) - memcpy(&((struct lpfc_iocbq *)cmdiocbq->context2)->iocb, - &rspiocbq->iocb, sizeof(IOCB_t)); - spin_unlock_irqrestore(&phba->hbalock, flags); - - bmp = menlo->bmp; - rspiocbq = menlo->rspiocbq; - rsp = &rspiocbq->iocb; - - pci_unmap_sg(phba->pcidev, job->request_payload.sg_list, - job->request_payload.sg_cnt, DMA_TO_DEVICE); - pci_unmap_sg(phba->pcidev, job->reply_payload.sg_list, - job->reply_payload.sg_cnt, DMA_FROM_DEVICE); - - /* always return the xri, this would be used in the case - * of a menlo download to allow the data to be sent as a continuation - * of the exchange. - */ - menlo_resp = (struct menlo_response *) - job->reply->reply_data.vendor_reply.vendor_rsp; - menlo_resp->xri = rsp->ulpContext; - if (rsp->ulpStatus) { - if (rsp->ulpStatus == IOSTAT_LOCAL_REJECT) { - switch (rsp->un.ulpWord[4] & 0xff) { - case IOERR_SEQUENCE_TIMEOUT: - rc = -ETIMEDOUT; - break; - case IOERR_INVALID_RPI: - rc = -EFAULT; - break; - default: - rc = -EACCES; - break; - } - } else - rc = -EACCES; - } else - job->reply->reply_payload_rcv_len = - rsp->un.genreq64.bdl.bdeSize; - - lpfc_mbuf_free(phba, bmp->virt, bmp->phys); - lpfc_sli_release_iocbq(phba, rspiocbq); - lpfc_sli_release_iocbq(phba, cmdiocbq); - kfree(bmp); - kfree(dd_data); - /* make error code available to userspace */ - job->reply->result = rc; - /* complete the job back to userspace */ - job->job_done(job); - spin_unlock_irqrestore(&phba->ct_ev_lock, flags); - return; -} - -/** - * lpfc_menlo_cmd - send an ioctl for menlo hardware - * @job: fc_bsg_job to handle - * - * This function issues a gen request 64 CR ioctl for all menlo cmd requests, - * all the command completions will return the xri for the command. - * For menlo data requests a gen request 64 CX is used to continue the exchange - * supplied in the menlo request header xri field. - **/ -static int -lpfc_menlo_cmd(struct fc_bsg_job *job) -{ - struct lpfc_vport *vport = (struct lpfc_vport *)job->shost->hostdata; - struct lpfc_hba *phba = vport->phba; - struct lpfc_iocbq *cmdiocbq, *rspiocbq; - IOCB_t *cmd, *rsp; - int rc = 0; - struct menlo_command *menlo_cmd; - struct menlo_response *menlo_resp; - struct lpfc_dmabuf *bmp = NULL; - int request_nseg; - int reply_nseg; - struct scatterlist *sgel = NULL; - int numbde; - dma_addr_t busaddr; - struct bsg_job_data *dd_data; - struct ulp_bde64 *bpl = NULL; - - /* in case no data is returned return just the return code */ - job->reply->reply_payload_rcv_len = 0; - - if (job->request_len < - sizeof(struct fc_bsg_request) + - sizeof(struct menlo_command)) { - lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC, - "2784 Received MENLO_CMD request below " - "minimum size\n"); - rc = -ERANGE; - goto no_dd_data; - } - - if (job->reply_len < - sizeof(struct fc_bsg_request) + sizeof(struct menlo_response)) { - lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC, - "2785 Received MENLO_CMD reply below " - "minimum size\n"); - rc = -ERANGE; - goto no_dd_data; - } - - if (!(phba->menlo_flag & HBA_MENLO_SUPPORT)) { - lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC, - "2786 Adapter does not support menlo " - "commands\n"); - rc = -EPERM; - goto no_dd_data; - } - - menlo_cmd = (struct menlo_command *) - job->request->rqst_data.h_vendor.vendor_cmd; - - menlo_resp = (struct menlo_response *) - job->reply->reply_data.vendor_reply.vendor_rsp; - - /* allocate our bsg tracking structure */ - dd_data = kmalloc(sizeof(struct bsg_job_data), GFP_KERNEL); - if (!dd_data) { - lpfc_printf_log(phba, KERN_WARNING, LOG_LIBDFC, - "2787 Failed allocation of dd_data\n"); - rc = -ENOMEM; - goto no_dd_data; - } - - bmp = kmalloc(sizeof(struct lpfc_dmabuf), GFP_KERNEL); - if (!bmp) { - rc = -ENOMEM; - goto free_dd; - } - - cmdiocbq = lpfc_sli_get_iocbq(phba); - if (!cmdiocbq) { - rc = -ENOMEM; - goto free_bmp; - } - - rspiocbq = lpfc_sli_get_iocbq(phba); - if (!rspiocbq) { - rc = -ENOMEM; - goto free_cmdiocbq; - } - - rsp = &rspiocbq->iocb; - - bmp->virt = lpfc_mbuf_alloc(phba, 0, &bmp->phys); - if (!bmp->virt) { - rc = -ENOMEM; - goto free_rspiocbq; - } - - INIT_LIST_HEAD(&bmp->list); - bpl = (struct ulp_bde64 *) bmp->virt; - request_nseg = pci_map_sg(phba->pcidev, job->request_payload.sg_list, - job->request_payload.sg_cnt, DMA_TO_DEVICE); - for_each_sg(job->request_payload.sg_list, sgel, request_nseg, numbde) { - busaddr = sg_dma_address(sgel); - bpl->tus.f.bdeFlags = BUFF_TYPE_BDE_64; - bpl->tus.f.bdeSize = sg_dma_len(sgel); - bpl->tus.w = cpu_to_le32(bpl->tus.w); - bpl->addrLow = cpu_to_le32(putPaddrLow(busaddr)); - bpl->addrHigh = cpu_to_le32(putPaddrHigh(busaddr)); - bpl++; - } - - reply_nseg = pci_map_sg(phba->pcidev, job->reply_payload.sg_list, - job->reply_payload.sg_cnt, DMA_FROM_DEVICE); - for_each_sg(job->reply_payload.sg_list, sgel, reply_nseg, numbde) { - busaddr = sg_dma_address(sgel); - bpl->tus.f.bdeFlags = BUFF_TYPE_BDE_64I; - bpl->tus.f.bdeSize = sg_dma_len(sgel); - bpl->tus.w = cpu_to_le32(bpl->tus.w); - bpl->addrLow = cpu_to_le32(putPaddrLow(busaddr)); - bpl->addrHigh = cpu_to_le32(putPaddrHigh(busaddr)); - bpl++; - } - - cmd = &cmdiocbq->iocb; - cmd->un.genreq64.bdl.ulpIoTag32 = 0; - cmd->un.genreq64.bdl.addrHigh = putPaddrHigh(bmp->phys); - cmd->un.genreq64.bdl.addrLow = putPaddrLow(bmp->phys); - cmd->un.genreq64.bdl.bdeFlags = BUFF_TYPE_BLP_64; - cmd->un.genreq64.bdl.bdeSize = - (request_nseg + reply_nseg) * sizeof(struct ulp_bde64); - cmd->un.genreq64.w5.hcsw.Fctl = (SI | LA); - cmd->un.genreq64.w5.hcsw.Dfctl = 0; - cmd->un.genreq64.w5.hcsw.Rctl = FC_RCTL_DD_UNSOL_CMD; - cmd->un.genreq64.w5.hcsw.Type = MENLO_TRANSPORT_TYPE; /* 0xfe */ - cmd->ulpBdeCount = 1; - cmd->ulpClass = CLASS3; - cmd->ulpOwner = OWN_CHIP; - cmd->ulpLe = 1; /* Limited Edition */ - cmdiocbq->iocb_flag |= LPFC_IO_LIBDFC; - cmdiocbq->vport = phba->pport; - /* We want the firmware to timeout before we do */ - cmd->ulpTimeout = MENLO_TIMEOUT - 5; - cmdiocbq->context3 = bmp; - cmdiocbq->context2 = rspiocbq; - cmdiocbq->iocb_cmpl = lpfc_bsg_menlo_cmd_cmp; - cmdiocbq->context1 = dd_data; - cmdiocbq->context2 = rspiocbq; - if (menlo_cmd->cmd == LPFC_BSG_VENDOR_MENLO_CMD) { - cmd->ulpCommand = CMD_GEN_REQUEST64_CR; - cmd->ulpPU = MENLO_PU; /* 3 */ - cmd->un.ulpWord[4] = MENLO_DID; /* 0x0000FC0E */ - cmd->ulpContext = MENLO_CONTEXT; /* 0 */ - } else { - cmd->ulpCommand = CMD_GEN_REQUEST64_CX; - cmd->ulpPU = 1; - cmd->un.ulpWord[4] = 0; - cmd->ulpContext = menlo_cmd->xri; - } - - dd_data->type = TYPE_MENLO; - dd_data->context_un.menlo.cmdiocbq = cmdiocbq; - dd_data->context_un.menlo.rspiocbq = rspiocbq; - dd_data->context_un.menlo.set_job = job; - dd_data->context_un.menlo.bmp = bmp; - - rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, cmdiocbq, - MENLO_TIMEOUT - 5); - if (rc == IOCB_SUCCESS) - return 0; /* done for now */ - - /* iocb failed so cleanup */ - pci_unmap_sg(phba->pcidev, job->request_payload.sg_list, - job->request_payload.sg_cnt, DMA_TO_DEVICE); - pci_unmap_sg(phba->pcidev, job->reply_payload.sg_list, - job->reply_payload.sg_cnt, DMA_FROM_DEVICE); - - lpfc_mbuf_free(phba, bmp->virt, bmp->phys); - -free_rspiocbq: - lpfc_sli_release_iocbq(phba, rspiocbq); -free_cmdiocbq: - lpfc_sli_release_iocbq(phba, cmdiocbq); -free_bmp: - kfree(bmp); -free_dd: - kfree(dd_data); -no_dd_data: - /* make error code available to userspace */ - job->reply->result = rc; - job->dd_data = NULL; - return rc; -} /** * lpfc_bsg_hst_vendor - process a vendor-specific fc_bsg_job * @job: fc_bsg_job to handle @@ -2985,10 +2669,6 @@ lpfc_bsg_hst_vendor(struct fc_bsg_job *job) case LPFC_BSG_VENDOR_MBOX: rc = lpfc_bsg_mbox_cmd(job); break; - case LPFC_BSG_VENDOR_MENLO_CMD: - case LPFC_BSG_VENDOR_MENLO_DATA: - rc = lpfc_menlo_cmd(job); - break; default: rc = -EINVAL; job->reply->reply_payload_rcv_len = 0; @@ -3048,7 +2728,6 @@ lpfc_bsg_timeout(struct fc_bsg_job *job) struct lpfc_bsg_event *evt; struct lpfc_bsg_iocb *iocb; struct lpfc_bsg_mbox *mbox; - struct lpfc_bsg_menlo *menlo; struct lpfc_sli_ring *pring = &phba->sli.ring[LPFC_ELS_RING]; struct bsg_job_data *dd_data; unsigned long flags; @@ -3096,17 +2775,6 @@ lpfc_bsg_timeout(struct fc_bsg_job *job) spin_unlock_irqrestore(&phba->ct_ev_lock, flags); job->job_done(job); break; - case TYPE_MENLO: - menlo = &dd_data->context_un.menlo; - cmdiocb = menlo->cmdiocbq; - /* hint to completion handler that the job timed out */ - job->reply->result = -EAGAIN; - spin_unlock_irqrestore(&phba->ct_ev_lock, flags); - /* this will call our completion handler */ - spin_lock_irq(&phba->hbalock); - lpfc_sli_issue_abort_iotag(phba, pring, cmdiocb); - spin_unlock_irq(&phba->hbalock); - break; default: spin_unlock_irqrestore(&phba->ct_ev_lock, flags); break; diff --git a/trunk/drivers/scsi/lpfc/lpfc_bsg.h b/trunk/drivers/scsi/lpfc/lpfc_bsg.h index 5bc630819b9e..6c8f87e39b98 100644 --- a/trunk/drivers/scsi/lpfc/lpfc_bsg.h +++ b/trunk/drivers/scsi/lpfc/lpfc_bsg.h @@ -31,8 +31,6 @@ #define LPFC_BSG_VENDOR_DIAG_TEST 5 #define LPFC_BSG_VENDOR_GET_MGMT_REV 6 #define LPFC_BSG_VENDOR_MBOX 7 -#define LPFC_BSG_VENDOR_MENLO_CMD 8 -#define LPFC_BSG_VENDOR_MENLO_DATA 9 struct set_ct_event { uint32_t command; @@ -98,13 +96,3 @@ struct dfc_mbox_req { uint8_t mbOffset; }; -/* Used for menlo command or menlo data. The xri is only used for menlo data */ -struct menlo_command { - uint32_t cmd; - uint32_t xri; -}; - -struct menlo_response { - uint32_t xri; /* return the xri of the iocb exchange */ -}; - diff --git a/trunk/drivers/scsi/lpfc/lpfc_crtn.h b/trunk/drivers/scsi/lpfc/lpfc_crtn.h index 5087c4211b43..6f0fb51eb461 100644 --- a/trunk/drivers/scsi/lpfc/lpfc_crtn.h +++ b/trunk/drivers/scsi/lpfc/lpfc_crtn.h @@ -63,7 +63,6 @@ void lpfc_linkdown_port(struct lpfc_vport *); void lpfc_port_link_failure(struct lpfc_vport *); void lpfc_mbx_cmpl_read_la(struct lpfc_hba *, LPFC_MBOXQ_t *); void lpfc_init_vpi_cmpl(struct lpfc_hba *, LPFC_MBOXQ_t *); -void lpfc_cancel_all_vport_retry_delay_timer(struct lpfc_hba *); void lpfc_retry_pport_discovery(struct lpfc_hba *); void lpfc_mbx_cmpl_reg_login(struct lpfc_hba *, LPFC_MBOXQ_t *); @@ -222,10 +221,6 @@ void lpfc_unregister_fcf_rescan(struct lpfc_hba *); void lpfc_unregister_unused_fcf(struct lpfc_hba *); int lpfc_sli4_redisc_fcf_table(struct lpfc_hba *); void lpfc_fcf_redisc_wait_start_timer(struct lpfc_hba *); -void lpfc_sli4_fcf_dead_failthrough(struct lpfc_hba *); -uint16_t lpfc_sli4_fcf_rr_next_index_get(struct lpfc_hba *); -int lpfc_sli4_fcf_rr_index_set(struct lpfc_hba *, uint16_t); -void lpfc_sli4_fcf_rr_index_clear(struct lpfc_hba *, uint16_t); int lpfc_mem_alloc(struct lpfc_hba *, int align); void lpfc_mem_free(struct lpfc_hba *); @@ -390,7 +385,7 @@ void lpfc_parse_fcoe_conf(struct lpfc_hba *, uint8_t *, uint32_t); int lpfc_parse_vpd(struct lpfc_hba *, uint8_t *, int); void lpfc_start_fdiscs(struct lpfc_hba *phba); struct lpfc_vport *lpfc_find_vport_by_vpid(struct lpfc_hba *, uint16_t); -struct lpfc_sglq *__lpfc_get_active_sglq(struct lpfc_hba *, uint16_t); + #define ScsiResult(host_code, scsi_code) (((host_code) << 16) | scsi_code) #define HBA_EVENT_RSCN 5 #define HBA_EVENT_LINK_UP 2 diff --git a/trunk/drivers/scsi/lpfc/lpfc_els.c b/trunk/drivers/scsi/lpfc/lpfc_els.c index ee980bd66869..2a40a6eabf4d 100644 --- a/trunk/drivers/scsi/lpfc/lpfc_els.c +++ b/trunk/drivers/scsi/lpfc/lpfc_els.c @@ -771,7 +771,6 @@ lpfc_cmpl_els_flogi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, struct lpfc_nodelist *ndlp = cmdiocb->context1; struct lpfc_dmabuf *pcmd = cmdiocb->context2, *prsp; struct serv_parm *sp; - uint16_t fcf_index; int rc; /* Check to see if link went down during discovery */ @@ -789,54 +788,6 @@ lpfc_cmpl_els_flogi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, vport->port_state); if (irsp->ulpStatus) { - /* - * In case of FIP mode, perform round robin FCF failover - * due to new FCF discovery - */ - if ((phba->hba_flag & HBA_FIP_SUPPORT) && - (phba->fcf.fcf_flag & FCF_DISCOVERY)) { - lpfc_printf_log(phba, KERN_WARNING, LOG_FIP | LOG_ELS, - "2611 FLOGI failed on registered " - "FCF record fcf_index:%d, trying " - "to perform round robin failover\n", - phba->fcf.current_rec.fcf_indx); - fcf_index = lpfc_sli4_fcf_rr_next_index_get(phba); - if (fcf_index == LPFC_FCOE_FCF_NEXT_NONE) { - /* - * Exhausted the eligible FCF record list, - * fail through to retry FLOGI on current - * FCF record. - */ - lpfc_printf_log(phba, KERN_WARNING, - LOG_FIP | LOG_ELS, - "2760 FLOGI exhausted FCF " - "round robin failover list, " - "retry FLOGI on the current " - "registered FCF index:%d\n", - phba->fcf.current_rec.fcf_indx); - spin_lock_irq(&phba->hbalock); - phba->fcf.fcf_flag &= ~FCF_DISCOVERY; - spin_unlock_irq(&phba->hbalock); - } else { - rc = lpfc_sli4_fcf_rr_read_fcf_rec(phba, - fcf_index); - if (rc) { - lpfc_printf_log(phba, KERN_WARNING, - LOG_FIP | LOG_ELS, - "2761 FLOGI round " - "robin FCF failover " - "read FCF failed " - "rc:x%x, fcf_index:" - "%d\n", rc, - phba->fcf.current_rec.fcf_indx); - spin_lock_irq(&phba->hbalock); - phba->fcf.fcf_flag &= ~FCF_DISCOVERY; - spin_unlock_irq(&phba->hbalock); - } else - goto out; - } - } - /* Check for retry */ if (lpfc_els_retry(phba, cmdiocb, rspiocb)) goto out; @@ -855,8 +806,9 @@ lpfc_cmpl_els_flogi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, } /* FLOGI failure */ - lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS, - "0100 FLOGI failure Status:x%x/x%x TMO:x%x\n", + lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS, + "0100 FLOGI failure Data: x%x x%x " + "x%x\n", irsp->ulpStatus, irsp->un.ulpWord[4], irsp->ulpTimeout); goto flogifail; @@ -890,18 +842,8 @@ lpfc_cmpl_els_flogi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, else rc = lpfc_cmpl_els_flogi_nport(vport, ndlp, sp); - if (!rc) { - /* Mark the FCF discovery process done */ - lpfc_printf_vlog(vport, KERN_INFO, LOG_FIP | LOG_ELS, - "2769 FLOGI successful on FCF record: " - "current_fcf_index:x%x, terminate FCF " - "round robin failover process\n", - phba->fcf.current_rec.fcf_indx); - spin_lock_irq(&phba->hbalock); - phba->fcf.fcf_flag &= ~FCF_DISCOVERY; - spin_unlock_irq(&phba->hbalock); + if (!rc) goto out; - } } flogifail: @@ -1467,10 +1409,6 @@ lpfc_cmpl_els_plogi(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, goto out; } /* PLOGI failed */ - lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS, - "2753 PLOGI failure DID:%06X Status:x%x/x%x\n", - ndlp->nlp_DID, irsp->ulpStatus, - irsp->un.ulpWord[4]); /* Do not call DSM for lpfc_els_abort'ed ELS cmds */ if (lpfc_error_lost_link(irsp)) rc = NLP_STE_FREED_NODE; @@ -1639,10 +1577,6 @@ lpfc_cmpl_els_prli(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, goto out; } /* PRLI failed */ - lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS, - "2754 PRLI failure DID:%06X Status:x%x/x%x\n", - ndlp->nlp_DID, irsp->ulpStatus, - irsp->un.ulpWord[4]); /* Do not call DSM for lpfc_els_abort'ed ELS cmds */ if (lpfc_error_lost_link(irsp)) goto out; @@ -1926,10 +1860,6 @@ lpfc_cmpl_els_adisc(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, goto out; } /* ADISC failed */ - lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS, - "2755 ADISC failure DID:%06X Status:x%x/x%x\n", - ndlp->nlp_DID, irsp->ulpStatus, - irsp->un.ulpWord[4]); /* Do not call DSM for lpfc_els_abort'ed ELS cmds */ if (!lpfc_error_lost_link(irsp)) lpfc_disc_state_machine(vport, ndlp, cmdiocb, @@ -2079,10 +2009,6 @@ lpfc_cmpl_els_logo(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, /* ELS command is being retried */ goto out; /* LOGO failed */ - lpfc_printf_vlog(vport, KERN_ERR, LOG_ELS, - "2756 LOGO failure DID:%06X Status:x%x/x%x\n", - ndlp->nlp_DID, irsp->ulpStatus, - irsp->un.ulpWord[4]); /* Do not call DSM for lpfc_els_abort'ed ELS cmds */ if (lpfc_error_lost_link(irsp)) goto out; @@ -6063,12 +5989,7 @@ lpfc_cmpl_reg_new_vport(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb) if (phba->sli_rev < LPFC_SLI_REV4) lpfc_issue_fabric_reglogin(vport); else { - /* - * If the physical port is instantiated using - * FDISC, do not start vport discovery. - */ - if (vport->port_state != LPFC_FDISC) - lpfc_start_fdiscs(phba); + lpfc_start_fdiscs(phba); lpfc_do_scr_ns_plogi(phba, vport); } } else @@ -6134,18 +6055,21 @@ lpfc_register_new_vport(struct lpfc_hba *phba, struct lpfc_vport *vport, } /** - * lpfc_cancel_all_vport_retry_delay_timer - Cancel all vport retry delay timer + * lpfc_retry_pport_discovery - Start timer to retry FLOGI. * @phba: pointer to lpfc hba data structure. * - * This routine cancels the retry delay timers to all the vports. + * This routine abort all pending discovery commands and + * start a timer to retry FLOGI for the physical port + * discovery. **/ void -lpfc_cancel_all_vport_retry_delay_timer(struct lpfc_hba *phba) +lpfc_retry_pport_discovery(struct lpfc_hba *phba) { struct lpfc_vport **vports; struct lpfc_nodelist *ndlp; - uint32_t link_state; + struct Scsi_Host *shost; int i; + uint32_t link_state; /* Treat this failure as linkdown for all vports */ link_state = phba->link_state; @@ -6163,30 +6087,13 @@ lpfc_cancel_all_vport_retry_delay_timer(struct lpfc_hba *phba) } lpfc_destroy_vport_work_array(phba, vports); } -} - -/** - * lpfc_retry_pport_discovery - Start timer to retry FLOGI. - * @phba: pointer to lpfc hba data structure. - * - * This routine abort all pending discovery commands and - * start a timer to retry FLOGI for the physical port - * discovery. - **/ -void -lpfc_retry_pport_discovery(struct lpfc_hba *phba) -{ - struct lpfc_nodelist *ndlp; - struct Scsi_Host *shost; - - /* Cancel the all vports retry delay retry timers */ - lpfc_cancel_all_vport_retry_delay_timer(phba); /* If fabric require FLOGI, then re-instantiate physical login */ ndlp = lpfc_findnode_did(phba->pport, Fabric_DID); if (!ndlp) return; + shost = lpfc_shost_from_vport(phba->pport); mod_timer(&ndlp->nlp_delayfunc, jiffies + HZ); spin_lock_irq(shost->host_lock); @@ -6312,8 +6219,7 @@ lpfc_cmpl_els_fdisc(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, lpfc_mbx_unreg_vpi(vport); spin_lock_irq(shost->host_lock); vport->fc_flag |= FC_VPORT_NEEDS_REG_VPI; - if (phba->sli_rev == LPFC_SLI_REV4) - vport->fc_flag |= FC_VPORT_NEEDS_INIT_VPI; + vport->fc_flag |= FC_VPORT_NEEDS_INIT_VPI; spin_unlock_irq(shost->host_lock); } @@ -6891,27 +6797,21 @@ lpfc_sli4_els_xri_aborted(struct lpfc_hba *phba, struct lpfc_sglq *sglq_entry = NULL, *sglq_next = NULL; unsigned long iflag = 0; - spin_lock_irqsave(&phba->hbalock, iflag); - spin_lock(&phba->sli4_hba.abts_sgl_list_lock); + spin_lock_irqsave(&phba->sli4_hba.abts_sgl_list_lock, iflag); list_for_each_entry_safe(sglq_entry, sglq_next, &phba->sli4_hba.lpfc_abts_els_sgl_list, list) { if (sglq_entry->sli4_xritag == xri) { list_del(&sglq_entry->list); + spin_unlock_irqrestore( + &phba->sli4_hba.abts_sgl_list_lock, + iflag); + spin_lock_irqsave(&phba->hbalock, iflag); + list_add_tail(&sglq_entry->list, &phba->sli4_hba.lpfc_sgl_list); - sglq_entry->state = SGL_FREED; - spin_unlock(&phba->sli4_hba.abts_sgl_list_lock); spin_unlock_irqrestore(&phba->hbalock, iflag); return; } } - spin_unlock(&phba->sli4_hba.abts_sgl_list_lock); - sglq_entry = __lpfc_get_active_sglq(phba, xri); - if (!sglq_entry || (sglq_entry->sli4_xritag != xri)) { - spin_unlock_irqrestore(&phba->hbalock, iflag); - return; - } - sglq_entry->state = SGL_XRI_ABORTED; - spin_unlock_irqrestore(&phba->hbalock, iflag); - return; + spin_unlock_irqrestore(&phba->sli4_hba.abts_sgl_list_lock, iflag); } diff --git a/trunk/drivers/scsi/lpfc/lpfc_hbadisc.c b/trunk/drivers/scsi/lpfc/lpfc_hbadisc.c index c555e3b7f202..2359d0bfb734 100644 --- a/trunk/drivers/scsi/lpfc/lpfc_hbadisc.c +++ b/trunk/drivers/scsi/lpfc/lpfc_hbadisc.c @@ -1481,6 +1481,8 @@ lpfc_match_fcf_conn_list(struct lpfc_hba *phba, int lpfc_check_pending_fcoe_event(struct lpfc_hba *phba, uint8_t unreg_fcf) { + LPFC_MBOXQ_t *mbox; + int rc; /* * If the Link is up and no FCoE events while in the * FCF discovery, no need to restart FCF discovery. @@ -1489,70 +1491,86 @@ lpfc_check_pending_fcoe_event(struct lpfc_hba *phba, uint8_t unreg_fcf) (phba->fcoe_eventtag == phba->fcoe_eventtag_at_fcf_scan)) return 0; - lpfc_printf_log(phba, KERN_INFO, LOG_FIP, - "2768 Pending link or FCF event during current " - "handling of the previous event: link_state:x%x, " - "evt_tag_at_scan:x%x, evt_tag_current:x%x\n", - phba->link_state, phba->fcoe_eventtag_at_fcf_scan, - phba->fcoe_eventtag); - spin_lock_irq(&phba->hbalock); phba->fcf.fcf_flag &= ~FCF_AVAILABLE; spin_unlock_irq(&phba->hbalock); - if (phba->link_state >= LPFC_LINK_UP) { - lpfc_printf_log(phba, KERN_INFO, LOG_FIP | LOG_DISCOVERY, - "2780 Restart FCF table scan due to " - "pending FCF event:evt_tag_at_scan:x%x, " - "evt_tag_current:x%x\n", - phba->fcoe_eventtag_at_fcf_scan, - phba->fcoe_eventtag); - lpfc_sli4_fcf_scan_read_fcf_rec(phba, LPFC_FCOE_FCF_GET_FIRST); - } else { + if (phba->link_state >= LPFC_LINK_UP) + lpfc_sli4_read_fcf_record(phba, LPFC_FCOE_FCF_GET_FIRST); + else { /* * Do not continue FCF discovery and clear FCF_DISC_INPROGRESS * flag */ spin_lock_irq(&phba->hbalock); phba->hba_flag &= ~FCF_DISC_INPROGRESS; - phba->fcf.fcf_flag &= ~(FCF_REDISC_FOV | FCF_DISCOVERY); + phba->fcf.fcf_flag &= ~FCF_REDISC_FOV; spin_unlock_irq(&phba->hbalock); } - /* Unregister the currently registered FCF if required */ if (unreg_fcf) { spin_lock_irq(&phba->hbalock); phba->fcf.fcf_flag &= ~FCF_REGISTERED; spin_unlock_irq(&phba->hbalock); - lpfc_sli4_unregister_fcf(phba); + mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); + if (!mbox) { + lpfc_printf_log(phba, KERN_ERR, + LOG_DISCOVERY|LOG_MBOX, + "2610 UNREG_FCFI mbox allocation failed\n"); + return 1; + } + lpfc_unreg_fcfi(mbox, phba->fcf.fcfi); + mbox->vport = phba->pport; + mbox->mbox_cmpl = lpfc_unregister_fcfi_cmpl; + rc = lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT); + if (rc == MBX_NOT_FINISHED) { + lpfc_printf_log(phba, KERN_ERR, LOG_DISCOVERY|LOG_MBOX, + "2611 UNREG_FCFI issue mbox failed\n"); + mempool_free(mbox, phba->mbox_mem_pool); + } } + return 1; } /** - * lpfc_sli4_fcf_rec_mbox_parse - parse non-embedded fcf record mailbox command + * lpfc_mbx_cmpl_read_fcf_record - Completion handler for read_fcf mbox. * @phba: pointer to lpfc hba data structure. * @mboxq: pointer to mailbox object. - * @next_fcf_index: pointer to holder of next fcf index. - * - * This routine parses the non-embedded fcf mailbox command by performing the - * necessarily error checking, non-embedded read FCF record mailbox command - * SGE parsing, and endianness swapping. * - * Returns the pointer to the new FCF record in the non-embedded mailbox - * command DMA memory if successfully, other NULL. + * This function iterate through all the fcf records available in + * HBA and choose the optimal FCF record for discovery. After finding + * the FCF for discovery it register the FCF record and kick start + * discovery. + * If FCF_IN_USE flag is set in currently used FCF, the routine try to + * use a FCF record which match fabric name and mac address of the + * currently used FCF record. + * If the driver support only one FCF, it will try to use the FCF record + * used by BOOT_BIOS. */ -static struct fcf_record * -lpfc_sli4_fcf_rec_mbox_parse(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq, - uint16_t *next_fcf_index) +void +lpfc_mbx_cmpl_read_fcf_record(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq) { void *virt_addr; dma_addr_t phys_addr; + uint8_t *bytep; struct lpfc_mbx_sge sge; struct lpfc_mbx_read_fcf_tbl *read_fcf; uint32_t shdr_status, shdr_add_status; union lpfc_sli4_cfg_shdr *shdr; struct fcf_record *new_fcf_record; + uint32_t boot_flag, addr_mode; + uint32_t next_fcf_index; + struct lpfc_fcf_rec *fcf_rec = NULL; + unsigned long iflags; + uint16_t vlan_id; + int rc; + + /* If there is pending FCoE event restart FCF table scan */ + if (lpfc_check_pending_fcoe_event(phba, 0)) { + lpfc_sli4_mbox_cmd_free(phba, mboxq); + return; + } /* Get the first SGE entry from the non-embedded DMA memory. This * routine only uses a single SGE. @@ -1563,183 +1581,59 @@ lpfc_sli4_fcf_rec_mbox_parse(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq, lpfc_printf_log(phba, KERN_ERR, LOG_MBOX, "2524 Failed to get the non-embedded SGE " "virtual address\n"); - return NULL; + goto out; } virt_addr = mboxq->sge_array->addr[0]; shdr = (union lpfc_sli4_cfg_shdr *)virt_addr; shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response); - shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response); + shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, + &shdr->response); + /* + * The FCF Record was read and there is no reason for the driver + * to maintain the FCF record data or memory. Instead, just need + * to book keeping the FCFIs can be used. + */ if (shdr_status || shdr_add_status) { - if (shdr_status == STATUS_FCF_TABLE_EMPTY) - lpfc_printf_log(phba, KERN_ERR, LOG_FIP, + if (shdr_status == STATUS_FCF_TABLE_EMPTY) { + lpfc_printf_log(phba, KERN_ERR, LOG_INIT, "2726 READ_FCF_RECORD Indicates empty " "FCF table.\n"); - else - lpfc_printf_log(phba, KERN_ERR, LOG_FIP, + } else { + lpfc_printf_log(phba, KERN_ERR, LOG_INIT, "2521 READ_FCF_RECORD mailbox failed " - "with status x%x add_status x%x, " - "mbx\n", shdr_status, shdr_add_status); - return NULL; + "with status x%x add_status x%x, mbx\n", + shdr_status, shdr_add_status); + } + goto out; } - - /* Interpreting the returned information of the FCF record */ + /* Interpreting the returned information of FCF records */ read_fcf = (struct lpfc_mbx_read_fcf_tbl *)virt_addr; lpfc_sli_pcimem_bcopy(read_fcf, read_fcf, sizeof(struct lpfc_mbx_read_fcf_tbl)); - *next_fcf_index = bf_get(lpfc_mbx_read_fcf_tbl_nxt_vindx, read_fcf); + next_fcf_index = bf_get(lpfc_mbx_read_fcf_tbl_nxt_vindx, read_fcf); + new_fcf_record = (struct fcf_record *)(virt_addr + sizeof(struct lpfc_mbx_read_fcf_tbl)); lpfc_sli_pcimem_bcopy(new_fcf_record, new_fcf_record, sizeof(struct fcf_record)); + bytep = virt_addr + sizeof(union lpfc_sli4_cfg_shdr); - return new_fcf_record; -} - -/** - * lpfc_sli4_log_fcf_record_info - Log the information of a fcf record - * @phba: pointer to lpfc hba data structure. - * @fcf_record: pointer to the fcf record. - * @vlan_id: the lowest vlan identifier associated to this fcf record. - * @next_fcf_index: the index to the next fcf record in hba's fcf table. - * - * This routine logs the detailed FCF record if the LOG_FIP loggin is - * enabled. - **/ -static void -lpfc_sli4_log_fcf_record_info(struct lpfc_hba *phba, - struct fcf_record *fcf_record, - uint16_t vlan_id, - uint16_t next_fcf_index) -{ - lpfc_printf_log(phba, KERN_INFO, LOG_FIP, - "2764 READ_FCF_RECORD:\n" - "\tFCF_Index : x%x\n" - "\tFCF_Avail : x%x\n" - "\tFCF_Valid : x%x\n" - "\tFIP_Priority : x%x\n" - "\tMAC_Provider : x%x\n" - "\tLowest VLANID : x%x\n" - "\tFCF_MAC Addr : x%x:%x:%x:%x:%x:%x\n" - "\tFabric_Name : x%x:%x:%x:%x:%x:%x:%x:%x\n" - "\tSwitch_Name : x%x:%x:%x:%x:%x:%x:%x:%x\n" - "\tNext_FCF_Index: x%x\n", - bf_get(lpfc_fcf_record_fcf_index, fcf_record), - bf_get(lpfc_fcf_record_fcf_avail, fcf_record), - bf_get(lpfc_fcf_record_fcf_valid, fcf_record), - fcf_record->fip_priority, - bf_get(lpfc_fcf_record_mac_addr_prov, fcf_record), - vlan_id, - bf_get(lpfc_fcf_record_mac_0, fcf_record), - bf_get(lpfc_fcf_record_mac_1, fcf_record), - bf_get(lpfc_fcf_record_mac_2, fcf_record), - bf_get(lpfc_fcf_record_mac_3, fcf_record), - bf_get(lpfc_fcf_record_mac_4, fcf_record), - bf_get(lpfc_fcf_record_mac_5, fcf_record), - bf_get(lpfc_fcf_record_fab_name_0, fcf_record), - bf_get(lpfc_fcf_record_fab_name_1, fcf_record), - bf_get(lpfc_fcf_record_fab_name_2, fcf_record), - bf_get(lpfc_fcf_record_fab_name_3, fcf_record), - bf_get(lpfc_fcf_record_fab_name_4, fcf_record), - bf_get(lpfc_fcf_record_fab_name_5, fcf_record), - bf_get(lpfc_fcf_record_fab_name_6, fcf_record), - bf_get(lpfc_fcf_record_fab_name_7, fcf_record), - bf_get(lpfc_fcf_record_switch_name_0, fcf_record), - bf_get(lpfc_fcf_record_switch_name_1, fcf_record), - bf_get(lpfc_fcf_record_switch_name_2, fcf_record), - bf_get(lpfc_fcf_record_switch_name_3, fcf_record), - bf_get(lpfc_fcf_record_switch_name_4, fcf_record), - bf_get(lpfc_fcf_record_switch_name_5, fcf_record), - bf_get(lpfc_fcf_record_switch_name_6, fcf_record), - bf_get(lpfc_fcf_record_switch_name_7, fcf_record), - next_fcf_index); -} - -/** - * lpfc_mbx_cmpl_fcf_scan_read_fcf_rec - fcf scan read_fcf mbox cmpl handler. - * @phba: pointer to lpfc hba data structure. - * @mboxq: pointer to mailbox object. - * - * This function iterates through all the fcf records available in - * HBA and chooses the optimal FCF record for discovery. After finding - * the FCF for discovery it registers the FCF record and kicks start - * discovery. - * If FCF_IN_USE flag is set in currently used FCF, the routine tries to - * use an FCF record which matches fabric name and mac address of the - * currently used FCF record. - * If the driver supports only one FCF, it will try to use the FCF record - * used by BOOT_BIOS. - */ -void -lpfc_mbx_cmpl_fcf_scan_read_fcf_rec(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq) -{ - struct fcf_record *new_fcf_record; - uint32_t boot_flag, addr_mode; - uint16_t fcf_index, next_fcf_index; - struct lpfc_fcf_rec *fcf_rec = NULL; - uint16_t vlan_id; - int rc; - - /* If there is pending FCoE event restart FCF table scan */ - if (lpfc_check_pending_fcoe_event(phba, 0)) { - lpfc_sli4_mbox_cmd_free(phba, mboxq); - return; - } - - /* Parse the FCF record from the non-embedded mailbox command */ - new_fcf_record = lpfc_sli4_fcf_rec_mbox_parse(phba, mboxq, - &next_fcf_index); - if (!new_fcf_record) { - lpfc_printf_log(phba, KERN_WARNING, LOG_FIP, - "2765 Mailbox command READ_FCF_RECORD " - "failed to retrieve a FCF record.\n"); - /* Let next new FCF event trigger fast failover */ - spin_lock_irq(&phba->hbalock); - phba->hba_flag &= ~FCF_DISC_INPROGRESS; - spin_unlock_irq(&phba->hbalock); - lpfc_sli4_mbox_cmd_free(phba, mboxq); - return; - } - - /* Check the FCF record against the connection list */ rc = lpfc_match_fcf_conn_list(phba, new_fcf_record, &boot_flag, &addr_mode, &vlan_id); - - /* Log the FCF record information if turned on */ - lpfc_sli4_log_fcf_record_info(phba, new_fcf_record, vlan_id, - next_fcf_index); - /* * If the fcf record does not match with connect list entries - * read the next entry; otherwise, this is an eligible FCF - * record for round robin FCF failover. + * read the next entry. */ - if (!rc) { - lpfc_printf_log(phba, KERN_WARNING, LOG_FIP, - "2781 FCF record fcf_index:x%x failed FCF " - "connection list check, fcf_avail:x%x, " - "fcf_valid:x%x\n", - bf_get(lpfc_fcf_record_fcf_index, - new_fcf_record), - bf_get(lpfc_fcf_record_fcf_avail, - new_fcf_record), - bf_get(lpfc_fcf_record_fcf_valid, - new_fcf_record)); + if (!rc) goto read_next_fcf; - } else { - fcf_index = bf_get(lpfc_fcf_record_fcf_index, new_fcf_record); - rc = lpfc_sli4_fcf_rr_index_set(phba, fcf_index); - if (rc) - goto read_next_fcf; - } - /* * If this is not the first FCF discovery of the HBA, use last * FCF record for the discovery. The condition that a rescan * matches the in-use FCF record: fabric name, switch name, mac * address, and vlan_id. */ - spin_lock_irq(&phba->hbalock); + spin_lock_irqsave(&phba->hbalock, iflags); if (phba->fcf.fcf_flag & FCF_IN_USE) { if (lpfc_fab_name_match(phba->fcf.current_rec.fabric_name, new_fcf_record) && @@ -1755,9 +1649,8 @@ lpfc_mbx_cmpl_fcf_scan_read_fcf_rec(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq) __lpfc_sli4_stop_fcf_redisc_wait_timer(phba); else if (phba->fcf.fcf_flag & FCF_REDISC_FOV) /* If in fast failover, mark it's completed */ - phba->fcf.fcf_flag &= ~(FCF_REDISC_FOV | - FCF_DISCOVERY); - spin_unlock_irq(&phba->hbalock); + phba->fcf.fcf_flag &= ~FCF_REDISC_FOV; + spin_unlock_irqrestore(&phba->hbalock, iflags); goto out; } /* @@ -1768,7 +1661,7 @@ lpfc_mbx_cmpl_fcf_scan_read_fcf_rec(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq) * next candidate. */ if (!(phba->fcf.fcf_flag & FCF_REDISC_FOV)) { - spin_unlock_irq(&phba->hbalock); + spin_unlock_irqrestore(&phba->hbalock, iflags); goto read_next_fcf; } } @@ -1776,9 +1669,14 @@ lpfc_mbx_cmpl_fcf_scan_read_fcf_rec(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq) * Update on failover FCF record only if it's in FCF fast-failover * period; otherwise, update on current FCF record. */ - if (phba->fcf.fcf_flag & FCF_REDISC_FOV) - fcf_rec = &phba->fcf.failover_rec; - else + if (phba->fcf.fcf_flag & FCF_REDISC_FOV) { + /* Fast FCF failover only to the same fabric name */ + if (lpfc_fab_name_match(phba->fcf.current_rec.fabric_name, + new_fcf_record)) + fcf_rec = &phba->fcf.failover_rec; + else + goto read_next_fcf; + } else fcf_rec = &phba->fcf.current_rec; if (phba->fcf.fcf_flag & FCF_AVAILABLE) { @@ -1791,7 +1689,7 @@ lpfc_mbx_cmpl_fcf_scan_read_fcf_rec(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq) /* Choose this FCF record */ __lpfc_update_fcf_record(phba, fcf_rec, new_fcf_record, addr_mode, vlan_id, BOOT_ENABLE); - spin_unlock_irq(&phba->hbalock); + spin_unlock_irqrestore(&phba->hbalock, iflags); goto read_next_fcf; } /* @@ -1800,19 +1698,20 @@ lpfc_mbx_cmpl_fcf_scan_read_fcf_rec(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq) * the next FCF record. */ if (!boot_flag && (fcf_rec->flag & BOOT_ENABLE)) { - spin_unlock_irq(&phba->hbalock); + spin_unlock_irqrestore(&phba->hbalock, iflags); goto read_next_fcf; } /* * If the new hba FCF record has lower priority value * than the driver FCF record, use the new record. */ - if (new_fcf_record->fip_priority < fcf_rec->priority) { + if (lpfc_fab_name_match(fcf_rec->fabric_name, new_fcf_record) && + (new_fcf_record->fip_priority < fcf_rec->priority)) { /* Choose this FCF record */ __lpfc_update_fcf_record(phba, fcf_rec, new_fcf_record, addr_mode, vlan_id, 0); } - spin_unlock_irq(&phba->hbalock); + spin_unlock_irqrestore(&phba->hbalock, iflags); goto read_next_fcf; } /* @@ -1825,7 +1724,7 @@ lpfc_mbx_cmpl_fcf_scan_read_fcf_rec(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq) BOOT_ENABLE : 0)); phba->fcf.fcf_flag |= FCF_AVAILABLE; } - spin_unlock_irq(&phba->hbalock); + spin_unlock_irqrestore(&phba->hbalock, iflags); goto read_next_fcf; read_next_fcf: @@ -1841,22 +1740,9 @@ lpfc_mbx_cmpl_fcf_scan_read_fcf_rec(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq) * FCF scan inprogress, and do nothing */ if (!(phba->fcf.failover_rec.flag & RECORD_VALID)) { - lpfc_printf_log(phba, KERN_WARNING, LOG_FIP, - "2782 No suitable FCF record " - "found during this round of " - "post FCF rediscovery scan: " - "fcf_evt_tag:x%x, fcf_index: " - "x%x\n", - phba->fcoe_eventtag_at_fcf_scan, - bf_get(lpfc_fcf_record_fcf_index, - new_fcf_record)); - /* - * Let next new FCF event trigger fast - * failover - */ - spin_lock_irq(&phba->hbalock); + spin_lock_irqsave(&phba->hbalock, iflags); phba->hba_flag &= ~FCF_DISC_INPROGRESS; - spin_unlock_irq(&phba->hbalock); + spin_unlock_irqrestore(&phba->hbalock, iflags); return; } /* @@ -1868,23 +1754,16 @@ lpfc_mbx_cmpl_fcf_scan_read_fcf_rec(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq) * record. */ - /* Unregister the current in-use FCF record */ + /* unregister the current in-use FCF record */ lpfc_unregister_fcf(phba); - - /* Replace in-use record with the new record */ + /* replace in-use record with the new record */ memcpy(&phba->fcf.current_rec, &phba->fcf.failover_rec, sizeof(struct lpfc_fcf_rec)); /* mark the FCF fast failover completed */ - spin_lock_irq(&phba->hbalock); + spin_lock_irqsave(&phba->hbalock, iflags); phba->fcf.fcf_flag &= ~FCF_REDISC_FOV; - spin_unlock_irq(&phba->hbalock); - /* - * Set up the initial registered FCF index for FLOGI - * round robin FCF failover. - */ - phba->fcf.fcf_rr_init_indx = - phba->fcf.failover_rec.fcf_indx; + spin_unlock_irqrestore(&phba->hbalock, iflags); /* Register to the new FCF record */ lpfc_register_fcf(phba); } else { @@ -1897,25 +1776,13 @@ lpfc_mbx_cmpl_fcf_scan_read_fcf_rec(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq) return; /* * Otherwise, initial scan or post linkdown rescan, - * register with the best FCF record found so far - * through the FCF scanning process. - */ - - /* mark the initial FCF discovery completed */ - spin_lock_irq(&phba->hbalock); - phba->fcf.fcf_flag &= ~FCF_INIT_DISC; - spin_unlock_irq(&phba->hbalock); - /* - * Set up the initial registered FCF index for FLOGI - * round robin FCF failover + * register with the best fit FCF record found so + * far through the scanning process. */ - phba->fcf.fcf_rr_init_indx = - phba->fcf.current_rec.fcf_indx; - /* Register to the new FCF record */ lpfc_register_fcf(phba); } } else - lpfc_sli4_fcf_scan_read_fcf_rec(phba, next_fcf_index); + lpfc_sli4_read_fcf_record(phba, next_fcf_index); return; out: @@ -1925,141 +1792,6 @@ lpfc_mbx_cmpl_fcf_scan_read_fcf_rec(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq) return; } -/** - * lpfc_mbx_cmpl_fcf_rr_read_fcf_rec - fcf round robin read_fcf mbox cmpl hdler - * @phba: pointer to lpfc hba data structure. - * @mboxq: pointer to mailbox object. - * - * This is the callback function for FLOGI failure round robin FCF failover - * read FCF record mailbox command from the eligible FCF record bmask for - * performing the failover. If the FCF read back is not valid/available, it - * fails through to retrying FLOGI to the currently registered FCF again. - * Otherwise, if the FCF read back is valid and available, it will set the - * newly read FCF record to the failover FCF record, unregister currently - * registered FCF record, copy the failover FCF record to the current - * FCF record, and then register the current FCF record before proceeding - * to trying FLOGI on the new failover FCF. - */ -void -lpfc_mbx_cmpl_fcf_rr_read_fcf_rec(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq) -{ - struct fcf_record *new_fcf_record; - uint32_t boot_flag, addr_mode; - uint16_t next_fcf_index; - uint16_t current_fcf_index; - uint16_t vlan_id; - - /* If link state is not up, stop the round robin failover process */ - if (phba->link_state < LPFC_LINK_UP) { - spin_lock_irq(&phba->hbalock); - phba->fcf.fcf_flag &= ~FCF_DISCOVERY; - spin_unlock_irq(&phba->hbalock); - lpfc_sli4_mbox_cmd_free(phba, mboxq); - return; - } - - /* Parse the FCF record from the non-embedded mailbox command */ - new_fcf_record = lpfc_sli4_fcf_rec_mbox_parse(phba, mboxq, - &next_fcf_index); - if (!new_fcf_record) { - lpfc_printf_log(phba, KERN_WARNING, LOG_FIP, - "2766 Mailbox command READ_FCF_RECORD " - "failed to retrieve a FCF record.\n"); - goto out; - } - - /* Get the needed parameters from FCF record */ - lpfc_match_fcf_conn_list(phba, new_fcf_record, &boot_flag, - &addr_mode, &vlan_id); - - /* Log the FCF record information if turned on */ - lpfc_sli4_log_fcf_record_info(phba, new_fcf_record, vlan_id, - next_fcf_index); - - /* Upload new FCF record to the failover FCF record */ - spin_lock_irq(&phba->hbalock); - __lpfc_update_fcf_record(phba, &phba->fcf.failover_rec, - new_fcf_record, addr_mode, vlan_id, - (boot_flag ? BOOT_ENABLE : 0)); - spin_unlock_irq(&phba->hbalock); - - current_fcf_index = phba->fcf.current_rec.fcf_indx; - - /* Unregister the current in-use FCF record */ - lpfc_unregister_fcf(phba); - - /* Replace in-use record with the new record */ - memcpy(&phba->fcf.current_rec, &phba->fcf.failover_rec, - sizeof(struct lpfc_fcf_rec)); - - lpfc_printf_log(phba, KERN_INFO, LOG_FIP, - "2783 FLOGI round robin FCF failover from FCF " - "(index:x%x) to FCF (index:x%x).\n", - current_fcf_index, - bf_get(lpfc_fcf_record_fcf_index, new_fcf_record)); - -out: - lpfc_sli4_mbox_cmd_free(phba, mboxq); - lpfc_register_fcf(phba); -} - -/** - * lpfc_mbx_cmpl_read_fcf_rec - read fcf completion handler. - * @phba: pointer to lpfc hba data structure. - * @mboxq: pointer to mailbox object. - * - * This is the callback function of read FCF record mailbox command for - * updating the eligible FCF bmask for FLOGI failure round robin FCF - * failover when a new FCF event happened. If the FCF read back is - * valid/available and it passes the connection list check, it updates - * the bmask for the eligible FCF record for round robin failover. - */ -void -lpfc_mbx_cmpl_read_fcf_rec(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq) -{ - struct fcf_record *new_fcf_record; - uint32_t boot_flag, addr_mode; - uint16_t fcf_index, next_fcf_index; - uint16_t vlan_id; - int rc; - - /* If link state is not up, no need to proceed */ - if (phba->link_state < LPFC_LINK_UP) - goto out; - - /* If FCF discovery period is over, no need to proceed */ - if (phba->fcf.fcf_flag & FCF_DISCOVERY) - goto out; - - /* Parse the FCF record from the non-embedded mailbox command */ - new_fcf_record = lpfc_sli4_fcf_rec_mbox_parse(phba, mboxq, - &next_fcf_index); - if (!new_fcf_record) { - lpfc_printf_log(phba, KERN_INFO, LOG_FIP, - "2767 Mailbox command READ_FCF_RECORD " - "failed to retrieve a FCF record.\n"); - goto out; - } - - /* Check the connection list for eligibility */ - rc = lpfc_match_fcf_conn_list(phba, new_fcf_record, &boot_flag, - &addr_mode, &vlan_id); - - /* Log the FCF record information if turned on */ - lpfc_sli4_log_fcf_record_info(phba, new_fcf_record, vlan_id, - next_fcf_index); - - if (!rc) - goto out; - - /* Update the eligible FCF record index bmask */ - fcf_index = bf_get(lpfc_fcf_record_fcf_index, new_fcf_record); - rc = lpfc_sli4_fcf_rr_index_set(phba, fcf_index); - -out: - lpfc_sli4_mbox_cmd_free(phba, mboxq); -} - /** * lpfc_init_vpi_cmpl - Completion handler for init_vpi mbox command. * @phba: pointer to lpfc hba data structure. @@ -2292,6 +2024,8 @@ lpfc_mbx_process_link_up(struct lpfc_hba *phba, READ_LA_VAR *la) int rc; struct fcf_record *fcf_record; + sparam_mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); + spin_lock_irq(&phba->hbalock); switch (la->UlnkSpeed) { case LA_1GHZ_LINK: @@ -2383,24 +2117,18 @@ lpfc_mbx_process_link_up(struct lpfc_hba *phba, READ_LA_VAR *la) spin_unlock_irq(&phba->hbalock); lpfc_linkup(phba); - sparam_mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); - if (!sparam_mbox) - goto out; - - rc = lpfc_read_sparam(phba, sparam_mbox, 0); - if (rc) { - mempool_free(sparam_mbox, phba->mbox_mem_pool); - goto out; - } - sparam_mbox->vport = vport; - sparam_mbox->mbox_cmpl = lpfc_mbx_cmpl_read_sparam; - rc = lpfc_sli_issue_mbox(phba, sparam_mbox, MBX_NOWAIT); - if (rc == MBX_NOT_FINISHED) { - mp = (struct lpfc_dmabuf *) sparam_mbox->context1; - lpfc_mbuf_free(phba, mp->virt, mp->phys); - kfree(mp); - mempool_free(sparam_mbox, phba->mbox_mem_pool); - goto out; + if (sparam_mbox) { + lpfc_read_sparam(phba, sparam_mbox, 0); + sparam_mbox->vport = vport; + sparam_mbox->mbox_cmpl = lpfc_mbx_cmpl_read_sparam; + rc = lpfc_sli_issue_mbox(phba, sparam_mbox, MBX_NOWAIT); + if (rc == MBX_NOT_FINISHED) { + mp = (struct lpfc_dmabuf *) sparam_mbox->context1; + lpfc_mbuf_free(phba, mp->virt, mp->phys); + kfree(mp); + mempool_free(sparam_mbox, phba->mbox_mem_pool); + goto out; + } } if (!(phba->hba_flag & HBA_FCOE_SUPPORT)) { @@ -2458,20 +2186,10 @@ lpfc_mbx_process_link_up(struct lpfc_hba *phba, READ_LA_VAR *la) spin_unlock_irq(&phba->hbalock); return; } - /* This is the initial FCF discovery scan */ - phba->fcf.fcf_flag |= FCF_INIT_DISC; spin_unlock_irq(&phba->hbalock); - lpfc_printf_log(phba, KERN_INFO, LOG_FIP | LOG_DISCOVERY, - "2778 Start FCF table scan at linkup\n"); - - rc = lpfc_sli4_fcf_scan_read_fcf_rec(phba, - LPFC_FCOE_FCF_GET_FIRST); - if (rc) { - spin_lock_irq(&phba->hbalock); - phba->fcf.fcf_flag &= ~FCF_INIT_DISC; - spin_unlock_irq(&phba->hbalock); + rc = lpfc_sli4_read_fcf_record(phba, LPFC_FCOE_FCF_GET_FIRST); + if (rc) goto out; - } } return; @@ -3661,12 +3379,8 @@ lpfc_unreg_hba_rpis(struct lpfc_hba *phba) shost = lpfc_shost_from_vport(vports[i]); spin_lock_irq(shost->host_lock); list_for_each_entry(ndlp, &vports[i]->fc_nodes, nlp_listp) { - if (ndlp->nlp_flag & NLP_RPI_VALID) { - /* The mempool_alloc might sleep */ - spin_unlock_irq(shost->host_lock); + if (ndlp->nlp_flag & NLP_RPI_VALID) lpfc_unreg_rpi(vports[i], ndlp); - spin_lock_irq(shost->host_lock); - } } spin_unlock_irq(shost->host_lock); } @@ -5042,7 +4756,6 @@ lpfc_unregister_fcf_rescan(struct lpfc_hba *phba) return; /* Reset HBA FCF states after successful unregister FCF */ phba->fcf.fcf_flag = 0; - phba->fcf.current_rec.flag = 0; /* * If driver is not unloading, check if there is any other @@ -5052,21 +4765,13 @@ lpfc_unregister_fcf_rescan(struct lpfc_hba *phba) (phba->link_state < LPFC_LINK_UP)) return; - /* This is considered as the initial FCF discovery scan */ - spin_lock_irq(&phba->hbalock); - phba->fcf.fcf_flag |= FCF_INIT_DISC; - spin_unlock_irq(&phba->hbalock); - rc = lpfc_sli4_fcf_scan_read_fcf_rec(phba, LPFC_FCOE_FCF_GET_FIRST); + rc = lpfc_sli4_read_fcf_record(phba, LPFC_FCOE_FCF_GET_FIRST); - if (rc) { - spin_lock_irq(&phba->hbalock); - phba->fcf.fcf_flag &= ~FCF_INIT_DISC; - spin_unlock_irq(&phba->hbalock); + if (rc) lpfc_printf_log(phba, KERN_ERR, LOG_DISCOVERY|LOG_MBOX, "2553 lpfc_unregister_unused_fcf failed " "to read FCF record HBA state x%x\n", phba->pport->port_state); - } } /** diff --git a/trunk/drivers/scsi/lpfc/lpfc_init.c b/trunk/drivers/scsi/lpfc/lpfc_init.c index ea44239eeb33..d29ac7c317d9 100644 --- a/trunk/drivers/scsi/lpfc/lpfc_init.c +++ b/trunk/drivers/scsi/lpfc/lpfc_init.c @@ -350,12 +350,7 @@ lpfc_config_port_post(struct lpfc_hba *phba) mb = &pmb->u.mb; /* Get login parameters for NID. */ - rc = lpfc_read_sparam(phba, pmb, 0); - if (rc) { - mempool_free(pmb, phba->mbox_mem_pool); - return -ENOMEM; - } - + lpfc_read_sparam(phba, pmb, 0); pmb->vport = vport; if (lpfc_sli_issue_mbox(phba, pmb, MBX_POLL) != MBX_SUCCESS) { lpfc_printf_log(phba, KERN_ERR, LOG_INIT, @@ -364,7 +359,7 @@ lpfc_config_port_post(struct lpfc_hba *phba) mb->mbxCommand, mb->mbxStatus); phba->link_state = LPFC_HBA_ERROR; mp = (struct lpfc_dmabuf *) pmb->context1; - mempool_free(pmb, phba->mbox_mem_pool); + mempool_free( pmb, phba->mbox_mem_pool); lpfc_mbuf_free(phba, mp->virt, mp->phys); kfree(mp); return -EIO; @@ -549,7 +544,7 @@ lpfc_config_port_post(struct lpfc_hba *phba) mempool_free(pmb, phba->mbox_mem_pool); return -EIO; } - } else if (phba->cfg_suppress_link_up == LPFC_INITIALIZE_LINK) { + } else if (phba->cfg_suppress_link_up == 0) { lpfc_init_link(phba, pmb, phba->cfg_topology, phba->cfg_link_speed); pmb->mbox_cmpl = lpfc_sli_def_mbox_cmpl; @@ -576,11 +571,6 @@ lpfc_config_port_post(struct lpfc_hba *phba) } /* MBOX buffer will be freed in mbox compl */ pmb = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); - if (!pmb) { - phba->link_state = LPFC_HBA_ERROR; - return -ENOMEM; - } - lpfc_config_async(phba, pmb, LPFC_ELS_RING); pmb->mbox_cmpl = lpfc_config_async_cmpl; pmb->vport = phba->pport; @@ -598,11 +588,6 @@ lpfc_config_port_post(struct lpfc_hba *phba) /* Get Option rom version */ pmb = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); - if (!pmb) { - phba->link_state = LPFC_HBA_ERROR; - return -ENOMEM; - } - lpfc_dump_wakeup_param(phba, pmb); pmb->mbox_cmpl = lpfc_dump_wakeup_param_cmpl; pmb->vport = phba->pport; @@ -667,7 +652,7 @@ lpfc_hba_init_link(struct lpfc_hba *phba) mempool_free(pmb, phba->mbox_mem_pool); return -EIO; } - phba->cfg_suppress_link_up = LPFC_INITIALIZE_LINK; + phba->cfg_suppress_link_up = 0; return 0; } @@ -822,8 +807,6 @@ lpfc_hba_down_post_s4(struct lpfc_hba *phba) LIST_HEAD(aborts); int ret; unsigned long iflag = 0; - struct lpfc_sglq *sglq_entry = NULL; - ret = lpfc_hba_down_post_s3(phba); if (ret) return ret; @@ -839,10 +822,6 @@ lpfc_hba_down_post_s4(struct lpfc_hba *phba) * list. */ spin_lock(&phba->sli4_hba.abts_sgl_list_lock); - list_for_each_entry(sglq_entry, - &phba->sli4_hba.lpfc_abts_els_sgl_list, list) - sglq_entry->state = SGL_FREED; - list_splice_init(&phba->sli4_hba.lpfc_abts_els_sgl_list, &phba->sli4_hba.lpfc_sgl_list); spin_unlock(&phba->sli4_hba.abts_sgl_list_lock); @@ -2199,10 +2178,8 @@ lpfc_stop_vport_timers(struct lpfc_vport *vport) void __lpfc_sli4_stop_fcf_redisc_wait_timer(struct lpfc_hba *phba) { - /* Clear pending FCF rediscovery wait and failover in progress flags */ - phba->fcf.fcf_flag &= ~(FCF_REDISC_PEND | - FCF_DEAD_DISC | - FCF_ACVL_DISC); + /* Clear pending FCF rediscovery wait timer */ + phba->fcf.fcf_flag &= ~FCF_REDISC_PEND; /* Now, try to stop the timer */ del_timer(&phba->fcf.redisc_wait); } @@ -2599,14 +2576,6 @@ lpfc_create_port(struct lpfc_hba *phba, int instance, struct device *dev) init_timer(&vport->els_tmofunc); vport->els_tmofunc.function = lpfc_els_timeout; vport->els_tmofunc.data = (unsigned long)vport; - if (phba->pcidev->device == PCI_DEVICE_ID_HORNET) { - phba->menlo_flag |= HBA_MENLO_SUPPORT; - /* check for menlo minimum sg count */ - if (phba->cfg_sg_seg_cnt < LPFC_DEFAULT_MENLO_SG_SEG_CNT) { - phba->cfg_sg_seg_cnt = LPFC_DEFAULT_MENLO_SG_SEG_CNT; - shost->sg_tablesize = phba->cfg_sg_seg_cnt; - } - } error = scsi_add_host_with_dma(shost, dev, &phba->pcidev->dev); if (error) @@ -2943,9 +2912,6 @@ lpfc_sli4_fcf_redisc_wait_tmo(unsigned long ptr) /* FCF rediscovery event to worker thread */ phba->fcf.fcf_flag |= FCF_REDISC_EVT; spin_unlock_irq(&phba->hbalock); - lpfc_printf_log(phba, KERN_INFO, LOG_FIP, - "2776 FCF rediscover wait timer expired, post " - "a worker thread event for FCF table scan\n"); /* wake up worker thread */ lpfc_worker_wake_up(phba); } @@ -3216,68 +3182,6 @@ lpfc_sli4_async_link_evt(struct lpfc_hba *phba, mempool_free(pmb, phba->mbox_mem_pool); } -/** - * lpfc_sli4_perform_vport_cvl - Perform clear virtual link on a vport - * @vport: pointer to vport data structure. - * - * This routine is to perform Clear Virtual Link (CVL) on a vport in - * response to a CVL event. - * - * Return the pointer to the ndlp with the vport if successful, otherwise - * return NULL. - **/ -static struct lpfc_nodelist * -lpfc_sli4_perform_vport_cvl(struct lpfc_vport *vport) -{ - struct lpfc_nodelist *ndlp; - struct Scsi_Host *shost; - struct lpfc_hba *phba; - - if (!vport) - return NULL; - ndlp = lpfc_findnode_did(vport, Fabric_DID); - if (!ndlp) - return NULL; - phba = vport->phba; - if (!phba) - return NULL; - if (phba->pport->port_state <= LPFC_FLOGI) - return NULL; - /* If virtual link is not yet instantiated ignore CVL */ - if (vport->port_state <= LPFC_FDISC) - return NULL; - shost = lpfc_shost_from_vport(vport); - if (!shost) - return NULL; - lpfc_linkdown_port(vport); - lpfc_cleanup_pending_mbox(vport); - spin_lock_irq(shost->host_lock); - vport->fc_flag |= FC_VPORT_CVL_RCVD; - spin_unlock_irq(shost->host_lock); - - return ndlp; -} - -/** - * lpfc_sli4_perform_all_vport_cvl - Perform clear virtual link on all vports - * @vport: pointer to lpfc hba data structure. - * - * This routine is to perform Clear Virtual Link (CVL) on all vports in - * response to a FCF dead event. - **/ -static void -lpfc_sli4_perform_all_vport_cvl(struct lpfc_hba *phba) -{ - struct lpfc_vport **vports; - int i; - - vports = lpfc_create_vport_work_array(phba); - if (vports) - for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) - lpfc_sli4_perform_vport_cvl(vports[i]); - lpfc_destroy_vport_work_array(phba, vports); -} - /** * lpfc_sli4_async_fcoe_evt - Process the asynchronous fcoe event * @phba: pointer to lpfc hba data structure. @@ -3294,6 +3198,7 @@ lpfc_sli4_async_fcoe_evt(struct lpfc_hba *phba, struct lpfc_vport *vport; struct lpfc_nodelist *ndlp; struct Scsi_Host *shost; + uint32_t link_state; int active_vlink_present; struct lpfc_vport **vports; int i; @@ -3303,11 +3208,10 @@ lpfc_sli4_async_fcoe_evt(struct lpfc_hba *phba, switch (event_type) { case LPFC_FCOE_EVENT_TYPE_NEW_FCF: case LPFC_FCOE_EVENT_TYPE_FCF_PARAM_MOD: - lpfc_printf_log(phba, KERN_ERR, LOG_FIP | LOG_DISCOVERY, - "2546 New FCF found/FCF parameter modified event: " - "evt_tag:x%x, fcf_index:x%x\n", - acqe_fcoe->event_tag, acqe_fcoe->index); - + lpfc_printf_log(phba, KERN_ERR, LOG_DISCOVERY, + "2546 New FCF found index 0x%x tag 0x%x\n", + acqe_fcoe->index, + acqe_fcoe->event_tag); spin_lock_irq(&phba->hbalock); if ((phba->fcf.fcf_flag & FCF_SCAN_DONE) || (phba->hba_flag & FCF_DISC_INPROGRESS)) { @@ -3318,7 +3222,6 @@ lpfc_sli4_async_fcoe_evt(struct lpfc_hba *phba, spin_unlock_irq(&phba->hbalock); break; } - if (phba->fcf.fcf_flag & FCF_REDISC_EVT) { /* * If fast FCF failover rescan event is pending, @@ -3329,33 +3232,12 @@ lpfc_sli4_async_fcoe_evt(struct lpfc_hba *phba, } spin_unlock_irq(&phba->hbalock); - if ((phba->fcf.fcf_flag & FCF_DISCOVERY) && - !(phba->fcf.fcf_flag & FCF_REDISC_FOV)) { - /* - * During period of FCF discovery, read the FCF - * table record indexed by the event to update - * FCF round robin failover eligible FCF bmask. - */ - lpfc_printf_log(phba, KERN_INFO, LOG_FIP | - LOG_DISCOVERY, - "2779 Read new FCF record with " - "fcf_index:x%x for updating FCF " - "round robin failover bmask\n", - acqe_fcoe->index); - rc = lpfc_sli4_read_fcf_rec(phba, acqe_fcoe->index); - } - - /* Otherwise, scan the entire FCF table and re-discover SAN */ - lpfc_printf_log(phba, KERN_INFO, LOG_FIP | LOG_DISCOVERY, - "2770 Start FCF table scan due to new FCF " - "event: evt_tag:x%x, fcf_index:x%x\n", - acqe_fcoe->event_tag, acqe_fcoe->index); - rc = lpfc_sli4_fcf_scan_read_fcf_rec(phba, - LPFC_FCOE_FCF_GET_FIRST); + /* Read the FCF table and re-discover SAN. */ + rc = lpfc_sli4_read_fcf_record(phba, LPFC_FCOE_FCF_GET_FIRST); if (rc) - lpfc_printf_log(phba, KERN_ERR, LOG_FIP | LOG_DISCOVERY, - "2547 Issue FCF scan read FCF mailbox " - "command failed 0x%x\n", rc); + lpfc_printf_log(phba, KERN_ERR, LOG_DISCOVERY, + "2547 Read FCF record failed 0x%x\n", + rc); break; case LPFC_FCOE_EVENT_TYPE_FCF_TABLE_FULL: @@ -3366,63 +3248,47 @@ lpfc_sli4_async_fcoe_evt(struct lpfc_hba *phba, break; case LPFC_FCOE_EVENT_TYPE_FCF_DEAD: - lpfc_printf_log(phba, KERN_ERR, LOG_FIP | LOG_DISCOVERY, + lpfc_printf_log(phba, KERN_ERR, LOG_DISCOVERY, "2549 FCF disconnected from network index 0x%x" " tag 0x%x\n", acqe_fcoe->index, acqe_fcoe->event_tag); /* If the event is not for currently used fcf do nothing */ if (phba->fcf.current_rec.fcf_indx != acqe_fcoe->index) break; - /* We request port to rediscover the entire FCF table for - * a fast recovery from case that the current FCF record - * is no longer valid if we are not in the middle of FCF - * failover process already. + /* + * Currently, driver support only one FCF - so treat this as + * a link down, but save the link state because we don't want + * it to be changed to Link Down unless it is already down. */ - spin_lock_irq(&phba->hbalock); - if (phba->fcf.fcf_flag & FCF_DISCOVERY) { - spin_unlock_irq(&phba->hbalock); - /* Update FLOGI FCF failover eligible FCF bmask */ - lpfc_sli4_fcf_rr_index_clear(phba, acqe_fcoe->index); - break; - } - /* Mark the fast failover process in progress */ - phba->fcf.fcf_flag |= FCF_DEAD_DISC; - spin_unlock_irq(&phba->hbalock); - lpfc_printf_log(phba, KERN_INFO, LOG_FIP | LOG_DISCOVERY, - "2771 Start FCF fast failover process due to " - "FCF DEAD event: evt_tag:x%x, fcf_index:x%x " - "\n", acqe_fcoe->event_tag, acqe_fcoe->index); - rc = lpfc_sli4_redisc_fcf_table(phba); - if (rc) { - lpfc_printf_log(phba, KERN_ERR, LOG_FIP | - LOG_DISCOVERY, - "2772 Issue FCF rediscover mabilbox " - "command failed, fail through to FCF " - "dead event\n"); - spin_lock_irq(&phba->hbalock); - phba->fcf.fcf_flag &= ~FCF_DEAD_DISC; - spin_unlock_irq(&phba->hbalock); - /* - * Last resort will fail over by treating this - * as a link down to FCF registration. - */ - lpfc_sli4_fcf_dead_failthrough(phba); - } else - /* Handling fast FCF failover to a DEAD FCF event - * is considered equalivant to receiving CVL to all - * vports. - */ - lpfc_sli4_perform_all_vport_cvl(phba); + link_state = phba->link_state; + lpfc_linkdown(phba); + phba->link_state = link_state; + /* Unregister FCF if no devices connected to it */ + lpfc_unregister_unused_fcf(phba); break; case LPFC_FCOE_EVENT_TYPE_CVL: - lpfc_printf_log(phba, KERN_ERR, LOG_FIP | LOG_DISCOVERY, + lpfc_printf_log(phba, KERN_ERR, LOG_DISCOVERY, "2718 Clear Virtual Link Received for VPI 0x%x" " tag 0x%x\n", acqe_fcoe->index, acqe_fcoe->event_tag); vport = lpfc_find_vport_by_vpid(phba, acqe_fcoe->index - phba->vpi_base); - ndlp = lpfc_sli4_perform_vport_cvl(vport); + if (!vport) + break; + ndlp = lpfc_findnode_did(vport, Fabric_DID); if (!ndlp) break; + shost = lpfc_shost_from_vport(vport); + if (phba->pport->port_state <= LPFC_FLOGI) + break; + /* If virtual link is not yet instantiated ignore CVL */ + if (vport->port_state <= LPFC_FDISC) + break; + + lpfc_linkdown_port(vport); + lpfc_cleanup_pending_mbox(vport); + spin_lock_irq(shost->host_lock); + vport->fc_flag |= FC_VPORT_CVL_RCVD; + spin_unlock_irq(shost->host_lock); active_vlink_present = 0; vports = lpfc_create_vport_work_array(phba); @@ -3445,7 +3311,6 @@ lpfc_sli4_async_fcoe_evt(struct lpfc_hba *phba, * re-instantiate the Vlink using FDISC. */ mod_timer(&ndlp->nlp_delayfunc, jiffies + HZ); - shost = lpfc_shost_from_vport(vport); spin_lock_irq(shost->host_lock); ndlp->nlp_flag |= NLP_DELAY_TMO; spin_unlock_irq(shost->host_lock); @@ -3456,38 +3321,15 @@ lpfc_sli4_async_fcoe_evt(struct lpfc_hba *phba, * Otherwise, we request port to rediscover * the entire FCF table for a fast recovery * from possible case that the current FCF - * is no longer valid if we are not already - * in the FCF failover process. + * is no longer valid. */ - spin_lock_irq(&phba->hbalock); - if (phba->fcf.fcf_flag & FCF_DISCOVERY) { - spin_unlock_irq(&phba->hbalock); - break; - } - /* Mark the fast failover process in progress */ - phba->fcf.fcf_flag |= FCF_ACVL_DISC; - spin_unlock_irq(&phba->hbalock); - lpfc_printf_log(phba, KERN_INFO, LOG_FIP | - LOG_DISCOVERY, - "2773 Start FCF fast failover due " - "to CVL event: evt_tag:x%x\n", - acqe_fcoe->event_tag); rc = lpfc_sli4_redisc_fcf_table(phba); - if (rc) { - lpfc_printf_log(phba, KERN_ERR, LOG_FIP | - LOG_DISCOVERY, - "2774 Issue FCF rediscover " - "mabilbox command failed, " - "through to CVL event\n"); - spin_lock_irq(&phba->hbalock); - phba->fcf.fcf_flag &= ~FCF_ACVL_DISC; - spin_unlock_irq(&phba->hbalock); + if (rc) /* * Last resort will be re-try on the * the current registered FCF entry. */ lpfc_retry_pport_discovery(phba); - } } break; default: @@ -3584,14 +3426,11 @@ void lpfc_sli4_fcf_redisc_event_proc(struct lpfc_hba *phba) spin_unlock_irq(&phba->hbalock); /* Scan FCF table from the first entry to re-discover SAN */ - lpfc_printf_log(phba, KERN_INFO, LOG_FIP | LOG_DISCOVERY, - "2777 Start FCF table scan after FCF " - "rediscovery quiescent period over\n"); - rc = lpfc_sli4_fcf_scan_read_fcf_rec(phba, LPFC_FCOE_FCF_GET_FIRST); + rc = lpfc_sli4_read_fcf_record(phba, LPFC_FCOE_FCF_GET_FIRST); if (rc) - lpfc_printf_log(phba, KERN_ERR, LOG_FIP | LOG_DISCOVERY, - "2747 Issue FCF scan read FCF mailbox " - "command failed 0x%x\n", rc); + lpfc_printf_log(phba, KERN_ERR, LOG_DISCOVERY, + "2747 Post FCF rediscovery read FCF record " + "failed 0x%x\n", rc); } /** @@ -3883,7 +3722,6 @@ lpfc_sli4_driver_resource_setup(struct lpfc_hba *phba) int rc, i, hbq_count, buf_size, dma_buf_size, max_buf_size; uint8_t pn_page[LPFC_MAX_SUPPORTED_PAGES] = {0}; struct lpfc_mqe *mqe; - int longs; /* Before proceed, wait for POST done and device ready */ rc = lpfc_sli4_post_status_check(phba); @@ -4060,24 +3898,13 @@ lpfc_sli4_driver_resource_setup(struct lpfc_hba *phba) goto out_free_active_sgl; } - /* Allocate eligible FCF bmask memory for FCF round robin failover */ - longs = (LPFC_SLI4_FCF_TBL_INDX_MAX + BITS_PER_LONG - 1)/BITS_PER_LONG; - phba->fcf.fcf_rr_bmask = kzalloc(longs * sizeof(unsigned long), - GFP_KERNEL); - if (!phba->fcf.fcf_rr_bmask) { - lpfc_printf_log(phba, KERN_ERR, LOG_INIT, - "2759 Failed allocate memory for FCF round " - "robin failover bmask\n"); - goto out_remove_rpi_hdrs; - } - phba->sli4_hba.fcp_eq_hdl = kzalloc((sizeof(struct lpfc_fcp_eq_hdl) * phba->cfg_fcp_eq_count), GFP_KERNEL); if (!phba->sli4_hba.fcp_eq_hdl) { lpfc_printf_log(phba, KERN_ERR, LOG_INIT, "2572 Failed allocate memory for fast-path " "per-EQ handle array\n"); - goto out_free_fcf_rr_bmask; + goto out_remove_rpi_hdrs; } phba->sli4_hba.msix_entries = kzalloc((sizeof(struct msix_entry) * @@ -4130,8 +3957,6 @@ lpfc_sli4_driver_resource_setup(struct lpfc_hba *phba) out_free_fcp_eq_hdl: kfree(phba->sli4_hba.fcp_eq_hdl); -out_free_fcf_rr_bmask: - kfree(phba->fcf.fcf_rr_bmask); out_remove_rpi_hdrs: lpfc_sli4_remove_rpi_hdrs(phba); out_free_active_sgl: @@ -4177,9 +4002,6 @@ lpfc_sli4_driver_resource_unset(struct lpfc_hba *phba) lpfc_sli4_remove_rpi_hdrs(phba); lpfc_sli4_remove_rpis(phba); - /* Free eligible FCF index bmask */ - kfree(phba->fcf.fcf_rr_bmask); - /* Free the ELS sgl list */ lpfc_free_active_sgl(phba); lpfc_free_sgl_list(phba); @@ -4575,7 +4397,6 @@ lpfc_init_sgl_list(struct lpfc_hba *phba) /* The list order is used by later block SGL registraton */ spin_lock_irq(&phba->hbalock); - sglq_entry->state = SGL_FREED; list_add_tail(&sglq_entry->list, &phba->sli4_hba.lpfc_sgl_list); phba->sli4_hba.lpfc_els_sgl_array[i] = sglq_entry; phba->sli4_hba.total_sglq_bufs++; diff --git a/trunk/drivers/scsi/lpfc/lpfc_logmsg.h b/trunk/drivers/scsi/lpfc/lpfc_logmsg.h index bb59e9273126..954ba57970a3 100644 --- a/trunk/drivers/scsi/lpfc/lpfc_logmsg.h +++ b/trunk/drivers/scsi/lpfc/lpfc_logmsg.h @@ -35,7 +35,6 @@ #define LOG_VPORT 0x00004000 /* NPIV events */ #define LOF_SECURITY 0x00008000 /* Security events */ #define LOG_EVENT 0x00010000 /* CT,TEMP,DUMP, logging */ -#define LOG_FIP 0x00020000 /* FIP events */ #define LOG_ALL_MSG 0xffffffff /* LOG all messages */ #define lpfc_printf_vlog(vport, level, mask, fmt, arg...) \ diff --git a/trunk/drivers/scsi/lpfc/lpfc_mbox.c b/trunk/drivers/scsi/lpfc/lpfc_mbox.c index 1e61ae3bc4eb..6c4dce1a30ca 100644 --- a/trunk/drivers/scsi/lpfc/lpfc_mbox.c +++ b/trunk/drivers/scsi/lpfc/lpfc_mbox.c @@ -1748,7 +1748,7 @@ lpfc_sli4_mbox_opcode_get(struct lpfc_hba *phba, struct lpfcMboxq *mbox) } /** - * lpfc_sli4_mbx_read_fcf_rec - Allocate and construct read fcf mbox cmd + * lpfc_sli4_mbx_read_fcf_record - Allocate and construct read fcf mbox cmd * @phba: pointer to lpfc hba data structure. * @fcf_index: index to fcf table. * @@ -1759,9 +1759,9 @@ lpfc_sli4_mbox_opcode_get(struct lpfc_hba *phba, struct lpfcMboxq *mbox) * NULL. **/ int -lpfc_sli4_mbx_read_fcf_rec(struct lpfc_hba *phba, - struct lpfcMboxq *mboxq, - uint16_t fcf_index) +lpfc_sli4_mbx_read_fcf_record(struct lpfc_hba *phba, + struct lpfcMboxq *mboxq, + uint16_t fcf_index) { void *virt_addr; dma_addr_t phys_addr; diff --git a/trunk/drivers/scsi/lpfc/lpfc_scsi.c b/trunk/drivers/scsi/lpfc/lpfc_scsi.c index b16bb2c9978b..483fb74bc592 100644 --- a/trunk/drivers/scsi/lpfc/lpfc_scsi.c +++ b/trunk/drivers/scsi/lpfc/lpfc_scsi.c @@ -620,40 +620,23 @@ lpfc_sli4_fcp_xri_aborted(struct lpfc_hba *phba, uint16_t xri = bf_get(lpfc_wcqe_xa_xri, axri); struct lpfc_scsi_buf *psb, *next_psb; unsigned long iflag = 0; - struct lpfc_iocbq *iocbq; - int i; - spin_lock_irqsave(&phba->hbalock, iflag); - spin_lock(&phba->sli4_hba.abts_scsi_buf_list_lock); + spin_lock_irqsave(&phba->sli4_hba.abts_scsi_buf_list_lock, iflag); list_for_each_entry_safe(psb, next_psb, &phba->sli4_hba.lpfc_abts_scsi_buf_list, list) { if (psb->cur_iocbq.sli4_xritag == xri) { list_del(&psb->list); psb->exch_busy = 0; psb->status = IOSTAT_SUCCESS; - spin_unlock( - &phba->sli4_hba.abts_scsi_buf_list_lock); - spin_unlock_irqrestore(&phba->hbalock, iflag); + spin_unlock_irqrestore( + &phba->sli4_hba.abts_scsi_buf_list_lock, + iflag); lpfc_release_scsi_buf_s4(phba, psb); return; } } - spin_unlock(&phba->sli4_hba.abts_scsi_buf_list_lock); - for (i = 1; i <= phba->sli.last_iotag; i++) { - iocbq = phba->sli.iocbq_lookup[i]; - - if (!(iocbq->iocb_flag & LPFC_IO_FCP) || - (iocbq->iocb_flag & LPFC_IO_LIBDFC)) - continue; - if (iocbq->sli4_xritag != xri) - continue; - psb = container_of(iocbq, struct lpfc_scsi_buf, cur_iocbq); - psb->exch_busy = 0; - spin_unlock_irqrestore(&phba->hbalock, iflag); - return; - - } - spin_unlock_irqrestore(&phba->hbalock, iflag); + spin_unlock_irqrestore(&phba->sli4_hba.abts_scsi_buf_list_lock, + iflag); } /** @@ -1023,7 +1006,6 @@ lpfc_scsi_prep_dma_buf_s3(struct lpfc_hba *phba, struct lpfc_scsi_buf *lpfc_cmd) struct scatterlist *sgel = NULL; struct fcp_cmnd *fcp_cmnd = lpfc_cmd->fcp_cmnd; struct ulp_bde64 *bpl = lpfc_cmd->fcp_bpl; - struct lpfc_iocbq *iocbq = &lpfc_cmd->cur_iocbq; IOCB_t *iocb_cmd = &lpfc_cmd->cur_iocbq.iocb; struct ulp_bde64 *data_bde = iocb_cmd->unsli3.fcp_ext.dbde; dma_addr_t physaddr; @@ -1074,7 +1056,6 @@ lpfc_scsi_prep_dma_buf_s3(struct lpfc_hba *phba, struct lpfc_scsi_buf *lpfc_cmd) physaddr = sg_dma_address(sgel); if (phba->sli_rev == 3 && !(phba->sli3_options & LPFC_SLI3_BG_ENABLED) && - !(iocbq->iocb_flag & DSS_SECURITY_OP) && nseg <= LPFC_EXT_DATA_BDE_COUNT) { data_bde->tus.f.bdeFlags = BUFF_TYPE_BDE_64; data_bde->tus.f.bdeSize = sg_dma_len(sgel); @@ -1101,8 +1082,7 @@ lpfc_scsi_prep_dma_buf_s3(struct lpfc_hba *phba, struct lpfc_scsi_buf *lpfc_cmd) * explicitly reinitialized since all iocb memory resources are reused. */ if (phba->sli_rev == 3 && - !(phba->sli3_options & LPFC_SLI3_BG_ENABLED) && - !(iocbq->iocb_flag & DSS_SECURITY_OP)) { + !(phba->sli3_options & LPFC_SLI3_BG_ENABLED)) { if (num_bde > LPFC_EXT_DATA_BDE_COUNT) { /* * The extended IOCB format can only fit 3 BDE or a BPL. @@ -1127,7 +1107,6 @@ lpfc_scsi_prep_dma_buf_s3(struct lpfc_hba *phba, struct lpfc_scsi_buf *lpfc_cmd) } else { iocb_cmd->un.fcpi64.bdl.bdeSize = ((num_bde + 2) * sizeof(struct ulp_bde64)); - iocb_cmd->unsli3.fcp_ext.ebde_count = (num_bde + 1); } fcp_cmnd->fcpDl = cpu_to_be32(scsi_bufflen(scsi_cmnd)); @@ -2100,7 +2079,8 @@ lpfc_handle_fcp_err(struct lpfc_vport *vport, struct lpfc_scsi_buf *lpfc_cmd, if (resp_info & RSP_LEN_VALID) { rsplen = be32_to_cpu(fcprsp->rspRspLen); - if (rsplen != 0 && rsplen != 4 && rsplen != 8) { + if ((rsplen != 0 && rsplen != 4 && rsplen != 8) || + (fcprsp->rspInfo3 != RSP_NO_FAILURE)) { lpfc_printf_vlog(vport, KERN_ERR, LOG_FCP, "2719 Invalid response length: " "tgt x%x lun x%x cmnd x%x rsplen x%x\n", @@ -2110,17 +2090,6 @@ lpfc_handle_fcp_err(struct lpfc_vport *vport, struct lpfc_scsi_buf *lpfc_cmd, host_status = DID_ERROR; goto out; } - if (fcprsp->rspInfo3 != RSP_NO_FAILURE) { - lpfc_printf_vlog(vport, KERN_ERR, LOG_FCP, - "2757 Protocol failure detected during " - "processing of FCP I/O op: " - "tgt x%x lun x%x cmnd x%x rspInfo3 x%x\n", - cmnd->device->id, - cmnd->device->lun, cmnd->cmnd[0], - fcprsp->rspInfo3); - host_status = DID_ERROR; - goto out; - } } if ((resp_info & SNS_LEN_VALID) && fcprsp->rspSnsLen) { diff --git a/trunk/drivers/scsi/lpfc/lpfc_sli.c b/trunk/drivers/scsi/lpfc/lpfc_sli.c index fe6660ca6452..35e3b96d4e07 100644 --- a/trunk/drivers/scsi/lpfc/lpfc_sli.c +++ b/trunk/drivers/scsi/lpfc/lpfc_sli.c @@ -494,7 +494,7 @@ __lpfc_clear_active_sglq(struct lpfc_hba *phba, uint16_t xritag) * * Returns sglq ponter = success, NULL = Failure. **/ -struct lpfc_sglq * +static struct lpfc_sglq * __lpfc_get_active_sglq(struct lpfc_hba *phba, uint16_t xritag) { uint16_t adj_xri; @@ -526,7 +526,6 @@ __lpfc_sli_get_sglq(struct lpfc_hba *phba) return NULL; adj_xri = sglq->sli4_xritag - phba->sli4_hba.max_cfg_param.xri_base; phba->sli4_hba.lpfc_sglq_active_list[adj_xri] = sglq; - sglq->state = SGL_ALLOCATED; return sglq; } @@ -581,18 +580,15 @@ __lpfc_sli_release_iocbq_s4(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq) else sglq = __lpfc_clear_active_sglq(phba, iocbq->sli4_xritag); if (sglq) { - if ((iocbq->iocb_flag & LPFC_EXCHANGE_BUSY) && - (sglq->state != SGL_XRI_ABORTED)) { + if (iocbq->iocb_flag & LPFC_EXCHANGE_BUSY) { spin_lock_irqsave(&phba->sli4_hba.abts_sgl_list_lock, iflag); list_add(&sglq->list, &phba->sli4_hba.lpfc_abts_els_sgl_list); spin_unlock_irqrestore( &phba->sli4_hba.abts_sgl_list_lock, iflag); - } else { - sglq->state = SGL_FREED; + } else list_add(&sglq->list, &phba->sli4_hba.lpfc_sgl_list); - } } @@ -2262,56 +2258,41 @@ lpfc_sli_process_sol_iocb(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, spin_unlock_irqrestore(&phba->hbalock, iflag); } - if (phba->sli_rev == LPFC_SLI_REV4) { - if (saveq->iocb_flag & - LPFC_EXCHANGE_BUSY) { - /* Set cmdiocb flag for the - * exchange busy so sgl (xri) - * will not be released until - * the abort xri is received - * from hba. - */ - spin_lock_irqsave( - &phba->hbalock, iflag); - cmdiocbp->iocb_flag |= - LPFC_EXCHANGE_BUSY; - spin_unlock_irqrestore( - &phba->hbalock, iflag); - } - if (cmdiocbp->iocb_flag & - LPFC_DRIVER_ABORTED) { - /* - * Clear LPFC_DRIVER_ABORTED - * bit in case it was driver - * initiated abort. - */ - spin_lock_irqsave( - &phba->hbalock, iflag); - cmdiocbp->iocb_flag &= - ~LPFC_DRIVER_ABORTED; - spin_unlock_irqrestore( - &phba->hbalock, iflag); - cmdiocbp->iocb.ulpStatus = - IOSTAT_LOCAL_REJECT; - cmdiocbp->iocb.un.ulpWord[4] = - IOERR_ABORT_REQUESTED; - /* - * For SLI4, irsiocb contains - * NO_XRI in sli_xritag, it - * shall not affect releasing - * sgl (xri) process. - */ - saveq->iocb.ulpStatus = - IOSTAT_LOCAL_REJECT; - saveq->iocb.un.ulpWord[4] = - IOERR_SLI_ABORTED; - spin_lock_irqsave( - &phba->hbalock, iflag); - saveq->iocb_flag |= - LPFC_DELAY_MEM_FREE; - spin_unlock_irqrestore( - &phba->hbalock, iflag); - } + if ((phba->sli_rev == LPFC_SLI_REV4) && + (saveq->iocb_flag & LPFC_EXCHANGE_BUSY)) { + /* Set cmdiocb flag for the exchange + * busy so sgl (xri) will not be + * released until the abort xri is + * received from hba, clear the + * LPFC_DRIVER_ABORTED bit in case + * it was driver initiated abort. + */ + spin_lock_irqsave(&phba->hbalock, + iflag); + cmdiocbp->iocb_flag &= + ~LPFC_DRIVER_ABORTED; + cmdiocbp->iocb_flag |= + LPFC_EXCHANGE_BUSY; + spin_unlock_irqrestore(&phba->hbalock, + iflag); + cmdiocbp->iocb.ulpStatus = + IOSTAT_LOCAL_REJECT; + cmdiocbp->iocb.un.ulpWord[4] = + IOERR_ABORT_REQUESTED; + /* + * For SLI4, irsiocb contains NO_XRI + * in sli_xritag, it shall not affect + * releasing sgl (xri) process. + */ + saveq->iocb.ulpStatus = + IOSTAT_LOCAL_REJECT; + saveq->iocb.un.ulpWord[4] = + IOERR_SLI_ABORTED; + spin_lock_irqsave(&phba->hbalock, + iflag); + saveq->iocb_flag |= LPFC_DELAY_MEM_FREE; + spin_unlock_irqrestore(&phba->hbalock, + iflag); } } (cmdiocbp->iocb_cmpl) (phba, cmdiocbp, saveq); @@ -2534,16 +2515,14 @@ lpfc_sli_handle_fast_ring_event(struct lpfc_hba *phba, cmdiocbq = lpfc_sli_iocbq_lookup(phba, pring, &rspiocbq); - if (unlikely(!cmdiocbq)) - break; - if (cmdiocbq->iocb_flag & LPFC_DRIVER_ABORTED) - cmdiocbq->iocb_flag &= ~LPFC_DRIVER_ABORTED; - if (cmdiocbq->iocb_cmpl) { - spin_unlock_irqrestore(&phba->hbalock, iflag); - (cmdiocbq->iocb_cmpl)(phba, cmdiocbq, - &rspiocbq); - spin_lock_irqsave(&phba->hbalock, iflag); - } + if ((cmdiocbq) && (cmdiocbq->iocb_cmpl)) { + spin_unlock_irqrestore(&phba->hbalock, + iflag); + (cmdiocbq->iocb_cmpl)(phba, cmdiocbq, + &rspiocbq); + spin_lock_irqsave(&phba->hbalock, + iflag); + } break; case LPFC_UNSOL_IOCB: spin_unlock_irqrestore(&phba->hbalock, iflag); @@ -3112,12 +3091,6 @@ lpfc_sli_brdready_s3(struct lpfc_hba *phba, uint32_t mask) /* Check to see if any errors occurred during init */ if ((status & HS_FFERM) || (i >= 20)) { - lpfc_printf_log(phba, KERN_ERR, LOG_INIT, - "2751 Adapter failed to restart, " - "status reg x%x, FW Data: A8 x%x AC x%x\n", - status, - readl(phba->MBslimaddr + 0xa8), - readl(phba->MBslimaddr + 0xac)); phba->link_state = LPFC_HBA_ERROR; retval = 1; } @@ -3305,9 +3278,6 @@ lpfc_sli_brdkill(struct lpfc_hba *phba) if (retval != MBX_SUCCESS) { if (retval != MBX_BUSY) mempool_free(pmb, phba->mbox_mem_pool); - lpfc_printf_log(phba, KERN_ERR, LOG_SLI, - "2752 KILL_BOARD command failed retval %d\n", - retval); spin_lock_irq(&phba->hbalock); phba->link_flag &= ~LS_IGNORE_ERATT; spin_unlock_irq(&phba->hbalock); @@ -4065,7 +4035,7 @@ lpfc_sli_hba_setup(struct lpfc_hba *phba) lpfc_sli_hba_setup_error: phba->link_state = LPFC_HBA_ERROR; - lpfc_printf_log(phba, KERN_ERR, LOG_INIT, + lpfc_printf_log(phba, KERN_INFO, LOG_INIT, "0445 Firmware initialization failed\n"); return rc; } @@ -4418,13 +4388,7 @@ lpfc_sli4_hba_setup(struct lpfc_hba *phba) spin_unlock_irq(&phba->hbalock); /* Read the port's service parameters. */ - rc = lpfc_read_sparam(phba, mboxq, vport->vpi); - if (rc) { - phba->link_state = LPFC_HBA_ERROR; - rc = -ENOMEM; - goto out_free_vpd; - } - + lpfc_read_sparam(phba, mboxq, vport->vpi); mboxq->vport = vport; rc = lpfc_sli_issue_mbox(phba, mboxq, MBX_POLL); mp = (struct lpfc_dmabuf *) mboxq->context1; @@ -4519,10 +4483,6 @@ lpfc_sli4_hba_setup(struct lpfc_hba *phba) /* Post receive buffers to the device */ lpfc_sli4_rb_setup(phba); - /* Reset HBA FCF states after HBA reset */ - phba->fcf.fcf_flag = 0; - phba->fcf.current_rec.flag = 0; - /* Start the ELS watchdog timer */ mod_timer(&vport->els_tmofunc, jiffies + HZ * (phba->fc_ratov * 2)); @@ -7476,7 +7436,6 @@ lpfc_sli_wake_iocb_wait(struct lpfc_hba *phba, { wait_queue_head_t *pdone_q; unsigned long iflags; - struct lpfc_scsi_buf *lpfc_cmd; spin_lock_irqsave(&phba->hbalock, iflags); cmdiocbq->iocb_flag |= LPFC_IO_WAKE; @@ -7484,14 +7443,6 @@ lpfc_sli_wake_iocb_wait(struct lpfc_hba *phba, memcpy(&((struct lpfc_iocbq *)cmdiocbq->context2)->iocb, &rspiocbq->iocb, sizeof(IOCB_t)); - /* Set the exchange busy flag for task management commands */ - if ((cmdiocbq->iocb_flag & LPFC_IO_FCP) && - !(cmdiocbq->iocb_flag & LPFC_IO_LIBDFC)) { - lpfc_cmd = container_of(cmdiocbq, struct lpfc_scsi_buf, - cur_iocbq); - lpfc_cmd->exch_busy = rspiocbq->iocb_flag & LPFC_EXCHANGE_BUSY; - } - pdone_q = cmdiocbq->context_un.wait_queue; if (pdone_q) wake_up(pdone_q); @@ -9110,12 +9061,6 @@ lpfc_sli4_fp_handle_fcp_wcqe(struct lpfc_hba *phba, /* Fake the irspiocb and copy necessary response information */ lpfc_sli4_iocb_param_transfer(phba, &irspiocbq, cmdiocbq, wcqe); - if (cmdiocbq->iocb_flag & LPFC_DRIVER_ABORTED) { - spin_lock_irqsave(&phba->hbalock, iflags); - cmdiocbq->iocb_flag &= ~LPFC_DRIVER_ABORTED; - spin_unlock_irqrestore(&phba->hbalock, iflags); - } - /* Pass the cmd_iocb and the rsp state to the upper layer */ (cmdiocbq->iocb_cmpl)(phba, cmdiocbq, &irspiocbq); } @@ -11996,19 +11941,15 @@ lpfc_sli4_build_dflt_fcf_record(struct lpfc_hba *phba, } /** - * lpfc_sli4_fcf_scan_read_fcf_rec - Read hba fcf record for fcf scan. + * lpfc_sli4_read_fcf_record - Read the driver's default FCF Record. * @phba: pointer to lpfc hba data structure. * @fcf_index: FCF table entry offset. * - * This routine is invoked to scan the entire FCF table by reading FCF - * record and processing it one at a time starting from the @fcf_index - * for initial FCF discovery or fast FCF failover rediscovery. - * - * Return 0 if the mailbox command is submitted sucessfully, none 0 - * otherwise. + * This routine is invoked to read up to @fcf_num of FCF record from the + * device starting with the given @fcf_index. **/ int -lpfc_sli4_fcf_scan_read_fcf_rec(struct lpfc_hba *phba, uint16_t fcf_index) +lpfc_sli4_read_fcf_record(struct lpfc_hba *phba, uint16_t fcf_index) { int rc = 0, error; LPFC_MBOXQ_t *mboxq; @@ -12020,17 +11961,17 @@ lpfc_sli4_fcf_scan_read_fcf_rec(struct lpfc_hba *phba, uint16_t fcf_index) "2000 Failed to allocate mbox for " "READ_FCF cmd\n"); error = -ENOMEM; - goto fail_fcf_scan; + goto fail_fcfscan; } /* Construct the read FCF record mailbox command */ - rc = lpfc_sli4_mbx_read_fcf_rec(phba, mboxq, fcf_index); + rc = lpfc_sli4_mbx_read_fcf_record(phba, mboxq, fcf_index); if (rc) { error = -EINVAL; - goto fail_fcf_scan; + goto fail_fcfscan; } /* Issue the mailbox command asynchronously */ mboxq->vport = phba->pport; - mboxq->mbox_cmpl = lpfc_mbx_cmpl_fcf_scan_read_fcf_rec; + mboxq->mbox_cmpl = lpfc_mbx_cmpl_read_fcf_record; rc = lpfc_sli_issue_mbox(phba, mboxq, MBX_NOWAIT); if (rc == MBX_NOT_FINISHED) error = -EIO; @@ -12038,13 +11979,9 @@ lpfc_sli4_fcf_scan_read_fcf_rec(struct lpfc_hba *phba, uint16_t fcf_index) spin_lock_irq(&phba->hbalock); phba->hba_flag |= FCF_DISC_INPROGRESS; spin_unlock_irq(&phba->hbalock); - /* Reset FCF round robin index bmask for new scan */ - if (fcf_index == LPFC_FCOE_FCF_GET_FIRST) - memset(phba->fcf.fcf_rr_bmask, 0, - sizeof(*phba->fcf.fcf_rr_bmask)); error = 0; } -fail_fcf_scan: +fail_fcfscan: if (error) { if (mboxq) lpfc_sli4_mbox_cmd_free(phba, mboxq); @@ -12056,181 +11993,6 @@ lpfc_sli4_fcf_scan_read_fcf_rec(struct lpfc_hba *phba, uint16_t fcf_index) return error; } -/** - * lpfc_sli4_fcf_rr_read_fcf_rec - Read hba fcf record for round robin fcf. - * @phba: pointer to lpfc hba data structure. - * @fcf_index: FCF table entry offset. - * - * This routine is invoked to read an FCF record indicated by @fcf_index - * and to use it for FLOGI round robin FCF failover. - * - * Return 0 if the mailbox command is submitted sucessfully, none 0 - * otherwise. - **/ -int -lpfc_sli4_fcf_rr_read_fcf_rec(struct lpfc_hba *phba, uint16_t fcf_index) -{ - int rc = 0, error; - LPFC_MBOXQ_t *mboxq; - - mboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); - if (!mboxq) { - lpfc_printf_log(phba, KERN_ERR, LOG_FIP | LOG_INIT, - "2763 Failed to allocate mbox for " - "READ_FCF cmd\n"); - error = -ENOMEM; - goto fail_fcf_read; - } - /* Construct the read FCF record mailbox command */ - rc = lpfc_sli4_mbx_read_fcf_rec(phba, mboxq, fcf_index); - if (rc) { - error = -EINVAL; - goto fail_fcf_read; - } - /* Issue the mailbox command asynchronously */ - mboxq->vport = phba->pport; - mboxq->mbox_cmpl = lpfc_mbx_cmpl_fcf_rr_read_fcf_rec; - rc = lpfc_sli_issue_mbox(phba, mboxq, MBX_NOWAIT); - if (rc == MBX_NOT_FINISHED) - error = -EIO; - else - error = 0; - -fail_fcf_read: - if (error && mboxq) - lpfc_sli4_mbox_cmd_free(phba, mboxq); - return error; -} - -/** - * lpfc_sli4_read_fcf_rec - Read hba fcf record for update eligible fcf bmask. - * @phba: pointer to lpfc hba data structure. - * @fcf_index: FCF table entry offset. - * - * This routine is invoked to read an FCF record indicated by @fcf_index to - * determine whether it's eligible for FLOGI round robin failover list. - * - * Return 0 if the mailbox command is submitted sucessfully, none 0 - * otherwise. - **/ -int -lpfc_sli4_read_fcf_rec(struct lpfc_hba *phba, uint16_t fcf_index) -{ - int rc = 0, error; - LPFC_MBOXQ_t *mboxq; - - mboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); - if (!mboxq) { - lpfc_printf_log(phba, KERN_ERR, LOG_FIP | LOG_INIT, - "2758 Failed to allocate mbox for " - "READ_FCF cmd\n"); - error = -ENOMEM; - goto fail_fcf_read; - } - /* Construct the read FCF record mailbox command */ - rc = lpfc_sli4_mbx_read_fcf_rec(phba, mboxq, fcf_index); - if (rc) { - error = -EINVAL; - goto fail_fcf_read; - } - /* Issue the mailbox command asynchronously */ - mboxq->vport = phba->pport; - mboxq->mbox_cmpl = lpfc_mbx_cmpl_read_fcf_rec; - rc = lpfc_sli_issue_mbox(phba, mboxq, MBX_NOWAIT); - if (rc == MBX_NOT_FINISHED) - error = -EIO; - else - error = 0; - -fail_fcf_read: - if (error && mboxq) - lpfc_sli4_mbox_cmd_free(phba, mboxq); - return error; -} - -/** - * lpfc_sli4_fcf_rr_next_index_get - Get next eligible fcf record index - * @phba: pointer to lpfc hba data structure. - * - * This routine is to get the next eligible FCF record index in a round - * robin fashion. If the next eligible FCF record index equals to the - * initial round robin FCF record index, LPFC_FCOE_FCF_NEXT_NONE (0xFFFF) - * shall be returned, otherwise, the next eligible FCF record's index - * shall be returned. - **/ -uint16_t -lpfc_sli4_fcf_rr_next_index_get(struct lpfc_hba *phba) -{ - uint16_t next_fcf_index; - - /* Search from the currently registered FCF index */ - next_fcf_index = find_next_bit(phba->fcf.fcf_rr_bmask, - LPFC_SLI4_FCF_TBL_INDX_MAX, - phba->fcf.current_rec.fcf_indx); - /* Wrap around condition on phba->fcf.fcf_rr_bmask */ - if (next_fcf_index >= LPFC_SLI4_FCF_TBL_INDX_MAX) - next_fcf_index = find_next_bit(phba->fcf.fcf_rr_bmask, - LPFC_SLI4_FCF_TBL_INDX_MAX, 0); - /* Round robin failover stop condition */ - if (next_fcf_index == phba->fcf.fcf_rr_init_indx) - return LPFC_FCOE_FCF_NEXT_NONE; - - return next_fcf_index; -} - -/** - * lpfc_sli4_fcf_rr_index_set - Set bmask with eligible fcf record index - * @phba: pointer to lpfc hba data structure. - * - * This routine sets the FCF record index in to the eligible bmask for - * round robin failover search. It checks to make sure that the index - * does not go beyond the range of the driver allocated bmask dimension - * before setting the bit. - * - * Returns 0 if the index bit successfully set, otherwise, it returns - * -EINVAL. - **/ -int -lpfc_sli4_fcf_rr_index_set(struct lpfc_hba *phba, uint16_t fcf_index) -{ - if (fcf_index >= LPFC_SLI4_FCF_TBL_INDX_MAX) { - lpfc_printf_log(phba, KERN_ERR, LOG_FIP, - "2610 HBA FCF index reached driver's " - "book keeping dimension: fcf_index:%d, " - "driver_bmask_max:%d\n", - fcf_index, LPFC_SLI4_FCF_TBL_INDX_MAX); - return -EINVAL; - } - /* Set the eligible FCF record index bmask */ - set_bit(fcf_index, phba->fcf.fcf_rr_bmask); - - return 0; -} - -/** - * lpfc_sli4_fcf_rr_index_set - Clear bmask from eligible fcf record index - * @phba: pointer to lpfc hba data structure. - * - * This routine clears the FCF record index from the eligible bmask for - * round robin failover search. It checks to make sure that the index - * does not go beyond the range of the driver allocated bmask dimension - * before clearing the bit. - **/ -void -lpfc_sli4_fcf_rr_index_clear(struct lpfc_hba *phba, uint16_t fcf_index) -{ - if (fcf_index >= LPFC_SLI4_FCF_TBL_INDX_MAX) { - lpfc_printf_log(phba, KERN_ERR, LOG_FIP, - "2762 HBA FCF index goes beyond driver's " - "book keeping dimension: fcf_index:%d, " - "driver_bmask_max:%d\n", - fcf_index, LPFC_SLI4_FCF_TBL_INDX_MAX); - return; - } - /* Clear the eligible FCF record index bmask */ - clear_bit(fcf_index, phba->fcf.fcf_rr_bmask); -} - /** * lpfc_mbx_cmpl_redisc_fcf_table - completion routine for rediscover FCF table * @phba: pointer to lpfc hba data structure. @@ -12252,40 +12014,21 @@ lpfc_mbx_cmpl_redisc_fcf_table(struct lpfc_hba *phba, LPFC_MBOXQ_t *mbox) shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &redisc_fcf->header.cfg_shdr.response); if (shdr_status || shdr_add_status) { - lpfc_printf_log(phba, KERN_ERR, LOG_FIP, + lpfc_printf_log(phba, KERN_ERR, LOG_SLI, "2746 Requesting for FCF rediscovery failed " "status x%x add_status x%x\n", shdr_status, shdr_add_status); - if (phba->fcf.fcf_flag & FCF_ACVL_DISC) { - spin_lock_irq(&phba->hbalock); - phba->fcf.fcf_flag &= ~FCF_ACVL_DISC; - spin_unlock_irq(&phba->hbalock); - /* - * CVL event triggered FCF rediscover request failed, - * last resort to re-try current registered FCF entry. - */ - lpfc_retry_pport_discovery(phba); - } else { - spin_lock_irq(&phba->hbalock); - phba->fcf.fcf_flag &= ~FCF_DEAD_DISC; - spin_unlock_irq(&phba->hbalock); - /* - * DEAD FCF event triggered FCF rediscover request - * failed, last resort to fail over as a link down - * to FCF registration. - */ - lpfc_sli4_fcf_dead_failthrough(phba); - } - } else { - lpfc_printf_log(phba, KERN_INFO, LOG_FIP, - "2775 Start FCF rediscovery quiescent period " - "wait timer before scaning FCF table\n"); + /* + * Request failed, last resort to re-try current + * registered FCF entry + */ + lpfc_retry_pport_discovery(phba); + } else /* * Start FCF rediscovery wait timer for pending FCF * before rescan FCF record table. */ lpfc_fcf_redisc_wait_start_timer(phba); - } mempool_free(mbox, phba->mbox_mem_pool); } @@ -12304,9 +12047,6 @@ lpfc_sli4_redisc_fcf_table(struct lpfc_hba *phba) struct lpfc_mbx_redisc_fcf_tbl *redisc_fcf; int rc, length; - /* Cancel retry delay timers to all vports before FCF rediscover */ - lpfc_cancel_all_vport_retry_delay_timer(phba); - mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); if (!mbox) { lpfc_printf_log(phba, KERN_ERR, LOG_SLI, @@ -12337,31 +12077,6 @@ lpfc_sli4_redisc_fcf_table(struct lpfc_hba *phba) return 0; } -/** - * lpfc_sli4_fcf_dead_failthrough - Failthrough routine to fcf dead event - * @phba: pointer to lpfc hba data structure. - * - * This function is the failover routine as a last resort to the FCF DEAD - * event when driver failed to perform fast FCF failover. - **/ -void -lpfc_sli4_fcf_dead_failthrough(struct lpfc_hba *phba) -{ - uint32_t link_state; - - /* - * Last resort as FCF DEAD event failover will treat this as - * a link down, but save the link state because we don't want - * it to be changed to Link Down unless it is already down. - */ - link_state = phba->link_state; - lpfc_linkdown(phba); - phba->link_state = link_state; - - /* Unregister FCF if no devices connected to it */ - lpfc_unregister_unused_fcf(phba); -} - /** * lpfc_sli_read_link_ste - Read region 23 to decide if link is disabled. * @phba: pointer to lpfc hba data structure. diff --git a/trunk/drivers/scsi/lpfc/lpfc_sli.h b/trunk/drivers/scsi/lpfc/lpfc_sli.h index b4a639c47616..dfcf5437d1f5 100644 --- a/trunk/drivers/scsi/lpfc/lpfc_sli.h +++ b/trunk/drivers/scsi/lpfc/lpfc_sli.h @@ -62,7 +62,6 @@ struct lpfc_iocbq { #define LPFC_DELAY_MEM_FREE 0x20 /* Defer free'ing of FC data */ #define LPFC_EXCHANGE_BUSY 0x40 /* SLI4 hba reported XB in response */ #define LPFC_USE_FCPWQIDX 0x80 /* Submit to specified FCPWQ index */ -#define DSS_SECURITY_OP 0x100 /* security IO */ #define LPFC_FIP_ELS_ID_MASK 0xc000 /* ELS_ID range 0-3, non-shifted mask */ #define LPFC_FIP_ELS_ID_SHIFT 14 diff --git a/trunk/drivers/scsi/lpfc/lpfc_sli4.h b/trunk/drivers/scsi/lpfc/lpfc_sli4.h index 4a35e7b9bc5b..86308836600f 100644 --- a/trunk/drivers/scsi/lpfc/lpfc_sli4.h +++ b/trunk/drivers/scsi/lpfc/lpfc_sli4.h @@ -153,27 +153,15 @@ struct lpfc_fcf { #define FCF_REGISTERED 0x02 /* FCF registered with FW */ #define FCF_SCAN_DONE 0x04 /* FCF table scan done */ #define FCF_IN_USE 0x08 /* Atleast one discovery completed */ -#define FCF_INIT_DISC 0x10 /* Initial FCF discovery */ -#define FCF_DEAD_DISC 0x20 /* FCF DEAD fast FCF failover discovery */ -#define FCF_ACVL_DISC 0x40 /* All CVL fast FCF failover discovery */ -#define FCF_DISCOVERY (FCF_INIT_DISC | FCF_DEAD_DISC | FCF_ACVL_DISC) -#define FCF_REDISC_PEND 0x80 /* FCF rediscovery pending */ -#define FCF_REDISC_EVT 0x100 /* FCF rediscovery event to worker thread */ -#define FCF_REDISC_FOV 0x200 /* Post FCF rediscovery fast failover */ +#define FCF_REDISC_PEND 0x10 /* FCF rediscovery pending */ +#define FCF_REDISC_EVT 0x20 /* FCF rediscovery event to worker thread */ +#define FCF_REDISC_FOV 0x40 /* Post FCF rediscovery fast failover */ uint32_t addr_mode; - uint16_t fcf_rr_init_indx; struct lpfc_fcf_rec current_rec; struct lpfc_fcf_rec failover_rec; struct timer_list redisc_wait; - unsigned long *fcf_rr_bmask; /* Eligible FCF indexes for RR failover */ }; -/* - * Maximum FCF table index, it is for driver internal book keeping, it - * just needs to be no less than the supported HBA's FCF table size. - */ -#define LPFC_SLI4_FCF_TBL_INDX_MAX 32 - #define LPFC_REGION23_SIGNATURE "RG23" #define LPFC_REGION23_VERSION 1 #define LPFC_REGION23_LAST_REC 0xff @@ -443,18 +431,11 @@ enum lpfc_sge_type { SCSI_BUFF_TYPE }; -enum lpfc_sgl_state { - SGL_FREED, - SGL_ALLOCATED, - SGL_XRI_ABORTED -}; - struct lpfc_sglq { /* lpfc_sglqs are used in double linked lists */ struct list_head list; struct list_head clist; enum lpfc_sge_type buff_type; /* is this a scsi sgl */ - enum lpfc_sgl_state state; uint16_t iotag; /* pre-assigned IO tag */ uint16_t sli4_xritag; /* pre-assigned XRI, (OXID) tag. */ struct sli4_sge *sgl; /* pre-assigned SGL */ @@ -482,8 +463,8 @@ void lpfc_sli4_mbox_cmd_free(struct lpfc_hba *, struct lpfcMboxq *); void lpfc_sli4_mbx_sge_set(struct lpfcMboxq *, uint32_t, dma_addr_t, uint32_t); void lpfc_sli4_mbx_sge_get(struct lpfcMboxq *, uint32_t, struct lpfc_mbx_sge *); -int lpfc_sli4_mbx_read_fcf_rec(struct lpfc_hba *, struct lpfcMboxq *, - uint16_t); +int lpfc_sli4_mbx_read_fcf_record(struct lpfc_hba *, struct lpfcMboxq *, + uint16_t); void lpfc_sli4_hba_reset(struct lpfc_hba *); struct lpfc_queue *lpfc_sli4_queue_alloc(struct lpfc_hba *, uint32_t, @@ -542,13 +523,8 @@ int lpfc_sli4_init_vpi(struct lpfc_hba *, uint16_t); uint32_t lpfc_sli4_cq_release(struct lpfc_queue *, bool); uint32_t lpfc_sli4_eq_release(struct lpfc_queue *, bool); void lpfc_sli4_fcfi_unreg(struct lpfc_hba *, uint16_t); -int lpfc_sli4_fcf_scan_read_fcf_rec(struct lpfc_hba *, uint16_t); -int lpfc_sli4_fcf_rr_read_fcf_rec(struct lpfc_hba *, uint16_t); -int lpfc_sli4_read_fcf_rec(struct lpfc_hba *, uint16_t); -void lpfc_mbx_cmpl_fcf_scan_read_fcf_rec(struct lpfc_hba *, LPFC_MBOXQ_t *); -void lpfc_mbx_cmpl_fcf_rr_read_fcf_rec(struct lpfc_hba *, LPFC_MBOXQ_t *); -void lpfc_mbx_cmpl_read_fcf_rec(struct lpfc_hba *, LPFC_MBOXQ_t *); -int lpfc_sli4_unregister_fcf(struct lpfc_hba *); +int lpfc_sli4_read_fcf_record(struct lpfc_hba *, uint16_t); +void lpfc_mbx_cmpl_read_fcf_record(struct lpfc_hba *, LPFC_MBOXQ_t *); int lpfc_sli4_post_status_check(struct lpfc_hba *); uint8_t lpfc_sli4_mbox_opcode_get(struct lpfc_hba *, struct lpfcMboxq *); diff --git a/trunk/drivers/scsi/lpfc/lpfc_version.h b/trunk/drivers/scsi/lpfc/lpfc_version.h index 013deec5dae8..ac276aa46fba 100644 --- a/trunk/drivers/scsi/lpfc/lpfc_version.h +++ b/trunk/drivers/scsi/lpfc/lpfc_version.h @@ -18,7 +18,7 @@ * included with this package. * *******************************************************************/ -#define LPFC_DRIVER_VERSION "8.3.10" +#define LPFC_DRIVER_VERSION "8.3.9" #define LPFC_DRIVER_NAME "lpfc" #define LPFC_SP_DRIVER_HANDLER_NAME "lpfc:sp" #define LPFC_FP_DRIVER_HANDLER_NAME "lpfc:fp" diff --git a/trunk/drivers/scsi/lpfc/lpfc_vport.c b/trunk/drivers/scsi/lpfc/lpfc_vport.c index 869f76cbc58a..dc86e873102a 100644 --- a/trunk/drivers/scsi/lpfc/lpfc_vport.c +++ b/trunk/drivers/scsi/lpfc/lpfc_vport.c @@ -123,12 +123,7 @@ lpfc_vport_sparm(struct lpfc_hba *phba, struct lpfc_vport *vport) } mb = &pmb->u.mb; - rc = lpfc_read_sparam(phba, pmb, vport->vpi); - if (rc) { - mempool_free(pmb, phba->mbox_mem_pool); - return -ENOMEM; - } - + lpfc_read_sparam(phba, pmb, vport->vpi); /* * Grab buffer pointer and clear context1 so we can use * lpfc_sli_issue_box_wait diff --git a/trunk/drivers/scsi/osd/osd_initiator.c b/trunk/drivers/scsi/osd/osd_initiator.c index 60de85091502..24223473f573 100644 --- a/trunk/drivers/scsi/osd/osd_initiator.c +++ b/trunk/drivers/scsi/osd/osd_initiator.c @@ -1433,10 +1433,6 @@ int osd_finalize_request(struct osd_request *or, cdbh->command_specific_options |= or->attributes_mode; if (or->attributes_mode == OSD_CDB_GET_ATTR_PAGE_SET_ONE) { ret = _osd_req_finalize_attr_page(or); - if (ret) { - OSD_DEBUG("_osd_req_finalize_attr_page failed\n"); - return ret; - } } else { /* TODO: I think that for the GET_ATTR command these 2 should * be reversed to keep them in execution order (for embeded diff --git a/trunk/drivers/scsi/pcmcia/nsp_cs.c b/trunk/drivers/scsi/pcmcia/nsp_cs.c index 021246454872..c2341af587a3 100644 --- a/trunk/drivers/scsi/pcmcia/nsp_cs.c +++ b/trunk/drivers/scsi/pcmcia/nsp_cs.c @@ -1717,7 +1717,6 @@ static int nsp_cs_config(struct pcmcia_device *link) cfg_mem->data = data; ret = pcmcia_loop_config(link, nsp_cs_config_check, cfg_mem); - if (ret) goto cs_failed; if (link->conf.Attributes & CONF_ENABLE_IRQ) { diff --git a/trunk/drivers/scsi/qlogicpti.c b/trunk/drivers/scsi/qlogicpti.c index 1b8217076b0e..fa34b92850a6 100644 --- a/trunk/drivers/scsi/qlogicpti.c +++ b/trunk/drivers/scsi/qlogicpti.c @@ -738,7 +738,7 @@ static int __devinit qpti_register_irq(struct qlogicpti *qpti) * sanely maintain. */ if (request_irq(qpti->irq, qpti_intr, - IRQF_SHARED, "QlogicPTI", qpti)) + IRQF_SHARED, "Qlogic/PTI", qpti)) goto fail; printk("qlogicpti%d: IRQ %d ", qpti->qpti_id, qpti->irq); diff --git a/trunk/drivers/scsi/raid_class.c b/trunk/drivers/scsi/raid_class.c index 2c146b44d95f..bd88349b8526 100644 --- a/trunk/drivers/scsi/raid_class.c +++ b/trunk/drivers/scsi/raid_class.c @@ -63,7 +63,6 @@ static int raid_match(struct attribute_container *cont, struct device *dev) * emulated RAID devices, so start with SCSI */ struct raid_internal *i = ac_to_raid_internal(cont); -#if defined(CONFIG_SCSI) || defined(CONFIG_SCSI_MODULE) if (scsi_is_sdev_device(dev)) { struct scsi_device *sdev = to_scsi_device(dev); @@ -72,7 +71,6 @@ static int raid_match(struct attribute_container *cont, struct device *dev) return i->f->is_raid(dev); } -#endif /* FIXME: look at other subsystems too */ return 0; } diff --git a/trunk/drivers/scsi/scsi_transport_fc.c b/trunk/drivers/scsi/scsi_transport_fc.c index 1d5b72173dd8..79660ee3e211 100644 --- a/trunk/drivers/scsi/scsi_transport_fc.c +++ b/trunk/drivers/scsi/scsi_transport_fc.c @@ -1232,15 +1232,6 @@ store_fc_vport_delete(struct device *dev, struct device_attribute *attr, { struct fc_vport *vport = transport_class_to_vport(dev); struct Scsi_Host *shost = vport_to_shost(vport); - unsigned long flags; - - spin_lock_irqsave(shost->host_lock, flags); - if (vport->flags & (FC_VPORT_DEL | FC_VPORT_CREATING)) { - spin_unlock_irqrestore(shost->host_lock, flags); - return -EBUSY; - } - vport->flags |= FC_VPORT_DELETING; - spin_unlock_irqrestore(shost->host_lock, flags); fc_queue_work(shost, &vport->vport_delete_work); return count; @@ -1830,9 +1821,6 @@ store_fc_host_vport_delete(struct device *dev, struct device_attribute *attr, list_for_each_entry(vport, &fc_host->vports, peers) { if ((vport->channel == 0) && (vport->port_name == wwpn) && (vport->node_name == wwnn)) { - if (vport->flags & (FC_VPORT_DEL | FC_VPORT_CREATING)) - break; - vport->flags |= FC_VPORT_DELETING; match = 1; break; } @@ -3382,6 +3370,18 @@ fc_vport_terminate(struct fc_vport *vport) unsigned long flags; int stat; + spin_lock_irqsave(shost->host_lock, flags); + if (vport->flags & FC_VPORT_CREATING) { + spin_unlock_irqrestore(shost->host_lock, flags); + return -EBUSY; + } + if (vport->flags & (FC_VPORT_DEL)) { + spin_unlock_irqrestore(shost->host_lock, flags); + return -EALREADY; + } + vport->flags |= FC_VPORT_DELETING; + spin_unlock_irqrestore(shost->host_lock, flags); + if (i->f->vport_delete) stat = i->f->vport_delete(vport); else diff --git a/trunk/drivers/scsi/sd.c b/trunk/drivers/scsi/sd.c index 7b75c8a2a49d..83881dfb33c0 100644 --- a/trunk/drivers/scsi/sd.c +++ b/trunk/drivers/scsi/sd.c @@ -1948,7 +1948,7 @@ static void sd_read_block_limits(struct scsi_disk *sdkp) { struct request_queue *q = sdkp->disk->queue; unsigned int sector_sz = sdkp->device->sector_size; - const int vpd_len = 64; + const int vpd_len = 32; unsigned char *buffer = kmalloc(vpd_len, GFP_KERNEL); if (!buffer || @@ -1998,7 +1998,7 @@ static void sd_read_block_characteristics(struct scsi_disk *sdkp) { unsigned char *buffer; u16 rot; - const int vpd_len = 64; + const int vpd_len = 32; buffer = kmalloc(vpd_len, GFP_KERNEL); diff --git a/trunk/drivers/serial/sunsab.c b/trunk/drivers/serial/sunsab.c index d2e0321049e2..d514e28d0755 100644 --- a/trunk/drivers/serial/sunsab.c +++ b/trunk/drivers/serial/sunsab.c @@ -474,7 +474,7 @@ static void sunsab_stop_rx(struct uart_port *port) { struct uart_sunsab_port *up = (struct uart_sunsab_port *) port; - up->interrupt_mask0 |= SAB82532_IMR0_TCD; + up->interrupt_mask0 |= SAB82532_ISR0_TCD; writeb(up->interrupt_mask1, &up->regs->w.imr0); } diff --git a/trunk/drivers/staging/samsung-laptop/samsung-laptop.c b/trunk/drivers/staging/samsung-laptop/samsung-laptop.c index eb44b60e1eb5..dd7ea4c075db 100644 --- a/trunk/drivers/staging/samsung-laptop/samsung-laptop.c +++ b/trunk/drivers/staging/samsung-laptop/samsung-laptop.c @@ -394,7 +394,6 @@ MODULE_DEVICE_TABLE(dmi, samsung_dmi_table); static int __init samsung_init(void) { - struct backlight_properties props; struct sabi_retval sretval; const char *testStr = "SECLINUX"; void __iomem *memcheck; @@ -487,14 +486,12 @@ static int __init samsung_init(void) goto error_no_platform; /* create a backlight device to talk to this one */ - memset(&props, 0, sizeof(struct backlight_properties)); - props.max_brightness = MAX_BRIGHT; backlight_device = backlight_device_register("samsung", &sdev->dev, - NULL, &backlight_ops, - &props); + NULL, &backlight_ops); if (IS_ERR(backlight_device)) goto error_no_backlight; + backlight_device->props.max_brightness = MAX_BRIGHT; backlight_device->props.brightness = read_brightness(); backlight_device->props.power = FB_BLANK_UNBLANK; backlight_update_status(backlight_device); diff --git a/trunk/drivers/usb/misc/appledisplay.c b/trunk/drivers/usb/misc/appledisplay.c index 3adab041355a..4d2952f1fb13 100644 --- a/trunk/drivers/usb/misc/appledisplay.c +++ b/trunk/drivers/usb/misc/appledisplay.c @@ -202,7 +202,6 @@ static void appledisplay_work(struct work_struct *work) static int appledisplay_probe(struct usb_interface *iface, const struct usb_device_id *id) { - struct backlight_properties props; struct appledisplay *pdata; struct usb_device *udev = interface_to_usbdev(iface); struct usb_host_interface *iface_desc; @@ -280,16 +279,16 @@ static int appledisplay_probe(struct usb_interface *iface, /* Register backlight device */ snprintf(bl_name, sizeof(bl_name), "appledisplay%d", atomic_inc_return(&count_displays) - 1); - memset(&props, 0, sizeof(struct backlight_properties)); - props.max_brightness = 0xff; pdata->bd = backlight_device_register(bl_name, NULL, pdata, - &appledisplay_bl_data, &props); + &appledisplay_bl_data); if (IS_ERR(pdata->bd)) { dev_err(&iface->dev, "Backlight registration failed\n"); retval = PTR_ERR(pdata->bd); goto error; } + pdata->bd->props.max_brightness = 0xff; + /* Try to get brightness */ brightness = appledisplay_bl_get_brightness(pdata->bd); diff --git a/trunk/drivers/video/Kconfig b/trunk/drivers/video/Kconfig index feaff4f04b58..1c60053439a9 100644 --- a/trunk/drivers/video/Kconfig +++ b/trunk/drivers/video/Kconfig @@ -912,18 +912,6 @@ config FB_XVR2500 mostly initialized the card already. It is treated as a completely dumb framebuffer device. -config FB_XVR1000 - bool "Sun XVR-1000 support" - depends on (FB = y) && SPARC64 - select FB_CFB_FILLRECT - select FB_CFB_COPYAREA - select FB_CFB_IMAGEBLIT - help - This is the framebuffer device for the Sun XVR-1000 and similar - graphics cards. The driver only works on sparc64 systems where - the system firmware has mostly initialized the card already. It - is treated as a completely dumb framebuffer device. - config FB_PVR2 tristate "NEC PowerVR 2 display support" depends on FB && SH_DREAMCAST diff --git a/trunk/drivers/video/Makefile b/trunk/drivers/video/Makefile index ddc2af2ba45b..a42ad55e3a15 100644 --- a/trunk/drivers/video/Makefile +++ b/trunk/drivers/video/Makefile @@ -79,7 +79,6 @@ obj-$(CONFIG_FB_N411) += n411.o obj-$(CONFIG_FB_HGA) += hgafb.o obj-$(CONFIG_FB_XVR500) += sunxvr500.o obj-$(CONFIG_FB_XVR2500) += sunxvr2500.o -obj-$(CONFIG_FB_XVR1000) += sunxvr1000.o obj-$(CONFIG_FB_IGA) += igafb.o obj-$(CONFIG_FB_APOLLO) += dnfb.o obj-$(CONFIG_FB_Q40) += q40fb.o diff --git a/trunk/drivers/video/atmel_lcdfb.c b/trunk/drivers/video/atmel_lcdfb.c index 11de3bfd4e54..3d886c6902f9 100644 --- a/trunk/drivers/video/atmel_lcdfb.c +++ b/trunk/drivers/video/atmel_lcdfb.c @@ -117,7 +117,6 @@ static struct backlight_ops atmel_lcdc_bl_ops = { static void init_backlight(struct atmel_lcdfb_info *sinfo) { - struct backlight_properties props; struct backlight_device *bl; sinfo->bl_power = FB_BLANK_UNBLANK; @@ -125,10 +124,8 @@ static void init_backlight(struct atmel_lcdfb_info *sinfo) if (sinfo->backlight) return; - memset(&props, 0, sizeof(struct backlight_properties)); - props.max_brightness = 0xff; - bl = backlight_device_register("backlight", &sinfo->pdev->dev, sinfo, - &atmel_lcdc_bl_ops, &props); + bl = backlight_device_register("backlight", &sinfo->pdev->dev, + sinfo, &atmel_lcdc_bl_ops); if (IS_ERR(bl)) { dev_err(&sinfo->pdev->dev, "error %ld on backlight register\n", PTR_ERR(bl)); @@ -138,6 +135,7 @@ static void init_backlight(struct atmel_lcdfb_info *sinfo) bl->props.power = FB_BLANK_UNBLANK; bl->props.fb_blank = FB_BLANK_UNBLANK; + bl->props.max_brightness = 0xff; bl->props.brightness = atmel_bl_get_brightness(bl); } diff --git a/trunk/drivers/video/aty/aty128fb.c b/trunk/drivers/video/aty/aty128fb.c index a489be0c4614..9ee67d6da710 100644 --- a/trunk/drivers/video/aty/aty128fb.c +++ b/trunk/drivers/video/aty/aty128fb.c @@ -1802,7 +1802,6 @@ static void aty128_bl_set_power(struct fb_info *info, int power) static void aty128_bl_init(struct aty128fb_par *par) { - struct backlight_properties props; struct fb_info *info = pci_get_drvdata(par->pdev); struct backlight_device *bd; char name[12]; @@ -1818,10 +1817,7 @@ static void aty128_bl_init(struct aty128fb_par *par) snprintf(name, sizeof(name), "aty128bl%d", info->node); - memset(&props, 0, sizeof(struct backlight_properties)); - props.max_brightness = FB_BACKLIGHT_LEVELS - 1; - bd = backlight_device_register(name, info->dev, par, &aty128_bl_data, - &props); + bd = backlight_device_register(name, info->dev, par, &aty128_bl_data); if (IS_ERR(bd)) { info->bl_dev = NULL; printk(KERN_WARNING "aty128: Backlight registration failed\n"); @@ -1833,6 +1829,7 @@ static void aty128_bl_init(struct aty128fb_par *par) 63 * FB_BACKLIGHT_MAX / MAX_LEVEL, 219 * FB_BACKLIGHT_MAX / MAX_LEVEL); + bd->props.max_brightness = FB_BACKLIGHT_LEVELS - 1; bd->props.brightness = bd->props.max_brightness; bd->props.power = FB_BLANK_UNBLANK; backlight_update_status(bd); diff --git a/trunk/drivers/video/aty/atyfb_base.c b/trunk/drivers/video/aty/atyfb_base.c index 29d72851f85b..e45ab8db2ddc 100644 --- a/trunk/drivers/video/aty/atyfb_base.c +++ b/trunk/drivers/video/aty/atyfb_base.c @@ -2232,7 +2232,6 @@ static struct backlight_ops aty_bl_data = { static void aty_bl_init(struct atyfb_par *par) { - struct backlight_properties props; struct fb_info *info = pci_get_drvdata(par->pdev); struct backlight_device *bd; char name[12]; @@ -2244,10 +2243,7 @@ static void aty_bl_init(struct atyfb_par *par) snprintf(name, sizeof(name), "atybl%d", info->node); - memset(&props, 0, sizeof(struct backlight_properties)); - props.max_brightness = FB_BACKLIGHT_LEVELS - 1; - bd = backlight_device_register(name, info->dev, par, &aty_bl_data, - &props); + bd = backlight_device_register(name, info->dev, par, &aty_bl_data); if (IS_ERR(bd)) { info->bl_dev = NULL; printk(KERN_WARNING "aty: Backlight registration failed\n"); @@ -2259,6 +2255,7 @@ static void aty_bl_init(struct atyfb_par *par) 0x3F * FB_BACKLIGHT_MAX / MAX_LEVEL, 0xFF * FB_BACKLIGHT_MAX / MAX_LEVEL); + bd->props.max_brightness = FB_BACKLIGHT_LEVELS - 1; bd->props.brightness = bd->props.max_brightness; bd->props.power = FB_BLANK_UNBLANK; backlight_update_status(bd); diff --git a/trunk/drivers/video/aty/radeon_backlight.c b/trunk/drivers/video/aty/radeon_backlight.c index 9fc8c66be3ce..fa1198c4ccc5 100644 --- a/trunk/drivers/video/aty/radeon_backlight.c +++ b/trunk/drivers/video/aty/radeon_backlight.c @@ -134,7 +134,6 @@ static struct backlight_ops radeon_bl_data = { void radeonfb_bl_init(struct radeonfb_info *rinfo) { - struct backlight_properties props; struct backlight_device *bd; struct radeon_bl_privdata *pdata; char name[12]; @@ -156,10 +155,7 @@ void radeonfb_bl_init(struct radeonfb_info *rinfo) snprintf(name, sizeof(name), "radeonbl%d", rinfo->info->node); - memset(&props, 0, sizeof(struct backlight_properties)); - props.max_brightness = FB_BACKLIGHT_LEVELS - 1; - bd = backlight_device_register(name, rinfo->info->dev, pdata, - &radeon_bl_data, &props); + bd = backlight_device_register(name, rinfo->info->dev, pdata, &radeon_bl_data); if (IS_ERR(bd)) { rinfo->info->bl_dev = NULL; printk("radeonfb: Backlight registration failed\n"); @@ -189,6 +185,7 @@ void radeonfb_bl_init(struct radeonfb_info *rinfo) 63 * FB_BACKLIGHT_MAX / MAX_RADEON_LEVEL, 217 * FB_BACKLIGHT_MAX / MAX_RADEON_LEVEL); + bd->props.max_brightness = FB_BACKLIGHT_LEVELS - 1; bd->props.brightness = bd->props.max_brightness; bd->props.power = FB_BLANK_UNBLANK; backlight_update_status(bd); diff --git a/trunk/drivers/video/backlight/88pm860x_bl.c b/trunk/drivers/video/backlight/88pm860x_bl.c index 93e25c77aeb2..b8f705cca438 100644 --- a/trunk/drivers/video/backlight/88pm860x_bl.c +++ b/trunk/drivers/video/backlight/88pm860x_bl.c @@ -187,7 +187,6 @@ static int pm860x_backlight_probe(struct platform_device *pdev) struct pm860x_backlight_data *data; struct backlight_device *bl; struct resource *res; - struct backlight_properties props; unsigned char value; char name[MFD_NAME_SIZE]; int ret; @@ -224,15 +223,14 @@ static int pm860x_backlight_probe(struct platform_device *pdev) return -EINVAL; } - memset(&props, 0, sizeof(struct backlight_properties)); - props.max_brightness = MAX_BRIGHTNESS; bl = backlight_device_register(name, &pdev->dev, data, - &pm860x_backlight_ops, &props); + &pm860x_backlight_ops); if (IS_ERR(bl)) { dev_err(&pdev->dev, "failed to register backlight\n"); kfree(data); return PTR_ERR(bl); } + bl->props.max_brightness = MAX_BRIGHTNESS; bl->props.brightness = MAX_BRIGHTNESS; platform_set_drvdata(pdev, bl); diff --git a/trunk/drivers/video/backlight/Kconfig b/trunk/drivers/video/backlight/Kconfig index c025c84601b0..0c77fc610212 100644 --- a/trunk/drivers/video/backlight/Kconfig +++ b/trunk/drivers/video/backlight/Kconfig @@ -31,13 +31,6 @@ config LCD_CORGI Say y here to support the LCD panels usually found on SHARP corgi (C7x0) and spitz (Cxx00) models. -config LCD_L4F00242T03 - tristate "Epson L4F00242T03 LCD" - depends on LCD_CLASS_DEVICE && SPI_MASTER && GENERIC_GPIO - help - SPI driver for Epson L4F00242T03. This provides basic support - for init and powering the LCD up/down through a sysfs interface. - config LCD_LMS283GF05 tristate "Samsung LMS283GF05 LCD" depends on LCD_CLASS_DEVICE && SPI_MASTER && GENERIC_GPIO diff --git a/trunk/drivers/video/backlight/Makefile b/trunk/drivers/video/backlight/Makefile index 09d1f14d6257..6c704d41462d 100644 --- a/trunk/drivers/video/backlight/Makefile +++ b/trunk/drivers/video/backlight/Makefile @@ -3,7 +3,6 @@ obj-$(CONFIG_LCD_CLASS_DEVICE) += lcd.o obj-$(CONFIG_LCD_CORGI) += corgi_lcd.o obj-$(CONFIG_LCD_HP700) += jornada720_lcd.o -obj-$(CONFIG_LCD_L4F00242T03) += l4f00242t03.o obj-$(CONFIG_LCD_LMS283GF05) += lms283gf05.o obj-$(CONFIG_LCD_LTV350QV) += ltv350qv.o obj-$(CONFIG_LCD_ILI9320) += ili9320.o diff --git a/trunk/drivers/video/backlight/adp5520_bl.c b/trunk/drivers/video/backlight/adp5520_bl.c index 5183f0e4d314..86d95c228adb 100644 --- a/trunk/drivers/video/backlight/adp5520_bl.c +++ b/trunk/drivers/video/backlight/adp5520_bl.c @@ -278,7 +278,6 @@ static const struct attribute_group adp5520_bl_attr_group = { static int __devinit adp5520_bl_probe(struct platform_device *pdev) { - struct backlight_properties props; struct backlight_device *bl; struct adp5520_bl *data; int ret = 0; @@ -301,17 +300,17 @@ static int __devinit adp5520_bl_probe(struct platform_device *pdev) mutex_init(&data->lock); - memset(&props, 0, sizeof(struct backlight_properties)); - props.max_brightness = ADP5020_MAX_BRIGHTNESS; - bl = backlight_device_register(pdev->name, data->master, data, - &adp5520_bl_ops, &props); + bl = backlight_device_register(pdev->name, data->master, + data, &adp5520_bl_ops); if (IS_ERR(bl)) { dev_err(&pdev->dev, "failed to register backlight\n"); kfree(data); return PTR_ERR(bl); } - bl->props.brightness = ADP5020_MAX_BRIGHTNESS; + bl->props.max_brightness = + bl->props.brightness = ADP5020_MAX_BRIGHTNESS; + if (data->pdata->en_ambl_sens) ret = sysfs_create_group(&bl->dev.kobj, &adp5520_bl_attr_group); diff --git a/trunk/drivers/video/backlight/adx_bl.c b/trunk/drivers/video/backlight/adx_bl.c index b0624b983889..d769b0bab21a 100644 --- a/trunk/drivers/video/backlight/adx_bl.c +++ b/trunk/drivers/video/backlight/adx_bl.c @@ -56,7 +56,7 @@ static int adx_backlight_get_brightness(struct backlight_device *bldev) return brightness & 0xff; } -static int adx_backlight_check_fb(struct backlight_device *bldev, struct fb_info *fb) +static int adx_backlight_check_fb(struct fb_info *fb) { return 1; } @@ -70,7 +70,6 @@ static const struct backlight_ops adx_backlight_ops = { static int __devinit adx_backlight_probe(struct platform_device *pdev) { - struct backlight_properties props; struct backlight_device *bldev; struct resource *res; struct adxbl *bl; @@ -102,15 +101,14 @@ static int __devinit adx_backlight_probe(struct platform_device *pdev) goto out; } - memset(&props, 0, sizeof(struct backlight_properties)); - props.max_brightness = 0xff; - bldev = backlight_device_register(dev_name(&pdev->dev), &pdev->dev, - bl, &adx_backlight_ops, &props); + bldev = backlight_device_register(dev_name(&pdev->dev), &pdev->dev, bl, + &adx_backlight_ops); if (!bldev) { ret = -ENOMEM; goto out; } + bldev->props.max_brightness = 0xff; bldev->props.brightness = 0xff; bldev->props.power = FB_BLANK_UNBLANK; diff --git a/trunk/drivers/video/backlight/atmel-pwm-bl.c b/trunk/drivers/video/backlight/atmel-pwm-bl.c index 2d9760551a4b..f625ffc69ad3 100644 --- a/trunk/drivers/video/backlight/atmel-pwm-bl.c +++ b/trunk/drivers/video/backlight/atmel-pwm-bl.c @@ -120,7 +120,6 @@ static const struct backlight_ops atmel_pwm_bl_ops = { static int atmel_pwm_bl_probe(struct platform_device *pdev) { - struct backlight_properties props; const struct atmel_pwm_bl_platform_data *pdata; struct backlight_device *bldev; struct atmel_pwm_bl *pwmbl; @@ -166,10 +165,8 @@ static int atmel_pwm_bl_probe(struct platform_device *pdev) goto err_free_gpio; } - memset(&props, 0, sizeof(struct backlight_properties)); - props.max_brightness = pdata->pwm_duty_max - pdata->pwm_duty_min; - bldev = backlight_device_register("atmel-pwm-bl", &pdev->dev, pwmbl, - &atmel_pwm_bl_ops, &props); + bldev = backlight_device_register("atmel-pwm-bl", + &pdev->dev, pwmbl, &atmel_pwm_bl_ops); if (IS_ERR(bldev)) { retval = PTR_ERR(bldev); goto err_free_gpio; @@ -181,6 +178,7 @@ static int atmel_pwm_bl_probe(struct platform_device *pdev) /* Power up the backlight by default at middle intesity. */ bldev->props.power = FB_BLANK_UNBLANK; + bldev->props.max_brightness = pdata->pwm_duty_max - pdata->pwm_duty_min; bldev->props.brightness = bldev->props.max_brightness / 2; retval = atmel_pwm_bl_init_pwm(pwmbl); diff --git a/trunk/drivers/video/backlight/backlight.c b/trunk/drivers/video/backlight/backlight.c index 68bb838b9f11..18829cf68b1b 100644 --- a/trunk/drivers/video/backlight/backlight.c +++ b/trunk/drivers/video/backlight/backlight.c @@ -38,7 +38,7 @@ static int fb_notifier_callback(struct notifier_block *self, mutex_lock(&bd->ops_lock); if (bd->ops) if (!bd->ops->check_fb || - bd->ops->check_fb(bd, evdata->info)) { + bd->ops->check_fb(evdata->info)) { bd->props.fb_blank = *(int *)evdata->data; if (bd->props.fb_blank == FB_BLANK_UNBLANK) bd->props.state &= ~BL_CORE_FBBLANK; @@ -269,8 +269,7 @@ EXPORT_SYMBOL(backlight_force_update); * ERR_PTR() or a pointer to the newly allocated device. */ struct backlight_device *backlight_device_register(const char *name, - struct device *parent, void *devdata, const struct backlight_ops *ops, - const struct backlight_properties *props) + struct device *parent, void *devdata, const struct backlight_ops *ops) { struct backlight_device *new_bd; int rc; @@ -290,11 +289,6 @@ struct backlight_device *backlight_device_register(const char *name, dev_set_name(&new_bd->dev, name); dev_set_drvdata(&new_bd->dev, devdata); - /* Set default properties */ - if (props) - memcpy(&new_bd->props, props, - sizeof(struct backlight_properties)); - rc = device_register(&new_bd->dev); if (rc) { kfree(new_bd); diff --git a/trunk/drivers/video/backlight/corgi_lcd.c b/trunk/drivers/video/backlight/corgi_lcd.c index 73bdd8454c94..b4bcf8043797 100644 --- a/trunk/drivers/video/backlight/corgi_lcd.c +++ b/trunk/drivers/video/backlight/corgi_lcd.c @@ -533,7 +533,6 @@ static int setup_gpio_backlight(struct corgi_lcd *lcd, static int __devinit corgi_lcd_probe(struct spi_device *spi) { - struct backlight_properties props; struct corgi_lcd_platform_data *pdata = spi->dev.platform_data; struct corgi_lcd *lcd; int ret = 0; @@ -560,14 +559,13 @@ static int __devinit corgi_lcd_probe(struct spi_device *spi) lcd->power = FB_BLANK_POWERDOWN; lcd->mode = (pdata) ? pdata->init_mode : CORGI_LCD_MODE_VGA; - memset(&props, 0, sizeof(struct backlight_properties)); - props.max_brightness = pdata->max_intensity; - lcd->bl_dev = backlight_device_register("corgi_bl", &spi->dev, lcd, - &corgi_bl_ops, &props); + lcd->bl_dev = backlight_device_register("corgi_bl", &spi->dev, + lcd, &corgi_bl_ops); if (IS_ERR(lcd->bl_dev)) { ret = PTR_ERR(lcd->bl_dev); goto err_unregister_lcd; } + lcd->bl_dev->props.max_brightness = pdata->max_intensity; lcd->bl_dev->props.brightness = pdata->default_intensity; lcd->bl_dev->props.power = FB_BLANK_UNBLANK; diff --git a/trunk/drivers/video/backlight/cr_bllcd.c b/trunk/drivers/video/backlight/cr_bllcd.c index 1cce6031bff2..da86db4374a0 100644 --- a/trunk/drivers/video/backlight/cr_bllcd.c +++ b/trunk/drivers/video/backlight/cr_bllcd.c @@ -170,7 +170,6 @@ static struct lcd_ops cr_lcd_ops = { static int cr_backlight_probe(struct platform_device *pdev) { - struct backlight_properties props; struct backlight_device *bdp; struct lcd_device *ldp; struct cr_panel *crp; @@ -191,9 +190,8 @@ static int cr_backlight_probe(struct platform_device *pdev) return -ENODEV; } - memset(&props, 0, sizeof(struct backlight_properties)); - bdp = backlight_device_register("cr-backlight", &pdev->dev, NULL, - &cr_backlight_ops, &props); + bdp = backlight_device_register("cr-backlight", + &pdev->dev, NULL, &cr_backlight_ops); if (IS_ERR(bdp)) { pci_dev_put(lpc_dev); return PTR_ERR(bdp); @@ -222,7 +220,9 @@ static int cr_backlight_probe(struct platform_device *pdev) crp->cr_lcd_device = ldp; crp->cr_backlight_device->props.power = FB_BLANK_UNBLANK; crp->cr_backlight_device->props.brightness = 0; + crp->cr_backlight_device->props.max_brightness = 0; cr_backlight_set_intensity(crp->cr_backlight_device); + cr_lcd_set_power(crp->cr_lcd_device, FB_BLANK_UNBLANK); platform_set_drvdata(pdev, crp); diff --git a/trunk/drivers/video/backlight/da903x_bl.c b/trunk/drivers/video/backlight/da903x_bl.c index 686e4a789238..74cdc640173d 100644 --- a/trunk/drivers/video/backlight/da903x_bl.c +++ b/trunk/drivers/video/backlight/da903x_bl.c @@ -105,7 +105,6 @@ static int da903x_backlight_probe(struct platform_device *pdev) struct da9034_backlight_pdata *pdata = pdev->dev.platform_data; struct da903x_backlight_data *data; struct backlight_device *bl; - struct backlight_properties props; int max_brightness; data = kzalloc(sizeof(*data), GFP_KERNEL); @@ -135,15 +134,15 @@ static int da903x_backlight_probe(struct platform_device *pdev) da903x_write(data->da903x_dev, DA9034_WLED_CONTROL2, DA9034_WLED_ISET(pdata->output_current)); - props.max_brightness = max_brightness; - bl = backlight_device_register(pdev->name, data->da903x_dev, data, - &da903x_backlight_ops, &props); + bl = backlight_device_register(pdev->name, data->da903x_dev, + data, &da903x_backlight_ops); if (IS_ERR(bl)) { dev_err(&pdev->dev, "failed to register backlight\n"); kfree(data); return PTR_ERR(bl); } + bl->props.max_brightness = max_brightness; bl->props.brightness = max_brightness; platform_set_drvdata(pdev, bl); diff --git a/trunk/drivers/video/backlight/generic_bl.c b/trunk/drivers/video/backlight/generic_bl.c index 312ca619735d..e6d348e63596 100644 --- a/trunk/drivers/video/backlight/generic_bl.c +++ b/trunk/drivers/video/backlight/generic_bl.c @@ -78,7 +78,6 @@ static const struct backlight_ops genericbl_ops = { static int genericbl_probe(struct platform_device *pdev) { - struct backlight_properties props; struct generic_bl_info *machinfo = pdev->dev.platform_data; const char *name = "generic-bl"; struct backlight_device *bd; @@ -90,15 +89,14 @@ static int genericbl_probe(struct platform_device *pdev) if (machinfo->name) name = machinfo->name; - memset(&props, 0, sizeof(struct backlight_properties)); - props.max_brightness = machinfo->max_intensity; - bd = backlight_device_register(name, &pdev->dev, NULL, &genericbl_ops, - &props); + bd = backlight_device_register (name, + &pdev->dev, NULL, &genericbl_ops); if (IS_ERR (bd)) return PTR_ERR (bd); platform_set_drvdata(pdev, bd); + bd->props.max_brightness = machinfo->max_intensity; bd->props.power = FB_BLANK_UNBLANK; bd->props.brightness = machinfo->default_intensity; backlight_update_status(bd); diff --git a/trunk/drivers/video/backlight/hp680_bl.c b/trunk/drivers/video/backlight/hp680_bl.c index 267d23f8d645..f7cc528d5be7 100644 --- a/trunk/drivers/video/backlight/hp680_bl.c +++ b/trunk/drivers/video/backlight/hp680_bl.c @@ -105,18 +105,16 @@ static const struct backlight_ops hp680bl_ops = { static int __devinit hp680bl_probe(struct platform_device *pdev) { - struct backlight_properties props; struct backlight_device *bd; - memset(&props, 0, sizeof(struct backlight_properties)); - props.max_brightness = HP680_MAX_INTENSITY; - bd = backlight_device_register("hp680-bl", &pdev->dev, NULL, - &hp680bl_ops, &props); + bd = backlight_device_register ("hp680-bl", &pdev->dev, NULL, + &hp680bl_ops); if (IS_ERR(bd)) return PTR_ERR(bd); platform_set_drvdata(pdev, bd); + bd->props.max_brightness = HP680_MAX_INTENSITY; bd->props.brightness = HP680_DEFAULT_INTENSITY; hp680bl_send_intensity(bd); diff --git a/trunk/drivers/video/backlight/jornada720_bl.c b/trunk/drivers/video/backlight/jornada720_bl.c index 2f177b3a4885..db9071fc5665 100644 --- a/trunk/drivers/video/backlight/jornada720_bl.c +++ b/trunk/drivers/video/backlight/jornada720_bl.c @@ -101,14 +101,10 @@ static const struct backlight_ops jornada_bl_ops = { static int jornada_bl_probe(struct platform_device *pdev) { - struct backlight_properties props; int ret; struct backlight_device *bd; - memset(&props, 0, sizeof(struct backlight_properties)); - props.max_brightness = BL_MAX_BRIGHT; - bd = backlight_device_register(S1D_DEVICENAME, &pdev->dev, NULL, - &jornada_bl_ops, &props); + bd = backlight_device_register(S1D_DEVICENAME, &pdev->dev, NULL, &jornada_bl_ops); if (IS_ERR(bd)) { ret = PTR_ERR(bd); @@ -121,6 +117,7 @@ static int jornada_bl_probe(struct platform_device *pdev) /* note. make sure max brightness is set otherwise you will get seemingly non-related errors when trying to change brightness */ + bd->props.max_brightness = BL_MAX_BRIGHT; jornada_bl_update_status(bd); platform_set_drvdata(pdev, bd); diff --git a/trunk/drivers/video/backlight/kb3886_bl.c b/trunk/drivers/video/backlight/kb3886_bl.c index f439a8632287..939e7b830cf3 100644 --- a/trunk/drivers/video/backlight/kb3886_bl.c +++ b/trunk/drivers/video/backlight/kb3886_bl.c @@ -141,24 +141,20 @@ static const struct backlight_ops kb3886bl_ops = { static int kb3886bl_probe(struct platform_device *pdev) { - struct backlight_properties props; struct kb3886bl_machinfo *machinfo = pdev->dev.platform_data; bl_machinfo = machinfo; if (!machinfo->limit_mask) machinfo->limit_mask = -1; - memset(&props, 0, sizeof(struct backlight_properties)); - props.max_brightness = machinfo->max_intensity; kb3886_backlight_device = backlight_device_register("kb3886-bl", - &pdev->dev, NULL, - &kb3886bl_ops, - &props); + &pdev->dev, NULL, &kb3886bl_ops); if (IS_ERR(kb3886_backlight_device)) return PTR_ERR(kb3886_backlight_device); platform_set_drvdata(pdev, kb3886_backlight_device); + kb3886_backlight_device->props.max_brightness = machinfo->max_intensity; kb3886_backlight_device->props.power = FB_BLANK_UNBLANK; kb3886_backlight_device->props.brightness = machinfo->default_intensity; backlight_update_status(kb3886_backlight_device); diff --git a/trunk/drivers/video/backlight/l4f00242t03.c b/trunk/drivers/video/backlight/l4f00242t03.c deleted file mode 100644 index 74abd6994b09..000000000000 --- a/trunk/drivers/video/backlight/l4f00242t03.c +++ /dev/null @@ -1,257 +0,0 @@ -/* - * l4f00242t03.c -- support for Epson L4F00242T03 LCD - * - * Copyright 2007-2009 Freescale Semiconductor, Inc. All Rights Reserved. - * - * Copyright (c) 2009 Alberto Panizzo - * Inspired by Marek Vasut work in l4f00242t03.c - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#include -#include -#include -#include -#include -#include - -#include -#include - -struct l4f00242t03_priv { - struct spi_device *spi; - struct lcd_device *ld; - int lcd_on:1; - struct regulator *io_reg; - struct regulator *core_reg; -}; - - -static void l4f00242t03_reset(unsigned int gpio) -{ - pr_debug("l4f00242t03_reset.\n"); - gpio_set_value(gpio, 1); - mdelay(100); - gpio_set_value(gpio, 0); - mdelay(10); /* tRES >= 100us */ - gpio_set_value(gpio, 1); - mdelay(20); -} - -#define param(x) ((x) | 0x100) - -static void l4f00242t03_lcd_init(struct spi_device *spi) -{ - struct l4f00242t03_pdata *pdata = spi->dev.platform_data; - struct l4f00242t03_priv *priv = dev_get_drvdata(&spi->dev); - const u16 cmd[] = { 0x36, param(0), 0x3A, param(0x60) }; - - dev_dbg(&spi->dev, "initializing LCD\n"); - - if (priv->io_reg) { - regulator_set_voltage(priv->io_reg, 1800000, 1800000); - regulator_enable(priv->io_reg); - } - - if (priv->core_reg) { - regulator_set_voltage(priv->core_reg, 2800000, 2800000); - regulator_enable(priv->core_reg); - } - - gpio_set_value(pdata->data_enable_gpio, 1); - msleep(60); - spi_write(spi, (const u8 *)cmd, ARRAY_SIZE(cmd) * sizeof(u16)); -} - -static int l4f00242t03_lcd_power_set(struct lcd_device *ld, int power) -{ - struct l4f00242t03_priv *priv = lcd_get_data(ld); - struct spi_device *spi = priv->spi; - - const u16 slpout = 0x11; - const u16 dison = 0x29; - - const u16 slpin = 0x10; - const u16 disoff = 0x28; - - if (power) { - if (priv->lcd_on) - return 0; - - dev_dbg(&spi->dev, "turning on LCD\n"); - - spi_write(spi, (const u8 *)&slpout, sizeof(u16)); - msleep(60); - spi_write(spi, (const u8 *)&dison, sizeof(u16)); - - priv->lcd_on = 1; - } else { - if (!priv->lcd_on) - return 0; - - dev_dbg(&spi->dev, "turning off LCD\n"); - - spi_write(spi, (const u8 *)&disoff, sizeof(u16)); - msleep(60); - spi_write(spi, (const u8 *)&slpin, sizeof(u16)); - - priv->lcd_on = 0; - } - - return 0; -} - -static struct lcd_ops l4f_ops = { - .set_power = l4f00242t03_lcd_power_set, - .get_power = NULL, -}; - -static int __devinit l4f00242t03_probe(struct spi_device *spi) -{ - struct l4f00242t03_priv *priv; - struct l4f00242t03_pdata *pdata = spi->dev.platform_data; - int ret; - - if (pdata == NULL) { - dev_err(&spi->dev, "Uninitialized platform data.\n"); - return -EINVAL; - } - - priv = kzalloc(sizeof(struct l4f00242t03_priv), GFP_KERNEL); - - if (priv == NULL) { - dev_err(&spi->dev, "No memory for this device.\n"); - ret = -ENOMEM; - goto err; - } - - dev_set_drvdata(&spi->dev, priv); - spi->bits_per_word = 9; - spi_setup(spi); - - priv->spi = spi; - - ret = gpio_request(pdata->reset_gpio, "lcd l4f00242t03 reset"); - if (ret) { - dev_err(&spi->dev, - "Unable to get the lcd l4f00242t03 reset gpio.\n"); - return ret; - } - - ret = gpio_direction_output(pdata->reset_gpio, 1); - if (ret) - goto err2; - - ret = gpio_request(pdata->data_enable_gpio, - "lcd l4f00242t03 data enable"); - if (ret) { - dev_err(&spi->dev, - "Unable to get the lcd l4f00242t03 data en gpio.\n"); - return ret; - } - - ret = gpio_direction_output(pdata->data_enable_gpio, 0); - if (ret) - goto err3; - - if (pdata->io_supply) { - priv->io_reg = regulator_get(NULL, pdata->io_supply); - - if (IS_ERR(priv->io_reg)) { - pr_err("%s: Unable to get the IO regulator\n", - __func__); - goto err3; - } - } - - if (pdata->core_supply) { - priv->core_reg = regulator_get(NULL, pdata->core_supply); - - if (IS_ERR(priv->core_reg)) { - pr_err("%s: Unable to get the core regulator\n", - __func__); - goto err4; - } - } - - priv->ld = lcd_device_register("l4f00242t03", - &spi->dev, priv, &l4f_ops); - if (IS_ERR(priv->ld)) { - ret = PTR_ERR(priv->ld); - goto err5; - } - - /* Init the LCD */ - l4f00242t03_reset(pdata->reset_gpio); - l4f00242t03_lcd_init(spi); - l4f00242t03_lcd_power_set(priv->ld, 1); - - dev_info(&spi->dev, "Epson l4f00242t03 lcd probed.\n"); - - return 0; - -err5: - if (priv->core_reg) - regulator_put(priv->core_reg); -err4: - if (priv->io_reg) - regulator_put(priv->io_reg); -err3: - gpio_free(pdata->data_enable_gpio); -err2: - gpio_free(pdata->reset_gpio); -err: - kfree(priv); - - return ret; -} - -static int __devexit l4f00242t03_remove(struct spi_device *spi) -{ - struct l4f00242t03_priv *priv = dev_get_drvdata(&spi->dev); - struct l4f00242t03_pdata *pdata = priv->spi->dev.platform_data; - - l4f00242t03_lcd_power_set(priv->ld, 0); - lcd_device_unregister(priv->ld); - - gpio_free(pdata->data_enable_gpio); - gpio_free(pdata->reset_gpio); - - if (priv->io_reg) - regulator_put(priv->core_reg); - if (priv->core_reg) - regulator_put(priv->io_reg); - - kfree(priv); - - return 0; -} - -static struct spi_driver l4f00242t03_driver = { - .driver = { - .name = "l4f00242t03", - .owner = THIS_MODULE, - }, - .probe = l4f00242t03_probe, - .remove = __devexit_p(l4f00242t03_remove), -}; - -static __init int l4f00242t03_init(void) -{ - return spi_register_driver(&l4f00242t03_driver); -} - -static __exit void l4f00242t03_exit(void) -{ - spi_unregister_driver(&l4f00242t03_driver); -} - -module_init(l4f00242t03_init); -module_exit(l4f00242t03_exit); - -MODULE_AUTHOR("Alberto Panizzo "); -MODULE_DESCRIPTION("EPSON L4F00242T03 LCD"); -MODULE_LICENSE("GPL v2"); diff --git a/trunk/drivers/video/backlight/locomolcd.c b/trunk/drivers/video/backlight/locomolcd.c index 7571bc26071e..00a9591b0003 100644 --- a/trunk/drivers/video/backlight/locomolcd.c +++ b/trunk/drivers/video/backlight/locomolcd.c @@ -167,7 +167,6 @@ static int locomolcd_resume(struct locomo_dev *dev) static int locomolcd_probe(struct locomo_dev *ldev) { - struct backlight_properties props; unsigned long flags; local_irq_save(flags); @@ -183,16 +182,13 @@ static int locomolcd_probe(struct locomo_dev *ldev) local_irq_restore(flags); - memset(&props, 0, sizeof(struct backlight_properties)); - props.max_brightness = 4; - locomolcd_bl_device = backlight_device_register("locomo-bl", - &ldev->dev, NULL, - &locomobl_data, &props); + locomolcd_bl_device = backlight_device_register("locomo-bl", &ldev->dev, NULL, &locomobl_data); if (IS_ERR (locomolcd_bl_device)) return PTR_ERR (locomolcd_bl_device); /* Set up frontlight so that screen is readable */ + locomolcd_bl_device->props.max_brightness = 4, locomolcd_bl_device->props.brightness = 2; locomolcd_set_intensity(locomolcd_bl_device); diff --git a/trunk/drivers/video/backlight/max8925_bl.c b/trunk/drivers/video/backlight/max8925_bl.c index c91adaf492cf..c267069a52a3 100644 --- a/trunk/drivers/video/backlight/max8925_bl.c +++ b/trunk/drivers/video/backlight/max8925_bl.c @@ -104,7 +104,6 @@ static int __devinit max8925_backlight_probe(struct platform_device *pdev) struct max8925_backlight_pdata *pdata = NULL; struct max8925_backlight_data *data; struct backlight_device *bl; - struct backlight_properties props; struct resource *res; char name[MAX8925_NAME_SIZE]; unsigned char value; @@ -134,15 +133,14 @@ static int __devinit max8925_backlight_probe(struct platform_device *pdev) data->chip = chip; data->current_brightness = 0; - memset(&props, 0, sizeof(struct backlight_properties)); - props.max_brightness = MAX_BRIGHTNESS; bl = backlight_device_register(name, &pdev->dev, data, - &max8925_backlight_ops, &props); + &max8925_backlight_ops); if (IS_ERR(bl)) { dev_err(&pdev->dev, "failed to register backlight\n"); kfree(data); return PTR_ERR(bl); } + bl->props.max_brightness = MAX_BRIGHTNESS; bl->props.brightness = MAX_BRIGHTNESS; platform_set_drvdata(pdev, bl); diff --git a/trunk/drivers/video/backlight/mbp_nvidia_bl.c b/trunk/drivers/video/backlight/mbp_nvidia_bl.c index 1b5d3fe6bbbc..2e78b0784bdc 100644 --- a/trunk/drivers/video/backlight/mbp_nvidia_bl.c +++ b/trunk/drivers/video/backlight/mbp_nvidia_bl.c @@ -137,51 +137,6 @@ static int mbp_dmi_match(const struct dmi_system_id *id) } static const struct dmi_system_id __initdata mbp_device_table[] = { - { - .callback = mbp_dmi_match, - .ident = "MacBook 1,1", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, "MacBook1,1"), - }, - .driver_data = (void *)&intel_chipset_data, - }, - { - .callback = mbp_dmi_match, - .ident = "MacBook 2,1", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, "MacBook2,1"), - }, - .driver_data = (void *)&intel_chipset_data, - }, - { - .callback = mbp_dmi_match, - .ident = "MacBook 3,1", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, "MacBook3,1"), - }, - .driver_data = (void *)&intel_chipset_data, - }, - { - .callback = mbp_dmi_match, - .ident = "MacBook 4,1", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, "MacBook4,1"), - }, - .driver_data = (void *)&intel_chipset_data, - }, - { - .callback = mbp_dmi_match, - .ident = "MacBook 4,2", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, "MacBook4,2"), - }, - .driver_data = (void *)&intel_chipset_data, - }, { .callback = mbp_dmi_match, .ident = "MacBookPro 3,1", @@ -295,7 +250,6 @@ static const struct dmi_system_id __initdata mbp_device_table[] = { static int __init mbp_init(void) { - struct backlight_properties props; if (!dmi_check_system(mbp_device_table)) return -ENODEV; @@ -303,17 +257,14 @@ static int __init mbp_init(void) "Macbook Pro backlight")) return -ENXIO; - memset(&props, 0, sizeof(struct backlight_properties)); - props.max_brightness = 15; - mbp_backlight_device = backlight_device_register("mbp_backlight", NULL, - NULL, - &driver_data->backlight_ops, - &props); + mbp_backlight_device = backlight_device_register("mbp_backlight", + NULL, NULL, &driver_data->backlight_ops); if (IS_ERR(mbp_backlight_device)) { release_region(driver_data->iostart, driver_data->iolen); return PTR_ERR(mbp_backlight_device); } + mbp_backlight_device->props.max_brightness = 15; mbp_backlight_device->props.brightness = driver_data->backlight_ops.get_brightness(mbp_backlight_device); backlight_update_status(mbp_backlight_device); diff --git a/trunk/drivers/video/backlight/omap1_bl.c b/trunk/drivers/video/backlight/omap1_bl.c index 333d28e6b062..a3a7f8938175 100644 --- a/trunk/drivers/video/backlight/omap1_bl.c +++ b/trunk/drivers/video/backlight/omap1_bl.c @@ -132,7 +132,6 @@ static const struct backlight_ops omapbl_ops = { static int omapbl_probe(struct platform_device *pdev) { - struct backlight_properties props; struct backlight_device *dev; struct omap_backlight *bl; struct omap_backlight_config *pdata = pdev->dev.platform_data; @@ -144,10 +143,7 @@ static int omapbl_probe(struct platform_device *pdev) if (unlikely(!bl)) return -ENOMEM; - memset(&props, 0, sizeof(struct backlight_properties)); - props.max_brightness = OMAPBL_MAX_INTENSITY; - dev = backlight_device_register("omap-bl", &pdev->dev, bl, &omapbl_ops, - &props); + dev = backlight_device_register("omap-bl", &pdev->dev, bl, &omapbl_ops); if (IS_ERR(dev)) { kfree(bl); return PTR_ERR(dev); @@ -164,6 +160,7 @@ static int omapbl_probe(struct platform_device *pdev) omap_cfg_reg(PWL); /* Conflicts with UART3 */ dev->props.fb_blank = FB_BLANK_UNBLANK; + dev->props.max_brightness = OMAPBL_MAX_INTENSITY; dev->props.brightness = pdata->default_intensity; omapbl_update_status(dev); diff --git a/trunk/drivers/video/backlight/progear_bl.c b/trunk/drivers/video/backlight/progear_bl.c index 809278c90738..075786e05034 100644 --- a/trunk/drivers/video/backlight/progear_bl.c +++ b/trunk/drivers/video/backlight/progear_bl.c @@ -61,10 +61,8 @@ static const struct backlight_ops progearbl_ops = { static int progearbl_probe(struct platform_device *pdev) { - struct backlight_properties props; u8 temp; struct backlight_device *progear_backlight_device; - int ret; pmu_dev = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M7101, NULL); if (!pmu_dev) { @@ -75,37 +73,28 @@ static int progearbl_probe(struct platform_device *pdev) sb_dev = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533, NULL); if (!sb_dev) { printk("ALI 1533 SB not found.\n"); - ret = -ENODEV; - goto put_pmu; + pci_dev_put(pmu_dev); + return -ENODEV; } /* Set SB_MPS1 to enable brightness control. */ pci_read_config_byte(sb_dev, SB_MPS1, &temp); pci_write_config_byte(sb_dev, SB_MPS1, temp | 0x20); - memset(&props, 0, sizeof(struct backlight_properties)); - props.max_brightness = HW_LEVEL_MAX - HW_LEVEL_MIN; progear_backlight_device = backlight_device_register("progear-bl", &pdev->dev, NULL, - &progearbl_ops, - &props); - if (IS_ERR(progear_backlight_device)) { - ret = PTR_ERR(progear_backlight_device); - goto put_sb; - } + &progearbl_ops); + if (IS_ERR(progear_backlight_device)) + return PTR_ERR(progear_backlight_device); platform_set_drvdata(pdev, progear_backlight_device); progear_backlight_device->props.power = FB_BLANK_UNBLANK; progear_backlight_device->props.brightness = HW_LEVEL_MAX - HW_LEVEL_MIN; + progear_backlight_device->props.max_brightness = HW_LEVEL_MAX - HW_LEVEL_MIN; progearbl_set_intensity(progear_backlight_device); return 0; -put_sb: - pci_dev_put(sb_dev); -put_pmu: - pci_dev_put(pmu_dev); - return ret; } static int progearbl_remove(struct platform_device *pdev) diff --git a/trunk/drivers/video/backlight/pwm_bl.c b/trunk/drivers/video/backlight/pwm_bl.c index b89eebc3f77d..9d2ec2a1cce8 100644 --- a/trunk/drivers/video/backlight/pwm_bl.c +++ b/trunk/drivers/video/backlight/pwm_bl.c @@ -65,7 +65,6 @@ static const struct backlight_ops pwm_backlight_ops = { static int pwm_backlight_probe(struct platform_device *pdev) { - struct backlight_properties props; struct platform_pwm_backlight_data *data = pdev->dev.platform_data; struct backlight_device *bl; struct pwm_bl_data *pb; @@ -101,16 +100,15 @@ static int pwm_backlight_probe(struct platform_device *pdev) } else dev_dbg(&pdev->dev, "got pwm for backlight\n"); - memset(&props, 0, sizeof(struct backlight_properties)); - props.max_brightness = data->max_brightness; - bl = backlight_device_register(dev_name(&pdev->dev), &pdev->dev, pb, - &pwm_backlight_ops, &props); + bl = backlight_device_register(dev_name(&pdev->dev), &pdev->dev, + pb, &pwm_backlight_ops); if (IS_ERR(bl)) { dev_err(&pdev->dev, "failed to register backlight\n"); ret = PTR_ERR(bl); goto err_bl; } + bl->props.max_brightness = data->max_brightness; bl->props.brightness = data->dft_brightness; backlight_update_status(bl); diff --git a/trunk/drivers/video/backlight/tosa_bl.c b/trunk/drivers/video/backlight/tosa_bl.c index f57bbf170049..e14ce4d469f5 100644 --- a/trunk/drivers/video/backlight/tosa_bl.c +++ b/trunk/drivers/video/backlight/tosa_bl.c @@ -80,7 +80,6 @@ static const struct backlight_ops bl_ops = { static int __devinit tosa_bl_probe(struct i2c_client *client, const struct i2c_device_id *id) { - struct backlight_properties props; struct tosa_bl_data *data = kzalloc(sizeof(struct tosa_bl_data), GFP_KERNEL); int ret = 0; if (!data) @@ -100,16 +99,15 @@ static int __devinit tosa_bl_probe(struct i2c_client *client, i2c_set_clientdata(client, data); data->i2c = client; - memset(&props, 0, sizeof(struct backlight_properties)); - props.max_brightness = 512 - 1; - data->bl = backlight_device_register("tosa-bl", &client->dev, data, - &bl_ops, &props); + data->bl = backlight_device_register("tosa-bl", &client->dev, + data, &bl_ops); if (IS_ERR(data->bl)) { ret = PTR_ERR(data->bl); goto err_reg; } data->bl->props.brightness = 69; + data->bl->props.max_brightness = 512 - 1; data->bl->props.power = FB_BLANK_UNBLANK; backlight_update_status(data->bl); diff --git a/trunk/drivers/video/backlight/wm831x_bl.c b/trunk/drivers/video/backlight/wm831x_bl.c index a4312709fb1b..e32add37a203 100644 --- a/trunk/drivers/video/backlight/wm831x_bl.c +++ b/trunk/drivers/video/backlight/wm831x_bl.c @@ -125,7 +125,6 @@ static int wm831x_backlight_probe(struct platform_device *pdev) struct wm831x_backlight_pdata *pdata; struct wm831x_backlight_data *data; struct backlight_device *bl; - struct backlight_properties props; int ret, i, max_isel, isink_reg, dcdc_cfg; /* We need platform data */ @@ -192,15 +191,15 @@ static int wm831x_backlight_probe(struct platform_device *pdev) data->current_brightness = 0; data->isink_reg = isink_reg; - props.max_brightness = max_isel; - bl = backlight_device_register("wm831x", &pdev->dev, data, - &wm831x_backlight_ops, &props); + bl = backlight_device_register("wm831x", &pdev->dev, + data, &wm831x_backlight_ops); if (IS_ERR(bl)) { dev_err(&pdev->dev, "failed to register backlight\n"); kfree(data); return PTR_ERR(bl); } + bl->props.max_brightness = max_isel; bl->props.brightness = max_isel; platform_set_drvdata(pdev, bl); diff --git a/trunk/drivers/video/bf54x-lq043fb.c b/trunk/drivers/video/bf54x-lq043fb.c index 23b2a8c0dbfc..814312a7452f 100644 --- a/trunk/drivers/video/bf54x-lq043fb.c +++ b/trunk/drivers/video/bf54x-lq043fb.c @@ -433,7 +433,7 @@ static int bl_get_brightness(struct backlight_device *bd) return 0; } -static const struct backlight_ops bfin_lq043fb_bl_ops = { +static struct backlight_ops bfin_lq043fb_bl_ops = { .get_brightness = bl_get_brightness, }; @@ -501,7 +501,6 @@ static irqreturn_t bfin_bf54x_irq_error(int irq, void *dev_id) static int __devinit bfin_bf54x_probe(struct platform_device *pdev) { - struct backlight_properties props; struct bfin_bf54xfb_info *info; struct fb_info *fbinfo; int ret; @@ -646,16 +645,10 @@ static int __devinit bfin_bf54x_probe(struct platform_device *pdev) goto out8; } #ifndef NO_BL_SUPPORT - memset(&props, 0, sizeof(struct backlight_properties)); - props.max_brightness = 255; - bl_dev = backlight_device_register("bf54x-bl", NULL, NULL, - &bfin_lq043fb_bl_ops, &props); - if (IS_ERR(bl_dev)) { - printk(KERN_ERR DRIVER_NAME - ": unable to register backlight.\n"); - ret = -EINVAL; - goto out9; - } + bl_dev = + backlight_device_register("bf54x-bl", NULL, NULL, + &bfin_lq043fb_bl_ops); + bl_dev->props.max_brightness = 255; lcd_dev = lcd_device_register(DRIVER_NAME, &pdev->dev, NULL, &bfin_lcd_ops); lcd_dev->props.max_contrast = 255, printk(KERN_INFO "Done.\n"); @@ -663,8 +656,6 @@ static int __devinit bfin_bf54x_probe(struct platform_device *pdev) return 0; -out9: - unregister_framebuffer(fbinfo); out8: free_irq(info->irq, info); out7: diff --git a/trunk/drivers/video/bfin-t350mcqb-fb.c b/trunk/drivers/video/bfin-t350mcqb-fb.c index 31a2dec927bb..5653d083a983 100644 --- a/trunk/drivers/video/bfin-t350mcqb-fb.c +++ b/trunk/drivers/video/bfin-t350mcqb-fb.c @@ -352,7 +352,7 @@ static int bl_get_brightness(struct backlight_device *bd) return 0; } -static const struct backlight_ops bfin_lq043fb_bl_ops = { +static struct backlight_ops bfin_lq043fb_bl_ops = { .get_brightness = bl_get_brightness, }; @@ -419,7 +419,6 @@ static irqreturn_t bfin_t350mcqb_irq_error(int irq, void *dev_id) static int __devinit bfin_t350mcqb_probe(struct platform_device *pdev) { - struct backlight_properties props; struct bfin_t350mcqbfb_info *info; struct fb_info *fbinfo; int ret; @@ -541,16 +540,10 @@ static int __devinit bfin_t350mcqb_probe(struct platform_device *pdev) goto out8; } #ifndef NO_BL_SUPPORT - memset(&props, 0, sizeof(struct backlight_properties)); - props.max_brightness = 255; - bl_dev = backlight_device_register("bf52x-bl", NULL, NULL, - &bfin_lq043fb_bl_ops, &props); - if (IS_ERR(bl_dev)) { - printk(KERN_ERR DRIVER_NAME - ": unable to register backlight.\n"); - ret = -EINVAL; - goto out9; - } + bl_dev = + backlight_device_register("bf52x-bl", NULL, NULL, + &bfin_lq043fb_bl_ops); + bl_dev->props.max_brightness = 255; lcd_dev = lcd_device_register(DRIVER_NAME, NULL, &bfin_lcd_ops); lcd_dev->props.max_contrast = 255, printk(KERN_INFO "Done.\n"); @@ -558,8 +551,6 @@ static int __devinit bfin_t350mcqb_probe(struct platform_device *pdev) return 0; -out9: - unregister_framebuffer(fbinfo); out8: free_irq(info->irq, info); out7: diff --git a/trunk/drivers/video/nvidia/nv_backlight.c b/trunk/drivers/video/nvidia/nv_backlight.c index 2fb552a6f32c..443e3c85a9a0 100644 --- a/trunk/drivers/video/nvidia/nv_backlight.c +++ b/trunk/drivers/video/nvidia/nv_backlight.c @@ -94,7 +94,6 @@ static struct backlight_ops nvidia_bl_ops = { void nvidia_bl_init(struct nvidia_par *par) { - struct backlight_properties props; struct fb_info *info = pci_get_drvdata(par->pci_dev); struct backlight_device *bd; char name[12]; @@ -110,10 +109,7 @@ void nvidia_bl_init(struct nvidia_par *par) snprintf(name, sizeof(name), "nvidiabl%d", info->node); - memset(&props, 0, sizeof(struct backlight_properties)); - props.max_brightness = FB_BACKLIGHT_LEVELS - 1; - bd = backlight_device_register(name, info->dev, par, &nvidia_bl_ops, - &props); + bd = backlight_device_register(name, info->dev, par, &nvidia_bl_ops); if (IS_ERR(bd)) { info->bl_dev = NULL; printk(KERN_WARNING "nvidia: Backlight registration failed\n"); @@ -125,6 +121,7 @@ void nvidia_bl_init(struct nvidia_par *par) 0x158 * FB_BACKLIGHT_MAX / MAX_LEVEL, 0x534 * FB_BACKLIGHT_MAX / MAX_LEVEL); + bd->props.max_brightness = FB_BACKLIGHT_LEVELS - 1; bd->props.brightness = bd->props.max_brightness; bd->props.power = FB_BLANK_UNBLANK; backlight_update_status(bd); diff --git a/trunk/drivers/video/omap2/displays/panel-taal.c b/trunk/drivers/video/omap2/displays/panel-taal.c index 59769e85d41c..fcd6a61a91eb 100644 --- a/trunk/drivers/video/omap2/displays/panel-taal.c +++ b/trunk/drivers/video/omap2/displays/panel-taal.c @@ -486,7 +486,6 @@ static struct attribute_group taal_attr_group = { static int taal_probe(struct omap_dss_device *dssdev) { - struct backlight_properties props; struct taal_data *td; struct backlight_device *bldev; int r; @@ -521,16 +520,11 @@ static int taal_probe(struct omap_dss_device *dssdev) /* if no platform set_backlight() defined, presume DSI backlight * control */ - memset(&props, 0, sizeof(struct backlight_properties)); if (!dssdev->set_backlight) td->use_dsi_bl = true; - if (td->use_dsi_bl) - props.max_brightness = 255; - else - props.max_brightness = 127; bldev = backlight_device_register("taal", &dssdev->dev, dssdev, - &taal_bl_ops, &props); + &taal_bl_ops); if (IS_ERR(bldev)) { r = PTR_ERR(bldev); goto err2; @@ -540,10 +534,13 @@ static int taal_probe(struct omap_dss_device *dssdev) bldev->props.fb_blank = FB_BLANK_UNBLANK; bldev->props.power = FB_BLANK_UNBLANK; - if (td->use_dsi_bl) + if (td->use_dsi_bl) { + bldev->props.max_brightness = 255; bldev->props.brightness = 255; - else + } else { + bldev->props.max_brightness = 127; bldev->props.brightness = 127; + } taal_bl_update_status(bldev); diff --git a/trunk/drivers/video/riva/fbdev.c b/trunk/drivers/video/riva/fbdev.c index 618f36bec10d..d94c57ffbdb1 100644 --- a/trunk/drivers/video/riva/fbdev.c +++ b/trunk/drivers/video/riva/fbdev.c @@ -338,7 +338,6 @@ static struct backlight_ops riva_bl_ops = { static void riva_bl_init(struct riva_par *par) { - struct backlight_properties props; struct fb_info *info = pci_get_drvdata(par->pdev); struct backlight_device *bd; char name[12]; @@ -354,10 +353,7 @@ static void riva_bl_init(struct riva_par *par) snprintf(name, sizeof(name), "rivabl%d", info->node); - memset(&props, 0, sizeof(struct backlight_properties)); - props.max_brightness = FB_BACKLIGHT_LEVELS - 1; - bd = backlight_device_register(name, info->dev, par, &riva_bl_ops, - &props); + bd = backlight_device_register(name, info->dev, par, &riva_bl_ops); if (IS_ERR(bd)) { info->bl_dev = NULL; printk(KERN_WARNING "riva: Backlight registration failed\n"); @@ -369,6 +365,7 @@ static void riva_bl_init(struct riva_par *par) MIN_LEVEL * FB_BACKLIGHT_MAX / MAX_LEVEL, FB_BACKLIGHT_MAX); + bd->props.max_brightness = FB_BACKLIGHT_LEVELS - 1; bd->props.brightness = bd->props.max_brightness; bd->props.power = FB_BLANK_UNBLANK; backlight_update_status(bd); diff --git a/trunk/drivers/video/sunxvr1000.c b/trunk/drivers/video/sunxvr1000.c deleted file mode 100644 index a8248c0b9192..000000000000 --- a/trunk/drivers/video/sunxvr1000.c +++ /dev/null @@ -1,228 +0,0 @@ -/* sunxvr1000.c: Sun XVR-1000 driver for sparc64 systems - * - * Copyright (C) 2010 David S. Miller (davem@davemloft.net) - */ - -#include -#include -#include -#include -#include -#include - -struct gfb_info { - struct fb_info *info; - - char __iomem *fb_base; - unsigned long fb_base_phys; - - struct device_node *of_node; - - unsigned int width; - unsigned int height; - unsigned int depth; - unsigned int fb_size; - - u32 pseudo_palette[16]; -}; - -static int __devinit gfb_get_props(struct gfb_info *gp) -{ - gp->width = of_getintprop_default(gp->of_node, "width", 0); - gp->height = of_getintprop_default(gp->of_node, "height", 0); - gp->depth = of_getintprop_default(gp->of_node, "depth", 32); - - if (!gp->width || !gp->height) { - printk(KERN_ERR "gfb: Critical properties missing for %s\n", - gp->of_node->full_name); - return -EINVAL; - } - - return 0; -} - -static int gfb_setcolreg(unsigned regno, - unsigned red, unsigned green, unsigned blue, - unsigned transp, struct fb_info *info) -{ - u32 value; - - if (regno < 16) { - red >>= 8; - green >>= 8; - blue >>= 8; - - value = (blue << 16) | (green << 8) | red; - ((u32 *)info->pseudo_palette)[regno] = value; - } - - return 0; -} - -static struct fb_ops gfb_ops = { - .owner = THIS_MODULE, - .fb_setcolreg = gfb_setcolreg, - .fb_fillrect = cfb_fillrect, - .fb_copyarea = cfb_copyarea, - .fb_imageblit = cfb_imageblit, -}; - -static int __devinit gfb_set_fbinfo(struct gfb_info *gp) -{ - struct fb_info *info = gp->info; - struct fb_var_screeninfo *var = &info->var; - - info->flags = FBINFO_DEFAULT; - info->fbops = &gfb_ops; - info->screen_base = gp->fb_base; - info->screen_size = gp->fb_size; - - info->pseudo_palette = gp->pseudo_palette; - - /* Fill fix common fields */ - strlcpy(info->fix.id, "gfb", sizeof(info->fix.id)); - info->fix.smem_start = gp->fb_base_phys; - info->fix.smem_len = gp->fb_size; - info->fix.type = FB_TYPE_PACKED_PIXELS; - if (gp->depth == 32 || gp->depth == 24) - info->fix.visual = FB_VISUAL_TRUECOLOR; - else - info->fix.visual = FB_VISUAL_PSEUDOCOLOR; - - var->xres = gp->width; - var->yres = gp->height; - var->xres_virtual = var->xres; - var->yres_virtual = var->yres; - var->bits_per_pixel = gp->depth; - - var->red.offset = 0; - var->red.length = 8; - var->green.offset = 8; - var->green.length = 8; - var->blue.offset = 16; - var->blue.length = 8; - var->transp.offset = 0; - var->transp.length = 0; - - if (fb_alloc_cmap(&info->cmap, 256, 0)) { - printk(KERN_ERR "gfb: Cannot allocate color map.\n"); - return -ENOMEM; - } - - return 0; -} - -static int __devinit gfb_probe(struct of_device *op, - const struct of_device_id *match) -{ - struct device_node *dp = op->node; - struct fb_info *info; - struct gfb_info *gp; - int err; - - info = framebuffer_alloc(sizeof(struct gfb_info), &op->dev); - if (!info) { - printk(KERN_ERR "gfb: Cannot allocate fb_info\n"); - err = -ENOMEM; - goto err_out; - } - - gp = info->par; - gp->info = info; - gp->of_node = dp; - - gp->fb_base_phys = op->resource[6].start; - - err = gfb_get_props(gp); - if (err) - goto err_release_fb; - - /* Framebuffer length is the same regardless of resolution. */ - info->fix.line_length = 16384; - gp->fb_size = info->fix.line_length * gp->height; - - gp->fb_base = of_ioremap(&op->resource[6], 0, - gp->fb_size, "gfb fb"); - if (!gp->fb_base) - goto err_release_fb; - - err = gfb_set_fbinfo(gp); - if (err) - goto err_unmap_fb; - - printk("gfb: Found device at %s\n", dp->full_name); - - err = register_framebuffer(info); - if (err < 0) { - printk(KERN_ERR "gfb: Could not register framebuffer %s\n", - dp->full_name); - goto err_unmap_fb; - } - - dev_set_drvdata(&op->dev, info); - - return 0; - -err_unmap_fb: - of_iounmap(&op->resource[6], gp->fb_base, gp->fb_size); - -err_release_fb: - framebuffer_release(info); - -err_out: - return err; -} - -static int __devexit gfb_remove(struct of_device *op) -{ - struct fb_info *info = dev_get_drvdata(&op->dev); - struct gfb_info *gp = info->par; - - unregister_framebuffer(info); - - iounmap(gp->fb_base); - - of_iounmap(&op->resource[6], gp->fb_base, gp->fb_size); - - framebuffer_release(info); - - dev_set_drvdata(&op->dev, NULL); - - return 0; -} - -static const struct of_device_id gfb_match[] = { - { - .name = "SUNW,gfb", - }, - {}, -}; -MODULE_DEVICE_TABLE(of, ffb_match); - -static struct of_platform_driver gfb_driver = { - .name = "gfb", - .match_table = gfb_match, - .probe = gfb_probe, - .remove = __devexit_p(gfb_remove), -}; - -static int __init gfb_init(void) -{ - if (fb_get_options("gfb", NULL)) - return -ENODEV; - - return of_register_driver(&gfb_driver, &of_bus_type); -} - -static void __exit gfb_exit(void) -{ - of_unregister_driver(&gfb_driver); -} - -module_init(gfb_init); -module_exit(gfb_exit); - -MODULE_DESCRIPTION("framebuffer driver for Sun XVR-1000 graphics"); -MODULE_AUTHOR("David S. Miller "); -MODULE_VERSION("1.0"); -MODULE_LICENSE("GPL"); diff --git a/trunk/firmware/bnx2x-e1-5.2.7.0.fw.ihex b/trunk/firmware/bnx2x-e1-5.2.7.0.fw.ihex new file mode 100644 index 000000000000..a99c41c993b9 --- /dev/null +++ b/trunk/firmware/bnx2x-e1-5.2.7.0.fw.ihex @@ -0,0 +1,10178 @@ +:10000000000028B0000000600000068800002918E9 +:100010000000161400002FA800000098000045C042 +:10002000000073C400004660000000CC0000BA2845 +:10003000000099A00000BAF800000094000154A04C +:10004000000057BC00015538000000B80001ACF8B2 +:100050000000CE2C0001ADB80000000400027BE8D7 +:10006000020400480000000F020400540000004594 +:1000700002040058000000840204005C0000000636 +:100080000204007000000004020400780000000078 +:100090000204007C121700000204008022170000F6 +:1000A00002040084321700000604008800000005E6 +:1000B0000204009C12150000020400A0221500009A +:1000C000020400A432150000060400A80000000489 +:1000D000020400B802100000020400BC001000007E +:1000E000020400C010100000020400C42010000030 +:1000F000020400C830100000060400CC0000000418 +:10010000020400DC00100000020400E012140000F1 +:10011000020400E422140000020400E8321400008B +:10012000060400EC000000040104012400000000AB +:1001300001040128000000000104012C000000005F +:10014000010401300000000002040004000000FF70 +:1001500002040008000000FF0204000C000000FF81 +:1001600002040010000000FF02040014000000FF61 +:1001700002040018000000FF0204001C000000FF41 +:1001800002040020000000FF020400240000003EE2 +:1001900002040028000000000204002C0000003FC0 +:1001A000020400300000003F020400340000003F61 +:1001B00002040038000000000204003C0000003F80 +:1001C000020400400000003F020400440000003F21 +:1001D00002042008000004110204200C00000400A6 +:1001E000020420100000040402042014000004197A +:1001F0000204201C0000FFFF020420200000FFFF7B +:10020000020420240000FFFF020420280000FFFF5A +:1002100006042038000000020204204000000034E0 +:100220000204204400000035060420480000007C41 +:100230000204223807FFFFFF0204223C0000003FB7 +:100240000204224007FFFFFF020422440000000FC7 +:1002500001042248000000000104224C00000000BC +:10026000010422500000000001042254000000009C +:1002700001042258000000000104225C000000007C +:10028000010422600000000001042264000000005C +:1002900001042268000000000104226C000000003C +:1002A000010422700000000001042274000000001C +:1002B00001042278000000000104227C00000000FC +:1002C000020424BC000000010C042000000003E82C +:1002D0000A042000000000010B0420000000000AB6 +:1002E0000205004400000020020500480000003222 +:1002F000020500900215002002050094021500205E +:1003000002050098000000300205009C0810000063 +:10031000020500A000000033020500A40000003028 +:10032000020500A800000031020500AC0000000238 +:10033000020500B000000005020500B40000000640 +:10034000020500B800000002020500BC0000000227 +:10035000020500C000000000020500C40000000506 +:10036000020500C800000002020500CC00000002E7 +:10037000020500D000000002020500D400000001C8 +:1003800002050114000000010205011C000000012B +:100390000205012000000002020502040000000125 +:1003A0000205020C0000004002050210000000409F +:1003B0000205021C000000200205022000000013BC +:1003C0000205022400000020060502400000000A89 +:1003D0000405028000200000020500500000000714 +:1003E0000205005400000007020500580000000844 +:1003F0000205005C00000008060500600000000423 +:10040000020500D800000006020500E00000000D13 +:10041000020500E40000002D020500E800000007CE +:10042000020500EC00000027020500F000000007B4 +:10043000020500F400000027020500F80000000794 +:10044000020500FC00000027020500040000000176 +:1004500002050008000000010205000C0000000178 +:100460000205001000000001020500140000000158 +:1004700002050018000000010205001C0000000138 +:100480000205002000000001020500240000000118 +:1004900002050028000000010205002C00000001F8 +:1004A00002050030000000010205003400000001D8 +:1004B00002050038000000010205003C00000001B8 +:1004C00002050040000000010406100002000020A8 +:1004D000020600DC00000001010600D80000000058 +:1004E0000406020000030220020600DC00000000F7 +:1004F00002060068000000B802060078000001143F +:10050000010600B800000000010600C8000000005D +:100510000206006C000000B80206007C0000011416 +:10052000010600BC00000000010600CC0000000035 +:100530000718040000960000081807600014022342 +:10054000071C000034C50000071C800034DB0D329E +:10055000071D00000A1D1A69081D14405D78022558 +:100560000118000000000000011800040000000055 +:1005700001180008000000000118000C0000000035 +:100580000118001000000000011800140000000015 +:1005900002180020000000010218002400000002E0 +:1005A00002180028000000030218002C00000000C0 +:1005B000021800300000000402180034000000019E +:1005C00002180038000000000218003C0000000182 +:1005D000021800400000000402180044000000005F +:1005E00002180048000000010218004C000000033F +:1005F0000218005000000000021800540000000122 +:1006000002180058000000040218005C00000000FE +:1006100002180060000000010218006400000003DE +:1006200002180068000000000218006C00000001C1 +:10063000021800700000000402180074000000009E +:1006400002180078000000040218007C000000037B +:100650000618008000000002021800A400003FFFFE +:10066000021800A8000003FF021802240000000086 +:1006700002180234000000000218024C00000000C2 +:10068000021802E4000000FF061810000000040039 +:10069000021B8BC000000001021B80000000003420 +:1006A000021B804000000018021B80800000000C2C +:1006B000021B80C0000000200C1B83000007A1204B +:1006C0000A1B8300000001380B1B83000000138805 +:1006D000021B83C0000001F4061A2000000000B2D3 +:1006E000061A23C800000181041A29CC0001022740 +:1006F000061A1020000000C8061A100000000002B0 +:10070000061A1E3800000002061A1E300000000201 +:10071000061A080000000002061A0808000000027D +:10072000061A081000000004041A1FB00005022871 +:10073000041A4CB00008022D061A22C8000000203E +:10074000061A400000000124021A4920000000009F +:10075000061A14000000000A061A145000000006D1 +:10076000061A150000000002041A150800050235DB +:10077000061A151C00000009061A15800000001456 +:10078000061A09C000000048061A0800000000020E +:10079000061A08200000000E041A1FB00002023AD8 +:1007A000061A2C2800000002061A23480000002028 +:1007B000061A449000000124021A49240000000097 +:1007C000061A14280000000A061A14680000000621 +:1007D000061A154000000002041A15480005023CE4 +:1007E000061A155C00000009061A15D00000001456 +:1007F000061A0AE000000048061A08080000000275 +:10080000061A08580000000E041A1FB80002024120 +:10081000061A2C30000000020200A2800000000135 +:100820000200A294071D29110200A29800000000F6 +:100830000200A29C009C04240200A2A00000000070 +:100840000200A2A4000002090200A4FCFF000000B4 +:10085000020100B400000001020100B80000000124 +:10086000020100DC000000010201010000000001A3 +:1008700002010104000000010201007C00300000C0 +:1008800002010084000000280201008C000000002A +:1008900002010130000000040201025C00000001BE +:1008A000020103280000000002010554000000308E +:1008B000020100C400000001020100CC00000001A0 +:1008C000020100F800000001020100F00000000138 +:1008D00002010080003000000201008800000028B2 +:1008E0000201009000000000020101340000000439 +:1008F000020102DC000000010201032C00000000E4 +:100900000201056400000030020100C8000000017F +:10091000020100D000000001020100FC0000000103 +:10092000020100F400000001020C10000000002091 +:10093000020C200800000A11020C200C00000A0022 +:10094000020C201000000A04020C201C0000FFFF13 +:10095000020C20200000FFFF020C20240000FFFFFB +:10096000020C20280000FFFF060C203800000002C7 +:10097000020C204000000034020C2044000000352E +:10098000020C204800000020020C204C0000002136 +:10099000020C205000000022020C20540000002312 +:1009A000020C205800000024020C205C00000025EE +:1009B000020C206000000026020C206400000027CA +:1009C000020C206800000028020C206C00000029A6 +:1009D000020C20700000002A020C20740000002B82 +:1009E000060C207800000056020C21D00000000107 +:1009F000020C21D400000001020C21D800000001EB +:100A0000020C21DC00000001020C21E000000001CA +:100A1000020C21E400000001020C21E800000001AA +:100A2000020C21EC00000001020C21F0000000018A +:100A3000020C21F400000001060C21F80000001057 +:100A4000020C223807FFFFFF020C223C0000003F8F +:100A5000020C224007FFFFFF020C22440000000F9F +:100A6000010C224800000000010C224C0000000094 +:100A7000010C225000000000010C22540000000074 +:100A8000010C225800000000010C225C0000000054 +:100A9000010C226000000000010C22640000000034 +:100AA000010C226800000000010C226C0000000014 +:100AB000010C227000000000010C227400000000F4 +:100AC000010C227800000000010C227C00000000D4 +:100AD000020C24BC000000010C0C2000000003E804 +:100AE0000A0C2000000000010B0C20000000000A8E +:100AF000020C400800000365020C400C0000035487 +:100B0000020C401000000358020C40140000037552 +:100B1000020C401C0000FFFF020C40200000FFFF01 +:100B2000020C40240000FFFF020C40280000FFFFE1 +:100B3000020C403800000046020C403C000000055A +:100B4000060C40400000005E020C41B800000001AD +:100B5000060C41BC0000001F020C423807FFFFFFDB +:100B6000020C423C0000003F020C424007FFFFFF26 +:100B7000020C42440000000F010C4248000000003B +:100B8000010C424C00000000010C4250000000002B +:100B9000010C425400000000010C4258000000000B +:100BA000010C425C00000000010C426000000000EB +:100BB000010C426400000000010C426800000000CB +:100BC000010C426C00000000010C427000000000AB +:100BD000010C427400000000010C4278000000008B +:100BE000010C427C00000000010C4280000000006B +:100BF000020C44C0000000010C0C4000000003E89F +:100C00000A0C4000000000010B0C40000000000A2C +:100C1000020D004400000032020D008C021500207D +:100C2000020D009002150020020D00940810000033 +:100C3000020D009800000033020D009C000000022D +:100C4000020D00A000000000020D00A4000000053D +:100C5000020D00A800000005060D00AC0000000217 +:100C6000020D00B400000002020D00B800000003F5 +:100C7000020D00BC00000002020D00C000000001D7 +:100C8000020D00C800000002020D00CC00000002AE +:100C9000020D010800000001020D015C00000001CE +:100CA000020D016400000001020D01680000000255 +:100CB000020D020400000001020D020C00000020E1 +:100CC000020D021000000040020D0214000000405E +:100CD000020D022000000003020D02240000001893 +:100CE000060D028000000012040D030000240243E0 +:100CF000020D004C00000001020D00500000000237 +:100D0000020D005400000008020D00580000000809 +:100D1000060D005C00000004020D00C40000000489 +:100D2000020D011400000009020D01180000002945 +:100D3000020D011C0000000A020D01200000002A23 +:100D4000020D012400000007020D01280000002709 +:100D5000020D012C00000007020D013000000027E9 +:100D6000020D01340000000C020D01380000002CBF +:100D7000020D013C0000000C020D01400000002C9F +:100D8000020D01440000000C020D01480000002C7F +:100D9000020D000400000001020D00080000000127 +:100DA000020D000C00000001020D00100000000107 +:100DB000020D001400000001020D001800000001E7 +:100DC000020D001C00000001020D002000000001C7 +:100DD000020D002400000001020D002800000001A7 +:100DE000020D002C00000001020D00300000000187 +:100DF000020D003400000001020D00380000000167 +:100E0000020D003C00000001020E004C0000003208 +:100E1000020E009402150020020E00980215002018 +:100E2000020E009C00000030020E00A0081000001E +:100E3000020E00A400000033020E00A800000030E3 +:100E4000020E00AC00000031020E00B000000002F3 +:100E5000020E00B400000004020E00B80000000002 +:100E6000020E00BC00000002020E00C000000002E2 +:100E7000020E00C400000000020E00C800000002C4 +:100E8000020E00CC00000007020E00D0000000029D +:100E9000020E00D400000002020E00D80000000183 +:100EA000020E00E400000001020E014400000001F7 +:100EB000020E014C00000001020E01500000000271 +:100EC000020E020400000001020E020C00000040AD +:100ED000020E021000000040020E021C000000047E +:100EE000020E022000000020020E02240000000E6C +:100EF000020E02280000001B060E03000000001274 +:100F0000040E0280001B0267020E00540000000C59 +:100F1000020E005800000009020E005C0000000FE5 +:100F2000020E006000000010060E006400000004C5 +:100F3000020E00DC00000003020E01100000000F92 +:100F4000020E01140000002F020E01180000000E16 +:100F5000020E011C0000002E020E00040000000121 +:100F6000020E000800000001020E000C000000014B +:100F7000020E001000000001020E0014000000012B +:100F8000020E001800000001020E001C000000010B +:100F9000020E002000000001020E002400000001EB +:100FA000020E002800000001020E002C00000001CB +:100FB000020E003000000001020E003400000001AB +:100FC000020E003800000001020E003C000000018B +:100FD000020E004000000001020E0044000000016B +:100FE0000730040000CA00000830076800130282BE +:100FF00007340000336100000734800037270CD924 +:10100000073500002F111AA30835708051F00284B3 +:10101000013000000000000001300004000000006A +:1010200001300008000000000130000C000000004A +:10103000013000100000000001300014000000002A +:1010400002300020000000010230002400000002F5 +:1010500002300028000000030230002C00000000D5 +:1010600002300030000000040230003400000001B3 +:1010700002300038000000000230003C0000000197 +:101080000230004000000004023000440000000074 +:1010900002300048000000010230004C0000000354 +:1010A0000230005000000000023000540000000137 +:1010B00002300058000000040230005C0000000014 +:1010C00002300060000000010230006400000003F4 +:1010D00002300068000000000230006C00000001D7 +:1010E00002300070000000040230007400000000B4 +:1010F00002300078000000040230007C0000000391 +:101100000630008000000002023000A400003FFF13 +:10111000023000A8000003FF02300224000000009B +:1011200002300234000000000230024C00000000D7 +:10113000023002E40000FFFF06302000000008003B +:1011400002338BC000000001023380000000001A4F +:10115000023380400000004E023380800000001007 +:10116000023380C0000000200C3383000007A12060 +:101170000A338300000001380B338300000013881A +:10118000023383C0000001F40C3383801DCD650061 +:101190000A3383800004C4B40B338380004C4B407B +:1011A00006321AA0000000C206321020000000C85B +:1011B0000632100000000002063214000000004059 +:1011C00006325098000000040632508000000005EE +:1011D00004325094000102860632500000000020C4 +:1011E00004322830000202870233080001000000A8 +:1011F00004330C00001002890233080000000000D4 +:1012000004330C400010029906321500000000B4AF +:1012100002321DC80000000006324000000000D865 +:10122000063217D0000000B402321DCC00000000CE +:1012300006324360000000D807200400009200003E +:1012400008200780001002A9072400002CD100000C +:10125000072480002AE50B350824DC6062DA02AB43 +:101260000120000000000000012000040000000038 +:1012700001200008000000000120000C0000000018 +:1012800001200010000000000120001400000000F8 +:1012900002200020000000010220002400000002C3 +:1012A00002200028000000030220002C00000000A3 +:1012B0000220003000000004022000340000000181 +:1012C00002200038000000000220003C0000000165 +:1012D0000220004000000004022000440000000042 +:1012E00002200048000000010220004C0000000322 +:1012F0000220005000000000022000540000000105 +:1013000002200058000000040220005C00000000E1 +:1013100002200060000000010220006400000003C1 +:1013200002200068000000000220006C00000001A4 +:101330000220007000000004022000740000000081 +:1013400002200078000000040220007C000000035E +:101350000620008000000002022000A400003FFFE1 +:10136000022000A8000003FF022002240000000069 +:1013700002200234000000000220024C00000000A5 +:10138000022002E40000FFFF062020000000080009 +:1013900002238BC000000001022380000000001027 +:1013A00002238040000000120223808000000030F1 +:1013B000022380C00000000E022383C0000001F45D +:1013C000062250000000004206221020000000C843 +:1013D000062210000000000206222000000000C0CB +:1013E000062225C00000024004222EC8000802ADDB +:1013F00002230800013FFFFF04230C00001002B588 +:10140000022308000000000004230C40001002C565 +:1014100006223040000000A00622354000000010E7 +:10142000062236C000000030062240000000020004 +:10143000062235C00000002006223840000000309F +:1014400006223000000000080222511800000000AF +:10145000062223000000000E0622241000000030A7 +:10146000062232C0000000A00622358000000010D5 +:1014700006223780000000300622480000000200EB +:10148000062236400000002006223900000000300D +:1014900006223020000000080222511C000000003B +:1014A000062223380000000E062224D0000000305F +:1014B00002161000000000280217000800000002B9 +:1014C0000217002C000000030217003C000000047B +:1014D0000217004400000008021700480000000244 +:1014E0000217004C0000009002170050000000900E +:1014F00002170054008000900217005808140000E2 +:10150000021700600000008A0217006400000080DB +:1015100002170068000000810217006C00000080C4 +:10152000021700700000000602170078000007D0C4 +:101530000217007C0000076C02170038007C1004C2 +:10154000021700040000000F0616402400000002ED +:10155000021640700000001C021642080000000144 +:101560000216421000000001021642200000000195 +:10157000021642280000000102164230000000015D +:10158000021642380000000102164260000000010D +:101590000C16401C0003D0900A16401C0000009C52 +:1015A0000B16401C000009C4021640300000000861 +:1015B000021640340000000C0216403800000010F3 +:1015C0000216404400000020021640000000000106 +:1015D000021640D800000001021640080000000179 +:1015E0000216400C0000000102164010000000012D +:1015F00002164240000000000216424800000000AF +:101600000616427000000002021642500000000060 +:101610000216425800000000061642800000000238 +:1016200002166008000006140216600C0000060096 +:1016300002166010000006040216601C0000FFFF86 +:10164000021660200000FFFF021660240000FFFF6A +:10165000021660280000FFFF02166038000000201C +:101660000216603C000000200216604000000034BA +:101670000216604400000035021660480000002396 +:101680000216604C00000024021660500000002585 +:101690000216605400000026021660580000002761 +:1016A0000216605C00000029021660600000002A3B +:1016B000021660640000002B021660680000002C17 +:1016C0000216606C0000002D0616607000000052CB +:1016D000021661B800000001061661BC0000001F80 +:1016E0000216623807FFFFFF0216623C0000003F4F +:1016F0000216624007FFFFFF021662440000000F5F +:1017000001166248000000000116624C0000000053 +:101710000116625000000000011662540000000033 +:1017200001166258000000000116625C0000000013 +:1017300001166260000000000116626400000000F3 +:1017400001166268000000000116626C00000000D3 +:1017500001166270000000000116627400000000B3 +:1017600001166278000000000116627C0000000093 +:10177000021664BC000000010C166000000003E8C3 +:101780000A166000000000010B1660000000000A4D +:10179000021680400000000602168044000000058A +:1017A000021680480000000A0216804C0000000566 +:1017B0000216805400000002021680CC00000004D3 +:1017C000021680D000000004021680D4000000043D +:1017D000021680D800000004021680DC000000041D +:1017E000021680E000000004021680E400000004FD +:1017F000021680E8000000040216880400000004BD +:10180000021680300000007C021680340000003D8B +:10181000021680380000003F0216803C0000009C49 +:10182000021680F000000007061680F40000000594 +:101830000216880C01010101021681080000000057 +:101840000216810C00000004021681100000000442 +:1018500002168114000000020216881008012004FC +:1018600002168118000000050216811C0000000508 +:1018700002168120000000050216812400000005E8 +:101880000216882C2008100102168128000000088A +:101890000216812C000000060216813000000007AD +:1018A0000216813400000000021688300101012078 +:1018B0000616813800000004021688340101010177 +:1018C0000616814800000004021688380101010153 +:1018D00006168158000000040216883C010101012F +:1018E00006168168000000030216817400000001E2 +:1018F00002168840010101010216817800000001F2 +:101900000216817C000000010216818000000001A7 +:1019100002168184000000010216884401010101C1 +:1019200002168188000000010216818C000000046C +:10193000021681900000000402168194000000024B +:10194000021688480801200402168198000000054C +:101950000216819C00000005021681A0000000050F +:10196000021681A400000005021688142008100148 +:10197000021681A800000008021681AC00000006D3 +:10198000021681B000000007021681B400000001B9 +:101990000216881801010120021681B8000000011A +:1019A000021681BC00000001021681C00000000187 +:1019B000021681C4000000010216881C0101010109 +:1019C000021681C800000001021681CC000000014F +:1019D000021681D000000001021681D4000000012F +:1019E0000216882001010101021681D800000001C1 +:1019F000021681DC00000001021681E000000001F7 +:101A0000021681E400000001021688240101010190 +:101A1000021681E800000001021681EC00000001BE +:101A2000021681F000000001021688280101010160 +:101A300002168240FFFF003F0616824400000002AB +:101A40000216824CFFFF003F021682500000010088 +:101A5000021682540000010006168258000000029F +:101A600002168260000000C002168264000000C0FE +:101A70000216826800001E000216826C00001E0022 +:101A800002168270000040000216827400004000BE +:101A900002168278000080000216827C000080001E +:101AA00002168280000020000216828400002000BE +:101AB0000616828800000007021682A400000001BA +:101AC000061682A80000000A021681F400000C0825 +:101AD000021681F800000040021681FC000001009F +:101AE0000216820000000020021682040000001787 +:101AF00002168208000000800216820C000002001C +:101B0000021682100000000002168218FFFF01FF7B +:101B100002168214FFFF01FF0216823C0000001330 +:101B2000021680900000013F021680600000014014 +:101B30000216806400000140061680680000000262 +:101B400002168070000000C00616807400000007B6 +:101B50000216809C00000048021680A00000004889 +:101B6000061680A400000002021680AC00000048A7 +:101B7000061680B0000000070216823800008000C0 +:101B800002168234000025E40216809400007FFFD4 +:101B900002168220000000070216821C00000007C7 +:101BA000021682280000000002168224FFFFFFFFB9 +:101BB00002168230000000000216822CFFFFFFFF99 +:101BC000021680EC000000FF02140000000000017B +:101BD0000214000C0000000102140040000000018B +:101BE0000214004400007FFF0214000C00000000FB +:101BF00002140000000000000214006C000000004D +:101C00000214000400000001021400300000000172 +:101C100002140004000000000214005C0000000038 +:101C2000021400080000000102140034000000014A +:101C30000214000800000000021400600000000010 +:101C40000202005800000032020200A0031500202A +:101C5000020200A403150020020200A801000030C7 +:101C6000020200AC08100000020200B000000033C5 +:101C7000020200B400000030020200B8000000318F +:101C8000020200BC00000003020200C000000006C7 +:101C9000020200C400000003020200C800000003AA +:101CA000020200CC00000002020200D0000000008E +:101CB000020200D400000002020200DC000000006A +:101CC000020200E000000006020200E4000000043E +:101CD000020200E800000002020200EC0000000224 +:101CE000020200F000000001020200FC00000006F9 +:101CF0000202012000000000020201340000000284 +:101D0000020201B0000000010202020C000000010A +:101D10000202021400000001020202180000000288 +:101D200002020404000000010202040C0000004052 +:101D300002020410000000400202041C0000000423 +:101D4000020204200000002002020424000000021D +:101D5000020204280000001F060205000000001215 +:101D600004020480001F02D5020200600000000F80 +:101D70000202006400000007020200680000000B7D +:101D80000202006C0000000E060200700000000459 +:101D9000020200F40000000402020004000000013E +:101DA00002020008000000010202000C0000000115 +:101DB00002020010000000010202001400000001F5 +:101DC00002020018000000010202001C00000001D5 +:101DD00002020020000000010202002400000001B5 +:101DE00002020028000000010202002C0000000195 +:101DF0000202003000000001020200340000000175 +:101E000002020038000000010202003C0000000154 +:101E10000202004000000001020200440000000134 +:101E200002020048000000010202004C0000000114 +:101E3000020200500000000102020108000000C878 +:101E40000202011800000002020201C400000000AA +:101E5000020201CC00000000020201D400000002D6 +:101E6000020201DC00000002020201E4000000FFA7 +:101E7000020201EC000000FF0202010C000000C899 +:101E80000202011C00000002020201C80000000062 +:101E9000020201D000000000020201D8000000028E +:101EA000020201E000000002020201E8000000FF5F +:101EB000020201F0000000FF0728040000B5000046 +:101EC00008280768001302F4072C000035D300002F +:101ED000072C80003A3E0D75072D00003B541C0571 +:101EE000072D800022BC2ADB082DC770471202F69E +:101EF000012800000000000001280004000000008C +:101F000001280008000000000128000C000000006B +:101F1000012800100000000001280014000000004B +:101F20000228002000000001022800240000000216 +:101F300002280028000000030228002C00000000F6 +:101F400002280030000000040228003400000001D4 +:101F500002280038000000000228003C00000001B8 +:101F60000228004000000004022800440000000095 +:101F700002280048000000010228004C0000000375 +:101F80000228005000000000022800540000000158 +:101F900002280058000000040228005C0000000035 +:101FA0000228006000000001022800640000000315 +:101FB00002280068000000000228006C00000001F8 +:101FC00002280070000000040228007400000000D5 +:101FD00002280078000000040228007C00000003B2 +:101FE0000628008000000002022800A400003FFF35 +:101FF000022800A8000003FF0228022400000000BD +:1020000002280234000000000228024C00000000F8 +:10201000022802E40000FFFF06282000000008005C +:10202000022B8BC000000001022B8000000000008A +:10203000022B804000000018022B80800000000C62 +:10204000022B80C0000000660C2B83000007A1203B +:102050000A2B8300000001380B2B8300000013883B +:10206000022B83C0000001F40C2B8340000001F41C +:102070000A2B8340000000000B2B8340000000056A +:102080000A2B83800004C4B40C2B83801DCD650013 +:102090000B2B8380004C4B40062A3C400000000480 +:1020A000042A3C50000202F8062A300000000048D2 +:1020B000062A1020000000C8062A100000000002B6 +:1020C000062A31280000008E022A33680000000032 +:1020D000042A3370000202FA042A3A70000402FC57 +:1020E000042A3D0000020300042A15000002030236 +:1020F000062A150800000100022A197000000000DD +:10210000022A197800000000042A19600002030462 +:10211000062A4AC000000002062A4B000000000404 +:10212000042A1F4800020306022B080000000000DA +:10213000042B0C0000100308022B08000100000013 +:10214000042B0C4000080318022B080002000000BA +:10215000042B0C6000080320062A3A8000000014BB +:10216000062A3B2000000024062A14000000000A72 +:10217000062A145000000006062A3378000000D812 +:10218000022A3A3800000000042A3C5800020328C2 +:10219000042A3C680010032A062A5020000000028E +:1021A000062A503000000002062A500000000002FB +:1021B000062A501000000002022A504000000000D1 +:1021C000062A50480000000E022A50B80000000104 +:1021D000042A4AC80002033A062A4B1000000042B3 +:1021E000062A4D2000000004062A3AD00000001400 +:1021F000062A3BB000000024062A14280000000A2A +:10220000062A146800000006062A36D8000000D806 +:10221000022A3A3C00000000042A3C600002033C11 +:10222000042A3CA80010033E062A502800000002A1 +:10223000062A503800000002062A5008000000025A +:10224000062A501800000002022A50440000000034 +:10225000062A50800000000E022A50BC0000000137 +:10226000042A4AD00002034E062A4C1800000042FD +:10227000062A4D3000000004021010080000000182 +:102280000210101000000264021010000003D000C1 +:10229000021010040000003D091018000200035055 +:1022A00009101100002005500610118000000002E6 +:1022B0000910118800060570061011A00000001812 +:1022C000021010100000000006102400000000E0C2 +:1022D0000210201C0000000002102020000000015D +:1022E000021020C0000000010210200400000001C4 +:1022F000021020080000000109103C0000050576CE +:1023000009103C200005057B0910380000050580F8 +:1023100002104028000000100210404400003FFF5F +:102320000210405800280000021040840084924AA5 +:1023300002104058000000000610806800000004F1 +:1023400002108000000010800610802800000002AB +:102350000210803800000010021080400000FFFFD3 +:10236000021080440000FFFF0210805000000000B7 +:102370000210810000000000061081200000000211 +:1023800002108008000002B502108010000000005A +:10239000061082000000004A021081080001FFFFC1 +:1023A00006108140000000020210800000001A8028 +:1023B0000610900000000024061091200000004A42 +:1023C000061093700000004A061095C00000004AF5 +:1023D000021080040000108006108030000000020F +:1023E0000210803C00000010021080480000FFFF37 +:1023F0000210804C0000FFFF02108054000000001B +:102400000210810400000000061081280000000274 +:102410000210800C000002B50210801400000000C1 +:10242000061084000000004A0210810C0001FFFF2A +:1024300006108148000000020210800400001A808B +:102440000610909000000024061092480000004AF8 +:10245000061094980000004A061096E80000004A12 +:102460000212049000E383400212051400003C10A5 +:10247000021205200000000202120494FFFFFFFF79 +:1024800002120498FFFFFFFF0212049CFFFFFFFFF0 +:10249000021204A0FFFFFFFF021204A4FFFFFFFFD0 +:1024A000021204A8FFFFFFFF021204ACFFFFFFFFB0 +:1024B000021204B0FFFFFFFF021204B8FFFFFFFF8C +:1024C000021204BCFFFFFFFF021204C0FFFFFFFF68 +:1024D000021204C4FFFFFFFF021204C8FFFFFFFF48 +:1024E000021204CCFFFFFFFF021204D0FFFFFFFF28 +:1024F000021204DCFFFFFFFF021204E0FFFFFFFFF8 +:10250000021204E4FFFFFFFF021204E8FFFFFFFFD7 +:10251000021204ECFFFFFFFF021204F0FFFFFFFFB7 +:10252000021204F4FFFFFFFF021204F8FFFFFFFF97 +:10253000021204FCFFFFFFFF02120500FFFFFFFF76 +:1025400002120504FFFFFFFF02120508FFFFFFFF55 +:102550000212050CFFFFFFFF02120510FFFFFFFF35 +:10256000021204D4FFFF3330021204D8FFFF3340BD +:10257000021204B4F00030000212039000000008C0 +:102580000212039C00000008061203A000000002D3 +:10259000021203BC00000004021203C40000000485 +:1025A000021203D000000000021203DC0000000051 +:1025B0000212036C00000001021203680000003FD9 +:1025C000021201BC00000040021201C00000180805 +:1025D000021201C400000803021201C8000008032F +:1025E000021201CC00000040021201D000000003E2 +:1025F000021201D400000803021201D800000803EF +:10260000021201DC00000803021201E000010003D5 +:10261000021201E400000803021201E800000803AE +:10262000021201EC00000003021201F0000000039E +:10263000021201F400000003021201F8000000037E +:10264000021201FC0000000302120200000000035D +:10265000021202040000000302120208000000033C +:102660000212020C0000000302120210000000031C +:1026700002120214000000030212021800000003FC +:102680000212021C000000030212022000000003DC +:102690000212022400000003021202280000240398 +:1026A0000212022C0000002F02120230000000096A +:1026B00002120234000000190212023800000184E4 +:1026C0000212023C000001830212024000000306D5 +:1026D0000212024400000019021202480000000623 +:1026E0000212024C00000306021202500000030610 +:1026F00002120254000003060212025800000C8667 +:102700000212025C000003060212026000000306CF +:1027100002120264000000060212026800000006B5 +:102720000212026C00000006021202700000000695 +:102730000212027400000006021202780000000675 +:102740000212027C00000006021202800000000655 +:102750000212028400000006021202880000000635 +:102760000212028C00000006021202900000000615 +:1027700002120294000000060212029800000006F5 +:102780000212029C00000006021202A000000306D2 +:10279000021202A400000013021202A800000006A8 +:1027A000021202B000001004021202B40000100471 +:1027B0000212032400106440021203280010644037 +:1027C000021201B0000000010600A0000000001687 +:1027D0000200A06CBF5C00000200A070FFF51FEFBC +:1027E0000200A0740000FFFF0200A078500003E088 +:1027F0000200A07C000000000200A0800000A000F9 +:102800000600A084000000050200A0980FE0000070 +:102810000600A09C000000140200A0EC555400002B +:102820000200A0F0555555550200A0F40000555582 +:102830000200A0F8000000000200A0FC55540000B7 +:102840000200A100555555550200A1040000555540 +:102850000200A108000000000200A22C00000000FD +:102860000600A230000000030200A0600000000784 +:102870000200A10CBF5C00000200A110FFF51FEFD9 +:102880000200A1140000FFFF0200A118500003E0A5 +:102890000200A11C000000000200A1200000A00016 +:1028A0000600A124000000050200A1380FE000008E +:1028B0000600A13C000000140200A18C5554000049 +:1028C0000200A190555555550200A19400005555A0 +:1028D0000200A198000000000200A19C55540000D5 +:1028E0000200A1A0555555550200A1A40000555560 +:1028F0000200A1A8000000000200A23C00000000AD +:102900000600A240000000030200A06400000007CF +:1029100000000000000000000000002E0000000089 +:1029200000000000000000000000000000000000A7 +:102930000000000000000000000000000000000097 +:102940000000000000000000000000000000000087 +:102950000000000000000000000000000000000077 +:102960000000000000000000000000000000000067 +:10297000002E0050000000000000000000000000D9 +:102980000000000000000000000000000000000047 +:102990000000000000000000000000000050008D5A +:1029A0000000000000000000000000000000000027 +:1029B0000000000000000000000000000000000017 +:1029C0000000000000000000008D009200920096C0 +:1029D0000096009A000000000000000000000000C7 +:1029E00000000000000000000000000000000000E7 +:1029F00000000000009A00DB00DB00E900E900F7BE +:102A000000000000000000000000000000000000C6 +:102A100000000000000000000000000000000000B6 +:102A200000000000000000000000000000000000A6 +:102A30000000000000000000000000000000000096 +:102A40000000000000000000000000000000000086 +:102A50000000000000000000000000000000000076 +:102A60000000000000000000000000000000000066 +:102A70000000000000000000000000000000000056 +:102A80000000000000000000000000000000000046 +:102A90000000000000000000000000000000000036 +:102AA0000000000000000000000000000000000026 +:102AB0000000000000000000000000000000000016 +:102AC0000000000000000000000000000000000006 +:102AD00000F700FE00000000000000000000000001 +:102AE00000000000000000000000000000000000E6 +:102AF00000000000000000000000000000000000D6 +:102B000000000000000000000000000000000000C5 +:102B100000000000000000000000000000000000B5 +:102B2000000000000000000000FE01030103010E90 +:102B3000010E01190000000000000000000000006C +:102B40000000000000000000000000000000000085 +:102B50000000000000000000000000000000000075 +:102B60000000000000000000000000000000000065 +:102B70000000000000000000000000000000000055 +:102B80000119011A00000000000000000000000010 +:102B90000000000000000000000000000000000035 +:102BA000000000000000000000000000011A0152B7 +:102BB0000000000000000000000000000000000015 +:102BC0000000000000000000000000000000000005 +:102BD000000000000000000001520176000000002B +:102BE00000000000000000000000000000000000E5 +:102BF00000000000000000000000000000000000D5 +:102C000000000000017601B5000000000000000097 +:102C100000000000000000000000000000000000B4 +:102C200000000000000000000000000000000000A4 +:102C300001B501F0000000000000000000000000ED +:102C40000000000000000000000000000000000084 +:102C500000000000000000000000000001F002354C +:102C6000023502380238023B00000000000000007C +:102C70000000000000000000000000000000000054 +:102C80000000000000000000023B02760276028095 +:102C90000280028A00000000000000000000000026 +:102CA0000000000000000000000000000000000024 +:102CB00000000000028A028B0000000000000000FB +:102CC0000000000000000000000000000000000004 +:102CD00000000000000000000000000000000000F4 +:102CE000028B029D000000000000000000000000B8 +:102CF00000000000000000000000000000000000D4 +:102D0000000000000000000000000000029D02B270 +:102D100002B202B502B502B80000000000000000D7 +:102D200000000000000000000000000000000000A3 +:102D3000000000000000000002B802E600000000F1 +:102D40000000000000000000000000000000000083 +:102D50000000000000000000000000000000000073 +:102D60000000000002E6036D00000000000000000B +:102D70000000000000000000000000000000000053 +:102D80000000000000000000000000000000000043 +:102D9000036D0374037403780378037C0000000060 +:102DA0000000000000000000000000000000000023 +:102DB000000000000000000000000000037C03BBD6 +:102DC00003BB03C303C303CB0000000000000000EB +:102DD00000000000000000000000000000000000F3 +:102DE000000000000000000003CB041F041F04319A +:102DF0000431044300000000000000000000000057 +:102E000000000000000000000000000000000000C2 +:102E1000000000000443044D00000000000000001A +:102E200000000000000000000000000000000000A2 +:102E30000000000000000000000000000000000092 +:102E4000044D0453000000000000000000000000DA +:102E50000000000000000000000000000000000072 +:102E600000000000000000000000000004530456B1 +:102E70000000000000000000000000000000000052 +:102E80000000000000000000000000000000000042 +:102E900000000000000000000456045B0000000079 +:102EA0000000000000000000000000000000000022 +:102EB0000000000000000000000000000000000012 +:102EC00000000000045B045C045C046E046E04807B +:102ED00000000000000000000000000000000000F2 +:102EE00000000000000000000000000000000000E2 +:102EF000048004ED0000000000000000000000005D +:102F000000000000000000000000000000000000C1 +:102F100000000000000000000000000004ED04EECE +:102F200004EE050205020516000000000000000086 +:102F30000000000000000000000000000000000091 +:102F40000000000000000000000000000000000081 +:102F50000000000000000000000000000000000071 +:102F60000000000000000000000000000000000061 +:102F70000000000000000000000000000000000051 +:102F80000000000000000000000000000000000041 +:102F90000000000000000000000000000000000031 +:102FA000000000000000000000010000000204C05A +:102FB0000003098000040E4000051300000617C03E +:102FC00000071C800008214000092600000A2AC0D2 +:102FD000000B2F80000C3440000D3900000E3DC066 +:102FE000000F42800010474000114C00001250C0FA +:102FF0000013558000145A4000155F00001663C08E +:103000000017688000186D4000197200001A76C021 +:10301000001B7B80001C8040001D8500001E89C0B5 +:10302000001F8E8000209340000020000000400020 +:1030300000006000000080000000A0000000C00050 +:103040000000E0000001000000012000000140003D +:1030500000016000000180000001A0000001C0002C +:103060000001E00000020000000220000002400019 +:1030700000026000000280000002A0000002C00008 +:103080000002E000000300000003200000034000F5 +:1030900000036000000380000003A0000003C000E4 +:1030A0000003E000000400000004200000044000D1 +:1030B00000046000000480000004A0000004C000C0 +:1030C0000004E000000500000005200000054000AD +:1030D00000056000000580000005A0000005C0009C +:1030E0000005E00000060000000620000006400089 +:1030F00000066000000680000006A0000006C00078 +:103100000006E00000070000000720000007400064 +:1031100000076000000780000007A0000007C00053 +:103120000007E00000080000000820000008400040 +:1031300000086000000880000008A0000008C0002F +:103140000008E0000009000000092000000940001C +:1031500000096000000980000009A0000009C0000B +:103160000009E000000A0000000A2000000A4000F8 +:10317000000A6000000A8000000AA000000AC000E7 +:10318000000AE000000B0000000B2000000B4000D4 +:10319000000B6000000B8000000BA000000BC000C3 +:1031A000000BE000000C0000000C2000000C4000B0 +:1031B000000C6000000C8000000CA000000CC0009F +:1031C000000CE000000D0000000D2000000D40008C +:1031D000000D6000000D8000000DA000000DC0007B +:1031E000000DE000000E0000000E2000000E400068 +:1031F000000E6000000E8000000EA000000EC00057 +:10320000000EE000000F0000000F2000000F400043 +:10321000000F6000000F8000000FA000000FC00032 +:10322000000FE0000010000000102000001040001F +:1032300000106000001080000010A0000010C0000E +:103240000010E000001100000011200000114000FB +:1032500000116000001180000011A0000011C000EA +:103260000011E000001200000012200000124000D7 +:1032700000126000001280000012A0000012C000C6 +:103280000012E000001300000013200000134000B3 +:1032900000136000001380000013A0000013C000A2 +:1032A0000013E0000014000000142000001440008F +:1032B00000146000001480000014A0000014C0007E +:1032C0000014E0000015000000152000001540006B +:1032D00000156000001580000015A0000015C0005A +:1032E0000015E00000160000001620000016400047 +:1032F00000166000001680000016A0000016C00036 +:103300000016E00000170000001720000017400022 +:1033100000176000001780000017A0000017C00011 +:103320000017E000001800000018200000184000FE +:1033300000186000001880000018A0000018C000ED +:103340000018E000001900000019200000194000DA +:1033500000196000001980000019A0000019C000C9 +:103360000019E000001A0000001A2000001A4000B6 +:10337000001A6000001A8000001AA000001AC000A5 +:10338000001AE000001B0000001B2000001B400092 +:10339000001B6000001B8000001BA000001BC00081 +:1033A000001BE000001C0000001C2000001C40006E +:1033B000001C6000001C8000001CA000001CC0005D +:1033C000001CE000001D0000001D2000001D40004A +:1033D000001D6000001D8000001DA000001DC00039 +:1033E000001DE000001E0000001E2000001E400026 +:1033F000001E6000001E8000001EA000001EC00015 +:10340000001EE000001F0000001F2000001F400001 +:10341000001F6000001F8000001FA000001FC000F0 +:10342000001FE000002000000020200000204000DD +:1034300000206000002080000020A0000020C000CC +:103440000020E000002100000021200000214000B9 +:1034500000216000002180000021A0000021C000A8 +:103460000021E00000220000002220000022400095 +:1034700000226000002280000022A0000022C00084 +:103480000022E00000230000002320000023400071 +:1034900000236000002380000023A0000023C00060 +:1034A0000023E0000024000000242000002440004D +:1034B00000246000002480000024A0000024C0003C +:1034C0000024E00000250000002520000025400029 +:1034D00000256000002580000025A0000025C00018 +:1034E0000025E00000260000002620000026400005 +:1034F00000266000002680000026A0000026C000F4 +:103500000026E000002700000027200000274000E0 +:1035100000276000002780000027A0000027C000CF +:103520000027E000002800000028200000284000BC +:1035300000286000002880000028A0000028C000AB +:103540000028E00000290000002920000029400098 +:1035500000296000002980000029A0000029C00087 +:103560000029E000002A0000002A2000002A400074 +:10357000002A6000002A8000002AA000002AC00063 +:10358000002AE000002B0000002B2000002B400050 +:10359000002B6000002B8000002BA000002BC0003F +:1035A000002BE000002C0000002C2000002C40002C +:1035B000002C6000002C8000002CA000002CC0001B +:1035C000002CE000002D0000002D2000002D400008 +:1035D000002D6000002D8000002DA000002DC000F7 +:1035E000002DE000002E0000002E2000002E4000E4 +:1035F000002E6000002E8000002EA000002EC000D3 +:10360000002EE000002F0000002F2000002F4000BF +:10361000002F6000002F8000002FA000002FC000AE +:10362000002FE0000030000000302000003040009B +:1036300000306000003080000030A0000030C0008A +:103640000030E00000310000003120000031400077 +:1036500000316000003180000031A0000031C00066 +:103660000031E00000320000003220000032400053 +:1036700000326000003280000032A0000032C00042 +:103680000032E0000033000000332000003340002F +:1036900000336000003380000033A0000033C0001E +:1036A0000033E0000034000000342000003440000B +:1036B00000346000003480000034A0000034C000FA +:1036C0000034E000003500000035200000354000E7 +:1036D00000356000003580000035A0000035C000D6 +:1036E0000035E000003600000036200000364000C3 +:1036F00000366000003680000036A0000036C000B2 +:103700000036E0000037000000372000003740009E +:1037100000376000003780000037A0000037C0008D +:103720000037E0000038000000382000003840007A +:1037300000386000003880000038A0000038C00069 +:103740000038E00000390000003920000039400056 +:1037500000396000003980000039A0000039C00045 +:103760000039E000003A0000003A2000003A400032 +:10377000003A6000003A8000003AA000003AC00021 +:10378000003AE000003B0000003B2000003B40000E +:10379000003B6000003B8000003BA000003BC000FD +:1037A000003BE000003C0000003C2000003C4000EA +:1037B000003C6000003C8000003CA000003CC000D9 +:1037C000003CE000003D0000003D2000003D4000C6 +:1037D000003D6000003D8000003DA000003DC000B5 +:1037E000003DE000003E0000003E2000003E4000A2 +:1037F000003E6000003E8000003EA000003EC00091 +:10380000003EE000003F0000003F2000003F40007D +:10381000003F6000003F8000003FA000003FC0006C +:10382000003FE000003FE00100000000000001FF59 +:103830000000020000007FF800007FF80000026F27 +:1038400000001500000000010000000300BEBC20C5 +:103850000000000300BEBC2000000001FFFFFFFFCE +:10386000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 +:10387000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 +:1038800000000000FFFFFFFF00000000FFFFFFFF40 +:103890000000000300BEBC20FFFFFFFF000000008F +:1038A000FFFFFFFF00000000FFFFFFFF000000031D +:1038B00000BEBC2000002000000040C0000061806D +:1038C000000082400000A3000000C3C00000E480AC +:1038D0000001054000012600000146C0000167808C +:1038E000000188400001A9000001C9C00001EA8070 +:1038F00000020B4000022C0000024CC000026D8050 +:1039000000028E400002AF000002CFC00002F08033 +:103910000003114000033200000352C00003738013 +:10392000000394400003B5000003D5C00003F680F7 +:103930000004174000043800000458C000047980D7 +:1039400000049A400000800000010380000187000D +:1039500000020A8000028E0000031180000395001F +:103960000004188000049C0000051F800005A300CF +:10397000000626800006AA0000072D800007B1007F +:10398000000834800008B80000093B800009BF002F +:10399000000A4280000AC600000B4980000BCD00DF +:1039A000000C5080000CD400000D5780000DDB008F +:1039B00000007FF800007FF800000174000015008F +:1039C0000000190000000000FFFFFFFF40000000A2 +:1039D00040000000400000004000000040000000E7 +:1039E00040000000400000004000000040000000D7 +:1039F00040000000400000004000000040000000C7 +:103A000040000000400000004000000040000000B6 +:103A100040000000400000004000000040000000A6 +:103A20004000000040000000400000004000000096 +:103A30004000000040000000400000004000000086 +:103A400040000000400000004000000000007FF83F +:103A500000007FF80000050900003500FFFFFFFFB0 +:103A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 +:103A7000FFFFFFFFFFFFFFFFFFFFFFFF4000000012 +:103A80004000000040000000400000004000000036 +:103A90004000000040000000400000004000000026 +:103AA0004000000040000000400000004000000016 +:103AB0004000000040000000400000004000000006 +:103AC00040000000400000004000000040000000F6 +:103AD00040000000400000004000000040000000E6 +:103AE00040000000400000004000000040000000D6 +:103AF00040000000400000004000000000001000F6 +:103B000000002080000031000000418000005200D1 +:103B100000006280000073000000838000009400B9 +:103B20000000A4800000B5000000C5800000D600A1 +:103B30000000E6800000F700000107800001180087 +:103B400000012880000139000001498000015A006D +:103B500000016A8000017B0000018B8000019C0055 +:103B60000001AC800001BD000001CD800001DE003D +:103B70000001EE800001FF0000007FF800007FF8E8 +:103B8000000004480000150010000000000028ADEF +:103B9000000000000001000100070205CCCCCCC1F0 +:103BA000FFFFFFFFFFFFFFFF7058103C0000000009 +:103BB0000000000000000001CCCC0201CCCCCCCC39 +:103BC00000000000FFFFFFFF400000004000000079 +:103BD00040000000400000004000000040000000E5 +:103BE00040000000400000004000000040000000D5 +:103BF00040000000400000004000000040000000C5 +:103C000040000000400000004000000040000000B4 +:103C100040000000400000004000000040000000A4 +:103C20004000000040000000400000004000000094 +:103C30004000000040000000400000004000000084 +:103C40004000000040000000000E01B7011600D641 +:103C50000000FFFF000000000000FFFF0000000068 +:103C60000000FFFF000000000000FFFF0000000058 +:103C70000000FFFF000000000000FFFF0000000048 +:103C80000000FFFF000000000000FFFF0000000038 +:103C90000010000000000000007201BB012300F3CF +:103CA0000000FFFF000000000000FFFF0000000018 +:103CB0000000FFFF000000000000FFFF0000000008 +:103CC0000000FFFF000000000000FFFF00000000F8 +:103CD0000000FFFF000000000000FFFF00000000E8 +:103CE0000010000000000000FFFFFFF3318FFFFF16 +:103CF0000C30C30CC30C30C3CF3CF300F3CF3CF308 +:103D00000000CF3CCDCDCDCDFFFFFFF130EFFFFF69 +:103D10000C30C30CC30C30C3CF3CF300F3CF3CF3E7 +:103D20000001CF3CCDCDCDCDFFFFFFF6305FFFFFD3 +:103D30000C30C30CC30C30C3CF3CF300F3CF3CF3C7 +:103D40000002CF3CCDCDCDCDFFFFF4061CBFFFFF61 +:103D50000C30C305C30C30C3CF300014F3CF3CF399 +:103D60000004CF3CCDCDCDCDFFFFFFF2304FFFFFA4 +:103D70000C30C30CC30C30C3CF3CF300F3CF3CF387 +:103D80000008CF3CCDCDCDCDFFFFFFFA302FFFFF98 +:103D90000C30C30CC30C30C3CF3CF300F3CF3CF367 +:103DA0000010CF3CCDCDCDCDFFFFFFF731EFFFFFB2 +:103DB0000C30C30CC30C30C3CF3CF300F3CF3CF347 +:103DC0000020CF3CCDCDCDCDFFFFFFF5302FFFFF45 +:103DD0000C30C30CC30C30C3CF3CF300F3CF3CF327 +:103DE0000040CF3CCDCDCDCDFFFFFFF3318FFFFFA6 +:103DF0000C30C30CC30C30C3CF3CF300F3CF3CF307 +:103E00000000CF3CCDCDCDCDFFFFFFF1310FFFFF47 +:103E10000C30C30CC30C30C3CF3CF300F3CF3CF3E6 +:103E20000001CF3CCDCDCDCDFFFFFFF6305FFFFFD2 +:103E30000C30C30CC30C30C3CF3CF300F3CF3CF3C6 +:103E40000002CF3CCDCDCDCDFFFFF4061CBFFFFF60 +:103E50000C30C305C30C30C3CF300014F3CF3CF398 +:103E60000004CF3CCDCDCDCDFFFFFFF2304FFFFFA3 +:103E70000C30C30CC30C30C3CF3CF300F3CF3CF386 +:103E80000008CF3CCDCDCDCDFFFFFFFA302FFFFF97 +:103E90000C30C30CC30C30C3CF3CF300F3CF3CF366 +:103EA0000010CF3CCDCDCDCDFFFFFFF730EFFFFFB2 +:103EB0000C30C30CC30C30C3CF3CF300F3CF3CF346 +:103EC0000020CF3CCDCDCDCDFFFFFFF5304FFFFF24 +:103ED0000C30C30CC30C30C3CF3CF300F3CF3CF326 +:103EE0000040CF3CCDCDCDCDFFFFFFF331EFFFFF45 +:103EF0000C30C30CC30C30C3CF3CF300F3CF3CF306 +:103F00000000CF3CCDCDCDCDFFFFFFF1310FFFFF46 +:103F10000C30C30CC30C30C3CF3CF300F3CF3CF3E5 +:103F20000001CF3CCDCDCDCDFFFFFFF6305FFFFFD1 +:103F30000C30C30CC30C30C3CF3CF300F3CF3CF3C5 +:103F40000002CF3CCDCDCDCDFFFFF4061CBFFFFF5F +:103F50000C30C305C30C30C3CF300014F3CF3CF397 +:103F60000004CF3CCDCDCDCDFFFFFFF2304FFFFFA2 +:103F70000C30C30CC30C30C3CF3CF300F3CF3CF385 +:103F80000008CF3CCDCDCDCDFFFFFFFA302FFFFF96 +:103F90000C30C30CC30C30C3CF3CF300F3CF3CF365 +:103FA0000010CF3CCDCDCDCDFFFFFF97056FFFFFBC +:103FB0000C30C30CC30C30C3CF3CC000F3CF3CF378 +:103FC0000020CF3CCDCDCDCDFFFFFFF5310FFFFF62 +:103FD0000C30C30CC30C30C3CF3CF300F3CF3CF325 +:103FE0000040CF3CCDCDCDCDFFFFFFF3320FFFFF23 +:103FF0000C30C30CC30C30C3CF3CF300F3CF3CF305 +:104000000000CF3CCDCDCDCDFFFFFFF1310FFFFF45 +:104010000C30C30CC30C30C3CF3CF300F3CF3CF3E4 +:104020000001CF3CCDCDCDCDFFFFFFF6305FFFFFD0 +:104030000C30C30CC30C30C3CF3CF300F3CF3CF3C4 +:104040000002CF3CCDCDCDCDFFFFF4061CBFFFFF5E +:104050000C30C305C30C30C3CF300014F3CF3CF396 +:104060000004CF3CCDCDCDCDFFFFFFF2304FFFFFA1 +:104070000C30C30CC30C30C3CF3CF300F3CF3CF384 +:104080000008CF3CCDCDCDCDFFFFFF8A042FFFFF31 +:104090000C30C30CC30C30C3CF3CC000F3CF3CF397 +:1040A0000010CF3CCDCDCDCDFFFFFF9705CFFFFF5B +:1040B0000C30C30CC30C30C3CF3CC000F3CF3CF377 +:1040C0000020CF3CCDCDCDCDFFFFFFF5310FFFFF61 +:1040D0000C30C30CC30C30C3CF3CF300F3CF3CF324 +:1040E0000040CF3CCDCDCDCDFFFFFFF3300FFFFF24 +:1040F0000C30C30CC30C30C3CF3CF300F3CF3CF304 +:104100000000CF3CCDCDCDCDFFFFFFF1300FFFFF45 +:104110000C30C30CC30C30C3CF3CF300F3CF3CF3E3 +:104120000001CF3CCDCDCDCDFFFFFFF6305FFFFFCF +:104130000C30C30CC30C30C3CF3CF300F3CF3CF3C3 +:104140000002CF3CCDCDCDCDFFFFF4061CBFFFFF5D +:104150000C30C305C30C30C3CF300014F3CF3CF395 +:104160000004CF3CCDCDCDCDFFFFFFF2304FFFFFA0 +:104170000C30C30CC30C30C3CF3CF300F3CF3CF383 +:104180000008CF3CCDCDCDCDFFFFFFFA302FFFFF94 +:104190000C30C30CC30C30C3CF3CF300F3CF3CF363 +:1041A0000010CF3CCDCDCDCDFFFFFF97040FFFFF1B +:1041B0000C30C30CC30C30C3CF3CC000F3CF3CF376 +:1041C0000020CF3CCDCDCDCDFFFFFFF5300FFFFF61 +:1041D0000C30C30CC30C30C3CF3CF300F3CF3CF323 +:1041E0000040CF3CCDCDCDCDFFFFFFFF30CFFFFF57 +:1041F0000C30C30CC30C30C3CF3CF3CCF3CF3CF337 +:104200000000CF3CCDCDCDCDFFFFFFFF30CFFFFF76 +:104210000C30C30CC30C30C3CF3CF3CCF3CF3CF316 +:104220000001CF3CCDCDCDCDFFFFFFFF30CFFFFF55 +:104230000C30C30CC30C30C3CF3CF3CCF3CF3CF3F6 +:104240000002CF3CCDCDCDCDFFFFFFFF30CFFFFF34 +:104250000C30C30CC30C30C3CF3CF3CCF3CF3CF3D6 +:104260000004CF3CCDCDCDCDFFFFFFFF30CFFFFF12 +:104270000C30C30CC30C30C3CF3CF3CCF3CF3CF3B6 +:104280000008CF3CCDCDCDCDFFFFFFFF30CFFFFFEE +:104290000C30C30CC30C30C3CF3CF3CCF3CF3CF396 +:1042A0000010CF3CCDCDCDCDFFFFFFFF30CFFFFFC6 +:1042B0000C30C30CC30C30C3CF3CF3CCF3CF3CF376 +:1042C0000020CF3CCDCDCDCDFFFFFFFF30CFFFFF96 +:1042D0000C30C30CC30C30C3CF3CF3CCF3CF3CF356 +:1042E0000040CF3CCDCDCDCDFFFFFFFF30CFFFFF56 +:1042F0000C30C30CC30C30C3CF3CF3CCF3CF3CF336 +:104300000000CF3CCDCDCDCDFFFFFFFF30CFFFFF75 +:104310000C30C30CC30C30C3CF3CF3CCF3CF3CF315 +:104320000001CF3CCDCDCDCDFFFFFFFF30CFFFFF54 +:104330000C30C30CC30C30C3CF3CF3CCF3CF3CF3F5 +:104340000002CF3CCDCDCDCDFFFFFFFF30CFFFFF33 +:104350000C30C30CC30C30C3CF3CF3CCF3CF3CF3D5 +:104360000004CF3CCDCDCDCDFFFFFFFF30CFFFFF11 +:104370000C30C30CC30C30C3CF3CF3CCF3CF3CF3B5 +:104380000008CF3CCDCDCDCDFFFFFFFF30CFFFFFED +:104390000C30C30CC30C30C3CF3CF3CCF3CF3CF395 +:1043A0000010CF3CCDCDCDCDFFFFFFFF30CFFFFFC5 +:1043B0000C30C30CC30C30C3CF3CF3CCF3CF3CF375 +:1043C0000020CF3CCDCDCDCDFFFFFFFF30CFFFFF95 +:1043D0000C30C30CC30C30C3CF3CF3CCF3CF3CF355 +:1043E0000040CF3CCDCDCDCDFFFFFFFF30CFFFFF55 +:1043F0000C30C30CC30C30C3CF3CF3CCF3CF3CF335 +:104400000000CF3CCDCDCDCDFFFFFFFF30CFFFFF74 +:104410000C30C30CC30C30C3CF3CF3CCF3CF3CF314 +:104420000001CF3CCDCDCDCDFFFFFFFF30CFFFFF53 +:104430000C30C30CC30C30C3CF3CF3CCF3CF3CF3F4 +:104440000002CF3CCDCDCDCDFFFFFFFF30CFFFFF32 +:104450000C30C30CC30C30C3CF3CF3CCF3CF3CF3D4 +:104460000004CF3CCDCDCDCDFFFFFFFF30CFFFFF10 +:104470000C30C30CC30C30C3CF3CF3CCF3CF3CF3B4 +:104480000008CF3CCDCDCDCDFFFFFFFF30CFFFFFEC +:104490000C30C30CC30C30C3CF3CF3CCF3CF3CF394 +:1044A0000010CF3CCDCDCDCDFFFFFFFF30CFFFFFC4 +:1044B0000C30C30CC30C30C3CF3CF3CCF3CF3CF374 +:1044C0000020CF3CCDCDCDCDFFFFFFFF30CFFFFF94 +:1044D0000C30C30CC30C30C3CF3CF3CCF3CF3CF354 +:1044E0000040CF3CCDCDCDCD000C0000000700C07A +:1044F00000028130000B81580002021000010230DE +:10450000000F024000010330000C0000000800C052 +:1045100000028140000B816800020220000102407D +:1045200000070250000202C0000F0000000800F067 +:1045300000028170000B819800020250000102709D +:10454000000B828000080338001000000008010002 +:1045500000028180000B81A80002026000018280BD +:10456000000E82980008038000028000000B802863 +:10457000000200E0000101000000811000000118AD +:10458000CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC6B +:1045900000002000CCCCCCCCCCCCCCCCCCCCCCCC6B +:1045A000CCCCCCCC00002000CCCCCCCCCCCCCCCC5B +:1045B000CCCCCCCCCCCCCCCC00002000000000007B +:1045C0001F8B080000000000000BFB51CFC0F00360 +:1045D0008A7BD81818F67020F843015F646260B8CF +:1045E0000CC45781588099812198918121849178B8 +:1045F000FD19A208F63B210606296106860841A09E +:1046000079C208F1D3403576220C0C8C22107E2B17 +:1046100090E612A58EFB071AEF94C214DB26816088 +:10462000EFC2228F8C77A3C98B4AA2F2F710D03F3A +:10463000D0F895222A5F5601429741C55FA3C9CBA6 +:1046400041E56F41FDF54611BBB9B7A1F2009CB43D +:10465000B6A260030000000000000000000000009F +:104660001F8B080000000000000BED7D0B7854D577 +:10467000B5F03E73CE9C9949662627214F1E6112E4 +:1046800020028638BC0228F73A212140A575A055A2 +:10469000D1A21D3040C85B8A5E5ADB2F130831025D +:1046A000DAE08F8A16EDF0AAA8A80123450B7478EA +:1046B0008A5E6F6FB06A69B5DE888A8A3C22AD4A2D +:1046C000EF6D7FFFB5D6DE3B73CE6402D8AFF7FE49 +:1046D000F7BFDF1F3FBFC33E7B9FBDD75EAFBDD6D9 +:1046E000DA6BEFB1DB1C4CBF96B1AFF00F9EF53625 +:1046F000C65846ECF9A89D7D2FE866AC60BD6F8575 +:104700003B1DDEEFCEDB91EC632C67CF5A650ABC14 +:10471000CFD9D0A6CC2F8C7D1F7041E57878BF7B98 +:10472000AD5202EF735E6B53E6E1D361639DD09EA1 +:1047300069BE14864F16602C93B1211399F80BB8FB +:10474000738A191B88FF842ECE1BC98C8D632C6F36 +:10475000A52D1256E07DA87226F332B619E0CA499B +:1047600083EFD4BFECB763DB06ED44979331A7E644 +:10477000D4BECA672C770EB331780E5EC6DFE3DF96 +:1047800057F07F5ED85A1EC24CE53C2C7BD24FC2FC +:1047900090CCC33C5FA989E0EDD683A362F394CFAC +:1047A0000D8DBE4CB7D6FBBD7C2EB9E363FD1EF864 +:1047B000FA716C3794B1485CFBDAB0AEB1ABE0098A +:1047C00008682FECFDFD4C56528C74B88D4DA167D6 +:1047D000BDE6BB09F1527FD4CEC200777DC3C9725A +:1047E0002CB3DD0A1B96D7FBFB51CC4EF428618A13 +:1047F0007612E7EB655E9C9F5AE37BB81CF0DC9079 +:104800001C28C37E1F490ED153BECF9E3F3D3B04A3 +:10481000F0942E2A0C33A0FBF9F58ADF019F7FA4C8 +:1048200044743BD0A3FA3B0D45D3A0DD9B7AE83A14 +:10483000FC6E911A6DB1C3F8B5731B0A8002AC53BC +:10484000E7FC337877C9271AD06D3063E19434A43C +:104850000B63274C74C0BF13C34559ED1B8F977A68 +:1048600056603F1AF612A1F9CAF779E1A34386C64A +:104870008DC78A091E867032D6A524A2EBE0174B9D +:104880008E6A457D8FF79F3F8F309743C01DD2B70B +:10489000D6A34796037E4B5FB047AF057AD46E54DC +:1048A000220E28DBF6B902489FB35BA00C74897A0C +:1048B000746A7FC67052B9DED179FF3550EE7E4101 +:1048C000659BB0DBE1493694BB930276360ECA8015 +:1048D0008F852E5EACDDB8FF36ECAF72B783B99032 +:1048E0009E2F2EFAD635505E04FC864D6AB736E907 +:1048F000FDA1BC38A2B463F9DC1446FC114ED323ED +:104900005B61BC73DECECC1B405E4E353A990F40E6 +:1049100059E1E9CCFC0EF051556447397E57B55D3D +:10492000F123DA4B5FD87A2407E7F524F015F0512C +:10493000F5B664E693F883FF4FC254AE85FA25308E +:104940004F94FF45ACAD9CA938FE5ADDE789E1EBF9 +:1049500054A341E3F4C8D393300E7C57F7ACE2C7BD +:1049600029D6D95808E5EAEC8BAE399BDD38BF264D +:10497000BDC083F3BA47C7768B22F376A1CAAA8A51 +:104980006CD4CBA1BE6AC3467D6121E20DF45E21E9 +:10499000C2D5CF0AD77A3580F85D92EADCA4027ED0 +:1049A000983B903D3B01FF9C6A043556102B57A164 +:1049B0007C933E89E8B34CEDCB9554E2D7EA6D2A5F +:1049C000F359F889D33F7C8CD33FBCD713D99A17BE +:1049D000A3DF1283EB4949BF25A9829E5A77712232 +:1049E00078EE477A003C6D882F78AE11F07927B3C6 +:1049F000120DE8E20D30436197E6CF363B9BC7606E +:104A0000ECD7D982803609CA3ABB83F91933B4DAB4 +:104A1000401994FFC282AFE17C18F3FB8280E71655 +:104A200085CDC1791F4660613E2D393AE1AF6D6A8F +:104A3000F166551130A76379E1CF57E5D1F76FD013 +:104A4000F71A7C3FAAEFEF8DF28996EF8DF24AF9C3 +:104A5000FD3BD88E392FFE7D5BF9D5D6F1CBABE48B +:104A6000F71FD0F8EE8BC36F4C9B6C1D7F5A0D7DEA +:104A70005FEFE0F4EA4E75463641B9D9E50F684874 +:104A8000378D45F1BD9656B009DBA9921F58674096 +:104A900085EFDDDB53C7AC6266BE98F2271CCF03FF +:104AA000D262E68B948949167E4C0DA459CAD093E4 +:104AB00071F2CA981E0A789D048FDE5F277D51D25D +:104AC000DF49F0DEB5CF45E5BBAEE6F0DED5DF4D24 +:104AD000728630B01C28EBA1AB0CD37A04702A2C60 +:104AE0009BB1CF95904B196F7EEFB3E1FB249535C9 +:104AF000E07C921C8CF4D13D79C59BC326FCB40E9E +:104B000002FA42395DD1391E055EEF19B4307B9E41 +:104B1000699C9641FA9C4D85FCFDED6E1C2F98A971 +:104B2000A01ED4BB0B0C77EF711CF9132DE3387367 +:104B30002B699CBCB8711CB99571E338E76C12EF16 +:104B4000C538432E36CE3DF9575BE7935B45E314FA +:104B5000C5CF27B72A6E9C243E1F782FC6F123FEAF +:104B6000FA9CCF90C9D6F90CAEA171AEC171C69BAB +:104B7000E633B8266E1C378D83EF711C30A47C2C75 +:104B80000BE8EEE85E48F4FF958BEC05DD117A0248 +:104B9000FB656FBB18E9131F8C9B857A0516679020 +:104BA0005F4D49A371BE4802FABBCD74E6FA889EF8 +:104BB000A07F16081059042002FD532778B462FB29 +:104BC000ACDC267CEE2ECD9E8776C93A8F7F188886 +:104BD000CED9DDA5FAED09EC9B056DF6935D16FEC9 +:104BE000157A6F0A1BDE00E377A0B231954F82FE83 +:104BF00062A0B74E80FEC2E747C23EFD00F41BD361 +:104C0000CDF036D13C4E6A1C8F2737F075E48BB55A +:104C1000C7EC60ECE1306F1402DC378A692C680362 +:104C2000E3CF2467F5821EDD2F3A229B881E810187 +:104C300036E073B6BE1FE04AB4033BF30FC21E85D5 +:104C4000BF0136B0656F69DD71189BBDA5CC1BB483 +:104C500004E63BA763AD7D0094CFDABB6EF3BB4D9A +:104C6000FDCCB19FC0793BE13FECE7E690DD629F70 +:104C70007EB7D25ABE35CE5EAD51F2053DC4B8BE48 +:104C8000881DE975632687E7567C8EC16A83E875BF +:104C90009BC1BF95F0D4DF6D67515A8FBA3258214E +:104CA000E22383ECA2905C57E2E0BBCDEE0C0481E2 +:104CB0009EB7FD40253CC6C3DBB52F3960037BA9F9 +:104CC0006BFD1FED687F5F0AFEEF2DB3D6B3301F7B +:104CD0004FE255F2C14D734AFA7D606A77736846B8 +:104CE000BF0F4CFCF2DDCA5996F2AD0D375BDA7F8F +:104CF0006FD93C4BFDBCF0624BFDEDAD7758CA0B54 +:104D0000DA7E6069BF687D93A57E71E45E4B7DF5B8 +:104D1000B6B596726DFB2396F6F5BB375AEA6DFB76 +:104D2000465C8FF2B8E24D95A17DF6B9FBE4FD68D3 +:104D30005F7D6E687E6C5387BC0672F8716336F1D6 +:104D4000F7A9461F3DCFEE1EEB447BBC3E09E4199C +:104D5000D6FA7DCA1FC2AD93518F407BD0E1079434 +:104D6000F7C361709E5E517CC4F7EA7A9D45815518 +:104D70001596D6C3D7DD6AAC5EEB82FAB17DD7ABB0 +:104D8000EBB584F55A9796B0DF734A7701DA77E18D +:104D9000DF3918DA817DD90FF03700D78BBEEA4FA3 +:104DA000DB5865BB49EF9C546CC407372A534EA2AD +:104DB0007EAED1B9BCD7ECCC9982FE608D1E2D6839 +:104DC000705F64BC7600260BFBC9A7792D8E0C881A +:104DD000C92FD16F8845EE97B2D087A89F4FEF5764 +:104DE00049CFB2E8C1DC6F8FC2F10327F13DDB9DF3 +:104DF00041EBE35B8D817E1F803F77BC713A3D7F45 +:104E0000DF18ECF701E89A771AE750F9DDC6103D94 +:104E1000BB1A2BE979A2B181EA3F685C46E5938D24 +:104E2000617A7EDCD84ACF538D6D547FBA713D953F +:104E3000CF3646E8D9E307087B94A50BFB4FD8EBA8 +:104E4000B07250F9BC98830AFFE67EAB3F1BE5FACF +:104E5000BCFB8B02B473CF1F07C324817F289FF153 +:104E6000FCD637FD02B4DE2F8C00FDC7F6AE7725E9 +:104E700071FAB86C6C3A03FD73EF309D69307ED2E5 +:104E8000AFAE247B19DE6B8CF465C43FCB93A07F5F +:104E90009C73D6A5E9D4C31F8FFE4731C61F6E147D +:104EA000FA30E9A0DAC0E9B6D98F7433E18FDB6557 +:104EB0002F087D1E8747B2E5727AE3F34C86C467FC +:104EC000672EC601D629C11136E083F31D0E9AD78D +:104ED000F93DC91186DF627064D2C5F0C6E1A8DE73 +:104EE000E632CCFAA1B63DD5B0EA8B1CC3AC2FCECE +:104EF0001FDDEC45B95F926D333E188BFC1110FC41 +:104F0000C1F94EF65FDB9E67B82DFD58CBE7DB9409 +:104F1000E9E80781724FF94E02FF403E9764EBC605 +:104F20000720DFA7B60D49C171C18F33709CD38DA7 +:104F300086C1C7CD36CC7C59B32C89DA4BF8FAEA56 +:104F4000F7EF0D1F5A06EF3B19A1FEAB215FDFCF34 +:104F500066DA9F289EC3F6D8BFC075C701FF7F459C +:104F6000F1008DCAB2DFFA7635ECB80ADF6FB78C84 +:104F700007DFF9A40F8DEB55DF74D7D849535CA038 +:104F80000EC720FFC849740E418F29D0DF39CDDD0F +:104F9000AAC038D36D3EAAAF17FC58EBECD243F051 +:104FA000EA4C07A7475FE39C6A3CEAD3407F543A48 +:104FB000C12383712ADB4794A17E3CD3B122330401 +:104FC0007C5BAD9EBF2B98E0FB569BC2E189D8BBB2 +:104FD000BB4CF3917114C6A05F670C7EE4F493A6FA +:104FE00072BCBE96CF07B05FE08FBAEDC7CAAF0103 +:104FF000F8EB767FA6231CD36DA1076C19B1F92BB2 +:10500000387FE8A76ADB7B3ACEEF637BB8E0EE8BB4 +:10501000E8A9DE70BAB3296E27E10BB34EB463E69C +:10502000F7C4157D37BD0DA2F9C93FDBD92A8083AE +:10503000FD055A41BD5DD456B0A017F135BFA39A06 +:10504000E28B9FD8A4DDD4568CFC7186D9A6E3FCF4 +:10505000CEB0D7BD634DF8EBB071BB9FB5723B26A8 +:105060000CFF213C60CF5AEC9A45EBADE5856C76A0 +:1050700026EA8D85EBEC2C02285A8C7691E40F9869 +:10508000F7161BB77717B18616B4E73407F70FE6A4 +:105090001B4C1B0070D5FEE2B162B4FB7F69B311FB +:1050A0007D649C61711A87BB2A3DA207A0FEFD8E1C +:1050B000B1375E83DCE788B4E0BACC52987F2BEB43 +:1050C0008DCFDB5BADF05D0AFE7878195B6E8143B6 +:1050D000F62BE150B729814802BE7B45F29DD023D3 +:1050E00069AAD5CECF8A2BBF6313F14B95A948E7A8 +:1050F0003386336C4BA17A7F14E3233B1DFE1540AE +:10510000DF3B6DC12ED4CF6017143153BB3B6D21F3 +:105110007A7F5A796D21DAA74C8B16A17F0F6B8AA3 +:1051200086FCA00B7E5093BC45188FF530583F414C +:105130002E1D081FF4D3E2A99CC98A30FE0A720A08 +:10514000FDDDE72D3FAA40D9E5EE60D89F23DB1AAD +:105150005F76F9ACE57AFC07D26138A3384EF2707D +:105160006B3D2C580CF9CDE3B7BEFFF71E3C4589CB +:105170006FBDC4D2F074BAA32A8CCF266AA7CD76AD +:10518000739D93C34F7E39B45F2AECF93AE60B5313 +:105190009C389BF3C1D219368267A9C7E70F43BD7C +:1051A000A20518CA1FC6AACDEB58FD0510B97EA6E8 +:1051B000B2D6AD235FD65FD05804F47D912DE45173 +:1051C000C723FE0264E73A01595F01C89A7BBAC55A +:1051D000EE6503D3C4FA3AD030CBEB40A4F3F81811 +:1051E0009DA55EB00BBD08FA224BCD403DD85D4E6B +:1051F0007E09EB223D21DBE9B17603118EBEDAB9DF +:1052000062EDF212F557FB8B67768501FF55CF3DB6 +:10521000E805E2B34FB4B64C3FBCAFD9BAD28B7CF1 +:10522000FCB116F6E2BC3F89A8D313F1F38DAA2294 +:10523000FCB1805B417F58D0E9D453ABBF8578FF88 +:1052400062ABDDC026F5DB1C510710B1AE6331E760 +:10525000A76D8EF778F99ECF909EF5BBADF256F50F +:10526000C4839918EF040C71BF9145C97EAEDBF27F +:105270006139DA23F5AC9BF444FC7738FE85345A67 +:10528000BFE6E929BDEBE5FE4BBDE0FBFA8ED59FFD +:10529000A95E2C5BE5BB52F823D3544F3AC5952643 +:1052A000B0094837890716E1F6F08A271F2E7A0FD2 +:1052B000E038BDE59FBD8A256EC4F5C3F9F6DB7FF6 +:1052C000F692AF6FBD7E56F8F3B1EF22F49D6F37C3 +:1052D000B7DFD91EFEACB147BDE82FD56CB4FB419A +:1052E0003259CD339B7FFE28F2F5EF1C1467A87E60 +:1052F000E6F05B5743B97A873D7D269F865BC98C74 +:10530000D1A31EFE5F362686FFAAE70FEBBE51FC37 +:10531000FD8FD26274A8DEB15F67A37AE3ADB47D7E +:10532000BFDEE54E408FF6F7CAD1DE5EF1E4973A74 +:10533000CAD527FB149695D7FBFBCA8D87C99E4318 +:105340003C11FD047D7AE8D58B4ED16FBD348EDAE9 +:1053500019B87EF545A791B8F665101F3FFB12C638 +:10536000EF7FEFF0E3FC2B9FFDBE17E7F191D6C076 +:10537000F9F9B195990118B7D21ECE34E8C9DF57B3 +:105380003E7E27F1D9A2637766523C8005726CB4E9 +:10539000868673707E0B36DC40F35BC842C46F9523 +:1053A0008FA9C108C6B334367D470279784DC8C38A +:1053B000479B1CB8F6B08F50C1A27FF8BA4AFB04D5 +:1053C0008CDD41F1863BE53E045B42E5CF9D9C4E82 +:1053D0009B559B8C6F382D7CBAE59E4EA4CFA9417E +:1053E000812C8C4F021EC2025F0AEA1DF5D8D42C14 +:1053F0004E1FE6D38AC577A0174BF13DB6EFB40731 +:105400005C4596EFC43AC6C75F2AC607B893D01E5C +:10541000FB2813EC9B04F3FB52957A19EC0D137FD8 +:1054200099E49ACBF9967BB95C4B398FCC9A8EF57F +:105430007F7A83CB0F7E87EB3AC015CDA2FAFDDFD2 +:1054400051480F385834913C6FB10B79B6D6CBFD2B +:1054500049805BC3F529C627D07F1AE19FECB4854C +:10546000EBE03B935EAEC7F1A89D1E7B6F5AD7174A +:1054700009F97F5915FBA342FED9062EF77DDBBD46 +:1054800061EE1FD8233F7F14E515E413D7999A677F +:10549000EC419CF7A7DB0FBE750BF0F5A7ED524E64 +:1054A000AD7A335E4E2B778E6789E4F453B79F2530 +:1054B0009453789F504EDD5DC4C7FFD97A53E2ED17 +:1054C0006C9CDE947AB02FFCC5EBC135AA2FA11ECF +:1054D00084BF3758716FBE93FC26F9ACEAE9DAC194 +:1054E000143792FC28F9AD871F25BFC5CFD38AB7E3 +:1054F000F8FA1785BE9174B62F67610FC64BF7AAED +:10550000E45F9F03985A80BEE7B6E74530EEBCD211 +:10551000C5E317E78C6E6F1A3C57A6F2727786DEEA +:1055200082FA41BEEF76F1F8F6B960B737D5E457A5 +:10553000BCB747F5FAA0BE2BC2A627F23740F3123C +:105540001C5DACAF7A1E0F9EAABA7397A1DFDEA6D0 +:10555000D27E7645D34D5EDC073EB767C84F503FDD +:105560002D78050C4C80F71CDA812938BD808679AE +:1055700009B70B7A7FCCC20F4D86F9DDBE87FB0BD6 +:10558000156BE2EC7BF7521DF50DD8F727AC716D6A +:10559000CE3755A29FCA0DD6FA2AB686E85615C749 +:1055A0004721E1074ED0041F8D66A3851FC6E31770 +:1055B000425F4D550B7F8276C6B9A33CAE787E8F95 +:1055C0004AF83FBF5D8960DC87E2BB9390FEDD3A1D +:1055D00033F9CBA791DFF4BEE5F8F40B7F28BE1BAF +:1055E0009AD4EC7ABBE8A7F03CBDEB7705BFC4F2D8 +:1055F0002F7E9BFB36EBDDBE74DF9F69FFF8DC3E40 +:1056000007C1716EDFCBB97763F925871FE13CB71E +:10561000DC41FB67E17D9EC830AC1F04F4C67573A6 +:10562000EF97455DB4EE34139DE66B7CBFE3FC9EC3 +:10563000FF7857C1FC833D0E1FCEA37E1FCF0BA961 +:105640007FC9457197737BBF2C0EB9FF7EF3A9D339 +:105650005988F8CFC3E6EC447E4DE5FB00F5BF9CCE +:10566000B4B909F7C33BF6EBB8BF52FAABBF16A10A +:105670007E39B793DB0967ED5D8FE33E68AD367425 +:10568000B91DE51E6DB6FE6077DA174C091726C204 +:105690000BC7C339C003CE0BF052897AB12F7C34CB +:1056A0006BDCDFFCEF878FCF6EC3F16BF64C20B95C +:1056B00089E14509F0F79E8853A1F9F3F7FBBE2C69 +:1056C00042BBE7D3F6265AC72F35EFCDFFE3E6AD51 +:1056D000442F67DE07FE9BF3FF748DAF4BF172D052 +:1056E0009BCF7F7117959FF5F809DECB94FF13FFD1 +:1056F000D3E8BE13E8EEBD34DD15FB7FD7795F8AB2 +:10570000EEAF08BA7B0CCC2B38B7F7AF142F97F35A +:10571000BFD4BC7DFF8FCE5BDA3FAB6CFEB67C683E +:10572000BF86453B7D00E7CAE1B3DB30CC046E4267 +:1057300030913D12B473FF4855781C860DE27121FB +:1057400026FC094A01F3611C6521D9759ABB85ECD9 +:105750004CA6F93B03808F5523E7FB2957838D39EE +:105760001EC2F2C0C97E8A6FC6F955CD0A0B2860E9 +:10577000EF6923BF7114ED7CFB705BD45144CFF70C +:10578000F0798F8863D90DDDE24FB8E3FC0197CF44 +:105790005AEF10FD39D998B67CCC53706B4604C6CD +:1057A0007797B4D17CDCC3186B33ED033A98E97B6F +:1057B000E8AF1003B026FBF1EBE2AFA9077F633A35 +:1057C0000388BF11368A6B51521FE1C31F59457EB2 +:1057D00026F71F63F86CE9443C6A0CFC3F3E3FF23D +:1057E0001B99F01735D18536DC167059DB09BFE8F7 +:1057F00092F4E1F4C8AD11F45962A187C47F02BAF2 +:1058000058E821F1FB75E9124F8F78BC7FC7CEE3D2 +:105810006DF174B2E47764703F240A7EC8CBDB3745 +:1058200053BCE3CC53EF7D0BDB57FF52654EE8E7EB +:10583000EC760F8BA2FC6A111DFDA9AA0E35619CA6 +:1058400057DAE5D5CF7968BCAA9D8EC84CF8BE6AF8 +:10585000D7FB4564372DEF3E3200E3024F299C7E93 +:10586000E1AE22DCB7ABD2B87F10DFDF063B8F0B97 +:105870009C7E31790EC61F946D3C5FB1AAFD26BB9C +:10588000C3C46FFFCBCEF35EA11DC973F84985D6A3 +:105890009BDEF071BFE0F4930A876FB73D82798F8A +:1058A00055DB36EA21F42BB77D4671ECD2E79EF149 +:1058B0007691BFA85AFDE76D2AD1139E44BF783F69 +:1058C000B6AEA396FC84BA76E127C6F951D5CFEDE2 +:1058D000DD1506D4543FFF8417E32FA73AB77AC9E2 +:1058E0003FDDC6FD4FCDAD25F64F2FE597B6DF9BCB +:1058F000D02F3D85FF007F62BF3DCE9FDFD6EFF208 +:10590000F62F9FF9FC718C939EDEF9E9E30877CDC1 +:10591000FFFEE3E368DFB37D2E632BCCB7FEA93730 +:1059200029DE24BF7B5BC8E9D9412C9C03EDCEFE68 +:10593000CE41F92367F77E948BFEDCD91D7FCE44E0 +:10594000BF7EE9DEA95938EFA52F9466B104F22E87 +:105950009FC89791CB8813C6D3E160C741F243CE6D +:105960001C7790DFD7135F68AFE5F11A9F882B6C27 +:105970004F1C8795FE705DC7FBE53C3E26FCE24B65 +:10598000C511DE003A5E7519F4DA2EE24471F43A7C +:1059900083FF00BA7C1947AFCF59E86739B80FD9F0 +:1059A000D1AFCF3842F432F024E3BB47EC019B8EF9 +:1059B00072B033B9874E33914ECF7C9E8BF1F08F0E +:1059C000EDDD64F774EF7518E8DF57EDFD2DC9C5FF +:1059D000D9178E51FC948938EB59D6F3C7E3628A04 +:1059E00098DF160F8F3F087C637CC2E7A5F7220E75 +:1059F000C1F955C627FA8A4B4CD045DE93883BD770 +:105A00006E795B6771711E6522D2E93D4B7C5CCE7D +:105A10003BBE3F03F130C11C5F4B1CF7917E738C82 +:105A20004E3CAE26E36767378AB81BBC1F3806FDBD +:105A3000411EC7A88F28BF6509E450C6D7C6E871C4 +:105A40007218B9BCB8DAA5E0FD5BF1314CE7EB8325 +:105A5000C4CBE9BF24D6C3DFD4B95C4FB78566EAAF +:105A6000A6FDECEF897D16892F09EF69918777FAFA +:105A70002995E2412DED07499FC6CB735D1FE720B5 +:105A80006ED379BCB56EF7FE22D43BA70FBC487C21 +:105A900057B7FD3D3D0CFD1CD9F6BCCEED49CEE718 +:105AA000A8A723263D7DFAD9FD453CEEC7F36EE35A +:105AB000FBAF16FDD7EFB1F65FBFFD334BFFD5E16E +:105AC00076DAFFBAD438A7B4C04D38DF539D768656 +:105AD000FAEE54BB3A3D92C80ED4ED967DD0966353 +:105AE0003AAD57E35E4FA2FCDCA5C7A6BF9D82FB83 +:105AF00074206668FF763471BEEAF8716000D2A542 +:105B0000E3D82D2AAE1BBB108F263BB8F88D8652EA +:105B10000FC86BF13BC171C856F17A60C2719B0529 +:105B20006E18270BF57133F483F9F4983F84FBA3C7 +:105B3000AAB77C3AC2A31A36C39570FDE4FDD9DD3D +:105B4000418676B9DDB0E62B67CF1671B4A8356F04 +:105B50003D5B67C3711F9CD992FCB81FB064446061 +:105B6000F461CCAB5F904D71E29C6FF3EFCE18EE19 +:105B7000B0EDAAD8BE6DF205E81FF3606C91B57365 +:105B8000E1BB64AD5DC17D007832A4CB9DB6D0266B +:105B90003D03DBE9CC07AAF1715DD128FF429C7B74 +:105BA00091FDC9767DED07CB7348AA807F88D80F19 +:105BB0001EC4BA14DC0FDEE0E1E79106BBD3E9BCFA +:105BC000D16661B7F970DF15DB3558D7ED4B9E47CD +:105BD0006AB596D34B4BEE18EC073F58BFAB540356 +:105BE0007D907E53C98E0106EE4BAF2BC5BCFBF4F6 +:105BF000274A46E740798EA3A88CEAFFB564742E45 +:105C000094BFDF3AA98CEAAB15CA0BDCAB77978659 +:105C1000DD31F9CC00E316F32D406E0FA0DC9E09B8 +:105C20009E6EC1DADA1BBED0F9791816C4F90F9A44 +:105C3000C8E73FD0FDCE0E9CEF605B5713F2DFCF7D +:105C4000F67E998AED7CCCA0791AACD9C07D7978A2 +:105C500035F1AB8BE4FFC4E7C1487E7F2E39F41BDE +:105C600084E3DEF9C31F2E479D5AE3273E8ADF27D0 +:105C700066463AD1A542D005E1749AF2902BF12400 +:105C800002E99B3203C751C235EA57577E7D784EF1 +:105C90004A7E11E7C04CE7A43E41381F490ED1337C +:105CA000FE9CD4013DF829F253CEC20BB908BF3C8B +:105CB000FF54BAC84D7181F37B58C491407EE473A0 +:105CC0005323CBD086F65DFFA623F4671C37FF571E +:105CD000BE9D47A1BFAB2A743FA6AE5DB56C5C8686 +:105CE0003696F109A13D21E8968DB444F9BA8BF1BD +:105CF00073390E25807EE3B9EF1BA47F0756CC24B1 +:105D0000FFE25C725E3BE64F9CBB9BE701C00AAFC3 +:105D1000A01C0CDA931245FF07F8F88B383EFEC240 +:105D2000BACE58C73DF7956F7717F56788FEC0D094 +:105D3000C944B9E17FE7546E679F6BF4111C60168C +:105D4000EEC7F5F472C7CB7658CFE901DEFB3B4CCA +:105D500078CF75F449BF3C07A71F3DE3E9B7D0D919 +:105D6000908B725C156C2F47D7F4A385771523535E +:105D7000BFA987AEC0F635733A8FF09CA18602DCCE +:105D800067EB4D5F7E1E2B73CFBC263BC62B903E30 +:105D9000BEDE74BC6A993F43EB67A1EB5884FFAA4F +:105DA0003D9FD9107E49CF87459E7FFCF7FFE85085 +:105DB000C4B8354D768C93ECD6C99E8D6F371D0FC8 +:105DC000558D8F958B9CC5346E968DC73B7AB7E702 +:105DD000EB5FAC5F279DCBEA8B1F8B0CDE1FE0FFD8 +:105DE0001B66FC7FAB6FFCCFC276807F7A7E0DFC9A +:105DF000DF84EDFBC2BFB4A3AB855EA8C67D14E013 +:105E0000A30F03B33387C2F8E5AA9BE460F156956C +:105E1000E40FDACFCCC98CE991C5931AF6E37C176D +:105E20003FA610BF568873A69F8ABCFEF87CA88543 +:105E300073C2B4BFD32B2F2A12E7D7C5E5BBD7C790 +:105E4000F87630CF53E3E7B6542117A58B0A53D029 +:105E50001EDA67F7FD2BD9D9AFA86C5302FC6F444B +:105E60002633D1755083CD9227CB2A522DFD962D06 +:105E70002AA47DEF251EDF45FDAAC1CBACEB765EE3 +:105E8000D87ACE6848ABF59CD1B0B6FE96F657AC42 +:105E9000CFB7D48F888CB4D45FB96D8CA53CAAFDE4 +:105EA0006A4BFBAB764FB1944747BF61693FF6E859 +:105EB0006C4B797CE72D96F6138ECFB7D44FEAAAB8 +:105EC000B2D45FF3F1124BF91FBA7F68B5536C8CF3 +:105ED000F4234B52485F1E6A9C988BF9D86C9C52F5 +:105EE00086F82C15F98487EED06D86179F0536034A +:105EF000F4D681053369DD3F744766C047CFE200C1 +:105F0000FA354C9D3C2E51BEE6546352AE392FAA51 +:105F1000D469B7E8B7A986B5BCCB21F6FD0673BE38 +:105F2000F9659C7CD91B2647C13264FD170FCDC291 +:105F3000F140CEF6093DB7EFB2F45C6643319641CD +:105F4000CE0E25923326D6D912C14FF00CE8981FF9 +:105F500059E6A1F538802F7DF43EAC81BC4C71FA36 +:105F6000071EC679D9FCE9C88465738287787F6289 +:105F70005D66C36D5F675D96729E6D13F96B693CDC +:105F80007FED91050529CC84DF3F386CC28E6EE32E +:105F90004FE3A8AB276F35DFFCFEE324CD942FA79A +:105FA0002C9A49F922D97DE8453D3B7FC616D0C7DA +:105FB0007A8E8F9EF27DCB1C5BC23CB06EA147A552 +:105FC000BD3522666F75233DCE64BFFE10E629D530 +:105FD000CDED267B2BDBD676C7119CD7ABAA885F8D +:105FE000FAF8F92A61272F98F1C01D47705FFA5F10 +:105FF00086917E92E36C689C3E43339D231FD88735 +:10600000DF74A593C3F378E3F0191594B76DF0F33B +:10601000A2A2FFDC706D39DACD8345BEE943B6C478 +:10602000F92E6ED14F16921CE135DC24276716BE7F +:10603000E3D5601E8FC2EAE5C47DDBAB3A8BB91DA8 +:1060400016F0E339D4DCE8AD0F61FBDC6C8DF25D5A +:10605000E3C7CF9A1B6ACD83F935A7D9FC6E2A779F +:106060002BD8DEF123C6FA41FBE6FFAD123CCD078B +:106070002651FE87C3DDC0703F55CEEB60DAA384A6 +:106080001FB52399D64126F6C565BCF5F3EC8A4EBB +:10609000B4373E5F67A7F13E87391AD0FFE71D2A64 +:1060A000EDBB1E494B8ADAA0ACB67A68FDCE45DB63 +:1060B00013DA2FECF0447C7931BC68EB27D37918E4 +:1060C000C7403EFFE63477C49D47F34EC7794B384F +:1060D000E5BC07F5E1679608B873AEE839A7C1904B +:1060E0008F5543A37E17A4F2739891C689825ED61A +:1060F000F9B464CFBEFE663C3FF486CA3035C4D7DF +:10610000D546F35F08F3C7786F3C7ECFF8F2BEB098 +:10611000A9046709C2A9AE2FA779503BF8AEF6676C +:106120000A7B340FF930349DE8DADF46E7027BD989 +:10613000074E2E5F339C3C2F57CF2E98B1A51F3EA4 +:1061400087925C7CD3D9E7BA1F74727D44CFAF715C +:10615000BF00ADFF521FA9019BB073B95EEAB19FAA +:10616000F4D0779D19B1B29AF2A322ECB76FFB6C11 +:10617000C77E1DED333723FB59EACDBEEC33B4CBDC +:1061800090DFA45DB6386E9E30BF1A31BF9A44F3DB +:10619000EBA56F6F699076CD12E745ECCA0C3DB167 +:1061A0003E7A52D0A1DED019C59B688D02BDB3D80E +:1061B00046E78D99167199CF976F704ABB6ECF7E67 +:1061C0001DF10CF3463C6783FF5C4E7AC79E302F6F +:1061D000FC52FE48FEEAC29D47B13FB07311FAF38C +:1061E0006DBE94B48BD817F665AFBACC787DC02954 +:1061F000F2B963787C50E0F1C184784C073CDA2C2A +:10620000F6E1AE021FE1F1A7CE8BD88767BEFD6E27 +:1062100031AE476705BEEA7AFC5CAE9FFBC32285C0 +:10622000F1AA5ACC5F76F232EE07ADC0263998DF7C +:106230001C7C02FBAFDF6D3D77F863278F9331370E +:106240003F372BFBCB14FA1EFCEA7FFCD0477AFFCA +:106250009F703E31FFBAAB18FDAB152F5C91827673 +:1062600059D9AE9B0D7C9E4F1F4AEBD9995D8E008C +:10627000C279268DE7EB9DD935E108C61F3E6D3CFE +:106280009A6FD6F7679E3D566C877ECEEC3C56AC37 +:10629000517E70C46217D67EF59B623C8725F3AAB7 +:1062A0007BF8C5C9D789752E1ED7C8C8D45B305FA7 +:1062B000FC42522AE1EBC14CDBFD89E235A83E6984 +:1062C000DFDEA3D33EE59211BE156E8CD7E41994A0 +:1062D00087BB4209E42CC07D96594E3FEE03A4E7EC +:1062E000B3E1792988C21073033E1D87DAE8B869E3 +:1062F00052A7B11FCD2319C7D14AB9BEEDBE41A7E0 +:10630000BCB164CDF7F05C2867CFD168BD93711D37 +:1063100047323F972CE33A3DF0BC62A77568495E6F +:10632000A8AD04BE5B32298DBEF3CE7A8BF8E59C16 +:10633000CF16B6E37CB46E8AEFFCA47178C650C069 +:10634000A391639B4136CD5F005BA6FC7FAFC6C2C5 +:106350002960DFAC06FE1F0AFCDFD1E8A4F62D6041 +:106360001F1A69744F42EC9E0F93DCEC6C34A8DD6D +:10637000CF1BB3E9BB071A7DF4ECB12318FF8ECA1B +:1063800009F4EB7FD6F3BE467E9F882CFF711CD8A4 +:106390006940EFF4094055C04BBA387F2EEB1F6DB2 +:1063A0007C6548D950810CC067FF1A63E3AA8BC093 +:1063B0009BEE88A4E211E32B5D2C5C3611F3FCBA52 +:1063C000EF2F4FC5F311F794958D003CE2FEF6D503 +:1063D000402AD703CD783E35A7C6D78471BF9CDD50 +:1063E0004A3BAE5F39BBD796E03E02B4A37383B29B +:1063F000DF0C17D773C9071F51F247E1E602DF9799 +:10640000677B932389CE978E73713DE777F1FDC14A +:10641000D5625FBD7B969BF462F24117F14BCE9E35 +:106420002B697FCFDDC7BE727C3FC907FF4C71600F +:10643000B7D2B61FF729D9026E7F4A7EEAEB3B6CD2 +:10644000AF5F46FB737E8DE2C260F6D2FCCECC1A03 +:1064500048F8C6F6663D7E4E4F6C9705049E56DAA8 +:1064600013C7E935C6C719D7D94DFB99786F13E221 +:106470003BE78D3605FDF5330ACFC7E80FF8D8099D +:10648000E59CC96D74AFD373CE50B90BBEFB93714D +:10649000BC602580E32AFC7D2E7E27F1A116E94E03 +:1064A000D427397BDEE3E77C6C5D3AE6BF2DBAF793 +:1064B000798A3FAA7A308F9757AEC4F8648637B886 +:1064C00011F984859F2F3B047CF2A038B78C6F5064 +:1064D000EFAD768972B8BD39007CB2DACECB8BEEE7 +:1064E0007D8EF866B53DB818CF3D63B919FA5F9D4A +:1064F000DA9E6D83B2BBE999E6A383B02CDB3FD370 +:106500001C9E0C76A84BEAE7600EE2BDA76C4079B2 +:1065100094A9ACF13273F2A79C5FEDC13F1F190043 +:10652000FC52B787DF73D383B7DD6B155C8F7EDEDC +:1065300078D4D7AC093991FA03D6F92BB219F929D5 +:106540007A4489E42B78DF476BA6395FE5BBC98ABB +:10655000885BC0F7E6F863DCB9363A2A83EB73331D +:10656000CF0B89A7EB9B49256D4919781E35B44A95 +:10657000453DF88CDDA0BCFA2E8DF4F6699957DF05 +:1065800060277BB0469C73B52F0FAD1A817271AB3B +:10659000E6C7F842755E5B09DA43D52FE6F99B58EA +:1065A0002C4FB73AB53D738C3B96A72BCB2B445C55 +:1065B0002A2BB52135B510F763D6E6E27E491D6B6F +:1065C000BBED8708EF6B2A437EFF64FFA414BC7702 +:1065D000A816CA1807ABED38A687A0DDD549FCBEC2 +:1065E0009BBA0EE01B37BF872650C0D846CD484225 +:1065F0003DFFF340C348348937BB7E5DE6FA07C6EA +:106600009EC80F1848E75FDD7BBCD98965DD18C1DE +:106610004663F9DF9A91CFAA47DB28CF9285FFED39 +:106620005060A8D8EF8572AB6BD05473DC3B479CAD +:1066300033ACDFE0A6F360B02E6F42FEAE5B6F0BB3 +:10664000E3FE99CDD949E7807EE562823ED6F353D9 +:10665000EB14AE0FC30B783C75E98CB46FD0F9A97D +:1066600095F946F82271DDCA0B49744E4A96AF4E31 +:10667000F251FF955A98F6912A2F78E97CD5DF6F71 +:106680003CA7E5BC56EFF1DC048F1CAF26361ED1CB +:10669000F5E098571F1A0A745BBAC36E7398F86EC8 +:1066A000E90EB13FEF0A64613F193AC733437F10E7 +:1066B000788DEEB8E1E5B0960DFA5FCA77F87C7395 +:1066C000D964A45BAC9E59E53F80FEF87D49B2FCDD +:1066D0001FCD650313B44F8A6B9F2FFB575762FF83 +:1066E000F1F06424C5CA4E68AFFDD5D15346F8D643 +:1066F000DAE2FA4B9365F74A1C5FF255EBBDE98786 +:10670000C3C057F7A5B695A0FEEF5EC07C788F1684 +:10671000F2ABDFA46F5B5D5CAE2B2FE45BE81DC3C7 +:106720007B81852E1F35665BF63D17CD5D4AFBB339 +:10673000AD2E412F16E6E76C360C6011533CE8FF96 +:10674000C3F1B7C271751F70FCE37F311C3ECB787B +:106750003138865AE0FB5BE1D87463C137F2A0C9D7 +:10676000834AD8998FEBC28F795E9C9A5AE66BC2A6 +:106770007D991F6B14D71FC678BE4BBEC68E6A6349 +:10678000507EDA02180761CBB9BD02EF5BED63689A +:106790001D227F61C81EC73CCCDBC8AF0C2CC627AE +:1067A0001B5848FB3E729F948938A1DCE71966B0FC +:1067B00012BCF7EF44D23C5AA7F28373AB31AEAEB2 +:1067C0007AC625E17AF8A02D12C6F1C20FF0F13297 +:1067D0006C917627DA4BDEA106AE77195EAEFFD854 +:1067E000AA425AFF36D9F247DE0170AC544A925E93 +:1067F000413CA7E6537C1CDFE33D3B9BC4BAA5A606 +:10680000FA0D5CA73689756B85D0EFF27D725A70F0 +:106810001EDA113F59356DAA7312EAA1406B3F5839 +:106820006FEE5F356D65F6245C6F7CF94E585FEE58 +:106830004F9AB6D20993D9D4E4EB6FA4C6CAC3FE6B +:106840000AAB35E989692B03A0779ADD4BAAD0CE34 +:1068500081FAC3E8273E9126F50EAFCF977A0AF565 +:1068600012E831B5A9A71C46BD94DFA377A691DE37 +:10687000D9F2B84AE5A5301EDA31308F30DE0FD6B6 +:106880003D4C23FFC805B02441D935229FF6CF6087 +:10689000DE2C09FDFF11BC5EEE77E8C36CB4DF812E +:1068A000ED118FAE1CDE5E9FC5CF4BEB1E37F96D31 +:1068B00072FF4415FB7749224F453166911FEC5C0E +:1068C000336609FA51CEA1D6FD693D2E9F458DCF85 +:1068D0006F7147C9EE6A4B12F1EB7E2C9BEE4D10A7 +:1068E000EFC1521E83CFCC9B9B4BE83E3D0F333014 +:1068F0009F3A3B1465667B493E1DB08EFA4C72E3AD +:1069000070B340A27C8A85C9DC1E765FD0B89FA890 +:10691000807D83EBA847D8E1C23EB2CB7B8EE2D626 +:106920005D692FD9C57D7A4B674CC9C27349AA3BB3 +:10693000E0443B67BF3186F66954E6BFBEC464EFEE +:10694000344767507C5233020CED9C57859DA31A47 +:106950007E66B6735A1AC10187B56A737101DD5F2D +:10696000F3A82BEA1C82F47DD0E647BD71704C552C +:1069700058C1F8E4324672BAB938730AEE336CD4AF +:106980008229B7A2BCBC01E3F938DDF83EF70A055D +:10699000E3E99F3B8329A80FEE4B65163FEAFA64B3 +:1069A000EE8F6C4DE2FA47FA092D004F14E0D02E1D +:1069B0008CA4FB7C460BBB549F5B46F1324C03C25C +:1069C000F8A78335840D77ECBE3A47B6CD92FFA881 +:1069D0005D28A278E2D6243E8E1CF71E71DFA02C23 +:1069E0003B59038F1B038F27F2DF6A059C0EB0878C +:1069F0007C649FC4EDFFF7B68FC85E91F4E9B15394 +:106A0000147E2EB42FFBA8FE82CDA26763E7D97552 +:106A1000D2CB67C57D01320FC42DF4594B76A8ED5A +:106A20009ABCD8FD009AC8075923EE0560D95AB719 +:106A3000F91C7E32C663A0BE59E48524C79DEB775E +:106A4000B99792BFE01AAE59CE81395988BE73F812 +:106A5000ACEFB5ECF8FB02C23D796094B7A8B14742 +:106A600014BA1C80DBBB03441ED699E47729DE08E8 +:106A7000F6EE4127ED4BF073A2321EF675EDE357AB +:106A8000D1AE22BF70FA68EC7711AE4718CF66C15D +:106A90001CBEE9D8CE286F28C9DFC5F89D63646F96 +:106AA000A952CF859F6F463F2AC36CDF99ECB52B67 +:106AB000573FDFDC5C487E079517DDDB467A70A523 +:106AC0004B96575319D6AB28FA3D6C97C387FC04F5 +:106AD000DF07506ED88D05642FABF9E0D202DC657C +:106AE00078FF21EE0FEC726C427B16FCDAF92E5324 +:106AF0009CEC8CE7782E2B4CD85FD8D25FEED7EB8E +:106B00000FC6EFC03C23595FE65D1F55F9773EFC89 +:106B10008E0DEC7C370CFD3FF88283EE2591F72C2F +:106B2000C7F3EB9464EEBFA3DE30E773EA732B0286 +:106B3000C89C523E1DD949963C7029AFDA85E124A4 +:106B40009FF2BB5793F8FEB1A60528AEA65D282498 +:106B5000F9DF2AE8DAD2685C629CB43EC61943FDCC +:106B6000F43D4EB1D0134CEC8F6986F91E99BEE40A +:106B7000357E3F305EBFC9A7D46FFB44FFF392ADB3 +:106B8000F1E5AAF5ED4790857E680B55248FC7BCCB +:106B9000AF77BCB814D7D8A245286F77F67E5F8749 +:106BA00093FBBE8813146CBBE300B26B4372684363 +:106BB0001294AB92C53E4036AC6B2AAE5B3C6FE99B +:106BC00011ACC7FC8690EFE1A9A8A7669553FCFA23 +:106BD000B9E4E06FF0BB7B671753AC40C2BDBA911C +:106BE000E7DB497DE9467C417B87D6C0E39EEE40EA +:106BF00014ED8B0792DF9CAA211F6A5C0E96AD3EB6 +:106C0000B012E3224ECD4F7CE574DB7CB8BE3BC1B5 +:106C1000BFC375AFC96DA378D20ABC07380FCF1BAD +:106C2000CC34505E9778F2B3D845F4A3762153E87C +:106C30005FEBBD3A7FFF71D2E9FB5EF7F71C9C1456 +:106C4000C5FE343FA3FC1944C2FB26BD2AD7F5F884 +:106C5000EFE2FB97F894F8756821C2AB8E76430299 +:106C6000B89E4CB6EEDB6649FD99FA564114DED665 +:106C70002A5D5EB44F402F3E897C5237AAFBD78AEB +:106C80008FF46926B767C2F2BE02CBFD48322EAF41 +:106C9000BAB95D23E15FF2CA834EF3BE533CBCF147 +:106CA000EBA5BBD09A9FE11C9814775F70131F4728 +:106CB0000B12DFD827079C28274DC61803ED9566D1 +:106CC000CDF7DB00E595D8C96E063BDC32BE7CDE35 +:106CD00027EE073E26ECA8F87A8FB84F39FEFD67FD +:106CE000C27EB86FFFCDA487FBA21F1EA846FA7A0A +:106CF000F29981E773EC025EEF25FAED8B8FEEDF00 +:106D0000CFE3BADA4467045DACF8F1547B3080E736 +:106D1000C9D4D18CEC5D75101F1F6869605CD83BCD +:106D20002E8D0D37ADB3F70E9DCDEF77CE30E87CCD +:106D30009FEAB10513D999124F8792E53D159C6FD3 +:106D4000B225DF0CFB3DDD836EE29BEE447C7328B5 +:106D500099EB2B84C34CCF7B87E66725A24F4C2F42 +:106D600072BEBA145F7488FB126B1137E0DFD488EF +:106D7000F3F6A7C53D41F393C57D4106B78BE5FD0D +:106D8000171D5A2019EDAAF93DFBD4013A9752E399 +:106D90000AA44C42BE3CC6EDDE8F4AF8BD651FD941 +:106DA000032988E78F8EA94A13EDF3F3BC40996756 +:106DB000F591DDB77A24D4DFFE5335D044D5567B28 +:106DC000EE340B8CFD17B46F77ABB47F94F7C03CF7 +:106DD0007514B4AF00430FF9687EA93B8CEB6FC705 +:106DE000EF1BDE453D74FBE30EDF7218E7D0FAB10E +:106DF0005F60F9E41A8FCF4171B27C05EF155FBA7D +:106E000036CFA0FDA3654CD81943CB4B8732F6147F +:106E1000FE53C69D9D74CFB8A80FB694C1FC4666BC +:106E200074D8DC0053C41D6CC1734E2B9B82D9E80F +:106E3000FF5DBFA6A005E38F999981CE6B411FAF7F +:106E40005833BC1CFDC18E47457FE1112DE8EFFD95 +:106E5000D216CA53A0FEA93553CA292F7788ECFF52 +:106E600046AA9FFFB32BBE386E204E2BCB31665601 +:106E70003C57C2535B5E0ABA7DC164595EA2633956 +:106E80003D9959E260F6983F4971B68E1EFFF1AE0A +:106E9000728C83DD3EA5A15483FEF33C3F6A290436 +:106EA000D198D0566204F0CA5CCF03E5C919786B5B +:106EB0005EA01AD793919E75E5389FF47ED6FED3D7 +:106EC00055114F65EB5BB0BF1EF8C2DB5A30BE2ACE +:106ED000DBBF7EDF5B2DE18131BEFF56EC7EA56F0F +:106EE000BA33E8DEBA231862CB5DD6ADF37C5E918F +:106EF0007F33B0AB88E71589F2F02E9E772DCBD982 +:106F0000BCDCB13CF13AFF132F97B78EA4C4F53F18 +:106F100076737D0170939E4F39CE02DB13C8518585 +:106F2000DB4DED0E839DE74C8BC9D3F50EC6266273 +:106F30007E9393C329FB89FFFE6E310E0B5F9F8604 +:106F40007C3C53F0F910BFC2F394762747F0F71852 +:106F5000C0CBD2BE0DF3D926E211DB5CEC7BB36073 +:106F6000E8CC2416C27B7332FA41B990BE0FEC70A4 +:106F7000C7FA7B8D8B309B3A24B805FB9B9A9533DF +:106F80007A455EAC1F80BBD939C602B736310DEBEE +:106F9000C3FD314ED283CF423E0FE013C2170CF334 +:106FA00034FE7E4047E7C87CD4BF2331E9C6A4E75E +:106FB0008B3B67D3799AA55EB13FE2E3DF6794F23A +:106FC000BC97EE1793F9FD99CECE02F37ED6C36E31 +:106FD000916770CFCC87E91C74A79DD1F9851D25D9 +:106FE00017CD3BACC1B89CC96EACD1A2E48FD560C3 +:106FF0005C6E2CF6F71A9D3FC47E7C22FE8C71B528 +:107000008C1589E92FD7C19A0B060BF7EBAD2F63CF +:10701000FDA7B3F0D84BCF2BD69FD56FECDD9F2EBD +:10702000E2F802EF9AC0BB9E18CE7D924F01DF3688 +:10703000137F2D10FC26F703CFEE1AB1C9BCFF2A2F +:10704000CF0D817E7E1A7F1F21DC9944FE4AB11646 +:10705000B80EDB1777A6D1FE80E40FC91792AE1DDC +:10706000690D146FE97E44A1735CF1701D9670ADDB +:10707000E7F7F665CD0DA9E67BC6A53C40FF1DA24E +:10708000FF7113497E1EE3F20072732BCA2FDEC319 +:1070900082F3F07715997F8F40C25F84BC389EE8F9 +:1070A000C8F1FF824BE4AF70BCF5C67FFF4BD03315 +:1070B00097E859DC7980E659D387DC5679BD3C8F57 +:1070C000ED78D4EB83766304FF77B4BF4FF78A750E +:1070D000EC5699E2E3F346BD55DCA38FC7BF3C05F0 +:1070E000F471564F19F4A50FE9D0A33FA34E67AC36 +:1070F000FD77BDE3A735A3BE14F7F6A6AB7834370A +:1071000006C79FDCDCBE9A184A1CC76AF07A2C7A44 +:10711000EC916553D8FB30FFABDD3CFF6A625798BA +:107120007E5747CA75BC9EEAE7E174343CFF97F48A +:1071300094EB127ACA25F5147F7F186DDE31B8BE44 +:10714000761529603757D80299E87F7D70EC8774EF +:107150003E6591C8CF1985F939B86E1E0FD2BAF2C3 +:107160000956F23C9D819E0CCCD7B6E6E9B02DFCC9 +:107170005C6B3C5FC5F8282CEC370187580FAE7765 +:10718000743DCBE3195679966580B3CE36C454EF7F +:10719000E6EB96A403D0BB99EE3916727C6257D603 +:1071A00046D4B7AF7B789E4DFA90C0689CBF944B95 +:1071B0005857059FD8BE37DBCDF5C6EC04FC3BD94C +:1071C000C3F5EC82F59C6F3AFEBDF43AC47BC7EB85 +:1071D00069A9CB4D7AA24CC8B1EC57EA21F99DAC14 +:1071E0009F22FA9BE6E17251E6E67C877024CA276B +:1071F0002833ADAFC43FAD9C7F60BE61337FBF2EEF +:10720000FA8DE153ACAB02CFB53AE017F0B7CD1E23 +:10721000EE8FF949C59D36EAAF62B787F2322BDAB5 +:10722000391E2BDAF6DBAA4DF889EF6FA987CBD18F +:1072300046710FED611BF01BE2DDCDE13BBB2B87FF +:10724000F4E7220FB71B2EBD6E5C9E9ED928F2314B +:1072500080BE94BF58FBD2808D563DCDFB4BEF17BF +:107260005A81E7F0D21F667ECC29033C45F1DCFF52 +:10727000171EA177F4808EE76DBB1F61B41F3F6CB2 +:107280006E60B40FCAF541F71805FA2B68E37AB8B7 +:10729000781DD83128774EB92EBCB2DD3CDEDD1E1C +:1072A0008FE51C61C57A8EBF6160FF3C8D4FE8E7BA +:1072B00059B2E3393C271E6ABF06E34EF2FB564142 +:1072C000FF4BC1578CF08D8BC187FD53FE8A3BB8B5 +:1072D0001CFBADFBCDCE01E67E1FECE977FE14175B +:1072E000EAF9B5B0EE9074860EE2B98B8A3DA90634 +:1072F000DE9300F26C437F478E5BA1C9DFCBE92AA6 +:10730000C67BC20B7AC69174FDDD33E6F96FF6B821 +:10731000FFAEF4EDD043349FEE1D00AF2F86978E65 +:10732000F679CB5DB84E1C677E5C2724BCC3E6763D +:1073300079315FA45EAC1F305F1BFA2FE93FF5B1D6 +:107340001588B7CE29744F423C5F4B3A0D675C7E7F +:10735000A49F361C03FC50DEE32912FA87919F7B21 +:10736000E2A5BD4FF37B2D385DEAE7723A767942AC +:107370005F7832627208FA9CEE2FAE58D7A38FDA8C +:10738000F9FBCEDCB980CF5F7BA49C5BE9921E6CDD +:1073900077D125B382AFCFBC382AB28AD399C6EF52 +:1073A00068F7441405CFD13634A1BF2DF504C2636C +:1073B000CE5792F0F4D091011D47C5DE0F9BCBFB59 +:1073C000AB0779473EAA511B941C85F400C557B3FF +:1073D000500F4039AB9DB7637BF8FD0D124F353729 +:1073E00041A7E077FE9BA790E621F19535376AAB80 +:1073F00029C47CE503833F30D1F9A8D82F40BCCC09 +:10740000267F83EBEB1A353810FD5696E5A073A85E +:10741000B00E917E39EC629A0BFA7B199EB82E4D14 +:1074200055EFA0734253872824C7A00164BC877E10 +:107430008FEBFA6B9379DED65FBE3F14E79991CC60 +:10744000F910FA718A7E9CB40E8AF5E05F73C1AEC2 +:1074500053627AF9B0A2503F87FFE1CA4D2B9418CE +:107460005F627F683F1D56660DA4F5B22343240773 +:107470007559F2C97AAF675DB9586FF617D1BF8BEE +:10748000F99BCA3DD380A7264C6F8FE295D34D61FF +:1074900075DA3FC1B853C1DF74A1FEF472BE3E9CE1 +:1074A0001756BD08D73085EE573E92142AE4F7F4FC +:1074B000F2713245DC2653E42BA3BD80CF8897EBD5 +:1074C000FF9129FCF903F1CCF4268EF3AC13F5F50A +:1074D000E25EEB552589F3D9067A154BBCE57AB106 +:1074E0006F81F7FF7AB9DF29F26CF93E07D8F7848C +:1074F000DFD27BE6D2BEDDE79D37A4F0FB1BB83EB2 +:10750000F85009FCFA26059F41BA3F2FFCA64AF91C +:10751000EF1F18012FE637D52625CEC32E11F3AB6A +:1075200015F3FFA891DFB7B000F7D3407F8CF5F2D9 +:10753000792C6AFB7639D27BD13A85F6D3E4BEBD8D +:10754000A46FE506D5124F5F80FB69FDFE163FCAAA +:10755000DF871F35CEE247C971E3FDA9138DD996A8 +:10756000B8FFFCB621E29E0BDEFE76E627B86F6F11 +:107570001D60D9FF63AD1997770F28F84FE184F0AC +:10758000E9A46FE5FB138D4E1636C3F1F150CA7BAB +:1075900018E80DDD8CF48DC191CCC26638D864FE3C +:1075A000BB572E1E77053B9CFB2FF0DCE8263B9D4E +:1075B000EEA9ED898381FE3052501F95CCF38E8F5A +:1075C000F90D52BE6A2627F61FC6093F779C9BFB22 +:1075D000C729C7A53F9DE443BD28EDF1F8EF1A7A0E +:1075E000F8D66A4F5E2AFE00FC1B36FB47F1FDB65B +:1075F000887EBF3EBFE4F7C12F05FF257E77F1E40B +:1076000010C5F7F0F221CC45995066F5831EF5F2CE +:10761000F5FC516F327D2FEDEA8AB9D6768F63BBC8 +:10762000F1F84CBEAC788ED97E5786A0FEE3FDC93A +:10763000DFDDC93BF53AE57FFE0EFD44E8EF584A31 +:10764000602BF2C71A912FBFF1AF07B36F477BE8EA +:107650005FECB45F5FF2D8D21598CFEC6E570C3A5E +:107660007FB4DB2A0FDF5CD63EB802F0D12EE8549F +:10767000E3E7F3A8F147F5A16ECCAFE6E30F6CDFCB +:10768000AF68267E1B58C9DBBDE4B55BE233FBB0B7 +:107690000CFDECF11AD26FD93F231DDB0734B40384 +:1076A000FAE3EFDD003CFD1B18D9D1FDC729D4FF5B +:1076B00037C76D54F0F7B7E43C5B6DB30A0DF8AE15 +:1076C0003533D98FEBCD00237408E5ABE69D681404 +:1076D00097C709EF746AE85F8D320287F1BD9C9706 +:1076E0004F35FAA3DD9EFC0E87AFAD27AEC4D71B86 +:1076F000C6560B3B7413B7C7547694717B9CD6F572 +:10770000CCE5C369DD93F3C94C13EB46260B61FE50 +:1077100031B46F253BC5C9D7FDCCE5FCF7F2243D5C +:10772000637EE68831E8670E5913D5E6C3772F6D7F +:10773000B025BC5FE37D817798C7BBE6795C4A5F83 +:10774000C976F63EE28C92DF93A727F6DF19BB9F3E +:10775000EA4B1E4BBF85E4B259A7FB1025FE471923 +:10776000C1CF109EFEED1B15C4CD0991577062D597 +:10777000D30ADA91DF5FCC0C35013FF5C8EBB29D3F +:10778000832B4C7A13FA277A6C8CCB1397F116570C +:107790000AF77FE61B4196329EF276C97F5EBC8572 +:1077A000FFEE469FF8B84C7C2995DC2EAF99C37F3D +:1077B00077B4E4318DE85DDDCC7F77B066FB0E3ABF +:1077C00067C77EC4FC28EF35ED3B940A18B77AFBF7 +:1077D0000E6581097F036A22945F7D8547EE3B44F5 +:1077E000C96E8EE76B8C17A09D72C4C5E5FD7489C8 +:1077F0003B8CFB10A7EDA11A6C773A27D98FFB942D +:1078000012DF2FEF9846F71D78763AA2F86CB56D27 +:10781000CA7642BBD691BA1FF96894111A86784984 +:10782000D3821DF87D6ABAC78FFB183E071B43EB56 +:10783000F565E261421C3F4CF81197939B52BC42A4 +:107840002E18E53D5D9BE291F613E9A723763E8F66 +:107850009D8CC31BF106C6A5201F1EE5BF9BD0BF94 +:1078600026AA60BE48FCB8317E0A5C8DF05F3E9C63 +:10787000ED3AEAF56AA1674A1EDBA2BC6F827B067D +:107880001A55C89FDB372A1827837AD233D09E61D6 +:107890005E52FFEDDC2FAD86FA0526BD22E7914052 +:1078A000BF04713EEE773A0F71FD12E5FB0202DE76 +:1078B000787ACE4DF1D1F8E5601ED07B3D3C1CFDC1 +:1078C000E223F949D49F94F778F99C2BF8BCFF8602 +:1078D0002D8ACD4DFB2764474AF864BB6329534288 +:1078E00088AF09D33B090FB51B349ACF543D38F408 +:1078F0000E933CD4A5703BEEC04DEFD2FD3FEB7E26 +:10790000718CF8B116FC69F227DA8EE937E0BA1209 +:107910007E52C5FDAEEBB849C21E12F7625DD7C1FB +:10792000F56F6DC70E0DEF91947C9A77EA00DDA795 +:1079300055DBEE60E84701FF2D45FCC4F3A9C48F79 +:10794000D4AF7DD113F410F793C2BA88E785F2D093 +:10795000CF91FA3922EC51E6E6EFD78A79C5F827BC +:10796000D49262D1AF2E928BBC53630E605E66AD33 +:107970005FA1F392E9A5E277C84C7099FDBE78FD4E +:107980008871C320F7E373679BCEA9F5E879F1FD11 +:107990003AA4377F1FE5EF593EAED712FE78FA457D +:1079A00053B85E4FC0678FE13CE2D731B9AEE73DD7 +:1079B000BE53C3FB9224FF5C877437F1CFF6147E6D +:1079C000EFEEF6148DFA7FA884EF3B3E64E7EBD729 +:1079D000434D4ECAA37CF9669ED7E5B9458FE2F3C5 +:1079E000B06D7E0DD61FEECFE168B52DA773772061 +:1079F00097CF205D0FDCE4655C3F727DB8EE79AE19 +:107A0000CF6AC26EF2736B42DFA9A07CD774979FD6 +:107A1000EE010D1DD26FF0F4E62BDFCEFDF4FBC7B7 +:107A2000D7B573F99374007D4AFC25E541E23586AC +:107A30004F8E77294F921E11B9CF03FCC2ED23EE72 +:107A400057158A739195CEC011BB0FFD161E7F2D61 +:107A500014E72365FC75BEA04B912DF81ACEB357E1 +:107A6000FCF532FD83EA65AF8EC0DF0FABCA3E4A3C +:107A70004F29B7E0BF5AE4FB6D41F703C25F3C21D9 +:107A8000F444F5B87692CBEA0F1A489EDDD3B95E7E +:107A900073BF63D5C78CDD27E6BB86BE9B9ADC5ED1 +:107AA0008EFBC7537FA618E8D7F705E7223C2F8641 +:107AB0007EDE8683DE79885FF13B52F25CCD1F85E6 +:107AC000DE39BD4D15BFABD9A05FCCFEBE547F2CB7 +:107AD000FA8642F79A08DFF0F4F6D2491FA27FBA7D +:107AE0002D857EE7E4D3EDDFFEC187E9F83B22D7A1 +:107AF000FAD14E485F1124FEE9CE70F937F178ECE7 +:107B0000748C5735B51FF4E2399C4F9EBE6A0CEA5F +:107B1000ED2483CBFDA9E7D5658897FF0324F17B8E +:107B20003E008000000000001F8B080000000000E5 +:107B3000000BD57D097854D5D9F0B973670B9949F5 +:107B400066924C36B24C02045412262161916D9219 +:107B50001016599CB014906D640901421220ED87F3 +:107B6000D57E190CA5C823355A1770EB049762B55A +:107B70003568B441830E0808553F47848A15EC8860 +:107B80001441423245DBE25F5AFFF3BEE79CCCDC96 +:107B90003B1350BFDAE7FFC3E3733CF7DC7B96F798 +:107BA000BCFBFB9E3377FEEAF9B1A38A0959ED9538 +:107BB000120D8490CE5DBFFC577A1221D54FD65955 +:107BC000245A6F7AF6757DC04488C6DBC29EEF8A60 +:107BD000B7C07BE79FB8772C194CDB5B9BB0FDF3FC +:107BE000275AB0BEFF57CFBFF67FE87B35AE3807C8 +:107BF000BCF7F98BFBF4F0BCC6AD75B6D292B80FEA +:107C0000E8679B69E9794626C9844C21ECEFC1DD20 +:107C1000FBF4F67C5A6FA5A3D2EFC95CBD77400E8A +:107C2000FDAE75B776A909DEF0125242C7FDD5E266 +:107C3000916EA8B7DB08490B3DDFA2271E63022D1A +:107C4000FB101243CB0BA5268F144FD75566DA02D3 +:107C5000E585DFC4CCF5D2EF6AF5813C2BCC6730EB +:107C600071423DD5A2C1EF6B5AD7EA6A4DF83DF695 +:107C7000F3071D2150E6130F393B88AE9F9027BFB5 +:107C80001E0AE3FD96101BBE3722A68890390B3ED4 +:107C900091603EB183EB75AB719ECFB276BAEAF0DC +:107CA000F6610D743C3AEED7F0372E5416594C3825 +:107CB0003E05087E97DE56996187F527191CB07E30 +:107CC000B1BEF46A7793993EBFA9C1ED90ED84BC33 +:107CD00072EEE884BEB4FEAB41D250195E97A5C5E2 +:107CE0002EDA7FADC784E3ACD950463EA5F31D0F15 +:107CF000BB48BF4FB690A41BE97A2AB424C9042517 +:107D000021C77445D0FF53D86E371027A178607F04 +:107D10007DCE531BE9270FEADC6925D0CF16BFDEE5 +:107D20000EE5936CFEF47B8BA908FBB3DC08DF1B2C +:107D3000C93AF8AE7BE3D4A4AD12F6EBD72584E6BE +:107D40004D48306B763EEBAF18E034C93317DE2771 +:107D5000763DAEEF737805F7D153B0301FCA6D6C26 +:107D6000BE1AE2067C49D6D312E1EACEA9A478B3C2 +:107D7000C452BAD052122A93FBB076355C5B78FBC2 +:107D800027162796645722212323DF13A580FFFEA1 +:107D9000395DFA001DF7FE573F41BCAD05BC85F1CA +:107DA000DD67F4B00E81B7CBE013BA0F0FEEF90424 +:107DB000F17659BB84F0A96D2FD52FA5E58546270F +:107DC000F9544BEB1CFF1E94025580D79E3D319613 +:107DD000A7289CBA047E367F7256A6CF73DBD3ECFD +:107DE000123CDFC3F0F4A046E301381DDC79434BBD +:107DF00093143ECF8D081FA99A209DD4D613AF812E +:107E0000B6973ED6707432ADAFA9260E039D57AD1E +:107E10000A8F721E3FBD19F0C55A438A63ECB0CE7B +:107E20008F27F4A5FDD7D69012A0D3F4F1CE3D5004 +:107E300027ED121900F56AD73218FFA6A4950E99FE +:107E4000F66F1DEF6A83F16E4A1AE390697F0F6641 +:107E5000B66E36D2764F05B13C0570D0359769695C +:107E6000FDC10ABB854292C2EDC954682783F48ED6 +:107E7000A7008FDDCB6AA0BFDAD4F90EC09308FA51 +:107E8000DFB37110CCB7D6DEC71143DF9FD22E21EE +:107E90005E118F89C0FC6B297CA13EC53BCA0BF3E8 +:107EA000B9C8E127E0D8A5F32F82F975BD64201E7B +:107EB000DA3E653CC357EBF856E41F6FEE997858ED +:107EC0002A08E1A5F965830FEA095A8BE400BE444C +:107ED000661A603E4BF97C9A7564B18B7E679DC4CF +:107EE000FAE977B784FCE259A0271B941A5EEA39B5 +:107EF0009E37B3D2E22970517CB8C8F71FD184F6FF +:107F0000BB9AE3CB9A653EA4A79AE7587F490667D8 +:107F1000E1FA30FC4D2A2748C7BB62C8E24AFA7C26 +:107F20009795956A7C7D8FD375CEE3EB70DF97D202 +:107F30007D877D4DBF9B3E07B851BC00B8D17D44C5 +:107F40003CB8296905EEDBD2BBA55B701F3DC308B9 +:107F5000D46D896C9DEAFE8FF3F5ED8A71154BB4F3 +:107F6000BFA0CDECD829C17C9C9A18A8175A1D3BFC +:107F7000097CEF7A12C6B3A5C4389AC2F81521AEAF +:107F8000620D1DE75CB299EDB7F75DED8C7CA04703 +:107F90003BB6DB64E223C87F48AE2B3FF45D453F30 +:107FA000D65F05EF6F6AB3A780E43278205C383C77 +:107FB000BC1BFBCC0DE7A71F717878AF2373816FD3 +:107FC0001CD4139311FAB7D071687FC93B473DB1F8 +:107FD00015E7D784EB3A60B1605991E82AAEA7FD66 +:107FE000D9FAB91A002E629D6A782CE1F0D83F6761 +:107FF00051A106F07896C9017477FFABD212C46B19 +:108000008F911225E03DA34342F703E882B8B5B84B +:108010001FB5F52E6F74BCAF443AAB4D8A71C4489E +:1080200088F74E947F1E9397E13D937FB19398BC60 +:10803000023E59991FC90F049F01F906F82CE8A2C6 +:10804000766C200FF6F79BF2952E1DA3F32E0A07F0 +:10805000A0234137E65718BD6CDD682F85F6AD9437 +:10806000EEC3F7FB90DE83F47B28B78F03FA8579A4 +:10807000BACC21FEDED7E28AB752F8D56A7C9BB52E +:1080800039217E5CFBCA5D79EE28F827F8B151CB27 +:10809000F89CD11BEB65FDB2F18C14DCE6222C3D83 +:1080A000208F623730F8A8FBC9B50AF96AB49CA1E1 +:1080B000727C3ADDA4F87E844CD2B873613E6B8C3E +:1080C0008143746749D686A01EE6910CB20BE8671F +:1080D00067AC17F856723271BF10A5DF242BE3038B +:1080E000625F9A13181D25C7B1F7C75A995E516888 +:1080F00065783991BF2FE62FF0DFAE717F42E4DE65 +:10810000E598F88ECE0BDBC57CE8F75B0893BF38AB +:10811000DFE43BF3766E0DDB8F101D5D5704FBD45F +:10812000EF6E9F768929348E90A7EAFD87F903FDCB +:10813000C07A2A07F7FE5EF33E468F6A7C9CCEF536 +:10814000299395B0F774BEBF225DAD35939D30BFC6 +:10815000EDC49948E755F7DA40460FCE601EF4FFAC +:108160006682FB19D88FE1E3399ED3E733E8F3D574 +:108170005AE231D03D59BD4BE70D1819CD7C4DFF6A +:108180001B97C0FAEF361B3D32C5F30F13DC0BAD66 +:10819000B4EE29230E1FC8A51F53FE01F4477C250A +:1081A000C05FEA48200EE05C2BFBF308DDFF2BB13B +:1081B000EE25F0FE698D3F0B9E1312407C3D191396 +:1081C0005740687F6D7A5FE67FC1BC8FC86427ED3A +:1081D000E712714E81755CF26B123C741DA7DADFF9 +:1081E000FFCDABF4AB85AF5E5C783B40696BECA236 +:1081F0004768B9C0A8316A8786E071D21C9DBFFE6E +:1082000098E385AD89E95DC18D062FC047FDDEE4A9 +:1082100004F65EDDE574E2490C7FCEF8689D36A871 +:108220000715B2EE7216F1D0714F6948756B143DA7 +:10823000F39495F1AF368AFAD1DA4F733CDBA5237C +:1082400079DB613E2D940F02FCB476E417D5BFC8EC +:10825000716CA5D5B6DCE021D023820F48C8FF4F52 +:10826000EA18DFA17FB38CC342F213D413D00FAB53 +:108270002D1E9F86F28DEA06B34F2EC0E7DAD1B0ED +:10828000771E8B16F8E0122E1797D6BFF995144774 +:10829000DBB5C4389A7EF79969591C8885AA1FAE48 +:1082A0004F06E53B654133D22768B4A08F4BCEA97A +:1082B000F2D7B157D3E7B4A8B723BED0FD9D96E05F +:1082C000F2C27E2F8867F05EB03ED6EB09E37FB343 +:1082D00038BDAAF16C17E0289DEFC712932BEA7105 +:1082E0005E4C289B0AFDFEC3EC7A16F077C1FA8B30 +:1082F0000A7ED625059E7E04F071ADD9F114EB36C9 +:10830000CB15462F87C5B89735B87FDD85FEBC0DE8 +:108310003980F7C1AC0F289C5777182C1E3BB4EB63 +:1083200015FB7FBA9132BEBC30F974AEFF04620215 +:10833000F83B36033E2CDD124B3C8342EB00851BA1 +:10834000F0BBF632C17E9674BC7902F879AD368006 +:10835000F8B3C468C2FDA9BDACC579902DBACE8072 +:10836000F89ECADFC438E721589FE767A3AD676F5F +:10837000A00F53E8735CBFFB6D78FE506C1C71322C +:108380007AF10EA4F3BF64B4C7275078D5E9297EEB +:108390000CC16E5CC630FD8A649895FBDF71E42BDE +:1083A00098CF32A35B0FF27EF9DC7A3DD0E582787C +:1083B0005F896570F8BE8F96BFBEE19BEFFB6ECE06 +:1083C000874EE9295D44A1C3D39C2E26034ED2F2E9 +:1083D000543AA39F5359A4FA0528AFA725FDEE549C +:1083E0002EAF17B1BABA1F7D02A39F53054C5E7919 +:1083F000D631F9A17EEF32DFEF6909CE20C04D3CC6 +:108400001F93C09EBF98E0FC02F089F2C3BF737C4B +:10841000F559697F0B5E3720BE924DC13CD8C79E8F +:1084200075E5F1F926479F57DF04B63EDAEFBF60E6 +:108430003CFA9E13F5F6D762BC608790A9943F037F +:108440003F5E9749801FD371F50936ECD767C5F7B2 +:108450000CB80EB285F2698AB7DD2576DC97ADA53A +:10846000143F814FEC3558804F087C127814813FBF +:108470009C8F09397C33C86119E570624209CA6171 +:108480003DD039ED51CFF4C1FEB8DF8867F237DF58 +:10849000EFBD46B68F94DE3313703C5F7E38BD0966 +:1084A000380B3E79AA8F122F9EE27C70007FAF07B7 +:1084B000CE09ECBDA47E4CEE09FBA084EFFB335645 +:1084C0006529E4D8F0494ABDE4198E6FCF58E3C45A +:1084D000BE1402BC85FC8BD8EF47D97ED3F786C18A +:1084E0007A1618828B12A9FCFA01D58BF445F8DDB7 +:1084F0006EF82EC24F319EC9DDBA7566027A81339D +:10850000C1C2E05F1CCC82FEC8A020F2A12584F28B +:108510001BE9DAFB073E81344A23D3E298DC9164FD +:108520003A20D0CC206287FE28BCA784C35B3DDE06 +:108530004968A27AE0EC04497B16F6A89014C27E42 +:108540002D7AEF0BF342DAE5458BD1A3A172E487D4 +:108550001AF73CE8A7F3B623A8F79FD4FBF29A4D8D +:1085600051DAF5BEC71F9242ED8B9F913D7ACA67E3 +:10857000DAFC9D0FCCA178B9C42F3B60C82577FCED +:10858000F59DE1A04FFB750EB06BA93E71B796CE7D +:10859000FBA486ED27A957FA051A38BD50BD4A4BF2 +:1085A0008685F893D00B5612DF00D01F9612A71EB7 +:1085B000CAD36B574C25145ECB4D0DC8B7CEAF9BBD +:1085C0008CFA7215F160FBD22DBAD3E1F26479B363 +:1085D000B2BE62BBB2BED2ABAC5FF811C3B748BC8F +:1085E000677A98AD3CBA7EF118A7B70BFAE8EDDBD5 +:1085F00038DE96FF6CEA4348FF7E1D31503C69D857 +:108600005B9A42A2BC2FCABACBB9C41B268742FAD6 +:10861000471EF10E85FEAEA03F10FA013BB721C602 +:108620009902F6C885B2E8F37880CFA3EE729F5E18 +:10863000FA8DC37E2FE45E7D9D75978DF85EE4F71D +:1086400026EC97EA5951BFFFAD805342F4F65FF72D +:10865000CC2F15E562E83BBB4AFFCA40B95A77D92F +:10866000A290D3A1F6242657B99F80EEAB07F562FE +:10867000AEF7518168391B1BE263BA3E6C3E826ED5 +:108680003E9588310DFD6AF7723BC25100FAF1A7A1 +:10869000A07F01DD4EB4BF16A0535D7AFBC83C6DD0 +:1086A0006E88AED4EBA1F8F879204C2FD89F604E9D +:1086B000C2711DC401E30A7A58745B45BC9BEEDBB2 +:1086C0009FEE284F710F0EC73B0F8E5FAB177A9F3F +:1086D0004921C7894ACE2F6D3F827ADD32A32B0F05 +:1086E00098D39FF7DE867452455CC9401FDD7B0737 +:1086F00066B9FF17F25DCC67A6E7561DD3E3295094 +:1087000029DDCEE0F399D9C1F44A8DD1A9C3719C7A +:10871000C46E4946539DCD9732592DAD8FE9993F8F +:10872000381D0919CDE72FC1F714BE63784996B8F3 +:108730005361DE0618978E1743BCA950368D74D846 +:10874000A11C27B9B46C1E5EDCE709A43E03DED78A +:108750001803325B279D41327CDF032FAC9B797D70 +:10876000D3AC4B8B96C3739319F98F9ECF434EA412 +:108770007C7310F22523ACDB60F29D87759979E953 +:1087800029637ABA2797389AE86B7D482B81714D17 +:10879000A68B1E58AC855824A8C7582EF9C05EB9C0 +:1087A0006831793443909F1A12819F4A6F57C1BE36 +:1087B00050FECDFC57BDB56B7D682709FE98C0E71C +:1087C000D7C4F9631A61704822AE7D4E8AD7F799F3 +:1087D000ABA6923810E36E1C7F47DCA4C3305F0069 +:1087E0003CCAF949DAD3E172C6E6D22AF85FCA5C1C +:1087F000653DCDADAC1BC9490BE8A392CF95FA7589 +:1088000022DA7F83C09FA3E3FC66561F362F813F89 +:1088100079899CBF733DC4C5FD01B5097A827EC4C8 +:1088200064A3910C41BD242F91F9073EA63B4DED69 +:10883000C620F2F3C271CE010F50386F7E4F76DC46 +:1088400049F769B3D9BE510BFADE3C89E9F7DA562C +:108850001FF8875A16591D5BA13DC679CF3FA1FD70 +:108860003D9980BE55077EF94478D1520ADFB56440 +:1088700059F0BDA4F220FA53837711D4A722F0F463 +:108880000A9D3F85F713880CB49F6596D5CFD1F725 +:10889000D35CB10E29ACFD4968A7F394385EC0F3F0 +:1088A00071C3C0FE657FFD3A0AFD4EF06F386594D6 +:1088B00087751D856F98E83CFAB90B1D80B6FD3BA6 +:1088C00078FC25C9E065F1074AB5741EB38D6C1EAE +:1088D000751DA53797D0F6FEFEA104E210B187ED15 +:1088E000F36BA04943ED6EF8AE2C16FD5EC7B8FFE2 +:1088F00089707E305C456FA342F88FED85A24ED51E +:1089000006E730E6D6C07A12A30307117F8C3E6FCC +:1089100024A13FF8BE3CD41FF2A3F1A1E610BDD1C3 +:10892000A515191D4D35F4BD839513110FEBC0EE40 +:10893000A2FB315CEBDB07F43D8A9785BC244B9AA4 +:10894000119E5B37FAF6EB72C0D5E292A13ECC7273 +:108950005713F43746F2619935F7DE2640AB7DA018 +:108960009C217EB92B801E3757100BE85F4D231CCE +:108970000E0B6D9A3397F96767CF357AC1DF3F5B8E +:108980004B585C4CEBCEF901A5AB1F2C607E61A867 +:108990002F08F3BB8838C8316AC7EC8EA20FEC4BA6 +:1089A00064724A7C5FB749AF8837ED4D3461FB1381 +:1089B00089133C89A8A7B97380FE3627727D6C1095 +:1089C00019047C258CEEB722DD97BED51B5F50B60F +:1089D00073BE30DBF90B1DEAF19C3F083EEC023A16 +:1089E000A4DFF925A70EE0F7611983FFD1D295C85E +:1089F0001FE610373EA708A27385FB9B2685E94337 +:108A0000749CD92EA57E3467AEB22EF0558C3BCF28 +:108A1000AD6C9F21F4DB494AFD76C17F5DB1A21C9C +:108A20004C797ACDD7D9185F413F411DDD27165FBC +:108A3000D1B278CB26BD17F4A4BAF6B5076D40477E +:108A400077104E47BBA56518FFD92D2D0FD323FAFC +:108A5000D67825E0FB03E99AFCB8AF418C2B1DD3F7 +:108A600079F741BCE5D84ABA623ACF37F42C6E792F +:108A7000208678C06F2DF0D33C83F95D291A63FC02 +:108A800024C312EB007CDAA229423FED9638B323CF +:108A9000DC2FBA7523C5BB30FFACDDC0428CC77A72 +:108AA000B17F8F24323BE74189F9C93DF38C68EFF0 +:108AB000D9FAB91471099B4C4E80BFD19368473CD9 +:108AC0007A90FB4320AE3794965E89E9333DDFCB45 +:108AD0006413FA2755FCC796E8C0B8802D3E1FFDE9 +:108AE000FB733B0A9F447E638A710C9042FDCF75F5 +:108AF000B7689783FFA0A345BBCC14C2BB93025FAA +:108B000063492CE06B8FBFEF0503FAFB7EA871056C +:108B1000002F6BF4BE02A2C4E7C0D5E4D80A8E2FA2 +:108B2000BA32D7BCE5743EDDEFE899FFEB0E82F474 +:108B3000FAE21E2BFA2BB53308CA934DA504F1A116 +:108B4000BB4542FDED336B35DA019BA46694135DA2 +:108B5000091370FF56990EA05D5BFDA8EE74B8DE98 +:108B6000B5EA49657D35F1A35D5DF35C043E23FF05 +:108B700012FCB1B64DF91DE9AFE48F859CEF17B932 +:108B80001C332B60EA731DFD985D4D7C06BA8E92F6 +:108B9000B7F5DC4FBC80C94DF2B404FA56B7F99C66 +:108BA000CCE89CF1E312DE9F5A0E95707D6A2CE5AD +:108BB0005B607F0AFD88BE8FF5039A0E3955139AC4 +:108BC0005731FF4EE865826F8B7D291D41C8088AA9 +:108BD000F7B9497C5F73492EEC2BED1FE901504238 +:108BE0009F80FD7BC06E1BC5C7A3FBEE0139EBD197 +:108BF00018BD80479BA57AE4D346C2F9B5E446BECA +:108C0000FC3B8F4706B88E24F533A7D2F7461BFDF1 +:108C1000B1000F8A0F7949B6109E34115FD66E49A4 +:108C2000812FD8DE697D2B2ABE08F9E2FB90E91777 +:108C300053E88AA19F0A08F8D0F280C4ECC289A642 +:108C4000FBB5F0FD5B9AC9880F9388570BF3ABB067 +:108C500028F77962AAB23ED91E8107328CEBE4F084 +:108C60009C3248D9EE147C8D28F95A0EB982FB4CFF +:108C7000EE3AF443F00BC46E208340EFA01A22D2E8 +:108C80009B9A1F4C4AEA355E3229294ABCA49BFBB9 +:108C90007F6F2481AAE7A4487CE93AB8414E0DC30E +:108CA0002B81C7AFF0FC0AE9751E972D66FEC090B8 +:108CB0009C67F8328CD76E047CA3EFAF1478924D8A +:108CC000B2014FC6B4C7F8640AD742DECF8D8037F1 +:108CD000452179EED398ECFA5CC00FC716598ED4B3 +:108CE000DB9313EC882743354EC49312E24884FD8E +:108CF00019616C6DD2C2FCF70CEFEB3629F0620DF6 +:108D0000E28544F102E92A422E2ADB557823F6EF68 +:108D100030D79727124F7F188FB2B103A02FFB7265 +:108D200018DE541027E2C99BB99379DCDAADC57E11 +:108D300088521E961B9578A0C62B3AA2267C5C35DD +:108D40009EF58637D98037421E265E1B6FEE49326C +:108D500029F4EA30BCB927A9A477BC51E38BE027FA +:108D6000BB632CE5A097D6554BC88787BED3BF09F8 +:108D7000EA03D7E460FECB6EAB03F5D6BA7AD65ED3 +:108D8000EC77CA901FD3AF81B7E7B8CAA15EB781AD +:108D9000C5294A8EB1FC99FE77B0F6C23BEBDF30B5 +:108DA000837CF7B0EF5F39BF598EA3EDDECDFCFBBE +:108DB000D2E672A8D76D61DF7F067126BABFC34EB7 +:108DC000789BE0F97577E73898F9C9F4D9711C4FA9 +:108DD000774B2FBC81DF35B3EF561C32F621A80745 +:108DE00033BD752C5FE7B847D93A933EBD69929D74 +:108DF000E2EFF2A007F5A6B39A9A61C86F7AB13391 +:108E00004BA5E60C2829DE209F711A295EE7B238AF +:108E1000E44E3AC45B49CC9F21E277904F109E3FCD +:108E2000F0561293F7E2BDE404C2E2CD0F9BD11FCE +:108E30002CE28BBE87880474066BE4F23F6ABC7137 +:108E400062BF7A8C334ECC1671C68076091DB7F09E +:108E5000EB2F2644F3A71C4D627AEA399E1F219E10 +:108E6000577B73348017BB0149D20148F5BF07BD5A +:108E700009FDAF4C6878C808D857560F24D56CDD6B +:108E8000428DF4159A7AAD07844C16B5BF68D7D3D6 +:108E9000FDC4171F1739FF895AE203F944B46CFE69 +:108EA000554D540E4A21BE345BB09DD103904E67A0 +:108EB000F17DBA28F8CD503214F8CD6CBE6F3F303A +:108EC000D6EB98BC6CD6A9E8FF2F48FF3B7AD59B20 +:108ED00095ED2AFE50CDC7ADE2FAF24A1244BDE04C +:108EE000ACE4C5F2DC0EA62FAF361D43BDA2FB617C +:108EF000A627D69000EA1D6AFFE1EA5DCAFA9A56F3 +:108F000065BDAE5D59EFCEF7E038DD3BD60C03FF13 +:108F10005DF5F677D02F5C2DF88457C927A882C459 +:108F2000F8C443D7A3DF4663A47CA218C0D507F3D7 +:108F30004D86126722F00310B25FD3FA5DF0491A32 +:108F4000AD6B5C093694339312CF88F1658CE7BE24 +:108F5000E3B487F6A5C72E54F18942E18FE99F80DB +:108F6000FE2AC1370AB95E4226A9EDC6FB91FE86EC +:108F7000F25ABE8DFB53B8DD23F40CFA3DEA197E9C +:108F80008DC9ABD184EB155EA4C72223951348424B +:108F90000E23B3579A896A7F0B6D57B79B94EDAA3E +:108FA000FD1776CB30BEFFF388BB2FECC72CE23A1F +:108FB00008F2E1E887D50A7BE9C33F4E10FE14B4FE +:108FC0009BBEBDBDE4FB4EF652CFBEC750FD919691 +:108FD000E533260F7800E2E36D3198F75927B17D2C +:108FE0004E9E772C2BDC7F78B491D8B46174DF343B +:108FF000D96084F860938ED91333A69C1AB6248C5A +:109000006F3C6F2C9D0DF0DA2CF97FF411D81747C7 +:10901000648279351D36DCF74BCDF439C5B74B8FFB +:10902000DEE0F0D0C717742CDEF899545F05A95024 +:10903000621E551B7E1FA3A5726C85EC7D2D00F171 +:1090400055C9FB720D6D3BAE772F85FE576B7C7A51 +:10905000E6B7F3639C54F4DFBB1FD2837C4CBF9F05 +:10906000C9C5A0D4C7C1FCB89EBCF078D39264E651 +:109070006FFA30C15507E308B927E20927D74E8CAC +:1090800007D1F02571C6439C53D242CC2E723CC806 +:109090002BD814E6573E19133D2E70878DF1579843 +:1090A0003EF0F734ABF32736E0B7DCFE3BC7E35DB9 +:1090B000E7E258FC6B8B8DC9810EFEDDE3BC3CC73B +:1090C000E363E7129476A378CFCBBF3BD368346ECB +:1090D0000ADB4FFB43867A2FE653F1FC9106C2EC84 +:1090E000A43DD696AD61F1D0676DA51D000F5B3F25 +:1090F000A73E0DE0B787C961884743DC78A4C5FD6A +:1091000020B4D7DA8913E2AEC41ED0CF84F823D8B6 +:109110009DA83F307CE98E61A598D7B3B6CA0E589A +:109120006FF7DA00EE674FBD92F1C7676D2E1CB77F +:109130007BB668E7F56D01BEFFCC7F20FCD9BDC5CD +:10914000C3D4F12F2A38989E1DC3F8983AEEBD502B +:10915000F0311EF75EC0F9D0C20EE61F5F64249B9B +:10916000FBD2F6C51D29CC5E8CF3E429E2DE9ED845 +:109170006F95EF20F0B33BD3DF13AF7D382C5EBB90 +:1091800086C7FBD688F5B529D777C4D66BBCF688D9 +:109190002D4ABC569D17F032C8F7FE2178AEB3B009 +:1091A000F557C835E57AE013CB08E691AF3BB2B48A +:1091B000C948EBEBEE02CF1FFC317D750D87576F71 +:1091C000F3B3B934C4AEF013F721F630BB38CD9DFC +:1091D000A0A8A3061C9687D9B73A5DF17D667DAE3F +:1091E000E2FDEC0DD72BDA733C458A7ABF2D372A86 +:1091F000DE1FD05CA6A80FDC7E93E2FD42D22F1EBC +:10920000E3B18765F09590EBBC3314ED37ECBA45CC +:10921000F1FD67A4FEC1D1F4BDB618260788C7E9E1 +:109220001F3C2C94779CDFBA44F17D93D43ACC4711 +:10923000DF5FE667FEF621EDAB14FD5D889BC0ECB9 +:10924000081E7FACA7FF181FB7CBA80FB54BE46172 +:1092500029321E59DD71EFE6BE2452AFA07F28E708 +:109260005751390F7A945ACF30279B93101FD24908 +:10927000FAD7617415C20313EA61971E95D19F5600 +:1092800048063E341AE1A3235E7BE47E5D22CCCF08 +:1092900073E939B303FC652B8E2C45FC33A42AF10A +:1092A00020C6AEC483D8414A3C303B94FB1E3F42AB +:1092B000B9EF6A385B9D4A3C107014704E9CA4C490 +:1092C0000B01DF11F41FC0B788040F619EB5577200 +:1092D000F84894786F7B0BAEE35A7ADB70153C87C5 +:1092E0001E703699104E2CEF4AE84906EE9F56FB49 +:1092F000CD85FE313199EB3DBC1FE1E7DE2C795085 +:10930000CFE989678DF065F97240DFA927CC5FE26C +:109310009A926C8BEA57C3E7BDF9D5041C853EB31E +:109320001AF4193ACE72E246BE7486EB332B4CF730 +:10933000635CF0C21F197CAB8917F9F5B78D978371 +:109340009E48C2FC8D6A384A1D92CF0C74C0F976D3 +:109350003AE9107CDB8D791314ED8CC314F105A56B +:109360001E4A9C52387F127AA9184FC053F02D31F3 +:109370009E81D4CBA940072A3E4606A9F554A5DF15 +:1093800043F84970B0B038C6F09EF804B313437E7A +:109390002FE6E790B3739A08E8DF16E1D7F0CF879E +:1093A000E7C2AFA1B6EFAF15179DE991028FE44474 +:1093B000C643457C952EF3D38FE8C7A3257B268C27 +:1093C00037E3958136A289E697739C7895F6236BEF +:1093D0008289E1FE32E1BF7E530AE0BC7F409C3FC0 +:1093E0002561FA422D699D303F07FC9F546EC541AF +:1093F000C9FC3EA45DAD97B278A286AE04F07B3581 +:10940000098B17E684DAB12E47D6459ECBB5E4FB2F +:109410000D2916EEEF60F93984F33761BFF5662F39 +:109420008978FE413D85495128AFE5E5646E6716B0 +:109430009002E89FD2D52BC9689F533A94C2E9AEF7 +:10944000270F06DB23E84EB57E11CF97CDC5E87711 +:10945000591ABEDE6F000FA147FC8BAE0DF6E7FE7A +:10946000643BD6D7F439F907273417FB15F98C7507 +:109470007A963F4C5A95FAF3C7C91AAE4F38E56F42 +:1094800002A7DEF781E785F17DF8A6FA90C80B13F5 +:10949000F03B23F86008DEE7147CACC76EEB81F785 +:1094A000B9687C4EC0E36289FF69D827D97C2C1942 +:1094B000E0FC0FB3EB22BC9F79227056D284E655B4 +:1094C0002177623EE8A57619EDA4DA312C4FA87613 +:1094D0000F06CD49578701E382D5ED6FA07ED6D91F +:1094E000481969FFDEE1D4B35E15BC7BB357C47A7B +:1094F00074294A7C13F922749D312951F3017AE0D1 +:10950000A06CE77010794A15F2E0F840985D728817 +:10951000EF7B8CD6159F42C72F7E3F230EE0532151 +:10952000771C4A07383448785E699C8178C0DF9F91 +:10953000C6CFAD8D08D43B2C141EA919263C7F3410 +:10954000F087B20BE299A71AD627C0F9AACF1BE978 +:10955000D0D4EE1828695C886FE4858F7F5C0C712D +:10956000B60598A7BCD0C0E2FF393F8AF5F5A37CC9 +:10957000E2753D3102BDE972EBF17C46D02AA3BD14 +:10958000912493F1805F02CE49B16C1DE279E963C9 +:109590004F4A90CF249E8F6B0A0E5D07F94CB0EFB7 +:1095A00025A1758E2B0F0EAD3785E02CF204893680 +:1095B0009835238C3E8E7078D4DAF49B411E761950 +:1095C000B91DC8ED4162D1221F69E0F1F69303A8ED +:1095D000458AFDF8CC9097551BE38C1F0EFE2EC8D4 +:1095E00027A0C5971667BC15D76F47BDB981EB5744 +:1095F0005D3CCFBB6172590AD853BDE53F4D4D610B +:109600007A7E0D8F838BE7355A1FE62DD540DE71AC +:1096100058DED3B7CD3B16F9E6BDC2C1AA255A0A1A +:10962000875A89B8AEF6DEABFF92A3DABBEB5334B0 +:1096300057CD835B952229F2DC6A21CF8D3E6AD813 +:10964000539A42A2F4D7236F2EDFA8C8271379D2EA +:10965000B597C7623E59F9CF3AF19C20F46337853C +:10966000F2DC7A83F3916406E75AC80F1B1AFE9C5A +:10967000E151A8FF24DC875F0300C1DFD12EA35F87 +:10968000F6D7873593764699EF76BEFEEB6D5AA4F2 +:109690008F1B7CC4D912657CF19E38470270AECC1A +:1096A0008F9C5F5B596011CC1FF257A38DB795E378 +:1096B0008B98775B42A08AE3399EE3E8A95B94FB31 +:1096C000F80CDFC7B69B0259781E6972F47C7AB138 +:1096D000DFC3B4F512C02360761F44BD730EAD0C1A +:1096E0008173003E0DCBA36274D6DBBE87E0AD5123 +:1096F000E41546C25B8FFB2CFA1376C9F9ED32C62E +:10970000FDCF1FE574499C2689D2D7AD5C6E9D279D +:109710002C7E70BE59427B64899B900D94BFDCFA0D +:10972000E46A8CDF543D357433882B787E07E5235B +:10973000B7A6123296964B3629E3B7CBEE8E88D772 +:109740009070F948D54FB4AFABEE577E574DEEFE53 +:109750000BE83FD52AFD6620F777ED4DE1F6C230E4 +:10976000320CF8FBBAA7BED043EA6E6FF8FE39A5FB +:10977000EBFE5AE083162CDF4D711E003EFF718A0E +:10978000FB4DE0DBDDEF31385CAAB9C4F8FEA3493C +:10979000286F0CC09CE9FF1AE6B338ECCF28BB80D9 +:1097A000F89BC1C0F41BA1D7C9F27A398EB68FFCE1 +:1097B000734302EC5FD2B3132781DE6F7B36D60989 +:1097C000F0DA5AEA2C043FC0D64A13E633180D2CBF +:1097D000FEEBFDF5C8FD100EE8DF7A6F19D8A196F3 +:1097E0008E7D3EF0936CD1FC05CFA16C19CBF2DDE0 +:1097F000C438751D95BB613E59B398DCD89AE32CEB +:10980000B484F54BB89E56CB61D6BD77E03D70FE73 +:10981000FD91C3A826D3F5E5A23FEE7AC2F653E444 +:1098200055C1D8E1FA6827953F909C27EAD7B74AF7 +:109830003E1D5DCF9AB6DD18C7A8B9D3973C1FE48B +:10984000CC335A8C0389F925BD9E5606F11E215F43 +:10985000E64B1694FF42DF9E47C41F8B17CDE57879 +:10986000308FEBD9F363197C971047167C778B9177 +:10987000C4819F7A7E796B09CA9FD53A2BE835223D +:10988000EED1BB3E10DD5F54FBB4999DA795827964 +:10989000D0C9E7D4FE20CC6F14F57C52522AE3AF36 +:1098A000B5795CEFEB4F9C1067AB7D6D600BF805F5 +:1098B0000C7D583C96F21DE38822D47B8D60CFACA2 +:1098C0007C35C6C7FCD65E7E6ED6590879217533C5 +:1098D000328A303FE104E51F66388F18C8423AA546 +:1098E0007C45A2B22D7FBB65AA16CE0DA653BD8ABC +:1098F000D6E7A7664DD5527CAFCD0D546968BD69DA +:10990000FB7056BF3E7016EADBB697B17A51A04A9B +:10991000A6F55DDB5DEC7B30F02862BDB47DCE54F6 +:109920000FE813562EAF1D013C475CFBCA404DB8F3 +:10993000BFB22595F1A5CFB9DFF5F31CB27806C00B +:109940007B5000CFA989F77E9A2AF45C96E72BD644 +:1099500029BE23A9D1FB1F9DCAFCC42BF9F9DF71D5 +:10996000B1644B0C8B5779E228FC0F740CC4785B04 +:109970004E6A028717EDA738D48F80A3E84F8CBBBF +:109980000AE42AF05B1DF39B8AF6C9A98C3FD271C9 +:1099900036E1388319FC6B676414C2BED1FDD2F284 +:1099A000FDD232FBB385CD8FF66B2D40FE3E14FC0D +:1099B000DE07AED0F77342F356E3C70F387EAC6CC8 +:1099C0006271C6A0B51FE2D1B858A6EF9162E53A20 +:1099D0007671F8B5A45A997DD5B31F29128ED3C4D8 +:1099E000E19841E19EFFEDD75DFD3DAD3B6CBF9C35 +:1099F000709EFF40FB753BC3D723F2B6453F9F6F78 +:109A0000547D3782E54FD526F4C3EF7E16438CF89C +:109A10009CECECF92EA780E999A07F8AFB1D886752 +:109A20002C3A0B6A38D7E8B9AFA195E711F677B2AF +:109A3000F3CA33A616F3F559F8FA2CC6B07B1A7A96 +:109A4000E8F158306B9639127F7BE0DED3DFE022FD +:109A5000DE9F82AEA3F507F4D1DB7E3CCCF1E3DFE1 +:109A6000B61F629E2A78F6C059353F014FA067FCA9 +:109A70006EB0121FC53CB7A58ABC61155DE77CC7F7 +:109A8000F14AD9776B6EE3F9C076253EAF69CBD149 +:109A9000401C5D7C37097CEDB690DF6D6F2AB7DF27 +:109AA0003248462F7970FB52A3FBEBF0B9DA7EEB1C +:109AB000B6B2FC67B5FFA0DBE6F0C3B93ECF457692 +:109AC0009E7D944ADF8038CC0BA6D0772179A2AC5A +:109AD000C7A531F845FA838278FEB6D850F6A2DDE4 +:109AE00041C847DBD7207F2E8E2F5B9F43EB81ED54 +:109AF00075ACDEB7EC8B1CCABF4F6FAF67F51BCAE6 +:109B0000BEC8857AEA5A561FE77C51C608C2DAA950 +:109B1000E3D342FAC3A7A976A67F946B08E09141EC +:109B20005EEB003929E0D95B596CD0D447D34F3B69 +:109B30007BE899C5294670F93C42D8E701ADC23EA1 +:109B4000EF8E63E793BB419ED2F5FE3DD5FD975462 +:109B5000D053623B17E5D0AEEE8CFD580FFA90E47F +:109B6000A4FA06F83BEC16B200F2EA3AB7BA403F64 +:109B700022AB1C462DC293FB9FE8DABEA6FDBCFAC1 +:109B8000DA33B7F765C3B8601E2339FDD7BDF6D504 +:109B9000DF204E5AF7B9C901EEBD911D3BD6837E39 +:109BA00035B2E3ADAF98BC65E735C4BC47821F91C1 +:109BB0003E1FD16EC0F98FECB86E39BC3FEAFD8E06 +:109BC0007E801F634EFA9A801D74EFFD5D5FC5397C +:109BD0000DF299F45DCE69F4C0E3CF54798A4778E9 +:109BE00024A6D9001E57305FAACB76747300F534D3 +:109BF000E57918AA97639CF512E9E380788138F734 +:109C0000ADF65B9EA8A4EBA3CFC704E90CC2F4E5B4 +:109C10007197A97D1FA6679712ABA25E6E4C53BCCD +:109C20005F61C951B44F4CBD4ED13ED95EA8A84F1B +:109C3000193452F1FE3447A9A27EF388C98AF72B62 +:109C40009D958A7AA1AF55F1FED0C3EDCAF6637631 +:109C5000DC87A1275DE5A0C73BFCEE262887773689 +:109C600097C7DB4984BFB638E06D82E7A3AED497CF +:109C7000F84894732CABDCE8E78F38C752CACEC3E0 +:109C80007769D8390EE19FBD12EB9E9486FE590A82 +:109C9000760AECB1C66022EC57C5E26D983775299B +:109CA00048D09FD5A60FFC7C14C8F98532EABD6D5B +:109CB0003CDFA66D6EBE177C7A27A4C0CB10AFF731 +:109CC0002C64E704C6500D17D70DB14D09F6C9AD88 +:109CD00058772959A9DAA7B58A7A85E536C5FB13DD +:109CE00053372ADA27DBEF52EDD3BD8AFA34C70E99 +:109CF000D53EB5A8F6E91945FB9833812620A37116 +:109D00009D1ED94CE77FE389E672D89751273D0B1A +:109D1000815E8A7DEE2660872507EADF80D247EDE7 +:109D200029F053ED6F4CC5F240A31DFD4C871A0777 +:109D30006179B8D181CF7FDF3802CBB71B9D58FE48 +:109D40004FE3242CFD8D2E2C5B1B5BF1FD171ADBE2 +:109D5000B1A410CC04799194D8730F4326D8F35D45 +:109D60009A402D4452FF3B6D1FF2C5AE3E812EA896 +:109D7000DFE9791DF9E24A30A628BDB54049F7F37D +:109D800067E94E299D96DBD2D873919FD0AA7116B0 +:109D9000827E7D5FDA91BBB59954AFDDE84AB55854 +:109DA00059DD48EBB8D998A775E46EE768427E03A1 +:109DB0002203832647A642BD3B86B56F4B3B82FA02 +:109DC000B58823CF0AC591EF03BA57C7917F73CEE9 +:109DD0006E067FCAD12B03CDB0AEA3DC7FE4248511 +:109DE000BA5B6959AA2DD4815C3CA1D2234459A7FE +:109DF000297D04FA6DD53866637EF04D3A02F9E8A4 +:109E00003324668FF6E881E94C1E754F33A0BD738D +:109E10004CE35C8E794F52F07180D78B3B3E44F817 +:109E2000759B83590087DD3B4EB0BA2DF8B8E40826 +:109E3000ABEBD83A7FBDE383A91E53D4753E9F1682 +:109E4000255EDE96C6CFC7FA9C99207F45FD58A5B2 +:109E5000730DC88963A5CE01309FA32E03D28FC78F +:109E600065F642DE25D13A4B6687F9550AD275B8B8 +:109E70008E597A4667E41639EAB9F3A9E94CCFC29C +:109E80007D037B6E5E2CEAE1C734D1CF8D2FE3F0EA +:109E9000B9D027BA7F65793A93836533CDD85F7798 +:109EA000430CC671BB5D03510FEAAEA750A2F4D1BB +:109EB0007DAEFEE24BD86E10212E8C57CEE77CEAA9 +:109EC000371DEBFF7A9CBEFF7143AC0379B8E57A8E +:109ED000944FB7F09717261A516F593823B30CE4F3 +:109EE000D27C1EF75A64D62663F84B6BD5C39542D5 +:109EF000CB4C859B41FC572555EAADB45E9DB176B0 +:109F00003394ABFADFAB87A39A3583776F06F5718D +:109F10000D25AD12B49702EF34D2792DDE20DB99F6 +:109F2000FD24CE1FAEFE567916020F8FF17C190A62 +:109F30005FB40BABD225855D52C5E1F5651AD7DB61 +:109F4000F249FED7CA78CE65C093CE85EFE4F5E23C +:109F50007757B673BDED0F7A36AEFADE0A31EE0AE8 +:109F6000BEEFC7F4C429811E778B19F1A360EE17E9 +:109F70007796D0F517745834188F177CDCCFEE0F16 +:109F80002B39E3463E37BC33F0F4718278DE0E7431 +:109F9000722D3935D3B311E5C3C82FA9FC01BE78A2 +:109FA000C5FDF1716C4D8A7A2ED3D758CDF9633D3A +:109FB000F2B5038D1BB07EA8D183E5E1C62D9C3F91 +:109FC0003663FBDB8DDB397FF472FEB80B9F773491 +:109FD000CEC5F2B5463796FF30BB32D3812E8C6E9C +:109FE000CCD33CB8C3406488377418104F29053C63 +:109FF000FE4812E4C1182C70FE4E9D0FA3E6B73D3B +:10A00000FBDF16712FC675304E4FFE0BE867D9BDCA +:10A01000E3CF516237033F294DCF9C06FCE3A8DD17 +:10A020006E06BDB5EC615AA7DF1E75DACD3A5A2F20 +:10A030004FCF6275B7DD6CA0F5F10FF3BAC76E8E26 +:10A04000A1F58AF46CF6BD9760B0FAA6F4FED38051 +:10A05000CF9612E900D043B931673CA4CE56584A96 +:10A060000F001D4C4CBD753CD0C19E343BBBEFC2B4 +:10A07000BEF100D4A70C6AD1C2911BA7A970137CB2 +:10A08000579654A985EFC667ACDD04DF4DE87FAF76 +:10A0900036FCBB4983776F82FA54478B16F4C13D77 +:10A0A000692C0E2AFA1175D12EF8ABC8D71AD2E155 +:10A0B000423E5ED0EE423E2EE05236ABF2A7E0A723 +:10A0C000AB6B972C12CC6396D41384879CB8DA2B95 +:10A0D000945A289F9D973EC4BC917E5707F51BB1AB +:10A0E000BE6D6374BEBB283D8A7CF980D329C84D00 +:10A0F000C88BFE40CFEEF5780DD687FEC35BCDB79B +:10A10000627F6E33C8D703694C4E1EE6E5655EFE7E +:10A110009397751A6735C8CFBA741E4F8CA4EBF5A8 +:10A12000E98C6E55E7057A69E774FDC3741E5FE636 +:10A13000F727AC21EC5CD1B5F2B65686DB6F3990CF +:10A140009FD37A08F246D579103570DEA85F643E59 +:10A1500030E58B2CFFB15D9947DA637FF4617C0FAA +:10A160008E3182D1F1F3DED77DDF35D67D5FB475D8 +:10A17000AF242CCF59BD0EE2B6216D89BCE7C8F5DE +:10A1800004A2AF27621DFC9E3E55BE35D58376C224 +:10A190007C2A169B09F86FC2F9C4F1ABF00935DFD0 +:10A1A000F977F1B3ABF09BDFC13CD5FC469C7B5605 +:10A1B00097429F83F352907707F7BE809F7E63B2EA +:10A1C0007B3FD0477759F06F1AB0CF92028867690A +:10A1D00056F741E85FD2B3F8BBC8673DA7F1FC165C +:10A1E000F4A2F7D25722DFE902E140E9F108AD839A +:10A1F000DE33D2E27A0BFA238318FEF496A7799421 +:10A20000CBC5C89228F215BB5BBECA423FD635F01B +:10A21000BD373854C8A303702EE0D2885854793A19 +:10A2200025E2938A20EF3A19F588CE4CBD16CA7FF5 +:10A23000B79DD8999987FDABEDC5CEB4114636EEE2 +:10A24000844950B6EBDDDB6F053B69A401EDA477D3 +:10A25000799EDFF4D35792405E4D977DC90552A495 +:10A260009DD979644199BD20D2DEA4EB1B0FEBBBD5 +:10A2700096DDE932FA13008C6AFBB366C3DF08E4AB +:10A28000478FDA7085C0FD65D7B647890C6CA2E8A8 +:10A2900084E30D284BCE38311D67D8B9FA37A01C9E +:10A2A000F92533CFAF955774E3E5D637D831F1C1EF +:10A2B000CA7B1746BCC5EC555E46DCEBB6CAA3CCE0 +:10A2C000572BF595601E851C8883F2A21440BF971A +:10A2D000AC61F731887B18A81D9BD3D706762FCBAE +:10A2E0009B1A07F9467472153FFE70D1ED48F7319D +:10A2F000A8FFF4D8B12F69304FA04DEB8C1F037627 +:10A30000EC86018E8DB4FE27BFED8157695967F940 +:10A310001B09BFEFAD66C32545BD7363E8BE20C80A +:10A3200087AEF9978C72A786902DB05F3564BF7E9B +:10A330005D981C24AD7FE981FB10CAE72A017028D3 +:10A34000078DD39DF4BB4A6E6F107217AB733B8BB6 +:10A3500078CE4DC3BA8DBFEF59C0DA3345FBC2E9A1 +:10A360004E3A4EE500D1DFDE69584F1375DEDF75DA +:10A37000A2FE007B3F477CFF12ABE78BF1DF67E378 +:10A3800099D9FB373D72DB74E00382BFBBFA2AEF39 +:10A39000F9A1FC7E565FDB55F34A94ED5C1E887B89 +:10A3A0007D2A7E3C39F61DA0E7560973E06AEED09F +:10A3B000A17FFB42426B41F839659187E22A373B26 +:10A3C00041DF5BF3F2C09D32CFCB017DE37E9E8FF8 +:10A3D0005F219B301E71E96EC6E77BD3D7AA36BCDE +:10A3E000A2D8CF88767EEF3206EAE87817B7A56064 +:10A3F0009E3BE9EFC778F8BABE92B8BF11CFB98AD1 +:10A40000BCAFA47EC409F669D2EF62D8BD9667FCE2 +:10A41000C87FAB7EC7FCBD6B76BC81726E896C4712 +:10A420003C7E27C7BD01E0D36566F717566D780DF2 +:10A43000E9B5299BEB0996E0E070787AFA72B91CCD +:10A4400082FFA6BE255785BFB2FD7B86BFDACF2C23 +:10A45000CE49AFFA96F9695D66160775F07D3AAD9B +:10A46000B10FE3F07A1CD67371B93FCF2A43F2B033 +:10A470003F99E51DBD5D0276D0A57A33DE77B460E5 +:10A48000FDA982F0F329A254EBFF9D4047B610BC12 +:10A490009E8BC4EFD66BE077EB7F12BF53B401BD48 +:10A4A00003E2A627D8FD63C3FCA7F5E1F92EFEBEA3 +:10A4B0004CEEC6B7B338913A6FCBDFD7CCF4241E3D +:10A4C0008F5933E3EDD1108F11F4302E96B4827F83 +:10A4D0009DE2B583E3B503F05AE06F282E43BF8BAE +:10A4E000425F21FC25388E80D3079170FDE81A78F1 +:10A4F000FBD17F126FDBA8FE8B71CC9762D07FA25D +:10A5000086F3BF385C05BCE333AE0EE7F88CEF078B +:10A51000CEF11976A5FF81C3BB37F9A4DE1F31EF59 +:10A5200028745AF25DE8F4E7999C4F6903982FAAC2 +:10A53000DEF7E48C887D4FCFB8FABE2BDBBFE77D1A +:10A5400057C34D5DD6F0F8A6FAF9888C5EF9DDBFE9 +:10A55000058EFFBFF9CF17D6EF53B42FDE7044D16D +:10A560007EABE73D457D74C05F0E682EFCE163CF96 +:10A570000551BFFCAE7EF5DEFCE9D35F5CA18178BE +:10A58000DB083FF3E7FF35D3BD2D83C2F95D8DB7FF +:10A59000C94CE13AFC642BBBBFAB3A0FF387D6F34F +:10A5A000397E31FAEF1FDF4EF1E60B62407FA76F75 +:10A5B000DF755A7B7E241E945ED61067581E5AA9FA +:10A5C000D1AA75A2BF8638A3E1CD7D1C6F30FF876D +:10A5D000D2FB5C23D125513A9F3B57C27CA7B9845B +:10A5E000E545D3D2E7A6EDD3B5C407F724579AB40F +:10A5F0003E03C6F994E79A0DFC1E659294A838DFD5 +:10A600002C3B65CC4B9B3D82C5076F31B5E2B9D27F +:10A610007987EFBC783B6D279B3C252CEF5A9C43F8 +:10A62000FBA3E6DBC4FDEECB6074DE2DF138B2A4F3 +:10A63000C37BB222E44106F38F4E9737CA90EF12E4 +:10A640007C8FA0DE2DE88EAEEFB0A1889DB380DFB9 +:10A65000B1A8243ADF403CF77C6F39BC5F73CC8EE5 +:10A6600070A91BB1B100F6B16EBCF489A12064D70A +:10A67000D46DF812FBA9909F6B82F72F9D60AEF00E +:10A68000E19DD44EB187FB2B038B802EAF65FF88F5 +:10A69000799F6CF4213E7DDC7818CB77C7BE5502DC +:10A6A0007A46A0D11FD52FF95DFD03C22F20FC04EF +:10A6B000820F88FBF93A32385F304A7DF15E352DE2 +:10A6C0002B05BFDC1FC95F0F655C5D5F51B67FCF97 +:10A6D000FCF59BE2794D2A938B6AFC56E3B5C06783 +:10A6E000B8FF1B7EBFE016AAEF815C9D4F3CF93599 +:10A6F00094CFCE5DD1AC1B257D77BC5E653A93458A +:10A70000A29C37F9F6FCDC8EEB97CB65B40F447E48 +:10A7100082D887AF3222F4F87F5E432EFEF33F29C2 +:10A720001723E5DA9945DF4DAE11853E909A1981E0 +:10A73000AF199957C75765FBF7BCEEB073308B6400 +:10A740004DE8DC07E40F831ED7ED65E71AAB739A7B +:10A75000F1DE79322218077AE3CABD32E221D13A1A +:10A76000B56961F74E7512DF1F001F578C5E81E7D8 +:10A77000E122EE8B32B5E1F938F5BD51225FB89692 +:10A78000F7A3BE3FAA96E709D7AAF2764A33797EA5 +:10A7900070112962F9154ABD545D763512855FB294 +:10A7A000EB4A23FA01263FF6D2CF3DA343FB707359 +:10A7B0006604BECECCBC3ABE2ADBFFC3F82A9B9F00 +:10A7C000C47351DF165F0D766735CC5BF0E1059001 +:10A7D000C345C75DF0AAC10BBF0F20EEC9EE96D8E6 +:10A7E000BD34DD9F10F41B5DEB9EE591C7DC78AEB8 +:10A7F00073F8DB4E99E511B07C03A1A708BD655441 +:10A80000675066F7E1F3F3503C2FE89BF22F87DFA8 +:10A81000827A8EF0BFFDBBFCD642CEED35DA919E3A +:10A82000857FB038E0423DAE4BE72B817BED3D7B31 +:10A8300062A2EA013B323557BDCFF51F66F70E80A5 +:10A84000FB4CCEDFC5BDAE1532BBF7F9925F46FFBC +:10A850005DC34FDEFFED23F66BDBF575964B51EDD7 +:10A860002251D669D87989A2723BE6ED81BD04FEFA +:10A870003BE1CF53BF7F30BBEC59985F853C1AEF6B +:10A88000D9BCB49DCDA7B77DA9DB10C4F17B6DE722 +:10A89000E3D7ED2DB184DF8BD199D9639F59CE1ABF +:10A8A00043FBFA4DF77F4C70AE42BFF97FDD6E98E7 +:10A8B0002E53D591CAC77CC9CBF453C2F4D405C476 +:10A8C0008FE52212C4D24D583EFD12E2C0721971BA +:10A8D000613927DB1DC8C4FC966032E643BEFC8F9D +:10A8E000C1803717C78E6A86DCB9EF4B4FEB2EB4A9 +:10A8F000E3F8DD2FFD230BF25AAE794F7E9CF38BEC +:10A90000CC28F1E4FF2995317E428AD721BFAFE4FC +:10A91000B72590F12C2E767F720EE24388FFA5B406 +:10A9200008FE07F1D6FC4F342C3F64A584F7BAB675 +:10A930000734485AF9CB73BC704F4F7B1B6BCF5F0A +:10A9400063F54AB49E3F3286B5AFB57AE1DCC342C7 +:10A9500012407A5C0CA71E643807C3F89BB8079DA9 +:10A960006AECB9A0672DEF30B2FC7D12E80F7CBC19 +:10A97000A017FBE6E62CA6EF0FC9657C7B4899D2B1 +:10A980000F61E3ED0DD965F559B4FC719633398B40 +:10A990002E7548827FEB2F8AD12F8FBFCBF2D9C87B +:10A9A000DB307E28BE7B24BBAC2FBCFFBCC4F2CD09 +:10A9B0003D7BF9EF17906072F8BDA273B2CB73A024 +:10A9C000BF415984DF531F1DAEF0FB75AE28F69CC6 +:10A9D000C8671C023615FAC3D9FD54CF4BAC3E32C2 +:10A9E0002BF9E64D26F4E17B40AF7D24DB5D84F35B +:10A9F000D7136282F93F66F0EE44FDB33E0BFC9143 +:10AA00002B1E3768402FF8908A553857F251A31102 +:10AA1000CB53D4CE85F24FD4CE85F2136AE742F9F8 +:10AA200029B573A15C7ED9419186906359CE29598D +:10AA3000B650BC4D3DDFF1598CAFF68CBF578FE35C +:10AA40003764BB11BE3DFBBD8778211EF2BC359833 +:10AA50009E70157CEB9DCF30B888F89FBAFD463EBE +:10AA60008F82362DCAF182F6405C55D87BF3B2D87E +:10AA7000EFA9E5BF7406CF8976597AE0EB94E892A6 +:10AA8000A76B587D5ED660846F43B6B31ED64DE982 +:10AA90007B219405EDEFDF07E77968FF9847D02D1C +:10AAA000051F443D5FB50E351CC4BA9EB7FAB7C248 +:10AAB000F7CFBF940B2BA1FC8630BA013C92A2AD1C +:10AAC0007723CEF76643B018CEA9DCFCB51C356FF2 +:10AAD000B821BB14E16C12F826E0C4F7EBBBD275C9 +:10AAE0004F3C9BE32911F76C00EFB4831CBA1207AB +:10AAF0007A5D258FD7B7B7F57F17D6E7392C930145 +:10AB000076C45F05DD3DC1F74794F97BF52ED8A7E4 +:10AB1000E7F79EED0FF7B0D27DE90FF7B2FE226B9B +:10AB200000B68BEFF2477EF5F02F92F07DFCDDD082 +:10AB300079A4A502F249E61BF71D84252DB47C52A9 +:10AB400001F9248B53A54350DE6ACF990079242262 +:10AB5000DF7DE9A0D243404A531D95A88F9502732B +:10AB6000099307E5C6587E29B4903F898AFAC4D470 +:10AB7000BE8AF727DBFB29DAA70CBA41D12EC69D86 +:10AB8000EA18AA786F48423017EC2FBA0E760FF603 +:10AB90005332E6DDE5BF74ECA61B687DFAD3B3F152 +:10ABA000DEBFE779FBF417CAF1F708BB293CF5547F +:10ABB000913A37E2AE077F019DA9F4FB9ABD4F1C85 +:10ABC00072DAAFA2DF5F43AF17FC757587B104F887 +:10ABD000EB37D5F3D5FBE2CB52EAFDBDE14B0F3DA0 +:10ABE0004876862FFCDE2D35BE107227C73F564EA5 +:10ABF0003FCACE817D5B3EF667E06361E7307B4A0A +:10AC000095BF6D88DEF1EE7AF0BFBF23133C57C7C6 +:10AC1000CFE755C1FFCB213C27CB5A7E0AF74AD15B +:10AC2000E71ED03FE11CA893F67F398BEB4D35FB37 +:10AC30007E9A561C6A270D9F28DE2777489B15F5BC +:10AC40004D39CAFADDA59BC3BFEF8D1F566DBF55A9 +:10AC5000EFC6F39B52D4DF7F15F3A9D81F83F97990 +:10AC6000D320EF843EAA2D7E4F0BF1D569BDC84F8E +:10AC7000C177E6C9A43E5ABB9CCDFA9DBA3F06F304 +:10AC800059BE6DBF1F525862BEE0EF98FCFC30DE2B +:10AC9000AF0DDFF7B86C89DF7B70EF4FFE0671CF29 +:10ACA0003D04F3372F5A19DF2F68FB4CA301F9D766 +:10ACB00087E14B8125A00179D25D1DEB81FCFCBAB7 +:10ACC0009566CCEB1C921BFC83B190A2FA2FEFB9D6 +:10ACD000C748F7ED8F7098314C9E76838D43EBD942 +:10ACE000D9F720BF9FB23FC6A7F90EEBC9A63A1409 +:10ACF000EA1B658CBE1701DE70B902BEF3BA9F92E3 +:10AD00001E3903FC00D60FF5D9BFBCEFDDFB41FFB8 +:10AD10003EC2E81B32E5D476FBFC30BB9D3CCAE862 +:10AD2000D248FF813EB7EA40B31EECB96BD3772B14 +:10AD3000E6CD7C53BA1E99CD7FB7A3773A3E3A85CC +:10AD4000EE4BDD1E76CFC4A58E0178AEB537F95D2A +:10AD5000B75D83F427EA5D1DF224C057F539710110 +:10AD60004F62C953DCE7B46ECCDF67809C5CB75799 +:10AD7000CB923D7A1B678B86D8C3C679FE354335A7 +:10AD8000FB5D4B36FF6E219FF7FE35A174302B37EC +:10AD9000469173542EEB92402E57B2DF5D38BE378A +:10ADA000A50CE07F5C223E3B9EBB6279C63359779F +:10ADB000F0DC84F788A40ED286DF7728ECC8D97B34 +:10ADC000670F003DF20F6D4B8E3B813D64F7C3F181 +:10ADD000E6100FEABDC7ADAE4CF0374CE7F1FEE32D +:10ADE000D66027F0E3E363622588DFD3FE3791B0B6 +:10ADF0007BFB8EEB5C99EC3E0891577CFD77BABFEC +:10AE0000AD42BEA3740AC4AB17100BD89137CB4C1C +:10AE1000AF25AF33BA14FCAE4EF227C03CE764CF87 +:10AE2000F8EF6C3AEF940D3F47BBB2076E5AFEBB8A +:10AE30004FDF50AFEDB15F7749EC9E1207D3F76B50 +:10AE4000475F78600E9C73A376B644E7B3A47D1F7A +:10AE5000DEC7A3B6AB7BEC9BFFA57F34D23E726D01 +:10AE600087F509BFB7DA4EEAD1CB857EF714CB73ED +:10AE70007F63CC435DAB69BDE1A95884E3F9C70D9D +:10AE80001EE0DFE7771AD0DE399F103CB91EEA2FAB +:10AE9000E43B3C385A1E9EEF12F8BD4263FF00E4CB +:10AEA0000EF9BD0EEFDDF8EC3103FECEC7CA27AEBA +:10AEB000DB09F6D36799F6679F03FFDEB336BC0F55 +:10AEC00080A4B2EFA7717A04FAB2D3FD907F6546F1 +:10AED000BD61E58B69C8BFC4FE9D7B2C06CFC19FB9 +:10AEE0003F3C331EFC609D9ADDEC7729659307F8A3 +:10AEF000F0EA9D31A8F711BDFB15587FF9AFA6CD3B +:10AF0000190AE3BF6F23B09EEE8E17D1FF18DADF68 +:10AF1000E872FD52473FC6077AE42CCB9B5D1CBA12 +:10AF2000AFD907FDAF21E23E4496375B244BEC7767 +:10AF30002AB7453F07FE5E36B3D76A84BF2491180F +:10AF400053810EDD84DDFFB86D20DEB77B3E3B41D3 +:10AF5000D0313FEF28F0ED64EDABE82F31B07CBD90 +:10AF60005EEEB73C95CDCE055719BF54F84D6A3704 +:10AF70005C56D607B3DF6D2E6AB20F5D4BCBF51C66 +:10AF8000CE9A5457209B7EBFAAF5DE97DF46B83C89 +:10AF9000FAA33FC2B8874DE8A7216F33F8A9ED9710 +:10AFA0002A6390C71D5A147AEFD91D1F60FEC8D9B5 +:10AFB000976EC0DF2B5B22FBCFC23D595D66FFC79A +:10AFC000B7D3F285C347715FD4F38D88C34B8CAF81 +:10AFD000D4C03A8642FE8AEB6FD948B78CDE4F6FF9 +:10AFE000CD47F8093F6DF7F9E8F69598A7E85FCCEB +:10AFF0004FF42FDED3DA997EFF7F0189AF015A002B +:10B00000800000001F8B080000000000000BAD58FE +:10B01000096C14E7157EFFCCEEEC18AFD7EB031FDD +:10B02000F1C1EC1A8C898D3DF8AAB1A12C36A60489 +:10B03000A17639225CCA3169C25188E3950D154A5F +:10B040009118675B2E11C555AB88B469BBA1224529 +:10B050002D515C07901B61BA0435E0364D17052968 +:10B0600034B5E8D46DA8D5D8D8A569232424F7BD74 +:10B070007F66588F316D137557F6F3FB8FF7BFF767 +:10B08000BDEBFF3D26252A332B007E56A400D401BC +:10B090004CD26719C0982F5199E1A5713F1F1FCB62 +:10B0A000441ED701E800B301DAE8CF6AA432B8B38E +:10B0B000B391B631350A7C5C874C4EE31ACE3F9D86 +:10B0C000F726B86A683184E51C80C7C1FA6467B99D +:10B0D000A01E6003FD8D473FDEF09BBBCC07B0098F +:10B0E0007ADD50027043E8DE278900A3BDDF716B73 +:10B0F0005E5AB4C27FAB0C80E91F0893E5493DA7B7 +:10B10000530017D03AFA4C8A497DF566288BA09CEB +:10B1100031BF5717AA00E629CC754BC6E92228A2F1 +:10B120007538AFC66B91F679D428EAB34F082F5023 +:10B13000D0EEA7A5782588C97DFB048D8F8FB277C7 +:10B140007640908E8B5786D300C6332460E94867DB +:10B15000AB8910E2A1FF13D4532867DC0D6D7D7815 +:10B160006E6D8B10E9E376B8860DD44F00C6F5AB53 +:10B170002DC771C475298DCB96DE011CAF72AE4F01 +:10B18000DAE3E42F2902B7AF364B88F4563C88C780 +:10B19000269A477DA310170957FC6C9011F7260BD0 +:10B1A00077809008E897672CFE19D91B172B516FF1 +:10B1B0009FAC8B684FD305F40BF24DAEF825A22C53 +:10B1C00004B01FFD0BFDEED1FB7A100E79E52E9237 +:10B1D000D368B997A1ACCDB8EE108B009D2B430F6F +:10B1E000A7C75882EBF17998E034047E1751849F09 +:10B1F000D31510E6742544385D053D9CAE865E4E41 +:10B20000D740825378341E85009D74C07F2B15C9AA +:10B21000633B8549A4B51B21D2EB7D108703164EF5 +:10B220000FC74167148F9F168795A0E57179D3F1F9 +:10B23000282CE3F13D1D0F0FC523FA2D056279443B +:10B24000978221125D46818B729683E222BE05426F +:10B250009C6FFD1F71683034975631031E2D33C724 +:10B26000C5B72C3C66118675493FF52B661DB0FDB0 +:10B2700005A86778E1837EB4C76B539BFFA1608903 +:10B280008829ABC2AEC5C8D734779520FFF3D8461E +:10B29000936F6A7E2388FC1BCA97C3AE7C8AEBE659 +:10B2A0001AB70AD0CD36855720AFA5F82AA18A0A49 +:10B2B00047A940F1B3D76FE2AF75EF53FD98475AF6 +:10B2C000915725FB640F6286F889252234202D5E74 +:10B2D000157FCB8DEB5648DAF7291FDBE5B84F41D8 +:10B2E000DCF776B7E602DA7B5832D77B709F5C9D3D +:10B2F000B40BC7F514E4FBFACABB58F0E1E7A3DCD2 +:10B30000D32457EB9EA703E9718EA9A6279B73DB75 +:10B31000B04E8C26DC704C499E7332577B4D413CBD +:10B32000412E05F27B816CCA19ED2B2F27BFF42B20 +:10B33000661D85EC400DE136911BEEA7F5E36966CD +:10B340007CF5530CCE7E383594D0796586F1F10FBB +:10B350005101DC3FA8681768BE23F55E29D5A5DB3F +:10B360008BDE3B64049271CAF0FCCD687734043103 +:10B3700089D79125FE5B5847017D3089FE1CDF8E01 +:10B38000721087DAB01675E3F0E7364FD463912276 +:10B39000B957B85CC9285E84FBBEBBFEA664C6591B +:10B3A000A11967561D1AB838F88D02930DC394BCC5 +:10B3B000EAB878F75F7F40FC3AEE78555A9ECCA702 +:10B3C00097BAC0478BBC8EBA61E75963BF272EFA84 +:10B3D000885FB09DD62D7D6FA884EC5A366444D327 +:10B3E00048CEC0FB05A61E565F087DC23E4B5F6877 +:10B3F00015A93803749E13631EC4AB93452EA71181 +:10B40000FF1A5375D4FFAF32C6473AAD0F79F3D167 +:10B41000AE5D965DED83A70EA521DDF5F2936BA0E1 +:10B4200092D2C1CDEBB7825FCAFF3DA7DDC97ACE0C +:10B430007FA323D0CE0EB03F7189E2A0BDD7B9AEB5 +:10B44000038EFF9DEA4EC7D43A8F7A7DA2A465731E +:10B450007F59FD0AA885A0BC9DD65EB2C34B7A0F6A +:10B4600048310F43FA832ED54FBC953F70E3391E08 +:10B4700097F67A78398BFBDECEA7AF1D41DDB3920C +:10B480007855BDEA0911EE55AFE686C8BE2A09B661 +:10B490008539DE311EC755181B0CE3E9F58C89A0F0 +:10B4A00080E7BC3E50A6620585370F86E0CF7393D8 +:10B4B000FA755AF9D42A9E6991300EEE3C057E4CFD +:10B4C00049E81CFC715446BEF328D00AB843BF506B +:10B4D000CE9D112146721A076BF2C8DF67ADFCF4EE +:10B4E000E409A04CC1294599054A5992B7F1F5588C +:10B4F000FE492DCB74CCA7A98F38F6A737049DFB46 +:10B50000F550A2A29EEAB1B93F23F4A863FD61DF22 +:10B51000CAAB14974B133BD6102E59ABAA1DF3F5AB +:10B5200020F3FB435DA1578DE17EF8D8ECE70DF8E1 +:10B53000E5FD002222D9D764007C0FFDD138EA72E4 +:10B54000F83DC5C078C47529D7A7F81D7F3C8A93FC +:10B550006F08601C50221542E1D43848E2ECBD8FE0 +:10B56000238F83415C4438A74931BC723C80533DF2 +:10B57000CC4DA7F9BAAB22C438EE5D6A1CC7678709 +:10B580009D78E7B639F1CED79CF816EC72E25B14E1 +:10B5900071E23B67BF13CF80EEC4AFE448A363FD05 +:10B5A000BC9E66073FFFC46AC7FA05B1750EBEFCB4 +:10B5B000F426C7FA85BD5F75CC57F5EF76CCDB7105 +:10B5C00035DDEF8BE29D8E75D3FD5E73F559875C9B +:10B5D000DBCF3A7EFF9F7EDE37CDCFDDA81BD5AB1C +:10B5E000777D23C7290DBF986AD6A5567149224495 +:10B5F000FE5EE256C9A7BF53B25AD228DFAD3E1451 +:10B60000B6FA101C3864F2569CA809F532D5D1EA76 +:10B610001BE1161FF2B546E43295E3FA919E96744B +:10B62000858789E2C73861162E5F6A60E072E40B95 +:10B63000F23949DCD6EBDD623A2E6EBA178BF27224 +:10B64000494185E7ADB3E6598359D7D78652C0350E +:10B65000058FA5D63850D346794BCC29586FBD07F6 +:10B66000F05E0E12DDCB0539160DCC749F544F8859 +:10B67000FC9EA4F17BD315A6B9896E9013C5D4BFE7 +:10B680007E92A3FD2880F5EAB6A02AFC9EC58C28F0 +:10B6900019354E8651D3D1AF87435EBABFE3DF8FF2 +:10B6A00060DD7DEE5A58AFE0EAFB0DD45FB3F439AC +:10B6B00013D04E0710FF61E63F54837BDF6DFCA87B +:10B6C00098FA8F474424B00E66F9423FA579FDF001 +:10B6D000920C5EA773D13EACA386A0F0FB83FE2C38 +:10B6E000E3EF818F48D8E229797AC4CDFB0E58EF79 +:10B6F000A32D165EF6FB68B375FE308AD885757A81 +:10B700004BFF158ECB9EBC517065F178E3F7A427F3 +:10B710000BBDD5C7C8A6508DBA6E218DDBEFA50233 +:10B72000F1D3F4C556B122DD98E1BE68D33D79234B +:10B73000FC3D777FFF19B38F3C5CBECEE33669B723 +:10B74000297FF8682AEF2FC3478B9A8926E5DFE621 +:10B75000F2B744AE39E264DBFEDF3BE2EF09FD4FB6 +:10B760008E79237BC25D80F61BE7F3577E05F11BC4 +:10B770003BE7A9A77723FAED8FE4175BBEF1FCFC4A +:10B780001574DE7FB7F36F1CDFA1830970CD4DDA2E +:10B7900079F3E00DCE1B070D4EA7DB69BF336D2A91 +:10B7A000BD05652EF4CF049BA59E0C3C78CECEA0A3 +:10B7B000F93E1B5A9ED34C7D76A8487299B4D4E4C6 +:10B7C000F31B64935FB98AE8B8DB7B84DE99430C92 +:10B7D000420CE361330BFFF009B4BB3B47BB477638 +:10B7E00076EC9EA874613E7454195B19FA333F439A +:10B7F0009BA47186D7BBFC4CAE6729DD3B4604BDDC +:10B8000092612D587CB2702DDDD34766E9B7A9133C +:10B810002F0AE6ADA57BFA8864E6C7F293C25A1DEB +:10B82000ED58ECD7528228E74326C6793CFF82C503 +:10B830004EF17833A475693C9FDAE8DD45EF5D7A17 +:10B840006F8CA798D41F64DCBE0CA2B393B49C6A1F +:10B85000258E2FB768AB78BC94D1FDE08407281FF4 +:10B86000F09C9040E70C7862A790CF41DDE99EF212 +:10B870002BC9BCCF57FFD213A7BAB143FE98FB69BF +:10B880006E30C0E5649760E5C27DD92F786251D2F1 +:10B89000CF4814AF45FD7ADC787FA1F7F4759CC7DB +:10B8A000BC1B7B7EFEC96353FC313768BE87E02931 +:10B8B00000733EF7159A6F1F1CBE4975E4B701ADC2 +:10B8C0008CEC1F16947AAA23EDBE4B12D59FC6A00E +:10B8D000C2F7A1BEDC7EAC07DF641C67D9FF178C02 +:10B8E000D76D586CD2E9FD26682AED6F970D89E473 +:10B8F0006144F0FBDFC3EC1FDB9E78B102E9ED345D +:10B90000B598CEB1CF453D1A498E6DB7AD4752CEF1 +:10B910007F8EEB1DF284237F6FBD74B894F264C8F0 +:10B920006DDEEF10678DECA816D9B675C87FC1C261 +:10B93000C55EBFD5F2A790177E2C887477E4DBE74D +:10B94000DF5192F3E3ACE7EB1F90DF06BDBCDE4DA9 +:10B950003FDFDE3FDDDEF68B831C17B4772BD93952 +:10B96000C5DE8D748E6DEFD8C0FB2F56289FDDCEBF +:10B97000F1A2844472C75FB95BACE0FEF60B576E70 +:10B98000501CB55BEF7D38EB7CC77B66E17B317388 +:10B990004A5DA75A37874FB3A9F7288FBDBFD0E5B7 +:10B9A000DC8F176601CF3B6BBD23FA297F67786F69 +:10B9B0009E4D08BC659ECDC37B1AF503ECBF54FFBA +:10B9C000EDFEBBF79AC0E3726F00F83CE94579C021 +:10B9D0008CB7793FB0FF9F1065D8E7301E3A25ED50 +:10B9E00020C509685DBC3F8873BC2AC573DFAF57AB +:10B9F0005BEF26B3DFD459FDA58EE490FE15E9BCBC +:10BA0000EFD45AE7D6CB789F0952E9D6ADFF9B58C1 +:10BA1000FF5F38FA367F6FFD1B3AD0569240140014 +:10BA200000000000000000001F8B08000000000064 +:10BA3000000BFB51CFC0F0038AEFCA3330C42B3167 +:10BA400030742B33307C03E20E79841CADB02A07AE +:10BA500065FA5F303230BC02E23740FC8E9174FDF3 +:10BA60006AC208F6525E06067520BF02482B0A30ED +:10BA700030B001D91A40BC0BC8BF05C4CF80D84133 +:10BA80008881819D8F81C110888580581328EF0996 +:10BA9000A43FF161375F4B18BFFD8F0550F9A282BB +:10BAA000A8FC3FFCF8F5B709E2971717223D4CDEDA +:10BAB000AB911F1FC6EAB44F33D4C4371950F91FD6 +:10BAC00065181898E51818DCE421FC6B48F2114061 +:10BAD000B14F3210F66D3160DC01D55D66C06EEE9F +:10BAE0001DA0FC13A07C0AD41C0004EB50106803BA +:10BAF00000000000000000001F8B08000000000094 +:10BB0000000BE57D09785445B670DDBEF7F696DE8C +:10BB10004216C2163A2C0A08D86C21084A67C3A0FC +:10BB2000019A454407B5598410C822E27C3CC77984 +:10BB3000345B061DE64D147518079C06C380F35050 +:10BB400003460D1A980682A3CF2DB8208E336F9A24 +:10BB50007D3190002EAD83E3AB73AA2A7D6FA79B46 +:10BB6000E08CFFFBE7FBFF2016756B3F75B63AE7ED +:10BB70005445359808194BC877F043D32512212432 +:10BB80002D9AD29FBF7F974EC82433FD974C48A172 +:10BB90006C23643821136D2468A275268EA11F536F +:10BBA0000979B7460ACAD086D60B6413524AD8CF51 +:10BBB0002485D44BD7137231E7C5AA216E4224AF36 +:10BBC000972C1D4A53B78BCC8474CCDEAF2507214C +:10BBD000CE1C0321FD589BEFE8DF64AF15FB12F983 +:10BBE00094A24EBA7C9AAFABAE7EE719BD74E55D08 +:10BBF000FC0374E5DD4A86EAF23D2A6FD0D5EFB941 +:10BC0000344F97CF0ADCA2ABDF7BCD145DBE6FF55E +:10BC10009DBAFAD7AE9FAD2BEF1F2CD5955FB76DB0 +:10BC2000B12E3FA8F6415DFDEBEB57E8CA87841EB5 +:10BC3000D1950F7BE3315D7E44D353BAFA230F6F66 +:10BC4000D6958F0AFF5E573EFAF44E5DFEC6D65774 +:10BC500075F5C746F6E9F2B9E42D5DFD7CF307BA48 +:10BC60007CA1EB535DFD9B338EE9CAC7BB3FD395E7 +:10BC70000B3CB8B5DF25DDF7099EBFE9DA29C447DB +:10BC8000814D889154626A26D5985A492DA636D29C +:10BC900084E9864CFF9D64046DF074A08A50BC5BFF +:10BCA0001968FDEF149ABE9BD3DBE91F08BD790923 +:10BCB000A1783B91754D269A6D2199E299C94C0264 +:10BCC000168A0A8E08C5B7148A771182A92B42F109 +:10BCD0006D18C5BB8819D34E914EF83D25E2C2348C +:10BCE00035D215BFA74532304D8FF4C2B473C48D21 +:10BCF00069466400A65D22FD30ED1A198AEDBA4549 +:10BD00003C98768FDC80DF7B447230CD8CE4E1F7A9 +:10BD10009E112FA6EEC82D9866458A30ED159982A2 +:10BD2000F57A477C98F689DC89DFFB4666607A4DB8 +:10BD30006436A6D746FC98F68B9462DA3F5282E9C5 +:10BD400080C8626C775DA412D3819107F1FBA0C813 +:10BD5000524C074756607A7D2480A927F208D61BEB +:10BD6000125983E9D0C863F87D58A41AD3E191A78A +:10BD7000F0FB88C87A4CB3239B311D1909629A13D2 +:10BD8000F93DA6A322DB30BD21B213DB8D8ED46238 +:10BD90003A26F22A7EBF31528FE94D806F29807793 +:10BDA000214CBD91FFC2EFB9913730CD8BBC8FDFF5 +:10BDB000F3234D981644FE84DF0B2387311D17397A +:10BDC0008AE9CD9130A64591B3988E8F9CC6F496A2 +:10BDD000C8456C776BA415D3E2C837F87D4224823E +:10BDE000A9E07724476D0E0BFCEB05FF9FE93A793C +:10BDF0001DE54BC46FF88EA6C446F16054B47E6C4A +:10BE00004AB91DF24995E25512C5EF64CA0B811F6C +:10BE10004EAC9482376751FC480D37425ECD31B944 +:10BE20004D347F176955017FFF42C276E0A77B47FB +:10BE30009DEA1EA6F8FA6E5AA807456EF8417EAB39 +:10BE4000C29C7A03BF6D56C2F4FBC4D47D697E1BCD +:10BE5000B4A7B43114D09B8E0FF84DD111FAB94B61 +:10BE60002101079DEA41E86114D60B99687E66318D +:10BE7000F10EA5F5AB46996604E93855437D253E9C +:10BE80009AFE22CB3703D2FF02E2A1F3DFCFD383A6 +:10BE9000C480E98B9914EF297DCDBCAF2FA3A702F5 +:10BEA0000AC42E1DC36174BA8BC90D5B6BA66FD01B +:10BEB000D5B753081B4FD47F96F83E82EF813CD212 +:10BEC000AFD216AD47BF1F867A71BE7F1AEF7BBD1A +:10BED0008132020AFF402763700BC827E2764E8644 +:10BEE0007999DDCE29F6C4F3FAD932D740A58F76F9 +:10BEF0009E419CDFCF2432A396F1978C2983B07F9B +:10BF0000948701AB05FB9739FC45BBCF019EB4DD9F +:10BF1000FB165F0B93A7EEEE08179BEBAAE042DB44 +:10BF20007D897051683BFBD5B74B9C56333813AFB6 +:10BF30001BE7C1BF57984840A2EB68DD620F6ECE89 +:10BF4000021C7623FF2C7171069A4A8141E57A49D9 +:10BF5000322C8190C63D492103AD9FB7C5BE19F46F +:10BF60008096BCC0933E80F366956CA15556ECF963 +:10BF7000F9A1DFD07CDE2695500D832C487A229BD8 +:10BF800050B85D2B496CFC80776F1FDABF9F881F0C +:10BF9000AF04FDCF27ACFF1689D151608B13E17A36 +:10BFA000BAA0A66A344DC3BBCB8A09E5E3A72858DB +:10BFB000BB50FC5E60250AA494831B113E01F578FA +:10BFC00058C817A467259A97DBE7E7435ED03F5D23 +:10BFD000F782A01ACDD3BF0BB7E9F31A78E1BEB749 +:10BFE0005AD4E066C4AB6E0C3E025EDE6E0C7E1C64 +:10BFF0005E0516356048457805810F382537C2A1A2 +:10C00000C4A28664DA4F0985239060C9EE87D30104 +:10C010004E0BB7595CC735E396D526EBF215F55DA7 +:10C020005CC73572F4E21BCF38804E1767185CC7C7 +:10C03000297F6B5EE64D394EB7ECFCB2224C057E93 +:10C0400094D566B96CBA7EF4F98BD55211C36FB72B +:10C0500073DAA0C478B638C3E83A4E49F5EC362610 +:10C060006FCF2E33BB609CE6652E171B3703530141 +:10C07000AF454BAD585FCC2F51BF3FF4FC08A9230F +:10C08000C7CCC0CF6959EFC4F513D293F2B911E907 +:10C09000A441FD12F0C64CFF7E67403CC2BCE8B72D +:10C0A000A2560E98AE87EFDB75E3D176EE931AF9C0 +:10C0B00092986E1572528397F7430748A766DC671C +:10C0C0003FEDD149FB6B516C6B408F9AC0F1A702D9 +:10C0D000EA517E50660E1BFDF4D3B93AB61F89C6ED +:10C0E00039BB6C5B37E06B25E66A2330AB92DAFE36 +:10C0F00005404FE7EA56A6837C59285FFCB12F4ED6 +:10C10000FB5F08BA0DAAAD7A7919E4F3A4FDEAE859 +:10C110008CD8DAD64DF3CD063A94AD7DBFBF929858 +:10C12000DC29DF7E70DC683AFFF2FA0B4698C70420 +:10C13000C9FF2B292DBA7E09D64FFB29DD76C4080D +:10C14000EB3BAD06AEF949D615E0D96E9EB68C93A1 +:10C15000499AF905A82249E975760EA757E2BEFD6E +:10C16000534A9F67DE52C923741EE432AD45CB3378 +:10C1700079E95CE27300BC66D72D44FE7306F80FC4 +:10C18000C861529D0DF8718E188A607DE7C8FB8EDC +:10C19000611AF8ED938C1C3E5495A5FCC084432194 +:10C1A000DCBA00BF32955435C983E1BB12E07C494B +:10C1B000FA0EF94950427E56C2BE07887939AE63FD +:10C1C0000DE34701FA07F2F756EBF9D3FCF5FAFC59 +:10C1D0003C32255DA1FC65DEE32AED91F2372DFFAF +:10C1E000A3F07B566272773EA9AC72D1F96F34D25C +:10C1F0007DA2F39FED224A37BABEB2573666CFA270 +:10C20000F9372526C7CE2EA3D3BF86F6D389ADBF77 +:10C210007469D0E81DD87E7DC7EA864D1F4DB03FBA +:10C22000261F4B85FC256E251BB925557213AFBF04 +:10C230005B9DECB538A01EFDAEE1CF73D6E8D7D735 +:10C24000D1FA63D74BC863886FA5DB2613C033B11F +:10C250001EB15F623DEA36C91B8C4307618EAF8217 +:10C26000AFB572F809BDE38B98FC3731F9EF62F294 +:10C2700002BF554EDF14EFBF9046003DB78E637886 +:10C280001236B2F30CAB678CD6FBE64AF54C9C5EDB +:10C2900068BDEFAE54CF12ED4F31A4B5AF57F6CA1B +:10C2A000732F07287E97BEF08483507C3CA354A74D +:10C2B0007BE8F7455B563B004EA7958003F0E64CC4 +:10C2C000502E8A07AF510649E81B3689EE7BB9C06C +:10C2D000FF31CB27827CFF728BEA7A84EE4BC53626 +:10C2E00053C844F7BBBC6E4131198CF9232CFFB302 +:10C2F0000B801F15F5EA51EDBE966E7D22DD6DC7F0 +:10C300007DE866001D9884BA119A96D79C18077A22 +:10C31000740569457C8E6D07E3C3D18EF2EB5946F7 +:10C3200067FB72716EAC609F4845DDCF2FC0B9B11D +:10C33000822847B5785402B84CF5BC01067B2A9C8C +:10C3400017C8483212F88A800309A6215F5EF9EC0B +:10C35000AF061FA1F368AE79CB2169E04335248491 +:10C36000CBC5DA397F4DB9825C384FF1935CA36D50 +:10C3700017C476EE7A3A81CE34DBC0D2456AC83132 +:10C380009AC273D126D54331932C7AEE99DF3D457D +:10C39000E98E7C62F2F4A5F05EF8DC814337D0FCD4 +:10C3A000C21D6A6A315B864D4A8FEE4705FD0B76EA +:10C3B0001901FFD2170F18DD83D8F7873A45F761C7 +:10C3C000E18EBD4632A83DDCF26BF71AC3B638FBEE +:10C3D000517B641CE8332B9FFDCA08FB7D668F44AC +:10C3E0003A67B56F5FB2E900EA2F0027DC3FBE3F36 +:10C3F0006DFBD56E9F42135F1D8EF55CC0AF13EDD4 +:10C40000931D64F508C4E3E75FA5E397FCC9E481E5 +:10C41000F5973C7FBF03D6714AA964F8BC7175BA21 +:10C42000978E5BA206D25D98B2EF254F3F8078369B +:10C43000FFE003A89751FCE862409911E802EBBBCA +:10C4400077C36DB8BE79C48FF856B251F605810F27 +:10C4500028A468471C7A7881D3C3A9CD9453D2F518 +:10C460009D02FE087AEEFB32E78FF7A11EF9005F0E +:10C470002BD56430FF8599ED5395C120EC72661D74 +:10C480009ED6FC0CF9E8D91EDECEAE810807C13776 +:10C49000919FCA070B3BB3FD61FC17DB51BCCB87F7 +:10C4A000EF50BF49F55A06EBDA717EC9C65FC2C7C5 +:10C4B000A7F3B682FE712A9DC989D8F5FDC920F877 +:10C4C0002395AF1AFCD2D035A3F39A87195D0B3AA6 +:10C4D0000F4E2E82F2CF3F64F403ED40FED07985FB +:10C4E0003A63F9DE6912F2011309C5A3E71A95D37D +:10C4F000B3BE9C7268D4DFE8BC15C9A9C513DA7F46 +:10C5000027843FEA25F31EA7ED34FA74058C87F5DE +:10C510008CD1EF5951BA9DCFE9FFF740FF4951FA4D +:10C52000271BD2AEEA7CB6480DFEEE29A0574A9FE3 +:10C530000137D0ABEA83757FB67DFFA13B295E7FD3 +:10C54000562BE854CF3763E9B464E70304F033961D +:10C550004E3FEB5E49E2D229FD1E974EBB87FF5747 +:10C56000F8A680DBC118B8513EF8DB57DD89E1172A +:10C57000CB072B0CEEB87C90FE7C48B2DBE39DC071 +:10C58000378167A5FF59D613F84D1B3E0A7C6BC354 +:10C5900047816FB1EBD4C32DB67C03F01B8D7EA019 +:10C5A000AE20013BDDE7D6DD329E135BDCAD8E4E67 +:10C5B00074DCD516720FE8D92D2E9E4F66F9D6344D +:10C5C0006315F005F1BDD54266007EB6F85A1DC967 +:10C5D0001AFDF94883EC70D3F2709014C5D3AB29DF +:10C5E000C7C5F1C32451F972845FA16CCB5C3A1CBE +:10C5F000CE55B20774B7B9CB6F7780C9A2A5A1F7A2 +:10C60000A419F4FBBD6FCA68D368B13A06C3BCE88D +:10C61000B95DE942E13B87EFF3691278720C5DD7AF +:10C620009C06A617CF5DAB87C73CDB1223F019AA87 +:10C630007F46F140832FC24F50B2415F5E4AD6E23F +:10C640007E95C6E08F9F9F77BAC81C7F869021FC9D +:10C65000BC6180FE16733E55280F9C3483C2BDE535 +:10C660000D999868FE62834CAA609DDBA520013A73 +:10C670000EA4211E9653FE4034E7C266C0336362A7 +:10C68000FA6D7EE92FD93FA15516BDFCE9E0DFD058 +:10C69000B4F9E54FAE790DF2AF7C9CF929695F3FA3 +:10C6A0007FCFD777037F6FD963226827D9F3C7CCB1 +:10C6B0009F40FE559307ED1C2B4C5ED48FF7D8831B +:10C6C0007DA1BC07B32FADDCFDD5E030CA9B55B8CA +:10C6D0004F05323B475C6CF8DB7F4BA990D255810C +:10C6E0001CDD9384FA75C5AB96201C3A5B767F956A +:10C6F000EDB7FD70EB2937123FE29F9DCCD809F8CA +:10C700009ACCEC6915AF8D7A66391DBFAC6EAF71EE +:10C710000E2DCFFFC3B78381AFB4EC64FAC1793576 +:10C72000FC34F11032497E62B94AF7EB3CE86A5DAD +:10C73000295F920FE5066CF1E0C2E0D042E100EB28 +:10C74000A27029017E98081EF3FE65E171E16E1862 +:10C750007F51C348226769E12279D9777BD02CE1E8 +:10C76000FAD9F73D5F0D06BEFB59ED7294DF1DADA2 +:10C770007B35AC3BEDFFA5754BA1AB5977CDBFEC3D +:10C78000BA19FE0F90993C8AA583F678FECA8F31BC +:10C79000FFBCDD83F3BD4AFA6FFC975DFF3FB8EF46 +:10C7A0003B25F4C775B4EFC7FE65D7DDD1BEBFC961 +:10C7B000F7DDEE027B6FCBEE6F338966FD1DADDBDF +:10C7C000A0FCABF2B72BAF5BE83D4D864AD7703A81 +:10C7D000BF4F48F56D59347DCF7B29158EA3940644 +:10C7E0007CF1CE0D4315766E30819D092ADE260937 +:10C7F0007B5193CE8FDBBD04F58C89DE5FA07E403C +:10C8000094CAA65C5ABF296F8EE711AC31F4B01FF1 +:10C81000F2D36EE479FD79EA5D897825AAC74ECC1A +:10C82000BBF50DD0EF267965D4FF688A7ADF47998A +:10C83000E3D8F71CFD39E28E9873C0ED33F4E5B709 +:10C84000F1FEA693C5AEE1145ED3BB2BAE2005D19D +:10C850001DB9952AACE78EBB2452ADB157DE16D375 +:10C860009F4321DC4EF28FC16F6E1BFC16233C48A8 +:10C87000AEECD942AE027E84C1BB69DA9020D861A9 +:10C8800088E261F09B5EE6413B283F67AABCBD6A37 +:10C890005BD30474AB12FDF9529C1313C199F0736E +:10C8A00027F6D32B0A77D52BE3B953D31FC243EC1A +:10C8B000C7F7DD07B17FFFEC7E64C37EC4F19F2D17 +:10C8C000309B6F03FF85B99F84E7F6496B658C83C6 +:10C8D000310F94108EBE1C15FD3B270CBE6C509C76 +:10C8E0008B878D2C7F9075EB01F82CE0709C472A8C +:10C8F00051EF2497BFFB6E0CF88D1042B4DC4BC88F +:10C90000047A0E9937460A59E9FAE72B24E01C0A03 +:10C91000764D891CD5DA3583FA3CFCDC941EEDA7F4 +:10C92000A3FA89F8C30F9DFE95F2A3A37DE87905CC +:10C9300052058757B4E7C47B1A181C2B1649C15EF1 +:10C94000884721D5A7F1EB7CC2F1FAAF0F0D433E2A +:10C9500097FBCB414E3CBF7A07A0BE5FC1F5FD8B74 +:10C9600001B713EC35171B7A3BC11E73F18D7C8721 +:10C97000962F8AF4203F477EB0CC8C694B81542D92 +:10C98000C3798BB44E44395C6021C07762DBED52D1 +:10C9900084DDA592F919E98F9C0DFBC87EE6D3A62C +:10C9A000CE4E9A7D5B3BE18C32B8FD3EC0CF518DBF +:10C9B0009FE49F852F9C5B01AE072DE171BE38EB94 +:10C9C0007D8BC3AF78DFD746B0134C69C852012EB8 +:10C9D000530A645DDCCD7E859FA786916130AFE20E +:10C9E0007DE31DA3605FDE903D160ADF8A860B465D +:10C9F0007F1C7F5B2C3CA17FB00B1F533DF3009E3F +:10CA0000C77E6121014A0FEF70FF0F2DF202FFA2D6 +:10CA10005D79C13EF6A1C2FC0AFD5566179F5A9C7E +:10CA2000ABA6D17107D6B9868088E9CAEBF757DD86 +:10CA300058DE8DB713F5BA2E62F58E185DE5F1D686 +:10CA40003FC1C8D63F9F787E9C23FDEBED5BEE2F68 +:10CA5000EDA13C90EF0512F291F6784D903E2E1626 +:10CA6000494190BF708EC57CB184F2FF1D032B0F2E +:10CA70004C61F252E07D2C9C2595C1598C9FA532CA +:10CA80007C36AA0C3E02CE02BEB1F315F529BF1AC0 +:10CA9000ABB5AF4CAA1FF23CE827E50D920B4C7FDB +:10CAA000E54AD808745851FFA80AFE823BDCAC5F07 +:10CAB000A2F8066BFDB5FD5505E7B37FE868D41F06 +:10CAC0002FAD65FAB177EE0507E841EF183CEF8D21 +:10CAD000067A7C57C678824470FC74D9B669058A98 +:10CAE000B6DF2C9CE7D445B92A98837EB468AFDAC8 +:10CAF00059834FFDD54E582EBE775DE41E0ADFE9FF +:10CB000078388FC07F98C816DAC5C0DAA6BC245A18 +:10CB1000FEA3CA64868725B57B8D98CFC2FA623C96 +:10CB2000314E2C3D4D2B4ED2E5E7E487BB035C8AAA +:10CB30004DA1259E3878DAA80A3FC9F794135E8A7A +:10CB4000B783FF7F901317C679E3C06D9DDA4E3E21 +:10CB5000748E271F162F777706F82FDEDDBB331074 +:10CB6000C7E2370BD3E3C9878F96317FE0C7949F25 +:10CB700041DA328DCA87EB35F2619A05F123B6DDD1 +:10CB80004FD5AB940F62BFFE97F9CC47201FE2D080 +:10CB900075B5AA970FD31B66A17C983E4D266E8D66 +:10CBA0003DEE672AF77325940FB9E977605EF524A7 +:10CBB000C5C19B8FF8B904E00A298C0372E20F9C6F +:10CBC000EFC7CA8B44FC7C8A51E2FEEA0EF8F9FFFB +:10CBD00025380B7EBE989E5F400F6C8F8704F9F559 +:10CBE000E23B283F97001F193F5F7C17B74BC6F009 +:10CBF000571FF0D7E15AFECADA97FB993CA8A8CF95 +:10CC0000FAD54C5A7E67B5EA31D3FA7746F96DB654 +:10CC100096DFFE81F35B0AE74C579CFD9D3133891B +:10CC2000B8F5FCAA0FF0A96343FE38F045C0FB77C6 +:10CC300064F4239EE072FCED217F1C0EF6F354A3F6 +:10CC400082F87382F3AFF3CB82D30A281DE7CF6556 +:10CC5000FA70D97619E1505EC7F4BCF23ED6A09BBB +:10CC6000E6C70DFD1AFD810B77337F20055471AEA9 +:10CC7000661F17BE13AEEA06E59B24F467CEF32CBD +:10CC8000443B3E59CFECC466FA87C57578D18E5CBB +:10CC9000C6E1B5A06113DA9B1704F576E8B23EB79A +:10CCA0009C81F380E0BF0BB7C5947B1E467F45197E +:10CCB000D89B35E71099EB0FF7CAA1812F426CE79B +:10CCC0007BEC5C15BBFFA25EDBFA4BFEC9F51FA433 +:10CCD000EB1FFEC3AFFF6AD7AD1A39BD0F25C38165 +:10CCE0003E4E18BC48EF81FFA2EBA7E3CC7DB46FAA +:10CCF000676D9C510AA7CB770CFEAA2E50AF5CC281 +:10CD00007AF337EC38904EF3336BC91030D3CF5FE2 +:10CD1000AF978B6D72B8CE8D727666E50E69F64070 +:10CD20008037A9043C9B33D4E4077FEA414B2BF2C4 +:10CD30002F8177371A193E8FE6E31EEBDA5A80E728 +:10CD4000887AC9857411B2B0730585BF85E6F78FFF +:10CD5000FA6A1C8737DA632AEAD9FE54D0FD00BA92 +:10CD60001AD7C0F3DB981EF6232A6FD01FD6B05710 +:10CD7000857625B47E0AF29B013A3F17F8E772D315 +:10CD800035FBB6FB08C3DB2D9287C4D9B77EF44FC1 +:10CD9000DC7DFB81F055C0E34623D7E7F9FE1DB4E7 +:10CDA00034150F433F94E4D90C951B92D18F72BC7C +:10CDB000BA37EEE3AD1C7F63F11AF47BB7C69E343D +:10CDC00019260EF19645168C73C3717B31FD47CB46 +:10CDD0004F62CFCD15A409F5980992FF2F8A26AE90 +:10CDE0006D3A8F3F117E5A4DBD5FA957A847325CFF +:10CDF00006E093F78B784B881F4EC7B825FCD9DF28 +:10CE000023FBE39974BD97D6C81EF0FFDC6E701F3C +:10CE10001A03F4FB884A002F2FBDAD7A99DE99845E +:10CE20007C77D63BC7543085CCA23081FD9EF5532C +:10CE3000C65F8F4167F4DB9FA8DCF282AF9ED48E81 +:10CE400080F8E1699EBD856EBA2FB70D3FB81AFC18 +:10CE50007053F35D870E017C1F9609C0F7E89A7C3A +:10CE60003C9FDC7F9F84787D98C211DADF362DEB02 +:10CE7000D0213AEE5D6BD2D0AF36D37BA010F06CF0 +:10CE8000CE24BB0DFC6BB7F693895F03C7BB48D3B9 +:10CE90006AE0D7332BEFBB0DE65B42E500D8594B78 +:10CEA0001A0E167686FC06C9E3A6FD5704FCC6CE0C +:10CEB000740B9BD65F3082BD631EAD07DB53B1811F +:10CEC000D5ABA8913C16C0C7864791EFCCAB9188F3 +:10CED0000BEA537DCFCCFA0D9A69BF4D1B687B9A44 +:10CEE0009F0FEDA1DF9AE4E9E047AB785B66ED7355 +:10CEF00096BF0E7C691E6D478B4953CD7DD8DF826E +:10CF00000D12C9A0FD95E464FD470EF4F7B6EA8161 +:10CF1000F28FF7FEDA08F3BE9B8ED785F63F470EF9 +:10CF200017427DF213C9B505ED4D2C4EB685D301E0 +:10CF3000F9B00BA32F89E7B91E28E4E107C65E8884 +:10CF40004FF3962EAF8275850369597004AAA8BF66 +:10CF50006004BDEE3885B39FEA6DC7781CDBFEC068 +:10CF6000316358C3A75A8DBDB1FDDCFA5CA4EF7BD9 +:10CF7000890FFDDDFEE54C0E1F596D094AA07FA803 +:10CF80002E9493FB575FFB24ACFFFC732AFA47CF28 +:10CF9000F708A33DF6D4069504E81C576E90916FF0 +:10CFA0009CDACEEC40F24615F3F31F30627EFF862A +:10CFB000A9E3801F9EA2F0073CCCDF586884FC7C6C +:10CFC000CAD74D71F8C73C7729E31731FC61FE7A67 +:10CFD0003DFDB7E3174BC631FE1EC30FCABA57A1BA +:10CFE0009D2F964F54109BE00F4321DF14EA82F8E7 +:10CFF0005BFEB64A409F2B575C77AF07BC9969012F +:10D000004F31A58BD001E06B9782923B40CB7F7470 +:10D01000CFAE1100BF93006FA08BB529E84F9D17CD +:10D020009C857015F184F3D7EBF159C42FDDE1979E +:10D0300089572B074A92885753EFE39F52BCA4E3CA +:10D04000DD532F052D12E48FBCFEC070CCBB000F4A +:10D05000CB977279BAD68E78FBF1BF5D580D78798F +:10D06000F74312CE9F04FC552057CAD74B6EB063CE +:10D07000CE7F88B59F4FDB03BE7CFC6B863F148F51 +:10D08000DD80E7E51B1E7D1DEBD7486EE8FFE34D15 +:10D09000B350FE96046482E53547503FA67200E324 +:10D0A00080F607E474C0F3F2552617ECA3C017818D +:10D0B0007F4754E6B72766CFE0A9B4DD26A31BD788 +:10D0C0001D8B77F28C2CC4AF8AED2AE2474580E1B4 +:10D0D000D391E764C4C3FDAB6F47FC39BF454A80B9 +:10D0E0007FF9C62E807F4156DE867FCF4A1CFF180F +:10D0F0005E9F5AC2F0311FCA01FF5EE2FA29213653 +:10D10000ADDE21F04FE0534778D74E2E25C037AA29 +:10D110001B4F8779DDBFDA82F3CEAFDA357D29D2B6 +:10D120008D8AFEF9FCAA7F4B073A9DA7B0380C0107 +:10D13000C73285C5E9B49BC7E3CB8D5DAE663E3192 +:10D14000F3D81B958B43412E425C49888EF3C7ED83 +:10D15000CF60FCDAB9DF1FC1B8C485AFD17DA7F5B8 +:10D16000CF6FB79310EAD341E42FA57532C685126D +:10D1700025943D55737F44C45B2C7CC18EF02DDD1E +:10D18000690A16D3F6A52F1F1B8CFEF015ADAF0351 +:10D19000FD047E2F31BB7C203C782AC4552A2CEE1E +:10D1A0002356EE8E32317B4DF3AEA419A0FF48DB3F +:10D1B000F6A23FA9B4F676D5A4B14F7A4C2A8E4B8D +:10D1C000EBB17B2E74DFC18F08F39B3C483BBFE57E +:10D1D000ACBF6719DD94D6ABA817956EDB8476BD1E +:10D1E0008A6D1730EE35FF85E71C00878A7A591F54 +:10D1F0000FB54D0E99305E4B3E6262FC4917975455 +:10D200005EC7EE6594D7F2B89F98B898852FEC7EEC +:10D21000394041B3F0C5AD0EA0A3B34D5B1C004F28 +:10D22000DA1FC6134DCA49106FD4519C51EDC3711A +:10D23000E38CCEC23F2882DC6DD2C767926D8C4FE3 +:10D24000D15DCFF6C5B1670A7D65E1735F3C0D71B5 +:10D25000AFCD3B3F7B1AE6BDE8EF979E86B80DB297 +:10D26000C7E202FDA1E2F71F61FCA068B7D4C4CFFA +:10D270003FCF6EC5B8CBF39F9850FF3BBFFB542602 +:10D28000E807E7777C9D0EF1944B7617A2FD61C904 +:10D290004BF99D499CF3AD48012F835711F719BBFA +:10D2A0000FFBEBE4908DCEF3DC6113D2775BBC58BF +:10D2B0006D198BBF73F338B1EDF1E36A457C537997 +:10D2C000DDD44937027FAB6372BC2DDEA9A3F8B071 +:10D2D0000FE97E5E7F15FBB69DC7FFC5ECDB39F815 +:10D2E00007DD9F274CFAF8B02FEAEEFDED535056BC +:10D2F00017FF3E99A0E38EE025E276E798BC411344 +:10D30000D0CDCEFFC4383CD8AF6237C8F92F32C178 +:10D310006E795A6D457B60EB6E930BE2B64A777F70 +:10D320008CF471FEA58318174B78FCEC79D2F6C308 +:10D33000E21DB94DA2A2C6CEE2CA38DC21EECCED88 +:10D34000C0EF3CBE8CE1AD883B4B146FF691A91742 +:10D35000BF77C1E2E2CADC4D4680BF360E4DCA81BE +:10D360007D3AA28BDF13EB8EEDCF057018A98D9B54 +:10D370004C14CFC7F5F1B67D627CF8FC261E47D968 +:10D38000161F4948F7A110EFC3E45D4550FA98C451 +:10D39000A1471137D9144B8FC1AB8B97EC78BEFFE7 +:10D3A000183CF69B98FD49C0A5F9727C7EFC19A734 +:10D3B0006F7A2E396BD2DC4BB9879F4B441C9998FE +:10D3C0006F552D93BBCDDB985E184BCFE5DCDE1E91 +:10D3D0003BCED77C9CF2FABD8381EF34EFDBC5F105 +:10D3E0008DE173F9F623C600E7CF412D7F86FEE27B +:10D3F000F013D9CCFAA3E7D8B8FD556CBF10B7BF6E +:10D40000B38AF77698FFD926A6679CAD958B827173 +:10D41000FA3FC7E54FDBBAED463C57C90E2BF29FEA +:10D4200025F69CC3CE54488D18BFB072398F77F85B +:10D43000A92703E0BCD27E0B81F9AC06F868CE992F +:10D44000AACB4F40CF51337CC3E1FC24E62BCA8DDD +:10D45000A90612D4EEBF12C0FB91137B7DA5807C80 +:10D46000695AA6BFD7D1A4B80EA4D0FE9A0A240F39 +:10D47000E8B3EDF14CDFFF64AFACB38781ED19D6B3 +:10D4800075D163C0FDB41B422E5A85D82D4D197835 +:10D49000907313B7928E21DDE8DF7E64D9B61E70DB +:10D4A000CFCA413C1294DB3D6DF75BB03F27898DBD +:10D4B000B3261FF6C926FC0A3094BBF6825DC2DA99 +:10D4C0008FF483FB3B2E62F5C0FB0AEBF8BDC7B5BA +:10D4D000763FCADB8474E361F75E849DC899A3E854 +:10D4E000EEC5247BF5F994987B90825FE3153A0AA8 +:10D4F000FF71FCDD87E442B67EB057F54D8FCE3725 +:10D50000398D7842503EC186F1CC361B9B9F982FB7 +:10D510009D0FF2030A26369F81E100E8E1745E3137 +:10D52000744CF0DE139DDFD198F9E9F4B83BCC5C84 +:10D530003E2844013E623337110EE78BFA38D300A0 +:10D5400081B803671B5C6939ED274B9A6482B80583 +:10D55000179C827BE37831EDBABBB4F7C5EAE11FD3 +:10D56000A3D05FD468043FBF5982E333E90CB80607 +:10D5700040509A8C008C5FD9443E84FAA2AFEE20D2 +:10D580009E3FCB6A0F62B901F2344D497217741B8A +:10D5900042C8C36B0A0A32FA43BD5919060FE61B8B +:10D5A00015A0A3C9FE0CC310987EC1AAC631846C15 +:10D5B000259503C0A2645EE56D7CA307E01541A735 +:10D5C0001D09781B0137B78A3C6580F0BEC2566BD7 +:10D5D0005BDE6BA67C716BAFB67C00F23500FC1B8A +:10D5E000603C6FE32A88F331FB5699E9B893371A08 +:10D5F00090EEC6466C78FE20E14EC89F09A9B4FAA9 +:10D60000E2DC976EB3F3F07A1DF1F1AD3C1E79B216 +:10D61000DFEF81ABDE23B93C26AEF030B88FDD62A0 +:10D620009EFDA4594B871B2FCABDE8FC9E84BDA755 +:10D63000ED9D45AE5BFAD1F939371858FCACD9FFEE +:10D640001BA8DFF721BF01AA8C25E1FB25E0C37FE2 +:10D650004EC5F98871AA76B37355D56A437005E251 +:10D66000AF5B02F916DDBF70CCFEB5B2FDAB3F82F9 +:10D67000FB57DE7084ED5FFDA6BD466E8F8773CBD2 +:10D6800056E2D901A6A71D6B661428745F524CADF3 +:10D6900055B0AF2A995E50DC1FE1FA425CB8F2F94E +:10D6A0007504D7ADA737FF7C30E8F5CD064F5F1284 +:10D6B0008597A877C8CCE2C4A659FD0D304EC5E3C6 +:10D6C000E12A38FFBE7AFA7DF403F76DBE181A4CD2 +:10D6D000E7DB770C37A7F071B7366F467FE656C0A9 +:10D6E0006337B8EEFD2B404E268607C3EF3678D45D +:10D6F0001D41F818204FBFEFE4F728F2EA252FC8A4 +:10D7000089141395A3347DCFCCCE31C7CC324F9939 +:10D710009DD1D9DC4B01BD386F9A01CF534E9E4647 +:10D72000D7CFE3FFCC8A4EBE88FD147844487512EB +:10D730009C730A9CFE3FEBF1E6B1A45EB47CECF175 +:10D74000A3F7835D4FB4DBB28C78E66AEE4353FCFB +:10D75000D9A56B57F88015ECA1A23EE065BC730219 +:10D760006D7716DAC138B08E5DC72FCA00EFABDD1A +:10D77000D7D8EF4DCBE8787D12D38F2F97DD2B8A4A +:10D78000FDFE77B3F03B327DC41BBDF7F777C08752 +:10D790003273D8318DEE6F79EE2523C06145D2F911 +:10D7A000D1F1FC9E89E6D174F95A1BC8E97D115369 +:10D7B000DC7B04FD2D4CBF7877D90C0FF8E11F16E8 +:10D7C000F704B83C2BE07CB7A04F6931635A9AB894 +:10D7D00031305870B959085FE8FC8A727628203FCA +:10D7E0000B89465E32F93801F49187F36482716ADD +:10D7F0002E5527DF6E057BB903DE05A96C84E16F2A +:10D80000CED0DF039D34E68802EF158CCFA1E2581D +:10D8100082F769F4E5B7C6DC139DEC9DE529E0E5E8 +:10D8200097F0FF415CE7A49C3B3C055A39A154F7B3 +:10D83000837D3EF8AD1C576F7CA00D3E3E84EB2BE4 +:10D84000160A9FEB619DB35631305D191EB1708C85 +:10D85000854BC19FE7317B610C3C6EBE5CDD98124D +:10D86000070EEDD75DDD0FE4A6805F2C1C9AA02E7D +:10D87000EA4DA620E8814D4A18E1D844E118E07E3F +:10D88000ABC274CD3E8BF970FDE156FE3D169EB1E4 +:10D8900070A4FA05EA0FE307D9D10EF636C00BE300 +:10D8A00000AA3F34D1EF6FF651C923C0FB42633168 +:10D8B000CEF02682B022AF489505E8977131FF0A75 +:10D8C00095E70C1FFECCEC57C51136FF716E162F75 +:10D8D00043E17134061E4763F040776E899DE72B64 +:10D8E000F08F5171F083E3C1220B3FDF641237DC0C +:10D8F000FFCFFE64B893F185F8F2716CC4D7D60FF0 +:10D90000D33BD8FB1C12F1B77D77D17E425E15E385 +:10D910003FF3CD2EA48F7CE24D81F72020C810E686 +:10D9200029E6354CF2FDD49206EF378D4FD1BE0F6C +:10D9300021C617FB92CFE1974F027BE11C9A4F94CF +:10D94000CFB5EB16FD5559B89ED593F4443F391821 +:10D95000434744FB13EB4B4921217C3F4432E33DD9 +:10D9600027FA5FC0D8293A9E881FB5DBA7545B58B9 +:10D970009C0461711221DCCF3C5E9EC7DF6922E608 +:10D9800084EFF290EF92A2F37BDA2229F86E029FE5 +:10D99000DFB937CC0188D77850F26F86719AA5B776 +:10D9A0000703BCA83E760DDED38F29BF74B8B11C27 +:10D9B000CA69BD79588FAF6BA1CCEC64F4FC8FEFD2 +:10D9C000A1B4E7E3CC9E46C94D211AFACCB332FA92 +:10D9D000BE95B8BBE37B69C4AF40DA6861F7D06E2F +:10D9E0003EFC18EEDF5BD69BDF007A2B224105DF81 +:10D9F000F971E9F1B0433CED177BFEE5EFBA28ADD4 +:10DA00009900D77D966BFB801C13FAC2FB16DF1FB3 +:10DA100060BDFB2C8C3F1FF58E7817E4C2ECDC61F7 +:10DA20008786D3D460F6E1BB0BF7025E5178E6003F +:10DA30005ED1B6FBA0EB2E88576F5846C0FDFB1891 +:10DA4000BC32337BDA6CCAB6601D796BD46FB4F329 +:10DA50006A8317978B1DE987A4912AF4E9F0DE0207 +:10DA6000C3CF7D165300F4B6BC87597CC41CE27F3B +:10DA7000BA5AC2770074FAFA5C0BB37BCFFDB505D6 +:10DA8000E99C36DE50097E2E0B7FCFA11F7B77A746 +:10DA90006DBC6A4D7BD877733AE2E15CEE3F3C2E79 +:10DAA000B173CB5C4B21BBF7BB5EBDA8C5C7D8F13A +:10DAB00013F61BD36E9FC4EC24FB5437C6838976C0 +:10DAC000E72D4C8E5F34F7DD60B8C27DF079E64E0D +:10DAD00003959468FEA4C532239E5E20FA6B3B97A3 +:10DAE0008BF30431AF6EEC1E3D4FAC5EA11ED09F98 +:10DAF00027D403FFCC79C2F5887A60156DFF848145 +:10DB0000F9DF88E2EB3F59A30775B1327DF080CD94 +:10DB1000DBC54AD327B8DE48359CFE5A7BB5A897AB +:10DB2000BE348F1C1B167DB74D52E80CF1DD0DFF86 +:10DB3000729043CA0C827281F29F7BE2C50BD9EDD1 +:10DB4000793D601C41970F1BDC35D52C8E01FDC043 +:10DB5000BEA5B351CF9BBAB404D396A397AF01FA35 +:10DB6000CCE3701E60E5F69324463792E41F60858F +:10DB7000F87CAF6C073FEBC27A99FBF1D87B575327 +:10DB800027C869F0FD9859C5F3E13E3BDBEF63849C +:10DB9000BD5B9377D0E4ABA3E965923BC1AAD13BCF +:10DBA0002F9302CC938C74F46B8B7B8CC748169BA1 +:10DBB000EF1AE637B8B8260BE39BF7A97A3BD5589E +:10DBC0002BD393C75AD9BECFE6EFDB019EC13B13DF +:10DBD000B31537DA0D67478CEC7D353A0FC4438BAC +:10DBE000BE9F22DE4F515B3F04EBEFB3C4F6A3B000 +:10DBF000FE393EC7C2FD354B7E31ACE732F14EB047 +:10DC0000221EBA15804FDEF0C6C3C0F73AE6F30114 +:10DC100009F87CC56529D413EC68752A9EDB9AB98E +:10DC2000DE7FAE6E7FFA6C9A96EDF8C001E7C3BB5B +:10DC3000F93E9D539AF03D8A452FC9789F9AA26F6D +:10DC4000FA8FB0FD9C6C761F84DD6710F2EF866F53 +:10DC50007B77F7613D763F41E85DF9E64010E6B736 +:10DC60006FB98CF62A2A1F75EF9314D6B17B0BB1CE +:10DC7000FAD812ABCAE338D93E2E71B17112D17302 +:10DC80005EC44A821A7ACE53DC0ACC3F2FE220418E +:10DC90000AF773A737AF9B48F13C90A1E2F98F4A8E +:10DCA0009B46D407A3FEF1467847AB91AFE740DD32 +:10DCB000D469F0EECAEBA472D5205AA720EC4F65C8 +:10DCC000C44D4F6FD9517DACD0A5D70363F5C4A225 +:10DCD000864757C11B2DCDF001C6379B30BEB89D7E +:10DCE000FE68BE39AEDE48C8A3883F37BCF4CCAD71 +:10DCF000F02EC50D670C2E98DF34AB9BD153DD257C +:10DD00007C37A19C84A64379799DEC0AD1560748BB +:10DD1000DD75202F857C1770095DDE6FF6801CB0E5 +:10DD2000C8AE15B04EF36D3688BF18DD323015E43D +:10DD3000DC3EB38AF6C93C4B5FDB1C0D3EEF4B6506 +:10DD4000EF091C48EDADFF6E5E771DC8BB5D3C9EC4 +:10DD5000ADF1E49DB630D69B9A8AFA9A90EF317A6B +:10DD6000ACB0838DEF2BB7D9C1B4FA2F91373C6E8D +:10DD7000A1E5B75EABE27DB88230F3A7B693EF972B +:10DD8000FDABF83945F7BD88EB0DEDE47D14CE3AD7 +:10DD9000FDF4552BD7CFDC6410E89BA1CBEB16E24A +:10DDA0003DDA8624D70AB433307DA6E578E9BA098E +:10DDB000F0FD6D99D94D2ECB4847FBF62CEC19D6CA +:10DDC000D02F9514B86F5F0EB970FE35BA2F5F9ED5 +:10DDD000B07A028877B5D7C5F79705399C425D9927 +:10DDE000FD3DD095BD8FC1CEA33745CFA34DC00F0C +:10DDF000E07D19101B191B8E18E1DC7C8EAAE888C7 +:10DE00005F74D1805F3779C3B24B339FE356662F7F +:10DE10009866F51E023E122079DDA872424AACDEF9 +:10DE20005C880F6F9D4C5C9BE97A769FCE93549AE9 +:10DE30001FB325CB23D1FC4E5038816FBE24072160 +:10DE4000CE6427DC67A3FD2E68AA3666D171037500 +:10DE500032DAFB1770BBF969359099ACC18F5F2638 +:10DE6000B1714FABFEDF423FA73F31A11DFCF4096A +:10DE70006B5C797B7B12E397AF71793624C98DF99E +:10DE800050F3ABAF77A5F30A455C4300EEA5DB2E5C +:10DE9000C8F09ED28D5C2F2B7EBC6915D86B266E88 +:10DEA000685580EFF882AE4210B553B6795490436E +:10DEB000D3B6FB54D8DEE97595189F34A3BEFA009B +:10DEC000E4EF0CD562FEBA24FFDF00AE37AD69DDAA +:10DED0000FE8D2A79A28F8BECFE74CDF4AE3F3E871 +:10DEE00015F1EC732236E71A00BFDBC67FA84901A3 +:10DEF000957EE22A363EED4F4D82FE2A5BF341AE1F +:10DF0000652E65FD6592BDCB9DEE68BF632F3749D9 +:10DF10005A3B42DE4F16211E3DFDE0A29E60670F78 +:10DF2000FCC944FA66719A4885EFDDF9FDB270FFCD +:10DF3000293ABF74C8C4F08698592AF0C96B66782C +:10DF4000E4B2825EF0E3272BAD4017A93EB7511B28 +:10DF50007798B7AE78C09B80A71613DAE3BE1CC2D1 +:10DF6000F4F62F1FB505F9F97400E0AD9053B363D3 +:10DF7000FC2E513A67784FBB08C23C444AA4152E88 +:10DF8000A2CD935006CCAB4712E3633546F74C184D +:10DF9000AFC66A72C178B3CD7D8DC097DAEC9A3C7A +:10DFA0002E6D34D72B779FDE9702FBFAE590E5992B +:10DFB000A02F870CBF413ED4115E3D66F566273128 +:10DFC0007D0EF57B517FD749EB409083AF097DCB28 +:10DFD00033AB27AC57B49B9AC4F4A89DDC3F27E829 +:10DFE00020B58978370D445079776AE0313189C995 +:10DFF0005191EE54DD0146472C9E73A73D64EE0D12 +:10E00000F4BAAB37E6537DC4E681F895FABE1EF04C +:10E01000D3503A9F98A489DBBB91D37F6A532BD20C +:10E02000DDD59E034670F886945A4E3F04F910D011 +:10E030000FE3CFA16EFC1D1EF4FB015FE0FBD34597 +:10E04000CAC03870DC67B1EE544EF7F773BA0638C1 +:10E05000407939CF8BF2451C5E85F240A7366EAC15 +:10E060009DDC5E9A41403F2C5CDA15D3724E670B03 +:10E07000CC8FA29D7441EAA3681F4DF55663BAA0E8 +:10E08000A01ABF676C9885F8B1607DFCF7C5DEE229 +:10E090007AEFB9D306F68E94C1DA15F04F9437595A +:10E0A00055CE0FFD0F023E9CA95BF7E46077D4DEEE +:10E0B0007BA686C9C112AB5EAF5BC6F161F7E7FB19 +:10E0C00052005FBEB4544FBC13E8648BEC5A0EFB95 +:10E0D000585328B9E3E09F16CE00D78A9A2FD0AFC5 +:10E0E0005A4EC2E8573DC3F53137F79F0A3F6BB030 +:10E0F00086F1D7D32AE3EFA7A51409E803F83BF08C +:10E10000D9D3271EC97C10F048B2A35E037C738765 +:10E11000063F166EDF54D595FEF3A6CBECDE4E48D7 +:10E1200021362D7F167822F86DECBC37F17D1578FD +:10E13000383A2A87362571BB686FDA6FF9A317D191 +:10E140002EFA32DFBF1AC037A0E73502DF8618D8B3 +:10E150007B697A3A1EF903F1EF5D8F3D95897687E9 +:10E160001C4AB7F0BE1AD0751CBCD8C3F1F231AB53 +:10E170007F17CC3F96DF9F91FCBF4DE91D6DBFEB34 +:10E18000E42D03666BFA59CFE1F1A5EAEFE98A03C2 +:10E19000AF285C4957D8E712BA330007B241726919 +:10E1A000E3DD533730FBFE7B9C3F88EF222FE03DC1 +:10E1B00036FAAEDC7B494CEE1B4124670499DC2720 +:10E1C000865BBA821C5F60F5DE827696470D04DFBF +:10E1D0005195F210DF536B9E38F9ED70482DBDD08C +:10E1E0005F42DC06F0832E78D88DE7BD15BFB320E3 +:10E1F0009E9D4862F1112B6A54C4B7336A35C6E15B +:10E200009D3951DA13FC2D814F981C4A044F813FF0 +:10E210003B39BF1178D76B2DC3BB1AC56B05BC1337 +:10E220007254E0E7992D370F057A13EDA378E31ABE +:10E2300022F06616FDDE6B4D5886FDA1FBD60A70F6 +:10E24000E8BDB615F957A27D137E34B17F82AF0FBA +:10E25000B319747E03838DCD3F3581DF3F2AD7F418 +:10E260007C98EE87641BA1C77FB85A29E8A9B90337 +:10E270003AB8C7C6DE77AEFACB1CF4DF0B3F8CF0A2 +:10E280008F8AF1536C0C1F12F9515ACCFE4EB618FE +:10E290003F9F1BF93AF39B88DF33B0780B8B63DA2F +:10E2A0000545C02F8E5B83DAFBB9D72AC4AB0CA51A +:10E2B000D861CBC2795D0BAC82E653971A491F7ABD +:10E2C0007EFA72D4DE4607AD3FA1355C7C3D5DDA57 +:10E2D0002E6378DA24B0EB126F29E8136883073CC9 +:10E2E0006F66FD1257AD6E9E03389CC5BE887527BC +:10E2F000925B89F6E31E1BF77BF1F2583A37F2F294 +:10E30000D39C8E3AA6D38013E8F42612580EF1154A +:10E31000F4A08D71696D744A0FDED07F01EF577CD8 +:10E3200017F938745A604BD3D06924CCE894D3A33E +:10E33000B346F5C6D34FA6D8983C72D614E6823CB5 +:10E3400071FA30AC9CFE30BA5E40E91AE83500F450 +:10E35000D919E0C9E8AC97B71AE3197BD530BDFAF3 +:10E36000CB64B6DE05377AF7C27BC80BA85E2FD127 +:10E37000AAD59CAE13C33DE494987C72023FB96960 +:10E380004C381FE4AD1BEC169DF1575BE0A68C1DCD +:10E39000438221BAEFEECB84F189134FDDFD20F0EB +:10E3A00087476D78AF49C89FB424FF3CC0CB44F485 +:10E3B0004CF1D20B76A7C55FDBD8F92F81DF7BEC60 +:10E3C0005203E99382785EA1C5F3B1BE5619E09A73 +:10E3D00092E4CF5093E9F836EF38730FBABE2CAA07 +:10E3E000DFD2FC4F697E2D5DC7D64E61C2F355B6B4 +:10E3F00051FFB83D2EB0F6A6D7C1BFBF25C9FBEF70 +:10E40000308F16B32F00FB7C53B75619E395AED26D +:10E410006F5F017638BA9EA3B70DF8DD2CFA75F65A +:10E420001DBE2A2815F6E291DC5E5CD13004EDC8F1 +:10E430001ABBF12F6D57B01B7734AE83D33DC56F38 +:10E440003CC739725A65E08B82AF6CB475E2F81C38 +:10E450002670AE10F4057C09F45A113F00F6433BD8 +:10E46000FA2382887F90770E8DF29BB5D586B8F11E +:10E470004DDB6DB6B87C9434FCEDE507C53B8A8C6A +:10E48000AF6EB769F48A9AEAA3E94C4F65EF92DD63 +:10E49000CFCFF2EB5678DEEB931ABDD73CCA640CB3 +:10E4A000C07B8AF460E67669E223A506296487B812 +:10E4B000BB6F6811E0D137064CD7FDBBAF280BEC22 +:10E4C00025870D9E1504E310103E393D09BEB35358 +:10E4D000CFED9CB9C76C5EF0EFB74866E49F2D475F +:10E4E000AC01909F2D7603DAC71B779B902E2EF5FB +:10E4F000B1723B465067EF10FE9A4B6FCF4901BE99 +:10E50000FF24F75B3E79C735687F14765945A13003 +:10E51000EF04662976EF326F6957B49B0A3B6DBAF8 +:10E520007996C4828458FF8A99AD2B5DF14B60FFC8 +:10E53000DED4417CC35F6D46A1EF1E06F8563C1445 +:10E5400036C27955E8BB421EF76CEEB517E21C7A6D +:10E550001631B3D8A6668301D6B789A25172567B0D +:10E56000BC12F8B3A97D1CC1099B865F4E5ECDE24B +:10E5700008DAF2BCDD6F791CC1D8E3475FC4F7F25B +:10E58000CCFE8F74ED0AD3ACF1DEE19EBEF4416C9B +:10E590009F08EFA71BD8FB3BB1DF4D76CEB795CADE +:10E5A0006E78FFE9AF3F4E72C7B1C74CFFCB6CFC32 +:10E5B0003D11B1F6B3E8F8FFEE29A0FB26D9DBFC4C +:10E5C0009499E037EBC84F193BEF43AABF473CF99A +:10E5D000141B4727C66BDF9E9DBFDAEA19897F8728 +:10E5E0008DF53B54D36F8E9DE93DD32582F1EDE44B +:10E5F0005B82725AE009857B373B2DCF7EE7D830AE +:10E600002BFA715A65E003970EF7E98EFEF304E7E3 +:10E610004D311F42FC7DE3C5694C877776E2AC6FD4 +:10E62000849DC9E7E92AF3374877F4C5F3FF748B73 +:10E6300049D2C6E567D9251D3D097BF33ECB48BCD1 +:10E64000BF0876F978F08BF5C366818F348DC1C52C +:10E6500013079F84DF4FC0B92AD79BAB30BB18DEAE +:10E66000434BF532FE995A44D07F3652F2223C6E2B +:10E67000B6337D69138F7FBBF4368B57CDCE75E3F0 +:10E68000EF71A272A2D03E02E3A95E3468E2A9044F +:10E690009E543D47E5B1CE6EC8E84A9C9B93391F16 +:10E6A00076C17B129A7AEE87800744E540F755667B +:10E6B0005D3E73898B281A3991ECCDD0E5BBFB5CAC +:10E6C00056382F752F72EBDA09BC13F17CF8930AD8 +:10E6D000EB76A1DDA9139FCF48C98F78037C0DECA1 +:10E6E000C1F7F27DA2EB9D037834B6287C498B37C5 +:10E6F00062BD1DADEBE83237F2C2E3CBE87C295FA7 +:10E7000098B3366B7906C2DD45E01C71729919BF6A +:10E71000DFCBDB273F3E0BEFC926AF72A33D36D9D7 +:10E720005BF93ADCE349AE74E3BD81B9D59204E705 +:10E7300074CA67B0DDC6652E4CC57EBB68B9648BF4 +:10E74000BE239E487EADB2DB74FADE15E4D72AFB09 +:10E7500088F6F2CB60F6BC097EFDB206D90D78B121 +:10E76000B2B813C6F7AEAB65F7D9F637B0B8BA751D +:10E77000D3991C11E39E7FC989F2E2BCF87D29DEA2 +:10E780006FD2A7A0BFFF9B74E0B39B6CFEC7EC1ACF +:10E790007EB9AE618485BFAFAC933FF4C705F71B6C +:10E7A000D0C726819E34648DD21BE9FE29684FE6CE +:10E7B0008587597A039EFA3F8077482F1DFE3C13C8 +:10E7C000F64FF8EB843F4F8C23FC7D92E47F463B71 +:10E7D0007E7B7F9EDE0F253BCC18879B23B3385C66 +:10E7E0008D9C25B08F2B411FA478B6F28815E1B11E +:10E7F000F25B466F749E2FC0388DF66CC41F214F9C +:10E80000E93C07BF4BA2F3AC30B4666ADF21D5CC3C +:10E81000B3FECAF38C8953E5F392ED0ACEB785585F +:10E820003D30AF7AA3E7B01FE4EC792BDAED5ABCA8 +:10E830003758E03DD916728305DE99DD6EF337C295 +:10E84000FECB3D5A1DA067EF6F18D61FE69BC8AFE1 +:10E85000DA6CCB7B03E645D7F716F20957F8D2F30B +:10E86000EEE8FAAEE08F7D0FDA7D8FF51FFE3EEB0E +:10E87000AF80DF8FC10CDDA84F499CEFC6E295D475 +:10E88000B0F76B880FA2F4837199814C125C49E157 +:10E89000543588E117994BF8EFC7D1E3C1269BEFB8 +:10E8A00034AC57D0DD15E0D30CF37EDCE63B0FF53E +:10E8B000611E70CF83F299562EAF5E341AA27A543D +:10E8C0004A0AE357ADC904E36762FDDD76FB94AF06 +:10E8D000A05D7A3FBFE41AF8BDF09C38AE08BF10C7 +:10E8E000C63D887BA665E09785F8AD3AB559FF7BB4 +:10E8F00074F470D86EF359A1DF401E7B2F0EF06ABE +:10E9000025B9223C1C0E84873FD941E1615729BEBD +:10E910000050726665009C5BCC2C1E60E772068717 +:10E920009677181C761D37201E3F410620DD0D35D9 +:10E930005CBC1BFAA7FCA31BF433A6B55682F36F8D +:10E94000E712B701F86CB7568F6CB832DEF6743048 +:10E95000BCEDE560FB703FECC3B0B7995DE60A78AB +:10E960007B0D8CF73DE07EBD63C4D5F3178A57C39A +:10E970001C1ABCBADAB82889DF8F8CED8F9E87D03D +:10E980004FB0779709F951F94E761FB47CCF293CE7 +:10E990007797BF6A42A42C78D5C2EE35D4B1F2F392 +:10E9A000B9F1FDF9631CEC9C55567B9F472F77030B +:10E9B000F8FD97DE8BAE3E72D43F9A3281DD13585C +:10E9C0006911F1A0CC4FEAE07896D2C3E705B9927D +:10E9D0005248F0BE80C3C6E206DBDF0760749BC608 +:10E9E000DBB95C6E09E01D7B3F200DDE8B667E6E21 +:10E9F000C417D960F580DC4F298AA9672B423F6A8A +:10EA00005ACC7D82390EEE4735920CE023B596F84C +:10EA1000F7805A1D42AFB3E2B94EE1F36AB41BD995 +:10EA20003B2E7633AE7B71324929C6BC82F23CB6AE +:10EA30001F91267B0DBA7B26294556DD3B0A69BE10 +:10EA40004EBA7CE7195D75F5BBF87BE9CABB950C3E +:10EA5000D095F7A81CAACBF75C7A83AE7E16453812 +:10EA60006DBEF79A5B74F5FB564FD1E5AF5D7FA79E +:10EA7000AE7EFFE06C5DF975DB4A75E5836A17EBE6 +:10EA8000F2D7D73FA8AB2F27D0B35F72B0F38E2C4D +:10EA9000F46CFB703FDE2BB29B2593E63C57CDF721 +:10EAA00023D7519401FEC755F6711970DE6C4CCE18 +:10EAB0007686E3F42BD27FF41CF6BC436F3FCBE3A6 +:10EAC000F6B3F3FB281781DF57B19FE201FE7E26E4 +:10EAD000FFF30E6E0F98E586FAFCDD0AC583EB980E +:10EAE000EE30A35D2CB6FF6A873BEEF94936785CC1 +:10EAF000C552627809BCEC085E2FF3F9FFB3F03A17 +:10EB00001413F723CE6FB1EDCE390C5CBFF637018D +:10EB10007F6B3BA79156D987E7B4CFCF0708F05357 +:10EB2000827A4B223D408C2F49BE4FA09F587EEAEF +:10EB30005B3A8F9D330D5EBC8F95E8FC76CE117BE2 +:10EB40007E2B9C81FB916CD4C1E9D3363AF7EACE97 +:10EB50006FAB92B3F1FCB64AF5665CCDF9ED5307A5 +:10EB600032270A77373BC78AFD347ADCEC1EA75E72 +:10EB70007F69AF6F53F947D7B90EF43809F4B2146F +:10EB8000A67FEF64F7FDC5B857A16F13E755E8DB23 +:10EB900026E259A3C8B85F4627AC7F5EF87E8BFC9F +:10EBA0000FE9D74EE7F7907FEFAB1E8CEF7F7F82A8 +:10EBB0004CE0DD954B4523F19E74227CFC90DB5F9D +:10EBC000DE7532F87664BF787F59C915EF57BC3FC0 +:10EBD0009EC5514E89795F778493D1CB2427C7078F +:10EBE00013B3439C7BD98EF1F0E76EF9087F2FD2E7 +:10EBF000B9BA61C303F87BC03C4B206E2660B3A357 +:10EC00007D6FCAF811C397DB3578C47FDF58FE2BC0 +:10EC1000EF38C07E336547EFB4802D31FE4CE2EB18 +:10EC2000234AF81A8C977EED0CFE3E9A29BBFAA671 +:10EC300031FBA23ECE2CD6EE33656939E29BC897F4 +:10EC40004508C695B5E515769FB82CA2601C5A17E5 +:10EC5000279783DC2E94105E5709CFD8EF029EEFE2 +:10EC60008F3FC3EEC55BE2EB1B3F71EAFD16B1F7C8 +:10EC70005212DDB798CDF7E952D128BC5F3FC5E805 +:10EC8000EE7B35762A01A7A6CBA792802FEC81FBDD +:10EC90002E71FAFF9193F1B33DDE13296096CE35C4 +:10ECA000B7E603FEE7723B789C78FC0AA0BBB19103 +:10ECB000A21F241E7FA993DBED78BC7B81D3CDFD01 +:10ECC00092FA78FC8EEE134D36C6976FD3A2F0FB06 +:10ECD00008E8F5FE8D2AC6EDCDA7730880FD6D937B +:10ECE0008AF6B70F2E9B08F8414E6D509F8138B3BE +:10ECF000928DBD373E4EF325E34DE8B799BF89BDF0 +:10ED00003342C65B82E07F2DD9F4403ABC1BFE192A +:10ED1000A5DB4554699ABFF1098C7BF9E0F823180B +:10ED20005F7D06E8997E2FF9F667D301FEBB8CD58F +:10ED3000D70DA1E9A2ED92EE7E44698D459717F1BA +:10ED40007B62FF8814BD37E1A6726433DF2F21AFE9 +:10ED50008745FD5D9B9DCCDE8171F0E513D8FDA854 +:10ED6000FD27D9F9FD401F16DF171A7F7BF110BA76 +:10ED70008EF169EC7D96D8784002CE31783F85C718 +:10ED8000EB8EFF4469BBC7C2CABDB642CDFD80D77A +:10ED90009755E2BE8CFF35B39B8CCF6271ED09E3D2 +:10EDA0000433DAC5F9F703B9D92E3E307A7FE76824 +:10EDB0003CBCF9430C5DEF3FC9E201E7BDCDDEC7C6 +:10EDC000EA886F7EC8E7FDC1F101773D4FE1F1416F +:10EDD00011E3E21F5CBE7935BE3FE39308C4659E34 +:10EDE000BA1CFF9E58B253E84DFEB6FB34B03F53F9 +:10EDF0008B16B4E5812C6FF3DDA7BB6F73F5FCE6D2 +:10EE0000CAFC64A593F91162F97B2CDEFF9FE2EF47 +:10EE100053C61FC884FBF734FD1DDEC3DFC1F86392 +:10EE20002C9DC7F27331AFD8F996450CBAB8E16999 +:10EE3000C0074668F9B911F93C55EFD9BB30D94A3A +:10EE400070A5847A80E4A270186E0BA6E4D221FE2D +:10EE500007B1ADBCC8008000000000001F8B080097 +:10EE600000000000000BDD7D797C54D5F5F87DF3C2 +:10EE7000DE2C496692C96412929084093B15718018 +:10EE8000B008A82F04421482032AA2069D84256C90 +:10EE90002191AAC54A9B810444441AEA8614ED4094 +:10EEA00041F95AF41B116B6C834E04115C6345C528 +:10EEB0007E15C3229B2811AC1FEAC6F79C73EFCDC9 +:10EEC000CC9B4C58FCFAFBE7173FEDE5BEBB9FFD22 +:10EED0009CBB4CAD737D82BF2F632929EC369F9D6F +:10EEE000B1B3F87755383D611F69760E62ECD138C1 +:10EEF000BFCD990AF5DECC1CC912191BF856BDE22C +:10EF000087FA271536B93E46BB1FE34C8C41BB2D13 +:10EF1000665EBE05EBF50D97A739F37F8C83FEB6D1 +:10EF2000DA20857A8CD99C877A3396C74C2C496530 +:10EF3000AC58F1A7E17815B69695A5503A6FF7B79A +:10EF40001628620F5BFCE95A1E63814C8B77636E57 +:10EF5000FB713D4EA804EDD2168C6407073266B5EE +:10EF6000B140DC00C6148D05CC03701CFF2213B425 +:10EF7000D72633B65C61AC19E686F559EF74134BAE +:10EF800063ECD736467F81910C27C30207E28335B5 +:10EF900030CE8F4CEF8970F889E9BD705E9F30BD2F +:10EFA00037A672DC5AB14ECDC4FCCFC58047A953F9 +:10EFB000E1E3305F4F9F83B1E923993F121E321D79 +:10EFC000E7D4A85EFE2337E5B440F9E7FB6FCE61D6 +:10EFD00090EE787848524B8CFA32FD437595771451 +:10EFE00034BDBFDA4F6912633ACEE781EA99DE5148 +:10EFF000DD1973421EE735DDE2EB991CD1CF65CEFA +:10F0000064C253E2E55B9ABBBA193BB442752A1E4F +:10F010004899A908DB1F0C26156DEDCBDBB90DED6A +:10F02000F83C55A633D60DD66DD7BE6B11B03BCB91 +:10F0300070BD8CFAED689DA5024F16E6B5617BCBDD +:10F04000816B6CAC2BF4A7E84ECC4B7AB81C4640D5 +:10F050007AB8173F5D0E74A7F86F71523B3D459625 +:10F060009FCDC5F18B282FC767592EC6323A861718 +:10F0700053743FF67394E9A598365802973861BDEA +:10F080000DF16C662C7A2E17F8EB21D6C598DD7938 +:10F09000F812311ECC6F63823E1BFB3969F3CDC57C +:10F0A000F4CACEAD352AD24D9C53D46F61887728EF +:10F0B000BF1DCB597A0BBB16E07D254C763964FF1A +:10F0C00071F400F3009C125B0F310F8C9F88F88B5A +:10F0D00001376B32E7ABBF3356149BEF142A5F281E +:10F0E000E6B901F8C5E40EF3CB53D0EEB9BEC8774C +:10F0F0007EC177FA350CCA37FCD1A52C87F2AEBA9F +:10F10000C784F4E16E667A10E121E02EFBDFEBB4F8 +:10F11000101C900F9573F0E1AA8BE4C30D7F1C6760 +:10F120008AC379FE96797B78B0DCB3D806F927E6F6 +:10F130003BBDCB21DF6D05101AD4CF5E10BF5E85BD +:10F14000FA6B9D7C9D5D1E628BE3A076EEDA560D18 +:10F15000E5C3B885CD9A0DEAE7D6B668289F5EFA72 +:10F16000ED9A1CA4AB639F5FA33AB0FFAF65FF00AD +:10F1700020E0F7E14E8E4336B4B40BE267B393C39D +:10F1800057AEE38FF1FEA7089F55AD0556A896B37D +:10F190008069282F8F29FE3FA774C37EE32707FBD2 +:10F1A000227A39BDBD74F8789F32C8BF24F95D1941 +:10F1B00099C9D2191BB1C14CF01CB1E1E15B11DE60 +:10F1C00023368CD114A8F2841652345C6795AE05B0 +:10F1D00020FFA6D34CE31FFB7C761705E7FBB19518 +:10F1E000F58801DF9D62FD9B9D5C7EFDC3129B6ED9 +:10F1F0005F6D933B9C9F863345CAD757857C4DEC0A +:10F2000006F09877F72992AF7F717AA8DF27B4FAD2 +:10F210009D99342FE60DC0A7D99BDE23792FC79186 +:10F22000F5E66C5EB714EB65DDE1ECAF7AB05D4BF3 +:10F230001CD2CFB7711C5FDFDE1D1F5CA410FDF771 +:10F24000F75D1A830F59C86A4A270CD878AADB4C95 +:10F250004301AFADADF928F7A0CBC5C89785C91E4E +:10F26000035ED6B53AE3915FCEA70F0E087C5E2809 +:10F270001D6E4FE67C03F25F473C05066BC11AF832 +:10F28000BECEEE3F8AF23FCF1E4CC9872AB5E7D7E4 +:10F290009B2710BEA0374FFE2CBD29F4A5D49F6D2F +:10F2A000E5029F35427FC6D09B3FC6D29B6E16BCFF +:10F2B000BF1FAC879D307937B2F6E32E14FD9E8CCC +:10F2C000D7D564187F84C27C386EE289034C89905C +:10F2D00043F3045F6F1174F0948BDD3621C63A66F8 +:10F2E00009FA3495B45A5AB09F4685E8BFFD7AB9F9 +:10F2F0003C01B998928C7CD605E4A6D25E6EC6C05D +:10F300004726CEB3F35BFA76249261C91B1200FD47 +:10F31000E7C2474E32E143EF82A984FF80B3EA6D32 +:10F32000BEBEEDE1DF3399CF7F9843EF81F54F0B00 +:10F330003EEB082F8392393E0A93B93DB3C521EACB +:10F34000C519EBDD96CCE13C35D9C89711F81B9473 +:10F350001C037F520E9F8CF70DC575FFFDE89604C8 +:10F36000A4238927297FA2F115E6B345B41E807333 +:10F370003EB68FD63FB27DB41E0AB70FD07CD721E0 +:10F380001D21BF211D79B89E58D7373C3F49E7253D +:10F39000627D67E3F5625C4FF43C9D274CCAB9E699 +:10F3A00099DCEA5690FF937527A5FF386A52705E84 +:10F3B000CE564DC17939857E8CD683202E04DDF062 +:10F3C0007EB6A3DC80F1977E39351DF1BC34DF9F1A +:10F3D0005E05F5AF71E8FE64E223BD14E131C5A11D +:10F3E0009761FA631CC7F3A0647D1AE693851D1527 +:10F3F0003DCFB9627D00CF39D84FE22816407D78E5 +:10F40000D5197B10442C8000E60DFA2151778E44EB +:10F410003D96B89679914E53125A9BAC906F7D9859 +:10F4200079D743BE67C063B2A27EBB435F8CE9D28B +:10F430002F55B23B97E6B3E062EA87DBA1ACB66B2F +:10F4400090F437F05B24BDFE5ECCE3F7C99C2FC17E +:10F450000EB92799E3F977984A3B44F2514776452C +:10F46000041FD652BB0BE7C3FB71FD17C1877F4852 +:10F47000267F42AFA3799E870F1F0DF3E12358FF2C +:10F480007C7CF8A4E0C3ED22ED880F5F13707B3322 +:10F49000B943FFE3C9587CE816F420E91DF910F5DB +:10F4A0007DA39827C8CFBFC6A2F70BE0CBADB1F8BC +:10F4B000329A1FDBFABB40FAEFC8FE1BE23AB7FDF7 +:10F4C000D76CE77897FC0CFCB253F0CBEB825F76FD +:10F4D000717EE17A399ABFDAF44D2B97138CD525DA +:10F4E00020FDC879EE97FC13AFBF17C967D24F91C3 +:10F4F000F093F5FF23E8FBA848135B0F30940B0053 +:10F50000B77F45EA8DA704BF048632E217F0B746FD +:10F51000A25DF9D209B0232167777179306275F362 +:10F52000766475A6D5254C74740CA72B5D1E01CF8F +:10F53000D87082F1BF8885B746C49BBDBD3D1F8D85 +:10F54000AFBD623D761787C7CF9D87841FCEE3325C +:10F550009A87C7B43C42CF2B2E45D21973417AD536 +:10F56000A85695D1BC4209E042B5C9539605EDF3C2 +:10F57000DAB7B785DBDB5C30CFAB7468DF37DC1E16 +:10F58000C62779D7ED0E90676427EB26D44F4B73CF +:10F59000393D44D3FD06B41FFA46E0AB2E93F0B5D7 +:10F5A000D2E64FC3F96DD03C26B4EB362C732A015A +:10F5B000C263553CD28FCDAE135FC7904359AE8B1B +:10F5C000B3073C2E2E87725D1720877A0BFC801CB8 +:10F5D000EA85F5EDE791434304BC86BACE6D0F0C86 +:10F5E00013FD5E29EAC790434370BC6839B4D5C6A1 +:10F5F000E110834F8763FD34A73E02F1047C7A85D6 +:10F600002B42AF41BBAB30BF52B45F5167EA4DF6FE +:10F61000338BF7C6F233C6B9EC063BE50AE13FB0DF +:10F62000C6EFFFF6DBC18C5562119FE738314FF210 +:10F630002736D41D4843FCC39F21AEF2E062EFBBE6 +:10F64000DD116FEFA80CEDD0077FDF62417837C482 +:10F6500027F6639785C7ADFC0E083205F0F29D8949 +:10F660005289C7798D8B0632F023F20FFE90837694 +:10F67000E5C9FDDF517CE484BDAC04C7DFB18DC7B3 +:10F68000494EBF353505ED7339FE7CC417CC6BB4DC +:10F69000DAB73E04EB3DB5CBE2457DAB32CFA323D9 +:10F6A000603E95BBCC2C48728AD9B0BE994F9799D1 +:10F6B000772D6D561331AF05447C43394BFE8C27B3 +:10F6C00009E9D6BC4B65C887CCCDCB03CCB6E82CBA +:10F6D000F89B49434DCC13110F49D6E39927223E9D +:10F6E0009152E432E4537D9986FA9D2677359467EA +:10F6F000F87F6528EF3C7380219F5D35CC50BF0BB0 +:10F70000F83B91F9DCC03586FADD964D34E47BD4C4 +:10F71000DD6CA8DF6B7599A1BC4F70B6A1BC7CF7FE +:10F72000F316F4AB2FD934DFF0FDD2FADF1ADA0189 +:10F73000409ABB039D4C631CFE97352C36D49FD654 +:10F74000327B1CD26DFFD07263BB3AF3210ECF0027 +:10F7500043781E617E0BD299C65A777606B8CF0BD6 +:10F760002ADE10549BD590DB0DF9E18B378A762980 +:10F77000FD605EAB793BD9CFACA0313F47DD4CFC9F +:10F78000138DE74AD635C9938774A0B2A012C6FB81 +:10F790009C4DC6F60CE35DD06E8E584F345D1C61F7 +:10F7A000558F8C40FA08E8CDDDD3C2EB36B3FAC1F1 +:10F7B00021FC2EE8C429E844AE5FCE5FAEDB09FF32 +:10F7C0006139287C0BD2D98C0685AD51DAAF6F66D2 +:10F7D000E3AAA59D63AC93B1A005FDEDE8F9875CB4 +:10F7E0000E37C5AD72580EC6AD583BFEB0933C3EC9 +:10F7F000B5560D5A81AED540EF28FE30AE3F1A8E79 +:10F8000017CB2F1E01076BBA915FE23CF1D1F436A2 +:10F8100038C4DAC335A1B7918F241C255C1DDECC1A +:10F820009874E581FF387C75F64BC2F704C2372126 +:10F830000CDF9336FF4994C3A7F77EA312DDF95B73 +:10F8400006A21EEB482F391C234FA31C83FA3958FC +:10F85000BF3201E46212F473E0879EC86FB29E6FFC +:10F8600041997714C84545F1FFE08A888B34EBAAAB +:10F87000230FF035A741F5A21E3EA9D9972997D1AC +:10F88000323DCE3454D2126F1C8F126F4AE3F6FF12 +:10F8900028002F68E3B760FCB5C86BC3798227479F +:10F8A000714E05DC9BB309A467E353283EA2338A5B +:10F8B000FF9D62DE1AE8AFC6F1B74BCE130F494C7D +:10F8C00021FFC29F118FF6436BCBE967B17BADD9A6 +:10F8D00089E34CF0FB693D43708260573327C029B0 +:10F8E000225E04EDD2B1FD84C7FF9880F6F04B870D +:10F8F0004EA9A45F3E71933D2CED83F6F67580F41E +:10F9000097B4D7C13FEA92C2ED985CECAFCD3F12FD +:10F9100076B5F4733AEA07EC8EDE68CF74942AAFBA +:10F92000AAA44F5B9578EFFA18FA342F4589A94FAE +:10F93000417FE6A5A446C4E3EE3CBD13E51DC07BB4 +:10F94000087E7738C0AE512EC8AE198EF51F4D48CF +:10F9500024BA6EDDAD067B418353364F920BE03601 +:10F9600052E85945031DE20AB7ABB2B9FA6A03B1CE +:10F97000BC4F128BE1A7C87424D64B89882FC619B7 +:10F98000FDD1A503F8BC8A53B83D739FB09F4AC50B +:10F99000BA2B310E97128EC3554EE671E687A3E25D +:10F9A00097A5290EAABFC43EB214D7B3345721BBC2 +:10F9B00069A9A218F6919253F2A9FC16D17F29F4F5 +:10F9C0008DE33DD595CFCB1DE5BF678BFAD929BC1B +:10F9D0005FE0A43E886F8BAAC684E78C143E7F69E3 +:10F9E0003F49BE192BF8A650C8CBAB7B80BC24E6A0 +:10F9F000D2C78D86F251A29CA96BF758A17C6C2FBF +:10FA000033433A1B857209E5BCD37CA0A57758CE59 +:10FA100017F6AEDA81E2614C3A7C8F902745CCD75D +:10FA200019E9E06A8FF1FBD83D85C7905FC7328D39 +:10FA3000FAA1EFB91CAE09AE30BDFF3EA54D1E794F +:10FA4000CE025F87E2FD0F1663FCE16DD5BB9EB56C +:10FA50005FEFFD026F2B849F82FB48E87FB844DA9A +:10FA6000BE3E87CF6B76DFFD044F0DE0097C1BB2F5 +:10FA7000B4D424E1381F301A2773A6DE84F9413E3E +:10FA80000FC338F1D25C66F7227DF637511CC4ED06 +:10FA9000778EB240DEBD963C1566D658C031202C1C +:10FAA000179E4EC925F8AF60354D49503F69EDD7D7 +:10FAB000AC2BF90FCE514E9443D358CCB8E646B197 +:10FAC0009E098F77D5D00F4BB2297A30C63A368A45 +:10FAD00075805CD880F2E12ADBFE814AD7B05C41B8 +:10FAE0005796FEEF9029B85169DFDE662F781AD756 +:10FAF0003F6826EB20CEC9E731DDE6ABA77A7B3C39 +:10FB0000B43F512EE5F33413D3806E6E126473D379 +:10FB1000DAA6FF903DF0C3D9B3AAB4B319F5CF70FC +:10FB2000BFA07CAE2388FB07E58DB9018A0FCD54B9 +:10FB3000685FA3B2F13D1FE6CBF3F29C24D7121409 +:10FB4000E5706F32D11997631A3B2CE945158B820A +:10FB5000FE270BBD20FD79D0032B1200FEE56BD7ED +:10FB600035654095FF01858F78DBABFAF7DE03FD45 +:10FB7000DE00CA69C1004C35564271F474EAE77A76 +:10FB8000D14FE03BA61CB685C7BDA17137AD67AFAD +:10FB900099056C404CE6917C68F36F93687F15F48F +:10FBA000298D3BC956371AF5DC494B6B3F2FFAD7E5 +:10FBB000DB3ECA0E003D7DFABBD30E0678F84C6BD7 +:10FBC00075E0F7A30BDF77E800BF4F17AA4588CF92 +:10FBD0005B85DE90F03E22F07EB9DBB70FE17D5B06 +:10FBE000F58F83FD91719205A924EF670561861158 +:10FBF000F6C39C4D0968D1B4E52BEA530C79A907EB +:10FC00002AACAC2A565CB0B39BFBF3B336AFB374EB +:10FC1000F6E0F8FE561CFF28C85BC4CBD1AD8E20A1 +:10FC2000FAB3723E659BFB5BD0BEF8ACD1CA42E82A +:10FC3000AF68CD6666E77244017AF00BBC47CF73BC +:10FC4000E7CB09D4DFF487B9DC2985B116005CFD68 +:10FC50008DB348BE44AF63FAA79EC24E00EFE9F7EA +:10FC60008126F7F0FA0B016FFE05F77E8DF65AF448 +:10FC70003A4B034679337599312FE560B9C037B0F7 +:10FC8000DF32B47BA7D719EB9537DE4FFD97A39CE6 +:10FC900092DF61FDC96E61870E6643502ED5D8BBD9 +:10FCA00026F9CFA1774E548381DA93B1E3D5364A52 +:10FCB0008F56334AF7A5707A9DDBF8DE5D4837F33F +:10FCC0001A9EB3603FB5C1D1CE6150C5DA081C851C +:10FCD000F625EE1743D329B85F0CF3ACC18964E075 +:10FCE0007EB2AF9B1BDA9B9D51FBC7627D2502FE56 +:10FCF000CCEE22FA2AC1F5F4C3EFDA3791EB39B52D +:10FD00006BA00DC7EDEB16F27608AC4BBDF075C9D4 +:10FD1000F5C8F5C9F20A15E82C467B49DFFB84DCFF +:10FD20009AB661C2D24C0045CDB623E41733619731 +:10FD30006B023F9A7D39D9E51A03BB9BAF53D8E5D7 +:10FD40006C0FF2ADA4B3683A2A473820133B793BD5 +:10FD50009BB0D7DBE8A7F1018287C433F0473ADFD5 +:10FD6000C70BA5E33E1ED0D1A1283A32E4A7D7198C +:10FD7000F35F995B7290BF815E0E45C2F7ABA8F34B +:10FD800023321DEEEE4AFC36CDA3173AA17C3AF39E +:10FD90002D75D2FAEB082E47B5BA9DF720DF6DE03E +:10FDA00074FF99C07B83DB57EA267DA5F7437D3539 +:10FDB000727186EA867AA52B1427F2D3D4DAFE85EF +:10FDC000C88703984EFD4DE9C0DEAA7173F89755B8 +:10FDD0009999059465198C8172AD6CAB1AE4712BFD +:10FDE000DD5E0C789829F05071DF73960C486756E9 +:10FDF00095733B20C8F905E04A76C0EC154DE457F1 +:10FE0000835F1193DFA41EA8A8379657B215848785 +:10FE1000CA287BE0F792CFBCCC8BF4E8BFCB615310 +:10FE200092CEBF5ED63E6E42719553BB7A907D787E +:10FE3000CAE3E984F5FC89FC0C8DA2F987E07780A0 +:10FE400013E9A3D6450941B47FF79F01BF0E6D3278 +:10FE5000A77F8805E0D2F2AF6CDA6795F429D75313 +:10FE6000695B41F459C98C7E63293828180F2DDD50 +:10FE70009812C4FD71E8BF5F03DA151BCD64370427 +:10FE8000D8FC740674E65B62267958D6904C7E6B7B +:10FE9000592DDF4729DB9C1C54B93FBE07E31012E4 +:10FEA0000FFB6B0B2C1984A75C2FEA35D66036D07C +:10FEB000B7C44FB4DF377B59D3CE744FC7718108B5 +:10FEC000FC1CEA003F8722F1B3250A3F6C610A97C8 +:10FED00033B7BFD603F78D4E55C579D5187E84D478 +:10FEE000432C0B08707038BE569429CE3469DE342A +:10FEF000C4E7E91583085FD1782AFA692AE183FD0E +:10FF0000CBC130EE3AA51BBB6D227CBF4DE1FC316D +:10FF1000A5E6EA22D4D76FBAB99C7917E4936E614B +:10FF2000EC3D904F3AC8A7F7416E61FE83EA74CA70 +:10FF30007F54EDA1F4E3EADE941E12F6BCE41B202C +:10FF4000000BDA51EF09FDF89E5BFA4177A4A3E9B3 +:10FF500050F4D3FB834C406BA98159D78CCE66EC0F +:10FF60005ADDA8EF265F6FD4672D6667613ADA7DA8 +:10FF7000F729B4BF50E61B6EA8CF348F6502FAAFE5 +:10FF8000BD0786BF933DE7B14C047EBF695C8AA183 +:10FF9000FEA4659D0DF9636E0FB71B8BBA19BEDF0A +:10FFA0005C7289215F7A06803010A9D94578B8C380 +:10FFB000C6847FEDE2714F71BEE49BAA219D7E0352 +:10FFC000F3FDE62D339547E343E275DA6A13F3C395 +:10FFD000D4A6AE86B541BF87EA004FD0EE8BBD0EEA +:10FFE0008674BC74F3C07786427EFF6633C52FF7F4 +:10FFF000D7A6AC44FB68FFE6D4448C8BFA97AAC220 +:020000021000EC +:100000008E705A5884BC2AA85D44E74E4A83562F06 +:10001000D90B3B024FC8BC4741BE679C5FF6A84165 +:100020008C5301FEB87FFFB495E2F247C16E738234 +:100030005E38AAB05A4C51B12441F9BF9B5383C8D2 +:10004000CF453FA97A3AD2D3D37162DF45A1FE8E64 +:10005000BFD763FD72A22F4F7D88F8D64AFEC0D469 +:1000600016BE3EA60CE88CF83F9ACCF4649844C5C2 +:10007000FC8FF66980A7593D9BFB85A05D496E28E2 +:10008000F5466877628399CEA160BF4EC857FCD50C +:10009000BA8ECB11BDD3844B23E119EC87EB9E6262 +:1000A000F265A7027D1D9F11EC47F26C612AF155A4 +:1000B00034DC0F59FC04DF00F28112968F613EE3BD +:1000C000FB6920D43250CE4C357BD3503F1D5A6152 +:1000D00026BB13F447228E0F9C4C747C48F314E229 +:1000E000BA0F2DCB6528AFE4B8652B54F23B90FED8 +:1000F000A8FE2AD50F3602937A2AB04CF1B34EED02 +:10010000E9E6D7B70FE984EB89B66F65FA15F0AA6F +:100110003FC25E98BD4DF5A1FFC1F25AB4EB2F8DE1 +:100120005C472DDF5F48E7FDDF21E4FADCAEAFEF8F +:10013000B39B50AE774B42BFE2D81E95E8EC58D740 +:10014000BAC1E9DDF0B8C8AB837F03F92F8A038712 +:1001500035C83F61F55F930AFDCC31ADC841FFE87A +:1001600064E3C195C3A1DDF167CC5E1C76F6D3B321 +:10017000BA50DC5DD8D7EDE55628539CF3C9500042 +:100180009E733CF5A4B73D9B61105A7F90FB49429A +:100190008F3B1F52D096620707399663DC622AB004 +:1001A00047A4DD7DD0CCED8292542EA7A47E5F23A0 +:1001B000F2534D9CAED9CB0AF96DF067D003522EA5 +:1001C000CF49ED4AF5DBF432AB27793503CFB1C027 +:1001D000FAE66EB20683B9D4C6897C3E8BA3873D0E +:1001E00095EA213936DBF2CC23C843E5AC99E67DAC +:1001F000DC1C9CD19C8BEDD7D5BAA8BDD94BF15353 +:10020000A14F6CC040288FCA05DF55D429C110F119 +:100210000DD78BD345FF0CF54C84FC6AAF578CFA95 +:1002200064BAD0A3D35954FCB5CEA8DF7C09DCA9AD +:100230009D0DE3A2BE0CCF0BEC6380D90C7F70E761 +:10024000789AB7E20DC69847396B0DA938EFCD3CC7 +:100250000E1F3DAFE8755CE83C6778278C4ACE8B73 +:1002600018376ADE12DE14C08DC08384FB8C0087D1 +:10027000E78C4685F0F5B9B0CBE08FE2C612EFE52A +:10028000CC371ECFD7953F04F232374C076D7AFF3B +:10029000B920ED377CC1EA12ED40F773573F37E9DB +:1002A000726CB7F63DF22F4A5CA11EA664C65202DC +:1002B0007B96175D11639F21CA3EF8A5E083B3D7F3 +:1002C000068B76008FE91B543DAE9FA11EB597F6B5 +:1002D000C1CC40C08271C99922DE77BE795662BD19 +:1002E000011732DFD8F6CCFF75DE7B5285FFD4CE06 +:1002F0001EEA11D38F6AB383CEA37F3F3187B251F9 +:10030000FFB6666BA47FBED1BC1FE5BB511FF720B3 +:10031000BFA023F93A43E8E1E9A897213DBCFAF9E7 +:1003200044F4DB3F7FE879DADFB43C333D11EDE2A2 +:10033000C3ABA7AE0C004B1DDE3C95F470F91AA9B7 +:1003400087FD9648FD5EB0BAF4CFBF43FADC144790 +:10035000F1F9193BFCC2EE0679877270359777EC9C +:10036000212E0FCB515FF5257DD50BEBDD35C3DF9E +:100370000BE93CE23BE9B1BBA6FA87507BE60CA156 +:10038000DF05923384FA4AEA53A9673593DF9486EE +:100390007A407DEB83BB61FD5F6E51C9BDAB50D729 +:1003A000E53831EEDF81DCFEF9F036B5C13BF7020E +:1003B000E05D86F026FB87C3FBC0320EE7832B3857 +:1003C000DC976EEE9688FEED8165DDC8EE39B0B93A +:1003D00007C17BDA728037D9BD1EA3DDB30CE08D77 +:1003E000763EC21BC62DDBE111F0F672782F137A30 +:1003F00067054FA7B5836BE056942777FDC5EA459F +:100400007D7E342E948AFEC8D1E75486E70EDAEC5E +:100410002261BF4838FF9BD53D8176543B7B669572 +:100420009561BC72D60B8E2083FC7125BF1322E030 +:1004300044DDEB89385E78FC363B66705AA41D7348 +:1004400081F899C77C742E7F5EE3EB7BD18E577465 +:10045000EED7CFB3D943C8B7E0EF9C8894E78A07BB +:10046000651AC649BC361BD24116F3F8C8AE91FBDB +:100470003F7E86FB3FDFF6F8FAD6F9C4CFAD3D23C9 +:10048000F7492AE343668C2FB53EA710BE2BEEC872 +:100490004FCC67B8BF5445F3B82E8DEB6345D729D1 +:1004A0006E6805BA8987F126A579F8778F93C71109 +:1004B000D7C2B88EF07CA3BF8F47D2437D6E8F1D0D +:1004C00087AD15E354A826F23BE65AB8FF21CF7753 +:1004D0004C15E553D3B8DF3E2B8D9F9F3889F17DB6 +:1004E000E8F7E4AA04715E7914C533DBE227126EE3 +:1004F0004EEDAB3679857C25E207FBB00DCC739AC7 +:1005000055C47341C562FB5B44FB5BEADEA6FD3567 +:10051000F05C1E47BD3B6581D58BF66B609B95E813 +:10052000EEDE78BE1FC2DC491AF2D1CD42CEDE52D9 +:1005300077BF0FF731A7D425E898C2380126E2A784 +:1005400079B89F9A69A1F86989ADE51974B36F4BC1 +:100550003F78A70D96B6C8C4ED96452E46E7632EA4 +:1005600003B31DE3B17874E46CCAB9E8C7181F9EE1 +:100570008B71DA618C13D65082AB210FF0A5FC9AF7 +:10058000B4D1631FCA62EC9FCC7329E27B2EC206F2 +:10059000E9A13489E200D762BCD885A946743651F6 +:1005A0006301134F9761684DC68FC78B75DF309419 +:1005B000859260BDA1DDCC10BFBE31640AF5023C5E +:1005C0005CAB859A90AE4D368F19FD015F9132007C +:1005D000FDE4B98B2F6CBECFA4F968BE734DFC50FF +:1005E0005FEBDD4A703DC0E9166072A4CF5B35B6A3 +:1005F000431DC0F187F457E9F204A8DEED9CBE6507 +:10060000DC5CE2A93F741F09DF5BC4FCA09F658925 +:10061000D8DE123B7EF4529AF483B9BD3947F0EB31 +:100620001C496F9B8D7CFA31F20BD457D0AE05B8C4 +:10063000DD22D28EE8FD43D1FF8769DCEFDE7191C8 +:10064000E355585988D6BDCD4A7894E35E2BD23D08 +:10065000693CFE26E721E999893894092407D2D11B +:10066000A1BA1AB29B6646C5815964BC4A8D956F82 +:10067000933FA6B3985A5AA7E17C942BE3BC48D782 +:10068000B758EA7B54D9DBD793FBB125ACD9CCEF73 +:1006900013897896D057A3557B6FF4774A94782FB7 +:1006A000DABF27F31D015312C65BCC84DA12A00710 +:1006B00094CF9FC4F1FDF72949778D47BBB024D172 +:1006C000A2617A1B6B76E4E686ED92A5F930D94CEF +:1006D000A4B2C0581DF235284F78FE7E3D8BA24350 +:1006E00022BFE44DDCB7B8FE07C03FE5978ED54189 +:1006F0005E9C7C4D94B37BA9FDC925828E03F78F48 +:10070000C5FA271F96E575BCFC3E59FE10CF3F2069 +:10071000FB17F95551E58BA2CA1FE379CBA30F8DC7 +:100720000DA03D2BF6634A8629244F0A059D952C82 +:100730000E117C4B4CAFF274240BE17D89F3D51B79 +:10074000D0C957887A4B751C72A0DEBE3C432F443B +:10075000BB6340AA3FB913A4B32728010BCAC93D04 +:10076000C19E42AEC73C675D28E8F6B274DE9F8446 +:1007700037F493D929F5E2FB7919E735C8D04FB79B +:100780009FD3CFF2F6F3E9FB73FA3919D58FB48B07 +:10079000EECDD4C7209CD821B7E1FCDC9CDF7B9355 +:1007A000D0AE62787E0E403F67717DCE40E87FCE4E +:1007B000B32FE5CC88F0BBE79D31311DECA7CA33E0 +:1007C0008CD22F9A3EB678603EF3B636590AA15EB7 +:1007D00025A40511F39A2BCF8FB2166D62845E1F8C +:1007E000D7C924CE25AEA2F9CE79F618ED5BCE316D +:1007F000D51F5E83F19E613CFE16BDBE3CD16E1FCF +:10080000EE23C7B0DB2776E27AF8AE2C7D02AE731A +:1008100020CA0C480B6A62EFC3FF49F45712CFE5B8 +:10082000DBD4C10E9BE732DC47F5D7E0BDAE196BD8 +:100830007307601CF786D491B710DC3A8C8BB6F244 +:10084000B868238F8B96B89AEF00E1CD1EE9B4F516 +:100850007E1BF871631F957C062C0B6D8BAC32FFF1 +:10086000E6D8515914E7A2FCDD8FEEB83F00FDEC4D +:100870008AE7E70CA60CB9341EE5424B6E82C90923 +:10088000F2E25677E923388F2943AE28C4EFF956B0 +:1008900047CF521E5727BAB8D5EDBB1DE905EB630C +:1008A0005CC36FE1712EFF1B2AC5B9FCFD12FCB1C0 +:1008B000F6A92B3B71BA79A49393D25D8066B43BC1 +:1008C000E43CE4F860A8DCD10CFD1D5A9CD11FEF7C +:1008D000CF35B8F31F26B888F11BDCFEC59897E327 +:1008E000C372FBE1F70B9D47B5C0C7C3026FBE11D2 +:1008F0002AD323FCC589A3120CF9EBC7A5303D32DE +:10090000DE7A7D67437E72493743FD9BA75D62288F +:100910002FB636E7555D84FD5BE970C4A31DF6690B +:10092000E3BF3FBC05EDBA0DAA5781F5CCDAB6F1AD +:10093000C3E150EB141E2FA5A0A787E25EC7F15CB0 +:100940001AF29EA66B91FB355FB2663ACF17B11FC4 +:1009500060D87799E3DC41E7097FA9FD9AAD9DC492 +:100960007EC0003C8A8CFAE8038AB3CDB3F3F57CF1 +:10097000F9D27E0BDD0340FD01F43D061BAAC8E75A +:10098000018A431734ECA7FB56933A71B93C2FEB1D +:10099000760D2C32560929CAFD42904F49401FCD91 +:1009A0004DECD2AD780E37D741E7262ACE4C642CD9 +:1009B00005E928D0F776A837675911E5E79D89A79B +:1009C0007EDF559B0BE9BCF58B0AED1714779EB2C1 +:1009D00018ED51ACFF6B18AFF8BFC714217CE66D62 +:1009E000E5E72B8AD57FE6613F73EB8AA87DB1CA24 +:1009F0007629601F8C2DE07AB618753BE4D5C18E40 +:100A0000E5A85F554BA8E79F509E581C244F92CEF7 +:100A1000DC4CE3579EB151FB4F84BC30B7F0798D6D +:100A20003EE3A3EF12EF073A7535DC0F34A76ED023 +:100A3000CAEC589F51FD6BCEFC8A52B9CE377AFF73 +:100A4000C58D72CC9CFA4D219E277DC3AD38C9DC83 +:100A50008892B7A7AB8624B118F2A86D9C33FC7CB2 +:100A6000B2F50C3FAF7C20433F837C3D7E618B869B +:100A7000FB37CC6E7322BCC60FEDEF9911C147EA6C +:100A8000AB3759102FE687DEB3A07EB7425A10511C +:100A90005E21CFE347C9E39FDAE4F1224AA57E61F4 +:100AA000E937913D7AABBCCF2AF8E40B212F64FBE8 +:100AB00066A471C4E30B56F29FBECFF027A7433F55 +:100AC000CDF96CF216928FCD39B86FF24BCD1FF085 +:100AD0006C53C8BE6FA1F3FAE3877A4CB81F9096A7 +:100AE0002ED7C1F9F57CEB50D3F93ADE55D902EC9B +:100AF000F7DDABAE6AD6A1BFA67B060E44B92FC701 +:100B0000ED956EE1FD3A5B7F407FAEF2E5040FF2BA +:100B100075313A4779613B16BE338CFF55BE6C5D2B +:100B20008FE7682A13C19F85F10B5E890B211D3762 +:100B3000BD12A7A17E782ACBDF0BE153F04AAF515B +:100B4000E8BFE98D568DE2079DF4DEE9833A9EEF1A +:100B5000F9E453349D49BEF42FE3FC522AE8B44C27 +:100B6000F09F5FF0D1E9AA4EC487A717C2A4719F76 +:100B700073A172E956B4073C0E3AFF23F9B218FD8F +:100B80001EF85E7C4932F97F117C477C38F78C93E4 +:100B9000FAAB38E3117CEEA2BCE4B732C12F566148 +:100BA000474C13F43D3CD37F633ACCBFB806F81DE5 +:100BB000C6F12FCEC8433E0AD38BC5897405F49283 +:100BC0003E23826F6A9A6E62687F58DD3EA2976903 +:100BD0009046DA1FD3DBEC0F67611ACC7B7C6DAEDD +:100BE000E1FE4989C0FF85D2FDD582BECAECA11EB7 +:100BF00068AF9AABE2BC789FEE949BEFCFCCBF8FEF +:100C0000C36FBED95780F6C3FCC7142F6086EC0AA9 +:100C1000944783F7565922E38D379DE9C73C0087F7 +:100C2000EBCE74A7F48654FF6C8443E99949025EC5 +:100C3000FD7ED63EE0209DC797CC41AB771DEEB33D +:100C4000C5F955C4EFD16CE67C3022BE84F1308CFE +:100C50008BC9FD41196FB2E27E6A849EFCB756973C +:100C600083FE4EBBB853BE711F6D6ED33F079BA072 +:100C7000FC78AE4EF1A729267F2DD2F3EC89C1670F +:100C8000CD909FF3C0F38918EF96F0ACD7423D505A +:100C90004FD6031C310E56BF422D0A727B2681EFC0 +:100CA0007F71BA96741C4DDFB3CF74257A3A5D65B7 +:100CB00025BD731AE89545E81DA96FA47C977A476E +:100CC000D27385C6E556853D89CE5584F5CD041F82 +:100CD000C671596FC5DB8345EA9BF52B8721FD9FC4 +:100CE000747BF1AC4F34FDBF589D4EE76CA41E8958 +:100CF000D637529E4BF92EF5D5DA0CFF8B88F7913B +:100D00007FFDFEF97FC1A76B34AEB7AED11C443F67 +:100D1000172E37F70BB9B9DF2037E77520F71BD34C +:100D20002F4EEE3F2DF805EC57B20B51AE47F6F7BC +:100D30007DC6C87711DF7BD2793CE0979A7747F27E +:100D40007E4F1BFF5E98BC6F12EB3D9FBC3F22E4C1 +:100D50007DB47CC70B6D28DF4F6EEB43FBD3FB18D4 +:100D6000E803D47B8D099E8D42FE937E884F0A9EB8 +:100D70004BFEDF9535F54807F2FFE8FF45FE4B7A5D +:100D800094FC22F943F24334FF487E187B3FF87FFE +:100D900088A777F9FDA90A2DB099F60F3D09FD91B5 +:100DA0002FDBECB6AD0AF1593BBD20F826CC274627 +:100DB0003D21F942F289E48F0AC10FD3A3F861BB48 +:100DC0005AFFE03068579DE1CFC81814E68BB95B35 +:100DD000A2F542877485114336DD5DC590AE2A20A9 +:100DE0008DA42B6B07FC90937171FC60CFB8307AA7 +:100DF000EA9FF1FF9C9EFA67C4A6A70119BFA03D18 +:100E000071BAEAA33CBCCF743A0FE46C6E98DEC6AC +:100E1000BEC9B8BDD08DDBFDE037D2BC7759B22951 +:100E20009E33F62C3FD72AE952E259DA01D3453CEA +:100E3000615EA66F52466AD85FB8503C5BDDCD1646 +:100E4000F443A6431AA9FF3BB2776FC9B848BD9FC8 +:100E5000716176E2DC0C7EDFFD17B4137F83F088CE +:100E6000C62B73BA0C7108D07FD791FD16D2E888D3 +:100E70004C877EC56A0E67995F12D2A4BE4D417D34 +:100E80000BF4B200C7FBB9F4525CC0443C70D738D5 +:100E90007D04E0FD0F22CFDE1A877C3869A82CDFA5 +:100EA000BD42D750EE301947A7B8C8BBAAC807DE65 +:100EB000786B14AC7FEC832C1C6787F2D12392DA19 +:100EC000E2280A0BD77FF4B1D7DF5A4178E6E75E14 +:100ED00098BF45E3FB4C229F077947447E68547EC8 +:100EE0002DAF9FA8B5307E4E31C8F955C5AD374EF0 +:100EF0003FBE087B04305988E709C66F559C180728 +:100F0000B979C449DA8F0DAFFF9FE3303E3BAF5153 +:100F100011F90FDFC2F5DEBC95E7B73DF6AF15015D +:100F20004DF497467132FA33D72B3A9E7F983B5453 +:100F30000976CD6D0FE76D1946FF06FF34637B869A +:100F4000E7EF2EA63DE299DA77A5F621EB458C7FF7 +:100F5000E388D8F712DE96FC25E209D43FC0F2BA46 +:100F6000FAD8F7243E10F59B71DF84E0757205D244 +:100F70004FB345C2F3AB1508CFD18CE73F7BECAB49 +:100F80007181BE7CFA7AD4FACF35FFA60CA3BD805E +:100F90007F1E63FBD0B9E0F77ABBF6827E661AE962 +:100FA0002949F3ED380DFD2481FF8F76F13C5FDC9C +:100FB0000AB4FFC3F4F11FA28F6619CF6F47FFDF9A +:100FC0008D1B6527FB47D4FF6105CA379FA9AD3E3E +:100FD000E707495FD0BE377F9F8DDAFFE7B1EF5754 +:100FE000207C003F544E79ED1CFC501F951F11C50D +:100FF0003F82FE897F51CE037C7AC49033E9999C6D +:101000003EBE14E7AA9B47723BB159DC9B1A9AC9B2 +:10101000ED424F2687636F51BF393E020E1178862D +:10102000BF10FA2111EB2638DDE496EBCE2A1ED74D +:101030001DDABB78F980CCF4070259E17C747F7922 +:101040009959C5185F0DF79FF936C2F52601B7A16A +:10105000999DDF0E7079A8205F561081005D6C5558 +:10106000022AFA09481731D6CD32DBF15520AABD44 +:101070006E3E477B4BFBF67A547B66CEBB98F602FE +:101080006FE3A2F05A1485D75151F912990F1AE45F +:101090009F948B650DAB96A4B9312EA9D09DCF300E +:1010A0003DFFAA18E9798E53D2EF2504D7303DF7DA +:1010B0007D1BE5FFC47A290F2F7D4007BC4D407989 +:1010C000382C9CBF0EE505E5FB15EB4991FAE2B221 +:1010D00007507EDEB84CD6F752FD9B6B657FFDA9AD +:1010E0005CE291050614135EF384BE080C7C1BCBF6 +:1010F0006737F2F673D6E4BD1DE87E0E7EA88B82BC +:10110000CBDAA87C20AAFE43E7D12FB551ED1746D4 +:1011100095AF88CAAF8ECA2F33B62F9DA6101F96E3 +:10112000023D2022CEC797F764B6D9A96DFA54B113 +:1011300093DD66E0ABB1353CBF644D7EF1B2BE11CC +:10114000F9CC82E248BE90F77BAD6E467C61EE4002 +:101150005EFE3AB30379D93B5ADFF2F2CFF09F1922 +:10116000B4BF63B00BB6ABC67C932AE73DE1ED3B61 +:10117000EC11FBA0CC578CFE41C7FB2DE38B474500 +:10118000DA2581E262A44BB94E59BFF0C7B32A8E6B +:10119000F7A7CCE2E20DB89F3352EC43BA780A7A53 +:1011A0004D45BD5929E23185783E16EBC5877ACC8D +:1011B0008FB443587D4F5C67D33DFCDE40A006F002 +:1011C00083F135E6B5603CA5292969C193507FFBC1 +:1011D0003DEA02D4A3FB16A4D0B9A43399DC5FD8AE +:1011E0009ED4256D3AE49B126EB3E0FDE4A67B47E6 +:1011F00053FAAAAA2F6D055E7B694D49B1BD0F96C2 +:1012000027117C5EC89C5CBC08E8BC012FED407BCC +:10121000BFCB9986F71AD87233E3EFE5789F20BAEF +:1012200079C0DA1FFDE7D24597D0BE55D9C3130A5E +:10123000E9DEC21233ED67C01F9D3FF12F1F4DE75E +:101240009EA6D58A343086D2577EFA4B4D22EEDFE9 +:101250003FAED07D892BBEA97F13DFE5295FD6CDB8 +:101260008BA87919EC7A3C8F7460752FBA2771308E +:10127000AE8ACE7D427D86F5CB7FF0BC333E0FEB50 +:10128000AB4E3C5A7118BEA33D7CF83E75BD82F34F +:101290004A74C4E379E9C33F7ADE41BB16CA9D8B29 +:1012A000E1FBE125B3D2D0CE3AAC78121558FF0756 +:1012B0006B6617A767E0FD7AABC0E76C4729ACBF48 +:1012C000D4D4462FA43F6624F3FC0799B38B37C2CE +:1012D000FC0F3FD68BCE7D8DEBAC7F980970CAC8D2 +:1012E000D23FC2F4A0B877FCCA4F7CBFF01F27CA18 +:1012F000D2305EB75FF0CFCB67CAD2CA22EC9D195D +:101300005F6A84F7572C9E3B709EAFC4672B743E78 +:101310009BD5A760BC7B9AF03F807E173C1FC3EE35 +:1013200069CC54A9DFA6FB5347205EC3747C37C940 +:101330004FF21B207F6ACD9DA4D70E5917B083288A +:10134000B7C4F94586AF0D21FF6D8E0BC6E562FC73 +:10135000532FD4C98FA9EF39D111C177A2FEA701AC +:101360007E3EF753A88FFEDBA781FF7144EE43C892 +:10137000FAE5898E001A13471C0E0DF1B04FAB3EF3 +:101380008CE7FA663C6E26B93FE3F1D485AD286F51 +:10139000805E303E16BDAE2B3B9B793CA2233E0CBB +:1013A0002C35F2215B7A4E3EB4FF69C939F9B05C45 +:1013B000F829858F9BE99C7AF9208786FB8F231F6C +:1013C0007F6D23DD5BBD3D6E00DE4F287FDC4AF87C +:1013D0006A7138024EDC1F4D7468C9906676E6F873 +:1013E0001DDE99F34D81CA34DB004AE95E82DCD709 +:1013F0003BB6E0C147F018E571169C3404E0770A6B +:101400001106703925EF6545EDF355EC7EDE92CF80 +:10141000CEB1CF779EFD3DBCF18C7C78A1FB7CFDED +:101420003B8B73AE6DFB7CE69EB88F582EF6F90AA7 +:10143000D6F2F35BE50BF83B1C05293CDE7BA83AB2 +:10144000808FDFE27A034EBC9FFB10D72FE54C095B +:10145000DAE09F63D6DE4EEF933E2DE44A29BEA329 +:10146000D517F9C59B837EFA8CC7E308AEE54FCC50 +:10147000FAF03168D7B2A8D81DE9178FE96C9670D9 +:1014800065784F57F67364D1EF7290EE0BFE0CFE49 +:101490002DDEF74B66CFDE948B78CAC8C1FD485964 +:1014A000AF7CF13D3D793DF08FC10F2EBD4FE5F78B +:1014B000A65FB092BE031E4F6711F799A7D5EEB68F +:1014C00058FA86EF7F1D803C5EA98FB80766417889 +:1014D000C97B49F8973E58D8DB1E921FF4BE70892D +:1014E00049A1FB4B20B9E8DECF9D9DF97EE1ECCE12 +:1014F000DC8E2DCDF1D2FD978A9556EFE25CDE4F62 +:10150000DBBD6A3CE7646A9E41FB8F7FB3525CA4FB +:10151000B2364E8F4BE4E722B6F4A573D19A05F7A5 +:101520004D3C5C4EDC29E8AFD233610CD20B94EF1A +:10153000D5F01C9683CBC38A64F1FE1BB437C13847 +:1015400027F15FDD78BF19FD22C657C477E8C7933E +:1015500018EE7797892DC3B80BD6EFD30FE19832E9 +:101560006932CEEF1995F81816BF7228DA77CFA82E +:1015700003D1AF2DBD6F7BE16ACC3FD71F6F2CB07D +:10158000D267DF277D3147E0BF459C072B833CBEF8 +:10159000AFB6B233D7F77E95C77B560A38493A9033 +:1015A000E515F7F1F350154BAC64BF542CFA88FAEB +:1015B000AD7034A7A1DCAD78C14CF7985789799705 +:1015C0002DCA1EB117E8AACC9C44EF48CF0D145B7E +:1015D000303FB74EA17CB85D6A0ED2E917B52F2611 +:1015E00022FD1C8C0BF5403DD47A7B9C17CFE1C9C2 +:1015F00078DB17B53DD6635C669AB3D981F791A6BF +:10160000DDD1CD85727B9F3364C1F27DF5B926CCE7 +:10161000EB4EE708CCEBDA6594FF429C3BA13FA47C +:101620001785E379EEE6ED96AE30DEDF047D7CF9DA +:10163000CCFB3D514F55E434F7447D0274D0B333B5 +:10164000C2F96985F4F0BCCDFC9CBAA48379480743 +:10165000C077B3051DCCDBFAE26F901FE621FE07D1 +:10166000B4A723A0D31DF47DCBBA42C6DBEF403A2A +:1016700091FA0BF2B56617C6DF441EC6C1FC8B0893 +:10168000CF542A1FC5CB037DF939B7163AB757296E +:10169000EE2BB6C9A70EF0BC47E0B16C9195E4ED16 +:1016A0001E81E796FB5E48443C7EF9CCF69DB84F20 +:1016B00052B105B4B427065F08B854221C12691D44 +:1016C000645754E2BA13C37068A37FC18F958CAF7F +:1016D00053AEBB52137090E5A2FD07826EE6320155 +:1016E000B7ADBD38FF097E437EA67776C4FAFC2EDF +:1016F000E37BE2DF89F51D147A612ED005DECF622F +:10170000783D51CA0928FAF2B97514F791F892F3A5 +:10171000B66779A4BCD3935D613CB69862BFA77CE1 +:101720005AC06FFF924E390D00B72FC0BFA273038E +:1017300040AF5AC478926EE478057F9D700DAE1765 +:10174000FA0F61FF72DC7D81040DFBD9C7387F2061 +:101750007DA2FC947C595033E59AFE78EE37F0A5D3 +:10176000A35B5F5C2F1FDF9EC5CF2DEB6827407BFF +:10177000BD41A1B8F37EE1CFEF5FF2626259049CF4 +:10178000E2B338BD4B3AC33F8C47C9F9EE72F1382A +:101790006EF4BCA51C92F32EB8F7C66BF0BB9CBFD1 +:1017A000A457499F128E924EE5FDB7687A255A9349 +:1017B000FA5335C87BD28F63B2BEB6F8EDEDBF47A2 +:1017C000E7A51D74509CDF6E4D653C5E5F9BBE239C +:1017D000F2BE0FFCD923F54E843E59A145E813A96A +:1017E000FF2BDD3ABDAF322F8B9F2B39CEEA2DF97F +:1017F000D0EFDCA3CD85899EB0DD79C5372115DF1B +:101800003599BB959F3F93F09E7B6207D17D85B84C +:1018100097547ADFFBC54390BEFFCB4CFB31A54B01 +:1018200046D3FDE3591BA70E46FAC1FB0C28CF8F08 +:101830006D1834903FCBE54C9B84F71A363C38E961 +:1018400066F83EAD41F5925C877E905F4BEF1CC819 +:10185000905E0EC6B5140F437BFD6ED589F6FAF087 +:101860008D831662FDE18E2EC9B81E7D430AE57593 +:101870002D89F482B473E5B9BC1A33A787C9599C82 +:101880008FAE6D4B399D15D4D4F4C4FDF3D675716C +:10189000F49E518945DCE3DCD689FC894A0B5E293C +:1018A000A47BA16487CDB4305B063FEF6CCB80EFA7 +:1018B000BBCDCD77A2FED87DA7A33F9DAB577F18A8 +:1018C0005CC6ED67BE5F98627C3F48CEE346317EE2 +:1018D000747FB2FD2E71DEF8A098FFB1DAFF9A8412 +:1018E000FAEFD8A61E2E5CF7916D71740EFF48D4E6 +:1018F000BB8C177B4F0BE836EA1ED4627E6F20CB81 +:1019000068BF493A3FEF3DA54FDC51FB01E73E5F21 +:1019100074A29AD17DEA4BC1A7C0F6A3127E7C1EA9 +:10192000CFF5CDA8B33AF13ECB21A47B3ACFA3F2B9 +:101930007BB736CE07879EEB1F44BF71C627FC7E60 +:10194000D18E55F7D2B982E96057E251AA363BF9F8 +:10195000A15593900D4E79FD4B33A0DDA94DFC1C94 +:1019600044BB770B763FBF33F2DD828BB58F2FD42C +:101970002E96718587B38CF7C0245CA57FF40AE0AE +:101980007FE880309CBEAA9E4976F1896A3FA527F0 +:1019900095FD2B8723DD3A92E8BCFE3F1A1E54F1D9 +:1019A0009D958AADFD7F40FF76983DC989FCFA552B +:1019B000F502DAEF3C515D4569F8FDDC20A5576C76 +:1019C0006DA2765F350C6CC47BAE2FDB9384BC8F2D +:1019D000DED7E178ECE8FEAE5CD7F1BB393EE5BC82 +:1019E0008F6F9A9A88EB6AFA534AE3E588C7842492 +:1019F00027DA77E5E29CC7E1D5DC7E3E6A4B7A7256 +:101A00001C9E0F597B5D1ABE8333BDE9FA49F87DF0 +:101A1000C636C58976BF77DB8444F4433FD75A1274 +:101A2000F15ED3E7ABE57DA820BDD33AAC88D1BE4B +:101A3000D3B090C63CB97C8B19E9E4F2131ADD3BB4 +:101A4000FD02F7A330EEF1433CC53D98D8679AFEFE +:101A5000128F97B4F9B1C28F1B2ED6DD8ABFB39116 +:101A60001AFE5E30947F3FB2F6F9F1D8DFB10D6611 +:101A700027CEFBAB0DFC7D86D9E07FE1D594A39BFF +:101A8000B87F33BB5E217FF8D826D0CFB0AE8ADBDB +:101A9000CD3ABFAF69A4BF0228C7738D92FE66EB33 +:101AA00041A2EBE8F73392593DDDEBFAA5E8F1707E +:101AB00096F13C661B1D76847F0127E45BA4438975 +:101AC000E7D9ABF9BEB9ABBE7F3ED293C47BF4BBC2 +:101AD00072351646F71202A6787AFF7782DD6356D2 +:101AE00060FDD7B95B46A1F89C98CDF5B85A60D295 +:101AF000F11E1AABE1F7F3DBC98F2C6E0FD56433FF +:101B0000EABF73363F2F2CEF63C91416924DEFEFE7 +:101B100025B8FEED812AF6C76BC76B30FF09C35DA0 +:101B20007776F3028A1E5F3E5E03BA9D30D0F5429F +:101B300057C8A765DFC7F397B9069921BF68D1FDDC +:101B4000E347E1EFB264EBF1D911E3C87EE1BB23D7 +:101B50001BE6B133C5EFC4B4D2C2EF479D545AFB64 +:101B60002DC80DD77F4F61FBFEA184F32D6646EF94 +:101B7000C074C6F90FEA38BD255BCFE0E31ABF9702 +:101B800031B684CEC705F8FD16F8F3D9D2F0FE11B0 +:101B9000A7A73279DF6599F1BE0BF3F2FB57F21E6E +:101BA00092BC67D4277C7F6AEDC5DC9F3A6986F5D5 +:101BB00026B5BFCFA634BE4EEF61D504584B1CE10D +:101BC000C1787FA52281BFD337FF852F772059CDDC +:101BD00092F60A2ADBC1E1FBFB2C9DEFFBDF29E833 +:101BE000F04835EBDE1D58F9DAE6E6440F4CF6C452 +:101BF000F8504FE46F8FD59F8FF03FB2B6266BBE83 +:101C00001BEF7D5ABDE3A0FED120BF573957D89BAB +:101C10006C43AAE073357415D4DB95DB87DE6F184F +:101C20009BCDF5F289DC500EBEA713C8E5FE0DD49E +:101C3000A3F36B458BC7A462BD13CFDDDB7D3AE018 +:101C4000CD8AEFB7B9286578FFE96A3BBE854CEFCE +:101C5000BA3195F66983FC9D31A897887ADD3335D2 +:101C60009DC7D1F9BD39892709FF76788129A03D23 +:101C70006AB23133CEBF0F5BEB447D21F123DF31FC +:101C80009DFF028F9FCC575A6A5330FF8C42E7DF8B +:101C90008ED8F8BD9EF67A6EA305413D73ED54C310 +:101CA000FB3CF2BDD05F3A0E343F5BC897FEAC7F81 +:101CB000E47BACE5A2ED68B5C483EF49CE4FB5D166 +:101CC000BB1DF31FEF46FA041C6116598FAD4D2161 +:101CD000FA589AAB129C6735307A77A7B82193CE21 +:101CE0002B8E6B70519A78269DBE1F7BF2CD3C2EB9 +:101CF0007F381E8A9FEA44EF47173FD56B24FFD1F8 +:101D00008176EFFFF07793ED36BA473B7F37D74BBD +:101D1000F36F50293EC9C4FD709F988ECFBE8CE2F0 +:101D2000393E16FB1D589F7C0756379FF31D5809F7 +:101D30005FABC04FF4BBB037EC1E988E7EAA7C1709 +:101D400056BE63D72CEE6D45BF0F7B6F6221BD0F72 +:101D50003B59E77A24FA7D582D10E745FBD69C6560 +:101D6000E7EF35F8A3DF8B6DD170DD9346F0F762B6 +:101D70006F981CF12E02FCCF3CE26B92D3E611ED82 +:101D8000DE0732237D5B7DC6FA5B24FEFBB03EE7B7 +:101D90007C8F37CB42EFBC69F85E35E42789F77852 +:101DA000D18E43FBFC94CEDF95B3C6F37537B3BC3D +:101DB00074E4FBFFDFDFA13EDFFBD3D1EF4D47BF74 +:101DC000333D70D71F0DF941CD6B0CF587EC5D6F7E +:101DD00028BFBCE56943F9F0A35B0CF92B5AFF6EF1 +:101DE000A87FD599570DF97CF6A6A17E81ED7D439C +:101DF0007EB4F37F0CF5C7A41F34945FEDF9C25095 +:101E00003EB6F769E37A34FF59D487C5DEEF0DEDAE +:101E1000C633CF1FF01DE71BDD267AAF43C911F68D +:101E2000B5A0BB1FB384DEEECE72507E8D564784C4 +:101E300088EE1A14E2F7683DA67DE1D3311EC75E35 +:101E4000E4F7BF92C0EED322C64BD66DE01086F306 +:101E500029454E433ED5976EA8DF69B2C7509EE133 +:101E6000EF6D28EF3CD36BC867570D35D4EFB24008 +:101E700037E473034586FADD96F90CF91E75930D68 +:101E8000F57BADF61BCAFB04671ACA2FD95465C887 +:101E90005F5ABFC050FFB28680A1BC7F6899A17C09 +:101EA000E0AE3A437E50F36A43FD217B8386F2CB5A +:101EB0005B3619CA871FAD37E4AF686D30D4BFEA0F +:101EC0004CC890CF67BB0DF50B6CEF19F2A39D1FAB +:101ED0001BEA8F49DF6F28BFDA73CC502EED96B125 +:101EE000BDBF367E17764CB1F73F86F68191E27D15 +:101EF000E82D0ABD0F7D5B4E57F9AE684B1CBE8BBB +:101F000018F051DCC78507FB504EE1BD6B173F173A +:101F10005342F12337D939A48A3C784E07EC8044E8 +:101F2000F4AE7273D14E4E08DB63596723CEC99D60 +:101F3000CF1EABC86144E76B73FC6539A9E87F3CF1 +:101F40005748EF7BB3C0529C877CE7EE9DA8778D06 +:101F5000657AB5ED288B7CFF78775C5DD68073F869 +:101F6000EF57DB4E307C57B9AD5F11AF50607DF35A +:101F700023FA5F09FE82D69DB1BA6AE01BB091FEDA +:101F800058EDA4FC43D5E9947FA4DA43E9EAEADEFC +:101F900094AEA9F652F9DAEAA1947FA25AA77CB0CE +:101FA000BA88D2F5D53EFABEA17A32E59F04BF18B1 +:101FB000D34DE02763FA34F8BB58BE19FC5FCC3F21 +:101FC0005B1DA0B4BE7A197DDF525D47F9ADD5AB7C +:101FD00029FFB7EA20A50DD59B28FD7B753D9537D8 +:101FE000563750FEE5EA10E543D5BB28FF6A753346 +:101FF000E57754EFA5FCCEEA164A77551FA5F48D78 +:10200000EA562A7FABFA0CE56B4DFCF740D6E41894 +:10201000F721645EBEC720EDBFF168BF23710C35A8 +:102020007F65B0DFA3ECE8687C1C1771DDF0FB096D +:102030003DD7D744F84F4F8AF1E47B0CD1EF2830DD +:10204000619FCA774FE57B0D33C4BCCA053F0C4284 +:10205000FAEC4DF4F9D6C5F80BD21F1C90EAFF1B21 +:10206000D167B62940FEB09DDF27BE21D5FF52CEF5 +:1020700020DC2F9CBE93C6737A69DFB0D81A4ABDA4 +:10208000318FDEFBA6B85C47E3558A73DF1D96BF30 +:102090007C2C0BEDE9A29F547A67EB1DB3837EDFA6 +:1020A000F02D0197B7724C86F4E354FF9B38CF6F45 +:1020B0001D55B79A60FEDF5E79FB93BFCE0DFBC95D +:1020C000D7A2AB09FECD04E631D3B942A6BF968BA9 +:1020D0007613185698BF910528BDD5EDDF83FDDC3A +:1020E000040637E6FDC3AC39B1D6153DAFCF72B8A3 +:1020F0003FFC598EC9905AD3FCFB104EDF3A749ABC +:10210000D73B978FE989EB92F32A12EF8E8C67AD5C +:102110004FE0FCBEDDF6F561A55B18FED21FA77B84 +:10212000FD28C76E57C4BB76EDDE11A0F2923B15B9 +:10213000B2CFA6803F83FB43F2DD805355667A0F12 +:102140001EDF19C0FDB353559FDB919CA11EC3FD3B +:102150008D1A3CA003E53577F3FBF425F82EC60075 +:102160007CB7C0C6FB5DA810DD0D4FCBE5F79FC166 +:10217000DE23FFC9DD4AF7F4804EBE273AB95CA5DD +:102180007BE7EF98823D15DA4F9E6E51607EE56EDB +:10219000AFE17703A2E9609EB82F20BF037D99BB12 +:1021A000C0385FBD34A437C5DF5FBEDC83F0AA3121 +:1021B000F1FB43813754F17B4E5C44ABC32FA53810 +:1021C00023D3BC5E8C17158BFB264D2A5B10EBBD11 +:1021D000F05E5D38BEDE49E7EFE7D544EDB374E964 +:1021E000C2E9AA4B174E6FC5AFEEA67784E6EDE2C3 +:1021F000EF1DB2BC96BEB1DEE7AF5CF0469FEE11BC +:10220000EBA86CD8CFCF57B096BE91E7C975D1AFC8 +:10221000A423D5E2F0AFB347CE8FD30FD0754F8450 +:10222000C3B7C940D7DD88AE0FE3BEE278AB27E97C +:1022300046057F25807D85EFFBF8FFECA4F341F296 +:102240009CD034E6A3B41CC800E9D8175845EFB9B0 +:10225000CE66F5F47DDED0A9F47BA495AC75543A36 +:10226000C0ED86658B5EC3E7F0AEAB5B351AE3ABC2 +:102270001383A5AF613A61837218FD54E08B215D31 +:10228000301EA2542DC12399376FCE5F825B66E367 +:10229000558E0FF626C707D08DAEBADAAF13F8E029 +:1022A0002A6CFF6DB24EEB50138B0C7C50B298E948 +:1022B0008A3B7CDEBD8D2F86CEF90CB7D498D64AEA +:1022C000FBE6952F5B5D88E7D98CEBED703C43EA2C +:1022D0006B46743E87C57BB1DE7141D7C7B319D158 +:1022E000F57185D13D756947B21C7FFA806E61BD7D +:1022F0007BDC141C9CD88DF4F2249CEFCEF4EB3CD8 +:1023000018079BE3B6D1FBA7C793833951EF7CD065 +:102310007B44328EB5D2CCE34AD1F35286EEE4BF91 +:102320006B616101DC9FC0DF751E8CFC8CEFE628C1 +:10233000F40E740BF2BD79A4CF13ABFF5AD1EFAEFC +:102340001FB9BF1B80F5E0FDC676E338C538F17CC8 +:102350001CA93FDA7E473A8D19C6FB4D975CC2CF68 +:102360003B0E9DE6BFC8944CF226C3E6BF0BE94E78 +:10237000C675A41FB82BF74877F2D77FA8C942FBD0 +:102380009CDE2140FBFB4A2E97DE317BE8DDDD77CA +:10239000F273297E2FE5EDB54379FCEB5A19EF1A5C +:1023A0001115EF8A8AB7B011B1E35F8C79CD386E21 +:1023B0001FF689840FC5595E1DA1197E3FEA55E1BC +:1023C0007F9E2A72E7219DEFEFA2D23A1353F8BB0A +:1023D00021AD0E95E86C7BC06BC7DFA3582EE2A43D +:1023E0002BA2DEBD5E9E37DF89E702AC0EFE9EE5C6 +:1023F0000323E367469E477FAD073FB77463CFFC77 +:1024000077915EFADA8323493DEB9A07E7AF88F5C7 +:102410005CE204789BD0EEF48978A7FC5D9351A42C +:102420009F259E2F543F3FAD0517C7E37ADD8CF8FB +:10243000CEB1DA46F253ADD74378343AB5E7C4CDDE +:10244000843FCDD71BC7691A1CCFEC50FFDB260B8E +:10245000C5A15E3695FD19CFADB77E6C6578CEA16E +:10246000DED1594323B7FEC75F8DA2D431BC90BFE4 +:102470003FC912F09DCCFE4EF697FF462489FB61C2 +:10248000F50ADBC51F6BD513F09DB77A133B7D159D +:10249000CC6B8B7DC0839711A9F9545CE77BDDFD84 +:1024A000AFE03C06B32ACA3F60F1CD5C07E33EE0F3 +:1024B000B2117DCCEAEE7B95CF932D1907F3BBB219 +:1024C00040A1DFAD5B227E97CDE18D37BCB7EB3B02 +:1024D000D393F4C5DB423ED7A6EBCD78B1A343B886 +:1024E00039B556C33B592C8BE273128E91F8720E9C +:1024F00036E0CB6F8EC4D750C0D7A591F8D2958B5C +:10250000C1D7935D18CD57D26560A467D5A83CAEFE +:10251000C76AA896338FCEB7B6A34FCFE67AC86FF7 +:10252000D72E217849FA94F41A834E6FDF8EF23851 +:10253000DBE4C4FDDD7BC7C5937E93742BE9D5D264 +:10254000959FAF02BAF57585748ADD371A654834F0 +:10255000DD62DC2B923E4B3AA463E68CE4D7F1605B +:102560003F24B9D0DE39BAA13E823E4BAABED6B8CE +:10257000FC387B55FCE0709CEE7F012DB720EB0012 +:10258000800000001F8B080000000000000BED7DA4 +:102590000D7854D5B5E83E33672633934972924C93 +:1025A00092811038934C424826302480FC552721D4 +:1025B000D0F0EBF05783243A58B4412193026DA335 +:1025C000D77B33908001EC2DA2F5A1F2EC808A68D4 +:1025D000B506A51ADB889320DC685107B52DB6DA5D +:1025E00006DBCF9FB64A10AF175B5AEE5A6BEF93DC +:1025F000CC994C10ED7D7DDFD7F7A27C3BFBEC7DC9 +:10260000F6CFDAEB7FAD7DB268A6C4DEB130FAB9A1 +:1026100000FFFCF0EF9D62F81D7F5CF85456DED59C +:10262000DA8DE2F915434BE8C7DE2D1EEC675AB68A +:10263000A9981918DBDAE264CCCC58BBE4F5E5C004 +:102640007872D3A90DF87C8B0C1D1D8C853CE6F0AF +:1026500043388FEC2FF6A70C8E975554E550B318DE +:102660004BB9EC4FC93740BF4FB30D2A93E03DF54E +:10267000BA276C93E0BD93C90CDF4BCD8C363C0080 +:10268000EDFD6F8E65FB60984FD704C62876C6B601 +:10269000B5C03EDCB89A708E612A967D39062796C1 +:1026A000AA939701277FCE447B98EA7B5CF98C4DF7 +:1026B000C6BA4FF4EFA3FEDBCC3B2D369CC7655169 +:1026C000F64983EBBCC2C89A3A60BED92A6C0AD6D6 +:1026D000CBCEB7AA8B53B02E51FDCE96DDFEDFBB1D +:1026E000713D612A33178459A08C315B71480D41CB +:1026F0003FCB6616C0F7E3E179BF4BA675587AEE7B +:10270000612AF4CB747BA500F4732C80F13438C3B8 +:10271000BF45008AB472E8B78FF9D824848F2D1C86 +:1027200092868EB728ABAA574E1DFEFC16C5E10156 +:102730001378A09DA7E56FC64087076B4E03CB6655 +:102740006C23F65519ABCE875F70DE66F3DE2498F6 +:10275000F75A359DF6FD89A32A8D79869FEF7E383D +:102760009F501140BDC542E5BE168585004F1E0431 +:102770007CC1FAFE1695CA032DC5543EDAE2A5F6D1 +:10278000C75AA652FD472D3EAA77B4D450FDC916AC +:102790003FD50FB5D452FDE99600959D2D0D54FE01 +:1027A000A4A589DABB5A9AA97E45129C1BEEA738CC +:1027B000E45C02E7D17EB3D9A7027CEEC67304B80D +:1027C0001FF1E5677AE1BCADC5069604DDACC777BD +:1027D00031DC8FD569F085E11CB63A77B1AF43693A +:1027E0009A92D22EA5C1FE1FB7B74B13A05DBE9320 +:1027F000A9F0FC7E29D4C0BC8CFD6B78865F9EC698 +:1028000098DBF9CDAA0CA8B7862B775A006F8BD42A +:10281000C5B59B62EA6A4AF98D0795C1FA18CF5E81 +:10282000D906EDED6AF54E87C4D7C14632B62B3CCA +:10283000C7BF09F02892CF4208F77E97398CF8B8C5 +:102840001ACF4BC6F52BB4FEF9ACD56980F58F5184 +:10285000CDE54837D03FC21C97DEFF6E55A5E7F1A6 +:10286000EF5DAC9F61D225F563C68B8C87EDD245B9 +:10287000C6B1484B2D5158FB0E93E01F5976E21F0D +:10288000ED2676AD1FE0DE6EE5E5699744F3F5BA17 +:10289000AAAE724179958B9F6BBB35A454E1FC6560 +:1028A000062FF20BD6EC7A3D1FE6FBF64B32DBAE81 +:1028B0000EE2E7E3829E0BC7A4F8701EF62F967017 +:1028C00021CCF3D5318FB76540BDF001AFD708FDFE +:1028D0007730AF0DF12474BB813D04F51F4E2AC83B +:1028E000580CDD4B27FF382300F8922CD61166AC2C +:1028F00006F16DD3961BC6F441F9E909CEA7BAC417 +:102900003C7B4DD1263ACFC97686FB666C6732F2A6 +:102910009D4D4E38A4CB18338CE0A5D9A45C8DFD19 +:10292000CC5BCC2C04EB31FFF5328B1FC66B3D9793 +:1029300054837C84B16832F231B335A0A4C3F39DD3 +:102940002103F18556D51E9660DC1DF6F25E15F961 +:10295000A762F016221C3D0682639BFD6B6123F289 +:10296000676953032B80F52A4F5A5CF03CEC312801 +:1029700048E761DF921AAC8702B2B750150C02DB50 +:102980000319E1ED382EEBFFD9046CAF635E84C30D +:1029900096EC3FF72443BD75B9E235F2DEAA3C85DB +:1029A000B111F81B4CD96AEADB9C8CEB58C1FBC314 +:1029B0006FDEC54087A949FCFCBED73D57C92F2310 +:1029C000B912EAE37C49BA0084289BBC162FB48F65 +:1029D000B797D7F8A09453CA2D2AECB34D29B7ACBA +:1029E000A2FD333B83793219E74FAD8AA1262CDA59 +:1029F000BFEE2131F5827B0A9112B5B7D9777523E5 +:102A00003CE4EB1973A9B83E984FE37B000F4BC130 +:102A1000CC5E15F6D17E4306ED4396BC5467D7CB0A +:102A2000B4EE91AA2DC2C6039F372FEC65C03F4676 +:102A30005A6E5A80F5110DF2EFFB62F8744E405F4A +:102A4000CFAAD5D73319D42D31F30ABC89875B3C83 +:102A50003C46286D2770FD2302323D8C5FFF3DCA46 +:102A60005DE9950CD769A77566DBAFAB040801CAB1 +:102A7000F93721FEFDBDEB1CAF2CB1B860FEF10EA5 +:102A80000382934D60FD9B71DC1D02DFDB5DFC3C2E +:102A900007E9CAA8D1A50FE9724CB3818562E48E1B +:102AA0002B6463A198F90ADA3374F5C29D2375FD8E +:102AB000C7EECED7B58F0B97E8DA4B0F94EBEA65EC +:102AC0001DD375FD277456E9EA1323F374FD2B7AA1 +:102AD00097E8EA93A357EBFA5F76F23A5DFBB4BE50 +:102AE0001B75ED33DE5FAFAB7FA5FF165D7F20E387 +:102AF000868E047272BA8BF38536A72FEA4B20CFED +:102B000007F42E45EE1F380FE09D494EC0EC98F9B2 +:102B100052BC3640A6C13A63A3947793459DE47AAC +:102B2000ABBA19F139D54CF82CA33C87FAFA9BCDF6 +:102B3000E124C4C3CBBD2AF217AF8BEB336F17F977 +:102B4000BE8AE756996A21B920DB793FD93E87F4DE +:102B500094D1BB812F55A0D6C806DA93913FB78494 +:102B6000FC6EF7E0BAADCA4E86F45B995AC3FAEC34 +:102B700083EFCB8A8F0552703E95E6B32821EA6732 +:102B800055E1FD987D1D3618981DF97837C809184C +:102B9000BF23255746FAEBF86B4935952933E620D4 +:102BA000BE4F54D8034F40FF0E89F532D0933A0CF4 +:102BB000EC2CE86CEC497BF99D20AE8135FA8DC890 +:102BC000EFA6B0262A471B980DCBBD52DF0606FDA7 +:102BD0003C4D27AA72A0DF0977600DEEFBBBA04336 +:102BE000E0BEBE3B9EEB595BB2E7A9A897B5BB3AE6 +:102BF0007AF3713D592057901064BF17F50A6DBFE5 +:102C0000778AF394F3DBFB50FEAD4FB7A8A82FC92A +:102C1000969DFEDF03BCEE37F53DD20AF5364959E5 +:102C2000DB817CF166BBF72186FA23879B9A62A839 +:102C3000D80CE3766CF2C9E9D0DEB18D79DB903E39 +:102C40001C959BD3E179E1A855860CA407F7A6CD86 +:102C5000586E413D16E61BE7D96BC884F6D24995FC +:102C6000B50C65AF02F3650E8F4FC6D4DD0CF7C30C +:102C7000DCF2BB8857A8755F80A55766C079C3BCD6 +:102C8000563C6F894A8283F59C3D6CC5BA9BC3C58F +:102C9000EA93C2C95077B87D92CF83EFEDA6F3B522 +:102CA00046F47AEC1A77E04E84A76381FE5C65CB2C +:102CB0005DB4BE1D064E17EDE9EA7194CFED2E7797 +:102CC00046AB3AB84E8DAFDC2FE4A7F65CE32B0A97 +:102CD000DA145983FA0DE0F96E4301EA673B19F201 +:102CE00027EBAD3B19E2B55509A90CF5F07F0B11A7 +:102CF0009E6BFAED064133D5F9B51694D7671DE5FD +:102D0000A4CF5A9BF7D379C5C3CDDA6760BE8BC019 +:102D100035B5E85E92EFC080D542804F4FB6BD61B9 +:102D20006F02BD7FAAB01BB6011947495EF92DC8D5 +:102D3000AF4DC2CE004C30A07C3BAB30925FACC3F9 +:102D400045F50DE9BCAE8DB321AB3CE762FAB77532 +:102D5000B7850562F6B10DE641B86C39BFB806E13A +:102D6000CA64220EB6E3AF9EBDDB1196C2AE992AAD +:102D7000E03D1BE706B88E3633B20BBC8E053548F6 +:102D800077FE73F9247CFFE4CAA07EDE103336D1CF +:102D9000BA4D9A5C325C98406B55CD9A1C26D596FC +:102DA000CB2DF8BFFB82847C3F468EF182E4BA26AD +:102DB000B70B77EADBC7EED6D7C78587BCFF06CA55 +:102DC000FDE5FC77900BFAF67B85FC5E8EF21B4AE4 +:102DD000B6CC4472CF022BBAC0E5EEA01C04BE9064 +:102DE000D711A944363A6A638C3C64B40F9D7C5C6D +:102DF000E3E67CCCDF2B9BF01CFDE7C0F8A818CAEB +:102E00009747277178F79853C29BE1BDDBC12E0A23 +:102E10001471FB3900A4F65DD9FBCB3AB4B37A8DBB +:102E20005EC0D881738A3FD715F91C7F7A5DFEBFDB +:102E3000BA487FE8AB40BB1AE70BC4CCD7634B1D45 +:102E4000CFC06E79B92860CC877E1FD73826217F06 +:102E5000481AC54C489F383F2B1AB4DFAF12F4B460 +:102E6000C3FB5AD31158C76D2793501D67B38DC745 +:102E70007B5BA0BE3E4F267EA65CB6F60768275752 +:102E8000FD1ADAE19DDB543587F4F45E13D9EB5576 +:102E9000028FAB84FD75B4D044E3E68A75E78812EF +:102EA000DEB071FB3B62437DB6F400F062FD792633 +:102EB000F3761FE9BB651DF1ED3E86745C22F005DB +:102EC000EAF64AA84F14F50E26652A708E136AFB9F +:102ED0007AD094F0BC78D4867878D0CAF5B7470514 +:102EE0003E6433C91B81F5671FB07BC3D02FC5C8B3 +:102EF0000E46611FDE17E47762CF7D7C97BEEE61E0 +:102F0000317517AE435FBF5D6D92102EB7D7818EBE +:102F10000E5BAEC84F71BC5BCA10E645885FB38DCF +:102F2000F689684FADAFB433846BD2A9B1FF2B8A59 +:102F3000FCE38491A15C5092D53BAAE17DE56799C1 +:102F4000DE4DEAE0F93FDA82AC1BF8DE052F6B03B9 +:102F50009EFCDD2A5B03EABF8FC179A21CF911D860 +:102F6000D9D8DE01E78AF527C1CEC6F210D8D9F844 +:102F7000FC69B0B3B1DE097636963F013B1B9F7703 +:102F8000819D8DF5AB8A2ABF8AF8526FF7CF9610D4 +:102F9000AE3E595580AEA44138931F48627DD2059C +:102FA00020903A85F525015CCF8DE17490841E2632 +:102FB000E0C32CE0B5205E7EFE383E6D9C8029D1BA +:102FC0003853611CB2132C0AFA45F2E18D3478FEB5 +:102FD000E1CDBFDA8FF262A11458910FFDD74D7E7B +:102FE000C7CCF5E77E33F6DF6305FC073E344AD0F5 +:102FF00041A80AE08972F725A3B7157A5D3EEBD4A4 +:10300000862CB0BF6FDA377931DAEF97DF74AA62B6 +:1030100034D40FEE0B2F964119BFFCE1534FE5025C +:103020000FCE796015AFDF79EAEC28684F0BED58C9 +:103030005C3D0DFD525C3EED91586DAC7ED72CF0A1 +:103040003BD8BC8BE41CF077867068CDF6937C3C53 +:10305000EDE84F5D05FD8359FDD9D75D847F079B62 +:10306000EF2639D49AFA07D23F5A07E48597E485C8 +:1030700036AF262F3E16B8A7C98BF5565E1DE8174A +:1030800028A0E7770ABF0E0B17523DD3CAEBFF5EAD +:10309000A5BE8A760FC087ECDC23A925DF9B897645 +:1030A000658DEC4D82FA9DF6722BCA9B07F3B9DD54 +:1030B00002E386D08E0FCDB6841FC24375A8448F1D +:1030C00019DAF80E372A5D2C43ACE385E9B608DA45 +:1030D000F9ADD5967DA84FEEB2E7D378AD53CD21AB +:1030E000F4AF68F5CDD3A75B509F484FCD70615DBD +:1030F000E34FDB01EFB1841F238E5B25B65B65B127 +:10310000478CC8CF2DA63FC5EAC9761625FCF11A13 +:10311000C020413E50C0F1AA82796BF1B9596A0AC8 +:103120002132EEC1B5E33E52849F92E5F2756BFB0E +:10313000F0E5F27D69FB483187C43E484FDA6537D8 +:103140004450DFDB05FBC2F176E7AB049FF87D312D +:1031500074BDC2B8B3A68A752B330FE13A661B7CE7 +:103160006DF8DED1CFEA1C805E6C0E6B92F17901B6 +:1031700058B4E89705946EBB7011BD23DE2F7BF920 +:10318000EF24DA0FBBC94CE7F24C215FCFBDE6B0AC +:103190008B91811B1EB1246578FC7D6308FEFA18B3 +:1031A000D2536B868FE3AFD29FBA09F137BD3F7B15 +:1031B00033ED2B92F03CE2F138FE7C7E0BFF841C59 +:1031C00030227C3FEF3CB573D4F0205E7E4D28501A +:1031D000B4F375D23E7DC59C0E343D8A819D9332F9 +:1031E000147E5B613CB568B06E76FA493F3639BCF7 +:1031F000C5E8BF6DFD9BB12191FF36AD80D3C1A65F +:10320000541BE9CDADA95C6FEE4E9DA7B377AAC163 +:10321000FE91003F8C99AC03E9C8987635F9BF8CD4 +:1032200039A821E1BAE2F4D1B4055C1F55401F4D25 +:1032300030AF56CAA88F26D05307F4D18C795C1FC3 +:103240004D35933EBA27C55CBB3701BF792F9FEB45 +:103250007BDDB88F04F61ED879E487D4EC3CB3123A +:10326000207B4DDBE77BF99CAEB4FE494A1343BF9C +:1032700098D1EC5551DF34DAB8FE9804DB2C8E91EE +:10328000DFDAFCEFE49B088E3D45FCFC0C16AE9F9C +:103290005CFEAAD49408EE6A81A63F24C6BBBF0395 +:1032A0006F882F94DBCD3ED40FCAEDCE2AD40F8683 +:1032B0007B0F4CCDD0FB19837CC5FBB72946923FD1 +:1032C000B2D78978D661EA7BEA55B4E38EDA49DE73 +:1032D00074A48CAA8AD59FC15E0D15C32007FF0276 +:1032E0009468186AA782FD34BD00C6ED599F3D89D8 +:1032F0008F0B7A5ED950BD32DE1F3040EFA9FB5DE7 +:10330000FCBDF0087C4F5A3F3507F12A9EDEB532EE +:10331000CFF952DE6A5857DE885E2AB5E7FF9B195F +:10332000C9BF16DF7FF1C03970B93C0E264B33920E +:103330003C5E8CEBFE70E36BD95E584AA37C86E45E +:10334000F2C74D53D36E5339BF3D8072E69B32F1C5 +:10335000DB516BBAD33362CEF9DE96CE3CD98D7198 +:1033600083685EB59BEC015FA2F5FEABA03F16192A +:1033700043FCD924F0407544E78E05B8AB7683173B +:103380005DD2207C757CA0524EAF5660FEBC16E626 +:10339000B543DDC514F267E55D3012BEE51D594148 +:1033A000783CC6D12F853C31F3202B8E898B7CD283 +:1033B000544DF499973360C751FCE013476431D200 +:1033C000F72777F115E53DA06F07194BFEE61B3691 +:1033D000DAC2680A8EB95531603DEF07121BE5C2AB +:1033E000751C71DD86FE9A6792C95F63DCED267FEE +:1033F000CB0FA4C0F505B08E0FC3EAB7D1CEA51F81 +:10340000E8B7EE3BB67DDB498E45E7921CFB968123 +:103410003D94C09FD456C0FDE35B04BEE7395FC94D +:103420005B5D81E5713AEF4BA5A783C8B7619CDB73 +:10343000D27652BC2B54C58AD1FE6B37015E25A0D3 +:10344000D73305226EA6F163013F2B5A2BB00FA391 +:1034500024F4BC038F3EFA6836CA6D864ADE00DD6E +:1034600069E32417775063B2D7C7D0EF20293ECE47 +:103470006795903384F19DBF1A13E27544E3D3AE90 +:10348000AD4EEC5FEDF63A910EBA5D539CD701FC60 +:10349000EC76334B8AE1C31A9EBC903285F4106DF2 +:1034A0009CF529F917B5B7CDC08FD58BC86933FA0C +:1034B000BD519FE999665161BD5BEDE551D4B7B649 +:1034C000DA1DE5E43FB703DF88F127D9EDC7080F20 +:1034D000ED5EEE67B323FF457F92D87FB7EB18ED23 +:1034E0005FEBB7A780D3BDDD1BE1F147B066B09FAE +:1034F00055F687D0CEB03A18D995560BA7A76438A1 +:103500000E4B0C1FD1E6FD7E01B7D7B68E2A8F5623 +:10351000D2FA64F408B0ADCE7227C9438433EAA36B +:103520002306F451F29BBC2EF881364E6B37DFA791 +:10353000BFD9E9ABCE443BD4FF22F285ADF6EB2CEC +:1035400021940B29932E3ADEDBE2DC868ED73C4BAE +:103550008CF73AD28331A55CC1F14CC82712E0DF69 +:103560001FC4BABEAC5F0C20AA90DDC6B87E051899 +:10357000EF4CA44768A545F8B786BEC7F9A44BD859 +:103580002FC0273FC5F5AF1BF5CEB14AEAC5ED9672 +:103590008CB972B10CE7F5319CA0511AB4E3E3F594 +:1035A000994A633FC9354D1E69F2E95ED467CC8301 +:1035B000F4A4F95F721BFC24B725879FF006F41B67 +:1035C00015E9C68871DF04709BEEE6709352A7AAD6 +:1035D000482FD5E7FB72F1BDC329EFE7B2183F9A38 +:1035E000C60F5FF86CBF15DB3F69A8BAA8DEA2C59D +:1035F00085878B07A7DEF2876FC6EA2DC3C5873F95 +:103600002F2EDC936A26FFDBFD929E2F4D72733EB8 +:1036100038C1ADC50F0363DD59D8CFEF25BD51F8D3 +:1036200053DE2E0A94B8D1FFD56E662138CFC39FE2 +:103630004D71227E5C2A7C35FFF948A14F8DB4EF95 +:1036400097904E47368425F47FE7367448BE8BF456 +:10365000330ABF92D6DF24C6BF42EE37A2BCBA42BD +:10366000D071EE399915C7E8817F2BE0FA9449E8CB +:10367000EFA93D8F5871BC1E83BFBD08E543AA4129 +:103680007D2886DE4D6BCA2D5531F069C5B84E8256 +:10369000F3AB730FE85D641F69F2D6A4C90987AC68 +:1036A0009313C1648EB79ABE139CCEED21490A2CA8 +:1036B00047B89E9EFE8745C8B24E4B1D668C7F7FE5 +:1036C0005E5C6340AF31845769760CD28B57567E6F +:1036D000DA07EF4F7CB892E861320B507919E37A40 +:1036E0001FE8515FC7F92A70C931E7CBD0F590FDCB +:1036F000F9FBB812FDDE59E89F8B92FFF4BBE7257A +:10370000E2E3F1F0D93F009F81F89DCE0F9A2BE4C0 +:103710005AAE6857D10FEAC27894DE4F59D1ABAF99 +:103720004F8EEAEB979D8CF37B867C3F7767F3782F +:103730003F0EBA07E80AF9C16A11A71C150A572AF1 +:10374000B0DE3CD641F1C0DC860C1D5C2F378A3CD4 +:1037500009E69398B64EF8C995177E80EFDFE7D655 +:10376000F49F10E9593788F66F54AFFE761BDACE16 +:103770003B4DE40FB5C0E408AF6FCC5D321BCF7595 +:10378000883FB549EF47CD8D6D0738DCB0C7A46BD6 +:10379000F7FB26921DB054F86907F68BEBC8E2FBE5 +:1037A000CD2D1F3AFFE7CF0BFF3286CEAF8D7B2F9B +:1037B000F01BE4A3EC3C9CEB14841B438F03CB93E2 +:1037C0002312C6A54736311FEAC3B91B992F917F33 +:1037D000FF6501AF7838B3D01504BF59E2D948BBB3 +:1037E00091ECF4911B0DA4078E047E807C60D15A6D +:1037F0002017A8E7AE55498FBCB2C1C0500EB0F338 +:103800002DBAF761B9E4EFD4CEFD5E1C0FF5C87593 +:103810002C6CC0FD3495103DD1BAF207F101E0F5F2 +:103820000E879785E3F75493CEAF99877ECC18B86F +:103830006878901BF7BCD1CDE32E1A5D803C7BD914 +:103840004D78C2E55C21CA3958D287D34EEEEF805D +:10385000F55DBE99D17EFBD36D619EFF30102F3098 +:103860005E180BFCC932AB18FD2A3B149B01F31404 +:103870000EA7F7DDC7D219FB2DA8BFD533197BDE04 +:10388000D65F2A41FD8F0FFECBAE763894C3D6FEAD +:103890001FA2B3D77EFBE6253531F5D47FBF9BEA67 +:1038A0006C2A5365808F0D67807DDA9479078C30A0 +:1038B000BFCD632727A48D0DD029EDA76DBA7A3B24 +:1038C000E679B4151A484F62B1EDB08FDA4245D0AF +:1038D000B78FF2D8580D8FDBC78E2F3B2E32FE3CB0 +:1038E000187FD21718DFC2D79F8D8F40BE64E3FACE +:1038F000D14F8DE3E3F9A2B328767E319ECC427B93 +:1039000031BE02F3D9253E9F827924D94C9F3730AE +:10391000309F02F395FD03F6533BF43C4C173B8F6D +:10392000ABBFD879B4197CB4DED0783BD93F0C9AC0 +:103930000D53D0CEE0F35965F6825CCEE1DA366500 +:1039400010AEA0EFD1B8D07DD305016713C25931B5 +:10395000139C87835B8FC2F398B629B6F026D7FFF6 +:1039600085F372F2F38A9D0FF5C64B9EEF6A98CFEE +:1039700071E9F3217C917E06E00B67B239FBD2E15D +:103980000BAB0A5D0A7C7B605C430C5C07F385EE45 +:103990005150FFB79AFC162FF0DFEB0B791EA2C730 +:1039A000B1C442F903594B2C9897B7C563AFC1FC1A +:1039B000BD2DEE6516538C9CDEE2A9A376E84F7907 +:1039C0004E9E880DDD13AC8C45C9FEDF36B3DAB9E7 +:1039D0000AF1A789E74D6979449A3C64223E49FB84 +:1039E0008217D3BE72A8BF07FA6F6B9A44796269D7 +:1039F000E97FA6FCA81D0D5E2FB6DF67E571C6BB8B +:103A0000459C091195FC68E3A73F80F1D6F2C2F509 +:103A100012C517D75E3CBE587E265A8579566C155E +:103A2000CFA372D6C971F2504FB73B10AE3CDF291D +:103A30002C71F8EAC6BBAF308BC79FDDFB18DA7775 +:103A40004FC158463D7D1930EF289E1E65B34FA9E2 +:103A500044BD7CBD81D6918BA17C1071E5650B9C2A +:103A6000ABE0F9A8EB65AF04CF733CB752FE116829 +:103A7000F5A46F783CC7ABB03E649FABF5FB88DF25 +:103A800057FCBA417091BCD1CEABFC8C3719EDA874 +:103A9000F2C225941F463F1ABD1BE3F69389F6AF89 +:103AA000C16705396673C7EC8BE9FA093BED7FB650 +:103AB000BE0D9109E5627CFCEBDFFCB4CE24E6B5DB +:103AC00098E9BD3AB217B5B8DA48A41D3CF7D18CD5 +:103AD000C725E2DF9FC2DF674E1E674BB281E9094F +:103AE000F427DD6823FF655212D4E17C2433B38CC4 +:103AF00080E7F70ABFDF2689C9581F9C2FC270BE16 +:103B000056C9BFD3EBC292DB4BA6743FE517629850 +:103B100036D6EEECC1BC0D685FBFC695837EBB3464 +:103B2000208828DACD222EA5F949520BFA56A2FC9C +:103B30007EFDA1BF2CB1A07C46C7D274D0BE0B3F86 +:103B4000DD159A39489749E7463235C67E49929B3A +:103B5000287F23E9DC689D3F2522EC2EADEE73C85B +:103B6000D538DF7FA15D00F85CC994367CAF128048 +:103B7000A2C6FA47CF3975E30C8E3F4A376F04EC83 +:103B8000E7D838C0F0E32733B53876FCFC61C62FA0 +:103B90008A1B5F4938FEE0B899BA71B7C89C5F8448 +:103BA0001CB670227F5E5651D57924E5E1F2CB1C1C +:103BB00045DCCE057E2C53DC49E0CD6DCE26CA37E0 +:103BC00033DA787CD424E22547521A785EC4287D03 +:103BD000BE591553646CDF923AA75782F62ABB5E32 +:103BE0004FBFE2FC3B46E43B57C87A3DDDC79A082D +:103BF0003F2F67FAE7A6517A3E7010E903FDFE29D0 +:103C000093A294979665A73C83E1FC076FB530CAF1 +:103C1000973225FB9B50C695ED4FCBDCE2847A1A98 +:103C2000C7AF19FBDD4BD11FF496C0E32D40F70859 +:103C3000C7BAF5397B8D31E3D69923852847EA0C3D +:103C40003C3F9F7E60FEB7B246923F357E5ECAF033 +:103C50008DF147D537497E77CC3EDE12743130DFA7 +:103C600086DCBDA8C70ECC9714994CF30DE4F988F7 +:103C7000F9B2BFDC7C6F0B7AD6E6ABFFB67E7FF580 +:103C8000E628EDAFDEC0445E3F9FEF6DDC9FEB4B5F +:103C9000CC27F2B506E6FB8E7E7FF54951DA5FFD53 +:103CA000803D29E6CBFE72F325999B281E7387C4BD +:103CB000CF754351D99DE88F3FBB60BD8AF8A6D927 +:103CC000678BF005C0B345229FE9CA5166D21BB489 +:103CD000710FB44C653E33F7DB60593C53A2FCFED8 +:103CE0007153251FC6C3F600DDFB8AD02FA5507B7C +:103CF000B8C549E5BE1695CA07C11EF4917FCACB67 +:103D0000EB45DCCEBF6384B26235EA0B95369EDFAD +:103D10003C730668A283F61618603D56CC23FC1A45 +:103D20009BB81D6A45BB393C1CD5D9613C27DBC417 +:103D300017A22D504F9A6654316F3BC9C5FC89FCC0 +:103D40002E3F28E2FED8DBB47CF8AF483CDE0EFA0A +:103D50004825ECFF5A016A665C20A15E75E577D2C2 +:103D6000491FA95BD697A2C03AAE9126FEDC0DF0A2 +:103D7000F8ADD047AE1DCDE938DE9E74A0649984BD +:103D8000F97AC670187E5D9AB294ECD1A5CB19CBA6 +:103D900080F7AFC4F740AEBC2AF49957FA9218DA0C +:103DA0006BA16A1E67BEE656BD1D798735A2A01EAF +:103DB00077C74407C3F3A8DBA86FBF4DC40B96C6F3 +:103DC000D99557C6E5D180964978823C814D83F3D9 +:103DD0002A4A71507EABC8A3B9BA48E57C6E948379 +:103DE00092A833E6BAD330FE98644E7CEF461BEFC0 +:103DF000A8E03BCCE12338687967CCF8D8447A5FF7 +:103E0000CCA7BD77AFF4D8888BF935416F7BB7AFBE +:103E100098CB67D4AF0FC6ADF3EC82FCEF55B3443B +:103E200078DB2FA35F415BFFFF297CBD097D1AB0C2 +:103E3000EF57677D3289E22D6C14ED7B91863F222E +:103E40009F6AE9405D66724C3E1D73F67BF0BCDFF5 +:103E5000F84AB2773BE19FD01F226F1A2E247FF1E0 +:103E6000F106D6E1F4E5717F5CB542F94062BCE150 +:103E7000E01C9FEFA0F96DE82726DFB0752FCF7704 +:103E80001CE9A8FA00EF45E1F3777478A5BFFFD4E9 +:103E9000DAFD8884F6C57D789F4B1E9C0FFDB4210A +:103EA000D25FF5F7B2E2D7A5DDB7D1D6D36A66C542 +:103EB000648F1A803FC07C0BED7DB2A4A2DFBD5F92 +:103EC00046FC2A19CBFD449813CCEFB9703DCF982E +:103ED0006BE0F91B6354AEF7B9FB47C7C685D2C682 +:103EE000F278DAC2E4D736AA20FF4C0F6F5E8AF967 +:103EF0004B0BD35EDBE882BAE5E1565ECF7DED1376 +:103F000017E86CB687DB78BDF4B54FF2A16E7F7809 +:103F1000CB52CC675A38831150521FDE4AF2326DB1 +:103F2000AC664F4747E17C0B254E1F5FB634261920 +:103F300012C6EF9D63353F2933E13CFEAEFF388961 +:103F4000FCC8AFF95F7DFA7823C3A66CBC27247E3A +:103F50001CA9A4CFCCC3DF019EF3E54837BE6FB0E8 +:103F60004408AE63316FA69850E0AE0B17C98F8836 +:103F7000C72309D0B519F565556175A01FB736B3CC +:103F800080B52006CF994FE039CFE3D1D6A3CD3FFE +:103F9000645D70A47246ECBAF6D038DABA4E4F4C73 +:103FA0000AE17D322D7EAAADEBB4D47F3F3A23BE29 +:103FB000F9C3CEE5786EA753FA474B503FF1F0FBBB +:103FC000748EA7B3FAEF97BC3175133FC7CB1FFEB2 +:103FD000C152948F1B25DFE563317FCE6CA77B6BCD +:103FE000ED42CFDB91150831AEDF53BE63288FDF82 +:103FF00007A89E24F962E3FB3502BFFE632CD71F9E +:104000006727ED6C3A01F8183C24B14DD03F78FE9B +:10401000AC19EDF1855DA7CC6877371E3A6546BBD4 +:10402000BA11EB304EE31E33F1AB78781F1F6BD41F +:10403000C5D1357BE2685ED11607ACA771B5E4C582 +:1040400014D9F5CFA6CFC6FAFA55B84BE0EF330F27 +:10405000CE4674A9F7776FC1F25AD67714E3052BD1 +:10406000027A3D7F65835E2FAF6FD2EBD3D7EE84AC +:10407000D301F9756D73AEEE3D861A32AC678538A3 +:10408000CF15CEDBA3C6F1588FB987231159937F83 +:104090006725DF01947ABFC5C22E89E8B8B1D64240 +:1040A000FED7A3793C7F3EB8D6487941414407AC5E +:1040B0003749C29FE523FEA8C9EFD99D678EE5E287 +:1040C000FB6B4D040716F245D1AF5F2BF0E9DADA4E +:1040D0009A0F10CF6AD51BB91C1FB3DF44FE9500A1 +:1040E000D7C755E1FFAEEBBCA33A03F5CF8D12F96C +:1040F000375636E8F5F57AFC05F5B766291C7121C7 +:104100009CF4EDD736EBEBDBC70A3956CA4A914E21 +:10411000BE375692896E44FD4F79BF78250213DD74 +:1041200022F97721DEAD3547C6A35CBB450A505D59 +:104130006B87E78D5CEE70796F008A22BE6BE27E42 +:1041400085D03A89F071E510F91FA31F1887D68F23 +:104150000A7ED26AF56F247BE93949417DA45AF67B +:10416000C9199E417B361E1F8F093C7F85F57970EA +:104170005D450874807FD1D2B430FAC38A9E5F4512 +:10418000F98D451592D740F46C60CDE558CAC41F2F +:1041900050DFB4425964ECA8257E3DC1ACF0FC412F +:1041A000278BE503BE479884797CB8749C77FEA87A +:1041B000DECFF01C17EDBEFD0CF23B7781AFFC0E9D +:1041C00058DF0E2B9F7FC7B312E9AF8D9E63C417D4 +:1041D00073004D70DE46A7E08F9DC01FB5FDC3790B +:1041E000E720BFC20B210B3C34EF082D3EA0E5D7E2 +:1041F00046AA0C1780EFE488798F97A9B4EFEC1BDF +:104200003B24DC771E0B6D423FD18FC7327AAE95CF +:104210009A1F7FF960BCBA06CF739DB3CF4CFAB733 +:10422000885727E8B764ECE404FD7C4CE747986DB9 +:104230003C9F8A71E5F5CF155C34AFC26831E8E880 +:10424000D5A4D874743DBF584FE70BBD7AFABE723F +:104250006A81AE7DB1AF54D7BEB4A642575FEE9F20 +:10426000A1EB7F55ED2CBDBDEF9CA7EB6F5597E8FB +:10427000EAC9C557EBFAA778AFD3F31B4707E50F99 +:10428000982DA1BE808AF7E6199B9A31C8AF4B538F +:10429000A13394B60AAB1DCBF68949113CB7F69110 +:1042A0003C9E9AF4E2B79C11847ADA63964A287F9E +:1042B0002885AB305E6411765EC9AD4CC7CF1795CB +:1042C000723CD74A5371401907E7E339A0E6F27C04 +:1042D000E968099E8F051D8888C74F5B48EF9810D5 +:1042E000A7FFBE5256692B467FEBADBEB9E497EAF5 +:1042F000640ADE97DD67E6F94CA1A779FEACA7B3A7 +:10430000CFE08BA1B7BB8B397D7EDF5F45F9498D4F +:104310005D20CD10BF77BF6346BF5D6357772ACA64 +:104320008DF1FE77CCA85F0F3E17F244EEB761FC2B +:10433000F2898EC47968738ACD34FE31C16FEBBFC8 +:10434000C5F92D20DC02B48F34FE597F90EFAF7E8B +:10435000B999E85BE3A3C03F75F1B078BEBC726663 +:10436000780BD22EF0519DFD72EDB2391FA03DC4E5 +:104370005884F418E0A3FAF6515B89BEAF8DB36F91 +:1043800026150FF053CF05A097937E43C27D2D2DA8 +:1043900095695F2703B308DEDF07B8A1DDF8FD21CB +:1043A00070E2F0FB3CF83C2EFC89DA39C5F7AB2D06 +:1043B000E5FAE8E3C3F0CB3DE21CF749D17264664D +:1043C00041BF8DF074A5C5B21CF30C8EE57DBA1506 +:1043D000E309F53F96D09665BFEE7E311BF30ECC18 +:1043E000078F66633E44B0E368360338AD35A99B5A +:1043F000502F063CF06E827369EC8CD0FAD775545E +:1044000074E3F3759D92175961F0D09939B44FD682 +:10441000B715F5F87DC3ACEBBA62AEA7AC2B56A9C5 +:104420000C06604E94B38792C88EAD3F087C08D7C7 +:10443000F5AC44F730F66DB3D426D24FEA4BF9F71A +:10444000185ED866661847590BEFE33E8EE51D33BC +:104450005B106F0E4A6413063B4E2C477F7C70A3A3 +:104460008961DC565BDF8779D1DFE0FEDF5C6D625E +:10447000786FB075358FC7BEB9D148E318AF3751E3 +:104480007DC51A9E277C64F5EFB6E6C2B86FAE957F +:1044900028BF7ED6F5FF790CEB2BD6703D281E7F0A +:1044A00007F0350E3F5704F47837044F1BBE1C9EAF +:1044B0006E1BC4D3F12867E1DC67E720FEDCCCE8A3 +:1044C000DE62EDF923A61C586FFE56C58BA1DD32C6 +:1044D00063784B36F28523BC7DE2DABD12E72F2AE2 +:1044E000DD67CF6D3733CA532CE67C680F9E5716B5 +:1044F0006EAD5FC2BC362647F3717D2E91C7F5A421 +:1045000089D51E443F92CCF94BD933CEBDB17EA4A0 +:10451000F9021F35BE570AF6FE41F243778CC47B81 +:10452000E68F9BB87F6CB418AFB0A07FCE6228BB7B +:1045300004BEEC17EBD0EADF10F8CF3AF6911C5D21 +:1045400068E1709FD71CA9C37DDC20071E43FEB71E +:1045500060F42FD6A25C6BCF7FC913203F5709C9E7 +:10456000B5A0388F23D3DEDBB301F3EDC6D9E81C49 +:1045700017F7DC13C5736D74CB9467682D9C941387 +:10458000B8881F21784ED5DDDB6BEC3A33C79780B6 +:10459000AEAF13EB2D13F7F35817F71F003F96A795 +:1045A000960FF6D3F6AFF93DAC850FD2396DF826EC +:1045B0009BC8EFEDDF417058B9F68484F752AE32F4 +:1045C000F94C7680F32FD2D872B4835F6A61744F4E +:1045D000ED38DE570356F24A8B42F5A8B8B7F65AC3 +:1045E0008B4AE55566FFAB089FE52F341522BC8E3C +:1045F000E4DDEDC7EF309C3E2EF459A6F07B8C0233 +:10460000F7CE76199905DACF1E92C2E43411EBBFCA +:10461000E6DC4816007EF22B713F6E5DF3EBC4E7DB +:10462000BC0D67E6A09D3171EDA9AD580F36FFE7CF +:104630001CD41B7E037202F12BD82931278C5377AF +:104640002E83DE5FD779C28CF6FCE386FE3908FF45 +:10465000D06189EE55059BCE10FFDC23FC2B69E36E +:10466000781C31D835D140E7E92BE1F68938FFEEE7 +:10467000923FA722FFB234ABAFCEC073EC35D23934 +:104680006EAFEA4F55129CCB491817F3477E25F2BF +:10469000F186F0597388FCB2B5026FE3DB93C7195A +:1046A000343BDC24F2949804EBA913F8558FDF8394 +:1046B000C9403D5F8AD8806EEBBB66917FA3BEE99F +:1046C000E2DF77190EDF2EB56C64DCBFA1D5D1FE19 +:1046D0008ACDD742FB4B7F0F3DC4EF71E5B9730222 +:1046E00017D1EF827D23297ED2D8CE285EB2EE5C30 +:1046F00009951F3D7B1BDD7BB2D8FAEF46B9C08A16 +:104700000CA4D7AF0BE9F59B4F4B381D7C5AC2E97F +:10471000B8601CD8271636609F801D5284FA0ED8C8 +:1047200021A93D4C679FC43F27FBC422FC86A02ED5 +:10473000059E4CB0EEBF9454958ECB42BADA49F840 +:10474000CD00BF11AFE2F739651C5F9746CF2B7ADA +:104750003E30A3BE1BEC4C4CCFE6D2CA2938EEB695 +:1047600061F2EFCE8B7DAEDBCD085EC1DD1904A713 +:104770000FD96E7F15E0E587B00EBC977EDAEF4F5C +:104780004E87F74F07FCC9189FD3E8BF71B78DDE7E +:10479000DBE65E9289DFD1982FF0FEA3CE59168416 +:1047A000F335BB39DD69F3FD26B22213E967B2A9FF +:1047B000DF8CFEC9515DA75251AF9BFCECD24CA4DB +:1047C000BFE1D639A384F3E575CD2397D3BD1FF898 +:1047D0003102DDDF24E4587073C48CF0BFA9991155 +:1047E000FE763FFDEB46A4DF8FBA921594931F3EF1 +:1047F000971C427E7FFA7052D80043AD15DF3FFA16 +:10480000D0D4B788F4C7678D94AF103CFCC7BB9178 +:104810001E834F27D13D9A9BBA6E3B83726E6DD734 +:10482000DC0F642C1FFBC7D2C3BAE6D1CB63F38B7A +:10483000FFD8726024F2CF8F64CE276EEA7C8AF4B0 +:10484000D99BCE9F1D8FF9831F3EF79729C8CF8232 +:10485000CF9F9D827C2CF8D3B353B03DF84C72535C +:1048600022FD646D29F79F68F2D1F586ACF3B3643D +:104870000B79E06ADB5983DF29987C6219C501B4A2 +:10488000F6C985063FF69FFCF3EACCEB63DE6B8B43 +:10489000CA942F31E94475F2EA18BC4C2E35697E72 +:1048A000BA4BF38F883C04CD3FB22D2AF37B750DB4 +:1048B000C630E6F1AE8CF2F87BBCDF8431FFFC320F +:1048C0003CEF35595EFC3E0FDE4BC7B8C8E99B0B89 +:1048D000C3742F3D6439EA8ED18356440D9124F47C +:1048E00083742545501F5A11954F25C5F8457EA361 +:1048F0003CB905D5F81501BD1F23DE0F023F297213 +:104900004CFCA47E63C4A4C9A98530FF2FB6300532 +:10491000E33643FC23B55F253F4CBC9F448DDE65E9 +:10492000C1F75437FF9E8EA667E2791D4A40EF1506 +:10493000829E353A6A8B1AE81CDAA2551637941E05 +:10494000414787406C86302FA86BE94368A7B79D25 +:10495000BF2A19E1D5F6C61286DF8B38AD54590A45 +:10496000F1BDF35FB52CF70CE2C710FE318EF3C733 +:10497000017D601839F7A1E05BFF2879F7C13F8915 +:10498000BC03BBBA1FF937D8D52BB9DF83DBD5F110 +:104990007242E3BFDAB8AA38E7A1FCF703D25FC0DE +:1049A000FE25FEAB96A8D46F54D7E24CB28BDF58ED +:1049B00096A9DA878E5F207B0D199EA1E36BFA5AC8 +:1049C00030E43B6A413BC6C7F34F83CB24FA6E54B5 +:1049D000D02F919E1DAC3385B15D5B4F74198F0B49 +:1049E0002EF74AF41D104DFFD3F4C381F649D0EEE3 +:1049F0001AD41735BD30EAE77ED1653E13B55F6541 +:104A00000EE4944CC6FD59E9F9E4697C5CE0034787 +:104A1000D1FF79D5D724FA4E97A62F6AF819AF4F50 +:104A20007EDC5570D1EFCFED1178A9D1D7E838BA37 +:104A3000D0E4D47C81EF8D28A733514E7F66EEB34E +:104A40000FAF77839C2E2DA1F718BD3FE9E7B23F4A +:104A500091DD7D588C3B433BB7E80B95B8DE3C16A7 +:104A6000A5BCA8E1E467AEF0D30CD73EFF12E9F88D +:104A700086927F2C1D5F57F2CF41C703FA9F39F111 +:104A80003EFF52527913E2AFCDD844F7A3D8CF4CB2 +:104A9000E4B78EEFA76AF6A4CC74787C34CF6C4070 +:104AA000BB27D8C0EDFEF674F555B24F5EE4F7EEC5 +:104AB0006F12F94A379E53A86CC70F8361FBB75C2E +:104AC000E4B7B9F1C009930FDE5FB9519A88FEA02F +:104AD000950DFAFDB467F9E6C6FAC1DB4774505C80 +:104AE00021F450818AE3D7E366D11FD23E328CB1E4 +:104AF000C746F4E34CC0E731F72D609E75E2F90C30 +:104B0000E1DF61717AC04FBBDF247F0FC685907EE5 +:104B1000CD5D12E585047BB9BFA3B18BF385F71B8F +:104B200024E227EF8BFC8C60B395FCDB9A1EF181AD +:104B3000E8B7E66689F4BD217A854F1F7759F7E01B +:104B4000CF892FC6EB111987F838186F41BFCCD128 +:104B5000BC2912D6D7815D88DF250DAAEA95B97CDC +:104B60007D2C4CFCC5A7F3A37CDCFB3BB223573E5A +:104B70002BB14CD23BE2E22FEDF3E2E22FC78EE6FF +:104B8000E23842CF50E03FF41FC6EB198D9D274C11 +:104B900068177C5E9CE59912BD5F708CCCFDAC63A0 +:104BA000BA2405FD4963049C2EDB662338CD797B4E +:104BB0007526D2B9763E1F2DE6E7F5D19B9F54E2CC +:104BC0007B53DE9615E4B73F7D73E3EBB9BCAE5A79 +:104BD000547C6F6332DA211FBDBD3E19E1F85328C2 +:104BE000F1FB48CF9C9413FA0F0B4B39BF01F976B8 +:104BF000BC84FCBFC26F2C837C4B19F4BFC4BF378D +:104C00004BBCD78EDF2D42FC7B96C7B7DB4704E653 +:104C100051FD9E7C9E472C737C7DAA2B5D417DAF10 +:104C200014368B71D81FD9581BC657DAB3022F110F +:104C30007DDC6320FC85F7F977270EAA24EFF08A44 +:104C40001DC63FC683ACB1505EA383FC37DA7761E3 +:104C500046801D2ABEA3B00CE3AEA5220E32DEC6EE +:104C6000641C7F8729B07D1CC65DBA65EF267C4732 +:104C7000F666E27790E2E3315A7C588BCB6871E2BA +:104C8000E1E23212CE339EE359EC774EB4F80BFBDF +:104C90001ACFDF6C9DDA44F75F7B31469238EE32F3 +:104CA0007A5C82784AE938ADBF3E9EB6BDF849C20B +:104CB000B72F1A47BBA164B8F9556E77C6CD3F2907 +:104CC000FDE36CB25FFEFA5FA924CFBACE92DC3965 +:104CD000DD9F24EE71F6713F759789ECF5D360077F +:104CE00065C5C8B3F6717CDC9EAE59848F87A2D5AA +:104CF000C9D8FF09F17CDB1BCB96A23E1D8ACA3CBA +:104D00001F9B71BBE650549ECCF5832170BAAC2436 +:104D1000417CCA624B9C07F49EF017BC27F63DEB22 +:104D20004D6EAF0437F2F88122E82D5863267E726B +:104D30002C2F5BD2FCC83989E20BCFF6139FAD5FF5 +:104D4000C3E3BB971C5FE8EC36B1FC047EDB9A3909 +:104D5000C46F2ED55FCBD00A9E32C89F2B4BC5F7B0 +:104D600086CAB8FFF6C5127E5F27A36962257EEF6B +:104D7000EEBD61CF3B70B0F4D2E27CCF7B2EAD9F15 +:104D8000A138513C7068BFA997D86FCE25F6BBA15A +:104D9000F8D2D6D77589E3EDBFC4F16E1997A8DFB5 +:104DA000FFA3F1CFF8F8667C3C343ECE99F4E2F5EF +:104DB000216CBB4DBABD3F82D04D7DBA5602529593 +:104DC000D31FB4205F5B308DC703B6555BC27BA594 +:104DD000C1B8A806AF87CBB8DEA578CE84F0BB8873 +:104DE000A37DD1EA4CA0E3D3D318D90DA7ADE27BC4 +:104DF00048B23262319D9F42DFC369B7268E2FAD24 +:104E000014E30DC7475E29AB7CBC7432DD1F4AF842 +:104E10009D8AEA526E67289D8CFC354C56472CA122 +:104E200079D5112867D25EE0CF53238CF2FBA0DD49 +:104E3000B584F467D585EBDB25E25E19F38A5CE87F +:104E4000A7CB00798B71913B303E427E7D85FA691C +:104E5000F34DF2F0F97699988471ACD0389E57C131 +:104E6000D42788EF68718DE3A6C8EF574914D7E8B7 +:104E7000C5F5BF6C8878F6B9F8B9207C3D87148AEF +:104E8000B7BC32EDE162BA172FE21C1B14DEE50855 +:104E9000DA19B08E0DCF5510FEAEEC99F6CB3AD4A0 +:104EA00007DD32C179881E2EECAB93C23ED4ECAB49 +:104EB0003EB41363EC8DB784DE9080AEDE2A4D40A5 +:104EC000A7BB246EFF865EE6F66F85D95B109B4F0D +:104ED000F5BE80FFAA08F7C36A76ED785FD8900D1B +:104EE00070A8B8D9184902395DB1B5CC8CFCBA624A +:104EF0006B9E8DFC4AAB0F1A3478273AF78FC53A70 +:104F0000B7F5F6535CE2A9F87BE61E33B5EF15F86A +:104F10003309CF16CA0D85722B8ADFB4998A319175 +:104F20005FBC1EF47E5CDFAA76BE5E2D0E521F5162 +:104F300067E13CA78EF66FC5B2BCC1358BFC866BB2 +:104F4000CF6C45B9193C7FF6D815E40730AB89EE34 +:104F50000B3C5B6624383C858A08C26BAE4C79BB3F +:104F60001573653AEF8C7A2BD9E1192666C4EFAE3A +:104F7000662CE672ACBCC6310BEB6C593AC9E1F257 +:104F80005E35FD7ACFA09D9F31776316C2E9F3E2CB +:104F9000439ABFE02AB32FD333F98BC787D61D7F3F +:104FA00083F2CCAEE9D3C787B478CF70F1212D3E20 +:104FB0001BACF944174F0ECAFD73D0AF52F1DC2978 +:104FC0008A0F073B25C5E91A8C1B050F9D31137C01 +:104FD00045BC08FA9BF1BD0A38F61119F8BD011E4F +:104FE0003F7A1AF371CDF83D3D85F26E7F82F9B8B4 +:104FF00045F83D3D9E8F7B18F371CD78FF83E7E345 +:10500000F688FCDE60D7198A374DF30CC9A7A27861 +:10501000C42D927FA6479F4F45F5F87885D1C6ED00 +:10502000D060AF89BE771E3C6E213E5BD9B56A0C5D +:10503000EA63DA77C81B315E10E35FFAC8E7B5E2CE +:10504000FD9E8FFC5E2BC6092ABA3F30ABC4772287 +:10505000B998C2D42847CD68EF231C28CFAFABD274 +:105060008A70FD5CBF7EE7FFF7EB7F11BFFEE13288 +:10507000EED7D7F847B9DF40F7CACB7B7DD6EB63D5 +:10508000F8C3363FF70F6F73E713FDDDE5CF4F5FD2 +:105090001DEBC7AFE1F65BC65CB735F6B9713CFFF7 +:1050A0001E448694F87EC1768F61383D707B62FD28 +:1050B0002E713C605B0DE7239ABF7F687CC0FBA22A +:1050C0003BC6CFFFD1CB16FA7B0ADDCF26913CFF42 +:1050D000F4B9A47DA87797D7AC1E9302F5F2934953 +:1050E000CCC5E5912EAEB0B2C6E0B3A6268A23F8B1 +:1050F00072E97BA1F1F1821A03F1F78178418D7C8D +:105100008AEA423FBFE6CC7B29F8E9EBA7A4703BD3 +:10511000DA174FAD93BCDD6C68FC0006CE655361B9 +:105120001735DC4EF0D65AC82EF8BCB842DDA113B4 +:105130005BD04F3091ED6CC7EF4F4E741B14104590 +:1051400009E20A3CBFB35CE811F1FE01C40F94FB15 +:10515000F17EC1E7C5F93D2FE4FE5CD4F9B306C783 +:10516000D1DE8B3F77479974513FA32CE4565B4DBA +:10517000F9363CB7D0020343FEDF56536571C78C46 +:10518000F79A87E7CDECC2388523364EC1E311F19B +:10519000F1098D3F55747F3607CFFDAE2EEE3F0AE5 +:1051A0003AB93FB3E27025DD33195C27DFDF5DCE0E +:1051B000817B86E98CEF8B59B89F8BFC0AE50B3E0F +:1051C000E9C1BF37C0FCE9F4F70B82C7DDAD76E477 +:1051D000230BE4C9924AFEED017F37FAA396BEDAAB +:1051E000300FF3812B964F3C81E7B2BCCE44794718 +:1051F0004B5FADA5EF8A6BF2AA62F9DECDF8F768D6 +:1052000096174B5EAB8AED3555D83EFFB1087AF65E +:10521000D8425C1DD04BF438F4CE27FFF6C7483790 +:10522000158B85DFBB8ECBD5E55D8B4DFCE3567AC8 +:10523000397724EF53B29BCF7655903F3B13E3ADC4 +:105240009E413953F11CC89F9441F9F3F7CA1D4799 +:1052500019CFF39F00F207D793B198C705E3CFFFAB +:10526000350F3FFFE1E4C970FC13E507FF7B3BA16D +:105270005CC939287755B4A72F1B94BF4A27D4732C +:1052800086C7BF7902AFD387D1BF660BFC1C365FE0 +:10529000A3F31FE3F7AE2CFB27F17B0BFB46F37F59 +:1052A0006BF6D07D02CE5AB947F08DBF3B5F1985B2 +:1052B00062C27CE58CC4F9CAD77448F41D1691AF5C +:1052C0007CD4CC2A0F3A304F4FDC4B08FB49BF3916 +:1052D0007AEFAFB63EE2C07B09928262675DC70992 +:1052E00092CFEB409F213DA8EB8FDC2FD5C1F34B34 +:1052F000D775EAEF3F68E5112197AB613FE44716A8 +:10530000797C730E71BA0EFACC61D5857EA16FCB14 +:10531000B17EA1A01ACDD2F203C35C2E25CCE36BE3 +:1053200064FD94EFD7D82079511E7C693F918FE7B7 +:10533000F75DAA9FA8AD4CF885849FF99152CE0FD6 +:105340006A039284FAA8C5E05F4BF9BD8725255111 +:105350009EE8BD02DFE70B3FED7E33C783FDD3251B +:10536000CAABC57B3178BEFB0FF3FCF9FDE53C7F92 +:105370005EF3CB6A79F1E306FDB2741F46CBA7D783 +:10538000F2E3B5FBA18B77DB22A85FEC3075389197 +:105390000EB5BCA2F9A88B601C467C673C7E9D5B69 +:1053A000CB2AE79751BF61F59BFD6509F49B33421A +:1053B0007E3E56A6CF238AD1CB9F289BACD3CBA9C8 +:1053C0001EAF97FF4FF965E70CEF17365CA2FFEDB4 +:1053D0005B97D8AFA12C817DDD6A4DFCBDD0D4F1A7 +:1053E00082FFC6FDBD1136E47E0F976FED92FACBBA +:1053F0001914E732519C4BE32FED297CFCB7055F74 +:10540000D1CA7382DF0CF75D49E378DE6FA3E47BDA +:105410000BCFB1F480DE4F56D6A1F7934DE8CCD038 +:10542000D5274646EAFA57F4E6EBDA27474B74ED00 +:10543000979D2CD7D5A7F54DD7F59FF17E95AEFE5C +:10544000957EBD9FEC8A734BE2EE1D71FCAE048C21 +:10545000887D6F96E5EBBA7EB90DFA7DE535E9F703 +:1054600035A659BF2F6D5C5748BFBF8276FDFE320F +:10547000D07FEFF9F2FEFB4D1E55F8EF0BE8BB7F36 +:10548000BB6ADCF49D6BEDFE9FD6EFBF0137C3FC1A +:10549000BB80700000000000000000000000000061 +:1054A0001F8B080000000000000B53E16760F851FB +:1054B0000FC15BF918182EF021F8F4C01CCC0C0CAD +:1054C0009C40ACC8C8C02001C4FC40CC06C49E0CA3 +:1054D0000C0CFF81F81B10BF05E22740EC0CC40741 +:1054E00058B09BE3C6CAC0E001C4DC40B3789889D9 +:1054F000B7DF8917C17ECCC3C0700E889FF1D0374B +:105500000C061B5E27403FBB7E43ED3A2932F0FE7E +:1055100006612131609A1447F0A78AA3CA0B8B2138 +:10552000D8C9D294D9950FD40F00F19321F08003FC +:1055300000000000000000001F8B080000000000B9 +:10554000000BED7D0B7C94C5B5F87CBBDFBE92DD16 +:10555000CD26E44900370960501E4B80C84BDDF072 +:105560003252C40411828A2CAF10027914A9A5FF0B +:10557000DABB0B2804AADE5851A37F6A17041B2D3F +:10558000DA80D11B6DE02EA208D56A684551AB0DBB +:10559000888808498C8F6AB57ACF3933DF66E7CBC4 +:1055A0002E89B6FE6FFFBF7BC3AF1DE79B993367A4 +:1055B000CE3973E6CC9999B3268385192E60EC1BFE +:1055C000FCBB9C319B893136A62B6D573A86AB3993 +:1055D0005DE5B7F9BDCC6B66ACCE6FA5748B3F9D16 +:1055E0007907C3779FA1306867EC5EBF8BF2BFF08D +:1055F00017525AEB2FA27A77FA4B287FBBDF47E985 +:10560000667F197DAFF157537E837F0DA59BD445EF +:10561000692C05FA66458559C98C553D9393B71990 +:10562000725B668D4F504743FE15233366017C9FA6 +:105630004AFD31D5BD69E0E8AE7A1A9E9BD449FD9A +:10564000104EED128E17B3325B8C7A5938CE3B97E1 +:105650000878F6D69A9CE4A8F50623BCDB4B00DE5E +:1056600050287085AC39D1E15D8CF03697A8BC5ECE +:1056700072B0263B3A3C0FD6ABB941C04B0F5863D2 +:10568000D41B83F536DC20F0EBE7ABC98ADEEF787C +:10569000ACC75CEADF5AAD8CFEBEC9C6FFB7BB4ED5 +:1056A0005D2CF246CC263136AEAB9D3E652CC070EB +:1056B0009C2AF315121FDC995F7F93CFD84D0813F6 +:1056C000DA0726B19011FA0F24B1E0FA2CA9FE4CAA +:1056D000AADFDAF7EB6F52A5FA014394FA26D6A0B7 +:1056E00060F9CF518E80EFF7F97329DD28E4E7BE2A +:1056F000A106C6B05DBA393808DADDE3F790BCDC44 +:10570000ED1F4BE5770939FC7721674121670FA22F +:105710009C41BA15E5CC8CFDF95A4B014EFBDE7865 +:10572000B6D94DF2B598F05419C1DFB077C8F6CDAF +:1057300000FFBE1B569DDE06F46F6B1EE63142BDB8 +:105740007B866AF2C5BC2CB9ABDE3DB34F38170D72 +:10575000257A97219CBB3D827F2A0C2CA2DEDD336B +:10576000C2F52AB0DE5D9E30BC5064BF774D09D7CC +:105770005B457C56584983BD3B5F763085E6230800 +:105780000AD1D784F48579F9EC80EB9456689F921E +:105790009C97C6A0DDFD381FCD38EFDC4417AD3D2A +:1057A000D2D907DF332CAC1AE10365F71B015FD3B5 +:1057B0006C7722D2E5F66B8B98328CB1BEA23C3569 +:1057C00050A464015CFB9C2205BF9B6643397C7737 +:1057D00089F2E435BCFC762C7774952762397C4FCE +:1057E000AA8672C8DBE7F2F23BFCC089C15DF536E0 +:1057F000019F7DC4EF74FE1DD88AF4318DE6A98621 +:10580000F713282440BF83988EE9C27FD3A07B334F +:1058100016DABBF0B50DAEA7BC86DFA6C17194D772 +:10582000F0B15DD82F6321A47D97F465DE5C311F54 +:1058300058773A277AB3A5F24CD593A0029D325FF0 +:1058400032B200B02013C413E1E9DB153103E1D912 +:10585000E3FC4BEEDDFC330D95E9A0A547053D3497 +:105860003A6CEC2FD3C13240A6C3C601321D2C17AF +:105870009C9F0E3B989BE81C8B1E5ABF9B87C8FDC4 +:10588000C65D24F7BBF922B9DFB88BFF39FDD664BA +:10589000C9FD5AB3E57E6BB2E57EAD39FF58BF4C0A +:1058A000F5C064407DA5FD5D28E9B7AB99EF2CB646 +:1058B000473D87F349D373A6641FF3D9BBF809EBBF +:1058C0001463F99170064B7A15E07C8AF5008EF727 +:1058D000FC705C3A3883F470BE16F8B0483DDD0DBC +:1058E0000E1BA81F8749E1ED428688FE99EA6345B1 +:1058F0008EC8761E5DFF39FAFE9D8A1887E1BCFDD1 +:10590000BB7574CDD6E39326F06186F3D183B97469 +:1059100070B2F470DC029F90725E386EFD382E1407 +:10592000FD071469FD027A0CEB6AD70EF8D13A959F +:105930006709EE04FD10DAF7E5295C07CE355EEB6A +:10594000B640FDFD232DA1CBA1FC5CB0206881F207 +:10595000C94F1E75A21D53F1A451C572C33E1BADA4 +:105960002F6D3B142AAFB2B4DC3901CA3B9E34B26E +:10597000EDD45DA601C7774AE81416E2F9521BCFB1 +:10598000566CDB7F23B62F6BB2301BC0AB787AD955 +:10599000CC09905F76C8C4B04AC5CEB5E6BE905F6C +:1059A0001E541A300FF8D23A15C8B3057742FD7568 +:1059B000FBBE6C43FCCF359A06213E67609D70C3E9 +:1059C0003AF192A3257536D0A73CB87B1AB62FDFE3 +:1059D000A57840C301FE3B0F6620FE8F281E0BB04A +:1059E00070457D3C7347CC97538D461AEFAA6D4A9C +:1059F0009001BC65AC761AD2B302898378782C41C9 +:105A00009BD235DFCEF8EBA83F2D5FF108F407ED10 +:105A10002B1F573C38E44A03F3E13C6E7BDA56F225 +:105A2000901DC7BBD63CD881E3DC68C67ACB820B1D +:105A30009FB2B911CF6DE66988EFD66DE6D2A14865 +:105A400047B6A06828E2F77F65FCEA8C5E1CEFAAE7 +:105A50009196ED46C083D943036739BAEBD933B089 +:105A60005EB923D6CF72067A9FD6EFA0B97858D701 +:105A7000F72F0D89A43F56D41B99DBDAD58F261F4B +:105A80008123423EF63A88DE1A3F57B9F814D0F81F +:105A9000B92A51F057EDC89F35AC3B3E77225FC81D +:105AA0009E7651FA0B583731DD02EB3CD2EF5EB0F7 +:105AB0009FDC64977BE8FB03602761BA15EC244CFC +:105AC0001F043BC92DEC24ACB71DEC244C77809D02 +:105AD00084DF1F067B1CD37AB0C7F1FBA3608F6302 +:105AE000BACB1FA0EF8FFB6B286DF0D752BA07F926 +:105AF0000669A33F48F59EF2D753DAE46FA0EFCFD3 +:105B0000F89B28BD5DD0D1399115E03AEAF43217FF +:105B1000923D6986B7C004F9A4229E4FBD21506012 +:105B2000867CAA0FF24097BE2B430516C8F7ADE658 +:105B3000E5036E6193AC901F10E0E5D9B77B27D9E0 +:105B4000209F5DCBCB076F0D4C8A83FCE0202FBFDD +:105B5000685768523CE42F6AE0E5C39BD9643BE494 +:105B60008787783EEF25EF6407E4F35A783EFFCF4E +:105B700081C94EC8E7B7F2F6E3CF068DEE28EBEF0A +:105B80001E937B31AA9C03CADB5E3503F266F74D98 +:105B9000A8128F2AA728DF68F252F9FB4ABB578563 +:105BA00075BED1ECA5F22F94CF29FF94C947E5F13A +:105BB00006A580F2661F95F737C451BEC914A0F23E +:105BC00011863E3C6F0E507981A15F01C27FC614E1 +:105BD000A4F26B0C8378DE1CA4F25FA8C30BA64072 +:105BE000FDC70DBEBDA8EFD62BBE32B40F99DA901B +:105BF0008EFA4AB32B77E2E0D0CECC30D33CD8F348 +:105C000087FC87681EE05F32E64B1F46BB14E01C32 +:105C10002438268063EC194EDECB632538792F9724 +:105C200069705E2138B6DEC1D9F3F278199F97CB3F +:105C30003538C7088EA377E3CA7B65A28CCF2B2BA0 +:105C40003538C7094E62EFF0693C2AD3A7F168984E +:105C50003E67707D589FD23B7C46BF26D367F46B6E +:105C600061FA7C4CF864F40E4EE36B327D1A5F0BE4 +:105C7000D3E72B82D3BF77E31AFDBA4C9FD1AF870E +:105C8000E96332209CACDEC179EA6D993E4FBD1DBF +:105C9000A68FD380F419D4BB71E5BF23D327FF9D12 +:105CA000307DD2089F21BD83F3D43B327D9E7A277D +:105CB0004C1F37E133AC77E3CAFF8B4C9FFCBF84AA +:105CC000E93384E08CEC1D3E4DEFC9F4697A2F4C2A +:105CD0009F3C8233A677F88C3D25D367ECA9307DB5 +:105CE00026109C71BD83D3744AA64FD3A9307DA6DC +:105CF000109D2FEDDDB8C6BE2FD367ECFB61FA5CBB +:105D000045700A7CF5840F03388ED8709E3927D3EE +:105D1000E7997361FACC213853014E4ECF70C6B764 +:105D2000C9F419DF16A6CF02827365EFE03CD326D3 +:105D3000D3E799B6307DCA88CE57F56E5CE3DB6554 +:105D4000FA8C6FE7F4A9B278263BD0BE4B649EED87 +:105D5000D0E492930D079C9037D99907C1BEA484D3 +:105D600076207C582BC92E543D9A9DE2616887CEDF +:105D700070BA3DE8F7316AF6086BA1FD827D57A243 +:105D8000E40FFAD230E916C4D701565BA45D923015 +:105D9000364EB28712BD4952BE4F615FA97E4A514D +:105DA000B6549E567291549EE1CB93F29965E3A549 +:105DB000FAFDAB2749F90BD64C97EA67056649F916 +:105DC0009C9AEBA4FA836A1749E517D6954BE543ED +:105DD00082ABA4FCC5F5FF47AA3FAC619D543EA22F +:105DE00069B3543E32F40B293FEAD00352FD312D02 +:105DF000DBA5F24B8E3D2A958F6BDD23E5279C7E3C +:105E0000466707CAFBFFF5058CDB831966B20743BB +:105E10000E33E5CDFB6C64FFEFC73CF0D3DC7706B7 +:105E2000E5CDCF2E7627E37E1A01C07A5FD0B7EC9E +:105E300042F4F7DC3CDE77A10BBEDF6CF68D7045DB +:105E4000F1477854DF3E03F98B5A14968EA9DB8014 +:105E5000699C51ECD72D5CBE3666E53F148890D323 +:105E60009AFE30FF207FD86026FB5593EF8DFD4BC7 +:105E7000D31746F4B3A1BFB964FB50FE7DB11DFB3F +:105E80002B7A11E75995B96330E2A5EFC7923D56D9 +:105E9000EAC73AA08CFA790DFB89F07B590694E9A0 +:105EA000FAB1966C17DF453FC7705CB1FAD9983DDF +:105EB0005E1ECF8072EAE75D5D3F1B0794EBFA89B7 +:105EC000E3E381EFA29FF7CE3B9E9C89F2782E58A8 +:105ED00049FD74E8E866B960A5AE1F3BF583DF179E +:105EE000933F17760169C0674B4729C9C17FDA58CC +:105EF00000E4C29C59FE6BCCB3B76C6C10F6E38621 +:105F00007EA11ECBE5FEA3A70D49349ECFE280FF04 +:105F100011766AD77E3640FBE2A5024516048C60F6 +:105F20007F5B296473C9AEE20137B9216D3A30F065 +:105F30006EEC678BC33308F26D4D93CD8BA3C8D342 +:105F4000D25AD3A9D648BF88B6BF99C472ABA1FFB5 +:105F50005D369794D7D2958A8B097F04E54FC0BEF2 +:105F600085C17EE0CFB02F6040AA774D7C9FF60EB2 +:105F7000EC6F30DF0AFB1B2C676C2DB53B21FCB4AA +:105F8000276E578248EFCF7EF24313E9F1007B354D +:105F90003D15FD6EFC6FC19A78F4F187F15B18E84E +:105FA00023E5415D661AD2695F48FBDF8EA72DC1EC +:105FB000ED48D79A4CA0A9A897CDD8EBB0C9CD4849 +:105FC000A26CA6612C63B3AB8BA7A6D12C52FAAFFF +:105FD000023C67358E34410BD6666ABDD163EF82D1 +:105FE000CBBCA613481F2BFC4338D714423EA2FF5C +:105FF0006B8BE4FC5CA676E581DF838DD9826FA292 +:106000005FB7D7847C2D4AE5F8CCC5340F8BB9BF78 +:10601000A3C4C5DB6AF8542D36B110ED4F03290C2B +:10602000FDD18164AA779DB6CFD4E15762B27A8B55 +:1060300080AE250B8D44573DBE6FEE8BF71A86431D +:106040005A73B7095D9B3DE13FCF2797B332DE9F7F +:1060500046574D5E4E09FE9E40FE43FA3EF21FF04B +:106060003E29F8DF25C79CFF5516DF4CE47FC7FDAE +:106070004646FC127C9F23F8BEB456E6FB1CF49304 +:1060800043FD39ABB382EBB17E5D1F89BF307099A0 +:106090000EB5774D05B5DA0DFFB7851C5C57B3FB20 +:1060A0007964EFF565BAF1093EDC28F8305F478F77 +:1060B00039826FF305DF96B1C06D19E43F0A9AD0BB +:1060C0002F36AF4C61A82FAA7EAAF1AD55E29B4FA7 +:1060D000E39B0EDF1B05DF6EFC09E79B1EEF56C13D +:1060E000B7D6BA8F4D2CBB3BDE7A3C17ACD18D2B8B +:1060F000A0E75BAD38777099D1DE29F616F439192F +:1061000051FF9AC22BFB9C8CD00BD716154BF9B9BB +:1061100025F3A4FAF37C0BA5F2EBCB964BE5F3AB9E +:106120007F28E517ACF989547F6160AD54BEB8662D +:106130009354BEB4F62E29BFACEE7EA9FEF2E03633 +:10614000A97C45FD23527945C36E295FD5F4B4542B +:10615000DFB06FC8D5285F2F1D3532F4977DEA79FF +:106160009FFC759F7A4C1EAC538932370EE5D94D92 +:10617000F27CCA9F4BE969BF87E4FD8C7F2CA56D3B +:106180004D07ECE87FAC8A03BD9F0876B8F1CDB52A +:1061900035FD70BD81F6E3196B36B6AE0D40FE00DD +:1061A0001E46C1BC99516766A1510CA4BB6F589E95 +:1061B0003B8C11E5AD3D94D7A92CD4A77BF98CD6A7 +:1061C000E8DFDB958EC119E8277CC3C27646F8EB81 +:1061D000BA9F57B04CB42B62959F35B0B2C8F3ACA0 +:1061E00093467E4EE2344E3A698474A599CFFF956A +:1061F0007B32263127E64383ABA3F85DC2FD350031 +:106200003269C8E71C69DE2FABBBB86B9E33EC2745 +:106210009BE476797094F47D45FD04A95DAEE27B44 +:10622000D708F5CEEE37D27ACD4207065C330CF1B3 +:10623000F39EC4EFAC2985ECAE16BFB7CFC9818CF5 +:10624000FDD15F48E9ABFE224A5FF397507ACCEF6D +:10625000A3F44D7F19A57FF65753FA8E7F0DA5AD98 +:10626000FE00A527FC35949EF4D7527ACA5F47E911 +:10627000697F90D233FE7A4ACFFA1B286DF33751EB +:10628000AAE9CF9EE4EFB4585FCFA0FC459133F369 +:10629000AD6C5DCDC42E398B532DEB50CE34FACE80 +:1062A000A8B308794895E42111D76192B31ECAEBCF +:1062B0004C420E63B58F5E8EF2D6F77B9037C6D612 +:1062C000911CCC1472F75DE58DA1373E05E529538D +:1062D000274FB21C6A72A4E9815CA568B83AA64B44 +:1062E000AE661AB99DA4C9D5CFD14E8C626FDDA020 +:1062F0002A62FDE3F611F36518D07E5B25FCFECC27 +:106300009D4EF94ED1F77A00D782F5D4602EAE2398 +:106310009DB97F1B8CFEF1CE6316867EF858E3D3C1 +:10632000CB4B6CBA7B69FF501A84456D54F7725B96 +:106330001CA7ABCDC00A591E9ECFE61FF3013FE359 +:10634000FEF3E23CDCD7C27795915D15F41447F17A +:10635000B73394F1B49EE9ABD53FF5C097F9786EA9 +:106360003E53CCF3B803467EAE1D7AC8734DC4F9D4 +:106370000CECB7D3D1EFDC31C8EC22FB21D457A60B +:1063800063B0AF44C703833E1B8CE71B9B400E7179 +:106390007E750E1C9CC0CE231F3DE9F99EE8B928EE +:1063A000D8B797F434333C37027A6EC7FB2FBDA5BC +:1063B000674F7AB227FD786233A7B353D8A7B1E805 +:1063C000DC3E09E65D1439BE475565396603F97947 +:1063D00087467FDC9746D0FF52BB9BEA3FB7EFADC5 +:1063E00001ADD04F67E385098C9FE7905DD7F1A49D +:1063F000B0DBDD99321F5BFB125C0DCE734FBE3EEE +:1064000000F7C9B76106E6D993F145BF5253BAE028 +:10641000F5F61C3ED6B8767FCBF9D99EAACDCF969D +:1064200001284F9F093D10737C3DC9298E0FE05C08 +:10643000A5F0F16D3016FD0EF54C787CA3537A353E +:10644000BEAA04335346007E0EB3992530B643F5F9 +:106450001D54691FE7690DA09F625FBC673DB0A432 +:10646000CA79E6E5901BDBC9FE8C15F536976C3FC3 +:1064700025BA64FB29C315693F751E7AC8E903FC78 +:1064800056A51B5C2747E13AE715EB1C5F5735FC27 +:106490002A1AB25C76098E9CEFAC550A1B489EDC2A +:1064A00009B3A39C9769E9AA74B3EB24AC5767EAD4 +:1064B0007312B0DF337EAB8BAFAF2E17EF37DD1526 +:1064C000B9BEAE5C1347F535FC62C1FD67E3C75842 +:1064D000237BD78AEB2294E5C4AE1F939FEA2766FD +:1064E0003A976E367D86F6BB2D57B3DF55CA6B7073 +:1064F000AB1A8C01CB08FCBE4BEA0FDAB9B5336698 +:106500006C175B6E54764AE327F0DF8A07EFB46FAF +:10651000B5129F7D003101E0B5ABF61A94AB132A9A +:106520009FCF55424E2BACAD669F9BC8DD82F2BC1F +:10653000682CD326CCDCB7404F7FF0A289EE69B13E +:10654000AF007A7ED7558125ACC8894ECF458D2BBB +:1065500066E0BAFD8141DB0FD7E6E3B8CF314321D6 +:10656000EAA573EC8FCE5111F3758889FB63580D42 +:10657000DFE704E01F8E6F69ADBCEF595627E74B8C +:10658000D9AC54D4B7A55B4C2C08B82FC77D933633 +:106590006ED0BF1926EED758C6AA37E03EFD5E136F +:1065A000F7F72C72313513F0AAF88F5FE6A3DFC737 +:1065B00063E27687769EBC3C89E35D3E3B68F642AB +:1065C000FD771B47CD018D0BED831BC8FE29669E11 +:1065D0009DAC3BDD17D7C8F8F584BF1E5FCD0EEA32 +:1065E00076AE2DF048AE57BCC1287AEE329322F633 +:1065F0007F7C7ECC36C9FE9C7926D9EFA3C9814920 +:10660000C8C109D577B5690CE73BF251513BCCBE07 +:10661000887AE6AE7AB3CF57CF82F58C546F9E2935 +:1066200005EB754CA3FD3103791ADA55CFD605EF8A +:10663000460E4FAE57F11F8F3D15007929FFED3DF6 +:106640004E06EBE6076A6DAA07BEAFDC799BD30B5B +:10665000E96935E0447E7E10341646A3C796303D86 +:10666000BC7605FD69423E594D80FC149FED34B95E +:10667000C8CF5F6F0959404E2B1B97CF60C3297F4E +:106680009CE7377E64C47C93CCAFF25FDF93EAE68D +:10669000F76CB83F8985C8CEADDCF1DE345C2FAA3B +:1066A0005807C999BE1DF6FF7912CDEB85E684EE39 +:1066B000E58027F913AAC42CAB6AFCF9474627E604 +:1066C00065F92813F62AD209F7F9B7991CC9A7E288 +:1066D000217B09BB04E7B9460F16E476EBFA47EED7 +:1066E0001B7E1CF039BBE345A73234523F7039EBB7 +:1066F0006C58FC2BAB21B61E6903398CB48F00306B +:10670000B57337097BBB99A72B4D2127DE6759B994 +:10671000CDE40109642B1F3332BC07C0DEB004D1C5 +:106720002FBAE2B1E75F1B0F745FB1DB943C830FBC +:10673000C7AEA476F1A50AFEB726AF8B0FE54F3C96 +:106740006F760FE3DF6F49EAE2C78ADDFBCD6C5855 +:1067500077FA4D6ED86F6EB547E14BC3F169B8CE8D +:10676000AE7FE4AF66F4277EB04F616959DDDB97F9 +:106770006D7B9ED63BA413F151F029CCB76EFC0A79 +:10678000CD7C6634D573A11E8CC5AF6542EF823CCB +:106790003FFE0CDEFF79D3E2C1F1973D7E9313C734 +:1067A000F1BE5ACDE5FA97B7A5E2FC2E3305525D4E +:1067B00094F2EF650FFE88E46DD9911FA592BDC0DC +:1067C000BC1906D2C5810C1CDFD2ADD7D2F84A99CC +:1067D0008FE4AEEC97C622BC8FF8A9CA0A77479916 +:1067E00017716685F0797F3B183230BEF7717F896B +:1067F000FAEC8F46BA17C5D80FE9DED88FC45861B6 +:10680000E5A3FCA756CEA7E3424FE24496E475C742 +:10681000C616E4CF99FEDE343CE7003A0404BD948A +:106820006F00AEF1C8D434CE1FE656F3453BD0EF2F +:1068300093F13BD66F31796DC3A576421FF2FE57B7 +:106840008BFE01EF385CAFDE4F8D6EEF8D11E38371 +:10685000BF1616215F11F39BCFF71D9BF8FCD6E600 +:106860007BB0B810CB3F7995CF1F6C87EB03E01559 +:106870004AA3F2FDB315D207B0AF8E36AF7798C4F6 +:10688000BC96CBC152A4F51EF0569584483901F848 +:1068900049447FDA07976E817611F65715F647F56A +:1068A000CC5DDF23D68765420F98CC30FF2FEE9A60 +:1068B000FF6C2B9FF73DD9932B4DC1871FC0F9FA71 +:1068C00086C51370E37C3515E1B83FDC75E0B5EBA8 +:1068D00040AE3F6CD0E6A9AC3FF5F3B46CCF1816D0 +:1068E0006D9E7E6887FD55B4790ADFA3CE537B2B5E +:1068F000C9F1F7AD3F35BA0D35CB7A13F5E033EE7C +:10690000D8F4D3EBC1DF9BDC4447BD1E84BF57598D +:106910007E77B9D3E44D93B3F2DF545C80FA262C32 +:106920008F9ABC85E5519337FD3865BAE9CBFF2ACC +:10693000F4CDF5D6C26BD02EB67630DAAF14CC36A5 +:1069400006719F6CFD84D17C9F74433CE5E71A5B24 +:106950009F409BEFAD8AB9C3701DBF9E054CFCDC08 +:10696000BCD64476EA57DF7C3311C6739DA0EBF5A5 +:1069700040E6AB800F25AA128A033CE7A92C909031 +:1069800084FE62859D88C0E3FA32398F7F97A576B1 +:10699000C1E9A9FEB7B5ABBF6B7AC4CFCFAEFE8459 +:1069A00029ED2FC0708E90A3E2667E4E51355A09B4 +:1069B00066D3FC6B558B22F6098F99B99D7164CA19 +:1069C0003563907E05738725907CD70EA17D6095F9 +:1069D000D05B9D017702EAF3CEE61CDAF7751E5A0A +:1069E000ECF045D15F07849C3D2FCE59DAED4AADDE +:1069F00011E4BD9D7590DD12B0DBA2FADDEACC0694 +:106A000061EF08BEC19F11FA2F1172380F9A26E468 +:106A100045F06DF6551FA8CEEE7CC0BF1311FB8666 +:106A20007F94BE28D748DF03B6D6694551FC338F23 +:106A30000A7D7DD9B35F98719D9BD25CA0221DA772 +:106A4000D88D92BF63BB365F87B2A188D765CF2E42 +:106A5000BF630CC871D521A3C706E3AB6AFEC8ECBF +:106A60008BB27FD3D313E1A3FDD86AE6F6F151537D +:106A7000D152A4EBD16BF979EE9FCC9E8A6878CE87 +:106A8000B6723CE7B1A24F472BFF7AF42D98EB0882 +:106A90004D027A74DAF9FDE4EEF2C7E77DA74B09FF +:106AA000AE55500E8D3C9FCCEFFF4E63BE3B262A69 +:106AB00034DF2F8FD45F054DC58FE17D96CA66C543 +:106AC0006580F24AB5D58C725CD5B45B45BBFC07DA +:106AD0006EFECE82A9D5C36647F8B75ACDDC9F7447 +:106AE000E06FD7CD47FA7E3CDBC2102FEFD08F9CF2 +:106AF000B8DE7FDC3C8AE641AC71FDC1EFB9660AC5 +:106B0000FAE3CD5C9FE9E5615A72BC94BF7632EB43 +:106B100087E7BC97595A6FF244E1DF3A0B9FA7BD54 +:106B2000D66FD6FF61FA6D22E8372ED7A648FD361C +:106B3000DDC2E53E42BFA545D36FABD6BAD3502EDA +:106B400056EDCD4943BEAE3ABC34259A7E7B41EC2E +:106B50006B0F8B7BD2EDFD40BF8D88D06FFD40BFAA +:106B600045F1838FB66876670FFACDFADF33FF5EA3 +:106B700040FD1665BC5708B9D3F45B61F35AD26F78 +:106B800085FD8CD27DA4CB2CC28E8BA9DF16DE7343 +:106B90002DE54D9EF828F2837445FD7658E839ECD2 +:106BA00007F5DCCF2CDF4ECFCDB3727C7BD473FFE7 +:106BB0004D74D6F4DCAAFE0AD92FDDE590EBB95569 +:106BC000595CCFADDACBF5DCAA415CCFE9F5DBA4AB +:106BD0006EFA8DB7AFCC85F6B44FCCBAEF06BCCF0A +:106BE0005762F258A1FE0CB7F6BEA07A4CA4BEFBC9 +:106BF000992586BEF380BEB3F7ACEF5E417DA792C8 +:106C00001E1B88F3482F1FD307C64BF7D58E7E7106 +:106C1000EA37BFC5F9F20723DD077ADDC0F743FB8A +:106C2000BE38350AE7DDCB880FCC979D42FEDAFCF3 +:106C300063499F4E1ECAE77BC5A1385A272A1B15F8 +:106C40003EDE5B94A01BD781BF7D4EFBE4F97BF950 +:106C50003E79AE85D383FDD8C8DF4500091646C806 +:106C600043C9E7E5E4E72B519915EDD70587A67FE2 +:106C70008076EB82CF6BC8DE5D80DFF17EC5EED61D +:106C80000D99D0EFFCE50AED3798B80FA1DD97B864 +:106C9000BE793FDD5FD1DF83D0F4F9FC6AF9FB02F6 +:106CA0009D5D7F408C13EC59A20B7BC518D53F77B7 +:106CB000404F0F0F1F7FC56A6E1F87E901F4712BCC +:106CC000DDE9011C9DB130B56BFCF39F8471257724 +:106CD0008D4BA3877E7CDAFE6481981BB1C6ABD155 +:106CE000AFDB78357AEAC6FDBC45D84517B36138C5 +:106CF000CF5E37F8EE188372F17B183FE03367DE22 +:106D0000A0B4483DFCA2D0E757F98E4F497523BD8A +:106D1000F8FBBBEBCA763F9F0AE3B8DA9B9587572F +:106D200011AEFD9BD9877E8403B60ED26B9A5C5D53 +:106D300068E572FE7701E7685FD7145A3F9A141727 +:106D4000CD97904E6F897B6155404F9C8F554D621A +:106D5000BD0179C3F9364D5B7F90FEF09F573573C7 +:106D6000FA57552B44FF99ACE320D2B73259F1843E +:106D700000D4B4A6DDB7E13DAA176CF01DE76D990C +:106D8000E2D9CEC961CF488D2A976A34B964D54318 +:106D9000C8AFA0AD830BB05E12BE17793D05ED13F1 +:106DA000BDBD7199A5E528E271D98F4D6C1BEB6EC5 +:106DB0007F68FCCE857FDF44BBCFD383FC0E12F609 +:106DC000E50B486F3BD2B5C38C725F15E2EB86567C +:106DD0005EA5BAA7107D347A37C1BA309AD31BDFCB +:106DE0007DE9E979B5964779C6FACD8A09DB5F096D +:106DF0007CE80345930D5F1CD4E417DF89E9E98241 +:106E0000FBFF8C88F98E7A29F2DCB1B2E908D165F2 +:106E1000FA6A30AB22E88EFAEA7CF4E9361F9AF679 +:106E200047BD07F56DE7C38556793EECB375BC38B1 +:106E300002FD5B7B15D207AC3951DADF5F61E5FB00 +:106E4000A603361FC96DC76113DDF7D6EB8DB1827E +:106E5000FEB89F887C0737190782E7BB2E1B7B573C +:106E6000C3239BCB4FA4BE7EC1E6233EC5823F4DCC +:106E7000C08F652F85F1C5FEF03CC52DF7A75F2FAC +:106E8000343F4F4FE3BA46ACF7DF755CE1F349D6C8 +:106E90006266DC9FBFDB1C71CE3447F8F9353F5882 +:106EA00044BD999631B1EBA1BF2504E37E61D74380 +:106EB000E4D73DF7E8F19928B72B7E676456E07375 +:106EC000DB2E070BF17B14665C57CB1B8D51CF4536 +:106ED000185B4FF8ADF8AD83F44AF91E4B7006B459 +:106EE0002F7FEADDE1E89F6A5BC7F54BE051211F88 +:106EF00081D6E1785E5EAEF2F3623DBC1F0B79395C +:106F0000FB747C09EA47A59EBFEB2C6F986BB244DB +:106F1000ECCB2BF1C08DD7A37BC8814714F28377CC +:106F2000C76F2DAFF708D77BE54DA620BE0F2DAF5D +:106F3000DF46FBD9AAFA8FCC68C74DFEED636447E4 +:106F4000543519653F61BD3164213FA6F138A67AF9 +:106F50007F5D656305CDC7CA06E10FD3F98B56FC8B +:106F600076EF530120CD8A277EED443D73A665A7B9 +:106F700093FC70F5DCCFA6DAD5E87EB89EFC6F0DE9 +:106F80009BA2FADFCEE07FC0FCDB6A95FD6FACBE52 +:106F90004FAFCEC1573CF6E983782E7476CF870F7A +:106FA00022DE2BBFFEF8C19FA27DB2CFE6C2F5AEB6 +:106FB000EAD1A3E457D7DA3D25E655DB23BF7EF8B7 +:106FC00001987F6D6F58E8FE55DBDEF707B8619CCE +:106FD0006DBBBF4845FFE5EABD5369DFB2FAC9C9D9 +:106FE00069E7BB47827219ECC579889E0F071A8D35 +:106FF0000CDF419E3B66213B23EC476DA8E07E6998 +:10700000B7F09FEE8A7EEEA4F9FD2A1BAFB9FA52C3 +:107010005CF71A4D1E377D177EC09EFCA6AF023F5F +:1070200047F4826FBB845F5CC7B773F81FC09F3F94 +:1070300059657FF3A78D4B7FF5009635F689E937C3 +:107040000DF5825EDAB9D636ABF71D2BCE873DBF84 +:1070500021FF34F20B6C6ED6F6D8A703D0DF70DABE +:10706000D47123DDBFD86BA17B42E57B5FA7F9D14B +:10707000F6E4113A2F62E25CA98D85FFF83980D8D9 +:10708000CB54ED70707FABA03BFA63DD4EFA2EFC63 +:10709000AE5C6E357F6C2C3F6C1F9BB8072ECED933 +:1070A0002A76BC65663ABFB63216F9745C3A17D4D4 +:1070B000C6AD87E7423A5C12799E10CBCF2DF468BB +:1070C000984FFC1CA16D9B385F089F1B30D62F0F7B +:1070D000EFBFF3F3EEAAA0F23A8B321FB5F304A789 +:1070E0004D371F83BD3B47E819DFEF460FC5C6F795 +:1070F000AD1A5DCE7E155D1F0FB129E2FD812FD740 +:1071000016B1EE2C10EB4925D08BBF27E3F89E1566 +:10711000FBBBB38F1A83B80FDED07080F4AA7E5EFB +:1071200057B2E8F143C6DBB83EA96CDA3F1CF5CF95 +:10713000D9679F26B9ABDC75DC1C003807EB9F30A4 +:10714000B70EED9273D4D7C1087D7DF6F1FDC3F97A +:107150003907DF47EAE15F21E05735CBF0AB767DB9 +:1071600024C15F116830BBEC3DF77346F5CEC5F125 +:107170009E6931515C94330DC6C268F14A86622023 +:10718000A9942E3A6D70F0F771C62433D991AB1DD6 +:10719000638F2524636A76E33E7AFD5A7E1F72FD73 +:1071A000CF3CE9C897F58973E81CA856474757B202 +:1071B000AB00F7D7AE2945A351ACF47A20D16B9040 +:1071C000F05EED284CC3F7DCB70A7B84A91E7ABFBA +:1071D00067744E2BC471185D06972DEA3ACAE1997F +:1071E000EC45142FC2E492DFD37DEFF11FDCFDE408 +:1071F000F80F817EFF68FC07467130FEDFC77F080D +:10720000603FFF02F11F42E4B7D1E23F247FCFF19C +:107210001FD63239FE83E06738FE83E0E7FFC67F82 +:10722000F8FF2BFE8331EEEF53303E8316FF21250E +:10723000CE3C3532FEC38571095323E33F8C8B4B23 +:107240009F1A19FFE10771595323E33FCC8FBB68A5 +:107250006A64FC87AAB8515323E33FAC8D9B4879FD +:107260002DFEC3DD7153A7CAF11F664E9D02F9B60C +:1072700038DFDF71BD8A15FFE13D9C2C637A8EFFFC +:107280000070CC716362C77FD0C38915FF01E02411 +:10729000109C18F11FBAE11323FE03C049273831AF +:1072A000E23F74C32746FC078093457062C47FD0D9 +:1072B000C38915FF01E05C1497123BFE831E4EACA0 +:1072C000F80F006714E11323FE43377C62C47F008C +:1072D0003813094E8CF80FDDF08911FF01E04CA541 +:1072E00071C588FFA087132BFE03C09949F8C48895 +:1072F000FFA087132BFE03C0994BF8C488FFD00D65 +:107300009F18F11F008E8FF08911FFA11B3E31E203 +:107310003F009CE5042746FC073D9C58F11F00CE2A +:107320002A821323FE831E4EACF80F00E7A7042722 +:1073300046FC876EF8C488FF00706E253831E23F46 +:1073400074C32746FC07807307C18911FF410F27CB +:1073500056FC0780732FC18911FF410F2756FC0788 +:1073600080F32B821323FE43377C62C47F0038F501 +:10737000248731E23F74C3E7BBC67FB085062A3954 +:1073800014FF81E24486E33F247FEBF80FCD88EFC2 +:10739000FFC67FF89F19FFE166BBEFEB38F2837EF3 +:1073A000B7F80FB6F86F17FFE1667B517C3CEE2F04 +:1073B000BF65FC87D4F86F17FF01FA498F1F13BB15 +:1073C0009F58F11F7274FDF414FF01FA1974DEF175 +:1073D000C488FFE0D1D1EDFB8AFFF045DCF9E33F43 +:1073E000FCCBC559806D0A9EFF149328B27F99B8D3 +:1073F0000BD7C6FF93E32E90B1F0AF1477417BBF5C +:10740000DF60C2F5EA4DC1F7D7845CBC25E22F1CD2 +:107410008B197F217815F94597CBF117A60B3ECE36 +:10742000F3C9F2309DF1F386E953B278BCCC325DFA +:10743000FC855CF9FC7A86EFC81400C7AEF2C8E39D +:107440003822E46166C947CF217BAE1E1B3DFEC2D8 +:107450002CC18F621D5DA60BBE158BF47A7C920247 +:10746000F23CA3EC888A749DE96E55C9AFFD038D8B +:107470007F6E897FB3055C3DBEB304FF665DC9F9CD +:10748000A7C7FB55E49F13D2B251C43F3DDE7A3CFF +:10749000F5FC6791FC8E889B51C0E4B80B93AD72EC +:1074A000DC85A92E39EEC215E972DC852BDD72DC94 +:1074B000851FE4CA7117AEF2C87117AE1E2BC75DE7 +:1074C00028F6AED5C57DD8A48BFB70972EEEC3FDF4 +:1074D000BAB80FDB74711F1ED1C57DD8AD8BFBF020 +:1074E000B42EEEC37E29BFB8E6B0547F69ED1129F2 +:1074F000BFACEE0DA9FEF2E071A97C45FD07527903 +:1075000045C34752BEAAE90BA97E6FE33EBC2ADE03 +:1075100003BF26DE031F13EF81DF8C11F7E1AF3FBE +:10752000FFE2B6C8F7F85FFEFC9BDBF03DBE41BC56 +:10753000838D15F7215C1E23EE4357FB6F1FF72148 +:1075400025F99FFF0E3FC7CECF3727C44FCAB1A73B +:107550007CF777F8D716C9EF99E796C8EF9973ECDF +:107560005C9FCFF3C9EF9AAF2F93DF3597D97CD9C2 +:1075700088873EEEC384786F8E1DF5A5789F1FC265 +:10758000F7A9B0363E8BEF53217D0EE33E407A10D3 +:10759000E33E407A08E33E40FA7B8CFB00E94B185F +:1075A000F701D29731EE838A712302226E448D88CF +:1075B0001B512BE246D489B811411137A25EC48D0C +:1075C000681071239A44DC8810C139E13F44E949CD +:1075D0007F0BA5A7FCC7283DED6FA5F48CFF34A554 +:1075E00067FD1D94B6F93FA7B4B7712334B9FC33D6 +:1075F000DA0D66EC9FCBB126A733EC033744CA699A +:1076000091FDA20D28A7B1E245CC459AA6C48E17DC +:10761000112E8F112FA2AB7DEC781169A3BFBF781B +:1076200011FF16CFE5F51F8D1731BF5A8E67B06079 +:10763000CDF9E34594D98A56A35C6AF2F86FF1FC60 +:10764000BCAAA77811DBEC8A58AF812E6877015D60 +:1076500068BDEEE1BDFD738E8773713FD1997BD11B +:1076600079E31CE8E52236BD795C83EBBEE738118F +:107670003DD155ABFF66398F5FF06FF1E78F5FD07B +:107680002D4E444FF105067D467AB2B771227A5AE3 +:10769000177AA2E7ACEF394E444F7AB5277DFAC787 +:1076A000E99CCE13E2CF1F8F231C17CEDA72901AFB +:1076B000BBBC34B555F10EBC60B68BFC27EDBBC42A +:1076C000BD312F73BB52F93B75B437DBF7240C6720 +:1076D000F47EDDC5BCC09F78F15DD9B57F3F9EA724 +:1076E000DFEA64DEC4248A07EF36E6E03E6CA415C8 +:1076F000FD29158D1FBDFC3B806B6B36D27DB276AC +:10770000C0A185EC3E6F22F22D9EDD4EFB743CE362 +:10771000FAA64FE47B66DDEF37609588F39BA946B8 +:107720003BED9B3AB7F27B9E4676F17D1347D37DC6 +:107730006A167413FFC84E5D21F0ECC414EBFBAC69 +:10774000643F2E3BFC447E88F1F3CA48BF419F4210 +:10775000D94F5367730EC777952CE06D41FB7B893A +:1077600080975224FB6F3E5C547808CFE997F84A23 +:10777000E91E425A89ECCF61E2DD386EC7C2F7E5F7 +:10778000009FD226853DA0747F475ED67CD706DC5D +:10779000E72C0FEAED6F968B7256CEE23CB8EF5DA8 +:1077A000512F973B1CE23E879DD97B45B7D60BEF07 +:1077B0009B987C5EBA7942587F9783EEC32E3BBC80 +:1077C000D88CCCB2A4CB74B3B965BAC5E7CAF4D12E +:1077D000D3CFE191E9A3A75FC258D9FFA5D14FBB91 +:1077E0006FA832715F34C8EF91767B87DFB48DF07C +:1077F000D4D34F4FAF510E714FA28B5E45D654522A +:10780000F98467861A22F9D6CF874C7B48C1FFEEF0 +:107810009F1C5C4BAD3C0E15F5563A07CD9425BC2C +:107820005D3CCE078C2BCB3C341F70478FFEDD7840 +:10783000F66721F7EFB26F20BDA9F8B9E38BA0740A +:107840002BCADB08FEFB0BE4AFD27E3781795CB834 +:107850008F6AF05BDD4B543C1764EE2503F13CD09E +:1078600045E99DE2DD6FFB5046FBFE86D027A978F7 +:107870008E76675EC74CF43F542D6545B87EFDC8D3 +:10788000C9DF5D6C12E90827F7CF6C2E3230EF6844 +:10789000FC1D1E635041BFABCB7BF872B4479B4DC0 +:1078A0006E7A47ECEA78F97A2A1F45EFA3330CB5D4 +:1078B00023111FA84FEF6BDB9BDF752E8ED0C36D9E +:1078C0004D770FC1FBC5F71BA2BFEB2D7568EFDB32 +:1078D000F8FD8E115D71064A1D63281EC19DD9D029 +:1078E0004F657127F15193CB0982FECF954E27FC4E +:1078F0009E6C56DCE8AF9B66BCE107C300BF7147D6 +:1079000055AEBFC4BDEED1A2FED3CC938EF88EBBD4 +:107910009429387FC6BDC13C0124717529DDA7FBC0 +:107920009D73DA21E4D7946690279C0F67ED1EBC07 +:107930002A3FA645BE2F9738C57700EF175E728C99 +:10794000913EBBE498AABF1F63C4FDFEB856F9FB85 +:1079500004DDFE739D26774E968A72B7E52B23E1F0 +:10796000D5DEC13CEB006EFB92BE746EDBFE0923DC +:107970003BB1FD2B6361B4FB25773BB8DFEB7E3376 +:1079800023FD7D7FA99DDE393C5B5A7E01DA179F7E +:10799000FDC47741343F65849D96C0DF9F7B13D83B +:1079A0005894C35B154EEFDA8CA228EB9626779A93 +:1079B0001C6AF297511AE78B765F33D9C9EDA34958 +:1079C000A5B98A19E5679FC290AE6DEB00AFF3AC25 +:1079D000DB01B62E13F1A96AFA98EE61599B95A8BE +:1079E000BFCBF384C3C9EF03AE0BACC5FB1737C3E2 +:1079F00024423D9561AECD8A063FC0B6905DFA80C7 +:107A0000C3CDDF0D58451C21B53603EF23B4354DEA +:107A1000BE7203E0F900CC07E4EFFD260FE11DA8DC +:107A2000608CEE930A7F5DBF996CDBE608FB77AF55 +:107A3000A3E030CAED6107B71BFBF83C0AE2EDF9A1 +:107A4000FB5F9D08BFFD730BF1AFAFB037B5762775 +:107A50001D9C3E254EEF016CCFCA9249F9787C4EB1 +:107A6000F7923EE837077A47B1AFB4753DC9C7E82A +:107A70007C22C96E089272F27ADD2EE9BE7780E62A +:107A80008D360F584861F85E5FD36F4AB31272802B +:107A9000DC8FB6DA4378FF2CA90CC69D8CF13CAC88 +:107AA0001C5E8B7A56F66B813CE6A371CFE8BD3F36 +:107AB0003A5211BEA6F7347D796B22D747B7DEA5BF +:107AC000523CD0AD6AAB0DFDA9595EF7240C4D9325 +:107AD000A4BAE95E4AFF323E0FE3737E9918B603FB +:107AE00060928FFCDAB820DA7BA60C94A714A497D6 +:107AF000EF4307A4C30F753C8BE682C7C6FAF0FBC1 +:107B000053424F08BB669A58EFC6BD67E0EF284363 +:107B100097B3C8F7457A3D0172FF27FCFD9EFBDF56 +:107B200053294E68583F944EA3F58919871E403952 +:107B30009BF022E3C751423FB8E01FD2E792977C07 +:107B4000EB118DEFAA17F4FC66216B388F3FCD3611 +:107B5000EA10CCB7C875D629D67BA1476E2A1EB8C5 +:107B60001EE797264717DCE231FA22E8A86F1FF6D6 +:107B7000532AD6F077770EEA91978C783FACBD0008 +:107B8000F80D747912E70BD03BF193E095C8F72D0F +:107B9000CD57D850BE6F0D4D72CD803689D622623A +:107BA0005E22F3923F270FA8837122D69350C07EA6 +:107BB0005D2DCA72A6E03DAE42C9DFA3FD2E1E0CAC +:107BC00094F812E603C871E43D564D3EF5F2A8C99B +:107BD000EF7ADC60E1F91D7ACC21352A0DC4200B47 +:107BE000DBEA423DABD997EBC3F65C22ED33560B93 +:107BF000BB68BD7D9A95D4C0FE645ACF57E3FA04A2 +:107C0000E35F9DC2681E68E3D0CB63D5E706168CA0 +:107C1000D81F54A91D748FAFEA73330BF6C171FBE3 +:107C200026E1B835BA8C1474D1D321DB29F69B82B6 +:107C30001EB1F1CC77E1FDD944AB976D243C27D13F +:107C40003DE786509E15D7DBDB7478F602BF39D14D +:107C5000F053ED31F013F1DB2630DFEF5A415EF3E4 +:107C60006FAACBE0EB057B353D827FFA7933B6A96D +:107C7000FA803962BE687E5DFD3C19D1CCAE41BA56 +:107C80008F0BA90CCF5F7B9A2F9F88F156C5737A13 +:107C9000B5CFE9188CF2B943F5553BC9BE683560DC +:107CA000DCDFF6A719CD67CFFE934E8A6FD4D2BB27 +:107CB000FBE99A1DA5D94FFA7A9AFDA4E95DED7EFC +:107CC000F876A7CF8FFD2B4D209F30FEF52EBE2FCF +:107CD000DAEBF0ADC3EFF130063C4A62B9A12CFEFD +:107CE000FE5596FF58F21EAF93E706A013FD4E1601 +:107CF000E8FF414A773CB4FEA73813F9790BCC660C +:107D0000D443FDF219EFAC92D1FDC97EC3990FD7D0 +:107D1000A77E79FCDE5F50ACDBDB84BED5D2BD8EA6 +:107D2000A2FB117F93CA0296BCEF8E37A28AF7B1ED +:107D3000B73BBDF7A1FC590BBD348E4C17F3A0FD2A +:107D400099A93628F86E3269A55BE1F7B059D73B9F +:107D500026809739C35D80729289FB68ACDF1C3D39 +:107D60008ED6134E9364677A58384ED513D82FD8D1 +:107D70009907CD80779F195ADC2BEDDCC6A3209D97 +:107D8000DA1C7308E9B64F156E8F27727AE9F7038C +:107D90004878C44F15F9DBCC4CB525B1AEDFE134E2 +:107DA00058C98E8F679E06D44B2F3BB3C5B9A8A781 +:107DB00006F3FFAE7658138776C9F19D13677954A1 +:107DC000A8E2BCB47338EE99409E0F23BE6D133BFE +:107DD00007DF4AC4E818C0E5C66B94E2E268F46FB6 +:107DE0003249F4B7E13E3B520F3ACCB48F6C53E2C8 +:107DF0003C38CFDA962B1C4FC52AE206A9F2FE5F6B +:107E0000E8234DBF763AB308FF7816A07D00B37A19 +:107E1000AC748F5DE08F7115C9AFB3373EB81DCF1D +:107E2000A3747114F57116272FB6D3BD8B2D7B6DFE +:107E3000B42FED2CE2E7F39DCD16D2BFB1E6691A5F +:107E40002A83F3C40B04BA7520DDD24CD589A8F778 +:107E5000D2E6F3F9AFA7473B0E14F73B7F3005A3FB +:107E6000BD57D7D2F4F4BEC56897A567A453AA7DC1 +:107E7000AFB3AB51EF611B1314294EDF10E851EC87 +:107E8000738C09F0FD9CEF8FAF7959D7BDF6BA38E6 +:107E90004EBF4EDFF8848751AE40E0E8F704B4737C +:107EA0004DB19FD7E22769FD6CF15B8B31E467DD53 +:107EB000A2E9365C075298F7CA793829B798D84EA4 +:107EC0006A972BDD77BDD73FB218DF276726F07B97 +:107ED000B49F6C994AEF9953D93ADB60A0436991FA +:107EE000C183FE80738BDE741A407E1665B6E4A3F0 +:107EF0009C26987C990963C87545FB8D6525E660CD +:107F000008E8955C070A81E818B892E8B8D010D55F +:107F10003F9C9DC0F79D6F89F5243D7D40F19251B6 +:107F200091F97E44574D8E60FE642C19DD150F13B8 +:107F3000F87951429479D06E624DF85E42D347C9C8 +:107F400042CC347DA8C97132CE0FB4E38A403F4998 +:107F5000E77D5035B5EBF70C95E617BE403BD6797B +:107F6000E924D237306F6B48CE73B9FEB4A13E8B93 +:107F7000F05BB5EF7DBD3FBE637AFB671F3BF05DF5 +:107F8000CB5FD40E07EAAFD3B7FCC98171C0DEBEA8 +:107F900085EF936FD4D9FF5709F90826144D41BADC +:107FA0002EF0FF3D3FD25E636BB8FF7979507EBF04 +:107FB0008AF7BF23FD80150DFAFB00011EA74CFCBC +:107FC0003EA79E0FEB041F96EFDA66CE7463FFBEEA +:107FD00039D8FF69B1BF39DDE8A0F7141A3E8B76B6 +:107FE0008D34A3CDFF97668B78A7D762E27AD93B11 +:107FF00003DFE7F804DDF4781EDC174FF096DEC3EC +:10800000DFAF2E84BED6805EF435F3384AFA712C89 +:108010007DDB3D0DFDE84B3729B48FC3FAB7C03A7D +:10802000E15BB391DEF1E8C7B93020FB73F4F11ADC +:10803000B5FDC032C1FF25F86BBC3951E23836F3CB +:10804000F774CB74F645E7A19C781CFF9A0461672E +:10805000E7B34B306EE79E43D909D1E26168E95935 +:1080600071DE8FF7FA313DED67944E4970F3785D1C +:10807000CD476E46B9AA6CDA4DF111F705DFEB3347 +:108080001EAA14347F6144A12A10F6D87C618FEDBA +:10809000615C6EC08EDE8CF27FF9E73A3B5A8CF35E +:1080A000064DEE0F2591DCDC80E31A8EDFD54FA262 +:1080B0008DEBEE04F9FD576FC7A58D471B9F565EEC +:1080C00021DE9FEBDB69723E45C8DD921DC51BFAC0 +:1080D0000229D6EF7D7F8088234771B63439D2CB11 +:1080E000C932C1B7B03C34DF41E3D2F806F29E2E6C +:1080F000DE25A5A33FA327B9D0F3BFCDD43A00E72F +:10810000AB9EFF6D31CE7DB627F0738D256EEF34BB +:10811000F4AF8079B8C115613F9C566B0FFE14E730 +:10812000D10E2EC791EB22194B2F9A689D5DE570F9 +:10813000A725DA05DFC6E1FB454B00EB69FD9CF2A4 +:10814000D7CC1A48E78DB5B3060EA4771B946AE521 +:10815000A5F77FEC44FBB43D97917FA1CD21E37B54 +:1081600004179B319872FAAF545BBE7E0B75D08EAC +:10817000168ADF7AEA2BE19FF8CA52186D9C6713C2 +:10818000B81DA8DD3FB951CCA31B9BF97BBB455B58 +:108190008BCDE4075823DFD77849714DCB84A6BE39 +:1081A000869166E4B39E1F4B3D57D03BF06E7C61D9 +:1081B000B7135F97EADFB5897B4C0B847CCC74B92D +:1081C000859DE6A377C44BEA8C64DF2F7357D3FEFB +:1081D00066851AFD3DD61897E1BCE3D18F6361A394 +:1081E000427A4F8FFFB21D6B37F465387E3EBEEE8C +:1081F000E308F5233D23C6C95A2FE7EF32C5BAFD80 +:108200005FB8D1C6A4008000000000001F8B0800EA +:1082100000000000000BB57C0D7854D5B5E83E7326 +:10822000CEFC24334926FF21413C21111212E29059 +:1082300084000171F24BC4080301826075405184CF +:1082400090207A5BEFABB79990682DFA7AA358CB60 +:108250006DEDFD062BAD0A4880A08126E9041403CC +:10826000040D820A96D68014B1053280B5587D8FF0 +:10827000B7D6DAFB64664E92426F5F87D69D7DCE9D +:108280003EFBACBDFED7DA6B9F65ECD94B720E633B +:108290000FB7CB8CE53356FBACEC65A98C2D63CACC +:1082A000E9BE0C46BF6BA9F85F67E59204C6EEC550 +:1082B0003F5568DB57553278AE5CAE9985CFF56F88 +:1082C00090995982EB1EEF53C971D036498E4618EA +:1082D000C71E379EEEB33066817FD746D33C8C25D0 +:1082E000E0FCFCD723B1A75260FEB38AFFBD08783B +:1082F000EE2CC0E181799678F873F47EF8FF32C7EE +:108300008C2F2478DFFDEDF229730E5E5D6D32C097 +:10831000F8A52F496C1D8CBFFF69DD78B12EFD3AA1 +:108320001EDAF0A3B9E91981710F7B9F0BE9C3DA5B +:108330005456C0D87D023EF6EA7F05EE73F84DAE86 +:1083400008C632ED117167B3A05BC0265D4B63AC0C +:10835000CE1A99C3A2A03533C2233B64F46E02B88F +:10836000D644C08201CE355BA3BD1EC4E3EA68C615 +:1083700046C0B8F68D26B70DE6C4DFED8C9DAB6F19 +:108380009E9B9E0EEBAF7F7A6EBAC2D82CBB9DB17E +:1083900089408FB6E7685CB7E29A6487FE2A4BDFB4 +:1083A0008FEF5683F03899D363995C696286C07CFD +:1083B000FA7659B3F1CBBEA0751621FC56F86312BC +:1083C000C02FFF3DF8D5C4685B006EFDBC7FAADFFF +:1083D0001002F74A85395B6C81F568E326DA0DB443 +:1083E0001EFDF37A7A30E6A5717ABAAC443A04D12C +:1083F00017E15400AF3D1D56EF5A89F888E0F67436 +:108400008411DC1793D6CD3D93C7D8617C00E0AED4 +:108410001DF132F55F515C6E7B3C5EF48F728DC74F +:108420006762199B323CDE6046C6607C2ECE0FE34D +:10843000768539F3988CD75DB1C807D31BFAAA2C7F +:1084400040AA3AFBA40A05DE33FDB9BEAA30E83FD4 +:10845000629FCCFB9BFA8E5A1C8C35B02915A5F077 +:10846000FC63700FE7BB5E9B6F762D66C05735804F +:10847000534B0CB4C7C6BC8DF256D35B5921454251 +:10848000CB984FCA057E7046FAAC39D4678530AEBA +:1084900033CAFD1FB8BE55579B2EC938EE98C2E5AA +:1084A000A53B8EF0A000EC61F05C53B853B503BE61 +:1084B0009A622C8EC654BAEE098BC1BE535583AE58 +:1084C0006BF4C0E7108E2603734643DB75604C5493 +:1084D0005FF6F078EBAA57AB14A0FFBEFA0C6AF572 +:1084E000F78B4CF674073C5F6460EE16DBE0FBAF85 +:1084F00022BF109DD414A4736DB789E41C7F12F0C1 +:10850000FD2AA1876A81405100CFAA63CC171E893A +:10851000E3CABF50B06D95D8E910BE6281BE3C3C45 +:10852000DC37DAD6E27C4A309F703C152BA9554ADD +:10853000D07B4B6D99217D39D19081EB6172B8630D +:1085400013E0574E31ACDE01EB976F8616F0A1D8E1 +:108550001DF212689B4BA6CB4BA16D34B2852DD872 +:108560001AD8F2603C750879D2DA4B76D76F90EE64 +:1085700017DEEF2DB0929E1A6927F916EB6D941C49 +:108580003ED4439E2EE6D804D79A6417E37CDCC21F +:10859000908F7F2FE671980D3B55E0D7F7EC0F12C7 +:1085A000FF3AA20C8FA642FFA3E615150AF0AF23EF +:1085B000C570251578F478F34ADECF325C190DFDCD +:1085C0004F9A6B787F2A4C99CCD8C9E655159E6C8A +:1085D0009C97EB31B6C59985EF510C12C9A9B2D75A +:1085E000E46D843F9B22393F3519812F6370BC4A6B +:1085F000E39F6A28DE6C05FE578A9DEA6A1BC73531 +:10860000F2C3FFB4D5F0285B0DAB118FD822BECFDB +:1086100088756B7460ADCEAC39A8175A9C5973231A +:1086200010AFEECF11AF793DBDD3510FB77EF049FA +:10863000813B9BD30BE7C9EB612C12D673E1AD9B59 +:1086400036CA52803E97EC45E7515F4BA0A61F8784 +:108650007549AA9DDD0372D7E864AA09D695C85E5C +:10866000B2A3FD30207D4005B532AE5F3AA35C5F1A +:10867000E2736CA48FEC4CB5DDF515BE5FD3CFACC7 +:108680003766483DACD757A69CC765067C1093D289 +:10869000767C29EAF3DF9A1DB7A8088F933D0E7008 +:1086A0006C333085C5107B642870DFCAC21DEB5067 +:1086B000DE1D2CC903F2856823E0E01707F6D028F9 +:1086C00064485B073C5FCAA09D8470DD4AEB9291D1 +:1086D0009F2630978C7AAB8079ADD8F677BC95849D +:1086E000F87A3E8CDDE782D6F22A737A83F4467EEE +:1086F000B444F89F1563A436DCD83217F934FC1261 +:10870000B3A31FD0FF0B9382F38360DC89D71DFBDB +:108710000D0CE1FCB5D16B8F82BE3F53515F66817A +:10872000F9FA059DB5799F37A999D1D0AF8A9108FB +:108730002FBF2EE2F6D8FF85C9FB722AE2C7B2DA54 +:108740001B2457E3A3F9B8BAB8E2B1D1F07C4B4788 +:1087500038C3F74FEA0C3720FE376FC90D433ED8B8 +:1087600086B881F5C798ED8FE07C315700DE54BAAA +:10877000EE24BC2AEA8428C06BE14C9BBA0EF0FEC2 +:10878000EBB09699C8F7FEAD06F632BC629BC931D4 +:1087900007FBDB2EAB76D4B3BF4E6D09A7F56C3566 +:1087A000D07AB685FBC7AD01B8D7652815089F629A +:1087B000650AEA5FC550AC3E02D7A74573FDA8E93C +:1087C000E39A6895FACF4BF0FE5C1C57447253262F +:1087D000DB48DEFAFDCC6B86F7C4CFEB95911EE14A +:1087E00073809590DF159FCC703E17121A5A9BD15B +:1087F000AB929E75DA9600DDA70B3D3BFD644D25DF +:108800008BC48EE3D854986F9FCDC8705DB7B13ECE +:10881000D902FDDBAE32870FF9E7AA427E981DFE32 +:1088200005FB7B65629E5F494C898271455FAA0AA0 +:10883000F257110BF5DBCA36947F81F6ADC4A2BBAB +:108840008EFE5C24B64AE03ACCB3285AF861A3D82D +:10885000A86BA4CF60D6046147555C7FF67FE1BA70 +:10886000FA2B4C0E5CFF769BF3E3A9A8077B8D6C7B +:10887000131B5E8E7E550F1A7D0C08C7D570E68DD2 +:10888000253EB421FDC76D68F684C17AC7A5F3F90A +:1088900091DF506F8CFD455C2CEAED8868AE4FB4DB +:1088A00056E32FE4237B14E723FBAD01F9FB5E7451 +:1088B0002A8DD3E409F90BE7D963F42E760D6117FD +:1088C000812FBF877CB9DDC62A90CF9F1961598857 +:1088D000F2A4BD67B7E07B7DFB54C39A2E23AEFBA9 +:1088E0002FA0FF01EED2E4ABA660FBDD15C7E12DA2 +:1088F00093BF25BFFA62BB44FE7C423BD7D7C17C05 +:10890000316268BE7801F17A3DBED0C7011A5FECD2 +:10891000B81E5F74FF637CF18B68E1DF0ECB17DF5D +:1089200046E2FA1FEB2849647FC78F69137C30DC6D +:10893000FD2956AED7F4D7DB053E779B9AEFCC41A5 +:10894000B9BFCBE040B906AAA7CC05FBB23B9C3F20 +:10895000C794D569D8DFAE703DB2BDDD4C7A64BB3B +:10896000CDED267B9D6461E82730C5DDF77DD47FA2 +:10897000C916755D10DF3E2EF4408BD137E573F4D8 +:108980007F0F70FA4EBE2B5736C1B8110F70B9CE9B +:108990003F67DA28C33CD53145BE6818DF17CDEDF7 +:1089A00062DD1918057C597BC644FAEDADCE23E58E +:1089B0004E1BF9374EE4AF497B8E941767E378CEB0 +:1089C00047DDA2D5FA53704D3164768E25017E5D68 +:1089D000C24E4C615C0FB9903F72027DE634523C4E +:1089E000A6F1413563596827E6F639CA908DAA2A5F +:1089F00042E95BED9B4971DFFCE3CEB20858D77CBE +:108A000097EEBEA07FB58EFEE007FF01E564D5E6D8 +:108A1000DE4E1BF2ADCAED698B697516F77B56A762 +:108A2000A1FFAFC911FD004F2DBFCF78795D901D1B +:108A30005763F83A9F752874DFD367F2DE0297FE1A +:108A400037E3CFB5087BF3AD90E3DCC7DE588CFC91 +:108A50009BB7DCB90FF1BF284EA6EBFFC97C96345B +:108A6000A48F4321FFABC5A8967C2E05C631C595C2 +:108A70006183FB7BE2C3F3F0FDD531EE6B4827A6A3 +:108A8000F8BBF1B94985B9792857B6094DB1687F66 +:108A900034B801AE8A4DB6001C1A5CE785FEA98E7B +:108AA00059720DF180CFA15E693B75D682CF6B7490 +:108AB0006FE9B8C4E91D447FA47780FED27DD8D782 +:108AC000F06011ADD6FFE7E9EF1B89F41896FE18A8 +:108AD000F747FE8FE83F2A6608FA833F958ED73521 +:108AE0007FAAC5047E7576A0AFD1BDDA5E44E31CD3 +:108AF000265819FA4F9D1057A21CBAA3D1B9613B51 +:108B0000EDFC5DFDBF3F3B0A5C4036292686CB93DA +:108B1000C93F06FD8D093E89FCBE0920F0F7909FF4 +:108B20003592F49D43E0879D95A4B319DC05BF966B +:108B300082FE9F2F16E56082B9D287FCBEC33A3D04 +:108B400005FDB75CEBB434E4A737331E3B8426E75E +:108B5000CDE4E53B5F51037E8EA6D7F68969B5F774 +:108B600097C770FADF0E6A16FD3D740D83E1D0F4ED +:108B7000379205E1907CD5866B56D2C7ED7D80AFEC +:108B8000DB110EC06B97C45A517F17199C7125E8F1 +:108B90008FC5FB14EED77D3D4A05BEA96C7FF73823 +:108BA000C25B69B1F930DFC21CC6F37D41F912BD69 +:108BB0009FABF9259ADFAFF92D5A7C89FE0DDECFE8 +:108BC000C7EB00BFDD0C00A2FDF159BC0DF0FEE7C4 +:108BD0002FAB994E21AF0AACA352AC6336EB25B84C +:108BE000D8B7D7AE4D03FACC12F8A8EC86B8300748 +:108BF000EF337617E0E12E85C78B7739203E0CE204 +:108C0000A3D99343FBF89B9E1098E77AE3F5FA7F8C +:108C1000AAC817FCB371A6D676831D3A0D0C70B0A6 +:108C20009EC73485A3658F82F1803BD380FC582793 +:108C3000EC1A84C943DB2321AF8586BE1C07E0B74D +:108C40006BCF3764FFF6EEF9E623F4E7A67CA1309C +:108C5000333C5FF8457E14EA07E60A9DB7EE8FAD18 +:108C600056C6AF13FFD48AB5EFAFC78C18C267A141 +:108C7000F637E79F5F8FF37D7946E1BC2DDE5F6EAF +:108C800072A7DB6DD8F2787FBFC4FD1DEDFE7E2399 +:108C9000C00DD737C568717FAF42F919F89983E8DD +:108CA0007C17C6FBB901BADE75AEE20B2567307DD5 +:108CB000F0F7FF23DED7E2FCB744FCC0F69D30A9F5 +:108CC00000D78CD64714F4A36724C9CC19F4DE3B33 +:108CD000542B7306C5FB6FC4E8FC907DAFAD9F05B8 +:108CE00076A4AE477684A1BCB66F3F9483FD5ED96F +:108CF000611D828FF4F89DD1FE8882FC9F10CBE528 +:108D0000E67AEF2F1C077C722BD29D911F77B14022 +:108D10002239D2D377EF9E9FC7F6650F8FEFE1E838 +:108D2000AFA7C36FCE1747215EAE470F3DDF76C2B8 +:108D30003A3DB03E1FACD303FED6DE7A3BF5DFAE44 +:108D40004FA2BEC6AF751DBF8C457F4DE3D3B25851 +:108D5000CE375376AF8F65B600BD347C5D1474ABEF +:108D6000668EF9B3E0CF5D922382F48487F52615F1 +:108D700004EC55F5B172F233347B552D671B51FF6E +:108D80006AF60AD3C2A8CFF4F6697E7A9111D5AA01 +:108D9000DE2EC1028DC8BFD50B43AF57F4342B1163 +:108DA000D433109D2449E043F8D51A3C1F3217C133 +:108DB000ABA7A7069F1E2ECD9FAE1674837596E1B6 +:108DC000D2E7AA45B48E417655ACF746EDA93936BF +:108DD00034CEBA72AEF4FD9C21F87538BED5DFD71B +:108DE000F44039BE20975A0FFA1109B10944AFF285 +:108DF000AB26E6047BC14686B1CF82F3EFAF649227 +:108E0000BD7B54D8DFE1F8A6F6AA81B96303FC6301 +:108E10006C7BCE8AFCB35B69B662DEF136DB9CC646 +:108E200028C053E91F8BE7A15F57D76760989A2A3C +:108E30006BBFB40FE3F6BAE3CC81FAB0B8BDAB04B4 +:108E4000F9ED6DA557A638FA4BC69E0BF20FDBDA8B +:108E50001BADE83FB5C5C914A7EF8FE6FCA8DD6FD1 +:108E600089E5FCD776E6F22CE710F73F13F74B4F76 +:108E7000E51AD148F6C74750BEA1FC6903ADBF54FF +:108E8000B25755A2FF718791FC7A885BFEF07DCCCA +:108E900037B599B763AABEACED878FD881102DFF87 +:108EA000E7B30633E60FE6488E97615CB9EAEFC296 +:108EB0007EF9BC54DA8799F47F65F25FFD774B94B5 +:108EC000F7280776C17EF93DA95ECC3FEC9178DFAB +:108ED000D3C1F3FECCEE899D05EFF9A03276C23AFC +:108EE000E229AD7F4BEE3A261838289E7A6C17DFC0 +:108EF0003F7AAC4CA2FDA3327B0AF304F155F9D3BF +:108F000040CF3CE0C7F6C462E4DFAA0A997983F84F +:108F10007ABECBCABC41E3F7877178FC92D98BF952 +:108F2000124D5E670AFEAE5E181B327E0EE37EE2D5 +:108F300042D66C44F9AE13F0D415013CF0FC4C1150 +:108F4000A7DEED4E09796F256641606856DC68B290 +:108F50008FB3BFEC23B33A473E796C31BC87657061 +:108F6000F9D0E4AC4CAE69223E48921C181FCF9752 +:108F7000C0AB9451DF85CAD1ECC9A1FD394EBD7E8D +:108F8000089577BD1ED7E47C7E876CC4387A7E91C5 +:108F9000E46043E803BD3FADD703930C8E7730AE5A +:108FA0009E7BD549FC35480F9CACF887F4C05B200C +:108FB0005B93415E7FA4E9839BD84DA80FCAE42D43 +:108FC000EB913FFAC1AE9987E00FCD2E68F176396B +:108FD000C827F2033BCFF725CAAE829CC606E2ED56 +:108FE00001FD007E8363087FE657B16921FB4903D9 +:108FF000FA22C86F3016FCF37E4319F88BA65C8406 +:109000006F24F3E4919EA2FC1EB43ECAB3255DA278 +:109010003C4A1DC4F114CFB35F125CA8D7A49800DA +:10902000DFEBFD092D4F3B42E409F4FC3090B79B88 +:1090300067F4229F69FC506EE772513E4FA6FCB95F +:109040009E3FB4F75D8F2F7C12F085F477F842C80D +:10905000D38DF2C5218D1FD259FA8DF083C6071A20 +:109060005FE8EDC5415DDE65387B71F23AF6E29D61 +:109070000C23E965BD9DD0ECC28138AE7FC7C7F235 +:109080007D8A9999F36DE8578C407D80FE9EB037BC +:109090000379A30D9C0FDEE95BAA486837500FA443 +:1090A00006E15DE44D35BEAB7D9A51FEB052E89FBE +:1090B0008B1D3C9F56572A7B2DF06749FB73EB793C +:1090C000DF48F9B622A54BB1C0BCB31D9203F335FE +:1090D0004E917F9B75D5E455293F3FF47E7A95E00C +:1090E0001B8C7370FC6CA7E4851074901EAABACA1E +:1090F000EDBE5E1F5589FDF22ADD7EB9294ED0F501 +:109100006676F3BFD2EEC7C72570B919868EDAF33B +:109110001A1D35FA4DC0B1283FFBBE36A911DC3F00 +:1091200046FACDB8AAD03CA3E242FD962FCFE7FE87 +:1091300027C574627C5DFB25937BFCF0F05FCF2F2D +:10914000BD59F3C3855FAEBD7726C8780A3A863A23 +:10915000FBA1BDE7BAF6423CAFA7D3E4B8D0784252 +:10916000A387A64707E15BE8D9E1E8753D3DABE998 +:10917000B37FB59ED5E6D7EC80F65EBDFE1D2E3ED4 +:10918000D3F4E9531B0D9417B94DC4C1B7893CEB17 +:109190008342CE970B7DDBFF178B01FDAC6D9DDC11 +:1091A0001F7198ED87D06F08E4F3385D9F8C601EC7 +:1091B000DC2F674AAF85F62F8B81A4B87F99CCF757 +:1091C0002FB7283E17E96987C21A405EFE2AF216B9 +:1091D0004FEEF52C463DFDE4E93106DA47577CBDFC +:1091E00018174FCA55683F28DAAC52BEF76287D9C4 +:1091F0008ECFF5EFFE5E9711E7F90B7360A8F67658 +:109200008779603F06F54299DC23635EBEDF0FBEBF +:10921000388C9FB6D05782F1CE6DACB711E3EA42DD +:10922000A4E310F47B55675FF479FB920EEE27956B +:1092300044F0BA9FE980467CEFF43613F985D7CB2A +:10924000DB177DC9C85F1A94AF6FE37A0606119FDA +:10925000DC68DEBE107D3DE0E39FE8F40E1B267F58 +:10926000BFCDC4F773FC478C0CFD5E762E6EC8BC78 +:10927000CBF5F2F8BB3BC39D6A24EEBB71FF7C7754 +:1092800067B253CD197E7C4E9FBF18F395DBB6CCE9 +:1092900055284E14F9CF41FB223AFCED9058931516 +:1092A000F369ED8E528C3F86DBE728F63B69DE1BC7 +:1092B000C51B63CD9CCEA27EE9762163DBCE863BC7 +:1092C00091BFB79D4D76223CBB057F6AFCBEFBCCAF +:1092D000E570DACF343955DC07F6475B1C2F13BF36 +:1092E000723E6F1931C68BFBADDB853C6C0BF71FF3 +:1092F000CC8A0BDECFE0FB179DF59EAA33E9B4DFE5 +:109300002D61BE51DB27F680BC505D4E0C237E32B2 +:10931000B21686EF6D74B29F633B7D9A1A85F8BED4 +:109320001CA7ED47AA519467F8F64A816BFC60BC14 +:10933000EFA877513D496BFDC22A05607CB3DE4D35 +:109340006D5BFD726AF7D4AFA6FB6B0F453E8E7660 +:10935000BFCEB9A04A09D21B9FC5F3FC526ED6E915 +:1093600012E473F60D6318EF4C7FA24F463D71FB7C +:1093700055584748DD887219F14CF9CBB4403F5538 +:109380005A12867C79FB55E8078D97E2A3391D9A1E +:1093900094A65B0A485A881FC2E29D17E3E0FA0FC1 +:1093A000ED2E7F5C3CF241F5BE0B8CFA97F1FA0E84 +:1093B000E96EF9028CCBF31551DE380FF3C6B934E0 +:1093C000ED62C4DFC42E13ED7B6BF9DB5C31AFF3D0 +:1093D000ABD03C729EC8DBBEC9FA289F9C6F81C08F +:1093E000CA807071FA39A5F94912E6FBE24D0EAC5C +:1093F000579898E6CAC37C6B573CA3FC695757C281 +:109400004815F0E054785ED7A9E575D9DFCFEB7643 +:109410007F1AE9217D057E0AEAA7EEA3910E1FEDD2 +:10942000FF59C8FFDB810F627D4338AF1760F3E659 +:10943000511EFD760B5F07D89FF878CAFBF9F61D21 +:1094400086E77E7B99F17DC4DE93B43F5D62C84CB4 +:10945000EC0338F74963A3B07DF1D3C86C6A8F463B +:109460009E47FC741AAC2ABEF7C37A56857567CE40 +:10947000F76DB49F31FD7D9B82EDE1FA3EAA477BFB +:10948000BFFE1CB547EAFDD41EADBF4AED3B701DC3 +:10949000F9E7103C8F6DEEE2087A6EC7A20813C29E +:1094A000DB19C9B668EFC17A335FB8AF1593F9EF2E +:1094B000C57FBECE7213D83BB37BBC3481B113F1F0 +:1094C0009FCF54A07F68C6A87FFF0BDCFFDD4F2E27 +:1094D000ACB3005CF38EDA5A7BA0FFE94F2EAEB33B +:1094E000A19E3D140ECA0EF546FF41907496873634 +:1094F0003D9971053B19FAB1A2EFE99F590A245F22 +:1095000050D297C580B5A6FCC43FD302785C607585 +:10951000FF1BF64D9E976696DE847DE6C17A2EBFD0 +:1095200064A4F89E8D94E2B07E6599DD7D2C3EC8E2 +:109530007E3BA53FD2FE51815362D1714457DACFB1 +:1095400062F653B1C1F2B6CC5E760CE971473CDFEE +:10955000BF9A384D7206D749E8C74D3CA396229D65 +:109560000ACE9537613BBB229AFAAE85939A509EFC +:109570004B6DC33D5F42CF2F8837127F162B524869 +:109580007D887E5C1E3013FAC7FE03E1941798783D +:10959000CCDD8875A36549A9B9B2D0798CFAD11B05 +:1095A000711F6D62E587A5B1283F36C981E6A180AC +:1095B000F535C5C661FD231644E1BA9E2BC1FA9D5F +:1095C00089AAE440B41539BB5AF1F9224784A308AB +:1095D000FDF1636A299A9CA3CA84C3F9306E46BA26 +:1095E000ECB0C044477D774CBD00FDA28C28CAE397 +:1095F0001629ABAF1CA67E84A341C5756CFC792DE2 +:10960000CD63267BBE6356C97F20FF14BBA228E72B +:10961000576A3B3537B82E0CD64D7017D9656F9801 +:1096200084FCFD83523BF4778C9218CACF515FE6DD +:109630009FE97E77B81A0680EE30D94B71BE1D26A1 +:10964000C9BE96FAAE121CEF196354314F541EF77F +:1096500045C8FC334AA5296710FEECA80978AD621D +:10966000E4A590FB3D8BAC64272ADFCF267FA8675B +:10967000510AD98BCAF7A71563DB63E07E7AE5FB55 +:10968000951574DFC0E3DFCAC5DF718A3EC5BB959F +:109690008B5751BF4B4AFC777CDF95ECA85CCCA381 +:1096A000CD4CFF7AAE12ECFFADCE24F9CF1579BCCC +:1096B0002243E6FA6900FFA307F83E4465B6145258 +:1096C00037372BFF54483DA86BDA1721FDB9A59712 +:1096D00042EA43E7557E1DD25F304FAA0A1E5F7AE9 +:1096E000209FEC6BBEA85FD2F24B458285DEA9CFEE +:1096F000A82A05B93C00ED03A01F8A7A45DE55E192 +:10970000717506FC433D586AD3E577994AFBD91534 +:10971000DD7CDFBA3CCE783AD83E54C84F707F41EA +:10972000B7FEDC0346B293B9D132E5AB34F82A4632 +:10973000863EAFF95F1502CE1D0677530CE5C79C38 +:10974000BDE87F68F06BEFD7E0AE90EF29A5EDBFE5 +:10975000EBC0AF87170025FF4D0FC78178118780B9 +:10976000BF41FE5937AF4B835FDC50765BF3CF2BA5 +:10977000414F4507EB299B1487F576C3E9296DDE38 +:10978000E1FC306DDE6576173DEFDCFAD9D1423968 +:10979000A89F7A2A3626B8FFDA67EB43EEC79FAA5E +:1097A0008A0EEE6FFAAC0AEF4F57D4461BF0E34136 +:1097B00026393CC89F3DAA82FBCF25C79C4DD89631 +:1097C0009D746399299B71C6D384EDD4F3DE1E3357 +:1097D000ACEB8E0C59C5B85DF33FF4F09A13781CCE +:1097E00072F0AA6AC5FDD31D1ED58AFEFB8E2754D2 +:1097F0002BFA1F3B9CAC02E331679A6135FAF3CE3A +:109800002C5E677855E8E16FE2F9F35A7B5A717F75 +:10981000837A11EBC2D127A8FDDA4F75E007D1AFEB +:10982000CA1EEC571D54BC367CDFC127BCB6E07D98 +:10983000C21BF5ABFE8C363A1EF96C4E887C9658EE +:10984000EEAE0A96EF32FB9290FB9FC6A904FF8C06 +:10985000A48743C6DDA13E12D2077F3103FD9146A6 +:1098600013A33A598F81D7C9EAF1F8A8C0A3C366F8 +:1098700047378619E354AA6BD38F739470FCE9AF12 +:10988000A727F0B86823C80CB6F72470F8F475B1B0 +:10989000FA3EC47C0B713E983909F9DC61355C01F4 +:1098A0005797391392EEA47AD93CC3A369D0AF4E2F +:1098B000C8E2FDA9869D581F7B774236EFDF6AC854 +:1098C00033821FF02B36FE4EAC07AF0D13759D0F84 +:1098D00024D27E9816DF2886532F2EC638738F9198 +:1098E00061FEFE1913D8BDDCC0BEB9D5CCE352ABC6 +:1098F00089D76D3F957AF429D41B6A987B7A02F94F +:1099000051C52AE2EFBCDD42759D8FED2E4B44FA26 +:10991000DF93C0F35C593BA726A17EF917BC7F56A5 +:10992000C2C4E1DF8F75BE38CFF91D59E47F67DD12 +:109930000CE89502F887F098AE87419840E72598A3 +:109940003309F36C8DD1269AE79E04CE7F37DA0E69 +:10995000AAFB8D32ACDE0EEDFD82FE0FE07B095FCF +:10996000FE51737063CEEE1F35773CEF237D653972 +:10997000D78F7EACFF3B11B4AFC246FA69FFE5E377 +:109980007BB21CE89F7E12CEF1B7D03BBAB14FC577 +:10999000FA0DEF4D582F9191E8AE453C2C327B6F7C +:1099A00021FEB1AD8EC0F96FB41E78F07B2180042A +:1099B000FA544FE1F4D1DE0B38B5A03DF8589C03C2 +:1099C000D1E080F7FF00F9408367000E5D5DB89637 +:1099D00067AEFBA381F20C7512E83DE8EF3CC91CB1 +:1099E0001E98E7A2E6AF8BBC266E45E17BA61C5E07 +:1099F0005A628336BF6D258F737B95903CD7A4E365 +:109A00008A7EBF83ECD654ED795D9E71AA886BA7E0 +:109A1000EAE2DA1713849D4966C9C1798035226E5E +:109A2000B8DC333A0AFD4CD45132E0D5A4CA6C728A +:109A30004C40CE5B21EE674171BFC667E38FD9EF23 +:109A400047B8C71F63F7915DD7E61DC82F70BC5C90 +:109A50003ECEF132A12FE3A7D3A06FEC3632AF1A7E +:109A6000584F2107955DC6FFE078BBC98B75CB05C4 +:109A7000077E99E7834BE624035383F010A68633D1 +:109A800035482F5A336242FAB2866F61CFF3C4FC75 +:109A9000118EE49079F6C49477A37DCFB32D27FB84 +:109AA0001E357974C83CAC4709B1F3B028DABF9CC5 +:109AB0000840FD0CF05A704C09B1E793E23CB862E3 +:109AC00036F9A4A2B3FFCD32CA41E199D0EB0786A3 +:109AD000A3CB70F863393F45FFEE1FC55FB4331465 +:109AE0007FB115A1F88B7785E22F7161289E46B86A +:109AF00043F192B27C5CC8FD9B56E786F46F7EBC56 +:109B000030647C2A18A4E07EDAD33343C6DFD23C2B +:109B100037A43F76C3A290F199DEA521F7B35E5D2D +:109B20007143F41EDFB226649C9EDEB7B6FDAF9093 +:109B300079357A7BE0DFBF82DEE6C4507AA70AFD82 +:109B40001AEDE4F565FD46DBD312E8234C13A15E64 +:109B50008B6E7FF76BCC43788A55AA9FF3CC64B4A5 +:109B60000FFD82EC92500FA5C0148634AA5FA7FAAD +:109B7000BB1F1B0C21FBE28989DCBE2726F27CCDB2 +:109B8000CF4DFCDC520AF88F64870C2C102F031E7B +:109B900022315EA678FAC7CF60BCDC14DD97A14203 +:109BA0007C6CC6FE4D017DB9C8AC36F6013E26C8B8 +:109BB0005C1F829E4C4B84F93F919E30723FC26382 +:109BC000443F22C5C23C91B9643F287F1CCDE224AA +:109BD000ACC78F0AE869F51A106BDF8A2C3A07F5D3 +:109BE0001E4282FEAF2586ECE8DD9A7E5A9E49FA37 +:109BF000E9B22DD40FBBFC401A5D3F71AF99F6FB63 +:109C00004F883A446DFDE784DEFA53BD85DAF3F5FB +:109C1000F6103DB67CE3FA08F41F4F64707F51BB29 +:109C20005E82789B88AD2CEC9AC58EF9AC7BC038EF +:109C30004701BE5775F7452E62E43716E3BA6B3716 +:109C40005EB9F74DE8D719FC09DC3E7878BDCCC782 +:109C50008CFCCFEA6F5888FF343791C7E973C5FC95 +:109C60000BA0B1039E1600FEA3B17D775A39F227EF +:109C70005CA7F369B3BB19D59FCC71A7D23EE35162 +:109C8000E6F8701780F89D4495E09CC75CB45FFFD0 +:109C9000D1BDAB2270DCC07CDA3CC028E86F7C1CF4 +:109CA000ED312660DC7F1BAF6F80F759F0BAEB9E79 +:109CB0009427D10E69EFFB88B92F7C88FBDDCC415E +:109CC000F36AF3331613A29F762C5FF9692CBC6FED +:109CD000CD0103E513D6749829EEEA5FF1D7AD2FD5 +:109CE000C2FDFB52FA6E42BBFCC98A6FC6203FDC44 +:109CF000BD01F410ACB130CAFD7062509C72E281BB +:109D00002B11781FECEBA617D1386E36537DEF2759 +:109D10002B368F09F6471F4D2CAAC5E7D8E41B3B0D +:109D20006F58F27A6622D563097E7A58F0D39AD7B3 +:109D3000C6921FB52662809F787F13AFEFD0D6F111 +:109D4000A1E0C715AF7F5D107CCE7407F0913A8615 +:109D5000EF6BA920533B7B2EE7E0FD57147713C22E +:109D6000D779F57424F677BEF737829FCDBB31786B +:109D700051063D0581FD65EDDCE5C2F6D83CA43B0E +:109D8000C85933CEBFE837AF5DF81DE2A763F3A62D +:109D9000EFE3981B3C7FC9847D71083C807DA1F86E +:109DA000A09F85F3731D428F2AB8839E86E7991C76 +:109DB0002AF1B3931DC27D97C62E03C3BA9548DC22 +:109DC000B409CAB345CA06CD08392D49A09F855E9E +:109DD0007925F1E49D4DE4E787FA3DF96FAF08F18D +:109DE000775CF08FFC9D97DC8D9807BAAEDFE3338C +:109DF0002C3145DDB8FF0381B0532A105B38F06B7E +:109E00004B14FB22420F77A21C61FD3FCE85F97AED +:109E10005F383F670CA602F5F80F604DF8B0294592 +:109E2000B4D2C50C0BE8C5BD897F78E669D093969E +:109E300074BE5EEC37E2DFDD9CDF06FCABB7C7919A +:109E40009E62DFC2DB100F225FA1A7533EC8078BC3 +:109E50000D9233F1BC6FFFDF22314FBB35467D1FC2 +:109E6000E9E03F20D33E4D98D2678A1E222E7B1315 +:109E7000F59E89FB4D546FDEC6F38116D5C9300EB1 +:109E800008B3DB27049FB36B17FA6ED5FE4F4699D4 +:109E9000800E170C3D91D9307FCDAE1D91E8C6DF05 +:109EA0006B747F8A7CB7F2C40705763ACFB671141B +:109EB0009D03F08DA6BA83F10AF328B983E1A8DBEC +:109EC000904BC6B8760325E3D9F8F6BC87501FD56A +:109ED000F9F83A716E2CFCCB6C63D4BFD8D61883DA +:109EE000F3D5FDB62319E567733C8F135FBF3A8E38 +:109EF0003FAF3005C77F99182DF8D96BC03863B3D1 +:109F0000884F2E5E35D038EDFDE3DB8A643BF043AD +:109F1000B6AF792FC543ED6615E91AF60AE37868FE +:109F20000F2339AFEB9CC1309FDF1FCD1C12DCDF4C +:109F30001AEEFF039D33EB30AB981F0DB337B31808 +:109F4000987FABD80FCD048EC2F34ADA75ED7D61F0 +:109F5000ED3FC55802F981F2B4614A33BBCD168C8E +:109F6000E708C2733CF2533CBEC767C0FC88FF16CB +:109F7000C65E26B80270327AAF066726F9735B4D6B +:109F8000FEB3787E05E0B223FD33198793B58F5574 +:109F900031BE0FB33B691D6176D5E19106C355977C +:109FA000C3BC68BF7FBC960DC82BCA6F5D78A06F1D +:109FB0000119D83A9A09F9B63F5B3A2DB80F8A646D +:109FC00072E0F9711B629E6D1A49718347C638169B +:109FD000DA88185CA7CACF3B636A2897E301F7C504 +:109FE000AD167E7F603CF0B70DFB363ECE1165B7F7 +:109FF000CE94484E28AF572BE4FD31C977F67690C2 +:10A00000D3BFF8F6E6A8004BCDBB7B884F571ADAD2 +:10A010005F1C0FF7375ADCF94980CFB74E1AE81C9E +:10A02000E99F5E0BF35662FCB87B63827308F9D03C +:10A03000CFFFC3E36B9F4F41FAEF9654CC9BF61BC7 +:10A04000FDA310DEDAF6CF4D548FD0768AEA938ED8 +:10A0500024B99DF89EC96D0DB46F3C8535D3BE7192 +:10A0600096387FDD92C4F5C7E563635E6E08C2FF74 +:10A070008349DC0F637EF7CD2837ED423E3BD12F7D +:10A08000817697F08F7675DD9DA606E5FD1AD8DE00 +:10A0900014C4F75AF636B5DAF57E2F3FCF98F5910E +:10A0A000E53E6710FFB993B89FE716EFF327B9179E +:10A0B00024A1DC769D3645AA785EA56514DA911652 +:10A0C000F09FEC43E065406E757254A7F84D38BEC2 +:10A0D000EE1C3F770A746EC2FAFFCD1FB58D5B028E +:10A0E000D77701AEB1DED373C24C758FBB8CAE1483 +:10A0F0001CDFF0E15739A8B72A1069F0BFAF3A5614 +:10A10000DE8C7803BE2F0E47F9DACE488F69F299BC +:10A110008DF209CF6723DFE7633F93F4F056532FA7 +:10A120003FF7B98B9FFB04BE273900BEB7A39F90B2 +:10A130006D0739A0E7C7927C6FED35D0F9540FE871 +:10A14000F15BA85F5C85FDADBDA576926FCCC3E7E2 +:10A15000A29CFAF6D23C2D108320E924E60AF61FD1 +:10A16000DB1323898F35FD783091EBFF960C350A90 +:10A17000EBFFADB21C2217417690F7859DECDD50C8 +:10A18000FCEC0BD3D0DE09BB20FC27769CEBF94717 +:10A1900085AD5AF34EE1EC2DB0CE3587E5817A6E70 +:10A1A000F4577D824FF60AFF15ED849AC7EB67F0EE +:10A1B000FAC40DBCCEB5C0B9BA04CB38265734EFBB +:10A1C000C3B6D0D55282678EA72DECDDC7CF1EF364 +:10A1D000F3E3AD7BEFC8C27DEAFE136686FB24ADD8 +:10A1E0007FF3FFE175C0C3773B01FF43D825580ECD +:10A1F000F11F58EA149634F87EBFA4E98FF9952828 +:10A200006F175BE5401FEC612D3038F67F9D54F5EC +:10A21000AC07004B1BE17C1D59A230D94D6DFF915D +:10A22000BF25A02DD8758CFB4DAD266716F24FEBE0 +:10A23000E8D0F3FA5AFB62123FE79C6F6643E625CB +:10A240000F09BB37C6C39E413EAA6D95ED5EA0FBCC +:10A250008556D96902FFE6ACD39D806765CE31CFC4 +:10A2600082A968E745DCA87D4F6519FA2760A71E1B +:10A270007C61501EDF807CF450BBC47E066B5EFEAA +:10A28000D2D0FB0A35629E87DB36EE4F013AAE78BC +:10A2900025745C8DA813ABD1F92F8792447C98C6A6 +:10A2A000D2D02F01FE21BD605458B719F8F5C16412 +:10A2B0007707C61B9BC5770C407F921C7608BEDCD7 +:10A2C0002AEA04FC5B25DAD7CB7CD52B1BE0F942CC +:10A2D000C52BA39D62D0E23EC164A7BB1CF10BEB72 +:10A2E0003E86FB35CB851E5CAEF9655EBE9F01E602 +:10A2F00096FCB229CCDB1889EB7E5572F854FC8EA3 +:10A30000C8A03A5C5A779D5877CD8623FB318C5B89 +:10A31000D5123AAE4EACBB4EB76E6D5FFBCF49BAAD +:10A3200073C837B86FF16723F7133E10F368F7CDA2 +:10A3300023B83EAC05F0906E355ED9EBE57E9D0D01 +:10A34000BFC373BF80F77E41EF3AE633A5C0B8556F +:10A350002FF075B26743EB3F1F6C7DC484F1959E6F +:10A360002F966F31923F0A8833A1BFA8E78B156201 +:10A37000DD2B74EBAE754B3AB8B89F3C18AE960522 +:10A3800048D7555B8C0CEB11F5702D6B59528E7CB8 +:10A3900036985F395D5688F90270AEA6737C370A2D +:10A3A000E7A811822FC7B17144978AD81BA28BDE10 +:10A3B0008FDDBE7F9C15E5FB72F7688ADF35BAEB4F +:10A3C0009F2F177EF08C0D8CDA0B6D25D6F118A718 +:10A3D000F4181C924AF156E478C0475E87CC2AA153 +:10A3E000DFDF9EB6DE0378CF3D9C5F85F17CDE61CA +:10A3F000039D77DBD99D4FFBC07907D263D3281F1C +:10A40000EDA0EFCDC03C643FFB7B72D7E3B980FE8B +:10A410009ED27C9C57827168E773851D68E8C9B538 +:10A42000069FEF2E18C1E3F5A7923EFB31FAE13308 +:10A43000B61BE97CC30CA3FF3DAC9FDAD9ADD0BEFF +:10A4400075CDE1A56BC390AEAF49B46FBDBF774D7D +:10A45000DC62E4AB76A31DF7A1FBDBFF6D2FDEF71B +:10A460006C91E87B12751D65595BA19FBB31CF11C3 +:10A470007CDE2B375A25F8D8082BC5C3336E3292B1 +:10A480005D3C9F6CFD25FA372B9C1B498ECFEFD985 +:10A4900069A2FAB9AD1243D3BF3F69DF1B888FF3BE +:10A4A0006F1E31A1935DD27AC4D4F777ECFD052FEE +:10A4B00004FE1407379B304E59B551EBF799904E77 +:10A4C0002EE1FFD4BE728AFA2BDA24D2332B5E92AD +:10A4D000E93CFBBE8EB74CC8C7B55B2496981A748E +:10A4E0007F8314F21D84A58CF3C152A1675632EF0D +:10A4F00053C9306E6533AF23604F87D6E5AEDC328B +:10A5000087BEDBB4AC79687DF3B0E0EB87301EBC6E +:10A5100015BF83143AEE61EDBB5C3A7E7E5CE3E7E7 +:10A520004C9689FCFC55911A950DD7BF3AB2E2E6DC +:10A53000A1CEB1F7083BACD9C1CB3E03D911FDB8D0 +:10A540008B6D5708DEBA9ECB26B483E5ED9708EFF6 +:10A5500095ED5D54C7711773D7209EEE6AB7DA5137 +:10A560008E2BFBB85E9AD96EF67A25BCDFD284F4C6 +:10A57000ECEFE4758B9E3D12F92F9ABE7A48E0EF1E +:10A580002181BF874041A7E4A21FCBE3DE8733369A +:10A59000EE8F81FBB5E27ACD817D91E8EFCD6497B6 +:10A5A000EE457AC07B18BE87BD148AE73B1987E366 +:10A5B000CE2DBCDE596FAFFA4764CDA6FC23C49DF7 +:10A5C000084FCD96503CD7EAE2ED7523B87DDEA466 +:10A5D000C373A59F59B3110E5576786974AF82EF96 +:10A5E000EDCE9128BFDAADA6450DB5FFA8B5EF09B0 +:10A5F000BF59EBCF16E7AB5BECCDB6E038D894CCC7 +:10A60000EDFF8A29B207E934103FA4EFCB510D8149 +:10A61000F801E286DF8C88E771041674BC3B526651 +:10A62000717181F8E18749EB2B73A15FB785CBF995 +:10A63000C5C9301F7EDF4B61E45FD66D31D339C0B1 +:10A640003AA03BC509EDFC1C83AB5D2A437A83FF2E +:10A65000FDEE888978AE8619E360DD73DA389FCF26 +:10A6600029BD447C72209DAFF7B2A2260EE58F6B08 +:10A670007E389EC35283CF3F805CE2F8DA765E0F6D +:10A68000D4BAF7EB51A9A8D73AFE3A6A09B45746AB +:10A69000F0F56B7E9E1FFCBCD1DCCF3986FEE783D4 +:10A6A0009ADCD8F93EDA83C2CE30A989F8BBD6D875 +:10A6B000F2760CFA4D5BF9BE3DDB6DC46F9CB18642 +:10A6C0000F5E6F8A81755F7C5DA27A347CFE09E043 +:10A6D000B38B4B5B4EA31FFDD5560BF98F0F828FAB +:10A6E000383D77B03C6A72AB7D77AA81AD257F7229 +:10A6F0002D6BA27695E0E38B6D8D26CA9B79839EA8 +:10A700001F3DD8EF58A5E33B537228BF357C104E50 +:10A71000FE5FFF01D98EFB2780A7FF4E0EC687F094 +:10A720002F5AF786113DFB8FD8C85EFC49F0D979C6 +:10A7300091376E982CD3FA0D53789BD5F9D668A42F +:10A740001FE21BEBDE3777BE358E9FA7F612DE5772 +:10A75000BE8A49F120385BAC94DBD3FA0D1F2CA2E2 +:10A76000EFF0D4ED19806B8C292E00D770FC2F49A7 +:10A770003C1E3448A1F160DD6ED9155CEF05EBB9E4 +:10A780000FF54F929003A6F813D02F1999AC92FDB4 +:10A790006A68E7F43474F016DEBF80E73B8CF4FEA1 +:10A7A00041F78B3D3578FFAB542BDF4FBEEAA9C490 +:10A7B000FE7747CB544FF9DD0F568C0DD69B0CE13D +:10A7C000047AD619FD0914371E31107C75472E27DF +:10A7D000A4DB501F6D2CB567A3DEE1FA6EFF68EBBA +:10A7E00072E4630FBE373130CF6BC2DE325C6F1262 +:10A7F0007A152FF079C57AD7B2B9223EE67C942D2E +:10A80000FC3D882B26264F1C1C57DCA83F09F6E090 +:10A81000E86209EB89140FC6B53B8F737DD0D0F188 +:10A82000D0A7C8E7759F98A9BEEABB9D0F8DA53A32 +:10A830005BB7FB56F42BBEEA7CF856CAF3496B09AA +:10A840002E0FC29784FECB8709580FBAAAE3C30420 +:10A85000B2AFBB26AEF744A09F927B275E07BF81B5 +:10A86000F80FFC17E2BF9D3DF99ABF62C579571DED +:10A87000505C889F5507F20F55A21F71B8381FD53D +:10A88000B874389FFC953CF4576C01FF455B4F65ED +:10A8900032AF77E9EF0AA33C81C44673FE61E92138 +:10A8A000FC53D3FA0ED9F59A3639A46E507BCE9D5F +:10A8B000ACF07D7E8D7F5A2427F1C776DED6B4EDCD +:10A8C000A4F5AD34B610BD1BB618F9FDADBCD5EA84 +:10A8D000AA3D2CC683F8388497800E334D5EFA6EFD +:10A8E000C5C154EEBFEBE9F15932CF631C3CE1BE68 +:10A8F00019F9E560917BAC7D08FBE061C53C3E95B4 +:10A9000004BE5BF97925FDB853C93C8E8F8C0D3D93 +:10A910003F3A605F9239FFCC340DFD3DBD9F69F237 +:10A92000C4D83306E08BA39546FB3AE1B78F08FA0B +:10A930005E42D55D46F20F8E32FB3B5867384BD3F3 +:10A94000AF93B95DD5F2DDAE0D2ADFD7197CAE919C +:10A95000F4E47C6D3EFD7969E1D7CCD7F935EB3570 +:10A96000FD37868D41FDD722CEB9ADC90CF306E780 +:10A97000A3F4ED7EB18F81E775B06DC8FC98F23617 +:10A9800007BB4EBC41756627C2D8689E97A3FCF5ED +:10A99000AA61F2D70D03F2382F84BF347A5C10DF3E +:10A9A00055D1D3E30D81776D9F2D5CECB39D56DCC3 +:10A9B0006F24535DD67913FF8E9A9FE2AB864CEEDF +:10A9C0001F5D2893685F1CE01C650ED2EB1746F0F4 +:10A9D000B8EABB0B24CA9B76E1788C9F5A24AAABB9 +:10A9E0005EE5EB35211F8D695DF224C9AB871D63E0 +:10A9F00041DFA9986DE17671806EDABA07EC568C6A +:10AA000087EBE1386A713CDAC159C2EEE9CF218D9A +:10AA100065BDE51857563B2507EEDBEBE93D77E1D1 +:10AA20008477E2FF013A9F4B761F21FDD67B7901A7 +:10AA3000E63F0F667E3E0AED65ED307CFB3BC1B71D +:10AA4000DAF7591C63D546FC3EC98F12DD9F207E84 +:10AA5000FB0DDF468E63F87CDF7FAF91902E8CE894 +:10AA6000319C9C9C12F39D4A16DF258CE3FB24CB82 +:10AA7000B18FF26AF48EA4FC42F68DED4B35EC7E7C +:10AA80003707F5D6C5AE0339A6203A9E5F03F28E8E +:10AA9000F6A3635F826A0BE63303F1972469FCA691 +:10AAA00008BB18CA77E791EFB2B1FD30321DF5EE61 +:10AAB000F6A391B7E07CBB783BC09FED328D8378E5 +:10AAC00067CCFC8860F89E24F82EB4F07918EB1B54 +:10AAD00053353EF87EE3707C6B4CE1F584217CAB12 +:10AAE000ADB705BF8783FE7DA799BE8783F9E6E8EA +:10AAF00020B9484DE1F230497CFF660AF3D0F700F7 +:10AB00002789EFE04C51984F89C17D2E9FCCF76586 +:10AB1000F9798602C1BF93145F17D6394C11FB3205 +:10AB200085AC97C64D677E6A9DCC4EE7148A9983A3 +:10AB3000DAC916DF9D9876C96E69A1FA3F5F821265 +:10AB40007DD622CE430C41B7C0FA15FAEE0DF1A521 +:10AB50008CE76186FE6E4A650A9773FA3807D2F76A +:10AB600002A3FC147EDF0C5F325561155877749B8D +:10AB7000C22CE100EFF6B70D24BF9D7DAA17EB4074 +:10AB80001DB1E2B92F18D5BB4E7272F944D382754C +:10AB900012DA7AF5782884F9303F364981C892F084 +:10ABA000E8A3F7DDCEF8398D22A6D207566EC78FFF +:10ABB00027935EF7539C54027112EA7583C543F8DC +:10ABC00028C3E4CA44BEBF1109F314364BEC38EE77 +:10ABD00057A4F1F56AF3170223E0B9BD32B15E4C18 +:10ABE000811E8FE1FB1E9154385C6AE7DF094AA0A1 +:10ABF000EF04DD285EFB13F8772123EFF75FFC7E7F +:10AC00007E60FFC781DF0D8A0C7C8FD281E74C30DC +:10AC10007FE753CE07FBCD77A72CAD4E9918A897A9 +:10AC2000636EA6A25FA1AF9743F49D0B3ADFACD54C +:10AC30007BBCEA9DABE2B9B98571163A4F9B6B19A3 +:10AC40009587762B23D15D9D42751F5B6EA14914BC +:10AC5000EF44574480CFADCC3919F11CA8D7E3DFBE +:10AC60004F1A38CF94C0E8FC9FD5CCEB199F01B99F +:10AC7000C0EF178154A958D7C29E28A1FAC7A7A22E +:10AC80002D0E3C87604678AD01781B2DA2EE47570C +:10AC900077D96833D0F7381B59389DE79E15E6FE03 +:10ACA0001EAEFFB188623A2F9DB56D5A12F983B07E +:10ACB000DE69DA7A0D83EB10B1FE0F9FD3D7FF69FF +:10ACC000EBC2E3EBF85EBBC097B64EBB76DEC7A91E +:10ACD000849CF7D1D6FF4C385FA71177E2D3E859AF +:10ACE00015F5837E7D1A3FFC3FDDFB356D605C0012 +:10ACF00000000000000000001F8B080000000000A2 +:10AD0000000B7B2ACBC0F0A31E818565181826F1A5 +:10AD1000A18AD112CFE066607804C42C3C0C0C856B +:10AD2000407B23807424101F01E2A340ACC2CBC03F +:10AD3000100BC471403C07C89F0BC4A5409C05750F +:10AD4000632B0B03433B107702713710EB3033302A +:10AD5000E832136F7FBE0803C31309045F51126802 +:10AD6000A734FDFC3FD8F00A7DFADA276DC0C0B0E9 +:10AD7000D502C15703B2B759A0AAD96E81DF8C1D85 +:10AD800068F23BD1F8BBF0E83FAB87CAB7D540E5E6 +:10AD90004B693130782285899D067EB7A0E30AA0F1 +:10ADA000DE4A200600FB72DB43680300000000005F +:10ADB00000000000000000001F8B080000000000E1 +:10ADC000000BE57D0B7854D5B5F03E731EF3C8CC6F +:10ADD000641242483084092FA30D3821210D14DB61 +:10ADE0008140448A1AD42A54D4098F24E435011F9F +:10ADF000176BDB0C04232060B058A2463B4150F097 +:10AE0000061D6890200107B034F4A206AFF5D1F614 +:10AE10007A8352400824E20BBDB6FE7BADBD4FE6FF +:10AE20009C9319A07FFBFFB7FFFDE3D71EF639FB0C +:10AE3000B1F67AEDB5D65E7B8F6C3213692821DFCF +:10AE4000C2DF0F089926114206469EF6D7889BC49A +:10AE500013529F4DCB4984A48D2041221032B986D4 +:10AE6000967309597B27099A3308D97FC484DF5721 +:10AE7000FA5899B60B99AEA1DF47B2F74F64D27674 +:10AE8000F4FD1317446C179841829B693981D0DE19 +:10AE900086133A840F9F933D0DD6D1B47ED39D2661 +:10AEA000627613F2381D868C27C441BC56429BAE95 +:10AEB0001CC1FA7B6C86E93951808FE19479B4BC6E +:10AEC0006A4A49DE2A5A5A2D33B81A67973C17A0A6 +:10AED000FDBB4CC3711EB4DE13765AEFD1F74AC9DD +:10AEE0002ADA6EC31C93509245EB352BB3825991ED +:10AEF000F9ABCF3944E2ED0266533E3CBDFC195636 +:10AF0000E0F98B89261C674D0DC307ADA798520841 +:10AF100069ED3C60F1D1FED654B61E2DA4DF1F1999 +:10AF200061F2500C92473A0F58AFA4E307724D9E5E +:10AF300091B4769A14165CF6C878E309057C1CADCA +:10AF4000E7D96171DBFBD7A7FD4E8279AFA67817F1 +:10AF50003322EDC6029CB4DD1A4AB2101DF797B237 +:10AF6000E7308CFBCB1B12850089D4BB1E80847A12 +:10AF7000734C244CEB11A9D742E838AB26BE6519B7 +:10AF800049EBAF2A32C124C81A8FFADD6325D0DF1E +:10AF9000D4518747005DAFA7DF611E598FCD8279FD +:10AFA0003F3A452180FF5F0AB41E457163B1F24309 +:10AFB00080CF51435CF09E3EBDD1F0DA2658100E92 +:10AFC000B27A0321790440C0BF55DEE08A61C05FD8 +:10AFD000B9C403E5340F6D6FEFDFBE4B30235D1A4C +:10AFE000E5402AE02F16FD46707CAECA5C6C057AFF +:10AFF00010D29052349A90F580271854F2B9673ADB +:10B0000022F557080C3FEB64E215E8FCE27295E08C +:10B01000528A6753966B36CCD7EE53C875B4BC5280 +:10B0200008A48A4097D10AD9EC46BEB08EA4E53573 +:10B0300057257A80FFEA85508A04DF6FA0DF699781 +:10B04000078AC6CE06FE6CF228C8CF947F0E03BED8 +:10B05000D7F812C92A377EEFC4F6F6112E33628272 +:10B06000C243F13280F212E035FBA6FAEB87037D92 +:10B07000C6995C40A155C224F73C909F048B0BC637 +:10B0800097C7DD8CF49307260A4443EF9F03BD293D +:10B090009ED6BA8B7E0ECFA7723F4C1849EBAFCE2F +:10B0A0007EB911E8F4F4FD16A4DFD3E33A17815C0E +:10B0B0003D7121E73D1FCAA5E2D94CFB7926FB442F +:10B0C00006A1033E36EDC304C0DF90110DF7102733 +:10B0D0007DCEE8AD2563287CA4A1687E06F2897048 +:10B0E0000BC5EB90250A715B182DBF25F09D7843A9 +:10B0F00059AC6CA7F319C2E9DCDAF996A518FA9BEA +:10B1000043C2A39CF8DE929C18D13343724938990C +:10B11000F6FFC4824328E74F5F9DEC61729E82FC7C +:10B1200092CEFB4983FA54BFA45848208E3E8774C0 +:10B13000F4DE0C700DC93C3107E0DCFFFA2101E8B8 +:10B14000F6CC986437E8A3045F27E9A2741F92F550 +:10B15000CE8350CF610FA6146561FDBF603B03FC39 +:10B160002D6EEF26C0DB36A1E630D027906DF23091 +:10B170007A333DB8FADEE420E89121B63FCD14875A +:10B18000211F10924CE1731194937A216C190EEDEA +:10B190001E60ED8692A000781E921958243AA1BE36 +:10B1A0004F2872F41FB7153422C807E574E0D7EDB5 +:10B1B0000A292F8A2207AF7279AE17C82CE46722BA +:10B1C000FD15F8666802E31BB5FC0CC043C7DDFE45 +:10B1D0005AE20FB3283CBF5A322C5BA4F0AC857600 +:10B1E00051E4660D97035B07090814AFFB7FF73B3B +:10B1F0002BE06DBB899441FD4999214B17A72BD0BA +:10B20000630161FD37656DB4A0BE103291EF16E4A5 +:10B210002B5EEB1890BF65828FB64F7131BDECF09D +:10B220002841D0CB8E948060A2F0B8B3886B6306BF +:10B23000EB2E40F13717FE018C2EB1FAABD7240468 +:10B2400057D1EF73B3A8A001DE28AE4C74DCF984AB +:10B25000CD73AEA77E11D08F902213E073958BD162 +:10B26000A709C6A153694A63FDACB98F0497011FB2 +:10B27000B958FB11D084D26D44EECBFF22D07ED3DF +:10B28000783B907B68179712B498683B778D89203C +:10B290007C52F8B000741F9DEC06789A523CFF3E39 +:10B2A00003E09F257936D2CF23000EDA4F538DC9A4 +:10B2B0008BFA225769063DBDCACBF4BC8AAF0C3E5F +:10B2C0006E9A272CD0B9930CAA27114FDEB0D50562 +:10B2D000E52C064F462E9B571FFCA395E032DA382B +:10B2E000CD1226504FC54309EFAF84CFC39E125CE9 +:10B2F0002101DCB90C6EBA2E233C69594A33C8418E +:10B300005A0AEBCF4DF1A3E21DE0B2A970E5D2FAE3 +:10B31000A0873D4A33B0828DC35792C5E0D97FE400 +:10B32000AD0E81F5877265E3F0DAF8FC09C09BCCBD +:10B33000F53AEDAF450E0B22AD1F1C47DC1BD9685B +:10B340006E292FF2FDB11A8A075AB0F371C87A3309 +:10B35000CA037D15F896F2C1BC065ACE8CC8C7C880 +:10B3600015669DBCD8F9BC49039323CA366168971A +:10B370004158D904653A8F924CBD9C118FA64CE17F +:10B380007000BF53FDB374BCC2F8E72A66C710A2B1 +:10B39000A9077C3ECEFDEC6AFCAEE0BA9EFE5345AA +:10B3A00007DF909AE4C922E8938E276F36015FDDAC +:10B3B0004B4C623CF2B3D0A7BFE8783B1687AD3068 +:10B3C000495B475122E02DBD2671B20278ECF06155 +:10B3D000D9D651E3C5272C4D6309194C34E3648059 +:10B3E0007E7555B450BC921A2504FA7A9C164EFA12 +:10B3F0003DFDB5869940AF87171D4A05F94D36B416 +:10B400001F631A86723AE4355A0BC73FF133A8BF5F +:10B4100092EB131B403C169FAFC173889DEA59AA5B +:10B42000A7D3298295B1117DB1EAAA77B27D76CEF4 +:10B430003F89F80CC3D3A85734F5AFE2F503C245F2 +:10B44000EB9DC07A2A3CC6EFE70413EA2907D89996 +:10B4500014BF8F12D76C5C973D265C17E3F8FB9006 +:10B46000E7C064A4678878840CD0B77F356BF9E0B7 +:10B4700027F012F4AD14423951D26D681F52398E43 +:10B480008375AF49AA2983F7A1341B01BD7060EA17 +:10B490002101F099D6E61B0A72A8DAB9933DA114EE +:10B4A00078FFC861DF95289F31EC46D54E34CEE752 +:10B4B0008A6B97A13E18EAEBED80F5DE5E2979AE46 +:10B4C00003FEF251B8ECA827DDE4BB147E4F6029DF +:10B4D000E859B78F9607D167257F96B1EF2B6BCBD5 +:10B4E000728E4B917E578EA0F628D58BEB3BD75BA7 +:10B4F0006E003BA3C6E406BE5DE379CBE2B54379BB +:10B50000F200C0736B916AF78505182FED6D2FDA85 +:10B5100079E35C8A0B94D6687338D5A5592F9AA61F +:10B52000BE3316E020B75222A6C6A6239D2FF2599D +:10B53000ACF504603169D691FD993B707D799D5CD5 +:10B54000857451D715751DC11EA97E99C7E5E811EF +:10B5500077C822A0BEA2B24BE9338FEB113BD79B39 +:10B56000540F333DC7D793358B92713D51F527D892 +:10B57000D6A024E6717DBB26FBB9841B284C76D06F +:10B58000B3A09752C864587F47829E01FD240504EA +:10B5900018AF699C8BACC2754CAF4F47D6303DF8A5 +:10B5A000480A417EA2EB5033AC774D69A114E8A75D +:10B5B000A9E680E0D3AC9FEA7AE7A8E924A007E7F0 +:10B5C000E6B2756E6E161BEF0F80A0710C5ED0ABED +:10B5D000C675EF171377A0B28CE3F69611FF828938 +:10B5E000D9818FCE780BF1B866FE63F8240D1BB0BD +:10B5F000BF140BA3C1CACC03F87EB5CF340DECEE5B +:10B60000F552E78A1114FEF5D3E62A01FA7DB587D3 +:10B61000F95DAB26CE7D0ED635B3496170D594A1C8 +:10B62000BD1AC7E1DA007DA39FA8A05F74DF9D1B50 +:10B63000570CA3FDA4503F467043A5A0C54CBFDBEB +:10B6400081A6A0BF7D6106BF874C2651E0FF0FC1D8 +:10B65000C6FC505F67C748A4A7C905F0C6797A2D14 +:10B66000E027BAA91FE67603BC6EEB6884D7E45ADC +:10B67000EA8EB4FF3DF717EE82851FECFBD9EF4C45 +:10B6800003F95A7727F3CB8CF0DF3729D861C271E1 +:10B6900008BA758E18789D031A0CF48F27887039B4 +:10B6A00032195CC70546AF473B275F8F7E52117D3D +:10B6B0004F3B7AAC739815E4DB68EF3D1DF74136DC +:10B6C000DA3B8675E652E521067D3FDA1C9A8EFC50 +:10B6D000B6CD847A8A10A6E70462727F3B1C1611ED +:10B6E0000617B21ED5DFCBE5F0ECF9B4FEF29D767D +:10B6F00002F852F9218DF7B9AA86F24194797708B8 +:10B70000622CBA333B83D3BD13C61B7869FA5369E5 +:10B71000B682DD160AD60F2E07FFA386F9BBA1F06D +:10B7200001D43F69536E433F654B73F2ECF9C05748 +:10B73000995E0FA0438507EC93687EE27493E5A2BF +:10B74000FE7B2C3DDC58B91CFDDEC6CEE8F39F68BD +:10B7500062FE7688EA494F56ECF1F34CCC8E4E30BF +:10B7600071BE9B7A2845BB9EA9EBAABACE0E914822 +:10B7700040D4AC87B772FC19D74D22355846313EBC +:10B7800047FFB1713E8B436C9868C2F88ACAE7B430 +:10B790005E0AE095CE03ED39CA8741B0E71E250D5C +:10B7A000283701DA7E33E90FF79DC47459F39BC043 +:10B7B000E7D7371EF7AFEFE2FA6A5DF6FD56E88A83 +:10B7C0008E9702FCE177323D59E560766CC14E39C7 +:10B7D000FC030A4755B3807696699F15E13CB7890B +:10B7E0009669D7618782F5CFBA2C58F69B3BD77EF6 +:10B7F0008F967B778A04EDC84C9B09F8F504E757D0 +:10B80000924BCB600F5B59B1AA79FF5DD05F599B1A +:10B81000995869FF55BB4B6FFC1E2D9776C804AA3B +:10B82000546D5EAA0CA6E585412104E59EC974A16C +:10B8300002BC242A41F0DB7B9C9DC93FA2F33E5D04 +:10B840006B216E0A4A9DA333F9568A8FF2E0F642C5 +:10B850006857DE228046A4F3D87C2815E6B555F05B +:10B86000807F5FB1254E670F9EA053F901FDBE9802 +:10B87000CE13E4B2943414C23A57B5799DE2D6C4DB +:10B880001F4ED7BA701CB55CB5958E43DB55BF28EB +:10B8900078608AD526E2033D746EB775D6B3769884 +:10B8A000DF52659403E6F5B002F54A83C52F5BDDF0 +:10B8B000005FB35248BF9737352B10DFF29BC9DDCD +:10B8C000E0E7566C19A087AB5144795D9C60D908BC +:10B8D000FA9CD8BD29378FEE4FE7D3B554C78E8A6F +:10B8E00094CB411F221F0695999AFA43C504E4D7C9 +:10B8F0008A2DA2DECEE6EB7FE028A37F60AF03E3D4 +:10B900007E2AFD16737F59A5DFE2044E4FA9372F1B +:10B910001A3C6B811E149E06C0177DAEE6F03927D7 +:10B9200092491077717A894B88C2D7C667834C8A4F +:10B930008175FF75D9CC49522ABA0F8B20F2E45A8F +:10B940003E7BD2145AFEBDA968B309F587C70D72B4 +:10B95000A4FAD9CF98985CD6A72A88BF86A979CFB0 +:10B96000B2F804C175AF616AC9736017D0F6DB4CD9 +:10B970002887B4FDE8D8ED5D85F9BAF6AEC232B5D8 +:10B98000FD4E6C6FB978FB86C209FAF10BCBD5F688 +:10B990007B117EFBC5E1775D37513FFE7595D8DEA3 +:10B9A0006F66F4EA4DB0A05DB3DCEAF14ACC8E0AD2 +:10B9B000C37B2971D446A827AAFC403ABD607FDB2F +:10B9C0005B12C6AE225ABE98FC3AC0E1A0D2A2E5F4 +:10B9D0008BF87C9B8E1F13BC89BA32EDC975E23B94 +:10B9E000BC0C83382D088F3258417D3169B005E198 +:10B9F000BD7F9F15CBF74F60F0DE3FD88E72866B10 +:10BA00000BA5E3FD8AEF1AADDD0A2B138492DE103D +:10BA10007D1F027E23EFDD26786F13490DEA673321 +:10BA2000417DF47046DEB3010D7E560CA1F4A5E510 +:10BA3000B360FF0C8CE0F5E1212529C59A71EA87F6 +:10BA400028B33666B1F7F3EC305E510FE0C1AFF4C6 +:10BA50008E02BBD2388E7958BE6E1C4B7A198EF38B +:10BA6000B5611C737A99611CCBAC8DFC3D1FE71B43 +:10BA70009857AC711E1E36413F9FF4721CC72C1A9A +:10BA8000E6935E6E18C7C6E643DFF371ACE2C5E627 +:10BA9000337CA27E3E432B719C2451D1C5ADCC4357 +:10BAA0002B0DE3D8711C780FE39034E6DF28E6DE37 +:10BAB00012A4FFAB5602F6B462F63D0FFD923F5A58 +:10BAC00009EA13371D7710E89544DC2FF80F53224D +:10BAD000CEE70B1BA5BF5D4BE7806A17A0BDB38007 +:10BAE000834882F5E89F57731E9DDF32337D293CE2 +:10BAF000DB0A528AC1CF5EEFF040FCF45C5B81321E +:10BB00002F8A5DB0A0413ED1A5E35FAEF72693CC6E +:10BB10001AF0B3B81DA0964F50FD45A8DEFA90EA82 +:10BB20002F789E94A99EA6EF8F53FD46142DBC4BF3 +:10BB3000B1DD0989E1F144135B47BE587754C6383B +:10BB40005F80BC9D49E7711B9FC6828638E62B70DB +:10BB500038FC9C1EBDBBCDC18D480FEF1560F79022 +:10BB6000C6011457BCDE30C0171597442C5E01F691 +:10BB7000D18F576CFF0D547B47281EB298CE775655 +:10BB8000EB3AF90A5A3E2777DDE5B16BFA99257F42 +:10BB900008F3B6D0FFA09FD93E5AD68C7F4799BEF6 +:10BBA0007C279122654AB7A9E2304E0F3EAE3B2872 +:10BBB00003BD6E4B66F0DC09CFB1F0D985F4BACB8A +:10BBC000C5DAAAF0F81F944918D7A3AE81CCB81DE6 +:10BBD00088F57CEABA6280EF2ED9E22DA2F4BCEBA4 +:10BBE0000111F16884B76B5F9CD744FDAAAEC64FC4 +:10BBF00065F02F2F05FFDD4BF4DF49808DA7E2555F +:10BC0000E583DB674D1A705C536FB6EFFA01C735F9 +:10BC1000FC7247D94C5DF9CE9AD9BAFA772F29D65A +:10BC20007D2F0E2CD47D9FB76291AEBCA0E1015D4B +:10BC3000FDD2C6A5BAEF0B832B75DF2BB6ACD3951F +:10BC4000AB424FE8EAFBDB9A75DF4DFBAEBA09E485 +:10BC5000B1EEF72201FBEC73FB89B5605F7D6E9757 +:10BC6000D0AFAA065EA37278AA3605F9FB74AD1BA5 +:10BC70009FE7DA72707FCC6FA3F24CD7FA0D75870D +:10BC800097AE98087A84D6A73AFCA9BA379706A83F +:10BC9000EFBE1182D494EFC546858407801F93D8E8 +:10BCA000C7D7BDA2E67BD725BE37D2052BA7FF7726 +:10BCB000B12BFAFB1EA17714D87781F7CDB87F138B +:10BCC000CB7EA07F579028FE83FAEC86F88646EF5D +:10BCD000BC2A32BBFA1A71F2AB227D562A4CDE2BFB +:10BCE00077A44E867841A5121E5513C5CEEE1B2FA4 +:10BCF00044811904FD30795918BC2222BF48BFE1A4 +:10BD00003AB9BFC1E4DB07FAB97BBFC8F607C2077F +:10BD1000D3619FE61AD1FB2ABC276D03717D7CA7F6 +:10BD2000D63BE0F80842DEAB9D86CF3FD4160D80AF +:10BD3000F8D19F6A6761F9835A1F3EBB6ACBF0F95D +:10BD4000616D0D7E3F5EBB04CB276A03F83C55BB9B +:10BD5000029FA76B1BF07B776D2396CFD506F1A9C9 +:10BD6000CA816A8F92246EFF717B9DAE1C583ECFB4 +:10BD7000E720D27F77A25C7B5240AECFDBBF1805B5 +:10BD800076EEF9F7CC18448F852723BFC5A69F17F9 +:10BD9000D7FB9220A57F4EFFEF561BA38FD544A65D +:10BDA000817FB672A44220AE6E7BF53B682FD3F73D +:10BDB00012417D19F468F711FBFA87390FBA349DE7 +:10BDC000D4FA279EFCAFBCB959401F465FDB41B196 +:10BDD00086D1ED590FD04D833F6697EDE4FADC80B4 +:10BDE0004789CB9D119F6707AAF8EC4C87784B9544 +:10BDF000586492E8BBF3AD669CD7F9F638B68FED80 +:10BE00004ABAAC785EC516AB4BAB1FAA42092EBD31 +:10BE1000BE487569F5C5F98E679D20F78B534CAE0A +:10BE2000E339C01F5ECE1F8CEFD4FEAB42192EBB90 +:10BE3000AE1F7DF97C83308DED2BBAE36F8DE21F51 +:10BE4000A8CFC5298AEB38D50BA7B70C8F8771A966 +:10BE50001FE78271BA6B5D2E366E8A4BCB97954B7E +:10BE60006C585F852F56BFFF68F860C7EF230B8BB8 +:10BE700035419C2656FD98F4903E53C03F20EDF28C +:10BE800017B0EED832D57547C2B2DAAF3F2406CC30 +:10BE9000D7C0FB16DD78B49D5BF5A1A15D6CBA4BF4 +:10BEA000E4844A4FAA27AFE3F921949991CE3EDA70 +:10BEB000633CEDAF47B2AF80386F86E4467DE787DD +:10BEC00081283F5559BA149F1BD1DD8971CF7C550C +:10BED000EEDDB7FF91B2DCC7FF26633C837C437B7A +:10BEE000A7DF65FE753E2972829331B7B56206E819 +:10BEF000C98F4DAA3DD09007F33E4B4CB89F7F961B +:10BF0000BCE5CCD1D86565128F4FAE60EB7380FE77 +:10BF100007F3A3769A6EBD2E6DD4974BC8CDC9207A +:10BF20000F25EB65D8B1250B61BDD7EC9BCC925C9E +:10BF300038EF5252530F76CA2A99EDA3CE7511E904 +:10BF40000A0A57D5AEA7F3C09EF54B4CDFABFEF304 +:10BF5000C2440677795250F1D2EF1FB5E6DCF63DC8 +:10BF600002ED83F5A0D7020EE289168F99B7420F32 +:10BF7000DFA5E037C24BC8321D1C6ABF2A1CE2167F +:10BF8000216A9EC6CF2481C775987CAC91F4F6EBEC +:10BF9000631C0F6A7983A1DC64A8AFF289CCF92411 +:10BFA00043F23D06FAA7CAD25B88761AA1FC911526 +:10BFB000A9A744EA6DB8583D33D413B15E93342E2B +:10BFC000763D6BA4BFE668FD55EDDAF67280F2535C +:10BFD000F94B8F3B21E8FBB1D4900CF1AFCACD0FE8 +:10BFE00039014FA7A48013E8FD71508C1A177CB754 +:10BFF0000F5F5EBB007E04B236C5FB0B8FDC08FA18 +:10C00000FA8BCD32E6C5F8B798C366CAC7D5AD0B73 +:10C010006740FC9E968FB1F2C39FC0BEA1BF4D4F3B +:10C02000CFF2E71F4F863811C524B3B74918ED8EFC +:10C03000EA4D7F2E043DEE27BDC887C67630FE85CB +:10C040004494FB6225BEFF77355FC1CFE5CCDFFAB4 +:10C05000C8279097E037F04F59DF7AD2A5401CA14E +:10C06000437224A15FFE5DF25DD0032A3E4890D961 +:10C0700013755B378C3946E1E9DEF46F4E41E777A3 +:10C08000333E3C1F9AF7AB57DCB1F5CC39EE0F4588 +:10C09000DA05B19DBB8DD93FA49D3D2BE5B013ECD6 +:10C0A000CDCA66D9433994546E7BF6B927C14F7B0C +:10C0B000DF8C7E5AC5B6DFBC3381962BB6CB4933B5 +:10C0C000D874EC4272842E7EFABF2563237428FF55 +:10C0D000F56F14F768F6FEA789117A546CDFAF90FC +:10C0E000D1FDF15710DAAF74D9A3D02574AC10ECA0 +:10C0F00095BAAD5F2AE0777DBC4F208332FAB72F27 +:10C100006BFE0DAE878027A423A7531FDDFAD12B2A +:10C110007CE32BB958CF057A3216BD5EE07AB96A56 +:10C1200097832440FCF30FE6E00CA0E38BF7386123 +:10C130001E27A51AC6D74F3F940CFB7F657220D9E6 +:10C14000854FF6BEEC99FB90DF4A859A64B68FE97D +:10C150004DE5F1F25498DF82A61FE1FC4A880FF901 +:10C16000AEEC69B108E2C39F4B64DAF628727183C2 +:10C17000CCF69F4E6E3443921F3909763ED8D76F66 +:10C18000891867256411EE83DDA7C671C9622C7F0B +:10C19000CEF7A546C826D53FB4E8F875D3C39D4071 +:10C1A0009FD343BC83004E8A8700C79700FBFDE204 +:10C1B000D1A983187D58BE01B6A3FABF00DE43FDA6 +:10C1C0004E19F70935EDB8BE64E3DFCBC7A770DBC6 +:10C1D000603D3B99CCF62B8DF35BC2E747FF3A8974 +:10C1E00086BF34F2CDE47DD34A26DFAABC07674E72 +:10C1F00083EF9FBDCDE407DAC1FA41E10A0FC2EF38 +:10C20000FB6F15501F9849389A5C6F92B95CEBBF71 +:10C21000FBA99C425C80C22D413E43844F68FF894C +:10C22000887FF44B4AD6D3761AFBCC0FE3613D25C9 +:10C23000F25EB37E94723D304DD6CB3F691A785989 +:10C24000F662A54C02605A56BE6F46BFBB729B5C3D +:10C2500004F33ED372F09D1F53BE3E1352E554AF1C +:10C260003F8D725AB663B300FC6994D3336574B5DD +:10C270008E26A7F47D54392DEBFABFA23F55BCF9A9 +:10C280000D78A37A7068822936FE8C7AD021BBA300 +:10C29000EA41FAF736C9EBCF772ABFA97C462DB41D +:10C2A000A1A0BFFBF851E5B73E7E54F9CD384F3D14 +:10C2B000DE8CDF2780A146E12ADA2DA35F52D9CE9A +:10C2C000F66F68BB4357E4227EBCB87C9186435727 +:10C2D0002469CB41433964A8EF35948B0CF57D86F6 +:10C2E000728DAE7E65DB418525198575F5CC4B9E3B +:10C2F000241F45B1EFD575C6DFFA8912007E48EBE1 +:10C300005540CFC9CBA86906F1B3BD22FA5B3DEE1B +:10C310005E67227DFF9095F9B13D2E5E4E60E5DEB1 +:10C32000814A3DE839F57DAF95C5397B8A7A9D090B +:10C330001AFFFE58BBE884FDE0AE20CB47ED0F4F5F +:10C340001DCA4D1789F59DC505A78AF6F425E0BFDE +:10C3500035881E700DE72FBDDD09FB6E3DEDC36F07 +:10C360009A45DF2F382C82F94C7A6CCE31001709B0 +:10C3700078A5D43C9E3F41FF4E91C02F2742DE441A +:10C380003BB3AFE7AF36D8C3F67B15CC2F5BAF8995 +:10C390006B69F8BF9CF753D6A4FF5E4E5623FF95FA +:10C3A0001BE4C1C7FD81A3AA3C64936CB6BF4D9842 +:10C3B0001FCBF5EE5431EBA65914EF3D1D22E6CD0F +:10C3C0009E6F17493DCCB345C07D4E1218887255FB +:10C3D0004D7A51DFA978E906B95162EBA3EE9DFFD2 +:10C3E00091F720F0C7CB7F1CF3147D76BFFCFEA82D +:10C3F0003D50DEF56EFA1F49FFFA05FBBEC27DC453 +:10C400009E7D668C73F5ECFB6DFA83507EC58C7156 +:10C41000AE9E6566DC4709EC730447C2F721CC1F6A +:10C42000A8DBFBE5189627B91CE9F48DCCFC91F349 +:10C43000EDFFF501E48F9C6FA7B302BB605F1CCAE0 +:10C440008DFF152BFADF3D7BBFCCF3D9FF71F3A92C +:10C4500056880FF9CF4166ED007E4D60F160FF9E7A +:10C46000F1CF427E7355EB7E05E2EC05AFFE650C25 +:10C47000E8C99E1DCCDE3927773D03FB6166E59355 +:10C480006532C5F339109EC1843CAB8C2D086445E0 +:10C49000C30BC3430FC503CC8BE2A50CF47B2C7CF0 +:10C4A000A42BFFACF8F8E42EA6C7BE8B79F611BC1E +:10C4B000085EF6DE11B408387FF67EDF976340CF62 +:10C4C0009C092D457BE452F3BE5661FB2CFF73E6BD +:10C4D0002D842F67DE73FE69E9CDF8FF43585F07AF +:10C4E000F69783FE7CBEEB7E2CBFE8F020BC97293C +:10C4F000FF3FFD9F46F71D94EECE4BD3FDA97FDA9B +:10C50000795F8AEE8739DD1D2ED85FEED9FB178C57 +:10C510009BAAF3BFD4BC5FF97F74DEAABD3EDD5495 +:10C52000736426AD7F8484D71751385F4B9BFAF62E +:10C530004CFAF5B731EC91D30A8B7FFC96B03CC135 +:10C54000408AC0F23CB85F5440D8BA5E90598A76AF +:10C550004641E623681F10A9E64836C5C7F4F4052E +:10C560001E960F3616CFA15C977AAD07E38106FFC2 +:10C57000F0A040BC900F5D70F5F51DE0AF4C499305 +:10C58000C3E631F83C06CF43CE69ECBD5DEF17CD75 +:10C5900000BF46E3E75DEFD67F2FE4FD4D238B8F91 +:10C5A000CCA4E34F4B135D416837A94182F9CCA07D +:10C5B000C2DDA0D90F2A34F47708FC5A4DBCEC6FC9 +:10C5C000C55F9A99F991BFA5E36703FED2648C0712 +:10C5D0005E127F84E57F5D979A8DE75188E441FC88 +:10C5E0004D1F5CC5F1C9FC6689B797ECF59D20B776 +:10C5F00012A17E2FB3CBD05F56FDDE587826DC8F9C +:10C6000096F8902ADEA53419F35535FD213E547A6B +:10C61000FCAD7450E9F7F7D2E39C811E699FB92401 +:10C6200090CF026EFF4FF9AC53C4729A47C2FD28F7 +:10C630006EFF4FB2274860FF5F2B1D15412E4B2D1B +:10C640006DD3214E6FF108C8D757769BD0BFB1E4A8 +:10C650000A88F7CC4609CB474DAE716068DFF8BD5C +:10C660005D671E20101FF62A68789322169FFFE64A +:10C67000DB6F27AAE735F03B213750FCCE6F2261F4 +:10C680001B9DE7028904E21321BE2B900F75F15D1B +:10C690007D19FEBE9F1CE9E752F563E9917FF473B3 +:10C6A00017D55B1F52E6D80D4FDC57A12CA1F18F97 +:10C6B000BFDBCEF0E53F4282C3502F78C522CDBE0E +:10C6C000D92366A63F76FD69470EC4C526F564C525 +:10C6D000337D3A02FD023FF70BCE13773CE41F9CFB +:10C6E0006F1F1E8FFB821DA2C317252EB395FBCF94 +:10C6F000FF0AF914F4D9B38934C0398C1ED28BF1F6 +:10C70000D8C0264BD4FDDDFBCD6ABC89D38DFE8914 +:10C71000EA792337E68B04E2B574EB9EF1B134A6D7 +:10C720003F1DE0EF43CD7EC9DF8B5FF0D701BF5BDC +:10C73000AD5D85D1CE83ADE0F8BBF1C05718C7BC65 +:10C74000BABDD904FC7BF526936EBF3160E67ED777 +:10C75000583216E0BAF180D5910B74E9103D903F44 +:10C76000E86FFF44F145D9B732E213FA87B8F83ED3 +:10C77000338BF3EF9143F300AF7BCE5A303F67B773 +:10C78000D250110DCE2BAD4CCF2D20A17BC664FC19 +:10C79000F3E177528F3D3C19FCCC4D84C7318CFCC2 +:10C7A00047908FCF6F21783E14FC52D00BE75BD8B7 +:10C7B00039608A9235E04F5379FF81362E7365DBFD +:10C7C000F67F053BA0BA5D7041EA6CB5D4A540BCCC +:10C7D000D5DF9620C2BA9BED56F32A5DA36FD5C86C +:10C7E000C53E33CB373E3861CF1D30EEA7DD0A01A1 +:10C7F0007BC4FB5AAF13D6ED4FDB73E2A3E5CDABA1 +:10C80000CF5FD792E95324E88720DE8DFC90D56274 +:10C81000D395BF27FA06837CDD68EEBAD713857EF1 +:10C820003E0BE3B3CBD66FC1FFCFF4DBDBAA7EF3C5 +:10C8300089451A39CAB4F4D36F83A2E9B7C5827B9C +:10C8400010E07DF1DEE18380AE8B0FCB03A3E9B76F +:10C850006DB56C3FEF259E0FDBD34AF5DB351AFD36 +:10C86000D66AC1BC3863BB448B89AF8B97D06FC18C +:10C87000FF1EF9DB06FA2DCA7C475A98DE50F5DB1D +:10C8800098F663A8DFC6B49A7479A369964BE93722 +:10C8900061E0AD600F77C89EB828FCB38DDBDF2F59 +:10C8A000F13C3C1807F4DC1D16B6BF79B97A2ECBE3 +:10C8B000CAE87D493DF7DF846755CF2DDEA99E7319 +:10C8C00034F221D3738B77533D27003F323DB77845 +:10C8D0002FBBC7C1A8DF32FBE93782F5ABC3ACBDC4 +:10C8E000BF2D63C31CDADF58AFECB1D0FA6323FA73 +:10C8F0006E9C56DFDD6161F72EF4D3771D97A7EFAD +:10C9000076727D47F5D830D0AF46FEF0B4EBF38EAB +:10C91000F78C3FD9F26B9097D745DC373CCACFA54F +:10C92000BD31FE642EF0578B85E9DF3ACE7FE76A92 +:10C9300003D87FC16B6C7E5576968F5CDDCAECC3E5 +:10C94000EA1621E8A6FF2C9CF09502F02FDC2B9034 +:10C9500041B43CD3CCEA93E7D57D2F32235BC30FA0 +:10C96000F3F32B306E3F5F221688CB57D80B3F86F0 +:10C97000787C453E8BE357F0F70B0F77D5433C7B34 +:10C98000E11302EE7B129E0FA0E63796B62FC57814 +:10C99000AD312F40D5E70B83FAF715867CC6663E8E +:10C9A000CF996217E285BC2946CD4B6836E2A38356 +:10C9B000E3639388EB661F3E287EDC19FDF1412975 +:10C9C0003A233B3932FF85AFD379E546E6A5E2C38A +:10C9D000383F35EE5CC1DBC59AAF8ABF7EF355F1B7 +:10C9E0006998F7B3A037402164931CC88BA17C8061 +:10C9F0007A23F03B11CFEF174D1A3948AB87B77246 +:10CA00007D9ED330A9209500BE480DF04D49E3A28C +:10CA100043A974DEE3DE738F85E5F17B13CC3ED84A +:10CA20001FDD6AED45BDA6F2D5D79CAFDEE178DC0F +:10CA300033B806CFA9FADB0417D815FEB015F1E715 +:10CA4000A7F883F32B7E7E7ED14FF90BE4E9E01348 +:10CA50005F307CED15DC101F2F54D71FC03FAD9FFA +:10CA6000D3CEF0EF0F0A88FF5CD28BFB23D58D82EB +:10CA7000274CEB57B72DC2BC0755DFD23FBB961EE4 +:10CA80001A7E94A2F12356D2AC7F15BCDE8DE686C9 +:10CA900077803F6F7C5E26CD1AFECCA4FF7D1B8580 +:10CAA0004E2A3E2FC59717389EB6011EED80AF5E09 +:10CAB000663F85BFC27334EA77BF14D0E1B1E0C9E5 +:10CAC0000B17C5D338154FC0A7A0A7DA8B452897F9 +:10CAD000B409644046FF79C2FEA4566E17EE3DC607 +:10CAE000FA7F5AC07B4B8C7CABCEBB1FDFC6E057B6 +:10CAF0003897067ED1E5F2EDD706BE7DC3DA7B24FA +:10CB000007F876AFC0E207ED09BAFDC5C156B6FE1B +:10CB10006FB552FE867DADC3B267A3BBBF7CC7F1C4 +:10CB2000F50BEC7EEDB9A4AB602290F7B8C5827925 +:10CB30006408C73066576AF5EA362B19786B6EECD5 +:10CB4000FE5379FFB1EC1AB53C1AC6837CAF363A76 +:10CB50005E66643CA35E57FDFC4BCD6BD4DF39AF02 +:10CB6000BE3C4CD289FB4E1992EF51B3260FEE36E4 +:10CB70009E67442140FB4A532FCB72917A24C5858E +:10CB8000E79FEE71A97CC6F2DD8B781EFB5471E243 +:10CB9000BBB07E7EEA65FB7CB926F2FB89A09F27AD +:10CBA000CB788EEFD32332C66B3F9DC2F2386F7ABB +:10CBB000FDA004719A9B4039517CDC344E407F05C6 +:10CBC0008E61C1BED92E6ADF7847E17C72E01C57C6 +:10CBD000F6A68602387F3C764BB00E9E9E82DEA47F +:10CBE00037008F93440278ECF40E2880FB93EEF923 +:10CBF00033C1FB43E83A8BEDC7769081506F827763 +:10CC000020BA03E35BD717407C74E641BB1DEE6797 +:10CC1000C96C32519F2182BF09245807FBEDE38F75 +:10CC20007B6F0178CBA8BD0071E7B2F6E63A279496 +:10CC30009B048F9BF6EF0FF80A9D741EDB1A3F29A9 +:10CC4000FC0EC823AD07DDF89B583DFF26B87808D9 +:10CC5000DEAFC33C9B924D021EFCDA16148885F5AC +:10CC60001BB4D07EB735D1F6B9B04ED0F6D0EFA612 +:10CC70004FDEBE05E4FD88C8DAB7B07DEA12DACE31 +:10CC80000D7CBB6911F6B7B0492029B4BFB216B606 +:10CC90000E941D913DF0BD75FF13B88ECDA0E3A598 +:10CCA0006680DE0F4F8132C9115C18EFAC1C8574B1 +:10CCB000EBE1724E268E64FA43E065EE37A876D338 +:10CCC0003B5696EF5BE259AA0CA0FDBC913F3003A6 +:10CCD000D202FC6D9FE0FEF3718A671FEDF228CF50 +:10CCE000DB3898FF91D2A559873EB5B2FBADE6B7C8 +:10CCF0004DC27C8605A408F3196E1CCFECB537AF86 +:10CD0000B506E18A8337E5DE34787FF05A33DABF3F +:10CD1000E7B6C9C847E78674617CFA64938CE786F6 +:10CD2000EB9AD8FD5C275BD83A2E3ECDF6F54B1D2D +:10CD30000A960F36DD5208EBDBC94DECBC63C1D35C +:10CD400053152897360B1E767F11D38FAAFF56E214 +:10CD500062F908AAFEABE2F3EE97B768D07755EA1E +:10CD60007A63D07755B0AFEC84A7FEBD9FD8991EEB +:10CD700004BB1FE81EFE0AF9B7FA884CC0EE173E46 +:10CD8000EA2EC47CACBD02C6F3C7B70B5ED8D72F62 +:10CD90007BCF1C447B35587CF74F408FBF6F26827A +:10CDA0001BF2DA29DEA97EC837F7FEE917F4FDC7C2 +:10CDB000472D900943F9A418F1ACE67FE66E667939 +:10CDC0002CB947D727C3794B326500EADBD24691AD +:10CDD000F8347AE363C17BCB8F995EC6FB2954FAA2 +:10CDE000E52A0D25B08E0DB731BDE4DE2C438E084B +:10CDF00039CCE324D49EC6F3B70B77AF4B5668BD4E +:10CE00007A9EFFB170EFBA6491BEAF83F58BD65FA7 +:10CE1000A8B0FE17EE135CCD9AFED5F66A7F6A3F86 +:10CE2000CA6E7D3FC3F7F2F265F6A3C2A18E1FCB97 +:10CE30001ECFFFF70BEBE1BE98FC37454C3ACEFF17 +:10CE400068C670ED7E87FA54E3AF796F9B8857838D +:10CE5000B7FC3FD98857C317ADE3A87C53BADDD0E0 +:10CE600026040194D671C794AA5C2CBB409EAB7972 +:10CE70009CB67A0ADBB76ACD3EBA1CE47B46AE802C +:10CE80007C40023E654012DA416ED85F28CD65EDE8 +:10CE90004B697B90BBD627981C527DE0067D51DD07 +:10CEA000B4AE10EB6F12DCD07F6B7331AEF765F967 +:10CEB00022C1EF9B8EA1FD51D6762C09E495CAE7DD +:10CEC0007A587FAB279AF13E2F55EE54397E53E6C0 +:10CED000F735595CA321AFFF41002A8AFC8A470835 +:10CEE000F3535B6494337F3E93CB37B78928CF07E6 +:10CEF000AFBD1DE5F0DC6621861C1728702EF96495 +:10CF0000907DEF93E3AD029763A61F4EDA995C170D +:10CF1000C07790E39D02F707993D689463552E2FE3 +:10CF200025BF155B0CF21C436E3BA5AE5B61DC7B41 +:10CF3000AEB522DC05DFDFFDCE3DA87F64CCFB284B +:10CF4000F8FE03C9A0EF4A2496AFA4E2B14A62F901 +:10CF50006CFDE058BF5449BD2C78F4703C657544B5 +:10CF6000F487087CCEEEE10A6C9291CF8D72F8F7CF +:10CF7000CACF3F4A9E0F73FE51E111F7B2F6903FC0 +:10CF800016A678FA6DCBB398A77AF6856337029E1A +:10CF90002BF650BEA5F33DD7E2E0F7BD04719D2905 +:10CFA0006F15310F9C48E1BC5B1C5AB96479481578 +:10CFB0002F39903FCA77B07CD2F2973F1A837922FB +:10CFC000CB7A31BF2AF002B737035D6380AFCB2540 +:10CFD000960F6594F35B6DCCFEECDE1D370BE621FE +:10CFE0006C61E7F4CB43B7CBC0876ABD1FDA64B589 +:10CFF0001EEE5F0628DFC2FE3AC0A73D77AEE641CF +:10D00000756F65725FDE26A3BF54BEA519E3D8FE17 +:10D010002D9F609E7BC14BDB307EE06F13F5798FD7 +:10D020005B44DCC7A24FDCAF32E61F56B756E17E49 +:10D030005B7588E7F719F2DF2A5EDAFB7280A2A639 +:10D04000E2D7CF3B410F9CEEDCEC047CD2FE306F8C +:10D05000F0FB9F49BABCA8D8F9BD5E7D3E6168650A +:10D06000D47CC2D3F00FCAE00FD838BFAA79985B3E +:10D0700006F03CED705E5194F87DDFB99D6D9F3FE9 +:10D080000379EEDD3BCE3C037057FEF5D367209F5E +:10D0900089ECB3E2BAE47FE1F79827ACB6FB858D63 +:10D0A000FBF95B9FC7FCEA73EF9BD1CF39B7F764FD +:10D0B0003AE4AF9DDBFE5532C4E3EEDD3B15E3956C +:10D0C000F7EE2C1844A2E877F5097C19BC8CFC6EAD +:10D0D000231D0EB61EC4BCABB3EF99519FF5E58579 +:10D0E00086AA589EAD9BE783B644CFA357F318ABEF +:10D0F0005B6FB9E95AD0CFADCC9EEBCB6BBC541E65 +:10D10000E8DB949ED75C06DD5A789EAF816E67E1BE +:10D110001F943E2103DD3E6F5DF0AB27E15BEB80AA +:10D120009879A0E1CBC0979AA7FF739B778F0DCE1C +:10D13000FDED880BA4307A05670860EF7D9E0EE751 +:10D140001A4EC9BD98EFD1BBD7EC827CC6F2BDEFB9 +:10D15000A27C9CDB7914E3AA84E7C99F237D7F2C02 +:10D16000AF59E0F3DBE460F9A31CEF905FEA76E2ED +:10D170007B9E47CAF856CD2F8D9557DA6B1BC6E2BA +:10D18000D0FCDC4015F593F8BD597DF9A6423ED0A0 +:10D19000E9982E4F579DB7B13F17D79B91FCE8E810 +:10D1A00079BB6ABE60844E6C1D51F39FCF35F3BCD2 +:10D1B00069FA3E6D2CE4C1B1F5DA1F14DE2551E4A5 +:10D1C00051CD8F3E6333E445072F2F2FFA52F0FEE7 +:10D1D000EFE2E3031B8B57AB78E9FE26BA3E56E23B +:10D1E00098DD49FD53390EF705987F7A37F74F558B +:10D1F0007CA9F0D68798DDD0BD85F9074679AE8E3B +:10D20000715F52121FA7BA6DFF18D03BDD0776730E +:10D210007E63FC5CDD728CE5DD52FD1CD4EA677E2A +:10D22000BF84B1BF74DE9FBF3D7A7FFE964FA2F6EA +:10D23000775AF2DE0EF09FEE6476D2E990382DDA5E +:10D24000FD36963859973F50EF60F765884E1BDAE8 +:10D2500047F73AF2DF8B4F82A782793D754B791EF3 +:10D26000D0CF3C78AF689D633A01781E02FC68E23B +:10D270000CB2CB47C04E93538A72457704DE3E7A98 +:10D28000249948504B7F299C06FAFC83EC9332F496 +:10D29000F79F86F8C87F4AA47E1085EB3F0382671C +:10D2A000A93BB65DAD967D3F1575F18C6A73EF07AE +:10D2B000609F9357ADB81F2EEEB306303EF60CBB01 +:10D2C00057E3E0CE2F9FC37B797E6526DC2E14408A +:10D2D0001F94F238C5C99D5F3EF35F604742633AD1 +:10D2E0007EE933B43ED8CF2D7168EFF7EC881F0389 +:10D2F0007180D2571FBC11F44529E83EB0335F1A44 +:10D3000014ACA3FD9D18C8CA27B60DC17301153B07 +:10D310001C984F7870E7AE6AD0F7E75E8A23A0EFDB +:10D32000CFCA5D7F85B27F4F3C6976A3DDE7D6AE7D +:10D33000AB0B89E4D6DA731550D6E5B710CC6FC1C4 +:10D34000F81BE5E78AB6783CFFA1A9C7E539309814 +:10D35000DF133518E48EDA8D6E7DDE33FB3E3F8EB3 +:10D36000E92FBFB9F77E761F02ABEF577A4B58B95A +:10D37000613093DB4EACBF48E557FEBD7FBFACBE0E +:10D380003F8EC50322FDB0F6D56676BF8691BE3FBF +:10D390008D13F879DCBF5C19EDFE8928F0B37BB9F9 +:10D3A000041280FB57C9762BE669552AE15190AFEC +:10D3B000FEB2C2F63F2A9DE15190AFBE87EBBF4A55 +:10D3C0001B2DD3F783391C501FCAC4D2F522DEEBC4 +:10D3D000B4CB8AF7E155BDEAF0A29FF0F297279E01 +:10D3E000CA857CB538CC93AE7AF55F90FE55E6F0F1 +:10D3F0005DC0FFBDDBCD783F69F7F6C3E9603774E8 +:10D40000CBE1F4C48BECEB5485CCBA7D6A751EA7D6 +:10D410006B974C8073BCEA39C3F218FAE2F5389680 +:10D42000D7D11CE7FD15D373FAFB654ED7CED2DDFD +:10D430009B586E89AEC75A402F68E27862E45C61FF +:10D440000BF47B9674D50FA624A9127A717FBC7C4D +:10D450004B461AF8BB07AC57E2BED501D98DFE206A +:10D460003CB5FAF854AD2747C2F3F499391285A3B5 +:10D47000A7F99392C104F203ADB3A2E9A7BD7171FC +:10D48000C84FE51673D4F39BBFE3FCB60DE46D1CE7 +:10D490001BCF931519F7801C54008E897637CEA7C1 +:10D4A0009CFA01EC9EA8D939DA73DB0BA506AC47D0 +:10D4B000E50BF1B190AC5772EDFDF5CAC225B93953 +:10D4C000520E2AACAFFBF84D8CD0890492D04E920C +:10D4D000380DC9FA545DBEBF241759005F0A29727E +:10D4E000492290BA01E5D44642F8B4533384AD439F +:10D4F0003504E2E3A7F8FEAC59723F8AF7CD748891 +:10D50000A8CF2F85B777E39C08B759AA211EB43757 +:10D5100066B8C01E13023EF22DE587BADA6939EC0F +:10D520005C38F142BE1BA6BE51F89CAE435F817DC4 +:10D5300040F98CDD63F57D12ACA3E3C131638CFF50 +:10D540004D66F7D91BC7FB86D38104F6EBEE3B870C +:10D55000BF5EF5FE3CF0D7E3FF9A0FFB317617096B +:10D5600083BD146727E1B831704F9E745A2BBF4EAC +:10D57000C2CAC3283B835E734DD47F37F235F1486E +:10D580009FF5E94511DB7F6668FFD9C5DAABF8F096 +:10D590005B367A8EE744F062E373084CF65CE8028F +:10D5A0007C8C717AEA808E4AEF070F023EC6D899CA +:10D5B0003F98D448B4FE5A8E9DE9ABE5FCFE69FA6B +:10D5C0005764D7F4475C168C8FAEE478EFABAFC6E8 +:10D5D0004DFAD5B74A80D77EF5ADB1EADBA2D77751 +:10D5E000C482272E3A3C0931FA0F44AF5FFDEABBF3 +:10D5F0006F84DDF092E90D08CEF373CB3976F0AF8E +:10D60000E23F482E665CC1F6030C74B301FF517E05 +:10D61000B08DD0BC87FFCBD2D06F5814FA9330F2C4 +:10D620005D31878796EDA914BE1F7370A76C62FBEE +:10D630009573EE6571A21F5B587EE9317E1FD09C09 +:10D6400046E657CF59C2F61149193BE7E3A2FFC19D +:10D650007877422794DE773608C17006DC5B63B0CA +:10D660005FFBEEC759A840FD6243DC45E527F53C6A +:10D67000D23C6E5F6770FE5C407A1D20F7C673EF88 +:10D68000AF71BDA6EAFDC03A9209E7F64593CD0316 +:10D69000FBA3223F674A9CEC3E3FE21DC2EE97533C +:10D6A000F3B832DDF1B0BE91107FCFF759165FEFBE +:10D6B0001EA43DA7255DB0E1FD2075B22705F4A0AD +:10D6C0007C81DA75D455532E0C236ECD39326ACF56 +:10D6D000A170CB2E765FA2E42A22A56007F2FB019F +:10D6E00048D2F43EBBEB4D8A87C5EBDC786E758182 +:10D6F0009DD999BF7014DD631F07F665BE87DD7382 +:10D70000ABA76360279B5F1DCC2FA33FDC758AC747 +:10D710008376E7746A31601CC783BFEF209ADDEF20 +:10D72000BA411EFF4D66BF57D00F0F8C7EE7931294 +:10D73000F15EF6F9CE551F009FAEE6F711AEA8CD0B +:10D74000C4E7AADA14B43BEB6B3DF854F162F13450 +:10D75000E0BD6F9611AC3F8BCBC7EC0A6ACB403E65 +:10D7600085E4AA0943D9925643C0DEB5F6E1A70184 +:10D77000F1A3F4957D5836BBD8EF46C88D3310CF52 +:10D78000B43D29A5DF173B7C4F829C58DD57EBEE5B +:10D790009133A78C35DC3768C09BCA1FDB18FED6D7 +:10D7A000088C3F8CF85B2377BA615F79CDF57DF704 +:10D7B000CE20FEA879CFF0F73BB6CF16137FAE444C +:10D7C000B45FE7E7D5DF55475F3DC2F7171FAECD22 +:10D7D000477CADE4F7483E54EBC5A708F8A3F33304 +:10D7E000670508DC8FCE7E1B823EED455EB87F1656 +:10D7F0007817F027DA193ECD2935B8BF66B1337CEA +:10D8000089F600E245B6337C8976C66F0A2F4B80D5 +:10D81000BF1C6C8FEF29FE0E007F59D226E8F0A5C1 +:10D82000244DBE3CFC3D41F147E148E2F265C44372 +:10D8300092C2EEA754E52A961DF7389D3FACDB1B3C +:10D840006A093E07C6F0178739D8BA9964AAD92F52 +:10D85000033E12095F4F02242D8FB0D443F84B09C9 +:10D860001037940506076918A2BB57527449867B86 +:10D87000D9DC1B800FD61F964D902F2F2E99AE3BD3 +:10D880000F2ACEF226B8119F3EBCA7F9915A37D283 +:10D890006F1DD011EE01E5FED7439C9E0FF37B2850 +:10D8A0005772F958C3E5E5512E2775FCDEE4D5D350 +:10D8B000589E5552B689DF571626DA3CA6044F8883 +:10D8C00028142EB4A9DDF8C47B16C97BE6E048DA3B +:10D8D0002E2E8B78814F12DE7B20C8EE6B2C4A05F2 +:10D8E0003B2841BD7F71A23B61361E840D4BCCEFBE +:10D8F000A0AA10FD984E53B47BAAEA3C072C100F47 +:10D900008D054F9CC79BF1101D2FAED181F6FB00FA +:10D910005FD1EC05B46C6F8CC3F85F1CFF7D163BC8 +:10D9200085BB5443EF58F7506F745C1FEFA0F4743D +:10D93000018CF4F958E370FC5D96C7E522FC1D9755 +:10D94000C7F97AAADE73AEB6FB9AEB4767EED53A13 +:10D95000BF75BDECC576AE897AF95FCFF56DE2147F +:10D960003D9FABFAF6789FBEF50D0378922F4C41A0 +:10D970003D96747374BD5B272B786F79DD6826E75D +:10D980008162859D6BE9AF07304E7DDE376A23E803 +:10D990005195AF9611A67702C4E6C17588DF6FA3D3 +:10D9A000DAC12BE01E40AE5FE1298E60BF3F903CA4 +:10D9B00087DDE7BB9ADF63B596F215C17B4F3DF873 +:10D9C0009CEE60FB13CB2C63F13EB53ABB09F584AA +:10D9D000F4BE39082687B47FBC0BE20592ECE9F46B +:10D9E00042BCCF2185E0DEDC3A7B2EDEFB2E24E438 +:10D9F000BA80FE5F38E60FBD583E1D9D28DE97E9D0 +:10DA00004A2A221F66E16E009E5F915D3713881BD4 +:10DA10006E48AAB102DEC63B585CBFB1380FF14870 +:10DA2000F17B936360A49F41B3A6F7DD8305DD6EB0 +:10DA300088710EE60E07B397485A808CD0C879A338 +:10DA4000FA3B27EE00C9D4C8FBB2918504F687FAE9 +:10DA5000CB790C3DB699E9B1E542743DA6DA99AAB5 +:10DA60001E930DFA417DD60F9DA63BA7A524798074 +:10DA700077E1193079C0BE7BB9FE8E04C4430DE056 +:10DA800081A44CEFF35F7F300CECC7BCA8FC66D4DC +:10DA90005FF3FBD6736F32D0E994EC1E341BF8E9C8 +:10DAA00070F4F57CD263573D0A7C30FF77A2A0DD8D +:10DAB0004F29BDB002D7D3920BF9F82C6B9C867C12 +:10DAC0004F200AAEF1C34E36DDE704B84E36F23CC5 +:10DAD00080263908F919271BEFC3FB4A20CF5BD4F6 +:10DAE000ECEF935C37DA97EA3D632783F738B5FBB1 +:10DAF000BB25BFB07AC16E8DC55F254DD1FD7A586B +:10DB000043217E4A01CC047B98DA37BD61B07F3671 +:10DB10009A3D011229071EB346CD4F5CEC98FA38A6 +:10DB2000E07DB1C3FB34C839B1B37B4163F3391B2A +:10DB3000F7046C02C37ED3933C4F53F239B5F7BB65 +:10DB4000F5DDC7C9E324C412E3BB4DFD7D8318DFB7 +:10DB50009D2C9F83B8A27F57FD84B8889FD006F381 +:10DB6000A86A3C53FF3EE289FB091CEE533283FB5B +:10DB7000D47366F63B3706BE38C5F347160A0CAFBA +:10DB80002A7F9FEAB3777C780F8D91FF848D576D44 +:10DB9000184FFBFDB443C6385C25E51FE01B61E36D +:10DBA00078CC5F171E1BFF28E4257D7644C4EFE583 +:10DBB000172CF8BDFB679E0D7320CEF3BA8CF7755A +:10DBC0007FD631359EC579F471E8054EB6CE9FE615 +:10DBD000725F726115F2671F7F342C5040AE4A2E7F +:10DBE000AC457BA6648B80F7449240EFA14912E7D5 +:10DBF000C309D0FE6CE132C0F7C406DCDF28DD6C5F +:10DC0000F6AC12FAD3F9B4C3ADBB57BDB46B35F65D +:10DC10004BA83D95A4D9EF3EC5F3804B2FB0FB0137 +:10DC2000892B405280EFB9DE89F0AFFEDED76E6BF4 +:10DC3000F438FBD7DC9E29B93041E73744E6F77D5D +:10DC4000269F7C3D2FEDCA6770F5CD67C3F868F35A +:10DC500089CC6322B6EF4E883E7E06C7F389DA325E +:10DC600038B941CA1456AFA4E13E05F449495342BC +:10DC7000A2A099576963852E0FA3B4A95899ABE95F +:10DC8000374207DB6F278D88D02163AD7CDD323BC7 +:10DC9000ACF7450E278CB77161DE4FDCD01FD33F48 +:10DCA0001FCB0DE935A85FEE71463BD790E174EBD1 +:10DCB000E24AA58D9C3ED44ECED5D047A58BB1FD72 +:10DCC00089E6D2BC9F403CF909762B486CBD63A025 +:10DCD0005B4674BC4DE8C35B26E6035D1A6FDFD17B +:10DCE000E5FDF4C31BA7AF8A17F53DB58F72005F42 +:10DCF0001320E03410FA61F4BF14BE22E372FA4F2D +:10DD00008A3E0F5FDF3C969000B51FE65F721E0FE4 +:10DD10009280E522F350E94FAED6D1DFB776E475B5 +:10DD200020872ABDE71F7802F9773E9547D8973FAD +:10DD3000D9709F6E7D88C01783EE2302242BEFFFDE +:10DD40001CDD3F9603E990F71558C7D691531B1F6A +:10DD500049D7E279B163D202A00BD934F0B2D68FA1 +:10DD6000C0644F871BD72519E361BB1D3EBF93BE1F +:10DD70002FE37EF5F284C251D1D67DEA174E84F8A6 +:10DD8000735DEDB489106F93B9DD08BFAC05F6265D +:10DD90005C811EED7EAD064ED7876A6B307E4D2CC2 +:10DDA00001E2D29EF725CC2EFA9AB0788BDA4E910A +:10DDB0007D2E887F2A0229427B4EF2ADC8C8853865 +:10DDC0004652764083BFB54E66D7AD4E39E0827C71 +:10DDD0005233ED1FE2319634E9BC7E9F9295B385B4 +:10DDE000F132CC474E0A118C6766D1F71A7C2B4969 +:10DDF00014CE8BF89B92C589FB451261769A3A7FC7 +:10DE0000FA06D7B387F9BAB40CE2B849608799D05B +:10DE10001F5ACFE394BFAC2DE27890701D3327B02A +:10DE2000FA4A3C83DB0A716B11D6D530961D70C35C +:10DE30008E885793E1EF8F261037FE4EDF0012AE2B +:10DE4000C77B4C2675DD0FEFBD71BE2DC0075FA4EB +:10DE5000767E20401CBAC87725ACBF8D6220DB4D92 +:10DE6000EBFF4AECCD867AF0FB5EEF25B2E750C8B7 +:10DE70005BF669F6A5D8BD9C6E6D5CCF581EBA44A2 +:10DE800032ECD77C73A5F67B739C7717C091F49125 +:10DE900080FB30755676AF4F9DE3B67858BF8F72D2 +:10DEA0007A21FD817F3A981D735E72C727627C33A9 +:10DEB00033E735DDF81E5D59E2FEDB26CA8F92E6B8 +:10DEC0005ED61192D704FC32B281BED7D22F4A5C03 +:10DED0002DD18ED7DF46DD8751E1A3E312C09F78B5 +:10DEE000A190ADAF063ED82330F8030EEE6F9180BF +:10DEF00008F49CADDE172C2D6765F5F722808A1497 +:10DF00008EF7D5FD05B29C95F93EA57F2EDB8734B3 +:10DF1000C233BBFDE14E88EBCF6E4F9D07FB53B381 +:10DF2000EDA3FE0CCF3D72EF8138B003EF13F0FC90 +:10DF3000C78F7FFF9A1C479F3BDFDE88E78DCF723C +:10DF4000B9BB8BF4E23DEC3EE2E2FBE4417C3F17DF +:10DF50007E600ECB2119FCF439E1E08F6EA0A53B69 +:10DF60005F0BDE0066DB5D1DBDBF0135E00BB90A4E +:10DF7000710F406DD7E639C4CAAC5D040F166E8FC1 +:10DF80005A705E91795B100FEFF7E58D07901E7D5B +:10DF900078E2F72AA978E99B77FC6DD321CE1B4B59 +:10DFA0009FCDB667FE996D7E30B88C78FA0C3E51E5 +:10DFB0003BF233A7D71A4FF5DB474EAF0D9E959630 +:10DFC000DE746918CA8B13CAD5A26F6832C5C3D96B +:10DFD00021BE2B07023E3A075C961EFDC0CAF40024 +:10DFE000C94DC7F9A8F7BE1F7CE0A403ECCEFA9D8B +:10DFF000EFA6C3B34AEC5A733BC63745F487CEB796 +:10E000005E79D1F3611F40DC89AE7F23E3553E6426 +:10E01000F3BB9B9FAFB9BB350ECFD7DCBD44D4DD7E +:10E02000DB7CF712967747A4CE31B7EAECF5E53101 +:10E03000FB813880B19F794B26938F06C03EAB6B36 +:10E0400012C6059E61FC356F8A57847CE4092B0457 +:10E050008CB78C3FEE6EEBA2E579C104FCBDA379D1 +:10E060000F2CCE817B08AA3B597C6F90B828FB67A8 +:10E07000103F39C0D671282F02F9B67BDD764DBC32 +:10E08000BF5BAEC9867BF70277DABDC03FC5B77A02 +:10E09000DFC7FB1C781C425D57773516631E6BF19A +:10E0A0001C773ED0BD3864C5DF1F2CB610C946F5BD +:10E0B00058B1442CF01CA410C90A4F1BB1C0336FD7 +:10E0C00019BB27BBA47126DA07CEFC2205EEBF2DB3 +:10E0D0006E7FFE73685F2A85F7B3732D0C3FC5ED25 +:10E0E00087BF02FE59E02DC2BCC3EF6C5174FEDF46 +:10E0F000E890BE7C4D9BBE9C1DD697733AF4E5AD6F +:10E1000070C799C68E38B0D78CEB44C519764EEFE0 +:10E110001501D62688079B519E0A2ADAF3603FFA3A +:10E12000CC8B0E137CDFF317E6F7F66EB5E27D6F4E +:10E13000FBFF602336C82B7CC9BA11BE9FB185F2A4 +:10E14000200E47EBB3DFD92A0A8D02FFEDE5AB5570 +:10E150003F3D3806E6F5F25F599E4CEF5633FE7EA2 +:10E16000CA99DDCFBF08FB6267B65E8176D62B42C7 +:10E17000C004FD065632FA1BF9B4628BDE2FBE3F97 +:10E180009EE99B1E81E1FBCA46FDBCAF0AEACB3F7C +:10E190008F67FED45CA2799F01FBF7EEFA14585703 +:10E1A0009F8D7EDFF0435C2E5E784151F956E4F797 +:10E1B000B311B7E6FCD29EC8FEDDBD57405E05E058 +:10E1C0006258E47D85615CB5FFA278B60F9FC4F705 +:10E1D000677A5F17113FA70DBF5BD867D7D5D6A465 +:10E1E0004ED1AC43258DFB938BC13F6ADA9F3C57E0 +:10E1F000B3BE546E3D987C07E62549F8BB4C95B3F9 +:10E200009F5B3B2109DE8B218017BE43DCAB3BF4D7 +:10E210001B27D4A3F6EE585183F7D2C6FB52A7684A +:10E22000E4F46FE54B559E2AB97DB22BBFB310F2D3 +:10E23000C42B1AD9EF3755847E740BFCFE22696219 +:10E24000E74CF324522452F9A9DCFEA31FC2EF715C +:10E25000F99F1EE701786817B7C2FB8A964FF03C1A +:10E26000C12AC3EF08A8CF7D9CBEB47ED844EBAFD3 +:10E27000BACD5E06FA89F6FB1A940F646EC4FB4DA4 +:10E280009CA7589C96BE7F0F7E12E5D4E4C01B77F6 +:10E29000D0A66748E89D1B3260DE7A3EA37C2B80C7 +:10E2A000DDD5BB59C0DFB5A59656DECD60527B9754 +:10E2B00062DE2DFD7E77B4F3CE0B83FA7E8CF4FF05 +:10E2C00003E75FFA97A9E52363BD013302782EB116 +:10E2D0007209D5771A3BBFF27803DEE7681C078323 +:10E2E000709A7C03582FDD28DF56F5FE21C192C7B6 +:10E2F000F36687B332DE5B08FC4A19A5E26A32C5D1 +:10E300000DF8BE994C83E72B4278AD28323D8171E0 +:10E31000A06D71A827BA5D5DCF3D05FCD5321AE32B +:10E320004F83F979CF6E7718EF79ECE1F1C96E1769 +:10E330002B97B75B310FE6CC5905F5E8D2D04127D2 +:10E34000D0A3FB45AB097E97F4CCF60193214FB2E5 +:10E350003BC4EEFF3D1D1A80BFFF1A6BDD32EA039E +:10E36000759D3C06FF84F534DEFB35ACB76439CBD4 +:10E37000231D34A0263BDAEF49A8ED92949A6CF065 +:10E3800053FE17A753B28F00800000001F8B0800B8 +:10E3900000000000000BDD7D0B7854D5B5F03E7316 +:10E3A000CEBC92996466324926218F09841020E000 +:10E3B00024860814EB24040C187542D1A2B63880C8 +:10E3C0004080BC44DB46A55F2624424251428D0872 +:10E3D000087140B1F48A6DB0A8C106EF80F86AB543 +:10E3E00037DADE5EB5FDB92370295A1E23F452DBFD +:10E3F000DBD67FADB5F799993349AABDF7B6FFF7DC +:10E40000FDE9478FFBECC7597BADB5D75A7BADB55E +:10E41000F744BE6EF1EC2D60F01728509C8C5DF235 +:10E42000BB3C9BA0BC4482573318333A7C465B3AD2 +:10E4300063D672C6BCF0CFF186BC5786FA53B2E7FA +:10E440009BB6718CDDC57C0686CF72BF818D853E03 +:10E450009DD0388BB1650A0B290E782EF4BE2F4D56 +:10E46000A53263D07FD92E29D801FDEFDA6C64CCB8 +:10E47000C4E8EF33F8B7A217CAC5B1F22A16343090 +:10E4800019FE63575C3B187F95123A2AA530B6DA1D +:10E49000C442C930EEEAA7B4FDD6B010C1D370E0D3 +:10E4A0003363FCF8303FC600B4FF64EABCBC6EDBEB +:10E4B00034C69C0628C3BC236FEB838887FF907DFE +:10E4C00034AF35CC4FE3DCDE5AC54EA531D67C5F88 +:10E4D0006BD65DF0BCD87A7FD65D57433DC201DF75 +:10E4E000B730DE9FC1BCF601CED654B3502EC0B7B4 +:10E4F0001CE69B5406E541293405CB26164829E342 +:10E50000EF53CBF87CBD71F0D5B31EFA5EFD2EED56 +:10E510007BF68B34C267031BA27AF6545C3DE0A302 +:10E5200041E0A1E100BC8FC3C3CC0352C07A159671 +:10E53000821D19005FD359C63641A9E9D06746CD7F +:10E54000F8AC8731C04366126366A0D7A3125BD4D0 +:10E550005F42FD26D64D8136F8771D96DBA9DD0991 +:10E5600081BF476F5991E587765BEC50CE16089EC8 +:10E570000EDFD0E1C7A91C32C17792AE8E96A9BE3C +:10E58000623D2FD7D98A6BB6E730B64DEFCFB201D7 +:10E590001297C9BED77480BF271DFE5B90DF96E936 +:10E5A000BC790ACE97798B7C00076BE57878ACACA8 +:10E5B00065624B490CAE187C9CBEDBA4FE900EF845 +:10E5C0002C7058F2EC7323DF46F47E4BAC5DB34DF8 +:10E5D000A279A41E0BBF3606E9FEBCC4F642BB1DE1 +:10E5E000D287AF8D817E3BE6B95907945D4027B94C +:10E5F0000CDFB34E09F0527EA8EEEE5791CEE549FE +:10E600009EF1F0683C5429375A68FE77FA009ECC98 +:10E61000E4963D3AA8CFBCB3B80CF91BE67DE702FF +:10E62000787FAFCD4DDFCBB270BABBD6070AD69696 +:10E63000E0F77D77BF0ADF8B4C49F2E0F7330157F3 +:10E6400056073DBBCCD88EB54BD8EED1143E7EBA22 +:10E650004EBEB30ECB65BCEC582779F712F36DA50F +:10E6600079671A590DC289EF8325B464BC07A93EA6 +:10E67000C8E93BBBA514C7CB1CC79F4E432807C79F +:10E68000794BA5F760968E6520BCF0DF00CFBD0703 +:10E690002B331DD0FFAD732645970A4F176343D820 +:10E6A0004E0959183E0B8B797B93685F3A3B1317E1 +:10E6B00083334FDBEEA2DE9B7A35E025F08ECC90E3 +:10E6C0001EBFB37853EDD0EE4B063E8F443AF62191 +:10E6D0007D603ECD9F02E46971745B74C580E33553 +:10E6E0007FAAB0E0D5B1F7E7DA4C2C58142B37D419 +:10E6F0001F9B8BED1AD9D006E4ABC6FE64168CE3E3 +:10E70000F72F258DFC5D95BF9B3FD5B1401AB16FAA +:10E710008ECF8AF8896C588EF01F91D83E86F50608 +:10E720001688FB7EF3A70E6D390A67068D136BC73B +:10E73000B4ED067E4FEDD8F4700A7EE7822D9CE2A0 +:10E7400010F3C37ED9326B41BA5C0CEA027A58C727 +:10E7500017DCBCFE226335FD96587B75BC0B8B0C19 +:10E760002C44788FD0B8889700C8B69D839F18DC5A +:10E77000506E183C4A7851F9211E3F8138B991D129 +:10E780003114D2C19AFE856D5557891948714C5D77 +:10E79000BF6BBABCB3A05ED669D6737279747D9331 +:10E7A000587954270B79D0D0553D2BBECCDBC7FA16 +:10E7B00037D654C3FA2F2FE1FD4FD89ADE58AFC495 +:10E7C000E411CC230FF1122D9B12CA16284F892B6E +:10E7D000DB12EA9D09F5AE84720E6F7FCE1ACA93E2 +:10E7E0003D8C7D645B5BA3807C3997155A2C417905 +:10E7F00073C7BD35D520E71ACB87BC32CACF41C914 +:10E8000023B118FE9A3CCC1B04FC593C61C3B212E4 +:10E81000C4C3D06BB8FE1B06249B047C6EE93F1872 +:10E82000A232F673C7F5EB97A85F43FF87D46FD486 +:10E83000F18B75B48E37159FA4768000DB69A0D369 +:10E840005799C45201A5058AFF8FA8BF1AFB7FC341 +:10E85000F52E8B18F8FCB81CBC90E57D85E4E01122 +:10E86000C986EB2ECA7738AE25C6EF6AFB5F4D1915 +:10E87000FC571C26F9DE4FDA1568FF7F1A7F338DAF +:10E8800001A97E854D66A05C0D4E447DBC93F927A1 +:10E89000A21EFA7AE3F8A33A6877421FDECD005F42 +:10E8A000C5F64D350AB43B610DE74A2043266DEDB0 +:10E8B000E5E5F4F06EC46760EBA384DF13B9E15CB7 +:10E8C0001D94A7DA43BC3C3EBC1BCBB76E7D86973C +:10E8D000A7847365E83F3670A0A61ACAFB6C23AF05 +:10E8E000D77C3B97E32A7C97C779B3EDE9C8765C80 +:10E8F0004FECD603C6401E2E5EFDF1B3FB000F8B1E +:10E90000EF4F2639B5EFDC57E6FB68FE019F520159 +:10E91000F290B33ED763248F15B203B250773962B9 +:10E92000F4B0E60DB949CE4F6A3988FA3E737109E1 +:10E93000C9F94F53BDEDF669B1E72719F00438DA8C +:10E94000ED362E97659D97DA3F6025BB678B99CF93 +:10E9500007D60DD1D722E8512EE6536ED7D133CF4B +:10E960003687C6FB40F2EE30C9F8640133D27355E6 +:10E9700012D91977EC01B90072B957C0DDBB7562C5 +:10E980003000E3DF21311FCA8D5EBB370BE5C30BBF +:10E990007F91EFC4F9F69642199E3F16F2BEB7CEAC +:10E9A0009B658FD38BBD7B78BD2A777A0B787F559B +:10E9B000DF6476F0EF646E99B817E791AC302F966C +:10E9C000972F2ADADB4E7A7B01CD9B79BD5912CC89 +:10E9D000F7F4AAB13AB42355FAA4157A6FC2F9DC58 +:10E9E0008EE35B627452BFDF8EF346BD2F83DE87FA +:10E9F000F93EE0F0D3FCC10E984A76A0B003DA717C +:10EA0000BED362F8654A781ABEFFFF084FF760FD73 +:10EA1000FF144F23C88B00B66B6C0579A18B93173D +:10EA2000027FDBA4903E93CB0B0FEA397CBF00E45E +:10EA3000E3ED36FF468447FDFEE2071AC9EE53E1D7 +:10EA40004AFED68B355F65C3D759A25D76E203D304 +:10EA500066067AEC84A19FE4E289F9CCD38EF24376 +:10EA6000C7EA118FAA5D5971FF9AB718D8B397ED0D +:10EA700032D1B95BF266E1BCBA81AE26D4C37586E9 +:10EA8000E0BE82985EECB50777AC40BADE52E20990 +:10EA9000B8493FD27A0BB42653BB5E7B9829583FC6 +:10EAA000C36D034890CE448FC86D86E05E09E9CD02 +:10EAB000F9A577D5A4604022BA07A8FF6D9C7F7A9C +:10EAC000EB18D9F7BDB7B9886FCC2C68467846E308 +:10EAD000838C0E467CC414EFD43A6B0C0F3F13EBBF +:10EAE0003AB93CFCFCBFA11DB9D94C7624EA4CDCF8 +:10EAF00077B19E4C8217E8F902F187BA5F7A242B2E +:10EB0000B889F6679E0AA4C746AB7709C1FFED64D2 +:10EB100037C2BFCBCCBA4C65B8FD609D24EF043C36 +:10EB2000ACE73186F6D99DC23EFBF7FA4B56B403EB +:10EB30005EB573FB0A19C504F26F29E3F54BD725BF +:10EB40007F88FB99A5EBE49011F62BAC6B8E371CFC +:10EB5000B7CF208E82F1FC425EB2ED112BF28D1FF9 +:10EB6000FBA5E0F87FB4BA2D5886FE5391ECD0BFD8 +:10EB700038D6FF3DB16E17CB1C7ED696EC46FC26F0 +:10EB8000CAF5F754F87A1EF3C67F4FFD4EE2B8B0CF +:10EB90008F7B1FF105780FA5A23DFF6D99E89A08BC +:10EBA000AFD31079C80CF58BDB64FB7AC0A7BFD557 +:10EBB0004AF355E1BD3333722DEDAF12C63F93DCFE +:10EBC00054A1E0FCC5FE83ADD3EEBF1833C4CAC068 +:10EBD00017CB5984F631C3DE8B7D6BE2BE8FB1BF9C +:10EBE00018E3DBA9EB85B9A504F8055FB92505E9AC +:10EBF000E69738DDA2F44E805BC5A7EC18199F4E4E +:10EC0000433817E595BFD5487848ECAFEABDC7CC87 +:10EC1000B03E80AFB64B12F1E3F6FB92498F311351 +:10EC2000A763F3EA2437F2E74E43E4695A372F1912 +:10EC300019D2F5A239F202C9A342EE37B8F83379F6 +:10EC40000FB6BB90CEF9FAC2613DAD270E0CD83B92 +:10EC50003F93F752BDC4C7BDD09EECC6F5D88C9883 +:10EC600084EF3707FEAB8D01FE4EE9F83EB87940E0 +:10EC7000BBDFBD00FFEACB6272E122E3DF090C706B +:10EC80003900335D45DFB923896D82719B7492171A +:10EC9000EDA3A6D593821D9C5F4CB85E1A04484D27 +:10ECA0003AD8F795C5D67793EE6411EE9B1A4C9B34 +:10ECB00087E414AA3F8EFB2D86FB25E8B71A3B1587 +:10ECC0000CE7E7A6CDBFFD33C2DD74484BF78618CD +:10ECD0007F489F49D83F8E5F0A627C40F635CA87DD +:10ECE0006A161C2F713F0C96936B8682E887691613 +:10ECF000FE89F463E1B9C81FD6F27EB6149ECD67D3 +:10ED0000B97D317370CF2BB8CFB5D70CE5E2349B0A +:10ED10005BD75E7DFAEA187D5538670C6E9571FFFA +:10ED2000A6DA2571FBC7890BA6C43FD7533FDC8FFA +:10ED3000E2F7C2F80AD785C2F5D936A1CF40EF91E4 +:10ED4000DC5DDE3381F41EEA25945FEA7E16E51968 +:10ED5000CA8F271D558B1C30CF92B4AAAF38A6F1AD +:10ED6000EF901D8F9BA019C3F199A857D476B8AF27 +:10ED70006DB18CDE2EEAE7D991CAE583225179C5BF +:10ED80004FF57B36117C0AF1CBDADD05246F557F18 +:10ED90004C83F043AD10FE9B15C27FB372BB91B99B +:10EDA000E3FD55416DB941ACF74616E67EACFD502A +:10EDB0001FEFB7A966212BD6A3FF069FFDDAFECD74 +:10EDC0002C385B41FA0E7C668C7FCF7AF97CEF148D +:10EDD00074DF61E67E9B99EBF6C8DC19C5E79B5AA8 +:10EDE000E62D7810F5C49B7AF22FFC87A0938A1742 +:10EDF000A3A3EAEB88EF24DC8F61BB078D8497D354 +:10EE0000A08F0F0ABFC602DC67B6F9B30A0B113D2B +:10EE1000B6BC05D6E1F8DDF492B91EF965B343A797 +:10EE2000E1A72A879ECAE4EF41BCB727935D0D682E +:10EE30009E8A7C543156D5936C2AFA993ED483BD70 +:10EE400005E5A65B2D7E1C2F8C7601947708F9B51D +:10EE5000C361A0F1D472741F27F805BE43E3A1DF9C +:10EE6000C517C707C168FBADC25EE47261DBAA24A7 +:10EE7000924731BED531E2DB129F01FD452F0939A2 +:10EE8000F2122094F651FD662E47142E9F5E3A3BF7 +:10EE900089E4DE1B1FAF26B972695112334AD4DEF2 +:10EEA0002B61FDF3C6E07A28DF25FCA82F49DC0E94 +:10EEB0000C1CB1D2380D06FF0EF42B343C37DE03A8 +:10EEC00014632F1882DF7F1AEB5F3693DFAA218548 +:10EED000C3D9F0D21892933FD6079FF901F9218C3C +:10EEE000649F3524B953A9FE27690CEBBB92FD83BF +:10EEF00048CF6C23B71B1B0CA1223BE0F16490DBD5 +:10EF0000BF2751D0E0F88356B26B00CC2CFCFEA991 +:10EF1000EE4CCF26770C2FA71E9A4CFCBF4DCFE9A5 +:10EF20001638CCFD9A27F5BEB959503EF97CA90791 +:10EF3000768EECA2CF1032008CCD5BB8BDB64CE71C +:10EF4000EE6B45D9F472B247B3DF7C78652DD637C6 +:10EF5000AF5E7713CAC1D1D633CAF3787FED0516F9 +:10EF6000C9A3FD66FDD8FE107CF7C2E0440FA94797 +:10EF7000E60262039FD878DBD37AC037F2D7113D1F +:10EF8000F1EF171D1FE78BFB3FD42FF89D6690BF55 +:10EF9000513F32C9DFB8B23C5299D3B3F9A54C61A5 +:10EFA0009F69EBEF48F55F40B9D6F4DDDF9F682538 +:10EFB000FC4648FEB11EEE1F3FADF72E463EB5574C +:10EFC000870C4BE3F6B78634BE8E9619855E6721B3 +:10EFD00043FCBA53EB2BAAB47CAE3EF5697C1F69A7 +:10EFE0001DE2727C78BD4EAC9BAF18516F71D70D8E +:10EFF000ECA7CF727F8621CD4DF533CF860CCBA009 +:10F000009CBF2E6458219EB82E00DF2113CCFBF448 +:10F010000E2B5FCF80061C67C57446F6C80A19EC34 +:10F02000D0327CEF1E08035DCE3C6FE7FCF527C0B5 +:10F030000AE07B0913ED8C60B782DC7AB1530AA138 +:10F040005DBF64BB71AFB900D7B157B6223D774BF6 +:10F0500024B796745616ED80F2EA435388FE29D3FE +:10F06000395FAE0EDA49FFCD147270993168203BDA +:10F07000FA19EEA783F1C91E6E804E5965C3F1805F +:10F08000F25BC30F416D9C6166BF90A7FBE3E20B8F +:10F0900063E3E47A7F427FB0E3B4FC1150F50E974E +:10F0A00073CC9D89724E95C34687AF348DE452610F +:10F0B00026D217E8C9E5E44189F0DAC85AB8DE106B +:10F0C000F23EFA5DA12FCEC801AE978C5BE93937CD +:10F0D000AD80E8B61AF50DF9CDF9FE6E343E989B79 +:10F0E000A6137271643EB85EF041C35916BA16BEDB +:10F0F000D7B08E851AA7F2A7752AE941AE0F4D2227 +:10F100009E61E2F18ECFD38B897A7098DE4BD077F7 +:10F110009906A1DF049DE3FDD9A8EF67AE0BCAE80D +:10F12000D7CCB379AFCD4C8FD92FCDEF994CEEAB77 +:10F13000B0EC63632DE89FA97CC685FE5DD88FE3A4 +:10F14000BA4A06BCEC81F7BB55FBD6C5E7EB32707B +:10F15000FED52B3E566A41BA0CD17E3592CE6CC894 +:10F160008F2A3E775BA15F19F6E3EB2DDADFC43A15 +:10F1700093E2FA57BD6426B97AE5B0356824BBC37B +:10F180009F6F87F1327E65243BF4C24B56D29F17A6 +:10F1900084FE73AAFB7EB681E8D38A744D476EAABB +:10F1A0001A83FE5326CD1F832250B5C31AEDA3F94F +:10F1B000B3457DC1D0AD9CAF8CB45FBC620F7F13F3 +:10F1C000CB000F43FBBA05E98CFEF643B34B1F801F +:10F1D000F7CD3E8B8763DF5F8AFC6A94EFBD15FD38 +:10F1E0002A73E57591FB601E8DB9169B11BA54E721 +:10F1F000FFFA97B741F9A3437A66443AEF9BBD887B +:10F200008D1D5DFEAE0AEA4F86E3D6CB9AFDDA721B +:10F2100063BFB6DCCC9493E13879FC589AD5796613 +:10F2200032C90ECF67C0DF4663CBD93D00AFF1C70F +:10F2300046D2470D69FE5D69E837D5455E433C1B04 +:10F24000F3CF4D453F4555FE9F28AE73E5DBCC839C +:10F25000705F315792FEBEB2C3EC0EC4C9AF66C137 +:10F26000FFBD79B554DFBBD3E896787DEDB40AB421 +:10F2700007E9DBF867D201FE9BB7CFFB88F64D6844 +:10F28000B543B917ED4BECF79C146C47FB713BD7BA +:10F290007BE7C17E34A1FE14EBA9591E9C6B82FF53 +:10F2A000EC75D44C44F9A2FC59F121FD37E25071C0 +:10F2B000F6EEE1E8FAE47E9C1BD08F338EFC3887B3 +:10F2C000516E349AC2864A18E7BA3FFF8EE4F2CAFA +:10F2D000D6A564D7C7EC5C23C99195F7F9E9FD2B56 +:10F2E0003BAEA7799D8179237ECEECE6FBB99539BB +:10F2F0009620C2779D9DDBBF2BA19F240DC74B227B +:10F300001E7EB3EB7A17D2FB378C7F2FD0CFED84E4 +:10F31000DFD8865248FEB85B52D0CE6BDE7EFD470A +:10F3200028B756EE963DA8C7D9112BF93D56EE9E4B +:10F330003371B905C7B99C568978EB9B6393E9BDD6 +:10F34000EC0B72FFC9D075F05EE9BBC68DEBE4F83B +:10F350006E2387CF6E7A1AE1BFEECF32F1BDA26382 +:10F360007EB4577B0DDE89B8DEDCBBF6CD45BCFE36 +:10F37000A62E5B47ED9F95980DF1606FCDC0F72BE2 +:10F3800025C587EBAB7EFBAADA787BA4334D267CC0 +:10F3900057E6AFCB085B88DF6F453DD7B85B4F764C +:10F3A000DDF1051FFCF236678CDF57CA3DB7CE8C06 +:10F3B000B3379A77DD28F8013436E069A5C0933178 +:10F3C0007F5D117EF7F3F87FE5FA96221E8FF9EB49 +:10F3D000EB20BABE77F1F5F007D0F7B45FCF7168D4 +:10F3E000ECFBD1F641AABFD9E461DE7D168A1B7A17 +:10F3F000719F9BE754A83ECFC9ED6CE50F6BF7BF3B +:10F400000DF0F7A7F98D4E789FCFBCA5485777C46C +:10F410005605E6244E89EC1FB6CBC8ED4985FBDDC9 +:10F42000B6A5B3A737C5C1998DE3A5D3FAB43961A1 +:10F43000DC0BEFFFE935C45F53DEB9A93C9EF63B18 +:10F440008A4F590679DCD2E2F131E48BE6C13A7693 +:10F4500057494C1E367BB8BC4E9CD77227DF6734A9 +:10F460003B23344E753A5F67AABF77676B12F9F595 +:10F47000763A8366BEBF0D3094E73795CB3CDE22EB +:10F48000EC129FF09399BCAF308CC7308FEC190F02 +:10F49000E521EFA9CE3428BF5D3EC72343D9E27DE5 +:10F4A000B26B2CCEDBA317F5E3C85FF8D6AC4AB23B +:10F4B0004F6EF2CAF45D569F42FBF521EFCF9D7768 +:10F4C000C1776F66DEB4D3F08D1A50D648C721FCE1 +:10F4D00036DA018ABFDC19E75FBDD1332FED74BC8A +:10F4E000BEF472FD8FFBF17E113718090F25699567 +:10F4F0003311BFD77D99D3E1E367F9FEE36333F7B7 +:10F5000063ABED3EB6723D53EB94841DD89F87727A +:10F510003E5AFE5AB1260EEC34F4E7E13AFBADA4B4 +:10F520001D6775978EE2B3ABBA18C5633FFEFE8BBD +:10F5300079286F3FDAF762DED238F812FBA9CF5B89 +:10F540009D5ABF94EA87748AB8F4528F91FBFB46A8 +:10F55000F143AAEDD976BE1FBB08D21DF94EED7757 +:10F56000B13EC98B76E545662279B67450F835BD53 +:10F57000DE4227EE1FD4FE09E36F41FE01B8A4016D +:10F5800089F6E7C9251192AFAB4CBED7C6B8312F6B +:10F59000C54BF499877494905FBD069CB722F679A9 +:10F5A00046C5D788F45CDEA3A56396D326E2944EC5 +:10F5B000A2BBA1C9A2A07EC8E810F2FA1B3ADABF2A +:10F5C00018B25D16944BD715257562DCDD9994321F +:10F5D00015FDE6B9D9C5D43E50C5F93A90C1C86FFA +:10F5E00095C55A2492B736EEE7CE99CE6C98E7F1DE +:10F5F000A293DB832EE6D92E933DD82F91BF5FCC0B +:10F600005F95EBC82F28E73E964CC42FD2A044F656 +:10F610009DACEB5F8CE38EC63FBD09FCD3FB0FE6D0 +:10F620009F3EF57BC3F8C74F71BAA52ED3C8FC2304 +:10F63000FCAA5FB8FD6871C26F98543FB384F3AD04 +:10F6400015E3D59A2C21792AC98773F1FED45D6020 +:10F6500067E27E448D2B8EE958E2E676FA5018F781 +:10F66000E5C9D79848CF7D47375480F67C629C1116 +:10F67000286B47798F3286FC8AAD55BED36971FA03 +:10F68000FE08DF3734DDE7A5F7B307B97E6F2E3408 +:10F6900090DDD93C200590CE4D3E43D0544071952D +:10F6A00025A4B71F32BB799CC4DD4E71926FBB7924 +:10F6B0001C25EA470DF73D80FC566F21BF4362BC15 +:10F6C000E585BFC8FCFBE3197DBFB794C7777AE730 +:10F6D000B9C9AF911847635DDAF5ABC6512E5A012F +:10F6E00031F0BDA59BCD44876C99E399A59AB87E6E +:10F6F000192E07C85F9B315D1046C43BA2EB1A244C +:10F700000396B345BD1A9FB196F80AD0C2BD3DED30 +:10F71000B93793D2FF967C86D6EFFCD57C8680B134 +:10F7200016F3194C683D8B7A041BF4AD5AF69ADD3A +:10F7300018BF89D52B60379A0624F1BDE76F98531F +:10F74000087890D4EFAFDFE4B550BC58F3BD78F83B +:10F750009484F1F530BEC52DDA070ECC9BA3505C26 +:10F7600052D47FD68DF91B5BF4DAF108A5A23F16BF +:10F77000D4EF1DCF9CFB9DCD3931BD0F7680297D07 +:10F780005A4CFF6FFCA0B6E72AF856B2EDB201F56D +:10F79000AAAAC79B9D3CBF2171BD3AD2F97A05FB4D +:10F7A000D5914E7283DBB5B5223E09F6EC5C5C5A0E +:10F7B000CDEB7C0CE393602F64A4631EC3FBE7CE08 +:10F7C0001C45FA2DF898ECF9E64F15EE7701BB03CE +:10F7D000ED7393E07336A0277DABF2C16A217F7A87 +:10F7E000EDA0EF915F8F48D302C4172D79B7000DBC +:10F7F000EE4FF7BA697CB1EF4A8477463AF7933413 +:10F800001757ED28C2F19F9218EAFB4DC52733D058 +:10F810002E691EFC3063795CBF55038F121E56EDB6 +:10F82000D78F38FF19E9DCBE6C3AFC3CF9073F0E74 +:10F830004AB496EB9560F74C28D7D7EBD04263E5F6 +:10F84000C125B791BF7F91818D87F9E50B7DD4BC30 +:10F85000FF2B8199B83F837F12BCDAE95B417A6F55 +:10F86000E7229305E30ECDC54BEF263CD892BC882A +:10F87000874DC55559F89DA6BAB9368A13807D853E +:10F88000F54DF7DD4E7E1315AE4D03FA1AB4BB2AC3 +:10F89000C0CEFA11C09DEB985FE381F537463E5824 +:10F8A0007A8F05E3C223CBDF7FC9E0F4EC947C813F +:10F8B0009BCBC94FC8E2FD7EF903DC9EAB4B37689A +:10F8C000FCC275E9DCCE9C15189A8DBCF7B2124EBD +:10F8D00046BBB799793FC1FD25F359DCFB884E5CE7 +:10F8E0008E38DBDCE43F3239C3DFB90AEB6729B479 +:10F8F0007F604AF811FCEE856EA7671313FC8BE559 +:10F90000FB4A822847FF39DDBF18F9AC42D88F1770 +:10F910000E5F5F8A7E36D53EEADE630E621CB0DB88 +:10F92000EAFE6E0DCAC13F283CEE6D8A0CCD467AC8 +:10F93000FCD141E3769B83DD48FFC0563DD51FB621 +:10F94000FA5721DF9CADAB29A2BC1B4BA008E3BC3E +:10F950007A670F433B01B60BE44F30397D0CE3A1CE +:10F96000B3034B1409E57C82DD315BE48F92F084B4 +:10F97000F755428C8D072E3863A225D0F9595ACC01 +:10F980000E79E34F0B157CA9DA273A138F67552FB1 +:10F990004A6232F2FD86C86B3AF45F3B87C87E6DDF +:10F9A000EC97E83B8DC5CF513ED81A917714CDFF27 +:10F9B00051C2940FB53E3D59E8F14ECEEF6C88F63A +:10F9C000CBEC00A7276361CA938AED23DAA99D3A9D +:10F9D0009E41F8DD1B85DF053418D53F94AEDA076C +:10F9E000EBC553CDEBE2DFDD260D7965C46BA9A431 +:10F9F000F117ABCFA7D2B97D987A2C3217D76FE425 +:10FA0000B09AA7C9F330774C9BE441D369589EE67E +:10FA1000C02773916FC0D0A6F5DA34F0C5F234BFB9 +:10FA20002FF60DFFEB799A1EC9BB179E3F4AB7739D +:10FA3000BF959AA7E9E1F853E36C89F99917B242A7 +:10FA40000ACFB70AF7ED43FE1C30521E57EDC0EB4C +:10FA5000EFA17EAC35B17E8C4326DA196DB6AF0CC2 +:10FA600022DF5F3C7FA6EF418679BA2F78285F239B +:10FA7000C17E48DC27ECC52659A3DB7BEF46E9C9EC +:10FA8000EDBD68F97FDDDEE3F67C601FCF0F50E54A +:10FA900079B3D89F5DACBF94827AE644149E843CCF +:10FAA00086A7441EC3E0C8790C8AC807027B3D4084 +:10FAB0007C7290C775DE783A99E4C7259BB217ED42 +:10FAC000A5F3D6C83711598AB0933A8F18DD282F7D +:10FAD00040DE91FC0E1CD4F3380DC66D308EF3F26F +:10FAE0004411C711F1A29792C96E694871A7627F4C +:10FAF000354EF363A16F1A92787CA62BD97F397D9E +:10FB000084B8CD1E617FED81A16C38DE7B4611C7C4 +:10FB1000060181FB9D877279DC41C46D2E8AB8CDC8 +:10FB2000A9625DC8C0FD10E4A77277292C0BEADD3D +:10FB3000EF99836EEECF32E940EF2F53E3362F7308 +:10FB40003FD532119F39B5602EE5072DC7FC7719D7 +:10FB5000FD18DCCF1CCDC767361DCE670D888B9D89 +:10FB600028620280F56BE0B5A493D09E707742992D +:10FB70008C656F4F0D7C7769A78EF623CBBAB4FEE8 +:10FB8000F22B9BEEAE41FDBDB193C71F035D12E9A1 +:10FB9000EF65CCEB427B43E587828C34A273A053A4 +:10FBA000E7C5EFCCC8E0FE04407D90E6279E9D7A35 +:10FBB000E1671770B4335D089F3A893F37DA949A4A +:10FBC00011F5B218AF53DF62AA443B3657477EDEC9 +:10FBD0002B06EF22F2933A8A886E9DD696AE1A5E75 +:10FBE0004F6BE58A39E2A3FA6B156EE831B703E58E +:10FBF00064668688DF24CC77798FB69C187F581589 +:10FC0000D4969731FF842C3C87B05FFB3E3383CB87 +:10FC1000A92B9B0A849FDF437EFE4EBDFBDD029431 +:10FC200053DD0AC9C9F61C8E2F5D2E7F8EB5572F66 +:10FC300022FBC00E7605C1CBE11F7BAD53427DD9BF +:10FC400069E77CF93F853B11DECA8C226E27A071E3 +:10FC500087EBA85B0A727C71B8BFA8BF626986F0A7 +:10FC60001708F9132DFFEFEF37393F76CB62BDD977 +:10FC700048FE2C15F1C65392E7E910BEB7805D002F +:10FC8000702FEB96CBD03E99FD150BCDA3E9657394 +:10FC9000D008F58DEBC279B88E9AAAC2452D23E023 +:10FCA00015A15554B905ED963A617F80EBB64B1B13 +:10FCB000871A1E57F47E2B231DF721A70EBE8EF444 +:10FCC0003E6826BD04FF75D488FE8EC305642F4DA3 +:10FCD0004DF5B765A03E4F0AF57DAF00ED136E1FE1 +:10FCE000350E1AF7A0FDB7B4537B6E866DD6C6B934 +:10FCF000589783FC19AC57FB1ECFA768FA0D8B7B76 +:10FD0000713DBFCDE09F8876DD755FE6F1F5F3AB21 +:10FD1000740CE9BB4CF6AC403972DEACB5BBCF5BC2 +:10FD200039BDFAA274F614219DFB46A5B3A708E9D4 +:10FD3000BC4CC7FCF1E334229DAFC6EC734EE7F335 +:10FD4000CF5F5384743E77F09A22A4F3367D8F17E9 +:10FD5000D7CD930EFF5EC4CFE9393EB29BD4BCC968 +:10FD60002FCA8F8732B4FA305AFE3BF93F46D3830D +:10FD7000A1281C5A3DE834B873501E2E3519FFAA2D +:10FD80003EC4BF11FD692623F9235EFED3E58751EA +:10FD9000BF050665B23FD4F15E56FCE3D05FF0F2DA +:10FDA0007B2E4F401A7DFC066157B94C2C807E0F8C +:10FDB000D5DE57EDC64479FC0B319FD319DE1AB45A +:10FDC000B355FF6CBD18D314BCCCEDD3A724F2BF40 +:10FDD0009ADCFD3C7FFEC8121BFA67CF06B93FB61E +:10FDE000E9F952F2D7AE0ABE12C2FC273628D97002 +:10FDF000DFB0EAA90F53309E0DFBD0531971F19576 +:10FE000039621F7A36782A05E3DEF0FD6AFC7EB29D +:10FE1000336240FE6D82FD1934614D4A84CE0D354A +:10FE20003919E9FBF201ED7E4D8D4FEEF41948DEF4 +:10FE3000ED1C9482B83FCB30F80B72503FB11CDB05 +:10FE400099E4D87AF924C36BCB9C161F17F65ECEC3 +:10FE500088CB570AEF48253E0CEB9997EC801D564E +:10FE6000219778BCE63F77D9833C7F89B7FFCF6085 +:10FE70000195557DBD429CC35B21CEE1A1FC0E25C1 +:10FE8000C8EFF87234DEAC9E3703791E1A29FE1DC6 +:10FE900097B714DFBF8945447EDE6746CDB8D17C75 +:10FEA0009D965237C0BDE66B163A67D80C7CDD5A7A +:10FEB00016E3C3063115950F9B845FB7B9FE24ED99 +:10FEC000039AF17C05DA551ECE870DB03FC2FCCDFA +:10FED000C475CBFAB5F98CA3ADE329995ABD122D9F +:10FEE000FF83FC98D333B5EB579DBFEA078FCE73E2 +:10FEF00050E2EB2B615E89FBCA44FFB5BA2FFCA22E +:10FF000072EDE64CAD5C8B96FFC172ED8ECCD1E408 +:10FF10009A363EF037CBB5C4384121F77F639C0059 +:10FF2000E3B6FFD338C147EE9E0C1DCFC3D7C44FF5 +:10FF3000BBA4969B4CE330AEC8E3CB8D5623C56182 +:10FF400013E3AACDEEB9228E38F4CB19A8370FE906 +:10FF500019EAF37ACB4A8A5736CB070C78A4705843 +:10FF60003C51394A76FBDF1A575F9F198DAB1760FA +:10FF70005CFD15CBE5347F1C3DAB4AC0C02F193D5D +:10FF8000DF68B3A053B2C88B302901668FEB3F5AAC +:10FF9000BFDE4C6E27BF22F2635C069EC7BEC50A59 +:10FFA000FB3098BF4BC7F377EE4FF76D43F968729C +:10FFB00073FC3E71F8AB0CCF1D3DA1EF27391268E1 +:10FFC000B478501EAA7E17757C45F80FBE28DFFF57 +:10FFD0002081EF7FF077E6FB447C0CA872E76F8D01 +:10FFE000876D07DC68D607A3B8D75B18CF2918CE72 +:10FFF000C7A38D331A3FFF34D3F75A26C947EF54AE +:020000022000DC +:10000000CACBFD82F226B93C720AFD3BEC90D18D41 +:10001000FB0D933897C13667893C4A4F451DE51360 +:10002000F3730DEAF98FD1ECC20FA3729ADB851F2F +:100030008E2AA7FF7B76E1030EDF299CE7E94A6F52 +:1000400011EACD8D56801FF77BDF378E78CE423D8B +:100050000F00FCC4CF9B3CCBE3E0897CF58704FD1B +:10006000F287BFB37E194D9EEA5D2A1C7F67795ADD +:10007000FFC714F47B8E3E4E80E0A8A81AF28AB81F +:1000800015C3B8913A8FE6219E7F9621F2AAD4F744 +:10009000116117DEE9F266BAA0FFB9F74D26960A9C +:1000A0002610F218DA633E0BC5039AFA799E48D3FC +:1000B0003A46715FF51C65D3401D43BBAF3FCD5F32 +:1000C0008079601B3FB004E454F4932F6068EF5DC7 +:1000D000789F971BD2FCE3294F6C5D581377A8F8E3 +:1000E000ECF206F46700BCE41F708AFC4C15BE3AC3 +:1000F000179767EAF32681EFE8BC9C1C4ED62F07C2 +:10010000D14E4C760F911FA9E91037DE2A642FF9E2 +:10011000EBD91A079D9F683A54594AE7CDFBCDA504 +:1001200068E756FCAAD686FE8973D73A29CF204FB6 +:100130000EAF423BEB9FD3FDB3105E6B79701EDABE +:10014000A9F960A7A2DD7BEEE0BC527F9CBF7B1BC0 +:10015000FABB61DC6D56AD3F9B99789E78FD5E9E43 +:10016000077CD8EA9F8BF8DD66E6F006B68ABC67A6 +:10017000E1E74E5CFFEABA8F9E73BCC344716955D8 +:100180002E6CD3333FEA3D559E94883C39C007CF4F +:10019000D31BACE3F91EA26C716AF3154F67CC292F +:1001A00041784AD0D13B0DEF518848E8775F2EE285 +:1001B000F0D78B7C0A357FCAA8F8BE8EEDD9BA9AE3 +:1001C00058FC7D2CF617F177912793FC29B79FC730 +:1001D000DA0CC43756585FE41F01BE41FACC8A0CD2 +:1001E000CDC6F34485BDA15988CF973FD5113E9424 +:1001F000BAB7287E928A648371C66D0E774F403FEE +:100200008AED17D7225DDC3DB62A445D7F9AAF9117 +:10021000E0505A8A715F59F5AF7A9E07782499FCAD +:1002200003BD790D940778E103E388E746D467803E +:10023000ADA7BCBFB1033F273FBEF59034623E6718 +:1002400097CBC2CF0D078628BF8CCD72123E942368 +:10025000BFA2B8AFD2AD9007A353EFD5E139A84004 +:100260003B23FFE5F85E9B0EE9922FF24B2EBEFC7E +:100270005F53FDB44F51FDF6419E0FA40F6FC07D3B +:1002800097D21EFE32AC60D678C8AE6B2AC1F1227E +:100290004D3CAF3D99219FE40F8C5BFF2528E7770C +:1002A000D99884F2E7A535F9E42F85798E1F619EF0 +:1002B00077BB78FE8E722459877A4BD9CA28FF50B3 +:1002C000B1675411DC8F4219C65923F8468D470295 +:1002D000B82ED44777BAFCBB11CFD17332AD49FCED +:1002E0009C8C3877696DFDE0593C7FD267E0E70C64 +:1002F0008FBD3C7901F9EDBA1509E970C5BE24DF5F +:1003000006EFF78B756B558698CD128FFF63946F50 +:1003100039F608CF4B53F49C4F946EE71EF40B7ED6 +:100320009AEAA7BCD26B3B4332C5B36CA71FA97135 +:10033000C7ED6BB6733DD2B49FEFA713F7319FA7FC +:100340003F8EBAB47649B4FC0FB24BDE4AD01B7F65 +:10035000F3FE8469F77589F649E23E6E98DD9D30BB +:10036000DE68768A9AD75115FB0EF1C32B56D50E4F +:100370000A68F25EAA2CE2DC9B493BFE53224F47FF +:10038000CD83C9E870B7635E79E4DB8CFC6C6A3EB0 +:100390004EA08AEF1B023A139D8773B11ECAC31980 +:1003A000C3429244F67F98CE7566623E0EF47BDFC0 +:1003B0003596E0DECD3C5D32C943B784709B318F0A +:1003C00083F236833B56E0776EB1D077CC98C77115 +:1003D0003586E2BD3B507ECEAEE771886CD0B7C8A3 +:1003E000B7D9859C0FCD8B783E879AAFA1E657A8E9 +:1003F00078A812F8CD9EB0A200F707DD92FFFBEAC5 +:1004000079DAF873D2D1F3D1ABC6D27993E8F9B9DE +:100410004226EABFD839E9447CAAF91D5536BF2DDA +:100420002B7DF87959953FE2E84670ED3CC2EDF539 +:10043000AA7A03C17F71D57CF2235E5CA563B86E96 +:10044000AA068D9CDF12BEB7337A0F46D04CF75DFB +:1004500008BA7F9EBD0AF42C463FEDB1B69AAB4F69 +:10046000036E8FB7F9E879D12CF5CB57D179C6C592 +:1004700028992E67EDACC57B0A2E5A237978CFC117 +:10048000E5EC076FA4727AE4049653761EBA11EF76 +:100490003DB8383ED287F71E14EEACE4F5C883D9D8 +:1004A0008C5D9555716380E6CDFD4EB363E7B3CBAC +:1004B000113F8D2CBC6188FC3B3C7F1FF3FD900EEF +:1004C0002E8B81EC1997C8B364D522EF12233050DC +:1004D000EEC82AA578B585B90F0D617D0E3F2704BA +:1004E000F5C4BF1DE3B95FD824E8CA72543F52383F +:1004F00080F2A9A3C04EFDA372F49031C8FD59FC4F +:10050000FBEF3C3F85E24B6AFE2863B6DC8553284F +:10051000DF445356EF37608A2D17ED850EBDB04B83 +:1005200045392DD55F97156717BD33E75B25B80EA5 +:10053000CEBFF04021CAA5EB0D60B78F20877E9D0E +:10054000CDE5D045BDA54B023BEDE729FEDB719C17 +:10055000F79217CFB5C3BC16A5551AEC086FE0FB90 +:1005600032CAC574416FFB420E9FBDDA272D8771D9 +:100570003BCCB07EA17FBA5FF1529EBD7FA1740BD0 +:10058000C0DD2171790B9D52695F52EC4EC5FCE5CF +:1005900006715E5216EB7E46FF5619EDE977DB06D3 +:1005A000662A8531F87E2EE2CB3F2F6077D68DB05C +:1005B000DF6DCDE2727B81EC9E827CB4411A78AB18 +:1005C000360BDFBBE9FD9C94D672CC3BBE3EB9A591 +:1005D0001CF5CFB0F7A9F0BE24AE6CE4ED1A4C9137 +:1005E0003C3C9FEC4DF6AFCBC2B8D0920F296EF9D0 +:1005F000CDEC774E60DEC13BFA9ED929A85F0AC4D4 +:10060000B97EE1377C6D82EA3734F1F264EE378CE3 +:10061000E6734DE1F964B50BF939C55A91AF30D79E +:10062000C6CFF5CC2D2FF074008837B18882726F59 +:10063000EE7BBE14DCB7B385FE72DF94D1ED19E614 +:10064000D2BBE3D7EB3C775C19FEDD50AC2DDFE885 +:10065000D1966F9EFEE709F1E53DC9DE1D38EF1F1B +:100660004B3CFF313083D9689E4E298076C7E41712 +:10067000B3C5F94E9EA7F74F625FF4E27446F519D1 +:10068000FB4D7B31FF5DF533CBA27EB28B99F21D22 +:10069000FCBE00D4571149E4FB392996C25EB8DB91 +:1006A000C6F1076D0D30CE0B4BDCB43E322C3AF662 +:1006B000655C43E526B2432AC69892906F8E09BEC8 +:1006C00053CFEBAA7C58A1301FE62FC0A717E2F347 +:1006D0001DBDED28FA97031F31C6E955A950FEA1AB +:1006E000F81663ED547E4CF0F7310153E0DB0AADB0 +:1006F000E757AD06A2A7FC13790FEA098CCDA0DF5E +:10070000F8D2E649049FBA7E6055173A33C8A52D42 +:10071000C655740844B1B02754FE460B08DB8DC1A2 +:10072000FF2C203E27791399C6EF4FF879019727C0 +:1007300091AD0E711E8CC7CB724DD171BD386E5606 +:10074000F43BFCBC51862843554807F3FE4D560147 +:1007500097CB83AFFF81F4B2C5E3C7EF18524C7457 +:100760004E465D37B6CEDFBE553B03E759F40D9AD2 +:10077000E77CAB0DE7590C6CBDC8414F6F1A8DC7B4 +:10078000D78F9CE471E33AF94ACDE1994A1CDF40E6 +:10079000FF46DE3F59DBDF05FD1D71FD53A07FC91C +:1007A000F0FE4F594D21DD541CA7C21D26791EA213 +:1007B000C9CC17F3923378BFF9221FB43005DAA3FE +:1007C000BE29D6E66BB0E91E13BFAF439B9F71BD38 +:1007D000B42E0BD7D53C53E36018C67B5DD0ED7AC1 +:1007E0009DFF77783FDDEB8B8B8EE37AAB31051580 +:1007F000DC0FDDC0421B9098172BFD4FD8C7913CF2 +:10080000F80BAE8B26D93FC101E5F3FA9EC2BB0BB4 +:1008100068BD7C96356D38BC2A5FA8F0227F209F8A +:1008200045F92301EE289D6EEAA744B6DD60F7E0A6 +:1008300053B583186BE1F9C6EEDCD8BC8089E69A23 +:100840005A0AD10E79BD3D4072E37AFB2394D7F466 +:10085000E7317E6736C0B5E8AA4FE85E13E65A3244 +:1008600001ED7B80373D3BFDFF1DBCAABD372CDF72 +:10087000F6238326DF76B475A57EB799F1FB69660A +:100880000FEEA1FCD9E685160F9E8368C6FCCF72D9 +:100890008A2F911D87E784E99E13C924ECAE2F9A15 +:1008A00097CBD7616FA39BECB7A81C1779E5BDA5C3 +:1008B0001CEEDEBBDDEA3D27DCBE5BC2F83D29EA6B +:1008C0003D27CB6D54AFE69FF7EEE17EBCDEE72718 +:1008D000D07929B0DFC85E60A93A0E5F81F67E1537 +:1008E000FC933262F9D2DBF4DCDEDCA9F354209E07 +:1008F00077621CE8AFC47FBF9AADF59BA8E544BF03 +:10090000DE930EFFEDC817CB4BBC7912F0CF32034C +:10091000F7DB017FEDC2B31535ACE529BC3F701E96 +:100920006BF9856E1CF1979FF86BF227FC5EC1187E +:100930007F2DE1FC1520A1A4F25794AF8A13F3ABED +:10094000FCABB17DAFBDFF574D68A70E1A892E6A6B +:100950009E5CE23A8E83E7B49EC3E394658267EDC2 +:1009600048F07C113E8FE7AF4CC6F979347ECF5406 +:1009700058C05A16E3F73DC9FE76843FCAF71BF804 +:100980007E6418DCB285F8E3D6DB649E3F9ECCF52E +:1009900015C62BB2E0FB75E2FBB776733EBAD56A9B +:1009A00020BEAB1B6CA47C2256CDE30E1EF81FDFCD +:1009B000077A09BF8B44BF85CE523DB2ECC25A6D57 +:1009C0007C6291458D7FF8F4B81E6F5DA83F19AF2A +:1009D000EF17B1CD9F60DEDB228C63A8FDE0BB8FFB +:1009E0006747E31813308E715CECD32F027F23FF2F +:1009F000BF9ABE72D7DDC0B7131E2F29437FCE9C8E +:100A00008C554F6D85F2F7764EA2F2AB1977DCFB71 +:100A10000ED6F71551B91A2F71C1FD4623EF5F5C51 +:100A200071DBFC02F8EE71B31817D715EEFB92FCE0 +:100A3000BD75D0CE35756C19E623560BF970F16E85 +:100A40009E0F7FC355569EE2B9D24D7EA3EA245134 +:100A5000FF753EEE5BA5FF568679A9D563238BE92A +:100A60003EC6B21F4FC2F271E993C523C54D26178A +:100A70004BA189809F6A076F5F5BF6FD6CDCC757EF +:100A800057F1F2644F65F738ACD75D5A3CD2B9D014 +:100A90009F8AF5143DF724D6E98BDE0FE99C93CFAE +:100AA0002479708ABEE91FF27B892C920DFD8F3E5E +:100AB0006F81827ED2D95E9EB758656ACFC2FDEF44 +:100AC0004D7E4339E69FDA4CA5C7D1CE489D5E39AD +:100AD0000DE93BDBC4F4A89780CFFF85F8FC9A4F63 +:100AE000F25290B92C5A3E57F9A84EE5EF6A2D1FE5 +:100AF000C3FAFCD7ECF4CF97AFA3F1317CFFDFB1A1 +:100B0000FFA22F69F54A74BC84F59638FE6872001E +:100B1000FFE2E55C0C8E7E5A57399815360ED75D8C +:100B20008FBAEE220887413744E73EF225CF243AB8 +:100B3000F0388AFE57E1CB05D9C6CA86C3857F8ABD +:100B40006A9771086CB60CFC2EAF877E5EE688C192 +:100B500005DF676350EF6FE0F0EC965AB8DC107673 +:100B6000B1BA3F6E52E73BA09D6F45123FEFEC429A +:100B7000FF05F673964EFA6B70370BBDB9D0E47B68 +:100B8000C80873B8C5BE8CF8E1AB2CF03CDA27C6B8 +:100B900054BF634C3AEEBB0247C205E4CFA5BC018B +:100BA000A077DA9838FB44852B111F4DA3C8C344A6 +:100BB000B813F110A3CF10D957EAF9A9E8BC12E68F +:100BC000D361E5EB3532CDA8DE5F528CEBE26D6987 +:100BD0009227DE9E7E3B416F27C2A5DA11AA5E55A1 +:100BE000E1417F11FF7EA41DCF90DD38662CD99D99 +:100BF0002ADF640AB80C3A69C438EA8D6374AA7FA4 +:100C00004E43C7C4734E2ABED4BCA0443CA9793D10 +:100C1000C3E23509F1C8D1DA49603F8F710CC79F33 +:100C20001AEF7144FD5C029FA512C93F87F073CD96 +:100C3000F6F0F309B5ADFC9C7C6D0D4C0070FFB671 +:100C4000F01FA8787EC8EEBF8DF347781AEED3BFA9 +:100C50003BEF698A73A8F7C825E267F928F8198D70 +:100C6000CF47833F2DD5B712BF7B5E1AAAC0CA2DCE +:100C7000E9E2FE41E62FC07560B71554A21F02E4F9 +:100C8000EA679FE1660EAB80AEE50E7F33F2F9575F +:100C9000996F0ED2D751E3D773FF3A23FFED5AB1C4 +:100CA000DF9A23F4EDA55D32C507AABD131F9B850E +:100CB00076E21B7A16A4F5EE25FDB946C07F099FA2 +:100CC000D8DEC2F5EECA377F54012B864DD8AE8BE5 +:100CD000DDAF00FF26069334F72B4CDEEFD094A750 +:100CE000F4676BDA5F353056535F1A9AA4A9BFFADE +:100CF0008D324D79DAD04C4DFB6BDEABD2946784EC +:100D0000E76BDA7FE9EC024DF9DAC8ED9AF6A7C491 +:100D1000BE9805BC43C51978BF389FEF759F2ED587 +:100D2000F4FB6DCADC37900FEFDACCF3972B01336D +:100D30009A7B267AB85DD102FFE374F52988AF1556 +:100D4000606F63DEF2CAED5ABBA37E70EB0694A51A +:100D5000897915AB594B155E49979857516D5BA230 +:100D600043BEFBA731C2EEB8865D23EE85F9AB74B6 +:100D70002D62E3FF5B7435BAB47435BBB5744D2E88 +:100D8000D6D2D5EAD1D23575BA96AE76AF96AE69DF +:100D9000355ABAA6FBB474CD5CA4A56B965F4BD74D +:100DA00031F55ABAE6B668E99ADFAAA55F4160B59F +:100DB000965E09F456E5E5B8AEB59A7651BAFBEA07 +:100DC000291F667CCFFD9A7155BA07E07F9CEE2DF6 +:100DD00094AFFEB7D29DB120F95F13E97E3681DE74 +:100DE000A0AF3E42B90076C6397C2E9A20EC79DF5E +:100DF000C876862A7FE2F57AFCBE7534B9344C8F0A +:100E0000897DECA87A2C611FFB3E66F1907DB49938 +:100E1000FC3CB709FEBC8CAF66A01FF507A49FDFA2 +:100E20000740A6035CEF23DCF09DF79326939FE138 +:100E30000E16D2D3BDBF98890883DE8989C932DEF8 +:100E4000E7E3A6E732A1BF970B3F8437D99F92C350 +:100E5000FD0FF919F8DD9C217EFFF25B695FE89ECA +:100E60008293E887079D721AFDF0F0BC60E6FC7083 +:100E700046950F5EE676C6E16DE96C89F4323A7C00 +:100E8000703FBBF4AB12C51996FE9E3FC7E770BB1F +:100E900037F1D9D1AAE28DEF876EC87193FECD618B +:100EA000FDC27E637ECB381A87FBCD9FE4F78F3E71 +:100EB0002B3165BA838E49111D334D1CAE67F5CCBD +:100EC00084F87B86F9DD8897EF28209A789EFE24A7 +:100ED000E487A5BF7F672CFAB164D97513DE2F3D77 +:100EE0001DBF0770CCF95A8B847EDD4C578B847EF6 +:100EF000A361EF0FDD2FE1F9C26899F176F88778E9 +:100F000050FD73C53A1EA78EDCCDF7174F7D9D911E +:100F1000DFA9A3355019C0F8940C0607E6B1E8F92B +:100F200079E41B72B8DF2D8B0DD1BDA6EC356117AE +:100F30008AFBE04B44DEFB0511E759B1C7C4304FD3 +:100F4000A2E4E05107C67556002D87509F297EBA4E +:100F50005FA364C7AB0E7ECFB8DE8EE7D8543D3AB0 +:100F60003ABD1576262E7F1CE8D832921E5F93CBB1 +:100F7000E3B31D6D35B3302EA3C2F3609B7716F239 +:100F800087AC7818C693F0DE9DF8FC338313EAE350 +:100F9000D6AF62A9D194F5161F5D66B1A1AD85F8F3 +:100FA0004C2FEE07DA98B3D616FFBB01AB7374E291 +:100FB0001EF200433B9B8B7A7C2A67503EFC91F1EA +:100FC0007DA8D105E3C4CBB57BF358BC5FB9ABCDED +:100FD00047F06E90FC7E1CC458C842E614CC5BC03F +:100FE000B397F07EC7F56F601E8DC1BAD613728FAE +:100FF0008E37A34BB9122F971EC801B9941C934B7F +:10100000DF6D3B4B78EA685B44DF037C318C9F05E6 +:10101000B2B87DDAD1B684DEEBC0CE427E7A65C747 +:1010200084A36EA83F01FFF09E1CA393C3C5CAF31F +:10103000483F2D167C803EAB5CE09F13AD7AE2B357 +:101040007B722D415C84F7BC3DFE28DEF369005EB7 +:1010500092FF06B8A3DF11783208B904FCE4C3F5A7 +:1010600066C856C8FFEBB02D203AFD77C753F16B29 +:101070003033BA87C6906B21BFCD1785F37B390912 +:101080007ABE3C8FE4E83D022FAFECE0794727EED3 +:101090006564BFDE731FF7BFDDD3C828FF9BB5C2F1 +:1010A0005F458C6F54799D8E3781C0CB9E3610344E +:1010B000458C3DDC66C293572C19FD64E36274ECE9 +:1010C000F12A7674C76FAD76D6E1F3E1E9A77B50DC +:1010D000AC6C99F5BB217CA28F1BBF6F6B6141B4D7 +:1010E0003329160BDFB7D74319BE9F22EA53FCBC46 +:1010F0009C2AEA5317F172AEF739A91A014B88837B +:10110000E45A1CF30A51EEDDC5F8B95B71EE7EB707 +:1011100090BB632C8EBA6AACFF1AA37C7CB5FE71BF +:10112000519F6539D9350EE5F2426DFF1D020F99C9 +:1011300096933DB3295EA2AD57E31BE9964B6F50E2 +:10114000FF126DFDA3A2BFD572696836D6176ABFBC +:10115000FF90A84FB67079C87CFCFE54B5FE3BA248 +:10116000DE8CF5F87D8FB6BE5B7CBF430A127DE84E +:101170008E585C3FE9DC5FDAD7C6AEC5F5D3D3162F +:10118000A175F470DBA7442709992C3DB6AE6CAD70 +:101190006CC4F3E092906729EEB0D73B82BC53EB6E +:1011A0001D367EDE5D7619888F8C16212FC43A8C11 +:1011B000CA0BA9C5C3998BFBB13F8F9F61815D416C +:1011C000FB220FFE909F73EED5317F9CDCCA6E48E8 +:1011D00062FEB8F6AEBB1C9A72C6D7B235ED9D0B57 +:1011E000C76AEA2DE59334F5CC9B4BEB65ADE0ABDC +:1011F000A492324DBD7A0E9FF5E46AEC677DE14C16 +:101200004DBB4BC56EFAFD9033F3D4DF19F1985006 +:101210002EACB58ECD44BDF34CDB7434B2D9B3B033 +:101220009EF0E8D4013BCF2F3E807159B4D7DBBC90 +:10123000F47E1FD483E5C29E84F5E686F67BDA6CE5 +:10124000547EA2CD45CFDD6D6E7A3EDE564CF53B29 +:10125000DA3C547E0CC6C7E7A3300EBE7FA4AD8631 +:10126000CA5BDB7C54DED2B688CA0FB5F9E9F99DBA +:10127000B67A7ADFDDD642E58D6DADF47CB02D40D7 +:10128000CF8EB62EAABF46D0FB8038C778A0929FDB +:101290004B4EA4E3AC5C49732F9835963F302B1727 +:1012A000F307FAC39AFBDD71DE349E99CF3F71BC20 +:1012B0003A1C0FBE3B890DB527F3754C71C7F1037E +:1012C0009EF5C9C0EF635A381D0A0622549F55CFB8 +:1012D000695127E065CE00CBA9E0C750B1DD0569B3 +:1012E000A82A99C76129BF8CB9609E15E27E1C624D +:1012F000BBA00EE152A673BDA9D2353A6F3B87134E +:10130000E73F12BC5F13F397CBFBF9FD17353D2187 +:1013100064FB246F0BDD7F615AE40BE1EF57387DEE +:101320007E3A8F3FE9D3B9B0B90139F3E997991BF8 +:101330009E390DDA7D4FF65D659AFD85FCE9C3CCDB +:101340007D358C5BA2DD9F2415AED5F433E5DCAF93 +:10135000A93738D76BEA97AE29D8E0427C8E611462 +:101360009F316E6E6718525CDEBB95E0DA24F07E2A +:101370004172D379DEC041353ECFEDF3EF09BDC2F6 +:101380004C9B693D4CB0F362516A40877AE1DC8F37 +:1013900052491E3DFD842E88FED7892CA8C3F53FF7 +:1013A00019CC3DAC9F8237E8CA74A58A8CE552E619 +:1013B00096B17C358BD0FE04ECF3F5B9DC3E7FC2F0 +:1013C0008CF1C15CFFF778DE5288F46691A06791DA +:1013D000BA1FD9AE24FA65BB72890FB5E7993A8571 +:1013E0009DDE6EAFC8C4B8E88551F2CAACAE993381 +:1013F000F177B4AC59D3E9A9BE7FC8AD1BF19CEE1F +:10140000E3025F2ADF4F0426177CFF38CEE37CF926 +:10141000BB19B8DD6B2A8C10FF5F90BCAE2588D756 +:101420003765CE878359342F45E0553958E95A023C +:10143000F853DE1EE709B0D8779E6EF3CE54945869 +:10144000B948E445EE6FAB9B591DF7FE75014F316E +:101450001BAA41FD545CA2F304696497467E990B74 +:101460007BBC78CE5C29631E146F1359CF7AD4D518 +:10147000CA5F64CA73518ECD606ED817582C21860E +:101480007941AF47E7C934BFAFF43B5B752ADD173D +:10149000981D957BA813F1F79486907F7ED7ABE7D4 +:1014A000F33AA6AD2FB6F0FC9D15C586A05BC2B081 +:1014B0007A0FDD8BA7F4490C4D7FE52FB3090FECB4 +:1014C0008564E2BFE4ED53E94AED9B14FF0F91BE42 +:1014D000E743EE1774E3042F42BBC6C986BD688F8D +:1014E0004D40BCE0840A8B09AFCBC57CF7B72D21FA +:1014F0003CFD5ACCA33337011EE6F1E2BD912B7AB5 +:1015000055FF87769E0F9557DD8CF7EC750CC9C299 +:1015100056D2E273937E682AFE36DDF930C0251379 +:101520009CBF46FACBDB2BE8F7954081D0FC1A9F95 +:1015300080FD7E01C9A31AD2DBD374949F9AC85749 +:10154000A7841C6BC9E5797F56D79767E2EFBCC5C6 +:10155000CAB3883F9FD1B162CA2FD1F1FDA59ABF0E +:101560000186831BF775A579BAE83D1AF3515FDB55 +:101570007594F727EF49A2F389B25DA13CE34E4B86 +:10158000B56D358E635328AE32579E358476B3D110 +:10159000AEBB1AEDEEE37BEF1FC2FC12395761E8D8 +:1015A0002FEAB429DCEEC8D1513E9662AF36611CF9 +:1015B000A6C872BA12F17974CF37C9BF217F43E44C +:1015C00088087F925E90AC93B5D0F8811C45DCE72B +:1015D000E1AD2DCD10210437EE7F6A3E423FCA7146 +:1015E000DB2533DA2B6ECB0AF2A715E615D07CF497 +:1015F000186F83F213EB2ED9516EBDB96783A30028 +:10160000EDE7A0423648F19F3BB2E9DCF91E039DAD +:101610008B57F19A1F503471BBDC566DD99810BFAF +:10162000D3279C4BCACA2B107A6E110BC5CD47EF3E +:10163000E2FB35E6B4D07EA7304F629FE962E53128 +:10164000A2BC5F1FC8F6007E8EED59918FF3BA726F +:10165000D84F79BEA3D9FB1FE7BAD5DF4332EBE8F9 +:101660007ED59019F37E9F6A63E968DF99820AE567 +:101670005DEF13F2ACD0C2F9DF90CFF93CF159D84D +:10168000C3D79D722029988C74B3F59705804F2697 +:10169000BF328FB941FF15DABCE43F2C6C35A4632F +:1016A000FEC0DC1F5A884F2E5992C84FA8B4267925 +:1016B000F07DC7DE8A62771CDCC1365B3AE6E5EC7A +:1016C0006D33A5A39C0A8E225FC7D97594AFECD663 +:1016D000F17CBAF9791CAEF979FCBE9779A2FCA429 +:1016E000125880703E09F4C43CE9A39BB93DBCB6D6 +:1016F000DD4470AC7D731CD955A3E1EDE936573A52 +:10170000DE0FBF77B32E1BFD4795DD859BF09E84D2 +:10171000B5567E4FAC9C3AE9314C45673FD533B462 +:10172000DF3B52667A96C5C97739755631F2952CEA +:1017300007B2D12F7267DEFC9B315F12E8B713CB83 +:101740002BFB4A79D91AC8C6FCCAE6BE69BC9C1EE6 +:10175000D889F995DFEA9BC1CBB9816CFC1DA9B68C +:10176000BE6B79797C60279637F655F232FA9E4047 +:10177000766EE99B7333CAD90E83A71E05F20F005C +:10178000FE1280BF5F3CB70ABCA8F5CFE17BC0F377 +:1017900021F14CAC7F41F41B18A5FE25513F38CAFE +:1017A000F82F8B7EA151FA1F13FD8E8FD2FF35D1FA +:1017B000EF8D51EA7F22EADF1A65FC9F897E43A301 +:1017C000F47F57F4FBC528FD7F29FABD374AFD0792 +:1017D000A2FED709E39F10EDC3E2FD58EBE60F42EE +:1017E000C07763418EA05C2AB66E76E03ADFDB55A7 +:1017F0004EFCDF51C1E33B2ABF8FC5DF6F827A5DAC +:101800003EBF4F4A97CFE33CCF88F1810FB720DF2F +:10181000AD7D5BA63C9B0E9DE76C10E5E8261DD9CF +:10182000036BDFE4FBF3B5DD4A30FEFCC53309F0A2 +:101830006F10F0750A789FCCE3F139A3CB955E1B4E +:10184000EF47B269CB9896857217E437E5ED1677C6 +:1018500057751597638C4C471688D2680AE17D0D41 +:101860008A55E8055B794F31C26751E89CBA6257E7 +:1018700042FBB1BFAB9CEC3B15BE4E8B42F775C92A +:1018800056AE07E6FE70960DEDAC4EE61FF2627F97 +:101890009742F6FBD1AE321BCA3D83F52E1BAEDF5D +:1018A00076379F5775537112CA6BF9211DC9EFE343 +:1018B00036BEDEFB5C3AF25B805EA1F32C20AF3DCE +:1018C000A82326B0503B9D8F78F88525DCAFC7ACA8 +:1018D000A515745E448D434B4A9CFD7F59E0275FFC +:1018E000E81105F50B3C9F2C17E71C02DCFF046494 +:1018F000738D893BAF79394FE6E740D438A25C4B12 +:10190000F716E5AD5334FEF79C7BB5654382DE5098 +:1019100012F4CAB82E9093717AA72060D3944FE640 +:1019200009BF8E8779D07E9DFBC3CD240F2FA17E6A +:101930009346977B51F92BE4F193E21E9E2703FC1B +:101940001CF1D1CD653F417AAFEDD6D1BDD35F5407 +:101950008E3E93C7B87FDA0F7A07ED198565E37E6F +:10196000E9F3F0305EEF73D0BD0A9F838FF18F965D +:101970003B50DE8EF72BA47786E98DCFC1D7B3928B +:10198000E73D3FD2D19EC4ED6A1B9F77678693DF08 +:101990004724CE1FCAC25E7B50F8C195D4B96EFCF5 +:1019A00089904E7B0B9537489ECC1BA0FD46C96F96 +:1019B000C3F21B8E24AE777293880FF7A32D43F7E3 +:1019C0001C16F8D03FD21F34A8F71486F0FF0E6221 +:1019D0007E8E7A0FA28BEC33710F63EFCDD5D85E7C +:1019E000B14D469373DA138F6DD1830D7AD0C0A2B7 +:1019F000EDF13CD533C775E29EC4DD5BD05E3D980A +:101A0000C434F7401E443F3A8D17DC82F73EC2F7DC +:101A10006E90610F767DFEF7B658B262F054B90F42 +:101A20006C69A73C59BE2FB1337E4FF779773805E3 +:101A3000970BEC4FAECAC77DF99ED3199ADF5D13A1 +:101A4000ED5345FBA6C148D30137B59F960FEBA0D8 +:101A50007120925242EB2B5211DF3E45ECF7E3DA54 +:101A60007F89C61FA57DB10ACF81776F2DE1ED2B50 +:101A700071FC0BEE7006E5BC24C093367CFCEBFFDA +:101A80001A3C9344FBF3A177A9FD0516CE9852406A +:101A9000FD6EC27E17DF7AB742CC3B03ED64908ABD +:101AA00037E37B34B7F8EFB1B490FDDC6FEAB1A156 +:101AB000BD66D6F7F850EE16E2BD4ED363CF05F9FA +:101AC00085DCAE4A78DF6F6269B5C88FAD3ADABFA0 +:101AD000F49B86CA4AD09E7ED102320FF5C23A0FDD +:101AE000CAC181F05A4F09B4EBCB9945FB8A838672 +:101AF000967E3ADFBBC442E74FFB6C3D365C3F66E7 +:101B00007B8F0DE308F27DDC7E52965AFC4F213F1D +:101B100085D6162F8F5BBF556E3DC1DFFDAA65339D +:101B2000EE03BAF59E9E0968675B15CA3F57960E8D +:101B3000CEA7F3823FD03192EF30AF2A287736EA32 +:101B4000E8BEFA87DD4BEF413C30C5E7AB827E79DA +:101B5000E98A84E72F1E547C268C5F1885DDD6E742 +:101B6000E1BFF7AA7E7787B02F77E4F37BABBA9714 +:101B70001C287E0DFAF5B5AEEDC7EF99279A18E649 +:101B800099F5E59CE9C6F3A28FBB60C70B78B0342A +:101B9000E8E8F75A1EAF8536A9E8CF3068FC15CFC4 +:101BA0004AFDD43ED0A8A37D82A5C4A0F16FA43580 +:101BB000E8BCE8773CE0F66F427EBBFA6DE506FCD8 +:101BC0009E6BBC6243FDF490EB17261DC09952AE8C +:101BD0001DD7364B3B8EA35A5BEFACD5D6672CD4C2 +:101BE000D6BBBE6648F0D768CB29C8478847900166 +:101BF00016D04349BC8A2559AED0EF8575FB77F5E1 +:101C00004C8036C6E440E96B006FD2A424DAEF6F53 +:101C10007C3509171FC81F467267E3144679AFC7A2 +:101C200072BFE9427D9A889FBE1C03CDD75208F847 +:101C30002CC0FDFA59FA5D2F0B8B6B5780F8F13EE3 +:101C400093CFF7EFCC5581FE394672F059D57F7CA2 +:101C50000B3F4FD5D7CAFDD20F2DE2798134830ACD +:101C60005CDFBC7D0AFECED854F4DB77DD8DF98EC7 +:101C70008978CDC4FC3239C61F1BD4F32B787AB2D5 +:101C8000828B655C7797DCFCFECD9705DF1C14F733 +:101C90002D44DB23FE3218DFCAC2786FE6ABFE07A5 +:101CA0007E1E609B1A8F1165BCC610CB078F3B6EE2 +:101CB000C0F5B46DA1A30CD7D3466197A5E618BCB7 +:101CC0001301DE47DE3004A4ABA0ACB0E37AD0E76A +:101CD000071DFCBB86379302789EEA1157399DCFCA +:101CE000FA389FFBF39EABF4FCBC96D6A342E7DF29 +:101CF0001E717ACC65DCDEC0BBAE19A51681697198 +:101D0000B4B68CF6A98F783D665CAF8FE478CC983A +:101D10009F6CCE526CB88E1D2E85EED17AC4E4B77E +:101D2000A1DDE2000588BF1F67C8ED9947E7920073 +:101D300087BA0A1E1260228F0FF3E8D204BEFA5C43 +:101D400077D9F0FCBAB3F0D0B7D0AF9E86E3A5F058 +:101D50007E8827BBC0D3A57C37CF4B16E3A7DDF524 +:101D60001CB5C7BFCE8AB8F13C9CBF0CF358907E1F +:101D7000074D7C5F1D273A3EF392DF7EC34F38DE6E +:101D8000DA73F9FD4186358CF661CF55FAF71F45B8 +:101D9000FC6425D13E3BDB955D85FC91FDC6CE05FF +:101DA000780E61C34FB8FE342CE7F1A66C8599BE5E +:101DB0008CF34EF7DB108F89EB30EB784F1D32DB65 +:101DC000FF054658D4C60080000000001F8B0800A5 +:101DD00000000000000BD57D0B7C94C5D5F73C7B43 +:101DE000CB26D9249B0B212124ECE646201736E193 +:101DF0002222EA7209A222DDC81D233E210102240B +:101E00001040FB46CB6B161214156BA8A86851370F +:101E10000A142B6AA88058D177B968A95A4DABBE6D +:101E2000A55A692254416E31B4EF4B5B3FFBCDFFA5 +:101E3000CC4CB2CF9228EDFBF6F7FBBEF86B87795E +:101E4000E676E69C3367CE9C7366765702BBCDE799 +:101E5000602C61A28DB9EC8CFEFECEFF976A61EB1F +:101E6000CD098C254DE1DFF342BEA7248DCF2D6235 +:101E70002C79BAB17E0A0BC9BB79BD239D77B058C6 +:101E8000C6065419EB3D197DAC9899900BF96EFE7E +:101E9000EE7C93D67EDFE0118CF9532D9E6D2EC61D +:101EA000D2C3C663EC9B08E4356672FD3D8BB1F18D +:101EB000AE78C6FAE17B9DCB57C8D82E9B738223A0 +:101EC00089B1CE15CCF30C6F3FFE950D73DFE1F9B0 +:101ED000FF4A77382378ADB423CD6D05FC3BDBA7F3 +:101EE0000F46FD2D16FDE9685EBEE5687FE6D71852 +:101EF0008B886675AD1C4F3613D391FE1D7FD7625C +:101F00001C2B8D33DEC527359231DE45C094F2CFD0 +:101F1000A7AD0307E63B3DE8CFDD66E7FDB65A9C7B +:101F2000F9169E1FF9F4630F59D3310F0EE3189A77 +:101F3000B6978D66ECF9C37CDC013CE77FF2A189A2 +:101F4000165E1ED55DEE47F92E9349E4FD81872686 +:101F50008E656CE0E1D6350E2763654FEF78C8CE0D +:101F6000F116F92B51EEE379BF0578A919D4CEE724 +:101F700077306309CDBFF177112C82D72B347B36B4 +:101F800023CF3E8964DB787EC79EB1B35DBC5E63C0 +:101F9000CC28975EC0D8349746F32F43DAEFD27936 +:101FA000996D1EDDE3B8F4FB8D126F8C798EB670DF +:101FB000FA163E6B63F7F3C23CC00D7AB544069E39 +:101FC000017D9B1FE34CC7589553D0BC6AEFFD19A8 +:101FD0000778FA6A4C59A58BB7AF8A99980C78D2D2 +:101FE0002E32A62772BA35D899CE719596F4338DD4 +:101FF00071F806261D1EC71CE09BB6354EA4755110 +:102000004C0FE1CBB48B16A60F477F5EEA0F7FF62D +:102010006470A1F86B4AD0D91A0E8F9FE37A1BB86F +:10202000D319D5A11581F1277ADBD5FAC8049FB25F +:10203000D9AD05E03A81071BC7A9B584A70E4B307F +:10204000A297FA77C87A66BB23681EC653E75B4738 +:10205000A95F87E54CBBBDA79E3D60217CB01A16E9 +:10206000C8D1084FFE08E4E31228CFBC5E575232B5 +:10207000F89F1172D32CEC70041F97B897AF9F5440 +:1020800016A4F4498E1E47162AA5C77F1ECDF089D7 +:10209000818F9F616C72285FABD434C844F065D7E0 +:1020A0009BFA9DE0F8C93F14497058D6B340241FED +:1020B0002C1BF4E074CBDEC0021637EAD9FA9D4837 +:1020C000443B97E403A789D178AD43B1AE36BFE571 +:1020D000D8C0E288BE24773647B16AE04B8DC7D8B6 +:1020E0001AE28780E48B2D0D4EA2A32A1F5873306D +:1020F0008C8E09063AAA7A691707103D7BFA0D50B3 +:102100007F69F5BB891FD22E66483E717D47FF99D6 +:102110007DF49F42EDFBEE7F208DFF64F0C3F8A9B4 +:102120001C153FEEDC1DEFE369A4B5D9E7E905CF47 +:1021300069B71BE5E4B07D46B9ABF01269F52695A9 +:1021400071FC47DE61F2B4F0FEAE386AAC37D9FDFF +:10215000513CD6634FFD60D234D4AF15F5AF3A6928 +:10216000ACEF1BB727ACBE80EFDA8BC67AE1F4097F +:102170008797C3D56F46085C13EC1186F6B32B2EF8 +:1021800081ABDFAC10B8AE4B31D6D7D7F40ED78DBC +:102190007911DF0A97AAF7BDD197572F7C1ED32656 +:1021A00047F48177517FD6ECCBEBF796EA6FAF77A8 +:1021B0005B7DF8387EB95FF1B5C5D77122FEC19756 +:1021C0004062BDC91BC9F75127EB6458475D725D7A +:1021D000253027AD67BEF035ACAB0FF0CF54C686C7 +:1021E000B87D5F437E4DB07BCB1FE15527CAFD8A8A +:1021F0004DE13D5E89CE7D8537175ECA7F8CAD256A +:10220000B85ED3749DD13E6BF76CE3EB3B3F8DD949 +:1022100053B91EC052029937C73016ED56F29A8B49 +:102220001A0EE75089BB1706B4AE8CA7751E48007E +:102230003CFFE8B8FDDDDE0477BF9EFAE1F57AEAFF +:102240000B3CD96CAD2B006767ADC383FDE1431434 +:10225000F176CFCE8C089A39BECE5B1DEB352E675A +:102260008E46CF7BAB1FC7C307B1BA0BFDCF9E75A0 +:10227000FD3DC86B07135D2B397CE72BDA4701AFB7 +:10228000DE683DDBCDE1A8B1EB8392F914CFA6EB7C +:1022900083E3805F5F22E195FFA3D0D72BFC029EF2 +:1022A000899AC07F629C5E8871269ADA9EF2E19BD1 +:1022B000A56D14DA31673F82EFAC8DCBBB5ED6BF24 +:1022C000C2C378D9CF01ABE7EB4E3EBF031BE33C63 +:1022D0008D1CDEAAC459F396F3A205265F72D06C5A +:1022E00080FB2A8C57E3A818940AB8AD126E7B3F86 +:1022F00089776FF6B7C1DD88F1B0AFFDBB16D8E6C0 +:1023000016B444FE157F7CE07E9E8F305DF810F29F +:10231000A3B3D0E4E17B04DBC2F50B3BDF57DE97D0 +:10232000F87E92AB3FF604FABE1EDF53A244FB9444 +:10233000474D8146DEDE37FE55A2D3B3CB1C1E339C +:102340001FAB82B96CE0DB4AE6B501FE3F8EFBDBDA +:10235000EBED7C7E73DCFA74CCE3B64453C68704A1 +:10236000879E5FC6F98D8D15F8FF2E7E606C838980 +:102370008D62EC66A91F2C90789CC6BC568C33836A +:10238000E9568CFB9B73362FF4D2DF4007E5F0CE85 +:10239000627EFA3E870528BD8505A9FEADAC9DF29B +:1023A000BF8E2E4AAFE7F0953D363807EB3104EF8C +:1023B0004B24BFDC9624F8E58BFEC0FBA67E97C5B8 +:1023C000BF659AC0DF10B7BECA4DEBD595E4014C8E +:1023D000CE09037D3121EB67623FC17F1667CEB71F +:1023E000AD9FB6AED822368CE4812395E3E13A491D +:1023F000CAEBBC4BA760BE902058AFDF93EBB5D4BF +:10240000EC60499C2E6D2E732082C33279DC8A14D5 +:10241000CCF7176BD8AF8673FAFD629C9935524D95 +:102420002FB59B2AFB9B3A70D229E827EFB260D2E6 +:1024300008DEAEF4A27E388EE367AA796713D7B8B8 +:10244000D9E481D6CFDA43E4DAF549BB2C8CEB2F03 +:1024500037641BBF4F29E0F910B93B95597ACA3947 +:10246000FD0F003F903BACD90CFE7DCC1D93047D4D +:10247000850D6543C5F9805323643E5DF66F6CE7B7 +:1024800079BBB7DDFA53E0A395F1E7E691DE611180 +:10249000F359F69E99F4CACF1A18388F9DE0FAA125 +:1024A0003797B1CFB97E81FCC986144ABFE4FA00E0 +:1024B000D2330D79547EAEC143F9AFDCBE9F804E5E +:1024C000F3D77F65C1BE746FA4C2B7806395E4BBC8 +:1024D0007BD3473DF6578ED77BDFE50B83C353DDB8 +:1024E000DA3C0960AF4AFF6C2DF4E755CF691ED482 +:1024F0005BBADF6B737078161CD6EF019917BDDBE2 +:102500003E1562A216FA2BD71BEEB3FAF660BC9109 +:102510001F9D48D67905EFFE8EB71279FD2F1A461A +:10252000135CA71ABC04D7E986C9944665FA5E43D2 +:102530007D2FFBCA86FA37EDECB0A4F1FAA55ECD8B +:102540008BF5788D9705021C9ECD5621DF3773F9E8 +:102550008EF539AEF0E6276F6790BFFA9B683F2390 +:10256000A1B234917F9F3ABAC2827AB3BEE632CD2D +:10257000DDC387DFBD0E053E6A255DCEBEA1119E7F +:10258000CEEECDFFDE55BCBF378E989999C3D57579 +:10259000D14470751D8D0A406955F556EE31933E54 +:1025A000B932DD1600FE56EEC9EF0F7DEA34A71BE7 +:1025B000CBED19EFF40BFFE6D243E4E8E984D6FF54 +:1025C000FA1872EA5321A7B8BEF9F913906303070A +:1025D0007840F77356AE9703D1AC2E1AFBD8329BD6 +:1025E0005C5F5CCE207F3A4A9C8347BD98361EEBE9 +:1025F00005E3B96C3D7228F7C5C7327FE0EA196F71 +:1026000047EB828F9FE0F9B30193DFCAF799B3AC30 +:10261000F5DCCF2147B73A3C381FDCAB7178B08F7F +:102620006E1B40F93CCD12554FFC1CA0F59AA7B982 +:102630002CF55CFED4FCECF101E0A7D7380E46F394 +:10264000F2D73646937C7ACDEA39568FFE9E14FD3A +:10265000FDE487777EB60FE983B5257702C999092E +:1026600084EFAA1F2D1E8AF67C9F66A9BCBFE75F78 +:10267000D182917C7D166E3AB03695C3376C4B870C +:1026800069004F8BB76A8D48F3D36F3862E6E5F681 +:102690004C17C1317CA7DB9C86653520F0F1B5B4C1 +:1026A0007F1BF7F5824D5F8DC7F152EDEF43B5D635 +:1026B0002F5B701ECE385AA213FE9AA99F3DFBA72E +:1026C0007D700BC33CB8E600B82B6C1EDA4F02FEDF +:1026D00016D0F9AC9EE7B91F6BDAE77F1CF43DAB6F +:1026E000277BB0BFEC35F963C7A0FE310BCDF39566 +:1026F000ADBF8EB5F27CDC6E2B8BE4E5B5C59D934A +:1027000050BF36DD45E7F0F4A7AE9B0CFC2CDBBDDB +:10271000A785FAA9B17B34ACB33D17DE4AC379E88B +:102720007AE6C901DFED16F907267A3DE0B7EA96A9 +:102730003F8B7C9B8FF23EB3DF6D41FD4AA1E73CAE +:1027400026F731D65E44F28E58D9D543AF0778319B +:10275000CA37BBFDA9758E9EFD8FEF5BF999BC3C16 +:10276000D526DB3BA765F8FE817DCB26F721D5DF9B +:102770006336E68FE4FDA4F3EF1AF6559BD86FB7E6 +:1027800071F9027E51FB2D1FF7AA4CD1DE0B39994E +:10279000C637D7623E9FB4C72202B4A75FE6F84AA5 +:1027A0004F5A1E25E499D23F662736BEDECEF1FA97 +:1027B000A758FD3ACC6F81DCAF99C59382F91D8F84 +:1027C000F54EC6F835F6CE0CCC81EF8753905F6698 +:1027D000E6FA535688FE64BFBCFD3022CE7B33DA66 +:1027E0005F6EFDB151BDCBDFB15DA349FEBE2EE5ED +:1027F000EFAA3F9B5831CFAF7A2482E409ED69BD3F +:10280000E0E575BEDE752E5FFE0376039E5EFDA7D6 +:1028100076339D3F0E9B6ADEE2FB290D9D89FFEB1F +:102820006C8C1B41792FC87CCD9F4CBD9E0F55CA27 +:10283000E954877979BF36DA1BAEFDDA69A3FE1D4C +:102840000997355F731FF335C78AF9EEC77C39EDF9 +:10285000567D5542F272FF65CE333DC2BB06F40D84 +:102860009F0787FB5E7C0F87BB9BBF3B2F0FEE3B19 +:1028700034E637619D7D650B609DEDE76062DDEEBE +:102880005F5C10C07ADE6B13797FAC8DF4CFFD31C5 +:10289000CC0FF9B1BF2C39E077430E32A19FF6631C +:1028A000A23C52B69F934CED074470FEE779764BFD +:1028B00094ECBFEE9D4294AF49F37008B87E1B586C +:1028C0009F49FAAD99EC8647A5BCDE141FBCC5CC68 +:1028D000BF6FFA2A97619CA32C98B61CF5AAA3484F +:1028E0000E6D8AF7A626703CEEFDC64CFBC2A662B2 +:1028F0009E77909C26FBCEA6326F6A3CCFCF957414 +:10290000D9D412D8F628FA2BCBF3F8F93803CCAC8B +:102910008EEAB9453F1F5B45BBDF49BAF0754CEB0A +:10292000FC83CCF941E0599F1A6D815D84633C556D +:10293000E3F03F5195C3485E4ABBD76C4983B93D2C +:102940007CE0B58F825E2BFEE62CD81609793CA37D +:102950003A92EC5247ABD7C6B8F87833747330026A +:10296000FADFF45283DDE9834C2F8DCB0F16F29CF6 +:1029700010AC041EDFE8B433C8E5BEE859DB3A2EDC +:10298000F144083F54DB84FC3829F5A15763F4F780 +:10299000C0EFCBF75D9F782244DFAB5A509A4B765D +:1029A000DFAACB3BDF35824EC368BDFA4DE08FD640 +:1029B00048A2FFE49BED44EF2E87E919D8256F93D9 +:1029C000F2AA110761FEBD714F44602DFFB63C2293 +:1029D0003813F28AD3FFB9EDA0EBEB9144FF1A9BB9 +:1029E000E0A79A9FE7137FEDB579DDEBD0FF1B11D0 +:1029F00044F79A58571C95BF9DC824FF91DE501389 +:102A000015CC8DE7F85C1FAD9F02DE38DF913DB835 +:102A1000C626BE1F937C758CF70138FC7531C48FB8 +:102A20004CE6F51F24D2798AEBA3C4BFFA43F9948C +:102A3000D76DDED405581F2BA309BE63D29E76AC9A +:102A4000269EF8BBFCA1A5EF324ECF63BEEDF7E5A5 +:102A5000F27AC7F65B3DD8977E5F6F0EDA385DCFAE +:102A6000AD3E3E6A33CFB7AFFD24430FB1A395AF60 +:102A7000AD9D8276E54B564FC57ED917BECB6B22F6 +:102A8000B8CCEDA1535296D79CC5F1EFC9D26D5980 +:102A90007C9ECB0BDA1742EE9DB3B53D85F3C1C7E3 +:102AA000717A24BE9F7FF58BED240F2D9DB9D0CF79 +:102AB0009759381F802FE5FEB95CF2E54B597A1C17 +:102AC000EA73FC913E1E5DD026E4DEEACB93F35F11 +:102AD000EEDFB657E3E32C8DDABF8C5273A008FD0E +:102AE0009CD682B15A16F0C7F538DEDF196730166A +:102AF00074D0E5B969E90EE3BCF007BBCA52FC83A8 +:102B0000B75BDA6A26BB0ADFDF6D807F292CBD0642 +:102B10007F82902BBC9F67681D3A7E3FEF071CFFAA +:102B20004B9E1B52027D7269FCBE1F5E45F5783BD1 +:102B3000C5E7E64BF36A3E97C223E67746F2F919FA +:102B400026E5E06C5BF7391C7AD0B917FA1BF8E67A +:102B5000DC734328FFA5D6A94571B8CE4979C43C9A +:102B6000ADA3CA7080F0B68E823EFBA8FCBE34B125 +:102B70007514E48F9247CCDE5A44E7EABCD6229C17 +:102B800027953C63BED65CFA1E68CD45FBBD266129 +:102B9000A7A03FCCFBF9B416C2835DACC725CFE735 +:102BA000135ED438E1F40B9FEFD42CE11FE0F0DE8C +:102BB000E6E3F5076FB619CA87048CF999B2FEA04F +:102BC00030BA0C30771E8880BC7F96D17A0D1FF703 +:102BD000D62C614FFFE94FBBE96096E745E652F41A +:102BE00077097DDB0A7CFFAE1BDFB7A77179BA14CA +:102BF00073CCEC99FFDE623D0D72FF9C49D8A9F7BA +:102C0000C6F37C01F41C814F9557780CE7A3B5BF40 +:102C10005B98067FCAFAAC6E3F477FF05B23E425E2 +:102C200097178D56818F2F1BAA879FB0E03C5A972C +:102C30005A65E999CFC2CDC576AC97455B8AEDF36D +:102C400043CE3B8D3B861F7171BA9CD96121B34144 +:102C5000A325F043E8D18D3BCCAD7E46E5762FAF82 +:102C60007FC671F03DD45BB825BE047AAF6ABF68F9 +:102C7000F31DA95521F8CEDF61C47F61AB310F7B15 +:102C80007468FE47D00547FEE3ED8A83C6FCF02357 +:102C9000C6FC171FDE3E136CFCCA68C1EF27033168 +:102CA00001F8A9AA3F997404FBDAC9BDAFC4823EFA +:102CB0004B3FAD7A0BE796459B8D7CC6E9A641AFAD +:102CC000F76FD7883F1607C2D79D5CEF97ACC73523 +:102CD000CAAE9917CA27E1F43CCD5A677A393FD575 +:102CE000D4AF1C0E7F48F514CEB81C9E2B5B37DA90 +:102CF000E037081FAFAF75CF1C5E17EC5515A34525 +:102D0000D998FAF1EC388CBE1B7E3D09EBADE2019F +:102D10008DF6FF8A97071F86FCEED835E7064A67CF +:102D20004E263C28FBD9A2FD5A3086E79DA35DFBC9 +:102D3000DA79BB05018DF687F94D113D7288FFAF39 +:102D40006A43181C9B42CA39FC8BF61DF88BC6FBE4 +:102D5000AFDE626CB798E30B727FC9D6BF47847E43 +:102D600057E7BE31FB5BCC98F70205BFFF1A8679A7 +:102D7000091724171D525F39810C97F71109BE36C8 +:102D8000EC2F633689765C605560BEB50E9B0BF305 +:102D9000ADB5B3603487E3488CCDEBE4DF2F6C8EA8 +:102DA00021FBD4C208AE179650CA224BD0CE43FBAB +:102DB000F4E7EF9B495FA9C5D8E8E7698DCE3FB539 +:102DC000303622FFACC82F66419A07F8C51B3ABFC0 +:102DD0008031CF9AC5B9A9C6123C007C2C61EDE2C6 +:102DE000DCC3E9E80DF1C7D5F0791E4D803E646C77 +:102DF000BF9CB552FDE5FBFE1E11FA3DC44E4AE7ED +:102E00003975AE34DB9817FAB1F9EE28DAEFB9204C +:102E10008E027FAED3BC8FDBCD48C5BCFC1B85FECC +:102E200033B745EC175C3FCD057E366D1CE2819EC5 +:102E30003297EBD991D023164751BD4DF18CEC2B35 +:102E40009BE6E40A3DFB9B978318A7F3118DEC23C7 +:102E50009B8A45BF9B1E1C42E590871A8D13417AC1 +:102E6000CBA632559E4E7AD2C7002D157AAEFCDE27 +:102E7000CF45DF0798BDB9D0D7D9C39174DE577A53 +:102E8000EDB3097A6C76BF9EF92A3D98555F9EFE98 +:102E9000B74DEE779D1B85FFF784E67BCB14A29799 +:102EA0000ECA16FBC3A8F1DEEDB21EF901AA4C65ED +:102EB000F75FCBE1A97AD4E46A74F7E09D79BDB9F4 +:102EC00098FF898D9125E0B351E385BDE758B19016 +:102ED000DBD1239837C0D3BC6CB17FE4659B0C6910 +:102EE0004A14E73FDECF8952611F8E19E1233B1B55 +:102EF000D7D9487E87CF638484AFCAE67BFBEA5E7E +:102F0000E0E9E6838942CF38B1427B46C0C5E9CAD1 +:102F1000F3A37E1449F6B913725F51F8E77C33923C +:102F2000F66929AF364A3ED908FA633F5B2CCE4199 +:102F30003D7C62E483B99AC02B7B50E8A79BE245B5 +:102F40005EF1013FEFB0BF824F4A19E1BDAF738F11 +:102F50009AE7A61651CEE93D05F40E3FF7287A33DD +:102F60004B6024CE8D7DD17BFEE8F8519A89FCD64A +:102F70007EF8ADB1D7115EEEB304D67238065A04AE +:102F8000FED32D82BFB854F64795507DAF8DE72B09 +:102F90001E5EC4BCBC7E451A237B10AFCFE2509F9F +:102FA00077833816EC1568571127FAADE8CFE89CFF +:102FB000407F5C5E6523CDA47EBDA604D13EB68471 +:102FC000DAFB4DA2BDD7C2D34159429FEF5C171126 +:102FD0007806F2F9DEF45CF0C194F1463EF88F6CAD +:102FE000B1DFAB74688E4B1A953C2958DFF39B8692 +:102FF000D07ED118E9ABDD03BABD20F4FF8A7B6E29 +:10300000BD6924E07B31D103F0BE9CBA8BFC0DF38B +:103010009BE6DCF111CE0D3B22E9FB7539FA5DD957 +:1030200023A107BAE6EDE11FE6CF38644BE1EDF5E9 +:10303000D6B2B33FE7E954FFAEF7A00F4C9D6EA6A2 +:10304000FA5399B08FB22631CE4DFEAF2C29BCBFBA +:103050009BC66A1433D011E9CC58C1E1AF90F4BBE0 +:1030600047F26F63249BFD3307E04ACFCDE4DF6F67 +:103070008286D98BFFEAB0AA3F4EDB02BD66D00440 +:10308000B1BE547DF4837EDF96EB69A3C48BCA7313 +:10309000BC52FDAAF5111D59B148ADC1C13CEDCCE2 +:1030A0001DFF08F86A4A269BB41978BFD38C5805CF +:1030B0000E6F6705ADFB985C17F854672C48F1114B +:1030C0008121C4D71DE33A3BEEE5F98E96C11EB2CD +:1030D000F9C873F4029CAF5C2817724CC99763CE91 +:1030E000F618E25779AEAE94ACF1C7FA098F5EC11B +:1030F000EB573A6C1DD80F163C322D167126959B56 +:10310000CC229E6383F15CCDCFBF2F812EE1E7E41B +:10311000F0F33078067C54B541233E1CD4E8B1A5C9 +:10312000921CD39C985F9523980DF95EE589F4A0D5 +:10313000FC4C8337F14436FC119329655F73BC8FD7 +:10314000823D965110C7C11C7D3FF054D15C41E7D0 +:10315000C5E8029DE4D3DFB25D84E729B02742DEF3 +:1031600058DA53B10E6BD5F70467AE83F839920184 +:103170000F1D56672EE0EA581769C2BE3965ADE0EB +:103180006BBECEEC16DEFE3E0B8BC27ABF5FB62F57 +:103190005F63F1B5F0FC403BB3C42480AF8A89AFD4 +:1031A0004B06EB1B818793FFCE4663FFAFDCB091EC +:1031B000E0517CC12C6D1313A1DF6D7397DCCF7AC6 +:1031C000F8A864F0F80FD0AE9B1FA66BC4073C3D77 +:1031D0009045FC70F351944F191FCC5E59003F5637 +:1031E0000DF3C28F90C23CB00774B14ED227BAB86B +:1031F0003E0179A6E489921B9C0FBC88EB51F455E3 +:10320000F2637B030789E37547839DD29F36389924 +:1032100085CB809D0D29947FB1C145696B431E7D8F +:10322000FF598387F2BB1B46537E6F8397F2FB1ACD +:103230002653FAF3061F7DE7782139A4E48A9247E2 +:103240008A9F945C0AE7A3791CBDD794507B927B3C +:103250004ADE611EA6921E79A4E89BA9F9FC296E9C +:10326000C8B1F6399017A5E6332FBC023B49B5C368 +:1032700013E1025E84DCEB72D849CE67D8D83E9C5D +:10328000D71B57783BEE0DD9576FA9D69825844F99 +:103290006FAD8B6496103EBEAD3EDE902FAFFFE06B +:1032A000CDFEBC7F2D5E77E470388EDDFDF993BFD7 +:1032B000E5DF9FBEFBCB1CD09BC3B1ED318CBB3A8D +:1032C000AA1B8E04E49BACA43F0C8A12E720FC816D +:1032D0002EF399589F4FDFFD575ADF1DF5112E33FE +:1032E000AF37BF3E82F0F531E8C4F1FA7B49A78AD7 +:1032F00075C75F7805EB7CB58DE4DCFC26B92ED76D +:10330000737C86E86B9FA532D2CB342F63F0C37CED +:10331000F6EFB620DFF3D9679A3DA041F7E187A425 +:1033200072FE5D5FFF0B8ABFD2EA8F903EAC232E08 +:103330000B7602BFD5108FA5D5CB38ADF681863878 +:10334000AAE8115E1BE403781A749B9F7790615D75 +:10335000B366CD892DA04A7EAF5AAF91BED1AD2FB5 +:10336000E498898E75D9164ADFC31AA7FDA299F68B +:1033700027C5AF5C5E78035817CDC5B68521727836 +:10338000BEFC5E9967A2547DAFCBB6513FEF41388A +:10339000F07EEFCFCBB42D2039E7B2410EA8FAF37F +:1033A000F34AEEC91C817EC625B190F5E8CDB15037 +:1033B000FB3A047AE17C6417F6FF9A3EF601A59782 +:1033C0009CC43FAF24F8E9BCB5E4C5E75F847F6CDB +:1033D000C9271144A725C3A43DA220306A1AE933A6 +:1033E0005E87C6E7B94CD27FE2F39FC6B6F3F2E53B +:1033F000BB85FD92A71D4897ADAE26BBD6320F5FA9 +:103400001F0990AB463FF2E1173F896DA773853FD7 +:103410000DF1857C5B486329F0171D9F04BBF87292 +:10342000D6790FE2BAC2DB2DD7BE8E15F67DE12725 +:1034300057FECBD2D7FF9C4C70ECB9900CB9B6FCC0 +:10344000F575C97A2FF35E1EE6BF567E7365075B7E +:10345000CE367C05BF5B78BD9539D2AF7D05BB828A +:10346000EC141646710C2BED020F5D819C38D6CB07 +:1034700078DDE36EE6829D9F43BB2CAE380F87F369 +:103480007C1F717CAFE488FDF9ACF4A39EDF692654 +:10349000BDF0FCCE18E2FF653B1F7EEB2A9E5FB6B7 +:1034A00055C3B0AC96B5119E96ED36337BE8F90660 +:1034B000769BC4BEE15CFA7C4C1DF86971ABE6DD1D +:1034C0005600BFBC2BAE5FA8BE28F9696944EB2843 +:1034D000A28384FF7EA91FA97A8BF73F6C03BD7876 +:1034E000BD73A4B7BC140D5D9BFF75BE07384F6F4D +:1034F000194E7EDDC5ADBB96D1BEBF33DA89297EBC +:103500006935DAA30239623D057284BE715ADA7FE9 +:103510004FBF6826F90338B10EBFD4849D57B5DB81 +:103520002EDB6D9778BB2947AC47557F716B476C95 +:1035300036AFFFC5BE0F286D95F35AEC682BC27EDF +:10354000F9C5EEE8C9014A7F3CE9353EDED9D671BE +:10355000495AC8BA7A3D47C40D9FDD629E0C7CB1C2 +:10356000808A336AA5F99CDE99A6D1B916F8E6F8E7 +:1035700039BDFBE55813AD5BBF6827E968B20B7B2B +:10358000AADBE292F60BBB137AC65CAED5C57179A5 +:1035900057BB5BC403847F57F569BDA582DF3B6DD4 +:1035A00082FFA5FF5EFA97102742FEF8185B00FB2A +:1035B000EBBC61AE59B7409EBD6315F418E87A0CB8 +:1035C000E7AA79EF2792BD62A5D5D51FF93FBD6B5C +:1035D00025FBF9BCE1729DA7B48F847DB2C32DF6A3 +:1035E000F59AF57C85F0290FE0F4F7F3F9D5044C52 +:1035F000144F793C2793E07AA2DAE4B5919F23989F +:103600000B3BE5311BF39BA127FF2C92F4BB9A4C9B +:1036100061777F02FCCED39A84606E22EC5D928E3D +:103620003537F3F2107AD63C13CC85DE72C626EC21 +:10363000782877222D11F51A25DFA01FF4DBE1761B +:103640009E23FD724F0C839E6F7A2546D8137E12FF +:10365000497E07D5EF05C9578DD2CFE5DF26E003B8 +:103660005CD09B17DB9A73A157AA7117C736D37822 +:1036700067E4788BA39A85FF40C685A13E8D6F6570 +:103680005E9CC73B9F8B20FDF4CBD4B6BD18FFCB0F +:10369000E786901FBCC31D58B88FCAB9DEC6E9B013 +:1036A000E4A71141C07BEAB918F2739EB20A3DE863 +:1036B000544C32E94147621E9D87FEBAB64668B057 +:1036C000A79CD2982D05E5DBFA91BF6A49433DF9E5 +:1036D0000996F0E50E7F344F27C3AF7C6ADB10B24A +:1036E000B39CFAA599FC8BFCFB7A7CD759F3BCBB45 +:1036F000B0EE7644939DEDCB9FFE6D48A8FF41A5AB +:103700004BB61AED498AFEAA3C2957ACAFA45C819E +:10371000C7945CB1CFD446B73E9A49F314EB95D326 +:1037200081CE5B7C7D24C33E7DACF5D564CD013C70 +:1037300007737F0CBCEF10E79A2F775AC92FB2E4BA +:1037400095182FD96FEEBDC284FD628959E8BF4B31 +:1037500038BB8954D88796C4E6927D88E39BCE8F88 +:103760009DDBCC721C31EEA9EDE9C2FE1E94F9BDC1 +:103770008501F0F9940476DBCDA4DF6C29025E2F7D +:103780006C8D36812FF8385EF8ED97DCF50381CF2C +:10379000B885A48F33C4418F82BF5CC8CBDA7BAFBE +:1037A0008A433C0C7BDFCC20FA2E583CFD210FC312 +:1037B000F1B52857CACBBD4FDAE03FABE1EB05F1DD +:1037C000414BA5DF74E94F35D2E796DE73D563240C +:1037D00007DFB3B21C0EC799D6876343E95126FBB6 +:1037E000E969EFA1FA4B797DD1FE9D588267BBD57F +:1037F0000378C2E978D9ED7F6ABEACF6DDFCD1CAA8 +:10380000F7F5A24BE77D81B57DFF13C8919D911E11 +:103810003F7D6D25BFF3696BEB42CCFBF40B91242C +:103820005F4EC78BF5FE0597877E1BE0B8F121B28E +:103830006FFC661A83E85E1430F6ABC69D992BE4E4 +:103840006F6DA2270EFE8C5A4E07F4C7E9F23D6A4F +:10385000FFBE95DA87CF63A46CD7BD3E5F88267E16 +:10386000393D40D0E3F48B83695FE988177CCEE172 +:10387000CDC039E574BC487153067CB0449E434FBB +:103880008F6BA573F7696D17A51D56D16E49BDF4F1 +:10389000DB72BE4B01DF8027E1B7B26F68831E0188 +:1038A000FBF4A8124A83110997DA99C19FD8875E61 +:1038B000CC15F62CA83590EBE4DF20FDA4D50679D5 +:1038C000AC4B3DAE66E7A5FE32F283EED4C8EFF313 +:1038D000A05CA7803A49D9C7393F2EF56B5EC41B5F +:1038E0002D6D5AB118FCBEB46EE32DE077358FA56F +:1038F000163619E7AB0ECD4CF07444F275033C84D8 +:103900008E97D983DFCD0A5E809C4C7A2629D75BBF +:1039100072C57E857C33EFAFA649DB40E3B8D5792D +:1039200052CC4FE189A3C5063B193FE78BF23EE637 +:10393000AFE00C9FBF82A73557D8273ADCAE87C6C9 +:1039400082DEBF3293FDF4C2D7C3E312BE452FC35C +:1039500089ADDB5ECCE17F9DEFD5E8C70FF986F539 +:103960000C7B348733778BD1FF91B7D5981FBAD3AF +:10397000982FD86DCC17ED37E63D878DF96D725CC9 +:1039800085279C7311D786732E529C735DB9E29C78 +:103990008B3CCEB94871CEC5779C7391C7391779E6 +:1039A0009C7391C7391729CEB9F87E4ECAEF1A69B0 +:1039B00077041D28BEEAD548E507A7F5727E4E328A +:1039C000C94FE5CF3CBFB880F2DDF69C323BD973DE +:1039D000549CCE2D71FAD15CF21BB6DD930ABA5914 +:1039E000DAC98EBBFCE7C28E5B5312E9807DA17DF4 +:1039F000DD17F7407D2A8AD33FCDA5B8A6CEED22AC +:103A00005E294872A37D8DEBFD6B05FDC8CEA1E25A +:103A10006E2AB0DF25F44DC7703F0ADB60F49B844B +:103A2000FB51C2FD27E17CA0FC264F5B3B5321EFFD +:103A30008F3F67DF00F88F4BFB189BED24FD4BE9B0 +:103A4000D5DDFAD783DA33D8B7BFC94DA0F65D47C5 +:103A5000B8BEDDCB7EABD2CA8B25A43776E73768FC +:103A6000268A1B4989A57D6895842943EBECB81704 +:103A7000F22EC644FBF8058789CE05173E34931E07 +:103A80003118FA79C87C8604A20CFC95BF2321CC9E +:103A9000FF37C0507FD8BECC30FFDF50A35F6AFA3B +:103AA0009A03385F4FDB30DC50AFCA7755181E25BC +:103AB000DC522F6D5CBD3903F267554C17C1BF6AEC +:103AC0004F24C5D5567178BDF0CB21C351506DF749 +:103AD0004E05FEAA5BADF1D8E72BE5FEC3EA8DFBF0 +:103AE00071B585F99D093D7C57ED64DE78DEFE6C8D +:103AF00071F37613A7DB59D39647C7BAE0576AC963 +:103B00007072BEBA5D6B4DBE92F7F7378B5E309820 +:103B1000F35B8635F8C372C8CB5D596C0DAF777C0B +:103B2000C3CBB1A4774B3ECBB03AA340EF966633FC +:103B30009D0B60973227F4F0434B736254B6A36732 +:103B40009E3DF4FF9AE6C7E9E2C13DC52EC7C1819B +:103B5000ABA0C7B58AF9568FD3FCA427CBF9AC9498 +:103B6000FB0ACB16FDDC2EF327E47941CDEFCC9098 +:103B700003452EF8311BF6659821C74D3BB7E3FE90 +:103B8000C0DD51FA758347225E32E7B763F9B84B5F +:103B90003E12F1BA7FDC3421F64AE89F2F583D539C +:103BA00078FEDEE6676D38172FB1046C3877563F24 +:103BB000D762F3F2F4BA1D2DF47DE18E0A3A6F2F2D +:103BC0006275748E3CA9E26F253EAAC76B5B9C1C94 +:103BD000EE17070BB9511D25E2364ACD63DF445C71 +:103BE000FA851D5A31E63BDDB7CB5601FBB3AC1766 +:103BF000BE3EBADE9D56DA0FF6A456E1F7EC6B3DF9 +:103C0000CC08E6D17A9876D145E9F48B43E91CFBE0 +:103C100011F315929C28083BCFBE2BE290BBF68B8C +:103C200075506D0B264DC33A79C34AEBA496CBAFC2 +:103C3000D1253827333686A7BEB16603BF2E9F181D +:103C40006DE0E7D92CC1E0479E894B9B21F9E953F0 +:103C5000B20CF5674DCF0FE3FF929E729223630C77 +:103C60007126B5ABFD2E8DE259C61BBFF37435F13D +:103C7000D90D86F6B5ECE69E7A38076FFD35E199E9 +:103C8000B1361BCE5BD5261157335BEF90DFDBE9F6 +:103C90003B9F88611D0ECAF2FC56EC8B56B2CB2BB3 +:103CA000BBF46CFC3BABB77D91135A8E8BF850D8AC +:103CB000170CF1851C003A7F3241875A69EFA9CD74 +:103CC00013F69E5A7F9B0DF1B71CFF96348E9265BA +:103CD000CD1AD9F3787D7B5A82C8AFC6F7DDC6FB13 +:103CE00006E8EF22CA8F982BB05EC2CB97F17943DA +:103CF000CF58063B0DEC4CAA7FD9AFE2CF459B8D48 +:103D000076A365B0E784D0F1ABC12EE2D3253B7634 +:103D1000BD3580E3659A2FBE18EBA7A6B5CC5A51E6 +:103D200070299F29F97EA1DA447EEEAE770F119FAC +:103D300075555B889FBF0B1FCBBCC29E19CE7F0BF6 +:103D4000F97CE0975DB85BF30434510F781900BE3D +:103D50000CC34B5A2FF85278EAC65B58F922FC6321 +:103D600004E206B440D0DD1B5E241E55FF6178627C +:103D7000A38D7858A8BBDE87BC5978C4CC02973194 +:103D8000EF45981FC6E7F3C3F8375F147612E5379F +:103D90009879D142F96E3EF189F8E9E9538CEBB29A +:103DA0009B6F7C629DCCB8984CEDFEB7F9E7BBF8F1 +:103DB00046C11D1E9FACEEF7FCF76069271CC94683 +:103DC000D2FABFCCB861B5DF2B3C0FBA7B34C51338 +:103DD000753932497FE8DE6F9CC6F29531991447F8 +:103DE000AC4BFB9C92BBBAACA7C6A9E0E5AEE1E048 +:103DF000E381C9B0BBDED39495D11EA297E8EBACAA +:103E00006437CD5893486945A43319FB45C51AB3A7 +:103E10000FFBE067F7F54F1E0D3BFC3A6BD214DE4B +:103E2000F567778EC86085C897527A7C63C4EC507A +:103E30007BB64A5D79623FA8BDFB28ED5F674DEF19 +:103E4000C6CEC63A5BB7271621354BD77D30CAC9D7 +:103E5000558F168B3E280F71845ACB7627F0E66C6F +:103E600029823D7A1868D7AF474F58B2AEB43FECBD +:103E70005F35DF1C7A0AFBBBBEC69A0C3DF3D487C4 +:103E80007CFFD368FF22FDE024E28F93E0B78AA68F +:103E9000FB6D2735E685FF66B1F94091D3B09FEE03 +:103EA0009F09385E8DD287E5919F36B03D05E37B53 +:103EB000FC142FA9AFC989EBCD5EA2D2E59B85FE8C +:103EC000B65DD96BA55D177A3BF2D0DBE11482DEDB +:103ED0008E3CF476A4D0DBF1BD4CDAEB07357616D8 +:103EE000E3DCE91FCFF2EA687F75E4412F5FA54567 +:103EF00079206F56699EFEB083B1ADA9625F0DA3B4 +:103F0000AF4AAFEEE4BA5508BF5F7BD1CE42E3C7FC +:103F1000C6B178437E823DD550BFD4E936945F97D1 +:103F200032C4507EBDABD890BF31EF4A43FD9B3CBD +:103F3000E30CF9EF8DBEDE50BFCC5B66C84F9B3CF7 +:103F4000C7507F86AFC2503E6BF66243F91C7D8539 +:103F5000217F4BF59D86FAB7D6AD31947B99D382FC +:103F6000FD6D3FCE531CEF6FE03CC5D355BFCA710A +:103F700084D275EC04535D6FF6F8EF4BFEDD3CC464 +:103F8000BB02FC992EEF81A4CBFB1C4D792EE2CF16 +:103F900034DCDBA7F36C5B2AF826BC5E78F9D8E842 +:103FA00083175C9C867FD83173BA85CB87B1571C49 +:103FB0001C9EC5F309431E986EE17265EC55075FC0 +:103FC000CEE4F90143DE14E5C30E5E40F903431E5F +:103FD00012F9698C548BCC21E3A7FBF93CC65E9B9C +:103FE000B9C123EC21BDC65BAA147840DC22F08065 +:103FF00034C8F913E941CE9F480F73FEACCA66EC92 +:104000002DCE9F488FF07325BEBFCDCF9548DFE5FD +:10401000E74AA4EFF17325D2367EAE44FA9B86D9E7 +:10402000947ED8A053BBFF6CA8A6F468431D7DFF07 +:10403000B8A19ED2DF37F8E97B204FD90F826467A1 +:1040400051FEA465F0E3C10EB7CF7A26D4CFAAFC07 +:1040500081CAFFD758C7DAA3B14EDB2DF19FDB7BB6 +:10406000FC7A7DCB590BFB3C44DF6A89F63E9F47C7 +:104070007692814E92D7F2FB786D5A7A094FFFE221 +:10408000D27781DE334A2AD7C5B9710FA4CE0A7E12 +:10409000F9C8D4FBBDE0A63C617F5839C4BB97F892 +:1040A00044FAB1951FB93B3E25C4CF6D0A898BA157 +:1040B000BF90F816E56F56F134D7D8457C9EF227AD +:1040C000ABB819D55FE94546F2EEEAF516D24F6274 +:1040D0002C2C88FE557CCCD5F6D662C40B5C5DE3F7 +:1040E000A038B4FEFCBBAD84EA79CD3CDDFA675E56 +:1040F000BFA8C77FDD5FC2CFCB09FED28B3AD95DA7 +:10410000AF96FE7BB4B78B723FDA23760A7A064FFE +:10411000C9AEF624E29C4A7AFCE9A81F2DEA07D131 +:104120005FF67FF1F1627BD64F7A426B31E2A9D222 +:104130009739289E6ACBB820DDDF5AEED63F039D23 +:104140007C11CE4FA369FD64A5C34E5026F5DE6FEA +:10415000A1C31768A7F0A3F0ACE8A2F01B12774444 +:1041600078ED8B4EE1F409A78BA247E9C51E3C030D +:104170004F97D2A1874EB0C7FEBF4287119656BA5D +:10418000FF175163F700AEEFA2CB6D9D6C12EE13DB +:104190000FCED49B80E78A8BAEB790AF64E32661E5 +:1041A0006B52E59EEF289F85F27E7D97DFD147F920 +:1041B0003B912A1EC1EB28E6749920E5C7AA5281DB +:1041C000DFC96E33E17742C122D2479943E8752EA9 +:1041D000FE1FE4C9A4AF7D4DE86F5292513F54FEDB +:1041E000E01B647F93C3FCC03748BDF18630BD70CF +:1041F000D410A9F7B9995B9CFBC43DF789729F4E17 +:104200009374CEE287F9B1A023D32D105A8771CFD2 +:10421000BD08F7C0FD94BF9E0528BD910569DFBAB2 +:10422000890B38E4BFC718C5331E8A9E5ABE9CF757 +:104230003761F8846C7C0FB9D777DD907E74AFEF6F +:104240000FCE907B7D0727BA486F3868CF223D0696 +:10425000EBC01A6247FB2597FB086538C4F705A435 +:104260006FF27D219B33F92FF8BE80FC0D796B181E +:10427000DA4D7219E34D54FB1B9DE3996578DF72AB +:10428000F7C6A25707C2BEF24EFCE089B03BBF138F +:104290007FC544CCF79DF8FE269146D8282D7C2575 +:1042A000BB373D4BF161CF78939825F152FC2A7CC6 +:1042B00086E351E1F79FC0E78ADEF0D9041CC0AE67 +:1042C00067FF20362513FE2FB1FE6B5F29EC0FF838 +:1042D0004F0134C425DB055EC2ED3B5F34B081C0C5 +:1042E0002FDB1A47DFEF903C7475FD18AA7F4DFD58 +:1042F000689ADF5551FADA217C9C3325C15CAE39CE +:10430000B02FB634D2FDDBB32F9A3DD0BF6BCCAE0D +:104310000D1EACF577C47D39F6F5A10CF8DBD8D6C7 +:10432000DEE3766BEC0A6F7EC2A737D3DB24F63F61 +:10433000718F58EDBF032344BCABBACFDAD77E3CB4 +:104340002A4AC8958111420E2A3AF176944FE3FD2C +:104350008CE27223EDA128D2BF4724781F073ED5F7 +:10436000391AF14DD8A7AE09E6C7213F19E7499E92 +:104370007F5BDE4F7B7B685D5226C7F7219BFE2C5F +:10438000DA31F3D766ACEBC61C8DEEB9771DC94A9E +:1043900002BEB7A97557C48A42DF1B50FA71F7787D +:1043A0004966F28BAF847F3409E7263BD98BAE6137 +:1043B000B9E4379D28C72FFD6525BD83A0EE7D4458 +:1043C000A4988CEFE7B8A20CEFC144E72518F231AE +:1043D0009E0186FA71A3330DE5F1DEA186F2C4C910 +:1043E00025867C3FDF1843FDFEB3C71BDF75D36F07 +:1043F00030D44FABBED99057F22B4D7C62E9757328 +:104400000DED07D5CF37D477FB9718DFB7F17BDBFE +:10441000F29221F7C45FD6FA9586F21FC78A7B0D08 +:10442000931D0BE9BD8A9CE6BB8CE34B3AA5C509FD +:104430003A319790AF7EFE1FF8A634C5286F273813 +:104440008DE76DAE0F6AD8DFD3EA2C86EF9FFD0FA4 +:10445000E91C8E972EBE3505511FFA10CF5FA30FB2 +:104460007D08768D8949564F80097B7AE8BC604F7C +:104470000FC503ECE9A179D8D38DEF4219E90E7B82 +:104480007A68F9F02346BA8F6C33D2FD8AA346BA14 +:104490002B7E0CA7CF95ED467E08A7CF5527C3F8F6 +:1044A00043D26336FFEFEFE29E34D16B9243634F0A +:1044B000B8FF79FA240FE5F4C9EFA1CFFF49D35330 +:1044C00087F6C3FDF40B1936D0AB53BCD7B742CA3D +:1044D0004F154FC8CFBBE23EDD5D66F2EF1F3335AF +:1044E000D37B49079DBA1BED6F2BA8D3E03F4861F2 +:1044F000BE5D0B397CF3FE2382FC09F306897B9DAC +:10450000ACA09DE2EC959C9B9726E258860C95E723 +:104510000B8F886729182AF4C2188F93E25E2B0A42 +:10452000C43D027E2CC8985708FE793712EF1676E4 +:104530006D12F6FB76ABB85FEAE77C04BF18F44473 +:10454000E871E9528F6AFC9DDD0EF8076F66867D83 +:104550007148C06E88BBCCDFE134E40B5B530CF5D3 +:1045600087ED7319CA8B837986F2E1473C86FCC8D4 +:10457000B6D186FA571CF51AF257B64F36D4BFEAB1 +:10458000A4CF904F639D8F03BF8334711EAD1A2A51 +:10459000E278F81A227FD2BC7BE3C5FD41794E5503 +:1045A0007AB08AC7D525DF85EBD3836C3AC5F73659 +:1045B000A6320FDD03B0CBF30933EAD9BA8CA75585 +:1045C000FA28F31BE369551C6DB73E2EF56FA50F56 +:1045D00087C4D17A43E368E7C97BBEE1FB5E9DA453 +:1045E0007B38FC836C62BE8D77DAE8DE82822B1C1E +:1045F0009EBFC9F8CE6DF6DEEF8FDC3D54F8DB7F51 +:1046000099E5FB3EF8F529888FACDEC6F3B4FB399B +:104610007F35FEBBCDB3D6F5DDE3CD1B26E6536E6D +:1046200032DD565640714BB37F1632FE0FE5B8AB04 +:104630000AB45EE7372F4EC415B1389B0BFCDBF78D +:1046400078029F2936D644F75C64DCF9AD1B5A1F0B +:104650008489BCDCD66C15EF9705ACE08729E3B9FB +:10466000FE540CBBD5370F3BB89EF154BD85EC1002 +:104670008F0CBD69863FBBE71EC1207EBE007F4018 +:1046800057C1B9C45E20E266F70E15EBBFD4FC75C6 +:1046900077FC37D9D31993F25B9C5B7AE137E2431D +:1046A000358F7F751C78389ED4B990C97D275BC241 +:1046B000A5F0D77D8E97F853F1F8AE1556DF330E7F +:1046C0008AEB9F8C782645BF8105822F4F0E15F40B +:1046D000463DC8A3BEEA959A0BE260AFED62AE38E4 +:1046E000E7B7D823FF557851F8EFEB7E4F5FF2E143 +:1046F00012B9D0C77D9FBEF893FEFE817B3F21F2A9 +:1047000041C497487A04B24DE4CFBD37C6B88EFB9A +:10471000E70BFCEE57FB859F9F278D7282C1BEDCA5 +:10472000B8CE2CE584D857A16FE0FB827556D237FE +:1047300058BD8847AE96B298315FF29811F0C75ACB +:10474000E93DAB6BBC8CF491F90E5BA085D7AFF063 +:1047500087EFAB5E6A4FFE1A17DE2DF1DC03FB7BA1 +:10476000E57A63BD450EF1AED782B073E922792EAA +:104770005D14762E8DCC97FBB28779486F92FE67D9 +:104780000567375F05B2282E18E754B3B09750BCC1 +:1047900052B71D1FFE85907734393EA3F2B06F37B4 +:1047A000597A8D23EBC6671F7EF233F093BBB0FEC0 +:1047B000BBE8FE4FD7EE48E14753FE0B59FF8CFF95 +:1047C0000295A33E7A3B5BDC56043F52B7BF23CC35 +:1047D0006FD2E530C58E467F3BC5FB0B2A0E60C904 +:1047E0005F0345CE103FA7DE6E32C45D84A7FA9A00 +:1047F0003D1417D062D14BF2F93C4E5B3C76BC17AE +:10480000799FE36032EE6B4F91F69A7078BBF5D0EA +:10481000B19AF013FA851EDA3559233D94CB4586BB +:1048200075A4FCD9652C988454F90FF4F5A309CF2D +:10483000CA7F50111C4D70CE685C64C5937DED8FAE +:10484000AF2E8D72F5F815DAD3453C4A5FFE8569C7 +:10485000173DD4DFF48B63A89FB27CB7B8C7D5F4FB +:10486000E00AF0D1D01DCC8A79B687C563ABF4409D +:10487000BEB07F1FCB57725BC6B9ACD1849EAD3141 +:1048800015F742725BE52F34CB7CA9C8AF5A27F2EB +:10489000EDF21DA3EDD2DE807922C57C702EDE29DB +:1048A000ED11980752CC03DF21A790879C421E721E +:1048B0000A79C829A49053F83E9FF9328ACDC20FD5 +:1048C000323164DDC00F3231440F821F24340F3F78 +:1048D00048687DF84142CBE107092D871F24340F3A +:1048E0003F48687DF84142F36CF4F53D79C8356F77 +:1048F00099213F8DEBE31343D62DFC20A1FDC30F7F +:1049000062E84F5F61687F0BAB37B4871F24B4FE4A +:104910006DF59AC14F729BBC975EB93981F8638E71 +:10492000DBF7C37C4EDF3F447F738715E734F3FE2C +:10493000C5747EAA8DF2083A374F1674373141E7B5 +:10494000CE3944E7D536912F1571B1BDF91B2666D6 +:104950000B7F0352F81B90C2DF8014FE06BC870D4C +:104960007F0352F81BF01DFE06A4F0372085BF011F +:1049700029FC0D48E16F400A7F03DAC1DF8014FE95 +:10498000067C87BF0129FC0DF87E0C7E8FEC1EB8DB +:10499000A0B7671BCE779C0F0DE73BA7210FBD3D4E +:1049A000B43EF4F6D072E8EDA1E5D0DB43F3D0DB02 +:1049B00043EB436F0FCDB70D75D1BA84FE1EDA0EEF +:1049C000FA7B68BEB0D9FF266C4C376D3977186911 +:1049D0007B8CF694C645C1FBCF1F9F01BF517BA4C2 +:1049E0009611CF97BC553B356322D7CF74195F56CC +:1049F000C43AE97D675DBE5BA30719C5C316FE25F2 +:104A000045C805756F087F9CEEC5BB199D03CAE4B8 +:104A10007EAADA7B98D34C724BD6EFC9F75E2F7C17 +:104A20007C558FE465081CFC80588C3888E2D58E54 +:104A300012C4716F3769220E72AD88430DE72B7374 +:104A400081904BDB4DBB0E4621AEA542A3F7E2732E +:104A50002DEC08DEF12E6CAE2B81BE703A3F5ECE9F +:104A6000AB6E0CE26214DCCA0EC8E504DDAB1ADBE7 +:104A7000C96C5505784F8CD91640BEDB849E807674 +:104A8000383FE6FB35EF3321FCFDE77CB1BFE9FEA3 +:104A90001563AAF8F7FC9D7563705F6B4A9468F71D +:104AA00093A763098F539BB467702F6EEC4EE6C5D6 +:104AB000FDCB6FA43CCDDFE9B455D1B84EBAE7A524 +:104AC000FAADD89241F7D22A58FBC414B2E56BF480 +:104AD0008EB9C21B9FDF61CC8F8BF82356D247C59E +:104AE0007D9128795F44DD13715B7CC1A1237BEE4E +:104AF0008B5C3D22BE14F15A6CBF7877EFA611157E +:104B0000EBFAF1FEF5807877EFEA3FD5BD49F9ADD4 +:104B1000E2DD3D628351340EED6B83FD1ABDF7304B +:104B2000D5DF624A72E1FEE81A6B32EAEF641EA832 +:104B30003F8399B807A9E02B606D26BC3BCEB798A0 +:104B40004389217CC425C074D0BDD863A5F720CA91 +:104B50002C4E2BE446F83E7E693C5D989E10160F65 +:104B6000D1B8FA68863913F61E932708B9B5279A83 +:104B7000F405A5EF54C838A80B4D6FD27BD615BBF2 +:104B8000847EA0733900F9A7E2236AB3021926E8EC +:104B90000B035A8A12CC62FF2FC07D24FFCB334710 +:104BA000BB708FF14D8AD7AF5837324EDCD711FE2C +:104BB000872A89A72A19FFC20A9CC9D03BD53BA6E0 +:104BC000A5E6B17174DFAD59E873CAFE52F1ABE1ED +:104BD0006F81CE154FCAF740D657D03DA0F038149C +:104BE000A51FAAF74E16375929BE6571981EB854ED +:104BF000EA814BC3F4C01B0AC2F440F53E9DAC539E +:104C0000F1AB4333484FA913EFF195AF117A0BDBAA +:104C100025DEB12F5F33C184772BCAF7783D5A2F39 +:104C2000FCF1BED45FA660D044C4F90CA074E6C504 +:104C3000144A675DCC233980BB18A07FFBAB8CF492 +:104C4000E90FA4BE3203717EB81FE78F90F17C8C10 +:104C5000F4A562E62C85DC18EAD50EC17C3DC5AA18 +:104C6000AF431CE1941646F7616E825EC30B664348 +:104C7000CF190E3E7797D2BD80C91ADDAFB869C48F +:104C80000AC9D79CCF19F8DC2FF9D647F9EEFD40B9 +:104C9000F2B7EEEFB0D0BBAC7ECD8677D974799EFB +:104CA00055FC1BCEE7F3E4EF4D3087B03375DBA145 +:104CB000002C3DAE72CD4CE88BF360BB1B2009C9C4 +:104CC00051145320CA9B0AAE99D984C3CDFFD03E5C +:104CD00051AE7E8781EB5990A7B7DE5E6C9B1F2299 +:104CE00057CA8AC63F5BD8AF87EEF3BBEF8D15F48A +:104CF00087FEBFF2BE9CFEDF767FB192E319EB63C5 +:104D00005E5CFB1D7819776B01F34E1C8DF798D50F +:104D10003C5910F16A7365FED7058BFE737D01E186 +:104D200087F2819D5366FA69BD0879750BE4951980 +:104D3000724A7FAA00F73BECED93408FE8824E79F0 +:104D40001F5EEE4761F6885F17083A84DB252A0B61 +:104D5000841C671657C62D744FD545763D05FF67F1 +:104D600056E3BD4195FE52ED230DFF9A78FBAF92BD +:104D7000F59F437E3C6A12F7B707989B99B40F8959 +:104D8000DFC990EB87C9F70C7AE8CFA506E87F9FCB +:104D9000E60CA5BFBE5E13F7A6FBB0E3B0BCCEC762 +:104DA000B7C18ED7207E9FE3E95CC1474FDF652303 +:104DB000FDBBDCD6F626DE695278FCA4FE4756F130 +:104DC0003B2FC11CBC3F35B72E92DE7B2D2BF2B59D +:104DD000812ED1051EA2C7B38829E5F5DB9DBE0F44 +:104DE000309FDA0D079EC2FDF1E5FBDD74AFB162C5 +:104DF0005FF13D78D7A2AC483F8AF20A87D386FD9F +:104E00007B59533CED67F3FACBFB85AC93FC540A1A +:104E1000FF9D05C28EB5BD48F47F5E9E432028CB22 +:104E20000CF5645C71D83A51F6C1703B43F87B02D3 +:104E30007DAD1F654F80FDC016625F54F6096BDEC5 +:104E40006773B07F96DB8CF7E154EA2E94E75C79C8 +:104E50000E5CD0BD7F154CEA0F7D79A346BF5B5336 +:104E6000E570CDBA92E7AB8E581129C8A624B8C414 +:104E70003B12F7897724E6F3F50A79532EE386AAE5 +:104E8000368FA6F55615E06962DFEBF2968D87D274 +:104E90005F05FF04BD744FBCCAE9B52584ACFBCAED +:104EA00066CD70CF5CE5E30B853DAE1C4F98974017 +:104EB0005EB86D78CBA59CAB1588437317BA0C7E92 +:104EC000575E8FE218A664B2B7C43B3E1C6EB7189B +:104ED000AF24A4FFF9CDC6FBF2BCBE7897A2308602 +:104EE000FAAB70F279C3FEE174129C1C0F84A7CE5A +:104EF00007797F2E1A87E851190C5871DE2E47FC6E +:104F000004CFCF7506AC18677E9378B742DF20C612 +:104F1000D1D7C7DB0AA12F599CB674E04FBE6BCF27 +:104F2000E1233958C5F182FB3FEA1E60387E2A240E +:104F3000BC55CDF1463DAC79A315F498D3C7FDF926 +:104F40009B24DDE7378DA3FBCF55162FC5D7EB127A +:104F5000BF7F5C11793FFC0373363D6675F3FCD56A +:104F600085827F6F92789D9219CCA1F76956447A19 +:104F700000E71C6733CDAF1BBF8F707C687807C517 +:104F800047F8E57CE1471C59D526233D7BE011F825 +:104F9000ADDA5441EB6DA145B73943E1D87C200728 +:104FA000F77AE6F0F58D77779853A7FB369F3F3277 +:104FB0002B83E6C9E1045E633CAE49786F86F30952 +:104FC000F1B1E217753F588DB7A050DC135C50D893 +:104FD000BB7DBD675D7A49BF69E4F485DDBBAF7514 +:104FE00069C345233EAEAD4ABC0316BE4ED5FA5446 +:104FF000EB52AD53B57E9FB2FA82295A8F9CE1FBEA +:105000006DDDCF7AC1D3B312DEB992AE1CAF874348 +:10501000EF156D2814F2A83CD3B8DED11FFABD4BB2 +:10502000958F0FE6E01EA0AAAFC62D97BFD305BE91 +:1050300007BFDD25E98EFA2BA9BEF17E4465B7BC1A +:10504000D8B92E19F2629746FAEECA070FA5FF1BD0 +:10505000F4D817841E7BBA66DBB254D80D2C818C31 +:10506000D0F799AA82423E2CE0FA0FE4C542B94F2C +:105070005F97A3DF573832A4DEC32FE4EA42BE04B1 +:10508000215F7EFFC26B1F8D71F5EC9F0AFEF9EB6D +:105090007F6DAD7084E24BF0F9FD795D74EFABD2BA +:1050A000617321CEB6B2A982E42D4BE1E7092D242C +:1050B0004E2A8C0F2A9A347A37ABB27E54C0FCBF8A +:1050C00028972B3794D1DB3C8A4EEAFD0DB59F2AF9 +:1050D000F8774AF8E74A3E7E49AEBFB9D56EDB4263 +:1050E0005AF76E5B25F85F96CFA9327EEFA653B7CD +:1050F0009FB9E09E14798F85CE251BACC2BEB73315 +:1051000086F4D5D32B5F796F26AFF7E5A32D19D0A1 +:105110004F141C8BA41D6F81B4C72D947A2BA7D379 +:105120001B85217276D1D3824E952FFEEA53BC0F98 +:10513000559E29E5D983E27EF9FCD65D44B739EB6B +:10514000375ADDBCDE7B856E839CAEAC2B76C23ECF +:105150003D777D8B1572E0BD4281B7707E2F9771D0 +:10516000A90AAFD877B410FF85AA0FF9B78B8F7350 +:10517000FB8AC858C465A871FE5BF271655D7C024C +:10518000C6ABACABF821CE3D4ADE87AFBBE3916244 +:105190003DCCE7FD615D1E1FE7A17BB6E5F2F7A5FB +:1051A000C2EB9F9374FBB155BC239816DDFA1CC566 +:1051B000152C8FF2403E6467B707302EF81970DB6C +:1051C0004CE2DDC1EC9AF6AF0007578B293E05296A +:1051D000DE3B829A9CCCF3CF98C47D20C496204DB0 +:1051E0002A12FC00D314CA59523BBD7F16129F6984 +:1051F000E0571BDBBA1EEFAFD89218FDDE8BE24FF3 +:10520000D58FE24FC5BF7DCDCF517479F33BEE967C +:1052100076883C4F06EE51CC7B6830BDCFFF5DF306 +:10522000B4C977F0BAE71B217EB7E092F9668B73B9 +:105230004BDFF3DD549ADCCB7CC3E7A9D6898ABD6A +:10524000EEF62B340BBFC2718DEF5FBCDDF1159113 +:1052500014F7A5E6A5ECDE971B2FEF294A9076847C +:10526000F618E891E5F2F7205850E4F1BD2CE4BBC4 +:10527000DAF7D5BB614A3E9FA893FB226B7F10EB08 +:1052800099D567D13B19C79A8FC7E0FD8EE3E30438 +:105290007CAADDED5671EF95C5D85C783F919FAF44 +:1052A000E8771F1634F5A773E4ADF55924176EF5AA +:1052B000C70BBB83D4EF174A39187D7BC53D57A078 +:1052C000FE66B753E3E32C70783EDF4CEDF33DD040 +:1052D00007A33795D93249EF15E700E507BA5D63B3 +:1052E0003EBACF043989F5653A908D7D67D16671F4 +:1052F0000E986262EBE12F1CD4E89B940A39F1B856 +:105300007837926D31BEAB7430C7776311F016F603 +:105310001ED9EDD6566F7FC871AE6FC0CEB4C0E156 +:1053200023BDFD6D29278F6DEAA0F7C9155E2FB942 +:10533000A76213F7523B634C647FBBDCFB2A55D258 +:105340009FA4F846F9A39EC0FF5D093C99685F2BB6 +:105350003597D3BB3EF76C9A4069D5C6D247FD85D9 +:10536000B80FEB4B1E43705BC93E56553B41DC1FEB +:105370007D26221EE79B0CAB3F23542FAD6AB997C5 +:10538000EEA99C6C89A47B2A139D6513E393E8BD69 +:105390005DBAF7A5EAFD40AECB25B5130CF74C1668 +:1053A000F03E1107FBE7D6688A2B55F747EE8ED201 +:1053B000BF5FD44FDC23B9D225EE8FA4527D57AF07 +:1053C000F670957EDE20EE2384DC8B993A87B7AFAA +:1053D000A97D3916FD2C7DE483511C33B03FAD050A +:1053E000DDBAEFC56C16F7621A715E821E99E09BFA +:1053F0003907F8FFA599F0DFD778D5F85192907367 +:10540000C4AD8138D25BF520B3C19FAC3B19E9C56F +:1054100027CDAC1E7A80D25FD4F747255E4EC635C5 +:1054200067803F166F7F2C03FBCBA918912FDF3EBF +:10543000EB6DC82B7D6B84D0CF2D8CF4E14ABFD0AF +:10544000AF5975827A1733721EFCB145D1E21D1E29 +:10545000797F46C1A5DE5B3D6511EFC5E05E0CF8C6 +:10546000FD134B7001E8FB09D75F718EFD819463DA +:105470009F349BE97747FC7CA1400FF9A4F9E5181C +:10548000DCCF55FA5AA9F9F75EBC47B3728FB8A7BB +:105490008A77CDE9CD4A69075926ED202B5FB54EB5 +:1054A000C2EF8E70FD8BBED45882B6DEE8B744EAF8 +:1054B00057DDF9DDBBE8DC56B353E80F35AD1DA46D +:1054C0003F287D44DD8B5BBAB383F409D56ED96E7A +:1054D0008197DADDE27B05E2D6E5EF856AD9384FC0 +:1054E0006B94FFB460FEAC3596D07C05E53F2D5043 +:1054F000F6914ED207EFCFFB0D9DC36B9B64BF3C73 +:105500006F0D19EF4D30693FF13DCB81F662DF57EA +:10551000E5B5BBE3A97DB0366A3DF679EF32870584 +:105520006963AD83F6FD2D75A63CCB080017E581B8 +:105530001EB75FC66FF55BFA9F91B01FA4B2CE4352 +:1055400078F7F5A0533F0A7E55BF67A9EEBD9C7F53 +:10555000FD8BE1E8FF9A41ED17F0C683754DED2C08 +:10556000F827DA8BE43C0ADA8783AFFB1D14F2F9E3 +:10557000492B5B4FEF075B7C0C76FBA0F42BFAFF0B +:105580006212BF2FA1059F0DD5AF9286093DDC1792 +:1055900021FC8B5EB77E0A707C4FB31616E34CED90 +:1055A00032E7A07FF53B2A4A4F1D2FE573BA3C5FD7 +:1055B000D906A438C0C79AD74BF710D7161CACC46D +:1055C000BEFC40A79D7E5F55C5E18DEF8C22BD35A9 +:1055D0007DC064DACF34978595F3FA070B4C41DC34 +:1055E000DB7A80D9455C803D4CAF3545523CB2B644 +:1055F000FF177F813C4F337F7508BF5392F66F1AB8 +:10560000BD7F39AFEBF327F11B33E52C504CEFE0B6 +:10561000C5EBA66190C35D933B744EB2079CAD761B +:105620008FD8275828FCFBEFFC4B6C82A907AEF300 +:105630009D9FD3BB82E73BED64AF1DBF5FBEB71735 +:1056400006CFF91417C545F37AA4679E7798E89DAD +:10565000B1F1FB0FD1BB79E3D5BB7A76E3BB7ACC52 +:10566000951E0F7B32D950B95290DC28E8764D9CBC +:10567000F19C98334C9CB7728609F9A1F0D7653F2D +:10568000F78EAEF5ACC3E5CA7FAF7E6FAA3A827ED5 +:105690006FAA6B7FD6B7BE9FF001F407AE176CC838 +:1056A000F4160EEBD7B37FCE907851FBB059F63F8E +:1056B00043E26786C324F011F67B1B8A3F14FD1575 +:1056C000BCEADE91A21BBBABED4DDC0BE2F42A7C05 +:1056D00088119DAE203AFDE5DD75B8E63FC0ECEDE2 +:1056E000D0DDFF123A05F10ECE65D3A92D9C4EC137 +:1056F000C8C1D0131E11BFBF151ED7C8F218ADF315 +:1057000079E628B203EAF25D70BEBEDFC4FA56EB5A +:105710007AD0E4F642EC8FC7F8D11B70B59B5AE9FA +:10572000FBF7878978C281AC2D55C6DF8C845ED6A5 +:1057300028DF3FEEFE1DC3C50E7A6FE47C40BD7FBF +:105740001C787C211F77D38C02B2EB9F6772BD5708 +:1057500077BF932DDE3FEE7E27DBEC273BC99C28ED +:10576000B2F374BF939D23DEBB7E4D63B97887D6B9 +:105770005F66A7F8F8F077B2F93EF31CFC194F54B6 +:1057800047911F4ABD8F3CDEA9D7818EE1EF233FB1 +:10579000AAF9E62C407F850EEAAF7D4ED48BDB055F +:1057A0009A83B0E31CAB8FA177A1155F2AFBF5208C +:1057B0007FC7E3C093BAD7F907C95F0AEFEA5E9BD8 +:1057C000C2BFE233BF95D1FD4FD001EFCAAAF7D9CE +:1057D000B5D5526EA8FB846F785C481F8CD7D70371 +:1057E000EEC6155C6E905DBCFD0ECCF7C93B63BC8C +:1057F00080EB98C9F8FBBD2A7D7898C9F03BA1F3EE +:10580000E47E354FC5FDD71BE3FEC3DFD14C8CF3DF +:105810003D328CB73FAB7D300A1FDFFD3FE65EE3D4 +:10582000489E92EB7F44B4FE24EAABFB0F4A3F7CD8 +:10583000B7F88B74FABD91AF0FD1EF2ACE75FA028B +:10584000A817992DFC017F486DA7FB1A7F98F3D705 +:1058500074B227AF16EF7F5E2E9C97DEA715FCB0C3 +:105860006A8188374C6375C4BF293DF7342301C76B +:10587000FF6FF7697BEEBB4E1E7E82E22E7CF47BCF +:1058800015E1F4181B71F065173FA9FC76D897B3A2 +:10589000E83E69DCC1556E9E3FF6D239914F3B78A8 +:1058A000C1CD69D3FED27991CF3F7801F7513F7BCB +:1058B000A953E4AF62E4CF3AF1D257B370FFB4BF5B +:1058C0005BFF23E835F362DD9BD85E3F5A73F3023A +:1058D00037DDA72C4BCF13F7293F41F98CE4F9EBC7 +:1058E000E2B49EFB94268FEF8FE0DBF35F09FE7638 +:1058F0007358C127FF6CAAEE932A79DB975C54EBAF +:10590000EE5F751F56AD63B6DDB3DE0A26F4FFD336 +:10591000F7549987CFEBFF021C7874630080000076 +:10592000000000001F8B080000000000000BB57C89 +:105930000B7854D5B5F03E73E6994C9249C80B02EA +:10594000E104420C18D299BCC05BEA1D2089015ABF +:105950001B6CB52018068D90D76442A82DB5D80CC5 +:105960000611A8DE0B5754B06827400035E8A001A7 +:105970002718EA00922252BF98FB37F2FD5FE10B35 +:105980003E90979310B557EF55B96BADBD4FE641BB +:1059900022DAFE7FF8DAEDDAEFBDD77BAD7D86B196 +:1059A000B196F3D18CFEAEC98C1D3FFC9EA249641A +:1059B0006C4681D16A90A034772BC6020EBB01DE03 +:1059C0007595F935B1BC9F36B45FA2D766C17E75B7 +:1059D00066EA973908FD72B1DF9F476BB1BE416F30 +:1059E000356430F6B48EB94D098CC5688EC8B84E92 +:1059F000CC2063CDD07FAC8131631E63297AC6B0E1 +:105A00001DFA312394BB06F97AE3121A56309867CF +:105A10005C85D9DA9C81BBF53056C858DA28FF6816 +:105A2000DC5FDA4A3DD5C7687A940633638126FF86 +:105A3000DC0F33192B8E8ACD653F8052CFB2711F98 +:105A40004C13656D85F54AE4AFBAD2006EEC906CEC +:105A5000B0342B36946F671319ABD7029088FF339D +:105A6000795A711D6D77F51EE8D7939C66DD08E0C5 +:105A7000D8D4832C331FC6BBCA72D804C68E5A1C16 +:105A800039D62468679B241C1F9DC3C7FFAC2C7AA2 +:105A9000870CE3FB0FDF54E880BA3B0CCA01666554 +:105AA0002CDF3B7A81F61680E39442C902B075EC94 +:105AB00002ED688053940312B41BDDA31714DF8238 +:105AC000E7335A3ECC66EC174C627180970CAD639D +:105AD000BA15CEEB2CFB44CF34D83EA02F9F0AF74B +:105AE0006A854960FDA4A3704FB0CF8139319E1DF6 +:105AF000703E96A314627BBA6E20D602F7D1FF9552 +:105B0000B6CC63A671B13F87FA6BF8F7AF8C3DD77F +:105B10002953BD0AABE5375689EED795697E0CEF60 +:105B2000AF3ED568A4B2F36A29C379B4E59977C0CA +:105B30003C763D5B529E73FDF801AB86F695B10E47 +:105B4000103A86C8CBCE14F8BF28A6C26E369DB1D7 +:105B5000965F41C5BFF0763809D34FD208F896ADAD +:105B6000C5DAB0FE76EC1F6C6776230B8E775AA7EA +:105B70006E5D9B29D6433C2F639E49708434D620AA +:105B800031B8BF54E627FCBC644BA073D11FE0E9D9 +:105B9000D94453CB46A45719E8328F4A6681322D37 +:105BA0001AD683F6B4374C1EA4AB5D264EB7991AAD +:105BB0005EEED2F0FEFA28E6463A1D073083F26D1B +:105BC0009BE377B6249AC74FF3C8FB6D488FA39920 +:105BD00097D64F616EDA8FDA6F2CEB3621CCB40397 +:105BE00059844F5933EC7D26D9666E463A0B34D929 +:105BF000D947DA607D203A765528FEEA71BC3974BF +:105C0000DC2C1AA78E77AED2B08F46E1E1FD443F7F +:105C1000CE4C8DDD9383E3D89B521ED677EBCB63BE +:105C200082E37A9B8CEC23B8D7FFD3C4A83CDD6415 +:105C3000A1F5FF6F532A957F6B52A8FE6C533695E2 +:105C40007D4D56AA7FBF693A95772D8A2940FA770C +:105C5000F966B28F8C42CEC0FF9C5E9DA32F04EEEE +:105C60009D393C1DBD26E8A83763F8F66E6C077CAD +:105C7000F6DECAF1D97F3FF3ECC820BA5C6B49B8B5 +:105C80001EFF30C284E7EB8F610BBC704F6F17486B +:105C9000347FFF680EEFB7EA683EBB866DC5F16FD3 +:105CA00017E8F9FC133455D86E4FE0F3F666010C93 +:105CB000FB59307DE6CBC897F664A8CF0BC2BD5325 +:105CC00078BB7D0CAF57F7ABB6FFCE66E17428F01A +:105CD000DEAF83F57388DE697EB5FFD7459C0F2361 +:105CE000FB7B3235659E61EE23C1C6FB135FC07D31 +:105CF000B8910F3242F8A25E21BE50E950A5BF977D +:105D00006CFC9E330D82CE4127D0FDA16E40F99AE6 +:105D1000027C20D1BDD8199C679724F825921FA03A +:105D20004439AEF283CA072ABDA7019F4909C1734E +:105D3000FC28825ED5F2B495E3A53B39E601C26B3F +:105D4000A7CE02A210FA03221310BEB3C00EE34A7C +:105D50001E35370C27BFE2FED97B50E5C108F7702E +:105D6000DDF9F5BCFCBEE727F986721BE9761879E8 +:105D7000F5B53581F6A3D26D92CDFE5F483FFD9219 +:105D8000492BC54169E2741379FEB70BF83954FA0F +:105D900079C9C6B8BEC4734EBC5EDEA9E7193AE73E +:105DA0007246722F338AD747E2573D5788DC8BB152 +:105DB0001506EF93316E0F8C057B606346907E0372 +:105DC000495F2E43FDB5CDAAD0FEFEA09109FFAAE2 +:105DD0003E19AA97E425F373C2F40CB3001E070E14 +:105DE0001B88BFFD1A56F50A8C6B2555113CF76DC3 +:105DF000362E0F06174CD2AC827D05FE6E76A3DEE2 +:105E00000A8C19382BC1F8C0563040C87EB0FF58F4 +:105E10004A66EC7ED029A897AE809C63598CC9DB7A +:105E20003E3F2BC1BE976D9319DA350110DB328CE2 +:105E3000733D19E331F2718CC1B83A31AE79EBA7F9 +:105E400077217D9D07FA44FBE62353FD040676CFB8 +:105E5000EC6D3ABAC765317A0FD61FDBFAC48945B3 +:105E6000009F6F9714B4374A6533B5D73C2F7B70CA +:105E70009D3A73E94509EC9C407BCB535150EFDCD4 +:105E8000AB63261857DA2E59FD30FF726F0CDE0C0B +:105E90005BB645F77E5F76506EDE26F458D52EC988 +:105EA0000314C3AAB687B7D7EC0A87EB983608C3A2 +:105EB000FCB36C318964FF4D6636B4FFD896045448 +:105EC0005643723B92AE506D237EEC8D5C1E33F6D2 +:105ED00059F21D4097F2E1CFD3DF377378BE80CF00 +:105EE00001FCC9E7FCFED57BAB1732FF93D1ACC0F8 +:105EF0000BE7AC3F6CB2B8E160F51D329D23E08D3D +:105F0000A37B7645F5DD4E7C7A48B6A01DB6C12749 +:105F1000BBB1DDD969DAA98173D61F9018DA9F4E1B +:105F20009FC1C3EFE9EA326C5FEE3359146C3F64F2 +:105F300060328C0F00DE4C88C7717D847FC42BDA01 +:105F4000A7F0F763A928887F19F19518C457F3566D +:105F5000BE9FF37B397E4AE5D55AC2578BC4524265 +:105F6000F0FC67CD8B43F8C27EB3B7FDB50BF1BC37 +:105F70000CF6675010EF32E1F93CE007E7D51FFE61 +:105F800028BDCF1CC4B70CF8FEAD3A1EFA2FBF01D6 +:105F9000BEAB987B1DDA73DF17CF69C8FF4964F782 +:105FA0009EFF03DABD31608F23E908FB38A9B6F7FD +:105FB00078222C589170D9B902EA27A5BEC232C105 +:105FC0004E90E21D8F225F9F9DF39747101D3D73FA +:105FD0005FB4215D34EBFA5A9F860A777CB4157959 +:105FE000B03F63FEF6D7609DE2842FD3F723BFFC5A +:105FF000C96041727A42F023FE1901FF4EC6EF1BC1 +:10600000F0780ECFEFEC34F80D708FACBDC43E6469 +:106010000F4C407DECD5A39C2AD10F54AC407B1C87 +:10602000E6C375242023E4EBDACE3F9F96609CA460 +:1060300024B2C5081BCD7E19E769D35D193A37CC68 +:106040002359FE42FDDA6C13E8FC13537EA4A0FC36 +:10605000695EC81C5113BF4DCE3392F3CF0A7F65E2 +:1060600044FB6F0479AFDA7DCC3D361EF90BEF822D +:10607000F30F973BCBA733F127F842C0556BDCB148 +:1060800046E8BCFC666B2A9EFF63A4B358A4BF53CA +:10609000DA51B0AFBA5689F0568FF483FE15EA375D +:1060A000A8EFF70A39F27C77F1A8442C252B702A47 +:1060B000ABEE94AD7E68AFF6717ABA8E6E84FCA8B2 +:1060C00069E3F2E33A3A6A0338C44EAB47BA526125 +:1060D000C0F7C9A0FC987A0DF6FBF23426F4955B64 +:1060E000D05B4E5C1FD0CB2053E22C39217A4BE29F +:1060F000F6962A576EDA0AA23E64DDC91E23D386BD +:10610000AC7BF35E4B183CD59B1AD6FF073E25AC03 +:10611000DDE6CF0E6BCF3F610D830BBBA787F59FED +:1061200076DA1E06DFD25716D6FF8717CAC3E0C13C +:106130001C38CF3076C7901E4A95C2FACF514C61B9 +:10614000F3CFCB8E0F8307CDE27E841DA8DAA75F45 +:10615000D8B81D1459AAF7FB136BF83AAA5FFCD301 +:10616000E9E1EBCDB787AFF75DF1B21BEC7E2DD83F +:10617000F57B413F62F902D8FF5AB0EBDBC0FE4726 +:10618000F825B0FFB1F482FD8FF5AF80FD8F703B35 +:10619000D8FF081F047F05615F531995879ACAA924 +:1061A000FE46F7D725D63D21D63D29D6FD47EF49F6 +:1061B0002D9D6593345F009FCE4CB8A847396C6F16 +:1061C000EC2BC538C0C05B32DB810CE2F09C684A26 +:1061D000447D348AA1DDC2CA07DEC63845FD818907 +:1061E000968D0AEAA1FF7C07DB03EDB282F2FCA8E0 +:1061F000EF83589CE7CA17C087F938EE8358F48FAD +:10620000EBBE64046F847605E039FB4130903D03BA +:10621000720DFB67AAB047CFA02C6FDBAF477CD4D1 +:10622000EEDD4FED6F7975E1ED7B5BC2DA2DD81FA6 +:10623000CA5AAD87FCFB4B3E753E3FF5AFCB94ECA5 +:1062400068175FDAFB9FC9CBB05FDBBBC9F77DCBBB +:106250007D7F72F0C51C94EB4ED0C37E73701E67B9 +:10626000874EC07CDF7599FB4B135011B4496C12FB +:106270001457D826B60AE45DADAFB50EE5506DF6FD +:10628000221DCB207924E20D206DD15E42E71EEE67 +:10629000EF8AF7D3D8FB60DE37BCC76FB723FE3A6F +:1062A0008FC5E2BAFDED72983F73771EB75BEFCEF4 +:1062B000D313DEAEB41F8B55A07D83F718BF6FAD2F +:1062C0009FCE7D54C0FD50D23DFB643A77F5171A3E +:1062D000BA7F75BEFBF3649A678E6F520C9EABC794 +:1062E000CBD773E529B4CE9CCCA595B8FF93A90B69 +:1062F0000B65B2F34030A35C9D32AF15E303B55E8E +:10630000D93E9CBFB546CCDBA5E374F856E6AB5D41 +:1063100063803E4E968DB291CC17FD7E93C7EDF112 +:1063200052BD2313F5428F5989413A7EB86C620CF5 +:10633000E2F52896585FB653EF80B2A69DAFD763BB +:10634000E98E457AEB69CF97D16E51E75B89EB1601 +:1063500086D0F510DEDC84A72A4F8B19E709E28F7F +:10636000D7BBF2B81D7ED2F3EE5D68A7F464475B3D +:10637000112F5D7A46FE6D2DE015F5414F675A0BE2 +:10638000DE83BA9E4BE0A33F5B43780DF874A2DF37 +:10639000A25616D64FC7F1B52B7C3F16CFB97F5BFF +:1063A000847AE959B0ABA1BA4ED7908CE7FF787BDD +:1063B000F8FEAAC43DD7E9FCC9C921F45AD731C4B3 +:1063C0002F66A2EF0E953F14C2A78AC79E6C6EB7C8 +:1063D000F5A41A3CE82FD6ED6F25BABE3EBED39D7C +:1063E00081767EDAAF8D1437BC913FABDA01217E26 +:1063F0000F433F4E5736B1503321A8EFAFD9EC2FA2 +:10640000E615A23F544EFE5E0F1B5886CADF897602 +:10641000701CCADDBF3D85EB0EB683BD07EB3A8D20 +:10642000BEB91F829D35680546817D0F6ED7798480 +:106430007F6246FB7499B04F3F561C4532E857E7E0 +:106440001A0D9DAF2E278ADBB5424E7EB23FE3A7E1 +:1064500048AF7527648B11ED50F05B086EE3764111 +:10646000BD37E3DF67A0BDDDA6233B40B53B9CC243 +:10647000EE382FECD9F36B06F464AF1E96D813B048 +:106480008F2ADFE6AE346877E6CC257BD529B75175 +:10649000FC71F9D670BBA0DA130ED7EE0D879D11F3 +:1064A0007683EAB7F5E40DD90F93D1FF289167A45D +:1064B000201F7C2CF0A9FA232BA75A5390DF3768B2 +:1064C00095B96A3C00EFC975F8D56ADCAFA72ECA4A +:1064D0004A7EC1AA43749FFD9F71BFA33F9571FB84 +:1064E00088F17BEDF771FA76E924EE6700B9D27C8A +:1064F00046C9B3069AFADD83B12497182B437E6808 +:106500005CC8FD483BC65CA1DC9727E24511FAF266 +:10651000566D9F1C1F221F3ECB9B40FB2FD633077F +:10652000EAA9953156D25BE38DDCDE2E59EDB5211B +:106530001D8C07FFD81012CF1E6F1E90B0DFAE87E4 +:1065400078FC5CF5EFE76B2DBAF810BD0792276C6D +:106550007E90247CFC8DE6B7C0FCE6E0FC70DF7129 +:1065600078DF9F1658491FA7CF67AC9BF8B181F819 +:10657000513DCF15A0B362A0338C9920DEEAB61F3F +:10658000A138B09375933F521ACBF7518AFB41382B +:106590008A97967C2E37CAF3F9BD350B58955B6FF9 +:1065A000E5DBE3F3A1DC9BEF48CAA77A0BD1E54A10 +:1065B000412B60A7A4F40D23771BFFC2FDAA4F81D6 +:1065C0000F90CFEF699094CC303B88D3B78B57B105 +:1065D000CBCCDB3B03EFC16DEFCE4E463F8AF3D50C +:1065E0009255262533844E5D48E7702F5596EA1F55 +:1065F000A3DDED5895AC60BCDF85743F01AF91D34E +:106600007522FC43FFE23A3AF786C3F0B71DE9ABC7 +:106610009E19ACA8475CBEC876AB16E33AF9F9C040 +:10662000073707F9205DD0658B43F2A0DC6FF94A8C +:10663000CBE3588B258A5BDD09954897F487FDAA43 +:10664000667A70FE3B01447F886D4924BEA1469066 +:10665000233F17E7BD53EB3F827C7C5CE7CDC078DE +:10666000CA7127CFEB2C646070807C59CCBAA9EC3E +:106670008DAE3FE0A7C9DDE3D06F7ECF61A0384E7D +:10668000CBDA1D31284F73D95ACBF96C54EE6CEF2D +:10669000B5FC91ED0A2024765EC50BC5853611FE4A +:1066A00055BCEECDB7CF47FC8F34BEF6AF076E4773 +:1066B00097A2F681567D0A279BEEECA220FE5CCCC9 +:1066C0009B8DFB55F135843FD8F358B887056CA0F6 +:1066D00008FD1A156F46F8371CDED4FB4CD70DFCAD +:1066E0000CAF0CF412C997487CAAF75BCF1A743C24 +:1066F000CED5F0CE42E87FF75A8D82F6E175F8BD2F +:10670000011EFC26DEE48F91C8DF1C092F2A3E54AF +:10671000FC9C8EE7E34EDF23539CEEFF355EDECA22 +:10672000773CFA6DFC18C97F23F1DB9255117C1977 +:10673000C17F2ABE1CAB6289CF543CD6298CFCD6C3 +:10674000BACE18AB8705F167867F883FCC53503CA3 +:10675000A65D62CF48DF850FFB28AF11891FA00D12 +:106760003BCAF59D11FCA7E26D24F9A3CAAF33CC57 +:106770007FDC22517E80F3E7AF0C1ECC2FAAF901FB +:10678000350F704CC8BFC8F20CD81D9877D998DD6A +:106790009384F65AAF5E9D87E71FCFACE91EB70220 +:1067A000C69F99C9CB5EB4D342607B148FC39D1939 +:1067B0006D70E3BD9D9126CF423D7E46FAF5ED1CFE +:1067C0004ED12B082F4C996501B857A7C6ED1E1660 +:1067D00072D843E59985D38AA99FC4DEC4FB5024AF +:1067E000564EEB48524219ECE7CC0393F29A59F01B +:1067F000FCAFE4737BD62BE4F9501CFB3712C5B118 +:1068000097800AB060BC7DD6D36513A0FEEC8313DD +:106810006D94FF6B0C5F1FF56806C50737D37CB717 +:106820007E31A05B9A13DCD790FE2BBECAEB2B27E0 +:10683000913F512570684F98CCFD58CFC438D4474C +:10684000AA7E1A3CF1AA39347E7911F417D387C095 +:10685000931F4F0FD56F4776FF3E0BE7A9D2BB734F +:10686000AD507FA1E50FE9680754ED7E348BECD283 +:10687000DD1BB2D0BFA8DAF1FB2C3BC1D10EF26F09 +:10688000B4FCDC97F7DDB27363881DFC6021F70B65 +:10689000161B8F94A07D3AF7E64F1EC178F8A40727 +:1068A000258A8BDDC3BA1F41BD5991CDF9886D3161 +:1068B000925C87F928EFD83AF927BB509E9FCCFE0F +:1068C000405709FD4C055ABA8F0AE6792C05E36159 +:1068D000EB258A8705FB8FA33CE6D2B5923E3511A6 +:1068E000F561BC4D56705C3CEDE3DEF5B62EACAF09 +:1068F00058CDEBE71A3CED3D38CFD37A6BAB821322 +:10690000954F280FC90B9B0AB8DFB5E43189EC71AC +:10691000759D494F25B7849ED35420F4F98C6EE2BF +:10692000FF9F0ABCFC78F5BB6FA62A984F72C4156E +:1069300040FB3B4F9ECF44F9559C703107E97C9258 +:10694000DEF14C359E7B8781E28705B969720AF4D6 +:10695000CFFBE5CC27B05CB27AE933D51807DD6A06 +:10696000243F4ADD5FA3A468D0DF3CD6F28B7BF1E5 +:10697000DE2E3C69243BBAB1E5A614360C9FAAE58D +:106980001EC0BF92C5D8F34D462A5F6CB230058E4B +:10699000B8AF2995E0979B142AD9024E5F8DC25F4C +:1069A0001D69BE7CF0F715905705EB613EB0376D61 +:1069B00026FB143CE7A429CE1D1BC4B926C1789B35 +:1069C0003B6336DE43C186155D688A2617F0FCE21C +:1069D000DB3DEBD3C98E5E7DEEB96A685F5A509E8F +:1069E0005F00F76DDC7E95FCFC631D8F56505C7F6D +:1069F00087819F4F9CFBC2935929CF60DCF52D1DE9 +:106A0000F9DFAEEDE79EDB00E57D8FADD087D2FBF1 +:106A1000773DAF4DECE7467C35D23D7C7FBEFA7DBD +:106A20003AF1CF0EE0AB9C7F9CAF5CABD7D0FD3D85 +:106A30005A507E37DEFB059D3B1DF9E9C2E41F116C +:106A40009DBB0F4B74FFAA1C57C72F10E7ADD5781D +:106A50001F237B50C8F1CFC1F3C3FB3DD2F17116A8 +:106A6000DAC39FFB167EEBB90F3661061DE35A466B +:106A70002A23DB8BF48E8956385F9186DBC191ED3A +:106A80000F17A871719E6FC73F8C0BD709FDE98462 +:106A90008DC525A0FE93FC51B998E7B8EDA216FD6F +:106AA0002FF0EBDE0FB72FD9FB217A7CA4FDDEA8F7 +:106AB000ACC779B441B93BEDB486F943F4F62D7D0A +:106AC00051CC1FB2EE90DF01757ACCB3748C26B92D +:106AD0008078C3BC4CA063F20E842FEA391E0307F2 +:106AE000C1BFE27115261705CF79B1E3722ECAD95D +:106AF000C8F3D61FBA4CF451E77BF4AA44E79F735E +:106B0000519B7BE3F31FD97D3917F17751D7578418 +:106B10007E5440DF978B78A87F9DCBF3EF7B0F6A85 +:106B20007DF57A3D8FEF4916F2074BE42BE4C7075A +:106B30004E703FBEBE6327C9D3C14E1E4F7169BAA6 +:106B40004B5330FED070AE0BE5D9602AF7AF607EB4 +:106B50003BDEDB8C89420F6A07D2E7835C3B2AF27B +:106B6000B5AA5F7701F9578FF378EBE83D526E34A1 +:106B700043BBE212F233D457ACCA5887747EC19338 +:106B8000849120F676EEFFD453FCED8D688B4C7625 +:106B90002BD486E06FE81C1E993F9C61AA9F1ECDF6 +:106BA000EC21FD5C7AE5A7E41F9FE47932D714CE8F +:106BB0004FEC10E727E7DA23FAD490F95E52E58725 +:106BC000B01FE7BEF13FC497A76CF65328CFA25180 +:106BD00016E27CA9711E4912FD8A82794073A7F0E2 +:106BE000C7CB646A77F964361AC7A4C650BEBE8C98 +:106BF0006DD2A2BD3B977967F077327DFFF643688F +:106C00009FF7869C8FEFB1C07EA6FC71699423B379 +:106C100011ED238D24EED55B303F549F15727B6BB5 +:106C2000862C911E1B181D4D76CA9C05CEC5B85FDB +:106C3000B55F9996EB339887EC2CE619C8C57C268E +:106C4000F30FE4629E53ED77D71BD10DA41799B7CC +:106C5000E0AE9075C61472BDF929E69F419EB84416 +:106C6000FEB344FEEA29F4A31A0FF33C61AF26E316 +:106C70003D7CAFE5867B46BC5E06BCDA51FF3898AA +:106C8000DD8EFC3335C983FCE3DA27317CB756DF70 +:106C900061D881719D7A5D5F32D2F306DF5FF5487E +:106CA000CFAE03EFEA95A9389EC781C05ED7E0FD5D +:106CB000BA84FE72FA6E7A0FE36ECE135C8B3AB52D +:106CC000EF925F5FDBBE9FFCF73AE627FFBDAE2D7C +:106CD0009C5E0653799C3D923FC6142A617C3167C5 +:106CE0002BE78BBB64D680728E89B8E99CD414B232 +:106CF0004782E3849D285F7E04ED97FE09925582CA +:106D0000A9FAA3DC6BD12E7267717BA6FF4F2F16F9 +:106D10002C23B9E229F819BE8B11F6EE9CF59BB530 +:106D200072C87EE674F238617F14AB3A48F8768C0C +:106D3000453CA4E7958F2DE4EF6472E99D8F86C7EB +:106D40003523CFF1AC88E39CC4384F4E70DFF3D2CB +:106D5000D2B81C631EA29F2E0D5F5F7DF7A28E5FCF +:106D600021E869C81F92787C6A24B98279944A9193 +:106D700047A91479944A9147A91479944A9147A94B +:106D80001479944A9147A91479944A9147A914799E +:106D900014AC3F895BA5F7703B9F417AE8421E1B0C +:106DA00013847B1322E031E1FD7B13A470788C44C3 +:106DB000FD8B0B773EE3CEC138A645C8252506EDF1 +:106DC000AF0B261E5FEA8871CC2D84FACA39CDBB81 +:106DD000F97B443BBD67294E58B818F96B30D1C0D8 +:106DE000500EB90B1DF3111F274ECCCEDC4CF2D147 +:106DF00064C53C77EFDD37C7515CEE2D99C9B0E42F +:106E0000CCECFCB50500CF344B44B720277E50AE08 +:106E1000FA9330CFEC4E9ECF2891EB2A71FEC6D16B +:106E2000A67C8A6BE53B161586C40F4AC72CCF4457 +:106E30003BA84BA7BC87F154F75F740CFD2835FEC7 +:106E4000A6F6EBCD9B598DFB9A933D716D1ECA1B27 +:106E5000602E946F763D6BC37DD935D15233C92BEB +:106E6000458BFC5F2DF03D4BE1F6B05FAF6813D072 +:106E70006F8F9A99E85678BEAA52E4AB2A45BE0AAB +:106E8000F1730AE36650BE03F55876433D9691EFE1 +:106E9000B9761794AF24BA6503E9A1EFC1E6225F82 +:106EA0007139938EF4FC8288C367178A7769F9E594 +:106EB0000FF2715E9AA756C4DF2EEBC2F378EAB8E0 +:106EC000E07846E51D3FE0F299C5E9F97BD7B1CC02 +:106ED0008DEF69EF786D34C593021E8D5B17073017 +:106EE000F038CA2FF61AF76F592AE7973B5E4DA183 +:106EF0007ECD220EEA4CE8CE4A40BD2BF84A850FE3 +:106F00007EC3DFF938F30086F275899FCF79477722 +:106F1000563CC001C9A4C1F8B873076FEF117CE7F4 +:106F20009C20E613E761466F3AE2A3FFF06BE9F7B6 +:106F300002BCD1EC5FC6E5BD3F8BE434F367E17B77 +:106F4000A1CB92F72CBEB7FDF5C17F5984EF6B2F13 +:106F5000EBBCCF21FCDB8333382CED3F6B096D4F4D +:106F6000F2A6E37BDC5F1FFCE1227C9F7B3969FF9B +:106F700073F1D61058F7CA596CD73F3C635131F4BE +:106F80009F67F09C6842BA7999D39769DF81F3785B +:106F90003FB51DDC5E9FB5EFC09557501F1F88A100 +:106FA0007CBDAF3083EEBBB963CF63486F81FD3AE0 +:106FB000E2838D6D7F7DEEB7D4CF40619479066F0B +:106FC00001865CDC457FBB1BF7352FDAFB19C29BC2 +:106FD0008B6EA37DCE1BC5F9F9A9A2B98B903F0397 +:106FE00007F6FD0AF96F5E1C18B2B89F174D849F13 +:106FF0009A572717631C2010D35D81F3D7BF60B069 +:10700000229DD6BC9A320BE302C70B797CBA7ACAAE +:10701000A674D4AF9A43CFEFFE2DC6295F30517EC0 +:10702000C695C0EDBB1AB9A56805E16FE76E7C3760 +:107030001278DE4479D26A9803D7ABDE3D89E2EA62 +:10704000AF7FFD4105E2A144DEBE1BEB3FDB65D215 +:10705000E03DF4E8ED713F423EECD1919F592DE0C7 +:10706000EADE517C3FD17DA584BFC44DE9A85F6BAA +:1070700046FDE676DCF73C79D373E8E7B03D06CA17 +:10708000155C7C1EEE0DC65D6CD5D12BD5C0F331E1 +:107090005AA497CBD2A68A6770FE56DEEFB2691368 +:1070A000DDA7BBF52686EB413F86F2EAB2B439ACE8 +:1070B000FE62EB9E5CF4432FBD308FFC5195CE55A4 +:1070C0007EA9D96508D387240992C57B0952B36E7E +:1070D00066063D5B2DC04B07B7059E61C1F197DA8F +:1070E000747E3DDC51B581ADC5F7C12A3FD4A4DD26 +:1070F0005686E7ABD1B464A1BD529DDF57817C7148 +:10710000D1C48CA9F88E4EE8AB9AF635F3D1EE1DBA +:10711000693FB1E25DDFE7820F3FF7993CA1F9C11A +:10712000C8F26F4D4C3915F26EF89E0603D9EEEA9F +:107130007C6FEBBD75E89FD52770F97116FAB781A2 +:107140001C331771B9B76455787FA988BF4BACD78A +:10715000F765A1DE53E7FFA650956B7D5928AF2256 +:10716000C7CD9385BC7951227953D32E9D93E19E4F +:107170006A8C6E0FBEDFA94167929F537B4DE2E39D +:10718000528BC4BDC3D8A78B3268DD9A3693DD0419 +:10719000E36AA3FA62D11EAA8BE98B453B277048AC +:1071A000663B04BA1293057E26089485C41DABBDC8 +:1071B0003ABB2977183CA3DD84EF73F0BF61FDB6BD +:1071C00022CE2755BE685A8F59FA8A904EABB687A1 +:1071D0008FC3735942F82FE0DB991CEA8FDBC4BEE2 +:1071E000FBA573C427FD5FBF9F8E78AFD1B0B59864 +:1071F00047BC24F1EF1E00A6EF1E2E897C64CDDF74 +:10720000CD51482F973EAF23BE0D487D24D7CE1CCD +:107210005C407229A0EB23B9D6535441F22110DF10 +:10722000578172EACCC17ADE3EBAAF4281F64E8413 +:10723000B17D1C237D7FB9E801921FF364FEBE81FE +:10724000EDD459781C687D6F13F9153A25D4EFBE3B +:1072500052A4E66DF4C173CB41BE0930655F3BF2C9 +:10726000619599E239603FB5BD8276DEC2642BC676 +:10727000C5AB701CA7037D68FE2F31E1CB65889FED +:1072800045718E3B8B308F9DD347FE035035D9E936 +:10729000F57F32901FD9AF1BD88D722A37CEB1B08F +:1072A00008F651A7EF5E87A1A72BBABE2ECCFBCD67 +:1072B00095B93C627B385D057276F2EF2444FEB0EE +:1072C000BA88CB5FD05BAC05E942E2F83DE67BF5DE +:1072D00014CA9540F74492C7917C73D1F7442CCAE5 +:1072E00087D3A0C7DD217EFEE9A57B284FBF00DF45 +:1072F000654079EFDA707A18FCEA67E4EFB1C742CB +:10730000EA910EB784C3917484F4E80F933B6EA2A4 +:107310009B3D82AF6A6775D7E33D0CC177002C8730 +:10732000C04723E088FEAC9CDB097BF0BF61DEBA7E +:1073300071FE5EF2CFF7F177B1CDA0BF083E104DE0 +:107340007963CD3ED04F895C3FA15EA88DEDA6B894 +:1073500054E08081F2230F777C4CEF19810E29FED7 +:1073600052DBF15A32FAED3EF41392480F26D33B2A +:1073700095031DC9E86FA8F5751A6F96788F4F763B +:10738000BA5AEF94FD59B8FF5AA93B17DB7D851611 +:10739000D11F60196146E7A89338BFB30E99E4790D +:1073A00024DEF60A7A05B9904BEF2C0EF1B8802A4C +:1073B00007AA853C398AF5399CEF2D6A5E49C2F7E8 +:1073C00072D1C3CA879B8A547BB881E236BB8A14C8 +:1073D0007EAF623CCDCBE34AD45EFFFAE5DC0939EF +:1073E000384E11E342E4D0C4A05C41FE4F25FE7F3D +:1073F00058970CE7AA794EB236A39C5ABCA614BA89 +:10740000B3E5DA15A5142F13EF3F23F7154947F617 +:10741000228EDF1A4D7C4962C87C97C05D4FCD2318 +:107420003943EFE8EF4F7CBC14E313BF58BC99E835 +:107430007948DF84F2399E673B97E3C836D734D763 +:10744000D3F1F286967529C3EC23729FD58E96D21E +:1074500064E5FA7A75BF974CEAFE66E99242EF61FD +:10746000C19AD22428971BFFD17BE0E7BDD461F0FD +:10747000A35EAD5EBC625DDC3074739D3ED81EA21F +:10748000BF26207E3D94D71869FF91659DE4EFC526 +:10749000381103BE6A25FE027E09D10B6542BF0E7C +:1074A000C51BAA968E47BF9339968E473D037C55E0 +:1074B000611DC6AFC42F4B34F476C34D65E47E3EE8 +:1074C0002BE271D2B222CE2FA76CF66F50BE8EF493 +:1074D000BD85619AF4ADDF5BA46906DF417E4B4B4D +:1074E0008E51300F54323B9AF73B6CB260DCA6FFF2 +:1074F000F09714D7ED7FC4BC80E70BCC6C34B47725 +:10750000A54EDD11AA473CD3385F461770BBC59521 +:10751000ADFBF6B8504ECC505C88EC869C68CA93A4 +:10752000047C9F92DEEAEF2CB4603E23D00DDE2176 +:10753000F093EBEBFF4A46FD1AE8FC88DE8305BEBC +:10754000FA98DE896D10EFF48EFAC43BAB6E258697 +:10755000BE8B2BFBA014FB6D1465303EC0E35A6A52 +:10756000A9FAFF21FEEF946985C3FABF090E73687B +:107570005C4049192E8E121A17C8D4F2B80096181A +:1075800017C8CCE4710184312E8025C605B01EE3F6 +:107590000208635C00618C0B208C71012C312E8001 +:1075A000F59F89EF1FFA4130F178A599E4FA4A7CFA +:1075B000DF0EF7B7F230CF3BAD6C95297F8BDF3F05 +:1075C000A07EBBEEDD4CBB7837E3DD4C793CD701C8 +:1075D000D98A2872E9068E631CC7B55FB2AE41B97D +:1075E000D2B480D6DFD059F8DE62AC6FD559350AF7 +:1075F000D111C7638B44EFF46B3A5B29EE549C7254 +:10760000584FF56D12C338E95D06EEE73A65A8CD2F +:10761000A33C28D9C14E4337F91FB57B25A532F4C9 +:107620009DC6F4AB2407D47CF232DEC49C5E935238 +:1076300039CC3B90A177E7E2DDF432CC33E37B71C8 +:10764000F92B7AD7EF04877414D2E156FEFED902E3 +:10765000FF88DF23DE35D574EE5F87EFA122F3CDFF +:1076600043DFD345E49DEBA789BCB28D7F5F51F624 +:1076700064E5BE03B0DEE02603D91BEE42C703D3A8 +:107680009230EF6FA7F8C8F1C326F28B3EDC7C5333 +:10769000587C84E53B1E9C46F9F9B114AF68D44987 +:1076A000A48F67974D4CC17B9C7D42477AA737AF2B +:1076B0007C35F66B9CAA503CAAC4C01EA079C47B42 +:1076C00029151F25CD924703F05266A577F64BE0AA +:1076D0009A305ED9AF33AFC7774D4B187FE7A0D252 +:1076E0004DE36689E8060304789F15E23E9774FE31 +:1076F000F94B7CC7709F81DBAD691A9EBF4EDBC81A +:10770000DF33DCCF1C7AD4B3CB91BA64D28F7FEA5B +:10771000837A47F4D8746E972B2938FFD2933A7A3C +:107720006F5B92F2932C07E9E9627AC720F917C9D7 +:10773000D76E1E997F22DF311CD771B902F748FE40 +:107740005017D225C5651C549E6CAAA2F277E27B25 +:1077500088EBDFFF0F9C453F312D25C68A726EC432 +:10776000EFDDA2BEFD7BAF17C4FBB5344D4FBE822B +:10777000F7F177B315EF437D2778CA56BE1FF16442 +:107780008F656E0B7D0F061210EEB5140F22615C33 +:10779000DB6BC7EF8E060E4B167A977C9D7CDCFC6C +:1077A00008BE1371654A1649C1F8F7A69264D877E6 +:1077B000E9840CDAB7CBC7E3A37443C9183FE7F8F1 +:1077C0004ACF731C9B5618AC9F27F82600FD399DA5 +:1077D000FCD083F4F61DE2A6BBB0BF9B99E87B6AA0 +:1077E000FA83FDCCBB791CC54F55BA196C4BD981B6 +:1077F00074F39E90FB8B17BFAB43FDDF9BEFE8C19B +:107800007D54545E7D2499CE377CFC4A7DA71E1999 +:10781000BF0A959FFF3FDEA79F6A6AA0F29DA6550B +:10782000547637B9A93D44FE5F1A41FE47C63FAFC3 +:10783000227F47C63F99518923FD09FCCDE3CD1135 +:10784000F1CEB251F7AE87FB9BBD456FC52A35FE21 +:1078500089EF87579A491EFCF7B461E39EEABD9908 +:10786000294E3AC84C7978FFB3B2276A35D0AE9D1D +:10787000CEF1A7C61D913FF07CC81F58227F68B586 +:1078800041FE78560F2C5CC0F5BC9BF4BC89F0BA65 +:107890006E0DC80F80EF639630F97125427E80C36C +:1078A00071377D57D56960182754DF51CE82E28B3E +:1078B000BC61E48997CB937151DEE7E97BFFFA283D +:1078C0007A9F7B5CBC873BBE81BF87AB64E5B4EE2F +:1078D00030722516F171DFA881B37F80FEF7FDDEDF +:1078E0004CF6CABAD1CB8AFE19B9724D7CD7F234A4 +:1078F000FEAE80F6DB7E57E03109F3A18DF7301B39 +:10790000E259FD5D811491CFFE1EBF2B306D7AE1EF +:1079100077FF5D815BA78F5F1CFABB02B7FA323835 +:10792000ACFEAE001BBF7884DF15983D3DE9FADF61 +:1079300015B86D3AF71747FA5D01B027CB705C9226 +:10794000CD3E07CB34B1CFC8EF694F8AFC5D97C6F7 +:10795000B118CBD258B796EA359E02FA0E5EE3FD17 +:1079600025F981F98E9FE3794B9FB04DC90638CD3B +:10797000E02539D99B67BF13EBAFD9EC77E13A919A +:107980007173C42DFAF7B09FBBB13DF2DD958ACF7C +:1079900015D3B9DC6814E58CE6E1BF276F9CCEF304 +:1079A000F237DA37ECB706D71BDAFFA6A505B81F02 +:1079B000D86F2DD6C37EEBB064E684B0EF53AFA78B +:1079C0003337D155E3744E5F20CFE67DC8ED412AB1 +:1079D000B3B49E78B41FC73CE489C7FD8E691930E3 +:1079E000E177107F740F9850BFFF71F58009EBFFAE +:1079F00068E7EF9523E77F793AF703B2660CD0F892 +:107A0000F168E3937D3E108FF65356D587EB28DF60 +:107A1000B27732E997F142BF8C7F6882AF0FE86D91 +:107A2000FCB638CA67B3E2446AAF31723EAD79A89A +:107A3000F2E00185BEDB9AF76188BD33D903FB0E06 +:107A4000B3BFB483FCDD25C0784F7B750423CDA282 +:107A50007DE564FCDDE5182137D04E5B0C72C15921 +:107A6000F5E69794F7C7F1381FE66891FE7CBA41B6 +:107A7000F17D9A05FDD0E50BD674915FB875A85ECF +:107A8000F899FBD7A1DF0CF65B587D4DE5912ED41C +:107A900037B57BC3EB9D0D57C97F05FB2DACFE9E13 +:107AA0005F9ED3F3DF2F08AF07FCEE45BA54F17B9E +:107AB0005CE79D8C7EDE71679495BFDFF7D2EF9512 +:107AC000EC10DF3FEFFC8F599C6E04BE61BC377435 +:107AD000FCC8F4D14CFDDDB35836F2C38D4A552EA7 +:107AE0000DFDFE899EB929BE373786E48E4BF855C9 +:107AF000F59516D2F369F546925F25729415E1A1CA +:107B0000DF3F2993859CF212FFF7DC1E4F713C3A50 +:107B100000C2095329EF93DCCCE1812403C9871209 +:107B20004D79DD1E28DFD4847FC7FE2CCA0719F9E2 +:107B3000977F87E9D27BF977E25AA510FDDC66C909 +:107B4000BE0DBF7B6C96441CB1DA4CF9827E8C2F43 +:107B5000C279B6C47BB62D8375B6DC9943F6713F06 +:107B6000E3F2D4BD80E7ADB6C4972F5E81ED0BA7DD +:107B700050FBC16F263E5E80F653759415EDA72D20 +:107B8000366E5F6F999F4DEDAF4BCA1A3CB7FB2124 +:107B900046EB6C99CFCFBDE5F171E2FB0B8F09F994 +:107BA000794B8B7D34E6A366591C17105F63443E06 +:107BB0006E4B06D443F99454BEF07E9C672ADFEFE7 +:107BC000EF6C0AC98FE30BA73CBE5B2135E2C7BC53 +:107BD000906B6E0CF9C1FF0BB81F749470470000D6 +:107BE0000000000000000000050207000000000087 +:00000001FF diff --git a/trunk/firmware/bnx2x-e1h-5.2.7.0.fw.ihex b/trunk/firmware/bnx2x-e1h-5.2.7.0.fw.ihex new file mode 100644 index 000000000000..280bbcf4f2a1 --- /dev/null +++ b/trunk/firmware/bnx2x-e1h-5.2.7.0.fw.ihex @@ -0,0 +1,12847 @@ +:1000000000003BE8000000600000068800003C5053 +:1000100000001968000042E0000000AC00005C50E5 +:1000200000008DE400005D00000000EC0000EAE844 +:100030000000E3000000EBD8000000940001CEE0D7 +:10004000000058E80001CF78000000C400022868D2 +:100050000000F9700002293000000004000322A80B +:10006000020400480000000F020400540000004594 +:1000700002040058000000840204005C0000000636 +:100080000204007000000004020400780000000078 +:100090000204007C121700000204008022170000F6 +:1000A00002040084321700000604008800000005E6 +:1000B0000204009C12150000020400A0221500009A +:1000C000020400A432150000060400A80000000489 +:1000D000020400B802100000020400BC001000007E +:1000E000020400C010100000020400C42010000030 +:1000F000020400C830100000020400CC40100000D0 +:10010000060400D000000003020400DC0010000020 +:10011000020400E012140000020400E422140000B3 +:10012000020400E832140000020400EC4214000053 +:10013000060400F000000003010401240000000098 +:1001400001040128000000000104012C000000004F +:100150000104013000000000020401D00000890603 +:1001600002040004000000FF02040008000000FF79 +:100170000204000C000000FF02040010000000FF59 +:1001800002040014000000FF02040018000000FF39 +:100190000204001C000000FF02040020000000FF19 +:1001A000020400240000003E0204002800000000B9 +:1001B0000204002C0000003F020400300000003F59 +:1001C000020400340000003F020400380000003F39 +:1001D0000204003C0000003F020400400000003F19 +:1001E000020400440000003F020404CC00000001AF +:1001F00002042008000002110204200C000002008A +:10020000020420100000020402042014000002195D +:100210000204201C0000FFFF020420200000FFFF5A +:10022000020420240000FFFF020420280000FFFF3A +:1002300002042038000000200204203C00000000DE +:100240000204204000000034020420440000003575 +:10025000060420480000001C020420B80000000131 +:10026000060420BC0000005F0204223807FFFFFFE5 +:100270000204223C0000003F0204224007FFFFFF6F +:10028000020422440000000F010422480000000084 +:100290000104224C00000000010422500000000074 +:1002A0000104225400000000010422580000000054 +:1002B0000104225C00000000010422600000000034 +:1002C0000104226400000000010422680000000014 +:1002D0000104226C000000000104227000000000F4 +:1002E00001042274000000000104227800000000D4 +:1002F0000104227C000000000C042000000003E840 +:100300000A042000000000010B0420000000000A85 +:1003100002050044000000200205004800000032F1 +:10032000020500900215002002050094021500202D +:1003300002050098000000300205009C0810000033 +:10034000020500A000000033020500A400000030F8 +:10035000020500A800000031020500AC0000000208 +:10036000020500B000000005020500B40000000610 +:10037000020500B800000002020500BC00000002F7 +:10038000020500C000000000020500C400000005D6 +:10039000020500C800000002020500CC00000002B7 +:1003A000020500D000000002020500D40000000198 +:1003B00002050114000000010205011C00000001FB +:1003C00002050120000000020205020400000001F5 +:1003D0000205020C0000004002050210000000406F +:1003E0000205021C0000002002050220000000138C +:1003F0000205022400000020060502400000000A59 +:1004000004050280002000000205005000000007E3 +:100410000205005400000007020500580000000813 +:100420000205005C000000080205006000000001F9 +:100430000605006400000003020500D80000000665 +:100440000205000400000001020500080000000190 +:100450000205000C00000001020500100000000170 +:100460000205001400000001020500180000000150 +:100470000205001C00000001020500200000000130 +:100480000205002400000001020500280000000110 +:100490000205002C000000010205003000000001F0 +:1004A00002050034000000010205003800000001D0 +:1004B0000205003C000000010205004000000001B0 +:1004C000020500E00000000D020500E80000000742 +:1004D000020500F000000007020500F80000000718 +:1004E000020500E40000002D020500EC00000027DA +:1004F000020500F400000027020500FC00000027B0 +:10050000020500E00000001D020500E800000017E1 +:10051000020500F000000017020500F800000017B7 +:10052000020500E40000003D020500EC0000003779 +:10053000020500F400000037020500FC000000374F +:10054000020500E00000004D020500E80000004741 +:10055000020500F000000047020500F80000004717 +:10056000020500E40000006D020500EC00000067D9 +:10057000020500F400000067020500FC00000067AF +:10058000020500E00000005D020500E800000057E1 +:10059000020500F000000057020500F800000057B7 +:1005A000020500E40000007D020500EC0000007779 +:1005B000020500F400000077020500FC000000774F +:1005C0000406100002000020020600DC000000010A +:1005D000010600D80000000004060200000302200B +:1005E000020600DC00000000010600B80000000068 +:1005F000010600C800000000010600BC0000000069 +:10060000010600CC000000000718040000A900004B +:10061000081807C800070223071C00002C2100004F +:10062000071C800038930B09071D0000292B192E89 +:10063000081D685052F60225011800000000000055 +:10064000011800040000000001180008000000006C +:100650000118000C0000000001180010000000004C +:100660000118001400000000021800200000000122 +:1006700002180024000000020218002800000003F5 +:100680000218002C000000000218003000000004D6 +:1006900002180034000000010218003800000000B9 +:1006A0000218003C00000001021800400000000495 +:1006B0000218004400000000021800480000000179 +:1006C0000218004C00000003021800500000000057 +:1006D0000218005400000001021800580000000435 +:1006E0000218005C00000000021800600000000119 +:1006F00002180064000000030218006800000000F7 +:100700000218006C000000010218007000000004D4 +:1007100002180074000000000218007800000004B5 +:100720000218007C00000003061800800000000290 +:10073000021800A400003FFF021800A8000003FFF9 +:100740000218022400000000021802340000000019 +:100750000218024C00000000021802E4000000FF32 +:100760000618100000000400021B8BC000000001EE +:10077000021B800000000034021B804000000018B3 +:10078000021B80800000000C021B80C000000020C3 +:100790000C1B83000007A1200A1B83000000013806 +:1007A0000B1B830000001388021B83C0000001F4B0 +:1007B000021B1480000000010A1B148000000000CE +:1007C000061A1000000003B3041A1ECC0001022711 +:1007D000061AA020000000C8061AA00000000002AF +:1007E000021A1ED000000000061A1ED800000006E3 +:1007F000061A36E800000004061A36E0000000027F +:10080000061A500000000002061A500800000004FA +:10081000061A501800000004061A502800000004B0 +:10082000061A503800000004061A50480000000460 +:10083000061A505800000004061A50680000000410 +:10084000061A507800000002041A404000020228F4 +:10085000061A400000000002061A400800000002CC +:10086000041A62C00020022A061AD1000000000209 +:10087000061A200000000124061AB000000000281B +:10088000061AB1400000000C061A330000000014E4 +:10089000061A33A000000068061A81080000000252 +:1008A000061AD1C800000002061AD1D800000020A4 +:1008B000061A249000000124061AB0A000000028A7 +:1008C000061AB1700000000C061A33500000001424 +:1008D000061A354000000068061A81100000000268 +:1008E000061AD1D000000002061AD25800000020DB +:1008F000021A292000000000061A30000000000241 +:10090000041A30080005024A061A301C00000009CB +:10091000061A320000000008061A5000000000020B +:10092000061A508000000012061A40000000000263 +:10093000061AD0C000000002021A2924000000009C +:10094000061A304000000002041A30480005024F29 +:10095000061A305C00000009061A32200000000868 +:10096000061A501000000002061A50C800000012BB +:10097000061A400800000002061AD0C80000000253 +:10098000021A292800000000061A30800000000228 +:10099000041A308800050254061A309C0000000931 +:1009A000061A324000000008061A5020000000021B +:1009B000061A511000000012041A401000020259D9 +:1009C000061AD0D000000002021A292C00000000F4 +:1009D000061A30C000000002041A30C80005025B8D +:1009E000061A30DC00000009061A32600000000818 +:1009F000061A503000000002061A5158000000127A +:100A0000041A401800020260061AD0D80000000242 +:100A1000021A293000000000061A3100000000020E +:100A2000041A310800050262061A311C0000000990 +:100A3000061A328000000008061A5040000000022A +:100A4000061A51A000000012041A4020000202679A +:100A5000061AD0E000000002021A2934000000004B +:100A6000061A314000000002041A314800050269EC +:100A7000061A315C00000009061A32A000000008C6 +:100A8000061A505000000002061A51E80000001239 +:100A9000041A40280002026E061AD0E80000000284 +:100AA000021A293800000000061A318000000002F6 +:100AB000041A318800050270061A319C00000009F2 +:100AC000061A32C000000008061A5060000000023A +:100AD000061A523000000012041A4030000202755B +:100AE000061AD0F000000002021A293C00000000A3 +:100AF000061A31C000000002041A31C8000502774E +:100B0000061A31DC00000009061A32E00000000875 +:100B1000061A507000000002061A527800000012F7 +:100B2000041A40380002027C061AD0F800000002C5 +:100B30000200A294071D29110200A29800000000E3 +:100B40000200A29C009C04240200A2A0000000005D +:100B50000200A2A4000002090200A270000000002E +:100B60000200A274000000000200A2700000000059 +:100B70000200A274000000000200A2700000000049 +:100B80000200A274000000000200A2700000000039 +:100B90000200A27400000000020100B40000000185 +:100BA000020100B800000001020100DC00000001A9 +:100BB0000201010000000001020101040000000127 +:100BC0000201007C003000000201008400000028C7 +:100BD0000201008C0000000002010130000000044E +:100BE0000201025C00000001020103280000000075 +:100BF0000201607000000007020160800000000137 +:100C00000201055400000030020100C40000000190 +:100C1000020100CC00000001020100F80000000108 +:100C2000020100F00000000102010080003000001D +:100C3000020100880000002802010090000000006E +:100C40000201013400000004020102DC0000000186 +:100C50000201032C00000000020160740000000784 +:100C60000201608400000001020105640000003000 +:100C7000020100C800000001020100D000000001D4 +:100C8000020100FC00000001020100F4000000016C +:100C9000020C100000000020020C200800000211CD +:100CA000020C200C00000200020C201000000204C4 +:100CB000020C201C0000FFFF020C20200000FFFFA0 +:100CC000020C20240000FFFF020C20280000FFFF80 +:100CD000060C203800000002020C20400000003406 +:100CE000020C204400000035020C204800000020C7 +:100CF000020C204C00000021020C205000000022B9 +:100D0000020C205400000023020C20580000002494 +:100D1000020C205C00000025020C20600000002670 +:100D2000020C206400000027020C2068000000284C +:100D3000020C206C00000029020C20700000002A28 +:100D4000020C20740000002B060C207800000056D6 +:100D5000020C21D000000001020C21D4000000018F +:100D6000020C21D800000001020C21DC000000016F +:100D7000020C21E000000001020C21E4000000014F +:100D8000020C21E800000001020C21EC000000012F +:100D9000020C21F000000001020C21F4000000010F +:100DA000060C21F800000010020C223807FFFFFF9C +:100DB000020C223C0000003F020C224007FFFFFF14 +:100DC000020C22440000000F010C22480000000029 +:100DD000010C224C00000000010C22500000000019 +:100DE000010C225400000000010C225800000000F9 +:100DF000010C225C00000000010C226000000000D9 +:100E0000010C226400000000010C226800000000B8 +:100E1000010C226C00000000010C22700000000098 +:100E2000010C227400000000010C22780000000078 +:100E3000010C227C000000000C0C2000000003E8E4 +:100E40000A0C2000000000010B0C20000000000A2A +:100E5000020C400800000411020C400C00000400C9 +:100E6000020C401000000404020C40140000042195 +:100E7000020C401C0000FFFF020C40200000FFFF9E +:100E8000020C40240000FFFF020C40280000FFFF7E +:100E9000020C403800000046020C403C00000005F7 +:100EA000060C404000000002020C40480000000A0E +:100EB000020C404C000000F0060C40500000001FE7 +:100EC000020C40CC00000001060C40D00000003AAB +:100ED000020C41B800000001060C41BC00000003F8 +:100EE000020C41C800000001020C41CC00000001CE +:100EF000060C41D00000001A020C423807FFFFFF29 +:100F0000020C423C0000003F020C424007FFFFFF82 +:100F1000020C42440000000F010C42480000000097 +:100F2000010C424C00000000010C42500000000087 +:100F3000010C425400000000010C42580000000067 +:100F4000010C425C00000000010C42600000000047 +:100F5000010C426400000000010C42680000000027 +:100F6000010C426C00000000010C42700000000007 +:100F7000010C427400000000010C427800000000E7 +:100F8000010C427C00000000010C428000000000C7 +:100F90000C0C4000000003E80A0C400000000001B7 +:100FA0000B0C40000000000A020D0044000000325B +:100FB000020D008C02150020020D00900215002089 +:100FC000020D009408100000020D0098000000338C +:100FD000020D009C00000002020D00A000000000B5 +:100FE000020D00A400000005020D00A8000000058D +:100FF000060D00AC00000002020D00B4000000026B +:10100000020D00B800000003020D00BC0000000249 +:10101000020D00C000000001020D00C80000000227 +:10102000020D00CC00000002020D010800000001CA +:10103000020D015C00000001020D016400000001CE +:10104000020D016800000002020D02040000000110 +:10105000020D020C00000020020D021000000040F2 +:10106000020D021400000040020D022000000003E7 +:10107000020D022400000018060D0280000000127C +:10108000040D03000024027E020D004C000000014C +:10109000020D005000000002020D00540000000884 +:1010A000020D005800000008060D005C000000045E +:1010B000020D00C400000004020D00040000000145 +:1010C000020D000800000001020D000C00000001EC +:1010D000020D001000000001020D001400000001CC +:1010E000020D001800000001020D001C00000001AC +:1010F000020D002000000001020D0024000000018C +:10110000020D002800000001020D002C000000016B +:10111000020D003000000001020D0034000000014B +:10112000020D003800000001020D003C000000012B +:10113000020D011400000009020D011C0000000A4C +:10114000020D012400000007020D012C0000000721 +:10115000020D01340000000C020D013C0000000BE8 +:10116000020D014400000007020D011800000029D3 +:10117000020D01200000002A020D012800000027B6 +:10118000020D013000000027020D01380000002C84 +:10119000020D01400000002B020D01480000002755 +:1011A000020D011400000019020D011C0000001ABC +:1011B000020D012400000017020D012C0000001791 +:1011C000020D01340000001C020D013C0000001B58 +:1011D000020D014400000017020D01180000003943 +:1011E000020D01200000003A020D01280000003726 +:1011F000020D013000000037020D01380000003CF4 +:10120000020D01400000003B020D014800000037C4 +:10121000020D011400000049020D011C0000004AEB +:10122000020D012400000047020D012C00000047C0 +:10123000020D01340000004C020D013C0000004B87 +:10124000020D014400000047020D01180000006972 +:10125000020D01200000006A020D01280000006755 +:10126000020D013000000067020D01380000006C23 +:10127000020D01400000006B020D014800000067F4 +:10128000020D011400000059020D011C0000005A5B +:10129000020D012400000057020D012C0000005730 +:1012A000020D01340000005C020D013C0000005BF7 +:1012B000020D014400000057020D011800000079E2 +:1012C000020D01200000007A020D012800000077C5 +:1012D000020D013000000077020D01380000007C93 +:1012E000020D01400000007B020D01480000007764 +:1012F000020E004C00000032020E00940215002085 +:10130000020E009802150020020E009C0000003022 +:10131000020E00A008100000020E00A4000000331E +:10132000020E00A800000030020E00AC00000031E8 +:10133000020E00B000000002020E00B40000000423 +:10134000020E00B800000000020E00BC0000000207 +:10135000020E00C000000002020E00C400000000E7 +:10136000020E00C800000002020E00CC00000007C0 +:10137000020E00D000000002020E00D400000002A5 +:10138000020E00D800000001020E00E4000000017F +:10139000020E014400000001020E014C0000000199 +:1013A000020E015000000002020E020400000001C3 +:1013B000020E020C00000040020E0210000000406D +:1013C000020E021C00000004020E02200000002099 +:1013D000020E02240000000E020E02280000001B74 +:1013E000060E030000000012040E0280001B02A281 +:1013F000020E00540000000C020E0058000000090C +:10140000020E005C0000000F020E006000000010E1 +:10141000020E00640000000B060E006800000003CE +:10142000020E00DC00000003020E000400000001B8 +:10143000020E000800000001020E000C0000000176 +:10144000020E001000000001020E00140000000156 +:10145000020E001800000001020E001C0000000136 +:10146000020E002000000001020E00240000000116 +:10147000020E002800000001020E002C00000001F6 +:10148000020E003000000001020E003400000001D6 +:10149000020E003800000001020E003C00000001B6 +:1014A000020E004000000001020E00440000000196 +:1014B000020E01100000000F020E01180000000EC5 +:1014C000020E012000000000020E012800000000B2 +:1014D000020E01140000002F020E011C0000002E5D +:1014E000020E012400000000020E012C000000008A +:1014F000020E01100000001F020E01180000001E65 +:10150000020E012000000000020E01280000000071 +:10151000020E01140000003F020E011C0000003EFC +:10152000020E012400000000020E012C0000000049 +:10153000020E01100000004F020E01180000004EC4 +:10154000020E012000000000020E01280000000031 +:10155000020E01140000006F020E011C0000006E5C +:10156000020E012400000000020E012C0000000009 +:10157000020E01100000005F020E01180000005E64 +:10158000020E012000000000020E012800000000F1 +:10159000020E01140000007F020E011C0000007EFC +:1015A000020E012400000000020E012C00000000C9 +:1015B0000730040000E80000083007D8000502BD2D +:1015C000073400002EAA000007348000312D0BAB39 +:1015D00007350000358217F707358000396D25582B +:1015E00007360000142D33B40836321039BE02BF5E +:1015F0000130000000000000013000040000000085 +:1016000001300008000000000130000C0000000064 +:101610000130001000000000013000140000000044 +:10162000023000200000000102300024000000020F +:1016300002300028000000030230002C00000000EF +:1016400002300030000000040230003400000001CD +:1016500002300038000000000230003C00000001B1 +:10166000023000400000000402300044000000008E +:1016700002300048000000010230004C000000036E +:101680000230005000000000023000540000000151 +:1016900002300058000000040230005C000000002E +:1016A000023000600000000102300064000000030E +:1016B00002300068000000000230006C00000001F1 +:1016C00002300070000000040230007400000000CE +:1016D00002300078000000040230007C00000003AB +:1016E0000630008000000002023000A400003FFF2E +:1016F000023000A8000003FF0230022400000000B6 +:1017000002300234000000000230024C00000000F1 +:10171000023002E40000FFFF063020000000080055 +:1017200002338BC000000001023380000000001A69 +:10173000023380400000004E023380800000001021 +:10174000023380C0000000200C3383000007A1207A +:101750000A338300000001380B3383000000138834 +:10176000023383C0000001F40C3383801DCD65007B +:101770000A3383800004C4B40B338380004C4B4095 +:101780000A331480000000000233148000000001BE +:10179000063220000000010206328020000000C84E +:1017A000063280000000000206323DA8000000045E +:1017B00006323D800000000904323DA4000102C150 +:1017C00006323D00000000200632500000000400F8 +:1017D0000632400000000004063240D00000000243 +:1017E00006326B680000000204326B70000202C215 +:1017F00006326B1000000002043274C0000202C402 +:101800000632DA40000000020632E0000000080064 +:10181000023308000100000004330C00001002C66F +:10182000023308000000000004330C40001002D610 +:1018300006322450000000B406322AD00000000214 +:1018400006321000000001A002323DB80000000086 +:101850000632500000000020063251000000002037 +:101860000632520000000020063253000000002023 +:10187000063254000000002006325500000000200F +:1018800006325600000000200632570000000020FB +:1018900006325800000000200632590000000020E7 +:1018A00006325A000000002006325B0000000020D3 +:1018B00006325C000000002006325D0000000020BF +:1018C00006325E000000002006325F0000000020AB +:1018D00006326B780000005206326E080000000CE1 +:1018E0000632DA880000000206322720000000B429 +:1018F00006322AD80000000206321680000001A03D +:1019000002323DBC00000000063250800000002082 +:101910000632518000000020063252800000002074 +:101920000632538000000020063254800000002060 +:10193000063255800000002006325680000000204C +:101940000632578000000020063258800000002038 +:10195000063259800000002006325A800000002024 +:1019600006325B800000002006325C800000002010 +:1019700006325D800000002006325E8000000020FC +:1019800006325F800000002006326CC0000000526A +:1019900006326E380000000C0632DA9000000002B9 +:1019A00002322A300000000006324010000000021F +:1019B0000632D0000000000602322A340000000087 +:1019C00006324020000000020632D0180000000657 +:1019D00002322A38000000000632403000000002C7 +:1019E0000632D0300000000602322A3C000000001F +:1019F00006324040000000020632D04800000006D7 +:101A000002322A400000000006324050000000026E +:101A10000632D0600000000602322A4400000000B6 +:101A200006324060000000020632D0780000000656 +:101A300002322A4800000000063240700000000216 +:101A40000632D0900000000602322A4C000000004E +:101A500006324080000000020632D0A800000006D6 +:101A6000072004000093000008200780001002E611 +:101A7000072400002ADE0000072480002E050AB893 +:101A80000824E4A061D202E8012000000000000068 +:101A900001200004000000000120000800000000F8 +:101AA0000120000C000000000120001000000000D8 +:101AB00001200014000000000220002000000001AE +:101AC0000220002400000002022000280000000381 +:101AD0000220002C00000000022000300000000462 +:101AE0000220003400000001022000380000000045 +:101AF0000220003C00000001022000400000000421 +:101B00000220004400000000022000480000000104 +:101B10000220004C000000030220005000000000E2 +:101B200002200054000000010220005800000004C0 +:101B30000220005C000000000220006000000001A4 +:101B40000220006400000003022000680000000082 +:101B50000220006C00000001022000700000000460 +:101B60000220007400000000022000780000000441 +:101B70000220007C0000000306200080000000021C +:101B8000022000A400003FFF022000A8000003FF85 +:101B900002200224000000000220023400000000A5 +:101BA0000220024C00000000022002E40000FFFFBF +:101BB000062020000000080002238BC00000000166 +:101BC0000223800000000010022380400000001269 +:101BD0000223808000000030022380C00000000E3D +:101BE000022383C0000001F40223148000000001DE +:101BF0000A231480000000000622100000000042AA +:101C000006227020000000C80622700000000002BA +:101C1000022211E80000000006223000000000C08F +:101C2000062240700000008006225280000000045E +:101C30000622670000000100062290000000040058 +:101C400004226B08002002EA02230800013FFFFF84 +:101C500004230C000010030A022308000000000007 +:101C600004230C400010031A06228100000000A08B +:101C7000062286000000004006228C000000003C86 +:101C80000622B0000000020006228800000000804A +:101C900006228DE00000003C0622404000000006C5 +:101CA00006228380000000A006228700000000407A +:101CB00006228CF00000003C0622B8000000020062 +:101CC00006228A000000008006228ED00000003C20 +:101CD000062240580000000606228000000000088E +:101CE000022211480000000006223300000000021A +:101CF000062260400000003006228020000000081C +:101D00000222114C000000000622330800000002ED +:101D1000062261000000003006228040000000081A +:101D200002221150000000000622331000000002C1 +:101D3000062261C00000003006228060000000081A +:101D40000222115400000000062233180000000295 +:101D50000622628000000030062280800000000819 +:101D60000222115800000000062233200000000269 +:101D70000622634000000030062280A00000000818 +:101D80000222115C0000000006223328000000023D +:101D90000622640000000030062280C00000000817 +:101DA0000222116000000000062233300000000211 +:101DB000062264C000000030062280E00000000817 +:101DC00002221164000000000622333800000002E5 +:101DD0000622658000000030021610000000002876 +:101DE00002170008000000020217002C0000000388 +:101DF0000217003C00000004021700440000000825 +:101E000002170048000000020217004C000000907A +:101E1000021700500000009002170054008000904C +:101E20000217005808140000021700600000008A22 +:101E300002170064000000800217006800000081A3 +:101E40000217006C000000800217007000000006FE +:101E500002170078000007D00217007C0000076C12 +:101E600002170038007C1004021700040000000F65 +:101E70000616402400000002021640700000001CFC +:101E80000216420800000001021642100000000184 +:101E90000216422000000001021642280000000144 +:101EA0000216423000000001021642380000000114 +:101EB00002164260000000020C16401C0003D09085 +:101EC0000A16401C0000009C0B16401C000009C4B0 +:101ED0000216403000000008021640340000000CDA +:101EE0000216403800000010021640440000002096 +:101EF0000216400000000001021640D80000000158 +:101F000002164008000000010216400C000000010B +:101F100002164010000000010216424000000000BE +:101F2000021642480000000006164270000000023F +:101F30000216425000000000021642580000000045 +:101F40000616428000000002021660080000042409 +:101F50000216600C00000410021660100000041449 +:101F60000216601C0000FFFF021660200000FFFF49 +:101F7000021660240000FFFF021660280000FFFF29 +:101F800002166038000000200216603C00000020AD +:101F90000216604000000034021660440000003564 +:101FA00002166048000000230216604C0000002466 +:101FB0000216605000000025021660540000002642 +:101FC00002166058000000270216605C000000291D +:101FD000021660600000002A021660640000002BF8 +:101FE000021660680000002C0216606C0000002DD4 +:101FF0000616607000000052021661B80000000171 +:10200000061661BC0000001F0216623807FFFFFFC2 +:102010000216623C0000003F0216624007FFFFFF0D +:10202000021662440000000F011662480000000022 +:102030000116624C00000000011662500000000012 +:1020400001166254000000000116625800000000F2 +:102050000116625C000000000116626000000000D2 +:1020600001166264000000000116626800000000B2 +:102070000116626C00000000011662700000000092 +:102080000116627400000000011662780000000072 +:102090000116627C000000000C166000000003E8DE +:1020A0000A166000000000010B1660000000000A24 +:1020B0000216804000000006021680440000000561 +:1020C000021680480000000A0216804C000000053D +:1020D0000216805400000002021680CC00000004AA +:1020E000021680D000000004021680D40000000414 +:1020F000021680D800000004021680DC00000004F4 +:10210000021680E000000004021680E400000004D3 +:10211000021680E800000004021688040000000493 +:10212000021680300000007C021680340000003D62 +:10213000021680380000003F0216803C0000009C20 +:10214000021680F000000007061680F4000000056B +:102150000216880C0101010102168108000000002E +:102160000216810C00000004021681100000000419 +:1021700002168114000000020216881008012004D3 +:1021800002168118000000050216811C00000005DF +:1021900002168120000000050216812400000005BF +:1021A0000216882C20081001021681280000000861 +:1021B0000216812C00000006021681300000000784 +:1021C000021681340000000002168830010101204F +:1021D000061681380000000402168834010101014E +:1021E00002168148000000000216814C0000000425 +:1021F0000216815000000004021681540000000203 +:1022000002168838080120040216815800000005D3 +:102210000216815C000000050216816000000005C6 +:1022200002168164000000050216883C2008100197 +:1022300002168168000000080216816C000000068A +:102240000216817000000007021681740000000170 +:102250000216884001010120021681780000000169 +:102260000216817C0000000102168180000000013E +:102270000216818400000001021688440101010158 +:1022800002168188000000010216818C0000000403 +:1022900002168190000000040216819400000002E2 +:1022A00002168848080120040216819800000005E3 +:1022B0000216819C00000005021681A000000005A6 +:1022C000021681A4000000050216881420081001DF +:1022D000021681A800000008021681AC000000066A +:1022E000021681B000000007021681B40000000150 +:1022F0000216881801010120021681B800000001B1 +:10230000021681BC00000001021681C0000000011D +:10231000021681C4000000010216881C010101019F +:10232000021681C800000001021681CC00000004E2 +:10233000021681D000000004021681D400000002C1 +:102340000216882008012004021681D8000000052A +:10235000021681DC00000005021681E00000000585 +:10236000021681E4000000050216882420081001EE +:10237000021681E800000008021681EC0000000649 +:10238000021681F0000000070216E40C00000000B5 +:1023900002168828010101200616E410000000043E +:1023A0000216E000010101010216E4200000000015 +:1023B0000216E424000000040216E42800000004D1 +:1023C0000216E42C000000020216E00408012004BA +:1023D0000216E430000000050216E4340000000597 +:1023E0000216E438000000050216E43C0000000577 +:1023F0000216E008200810010216E4400000000860 +:102400000216E444000000060216E448000000073B +:102410000216E44C000000000216E00C010101204D +:102420000616E450000000040216E010010101014C +:102430000216E460000000000216E46400000004DC +:102440000216E468000000040216E46C00000002BA +:102450000216E014080120040216E47000000005D2 +:102460000216E474000000050216E478000000057E +:102470000216E47C000000050216E0182008100196 +:102480000216E480000000080216E4840000000642 +:102490000216E488000000070216E48C0000000128 +:1024A0000216E01C010101200216E4900000000168 +:1024B0000216E494000000010216E49800000001F6 +:1024C0000216E49C000000010216E0200101010157 +:1024D0000216E4A0000000010216E4A400000004BB +:1024E0000216E4A8000000040216E4AC000000029A +:1024F0000216E024080120040216E4B000000005E2 +:102500000216E4B4000000050216E4B8000000055D +:102510000216E4BC000000050216E02820081001A5 +:102520000216E4C0000000080216E4C40000000621 +:102530000216E4C8000000070216E4CC0000000107 +:102540000216E02C010101200216E4D00000000177 +:102550000216E4D4000000010216E4D800000001D5 +:102560000216E4DC000000010216E0300101010166 +:102570000216E4E0000000010216E4E4000000049A +:102580000216E4E8000000040216E4EC0000000279 +:102590000216E034080120040216E4F000000005F1 +:1025A0000216E4F4000000050216E4F8000000053D +:1025B0000216E4FC000000050216E03820081001B5 +:1025C0000216E500000000080216E50400000006FF +:1025D0000216E508000000070216E03C0101012098 +:1025E00002168240003F003F0216824400000000B5 +:1025F0000216E524003F003F0216E5280000000017 +:1026000002168248000000000216824C003F003F84 +:102610000216E52C000000000216E530003F003FE6 +:1026200002168250010001000216825401000100CE +:102630000216E534010001000216E5380100010030 +:1026400006168258000000020216E53C0000000059 +:102650000216E540000000000216826000C000C0C3 +:102660000216826400C000C00216E54400C000C02B +:102670000216E54800C000C0021682681E001E0057 +:102680000216826C1E001E000216E54C1E001E0083 +:102690000216E5501E001E00021682704000400027 +:1026A00002168274400040000216E55440004000CB +:1026B0000216E55840004000021682788000800033 +:1026C0000216827C800080000216E55C800080009B +:1026D0000216E56080008000021682802000200043 +:1026E00002168284200020000216E56420002000EB +:1026F0000216E5682000200006168288000000020D +:102700000216E56C000000000216E57000000000F3 +:102710000216829000000000021682940000000061 +:102720000216E574000000000216E57800000000C3 +:1027300002168298000000000216829C0000000031 +:102740000216E57C000000000216E5800000000093 +:10275000021682A000000000021682A40000000100 +:10276000061682A80000000A021681F400000C0878 +:10277000021681F800000040021681FC00000100F2 +:1027800002168200000000200216820400000017DA +:1027900002168208000000800216820C000002006F +:1027A00002168210000000000216821801FF01FFCD +:1027B0000216821401FF01FF0216E51001FF01FF5E +:1027C0000216E50C01FF01FF0216823C0000001317 +:1027D000021680900000013F021680600000014058 +:1027E00002168064000001400616806800000002A6 +:1027F00002168070000000C00616807400000007FA +:102800000216809C00000048021680A000000048CC +:10281000061680A400000002021680AC00000048EA +:10282000061680B000000007021682380000800003 +:1028300002168234000025E40216809400007FFF17 +:1028400002168220000F000F0216821C000F000FDC +:102850000216E518000F000F0216E514000F000F16 +:10286000021682280000000002168224FFFFFFFFEC +:102870000216E520000000000216E51CFFFFFFFF26 +:102880000216E6BC000000000216E6C000000002CE +:102890000216E6C4000000010216E6C800000003AC +:1028A0000216E6CC000000040216E6D00000000686 +:1028B0000216E6D4000000050216E6D80000000764 +:1028C000021680EC000000FF02140000000000016E +:1028D0000214000C0000000102140040000000017E +:1028E0000214004400007FFF0214000C00000000EE +:1028F00002140000000000000214006C0000000040 +:102900000214000400000001021400300000000165 +:1029100002140004000000000214005C000000002B +:10292000021400080000000102140034000000013D +:102930000214000800000000021400600000000003 +:102940000202005800000032020200A0031500201D +:10295000020200A403150020020200A801000030BA +:10296000020200AC08100000020200B000000033B8 +:10297000020200B400000030020200B80000003182 +:10298000020200BC00000003020200C000000006BA +:10299000020200C400000003020200C8000000039D +:1029A000020200CC00000002020200D00000000081 +:1029B000020200D400000002020200DC000000005D +:1029C000020200E000000006020200E40000000431 +:1029D000020200E800000002020200EC0000000217 +:1029E000020200F000000001020200FC00000006EC +:1029F0000202012000000000020201340000000277 +:102A0000020201B0000000010202020C00000001FD +:102A1000020202140000000102020218000000027B +:102A200002020404000000010202040C0000004045 +:102A300002020410000000400202041C0000000416 +:102A40000202042000000020020204240000000210 +:102A50000202042800000020060205000000001207 +:102A600004020480001F032A020200600000000F1D +:102A70000202006400000007020200680000000B70 +:102A80000202006C0000000E020200700000000E46 +:102A90000602007400000003020200F400000004BB +:102AA0000202000400000001020200080000000110 +:102AB0000202000C000000010202001000000001F0 +:102AC00002020014000000010202001800000001D0 +:102AD0000202001C000000010202002000000001B0 +:102AE0000202002400000001020200280000000190 +:102AF0000202002C00000001020200300000000170 +:102B0000020200340000000102020038000000014F +:102B10000202003C0000000102020040000000012F +:102B2000020200440000000102020048000000010F +:102B30000202004C000000010202005000000001EF +:102B400002020108000000C8020201180000000291 +:102B5000020201C400000000020201CC00000000DB +:102B6000020201D400000002020201DC00000002A7 +:102B7000020201E4000000FF020201EC000000FF7D +:102B800002020100000000000202010C000000C867 +:102B90000202011C00000002020201C80000000045 +:102BA000020201D000000000020201D80000000271 +:102BB000020201E000000002020201E8000000FF42 +:102BC000020201F0000000FF020201040000000008 +:102BD00002020108000000C8020201180000000201 +:102BE000020201C400000000020201CC000000004B +:102BF000020201D400000002020201DC0000000217 +:102C0000020201E4000000FF020201EC000000FFEC +:102C100002020100000000000202010C000000C8D6 +:102C20000202011C00000002020201C800000000B4 +:102C3000020201D000000000020201D800000002E0 +:102C4000020201E000000002020201E8000000FFB1 +:102C5000020201F0000000FF020201040000000077 +:102C600002020108000000C8020201180000000270 +:102C7000020201C400000000020201CC00000000BA +:102C8000020201D400000002020201DC0000000286 +:102C9000020201E4000000FF020201EC000000FF5C +:102CA00002020100000000000202010C000000C846 +:102CB0000202011C00000002020201C80000000024 +:102CC000020201D000000000020201D80000000250 +:102CD000020201E000000002020201E8000000FF21 +:102CE000020201F0000000FF0202010400000000E7 +:102CF00002020108000000C80202011800000002E0 +:102D0000020201C400000000020201CC0000000029 +:102D1000020201D400000002020201DC00000002F5 +:102D2000020201E4000000FF020201EC000000FFCB +:102D300002020100000000000202010C000000C8B5 +:102D40000202011C00000002020201C80000000093 +:102D5000020201D000000000020201D800000002BF +:102D6000020201E000000002020201E8000000FF90 +:102D7000020201F0000000FF020201040000000056 +:102D80000728040000C00000082807A8000B03491A +:102D9000072C000032FC0000072C800035790CC0A5 +:102DA000072D00003AC11A1F072D800039EF28D0E7 +:102DB000072E00001C3E374C082E3710391E034BDF +:102DC00001280000000000000128000400000000AD +:102DD00001280008000000000128000C000000008D +:102DE000012800100000000001280014000000006D +:102DF0000228002000000001022800240000000238 +:102E000002280028000000030228002C0000000017 +:102E100002280030000000040228003400000001F5 +:102E200002280038000000000228003C00000001D9 +:102E300002280040000000040228004400000000B6 +:102E400002280048000000010228004C0000000396 +:102E50000228005000000000022800540000000179 +:102E600002280058000000040228005C0000000056 +:102E70000228006000000001022800640000000336 +:102E800002280068000000000228006C0000000119 +:102E900002280070000000040228007400000000F6 +:102EA00002280078000000040228007C00000003D3 +:102EB0000628008000000002022800A400003FFF56 +:102EC000022800A8000003FF0228022400000000DE +:102ED00002280234000000000228024C000000001A +:102EE000022802E40000FFFF06282000000008007E +:102EF000022B8BC000000001022B800000000000AC +:102F0000022B804000000018022B80800000000C83 +:102F1000022B80C0000000660C2B83000007A1205C +:102F20000A2B8300000001380B2B8300000013885C +:102F3000022B83C0000001F40C2B8340000001F43D +:102F40000A2B8340000000000B2B8340000000058B +:102F50000A2B83800004C4B40C2B83801DCD650034 +:102F60000A2B1480000000000B2B8380004C4B4088 +:102F7000022B148000000001062A29C8000000046A +:102F8000042A29D80002034D062A208000000048A8 +:102F9000062A9020000000C8062A900000000002C7 +:102FA000062A21A800000086062A20000000002032 +:102FB000022A23C800000000042A23D00002034F85 +:102FC000042A249800040351022A2C500000000017 +:102FD000022A2C1000000000042A2C0800020355CD +:102FE000042A300000020357062A300800000100BE +:102FF000062A404000000010042A40000010035937 +:10300000062A6AC000000002062A6B0000000004C5 +:10301000042A840800020369022B08000000000053 +:10302000042B0C000010036B022B080001000000B1 +:10303000042B0C400008037B022B08000200000058 +:10304000042B0C6000080383062AC000000000D88F +:10305000062A24A800000014062A254800000022A1 +:10306000042A25D00002038B062A266800000022CD +:10307000042A26F00002038D062A27880000002279 +:10308000042A28100002038F062A28A80000002224 +:10309000042A293000020391062AA000000000281B +:1030A000062AA1400000000C042A29E00002039334 +:1030B000062A502000000002062A503000000002BC +:1030C000062A500000000002062A501000000002EC +:1030D000022A520800000001042A6AC8000203956F +:1030E000062A6B1000000042062A6D200000000432 +:1030F000062ABCD000000002062AC360000000D8E7 +:10310000062A24F800000014062A25D80000002210 +:10311000042A266000020397062A26F800000022EF +:10312000042A278000020399062A2818000000229A +:10313000042A28A00002039B062A29380000002246 +:10314000042A29C00002039D062AA0A0000000282E +:10315000062AA1700000000C042A29E80002039F3F +:10316000062A502800000002062A503800000002FB +:10317000062A500800000002062A5018000000022B +:10318000022A520C00000001042A6AD0000203A1A6 +:10319000062A6C1800000042062A6D300000000468 +:1031A000062ABCD800000002022AC6C000000000A7 +:1031B000042A29F0001003A3062A50480000000E3C +:1031C000062AB00000000006022AC6C40000000063 +:1031D000042A2A30001003B3062A50800000000E93 +:1031E000062AB01800000006022AC6C80000000027 +:1031F000042A2A70001003C3062A50B80000000EEB +:10320000062AB03000000006022AC6CC00000000EA +:10321000042A2AB0001003D3062A50F00000000E42 +:10322000062AB04800000006022AC6D000000000AE +:10323000042A2AF0001003E3062A51280000000E99 +:10324000062AB06000000006022AC6D40000000072 +:10325000042A2B30001003F3062A51600000000EF0 +:10326000062AB07800000006022AC6D80000000036 +:10327000042A2B7000100403062A51980000000E47 +:10328000062AB09000000006022AC6DC00000000FA +:10329000042A2BB000100413062A51D00000000E9F +:1032A000062AB0A800000006021010080000000165 +:1032B0000210105000000001021010000003D000A6 +:1032C000021010040000003D091018000200042341 +:1032D0000910110000280623061011A00000001894 +:1032E00006102400000000E00210201C0000000076 +:1032F0000210202000000001021020C00000000287 +:10330000021020040000000102102008000000014B +:1033100009103C000005064B091038000005065056 +:10332000091038200005065506104C000000010069 +:1033300002104028000000100210404400003FFF2F +:103340000210405800280000021040840084924A75 +:1033500002104058000000000210800000001080A1 +:10336000021080AC00000000021080380000001045 +:103370000210810000000000061081200000000201 +:1033800002108008000002B502108010000000004A +:10339000061082000000004A021081080001FFFFB1 +:1033A00006108140000000020210800000001A8018 +:1033B0000610900000000024061091200000004A32 +:1033C000061093700000004A061095C00000004AE5 +:1033D0000210800400001080021080B00000000184 +:1033E0000210803C00000010021081040000000068 +:1033F00006108128000000020210800C000002B5B7 +:103400000210801400000000061084000000004A32 +:103410000210810C0001FFFF06108148000000022D +:103420000210800400001A80061090900000002412 +:10343000061092480000004A061094980000004AC6 +:10344000061096E80000004A02108000000010807C +:10345000021080AC00000002021080380000001052 +:103460000210810000000000061081200000000210 +:1034700002108008000002B5021080100000000059 +:10348000061082000000004A021081080001FFFFC0 +:1034900006108140000000020210800000001A8027 +:1034A0000610900000000024061091200000004A41 +:1034B000061093700000004A061095C00000004AF4 +:1034C0000210800400001080021080B00000000391 +:1034D0000210803C00000010021081040000000077 +:1034E00006108128000000020210800C000002B5C6 +:1034F0000210801400000000061084000000004A42 +:103500000210810C0001FFFF06108148000000023C +:103510000210800400001A80061090900000002421 +:10352000061092480000004A061094980000004AD5 +:10353000061096E80000004A02108000000010808B +:10354000021080AC0000000402108038000000105F +:10355000021081000000000006108120000000021F +:1035600002108008000002B5021080100000000068 +:10357000061082000000004A021081080001FFFFCF +:1035800006108140000000020210800000001A8036 +:103590000610900000000024061091200000004A50 +:1035A000061093700000004A061095C00000004A03 +:1035B0000210800400001080021080B0000000059E +:1035C0000210803C00000010021081040000000086 +:1035D00006108128000000020210800C000002B5D5 +:1035E0000210801400000000061084000000004A51 +:1035F0000210810C0001FFFF06108148000000024C +:103600000210800400001A80061090900000002430 +:10361000061092480000004A061094980000004AE4 +:10362000061096E80000004A02108000000010809A +:10363000021080AC0000000602108038000000106C +:10364000021081000000000006108120000000022E +:1036500002108008000002B5021080100000000077 +:10366000061082000000004A021081080001FFFFDE +:1036700006108140000000020210800000001A8045 +:103680000610900000000024061091200000004A5F +:10369000061093700000004A061095C00000004A12 +:1036A0000210800400001080021080B000000007AB +:1036B0000210803C00000010021081040000000095 +:1036C00006108128000000020210800C000002B5E4 +:1036D0000210801400000000061084000000004A60 +:1036E0000210810C0001FFFF06108148000000025B +:1036F0000210800400001A80061090900000002440 +:10370000061092480000004A061094980000004AF3 +:10371000061096E80000004A021205B00000000101 +:103720000212049000E383400212051400003C10D2 +:103730000212066C00000001021206700000000078 +:1037400002120494FFFFFFFF02120498FFFFFFFF25 +:103750000212049CFFFFFFFF021204A0FFFFFFFF05 +:10376000021204A4FFFFFFFF021204A8FFFFFFFFE5 +:10377000021204ACFFFFFFFF021204B0FFFFFFFFC5 +:10378000021204BCFFFFFFFF021204C0FFFFFFFF95 +:10379000021204C4FFFFFFFF021204C8FFFFFFFF75 +:1037A000021204CCFFFFFFFF021204D0FFFFFFFF55 +:1037B000021204D8FFFFFFFF021204DCFFFFFFFF2D +:1037C000021204E0FFFFFFFF021204E4FFFFFFFF0D +:1037D000021204E8FFFFFFFF021204ECFFFFFFFFED +:1037E000021204F0FFFFFFFF021204F4FFFFFFFFCD +:1037F000021204F8FFFFFFFF021204FCFFFFFFFFAD +:1038000002120500FFFFFFFF02120504FFFFFFFF8A +:1038100002120508FFFFFFFF0212050CFFFFFFFF6A +:1038200002120510FFFFFFFF021204D4FF802000E8 +:10383000021204B4F0005000021204B8F0001000AC +:1038400002120390000000080212039C000000080E +:10385000021203A000000008021203A400000002EC +:10386000021203BC00000004021203C000000005A5 +:10387000021203C400000004021203D00000000082 +:103880000212036C00000001021203680000003FF6 +:10389000021201BC00000040021201C00000180822 +:1038A000021201C400000803021201C8000008034C +:1038B000021201CC00000040021201D000000003FF +:1038C000021201D400000803021201D8000008030C +:1038D000021201DC00000803021201E000010003F3 +:1038E000021201E400000803021201E800000803CC +:1038F000021201EC00000003021201F000000003BC +:10390000021201F400000003021201F8000000039B +:10391000021201FC0000000302120200000000037A +:103920000212020400000003021202080000000359 +:103930000212020C00000003021202100000000339 +:103940000212021400000003021202180000000319 +:103950000212021C000000030212022000000003F9 +:1039600002120224000000030212022800002403B5 +:103970000212022C0000002F021202300000000987 +:103980000212023400000019021202380000018401 +:103990000212023C000001830212024000000306F2 +:1039A0000212024400000019021202480000000640 +:1039B0000212024C0000030602120250000003062D +:1039C00002120254000003060212025800000C8684 +:1039D0000212025C000003060212026000000306ED +:1039E00002120264000000060212026800000006D3 +:1039F0000212026C000000060212027000000006B3 +:103A00000212027400000006021202780000000692 +:103A10000212027C00000006021202800000000672 +:103A20000212028400000006021202880000000652 +:103A30000212028C00000006021202900000000632 +:103A40000212029400000006021202980000000612 +:103A50000212029C00000006021202A000000306EF +:103A6000021202A400000013021202A800000006C5 +:103A7000021202B000001004021202B4000010048E +:103A80000212032400106440021203280010644054 +:103A9000021205B400000001021201B00000000192 +:103AA0000600A000000000160200A0EC5554000023 +:103AB0000200A0F0555555550200A0F400005555E0 +:103AC0000200A0F8F00000000200A0FC5554000025 +:103AD0000200A100555555550200A104000055559E +:103AE0000200A108F00000000200A18C5554000063 +:103AF0000200A190555555550200A194000055555E +:103B00000200A198F00000000200A19C000000004B +:103B10000200A1A0000100000200A1A400005014B6 +:103B20000200A1A8000000000200A45C00000C003C +:103B30000200A61C000000030200A06CFF5C000055 +:103B40000200A070FFF55FFF0200A0740000FFFFFD +:103B50000200A078F00003E00200A07C000000005A +:103B60000200A0800000A0000600A0840000000564 +:103B70000200A0980FE000000600A09C00000007D3 +:103B80000200A0B8000004000600A0BC0000000372 +:103B90000200A0C8000010000600A0CC0000000336 +:103BA0000200A0D8000040000600A0DC00000003D6 +:103BB0000200A0E8000100000600A22C00000004A2 +:103BC0000200A10CFF5C00000200A110FFF55FFFE6 +:103BD0000200A1140000FFFF0200A118F00003E0A2 +:103BE0000200A11C000000000200A1200000A000B3 +:103BF0000600A124000000050200A1380FE000002B +:103C00000600A13C000000070200A15800000800C7 +:103C10000600A15C000000030200A1680000200073 +:103C20000600A16C000000030200A17800008000E3 +:103C30000600A17C000000030200A1880002000031 +:103C40000600A23C0000000400000000000000008C +:103C50000000003100000000000000000000000033 +:103C60000000000000000000000000000000000054 +:103C700000000000000000000000000000310032E1 +:103C80000000000000000000000000000000000034 +:103C90000000000000000000000000000000000024 +:103CA000000000000000000000320056000000008C +:103CB0000000000000000000000000000000000004 +:103CC00000000000000000000000000000000000F4 +:103CD000000000000056008C000000000000000002 +:103CE000008C009000900094009400980098009C34 +:103CF000009C00A000A000A400A400A800A800ACA4 +:103D000000AC00B100B100B300B300B5000000008A +:103D100000000000000000000000000000000000A3 +:103D200000000000000000000000000000B50102DB +:103D30000102010A010A01120112011B011B0124E7 +:103D40000124012D012D01360136013F013F0148BB +:103D5000014801510151015A00000000000000001B +:103D60000000000000000000000000000000000053 +:103D70000000000000000000000000000000000043 +:103D80000000000000000000000000000000000033 +:103D90000000000000000000000000000000000023 +:103DA0000000000000000000000000000000000013 +:103DB0000000000000000000000000000000000003 +:103DC00000000000000000000000000000000000F3 +:103DD00000000000000000000000000000000000E3 +:103DE00000000000000000000000000000000000D3 +:103DF00000000000000000000000000000000000C3 +:103E00000000000000000000015A015F00000000F7 +:103E100000000000015F0160016001610161016259 +:103E2000016201630163016401640165016501666A +:103E300001660167000000000000000000000000B3 +:103E40000000000000000000000000000000000072 +:103E50000000000000000000000000000000000062 +:103E60000167016C016C0179017901860000000095 +:103E70000000000000000000000000000000000042 +:103E80000000000000000000000000000000000032 +:103E90000000000000000000000000000000000022 +:103EA0000000000000000000000000000000000012 +:103EB00000000000000000000186018700000000F3 +:103EC00000000000000000000000000000000000F2 +:103ED00000000000000000000000000000000000E2 +:103EE00000000000018701BE00000000000000008B +:103EF00000000000000000000000000000000000C2 +:103F000000000000000000000000000000000000B1 +:103F100001BE01E9000000000000000000000000F8 +:103F20000000000000000000000000000000000091 +:103F300000000000000000000000000001E9021A7B +:103F40000000000000000000021A022102210228E5 +:103F50000228022F022F02360236023D023D0244A1 +:103F60000244024B024B02520252028A000000003D +:103F700000000000028A028E028E029202920296D5 +:103F80000296029A029A029E029E02A202A202A631 +:103F900002A602AA02AA02FA02FA031103110328D6 +:103FA0000328032B032B032E032E03310331033489 +:103FB000033403370337033A033A033D033D034019 +:103FC00003400381038103880388038F038F0393D6 +:103FD000039303970397039B039B039F039F03A3F1 +:103FE00003A303A703A703AB03AB03AF03AF03B064 +:103FF00000000000000000000000000000000000C1 +:1040000000000000000000000000000000000000B0 +:10401000000000000000000003B003C20000000028 +:104020000000000000000000000000000000000090 +:104030000000000000000000000000000000000080 +:104040000000000003C203D703D703DA03DA03DD5D +:104050000000000000000000000000000000000060 +:104060000000000000000000000000000000000050 +:1040700003DD040A00000000000000000000000052 +:104080000000000000000000000000000000000030 +:10409000000000000000000000000000040A050D00 +:1040A0000000000000000000000000000000000010 +:1040B0000000000000000000000000000000000000 +:1040C0000000000000000000050D0514051405188F +:1040D0000518051C000000000000000000000000A2 +:1040E00000000000000000000000000000000000D0 +:1040F00000000000051C055C00000000000000003E +:10410000055C05650565056E056E05770577058017 +:1041100005800589058905920592059B059B05A4E7 +:1041200005A405FD05FD0613061306290629062D1F +:10413000062D063106310635063506390639063DA7 +:10414000063D064106410645064506490649065014 +:10415000000000000000000000000000000000005F +:10416000000000000000000000000000000000004F +:10417000000000000000000006500656000000008D +:10418000000000000000000000000000000000002F +:10419000000000000000000000000000000000001F +:1041A0000000000006560659000000000000000054 +:1041B00000000000000000000000000000000000FF +:1041C00000000000000000000000000000000000EF +:1041D0000659065F0000000000000000000000001B +:1041E00000000000000000000000000000000000CF +:1041F00000000000000000000000000000000000BF +:104200000000000000000000065F066E066E067DDE +:10421000067D068C068C069B069B06AA06AA06B996 +:1042200006B906C806C806D706D70748000000002A +:10423000000000000000000000000000000000007E +:10424000000000000000000000000000000000006E +:10425000000000000748075B075B076C076C077DE1 +:10426000000000000000000000000000000000004E +:10427000000000000000000000000000000000003E +:10428000000000000000000000000000000000002E +:10429000000000000000000000000000000000001E +:1042A000000000000000000000000000000000000E +:1042B00000000000000000000000000000000000FE +:1042C00000000000000000000000000000000000EE +:1042D00000000000000000000000000000000000DE +:1042E00000010000000204C00003098000040E4029 +:1042F00000051300000617C000071C8000082140BD +:1043000000092600000A2AC0000B2F80000C344050 +:10431000000D3900000E3DC0000F428000104740E4 +:1043200000114C00001250C00013558000145A4078 +:1043300000155F00001663C00017688000186D400C +:1043400000197200001A76C0001B7B80001C8040A0 +:10435000001D8500001E89C0001F8E800020934034 +:10436000000020000000400000006000000080000D +:104370000000A0000000C0000000E00000010000FC +:1043800000012000000140000001600000018000E9 +:104390000001A0000001C0000001E00000020000D8 +:1043A00000022000000240000002600000028000C5 +:1043B0000002A0000002C0000002E00000030000B4 +:1043C00000032000000340000003600000038000A1 +:1043D0000003A0000003C0000003E0000004000090 +:1043E000000420000004400000046000000480007D +:1043F0000004A0000004C0000004E000000500006C +:104400000005200000054000000560000005800058 +:104410000005A0000005C0000005E0000006000047 +:104420000006200000064000000660000006800034 +:104430000006A0000006C0000006E0000007000023 +:104440000007200000074000000760000007800010 +:104450000007A0000007C0000007E00000080000FF +:1044600000082000000840000008600000088000EC +:104470000008A0000008C0000008E00000090000DB +:1044800000092000000940000009600000098000C8 +:104490000009A0000009C0000009E000000A0000B7 +:1044A000000A2000000A4000000A6000000A8000A4 +:1044B000000AA000000AC000000AE000000B000093 +:1044C000000B2000000B4000000B6000000B800080 +:1044D000000BA000000BC000000BE000000C00006F +:1044E000000C2000000C4000000C6000000C80005C +:1044F000000CA000000CC000000CE000000D00004B +:10450000000D2000000D4000000D6000000D800037 +:10451000000DA000000DC000000DE000000E000026 +:10452000000E2000000E4000000E6000000E800013 +:10453000000EA000000EC000000EE000000F000002 +:10454000000F2000000F4000000F6000000F8000EF +:10455000000FA000000FC000000FE00000100000DE +:1045600000102000001040000010600000108000CB +:104570000010A0000010C0000010E00000110000BA +:1045800000112000001140000011600000118000A7 +:104590000011A0000011C0000011E0000012000096 +:1045A0000012200000124000001260000012800083 +:1045B0000012A0000012C0000012E0000013000072 +:1045C000001320000013400000136000001380005F +:1045D0000013A0000013C0000013E000001400004E +:1045E000001420000014400000146000001480003B +:1045F0000014A0000014C0000014E000001500002A +:104600000015200000154000001560000015800016 +:104610000015A0000015C0000015E0000016000005 +:1046200000162000001640000016600000168000F2 +:104630000016A0000016C0000016E00000170000E1 +:1046400000172000001740000017600000178000CE +:104650000017A0000017C0000017E00000180000BD +:1046600000182000001840000018600000188000AA +:104670000018A0000018C0000018E0000019000099 +:104680000019200000194000001960000019800086 +:104690000019A0000019C0000019E000001A000075 +:1046A000001A2000001A4000001A6000001A800062 +:1046B000001AA000001AC000001AE000001B000051 +:1046C000001B2000001B4000001B6000001B80003E +:1046D000001BA000001BC000001BE000001C00002D +:1046E000001C2000001C4000001C6000001C80001A +:1046F000001CA000001CC000001CE000001D000009 +:10470000001D2000001D4000001D6000001D8000F5 +:10471000001DA000001DC000001DE000001E0000E4 +:10472000001E2000001E4000001E6000001E8000D1 +:10473000001EA000001EC000001EE000001F0000C0 +:10474000001F2000001F4000001F6000001F8000AD +:10475000001FA000001FC000001FE000002000009C +:104760000020200000204000002060000020800089 +:104770000020A0000020C0000020E0000021000078 +:104780000021200000214000002160000021800065 +:104790000021A0000021C0000021E0000022000054 +:1047A0000022200000224000002260000022800041 +:1047B0000022A0000022C0000022E0000023000030 +:1047C000002320000023400000236000002380001D +:1047D0000023A0000023C0000023E000002400000C +:1047E00000242000002440000024600000248000F9 +:1047F0000024A0000024C0000024E00000250000E8 +:1048000000252000002540000025600000258000D4 +:104810000025A0000025C0000025E00000260000C3 +:1048200000262000002640000026600000268000B0 +:104830000026A0000026C0000026E000002700009F +:10484000002720000027400000276000002780008C +:104850000027A0000027C0000027E000002800007B +:104860000028200000284000002860000028800068 +:104870000028A0000028C0000028E0000029000057 +:104880000029200000294000002960000029800044 +:104890000029A0000029C0000029E000002A000033 +:1048A000002A2000002A4000002A6000002A800020 +:1048B000002AA000002AC000002AE000002B00000F +:1048C000002B2000002B4000002B6000002B8000FC +:1048D000002BA000002BC000002BE000002C0000EB +:1048E000002C2000002C4000002C6000002C8000D8 +:1048F000002CA000002CC000002CE000002D0000C7 +:10490000002D2000002D4000002D6000002D8000B3 +:10491000002DA000002DC000002DE000002E0000A2 +:10492000002E2000002E4000002E6000002E80008F +:10493000002EA000002EC000002EE000002F00007E +:10494000002F2000002F4000002F6000002F80006B +:10495000002FA000002FC000002FE000003000005A +:104960000030200000304000003060000030800047 +:104970000030A0000030C0000030E0000031000036 +:104980000031200000314000003160000031800023 +:104990000031A0000031C0000031E0000032000012 +:1049A00000322000003240000032600000328000FF +:1049B0000032A0000032C0000032E00000330000EE +:1049C00000332000003340000033600000338000DB +:1049D0000033A0000033C0000033E00000340000CA +:1049E00000342000003440000034600000348000B7 +:1049F0000034A0000034C0000034E00000350000A6 +:104A00000035200000354000003560000035800092 +:104A10000035A0000035C0000035E0000036000081 +:104A2000003620000036400000366000003680006E +:104A30000036A0000036C0000036E000003700005D +:104A4000003720000037400000376000003780004A +:104A50000037A0000037C0000037E0000038000039 +:104A60000038200000384000003860000038800026 +:104A70000038A0000038C0000038E0000039000015 +:104A80000039200000394000003960000039800002 +:104A90000039A0000039C0000039E000003A0000F1 +:104AA000003A2000003A4000003A6000003A8000DE +:104AB000003AA000003AC000003AE000003B0000CD +:104AC000003B2000003B4000003B6000003B8000BA +:104AD000003BA000003BC000003BE000003C0000A9 +:104AE000003C2000003C4000003C6000003C800096 +:104AF000003CA000003CC000003CE000003D000085 +:104B0000003D2000003D4000003D6000003D800071 +:104B1000003DA000003DC000003DE000003E000060 +:104B2000003E2000003E4000003E6000003E80004D +:104B3000003EA000003EC000003EE000003F00003C +:104B4000003F2000003F4000003F6000003F800029 +:104B5000003FA000003FC000003FE000003FE00138 +:104B600000000000000001FF0000020000007FF8CC +:104B700000007FF800000CDF0000150000000001BD +:104B80000000000100000001FFFFFFFFFFFFFFFF2B +:104B9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 +:104BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 +:104BB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 +:104BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 +:104BD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 +:104BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 +:104BF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 +:104C0000FFFFFFFFFFFFFFFFFFFFFFFF00000000B0 +:104C1000FFFFFFFF00000000FFFFFFFFFFFFFFFFA0 +:104C200000000000FFFFFFFF00000000FFFFFFFF8C +:104C3000FFFFFFFF00000000FFFFFFFF000000007C +:104C4000FFFFFFFF0000000300BEBC20FFFFFFFFCF +:104C500000000000FFFFFFFF00000000FFFFFFFF5C +:104C60000000000300BEBC20FFFFFFFF00000000AB +:104C7000FFFFFFFF00000000FFFFFFFF0000000339 +:104C800000BEBC20FFFFFFFF00000000FFFFFFFF92 +:104C900000000000FFFFFFFF0000000300BEBC207B +:104CA000FFFFFFFF00000000FFFFFFFF000000000C +:104CB000FFFFFFFF0000000300BEBC20FFFFFFFF5F +:104CC00000000000FFFFFFFF00000000FFFFFFFFEC +:104CD0000000000300BEBC2000002000000040C017 +:104CE00000006180000082400000A3000000C3C0FB +:104CF0000000E4800001054000012600000146C0DC +:104D000000016780000188400001A9000001C9C0BE +:104D10000001EA8000020B4000022C0000024CC09F +:104D200000026D8000028E400002AF000002CFC082 +:104D30000002F0800003114000033200000352C063 +:104D400000037380000394400003B5000003D5C046 +:104D50000003F6800004174000043800000458C027 +:104D60000004798000049A40000080000001038064 +:104D70000001870000020A8000028E0000031180FB +:104D8000000395000004188000049C0000051F80AB +:104D90000005A300000626800006AA0000072D805B +:104DA0000007B100000834800008B80000093B800B +:104DB0000009BF00000A4280000AC600000B4980BB +:104DC000000BCD00000C5080000CD400000D57806B +:104DD000000DDB0000007FF800007FF80000193EA6 +:104DE0000000350000001900001000000000000065 +:104DF00000000000FFFFFFFF400000004000000037 +:104E000040000000400000004000000040000000A2 +:104E10004000000040000000400000004000000092 +:104E20004000000040000000400000004000000082 +:104E30004000000040000000400000004000000072 +:104E40004000000040000000400000004000000062 +:104E50004000000040000000400000004000000052 +:104E60004000000040000000400000004000000042 +:104E7000400000004000000000007FF800007FF8C4 +:104E8000000005C700001500FFFFFFFFFFFFFFFF49 +:104E9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 +:104EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 +:104EB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 +:104EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 +:104ED000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 +:104EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 +:104EF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 +:104F0000FFFFFFFFFFFFFFFF400000004000000029 +:104F10004000000040000000400000004000000091 +:104F20004000000040000000400000004000000081 +:104F30004000000040000000400000004000000071 +:104F40004000000040000000400000004000000061 +:104F50004000000040000000400000004000000051 +:104F60004000000040000000400000004000000041 +:104F70004000000040000000400000004000000031 +:104F800040000000400000000000100000002080F1 +:104F900000003100000041800000520000006280EB +:104FA0000000730000008380000094000000A480D3 +:104FB0000000B5000000C5800000D6000000E680BB +:104FC0000000F700000107800001180000012880A0 +:104FD000000139000001498000015A0000016A8087 +:104FE00000017B0000018B8000019C000001AC806F +:104FF0000001BD000001CD800001DE000001EE8057 +:105000000001FF0000007FF800007FF80000112E73 +:105010000000350010000000000028AD0000000076 +:105020000001000100070205CCCCCCC5FFFFFFFF4B +:10503000FFFFFFFF7058103C000000000000000060 +:1050400000000001CCCC0201CCCCCCCCCCCC0201F9 +:10505000CCCCCCCCCCCC0201CCCCCCCCCCCC0201BA +:10506000CCCCCCCCCCCC0201CCCCCCCCCCCC0201AA +:10507000CCCCCCCCCCCC0201CCCCCCCCCCCC02019A +:10508000CCCCCCCC00000000FFFFFFFF40000000B4 +:105090004000000040000000400000004000000010 +:1050A0004000000040000000400000004000000000 +:1050B00040000000400000004000000040000000F0 +:1050C00040000000400000004000000040000000E0 +:1050D00040000000400000004000000040000000D0 +:1050E00040000000400000004000000040000000C0 +:1050F00040000000400000004000000040000000B0 +:10510000400000004000000040000000002625A0F4 +:1051100000000000002625A000000000002625A0B9 +:1051200000000000002625A000000000000E023252 +:10513000011600D60010000000000000002625A087 +:1051400000000000002625A000000000002625A089 +:1051500000000000002625A00000000000720236BA +:10516000012300F300100000000000000000FFFF1A +:10517000000000000000FFFF000000000000FFFF33 +:10518000000000000000FFFF000000000000FFFF23 +:10519000000000000000FFFF000000000000FFFF13 +:1051A000000000000000FFFF000000000000FFFF03 +:1051B000000000000000FFFF000000000000FFFFF3 +:1051C000000000000000FFFF000000000000FFFFE3 +:1051D000000000000000FFFF000000000000FFFFD3 +:1051E000000000000000FFFF000000000000FFFFC3 +:1051F000000000000000FFFF000000000000FFFFB3 +:10520000000000000000FFFF000000000000FFFFA2 +:10521000000000000000FFFF000000000000FFFF92 +:10522000000000000000FFFF000000000000FFFF82 +:10523000000000000000FFFF000000000000FFFF72 +:10524000000000000000FFFF000000000000FFFF62 +:10525000000000000000FFFF000000000000FFFF52 +:10526000000000000000FFFF000000000000FFFF42 +:10527000000000000000FFFF000000000000FFFF32 +:10528000000000000000FFFF000000000000FFFF22 +:10529000000000000000FFFF000000000000FFFF12 +:1052A000000000000000FFFF000000000000FFFF02 +:1052B000000000000000FFFF000000000000FFFFF2 +:1052C000000000000000FFFF000000000000FFFFE2 +:1052D000000000000000FFFF000000000000FFFFD2 +:1052E000000000000000FFFF000000000000FFFFC2 +:1052F000000000000000FFFF000000000000FFFFB2 +:10530000000000000000FFFF000000000000FFFFA1 +:10531000000000000000FFFF000000000000FFFF91 +:10532000000000000000FFFF000000000000FFFF81 +:10533000000000000000FFFF000000000000FFFF71 +:10534000000000000000FFFF000000000000FFFF61 +:10535000000000000000FFFF000000000000FFFF51 +:10536000000000000000FFFF00000000FFFFFFF34F +:10537000318FFFFF0C30C30CC30C30C3CF3CF300A4 +:10538000F3CF3CF30000CF3CCDCDCDCDFFFFFFF1FF +:1053900030EFFFFF0C30C30CC30C30C3CF3CF30025 +:1053A000F3CF3CF30001CF3CCDCDCDCDFFFFFFF6D9 +:1053B000305FFFFF0C30C30CC30C30C3CF3CF30095 +:1053C000F3CF3CF30002CF3CCDCDCDCDFFFFF406B3 +:1053D0001CBFFFFF0C30C305C30C30C3CF3000141B +:1053E000F3CF3CF30004CF3CCDCDCDCDFFFFFFF29A +:1053F000304FFFFF0C30C30CC30C30C3CF3CF30065 +:10540000F3CF3CF30008CF3CCDCDCDCDFFFFFFFA6D +:10541000302FFFFF0C30C30CC30C30C3CF3CF30064 +:10542000F3CF3CF30010CF3CCDCDCDCDFFFFFFF748 +:1054300031EFFFFF0C30C30CC30C30C3CF3CF30083 +:10544000F3CF3CF30020CF3CCDCDCDCDFFFFFFF51A +:10545000302FFFFF0C30C30CC30C30C3CF3CF30024 +:10546000F3CF3CF30040CF3CCDCDCDCDFFFFFFF3DC +:10547000318FFFFF0C30C30CC30C30C3CF3CF300A3 +:10548000F3CF3CF30000CF3CCDCDCDCDFFFFFFF1FE +:10549000310FFFFF0C30C30CC30C30C3CF3CF30003 +:1054A000F3CF3CF30001CF3CCDCDCDCDFFFFFFF6D8 +:1054B000305FFFFF0C30C30CC30C30C3CF3CF30094 +:1054C000F3CF3CF30002CF3CCDCDCDCDFFFFF406B2 +:1054D0001CBFFFFF0C30C305C30C30C3CF3000141A +:1054E000F3CF3CF30004CF3CCDCDCDCDFFFFFFF299 +:1054F000304FFFFF0C30C30CC30C30C3CF3CF30064 +:10550000F3CF3CF30008CF3CCDCDCDCDFFFFFFFA6C +:10551000302FFFFF0C30C30CC30C30C3CF3CF30063 +:10552000F3CF3CF30010CF3CCDCDCDCDFFFFFFF747 +:1055300030EFFFFF0C30C30CC30C30C3CF3CF30083 +:10554000F3CF3CF30020CF3CCDCDCDCDFFFFFFF519 +:10555000304FFFFF0C30C30CC30C30C3CF3CF30003 +:10556000F3CF3CF30040CF3CCDCDCDCDFFFFFFF3DB +:1055700031EFFFFF0C30C30CC30C30C3CF3CF30042 +:10558000F3CF3CF30000CF3CCDCDCDCDFFFFFFF1FD +:10559000310FFFFF0C30C30CC30C30C3CF3CF30002 +:1055A000F3CF3CF30001CF3CCDCDCDCDFFFFFFF6D7 +:1055B000305FFFFF0C30C30CC30C30C3CF3CF30093 +:1055C000F3CF3CF30002CF3CCDCDCDCDFFFFF406B1 +:1055D0001CBFFFFF0C30C305C30C30C3CF30001419 +:1055E000F3CF3CF30004CF3CCDCDCDCDFFFFFFF298 +:1055F000304FFFFF0C30C30CC30C30C3CF3CF30063 +:10560000F3CF3CF30008CF3CCDCDCDCDFFFFFFFA6B +:10561000302FFFFF0C30C30CC30C30C3CF3CF30062 +:10562000F3CF3CF30010CF3CCDCDCDCDFFFFFF97A6 +:10563000056FFFFF0C30C30CC30C30C3CF3CC00060 +:10564000F3CF3CF30020CF3CCDCDCDCDFFFFFFF518 +:10565000310FFFFF0C30C30CC30C30C3CF3CF30041 +:10566000F3CF3CF30040CF3CCDCDCDCDFFFFFFF3DA +:10567000320FFFFF0C30C30CC30C30C3CF3CF30020 +:10568000F3CF3CF30000CF3CCDCDCDCDFFFFFFF1FC +:10569000310FFFFF0C30C30CC30C30C3CF3CF30001 +:1056A000F3CF3CF30001CF3CCDCDCDCDFFFFFFF6D6 +:1056B000305FFFFF0C30C30CC30C30C3CF3CF30092 +:1056C000F3CF3CF30002CF3CCDCDCDCDFFFFF406B0 +:1056D0001CBFFFFF0C30C305C30C30C3CF30001418 +:1056E000F3CF3CF30004CF3CCDCDCDCDFFFFFFF297 +:1056F000304FFFFF0C30C30CC30C30C3CF3CF30062 +:10570000F3CF3CF30008CF3CCDCDCDCDFFFFFF8ADA +:10571000042FFFFF0C30C30CC30C30C3CF3CC000C0 +:10572000F3CF3CF30010CF3CCDCDCDCDFFFFFF97A5 +:1057300005CFFFFF0C30C30CC30C30C3CF3CC000FF +:10574000F3CF3CF30020CF3CCDCDCDCDFFFFFFF517 +:10575000310FFFFF0C30C30CC30C30C3CF3CF30040 +:10576000F3CF3CF30040CF3CCDCDCDCDFFFFFFF3D9 +:10577000316FFFFF0C30C30CC30C30C3CF3CF300C0 +:10578000F3CF3CF30000CF3CCDCDCDCDFFFFFFF1FB +:10579000302FFFFF0C30C30CC30C30C3CF3CF300E1 +:1057A000F3CF3CF30001CF3CCDCDCDCDFFFFFFF6D5 +:1057B000305FFFFF0C30C30CC30C30C3CF3CF30091 +:1057C000F3CF3CF30002CF3CCDCDCDCDFFFFFFF6B4 +:1057D00030BFFFFF0C30C30CC30C30C3CF3CF314FD +:1057E000F3CF3CF30004CF3CCDCDCDCDFFFFFFF296 +:1057F000304FFFFF0C30C30CC30C30C3CF3CF30061 +:10580000F3CF3CF30008CF3CCDCDCDCDFFFFFFFA69 +:10581000302FFFFF0C30C30CC30C30C3CF3CF30060 +:10582000F3CF3CF30010CF3CCDCDCDCDFFFFFFF744 +:1058300031CFFFFF0C30C30CC30C30C3CF3CF3009F +:10584000F3CF3CF30020CF3CCDCDCDCDFFFFFFF01B +:10585000307FFFFF0C30C30CC30C30C3CF3CF300D0 +:10586000F3CF3CF30040CF3CCDCDCDCDFFFFFFFFCC +:1058700030CFFFFF0C30C30CC30C30C3CF3CF3CC94 +:10588000F3CF3CF30000CF3CCDCDCDCDFFFFFFFFEC +:1058900030CFFFFF0C30C30CC30C30C3CF3CF3CC74 +:1058A000F3CF3CF30001CF3CCDCDCDCDFFFFFFFFCB +:1058B00030CFFFFF0C30C30CC30C30C3CF3CF3CC54 +:1058C000F3CF3CF30002CF3CCDCDCDCDFFFFFFFFAA +:1058D00030CFFFFF0C30C30CC30C30C3CF3CF3CC34 +:1058E000F3CF3CF30004CF3CCDCDCDCDFFFFFFFF88 +:1058F00030CFFFFF0C30C30CC30C30C3CF3CF3CC14 +:10590000F3CF3CF30008CF3CCDCDCDCDFFFFFFFF63 +:1059100030CFFFFF0C30C30CC30C30C3CF3CF3CCF3 +:10592000F3CF3CF30010CF3CCDCDCDCDFFFFFFFF3B +:1059300030CFFFFF0C30C30CC30C30C3CF3CF3CCD3 +:10594000F3CF3CF30020CF3CCDCDCDCDFFFFFFFF0B +:1059500030CFFFFF0C30C30CC30C30C3CF3CF3CCB3 +:10596000F3CF3CF30040CF3CCDCDCDCDFFFFFFFFCB +:1059700030CFFFFF0C30C30CC30C30C3CF3CF3CC93 +:10598000F3CF3CF30000CF3CCDCDCDCDFFFFFFFFEB +:1059900030CFFFFF0C30C30CC30C30C3CF3CF3CC73 +:1059A000F3CF3CF30001CF3CCDCDCDCDFFFFFFFFCA +:1059B00030CFFFFF0C30C30CC30C30C3CF3CF3CC53 +:1059C000F3CF3CF30002CF3CCDCDCDCDFFFFFFFFA9 +:1059D00030CFFFFF0C30C30CC30C30C3CF3CF3CC33 +:1059E000F3CF3CF30004CF3CCDCDCDCDFFFFFFFF87 +:1059F00030CFFFFF0C30C30CC30C30C3CF3CF3CC13 +:105A0000F3CF3CF30008CF3CCDCDCDCDFFFFFFFF62 +:105A100030CFFFFF0C30C30CC30C30C3CF3CF3CCF2 +:105A2000F3CF3CF30010CF3CCDCDCDCDFFFFFFFF3A +:105A300030CFFFFF0C30C30CC30C30C3CF3CF3CCD2 +:105A4000F3CF3CF30020CF3CCDCDCDCDFFFFFFFF0A +:105A500030CFFFFF0C30C30CC30C30C3CF3CF3CCB2 +:105A6000F3CF3CF30040CF3CCDCDCDCDFFFFFFFFCA +:105A700030CFFFFF0C30C30CC30C30C3CF3CF3CC92 +:105A8000F3CF3CF30000CF3CCDCDCDCDFFFFFFFFEA +:105A900030CFFFFF0C30C30CC30C30C3CF3CF3CC72 +:105AA000F3CF3CF30001CF3CCDCDCDCDFFFFFFFFC9 +:105AB00030CFFFFF0C30C30CC30C30C3CF3CF3CC52 +:105AC000F3CF3CF30002CF3CCDCDCDCDFFFFFFFFA8 +:105AD00030CFFFFF0C30C30CC30C30C3CF3CF3CC32 +:105AE000F3CF3CF30004CF3CCDCDCDCDFFFFFFFF86 +:105AF00030CFFFFF0C30C30CC30C30C3CF3CF3CC12 +:105B0000F3CF3CF30008CF3CCDCDCDCDFFFFFFFF61 +:105B100030CFFFFF0C30C30CC30C30C3CF3CF3CCF1 +:105B2000F3CF3CF30010CF3CCDCDCDCDFFFFFFFF39 +:105B300030CFFFFF0C30C30CC30C30C3CF3CF3CCD1 +:105B4000F3CF3CF30020CF3CCDCDCDCDFFFFFFFF09 +:105B500030CFFFFF0C30C30CC30C30C3CF3CF3CCB1 +:105B6000F3CF3CF30040CF3CCDCDCDCD000C0000B9 +:105B7000000700C000028130000B815800020210B3 +:105B800000010230000F024000010330000C000051 +:105B9000000800C000028140000B81680002022062 +:105BA0000001024000070250000202C0000F000086 +:105BB000000800F000028170000B81980002025082 +:105BC00000010270000B8280000803380010000002 +:105BD0000008010000028180000B81A80002026021 +:105BE00000018280000E829800080380000B0000F4 +:105BF000000100B0000280C0000580E80002014002 +:105C000000010160000E017000038250CCCCCCCCAE +:105C1000CCCCCCCCCCCCCCCCCCCCCCCC00002000D4 +:105C2000CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCB4 +:105C300000002000CCCCCCCCCCCCCCCCCCCCCCCCB4 +:105C4000CCCCCCCC04002000000000000000000000 +:105C50001F8B080000000000000BFB51CFC0F003B9 +:105C60008A59051918AC84117C7A607E4ECAF43BBF +:105C7000F232303803B12B103700F1616E06862303 +:105C8000DCC4EBBF2C8F6087CA32303402F11E694E +:105C900006063B3984B8B90203C30A203F0B2AF633 +:105CA0001E4897CA53E6EEC182B55531C5349411EA +:105CB0006C1D2CF2C858174DBE5D1995AF4740FFBB +:105CC00040E32C1D54FE742D08FD4D1B4267A3C9F3 +:105CD000CF80CAFB40FD95A383DD5C5F22FD9DCA9A +:105CE00082CA8F47E3B731A2F2CD3850F94950F557 +:105CF00000CDA28F7AC80300000000000000000061 +:105D00001F8B080000000000000BED7D0D7854D5BE +:105D1000B5E83A73CEFC25672693908409093009CB +:105D200021441B700C3F0D16EB097F8636D70E14ED +:105D3000696C150744881048A4D6874FFD3291003E +:105D4000E17F504B43413CFC29BD97B691A2A596FB +:105D5000D2019F165BDFF782CF7AB5B5BD23A5F8D8 +:105D6000539498774BEDBBDEFAF65A7B9FCC3927DC +:105D7000332448BDED7BEFC6AF3DEC73F6CFFADBC5 +:105D80006BAFB5F6DA7B9C0E37148E04F818FF6EF5 +:105D900000F81715000A524FA70762D9D700E4E6AA +:105DA0006BB16415C0D07C2D0113D8FB802BE49619 +:105DB00052ED8CE789DC9941ACD75EA00581F5D125 +:105DC0009E3B0FA2D857B411A01040F100FD19F569 +:105DD0009D81391EA8A2577FF9D8F82E03AC0994EB +:105DE000E5603B7BFF003AC04473D90160F4C9DA37 +:105DF000790D78CBD98B7C80AC090EFDC652067725 +:105E0000B99EC0727688C1CDCA274A5FF08C62788D +:105E10006CB8DE117653EBBB012601ACC4BE42EC7C +:105E2000FDD884F8AE84B13C433ED4E662E5EC7222 +:105E3000A0FABEB1B1848BDA696A116B1700DE2E4D +:105E400050B9B81EC601E468AE145CBC1EE19F2DBB +:105E5000EA79CAADDFB361D307B21F4B4988F8585E +:105E6000FF35EC7BA5E97BE5CCB7B0DF6C30B563E3 +:105E7000786CC37F14017C0E7CF9E7B0F3CFC26766 +:105E8000910E303D0F60727FFAA5E81623FE027076 +:105E9000BE78A1EF8FF8E0117CB8717AB2C1C1F081 +:105EA00056A73800F19E297FE4296374DC7C4A26DA +:105EB0003A6C6E60FFC7BE6FAE73E8B152C2B3BE3C +:105EC00088B51F29F0CC9BF8B2842C5AD7CACAEEE9 +:105ED000FE747687131ACA891A8E513F6EF66E08C1 +:105EE000932B77490FC9CDC81A464FA4CB031CEF9B +:105EF00018FBEFE3B2143DDD063DA758E9E916F4BF +:105F0000CCBBC74A47770DA3A31FBF5BE9A8E33FFC +:105F100018BD1619742C80D144C7581ED177B0749F +:105F2000CCB5D13160D031966C5050FE908E0CDEE5 +:105F3000AD9A03B259B9F735B72E23DD625A77907F +:105F4000D5574563B586CBD16601D77AA4DF18FA59 +:105F5000E4700419BFAABA343E6F121296B3AB7440 +:105F600092772F23CB905294575552183D37563283 +:105F7000790D119C92A3A63F5CEC8FDA6F64F0A8B8 +:105F80002678367ABA3C122B6F63F0C624AC76388A +:105F9000807269E0ED0E392CF45682593679E7703B +:105FA0001AF06DD3F87C36C141EFA1BBAB436270F0 +:105FB0005E9CE1800DD2C0FD6EEDEBC7DABFBDDFA8 +:105FC00001E14B06BCE50CBF8B2FCAE10D8C3E1BDB +:105FD000435D1D28E75BA7737CFBF3F90AC7EBE978 +:105FE000F1944F308D17EEF104D2EAB72B1C0772F3 +:105FF000AD78D504BC81AA2B1F07020B4622FF33C4 +:10600000F1E3AF067F88C16FA293B73C2061FFDE4A +:10601000B10F7B80E6FD610FC2611FA71FBCB67187 +:10602000EDE32895314DA1924D1F057400937EA19B +:106030003A217C727D921DB6EA196FA54DBF84ACE2 +:106040006545E81BC5A66F3EB0EBEB0983D4335A18 +:1060500023C11B12708198CFA3C47C9E762819F4AB +:1060600030FA95EF32F4F5033FAF64F27040E8EB9D +:10607000039D407AF64017D3D734AFB9BE1EC7414F +:1060800083AA6FBEEC40FCF7F6E91B2B7DCAE2DA6F +:1060900054D43BE5F1B003FB29DBC4F54D59478BE4 +:1060A00003F9344EE82D38CAE9E061FF99F5759996 +:1060B0001867D42E2B1DCB90BEAC5DD511DBFB1A1F +:1060C000BEEE958189AE6CBCADF80F46AF6112A3F0 +:1060D000E367D8BF474305D171CA20D73D4147BBCD +:1060E000BE2EC3B147313A3ECAF435C36F6480D384 +:1060F000B1BDC3010ED48FBB1CA41FC794461C584E +:10610000CFD0DB0234A814F8EF13EB9D01E7A8070A +:106110007A6A51B99743CF0937EB27771384132154 +:10612000D4D325B538CEE371AEA7CBE3E0889AECA3 +:10613000A15C01CFE3D37B5F1CC3EAF5C69530A217 +:10614000B91F420E4F698AAEC67A3B52C8E93F601A +:106150002D931CDAF93852C8A59D3E6374ABFC96AA +:106160003F6AE3C7266B79A44DAEEB0D7E18723DF6 +:10617000487EB81588B9F3B0AC937DE761342A60E6 +:1061800065F907CF6928D76A277F97DBE1D04B995C +:10619000DCFADA7959E950F45A36EE6D6880B1F2DA +:1061A000E818E86897CAD33548327A8F0E244066DB +:1061B000EF474E87B06C9A2F869D69F06F94A0DFF1 +:1061C00028616FE43CD8EB45397F3CC0E88E7C7F8A +:1061D0004011ED7BBC91B129BADBF5C3571AAC7401 +:1061E000BF39926DA1D7ACD0104B79FCA96197E46F +:1061F00093A13F0C3932E8D68F0F312BDF7CD3AD22 +:10620000DFEDFAA74DB2E99F41F2C975122AD18E8E +:1062100019E3C80AEF2DED5FEF61C921EC218F7EF4 +:10622000968DB70024C861FD2F87E408A4F7513587 +:1062300044DF5738928558BE003DDB878F4AF53FD3 +:106240004281A3520E53DA8CBCAB1848C33C90C8B1 +:1062500026BB18229E422201D14562FFBB95E44530 +:106260007120BD8A03FC3DC472142C07C1F80B5980 +:10627000ECC4A2552FFC5962F353124F19F9C8C64A +:10628000774294E4C103712A6741173D55E8A6A7F8 +:106290001F7AE819808084CF3C08D313AED69F4A7A +:1062A000901E7D2040F4F4FE0E3ECE4EE1B346F04B +:1062B0006D1844BE2F4D443E24C023A7E4D02BE6E6 +:1062C00037B3D7482F7B2A99FC96A27FC0D6D52A10 +:1062D0009AFFDC9F99DE134379CE51615884BDDF6C +:1062E000D81A20FDBCB9D543CF0EA16F4AAE796153 +:1062F000C71DEC9F8F8CAD79732F7B9E68DBAEA1A1 +:106300005DD33196EB97A1D3BBEB46A19D58AF70FF +:10631000BBB09DDBAD39825A1DA393FA6A567FCB81 +:10632000DD9EB0797D31F4D096EB9307F7B1EF7A2B +:106330004B167DD7A70B7BEC23C67FC30F42FA8594 +:1063400005DFEA136487B2F7311FABEFF990213F05 +:106350009E7D0FF6B4A6D33F1D6559A4FF3A4EAEFD +:1063600087105BE7435A4C23BB760A33594BC9BEAF +:1063700075C4AA70F6457F2531FAE6C40292A622BA +:106380007D40C2761E740891BE4A3C68B657FBFA3F +:106390001F1E0B2E64FDC5AE77850F90F88063DE5F +:1063A000D8CC72BFBEEDDEAF6A69EC27BF4322FED8 +:1063B0009EBCBEB008FD5D17048AB227E03C72C1E6 +:1063C000015C9FAE5F3C329AA65D6A3E19F651FAB7 +:1063D00067A6766E195ABA4CFD963B1CA42FC1E1F4 +:1063E000A1676E09979750A5909B18687A1A3BF39E +:1063F000F3027E8F128380B0A73F4D7ABD2D713896 +:10640000D74BD0D095061E1DE19988F3A02986FEB2 +:10641000404E1B9757A6B534AC1F52F8D3A87FA3A4 +:10642000A8FFA4C0E332F44DE1A3386FF307A9EF4E +:1064300070DC34F884C5F89733EED651688C062C9E +:1064400074B7F3B36F7C8797EA5DBC7E7B10FDE782 +:106450004C70865A58DDA1EC592F9E55E25949BA25 +:10646000BDDF7897DBDF144788F0B4F70BFBB9FD8D +:106470009423D6A913935D34CF873F00229E62D523 +:106480001BC3991F89FA4D3FC8167809F5062F3F9F +:10649000B61FC89EEABDE721B23B4B50AFCA18E712 +:1064A00088D23C2E8510950DFDB616F51D7B5E84B9 +:1064B000C82D8E02D42B5D27515FD64FB87B6ABAA8 +:1064C00078D11DC6FCB88CF5E8F3ECB9C013B9134C +:1064D000FB57C3A735B66243EE5C29969DD37F5E1A +:1064E00031F10CCE31CF873EB9E0F3A91DE5BD8A6D +:1064F000CF9BD9AC5C579E1E4EBDED6291B0FB8622 +:10650000917FA3C0B039A6F9A83FC8E6156BF7B8CC +:10651000E8CF78BF5DE017FB04F3A08E3D03615D1B +:106520004375394F6F7122DF6E96A26B10EFB9F58C +:1065300091E791F5EAC16E2D2B44EF3B1C6C9CBAA0 +:10654000501C3907AAD61DC3E763F72CD4908FBD22 +:106550004C67C969FC66E399A539AC7E92DDEF1BF7 +:10656000E47CBC3A1C9F8A765865C3891388EE0286 +:106570004F7427C23524F2945680F0864E6B7926EC +:106580007E8D14FC5AE6E0F8E73E20F8A66841E468 +:10659000C75D10D98BED039AB0BB07094726F947B1 +:1065A0003B13E93812E59DE9CDF63093F7D2D47C60 +:1065B000C811F3A15DCC87DE095CFEDB03D58174D5 +:1065C000EB8521EF86FC1BFAD05E2FF109E4FC2A53 +:1065D000F6AC8000F9311721FADF900E0C7BB26B1C +:1065E00072A777913F67CCABFAF0E9E943183EEA2E +:1065F000845035D2DF18F7BC90BB051EEDE7241F91 +:10660000E56D4A1EC36BCC3D101EC5EACD2ACF9561 +:10661000CCF2FE6A5FFDC8699A5FF7746B4A68E066 +:1066200076FF43E077B31479CD2C87AC9F5F615937 +:106630000D75A384F5D13924EC7BB96D21D90F4CAC +:106640003E0348E7792D2DCFE37873AB226BB0BEC4 +:10665000D1FFAC90CD6E97A26F61BF7639AD83B894 +:106660000297B17E8C94A217B09FFA5037C19B3B22 +:106670003D4272C6E0FEE05382FB2F48D74C70BF0C +:10668000858D516F86F7905E63F0C9328363F403A2 +:1066900009258FE87E5A41BA333A3BE582149D07BB +:1066A0003BCFB7897936D07C6FC77F4C46BB383A31 +:1066B00004C7CF13762E244F00F7AFAC71CA19F27E +:1066C00079403B2BB72E09181F1A724A0EDFC83EBD +:1066D0000DAD0309ED62C38ECD13F3D180674B9FDF +:1066E0009D1CA4F933444D06232ACED74964B73DF7 +:1066F000529B0CA29FB7B63544DF033593D6DF110A +:10670000C2E1A304C786D6B0B0AF6BE819AFEB3DCA +:1067100085FB025B820EB27F37B5561A71598237FC +:10672000CFB093EBCE909DDC1BCC127EA315BE7830 +:10673000DD19CBBE87D10E82A6385619F623ECEBB5 +:1067400010D73703B5574BAC74EF6BAF0DAE7DD69A +:10675000046BFB5A2DD981F1C400C68F100FA1F72D +:10676000FC02C6408D83FC6483DE9E2A6B1C2E5E79 +:10677000977E1FA76F5DB08D07E559A932068B6222 +:106780008D04DF4A015FA67ED6887895517666D063 +:10679000934DB25827C57E5440C0FA88C6E8A1A6DA +:1067A000E83144C8DD967AEE874180C7E70C3FC7E1 +:1067B00009FC7B6A3C8E379549DFC7F83836F88D7F +:1067C000F62ED13E131C2E7B7F67593F934CFDD88C +:1067D000E0CC049F7D7F0CDEB6F693597FD9DA9D1D +:1067E0001F1C1FFAB503133FA99C672B0FB3D52FAE +:1067F000B37DBFDAF6BDDA56BECE567FAAADFC0534 +:106800005BFD39B6F2576DF517DABE2FB57D5F69BE +:106810002BFF576BFDAABB3E197DFF3FA39331AF02 +:10682000FAD345B7ECEFDAE75519244624D8736F4D +:10683000EE4B8BF1D3BFC892728EFB243C8E058940 +:106840007111933DFE7B357A06D7B1BD1F6959A8FA +:10685000F7F7C75FF6A33E32DE9F97DEF05F156263 +:106860007AC19558C1E33E719A3759A09C49562286 +:1068700097248A9779D44544724F397B6FD26F6ED3 +:1068800088109F5D25D6F710E7F3B01C7D7AD65FA0 +:106890006C9B8BECC15811E8A3315E94CFFBA7FA37 +:1068A000652978AB15AE9F8291782DCEE1610D5DA3 +:1068B00027F069A753705AECDA1730DEF008F7CBEF +:1068C000F7CFB0FAD5B728DC0FB94DB96CBFE0D51A +:1068D000F172AAFFFD0FAAE13656653F02C1CAB1A7 +:1068E000073D3AC63746605C8E6F1A505C6E38883A +:1068F0003F117F2BC17FB376C3D55314670B350689 +:106900004EA2CE9BA354D0788F4B3D57E1788EECAE +:10691000F3D7F2FDBCBF7C4CF17741AFE0C649C96B +:1069200018A3176C758547139DC34467B702EDEE36 +:106930006A14134EDFD5ECB578AFF8F2D06D12FCC7 +:1069400040FD3B0AF7B575E0FE6482CA3E48523905 +:1069500047D8B9639452EE17083F9379F612FA5F5D +:10696000C12F32BF3CCDFA315BAA1DA314A4E29320 +:106970005288C721A54D2FFC59C278572584F8FEAF +:10698000948807AE97A58F311E1E18DCFE4EF06B63 +:1069900056BE821285D92679FE5A1F3F39BD46055B +:1069A00039FEC1ADAE16F46BF6CFB2CA81515F5657 +:1069B0002E3B5EB17DDCA84F4F0E729551044F7F88 +:1069C00039B83580FB07528CD12D7BF074CB91B553 +:1069D000AF2A13114FA0F22149BB5529489515D074 +:1069E000E69BBFBF2A4716E0F7D854A86C5153FD69 +:1069F000B0F78B32BC5F92EE7DA961B79EE5EB7874 +:106A0000B1B0AF86B6C7C92E2D6ACACB32DB59C525 +:106A1000625DD8D3B4D08BF86E6F48AF078DE74670 +:106A2000E1F765AAA74A5D11D42B3056810369ECC2 +:106A3000F26751BE4DFA54ADB2DA5BD317C56AB1F5 +:106A4000BDBFCE01B86FC2D679B2EF8A842E7B78F3 +:106A50004A4CC2BC97F872083FC4F0F22F2AF3A642 +:106A6000B3931ED6B6D3FB1DF5876791DFC2EC3A10 +:106A700099E2E25DEBB13CA4C6011BD2EC173C21CC +:106A8000F0DB5CCFE964FF5EE18268BA79F8AC22A2 +:106A9000F61994980485A9FD92274E147DA192C100 +:106AA0005B1C7684BDA1149CA57D765382E855516C +:106AB000AD0430DF80297E8BBDB9A3BD7AC71D68C8 +:106AC000B7B3F768B7EFBC3E300CD78D3DB515B303 +:106AD0001A517FDFE980D1A1141C633AADF43CD197 +:106AE000373FADE3B27E6BC97FAA67E44A43872B89 +:106AF000A547A71837939CD8D755BB1C5CCEFA7016 +:106B0000937CE5F8FD00E7E144921F8AD30CAD6762 +:106B10007E5C556A1E197E8A5DCE02750B49CEB623 +:106B2000D7977911CFDEBA6AC9C5EA6DC19A69FCF7 +:106B30007163BC4CF05438A3DE00CDC385523ABA21 +:106B40001546D3C7CF35A7883F2B5109DB67AA3736 +:106B5000C229E441CCAB4231AF82535AE6D0BCD813 +:106B6000A5C0438C5E0FD755B78D26FA3948EEA6DF +:106B70006B5CCF164EE0FB993E46AF67D9BAF7483B +:106B8000038413ECFD23135C96FD9942411FBB3C2B +:106B90003E32807E01B3FFC5E45F71AA7CFFB61C64 +:106BA000CAD19E7AB8EED2ED074BDF608343D39112 +:106BB000BF35D503C44DDA2E779D9A773DCA63CD94 +:106BC00020F3276CFA029EBB6BFD68C607DF2EA67A +:106BD0002F201D7D5C167F7C207AD8E93F0EE99935 +:106BE000FDE9D1D3FE7D8853C40107498F27EBCB44 +:106BF000B6968732D7B7E363B4DB28E6DBE7A14775 +:106C0000C6F9AF4180E24B53214CCFE910A167B7E1 +:106C100012FD9293D59F092D5436E2508D0ADF97CD +:106C2000802A3EAEB1BFAD4C03B293C78C077D2F17 +:106C3000EAE72973C4A6AFA29DF3A0D1C6E048E35A +:106C400057013C447817DBD663234E31B4295E5F8D +:106C5000CDFA2DAE77501CA3B8E6B0D7BC2EFBC53D +:106C6000FC31FADBC9BEE3FABCB36970FC32EA3D21 +:106C7000A12429AFEB899A87DA70B951F2DE0EA60A +:106C80006B6FA7EB968FBABC9134F0EC5C7494F206 +:106C9000B776D65C3A8E3290DC8C91D3DBB39F779B +:106CA0007B896E3B733DB7F0E49C5596FC0390D511 +:106CB00052F3B83B3F82DCC8A5F489669D2F5B9CEC +:106CC000221FC4073E94FF4CF4309E9F361D9E9CAD +:106CD000DAB23492A67D859BDB136B722186F92292 +:106CE0004FBEAEE898DFC00496E471D22D211DEDB1 +:106CF00097355EAE979FAC05FA3E29577C7F2C44B2 +:106D0000F954C59D1073B1F5ACF8B5458FE4B27A6E +:106D10009B16310FB234F57E53F86407EE133FF340 +:106D20008A2380F6D1246FC2136678D5887570E700 +:106D3000A29394771CDBA58447937E97409A44DE08 +:106D4000BC25AE79DCA910BC3BC30F7B716F6E47CD +:106D50002849FD7C63F2494F88E1B7A9A4DB837819 +:106D60006EAE7998D6CBC38BCABE5C4164B5E6974C +:106D7000CC94A7746B98BFBB88EF5BE426BB3D98AF +:106D80009FE46F50E046069F5FE5F86E5A033AAE07 +:106D900053D5228F4482D9E41717D9F2B80A6D79F6 +:106DA0002681F0CC77709F9FF6FF1109B9E991B168 +:106DB000184F6C7688F4538DE6A94FE0E70B6B54BF +:106DC0007FA67CCC8B790B3BDA9500AE7F015BBF55 +:106DD000763C02103DA149D40F8DB3E351BE4E065F +:106DE000265266316B2AE00E30B887B021DBAD70D9 +:106DF0001B74B58FE3B395DF36E4B91846A31E3292 +:106E0000E2CE06FC76B9CD9FA41F7999E1BBF315BC +:106E100095D6EB9D352F7FAD19D7F94A37E5717DB2 +:106E2000E1E2C1A6EFB3E72F3E385A8ECF2F16ED21 +:106E30009FD08C74107912463CAF107B26FB55E82E +:106E40003563BCAA3DEDCE7C7A45F9159B4FBEDE7D +:106E50008871E7A22620FBB748E1F2E96B77E86D7D +:106E60000CFEFCEBE2240FC50D09025A6DE892629C +:106E7000267B5E15F69CAF292AE13EFE8D0D712F13 +:106E8000E68BF844FCD737214E76D20CF90D4F52E1 +:106E90004DF1CFC87F37E69F9D3F158B78DE497156 +:106EA000BB1246B08B9B5A1C6487D7F07CEF8ACE0E +:106EB0002E89FB7F3C9F9E87D4D933D2C8F30977B4 +:106EC000713BDDC8FFF63759F917E8CB9F8FD2BE6B +:106ED0006B69A7ED7BA4EE2D2E87567E96B9043FF5 +:106EE0002B44FEA0CD4FDBDC24F6E9548F7E29BB7A +:106EF000F6159187F32AE23FA6FFF79B33E8DF9B65 +:106F0000DC7C9F5F767477901F779D83FC383B1CF9 +:106F10005B9AB8DEDBEF7258ECF82B1DFF36A1FF51 +:106F20006547F26F327E531FFE7F9BF1EFFF1B8F91 +:106F3000BFE16F4CFF1D7F63FC0FFE07E33FAF52C5 +:106F4000B2F8697B5D1EEAEF87EEBEBC0D8BFE9644 +:106F50001DE9FDED332E87258FD8C84B9CD6A02D7B +:106F600070A1BE0CF3731EF6FE66C82F75A01EDC62 +:106F700021F2B1991ED564CC779A6C9CD3E0FAAF1C +:106F80004EE8BF3AA1FF0E67D0ABD5355CBF33FBEF +:106F9000420F95E292119F5581EBF72985F28B0FF5 +:106FA000035B6650AF85DC69F3B10B05DC767D5A77 +:106FB00028F469F54BB6F7428FDAD7F9D2BEF82933 +:106FC00050FCF4BFBB447EA94DAF1A74D851C3ED39 +:106FD000E5FC39E9EDC14D363EAA135A280FC1CE62 +:106FE0008F332EEE5F1BFC58E0D17EED2AC8CCEF2C +:106FF000A4E0F70D82DFBF7405E869E48D64E277F1 +:107000008D9B8FF359DFD9601B6213A9253EC8827F +:107010004F326CEAA6F82F7C03CCFEE5968F981DC4 +:1070200082EBBFAA52FCECB3F9E03092ED3F32F6AE +:10703000E9D89FB39BC751E57C97CDDFB2DBC11E7A +:10704000CA8FDBA9F1F3563B6BF6EE5C81EBD32BD9 +:107050007C9F79676EE74B78F40DE2E31584C3B04B +:107060001B41C467D1A4E0F928F6FD27ABDDBFF3CF +:10707000A3AE04DA5F815229CC3C2BE8083D9C9FEB +:10708000F63C9ECDDE57DD3E8BBF0B370ECE6E5FDE +:107090002DF8CDFCC502B7697EAFF6CD1CCFF3A2AB +:1070A000A607709F47D2663A309E9EA91F8CF49E19 +:1070B00033ED3B352ADA70EC4F42FFB132E53F0247 +:1070C00094F0F8BC81FF60CF0D34DDC5F7BF055DDE +:1070D000F3AFEBFAABF891469CD7A8A72A094877FB +:1070E0003EC81EB7BBD1A94D46FC060BFF6E143837 +:1070F000F6FCE72AB92E5DFC2029F4AB1A79EAC523 +:107100009B59D50973251EDF67669B795F6D53BE5A +:1071100052972EDEF533314F7E894139D2EB09C8C3 +:107120009328AF04102F633EDAC7BF568C7BED1552 +:107130008EFF8A98D7D78A790D10A6FD984CE3D692 +:107140000ABD613C3FE9B8498177AD4BC4350618AB +:1071500077B6C073F615E27B5E8C3B7B90F82E1001 +:10716000E32DB8C2713F14E32E18E4B8770BFADEB2 +:107170007D8574563C92E86770746E13E3B55DE1EB +:10718000B801316EDB20C7DD26E8BBED0AE95C22E1 +:10719000C6DD66A373A6F9BBF70AC7ABF4F0F9B373 +:1071A0005FCC5FBB5E33C6578B1C116CBF3368ED81 +:1071B000E78B6E3EBEF184C4C7E4BF168B7DDDC98C +:1071C0002BEE5DA8A519D7A86F5F8F338DF335110E +:1071D000AF319EC6387EB11F3AF93A364E1AFA18C8 +:1071E000F5AF75713D98A9FFA5029EA597898751B6 +:1071F000BF16FB9F98B9FFFB041CF7D9E01FA87FBF +:10720000A3FEEC01E0EF1070745C26FC46FD050364 +:10721000F4FF2D01C7B72E137EA3FEDD03D0E709CF +:1072200001C7139709BF51BF6D80FE9F16703C7D4B +:1072300099F01BF5B70D409FE7041CCF5D26FC4677 +:10724000FDFD7DF3DD3AFF54E33C50182A31DF7831 +:10725000046485E97E8370F204FA01EA2A7EBF01A4 +:1072600074D9CF4199CE4FB1297EE2BE8A18D6DFBC +:107270007D178FFBEDBE16C88FD85D20F295455C5B +:107280004B15F6E0EE6B791C647790E7EF832D5E8B +:10729000B49BF93BB4EF5BC2F399D5AA3899983403 +:1072A0005CA13011439857C3CF5319F69E71AE6A53 +:1072B000B58853EDD680E254BBAB7879E774D01D26 +:1072C000A5A6F3569509CA4345C316E3B1A9F362CF +:1072D0001AACAA36E563AC4A50BE8122F246184188 +:1072E000C09297613BA765DCA37073589B816AAE1F +:1072F0007402DFCF2B8D58FD87263CBCC5EAFF56B4 +:10730000E8C900D64BA3670E7914CE3F91B7395721 +:10731000E06FD0AD5AF073CBEC0FBAA7313C5F9C55 +:10732000E2C44C1678F194A0E31459E7FBE7E0348B +:10733000EBED3E39CFE00FAA9D2D27BD8C3E37BF28 +:10734000046164A36F97B6264471B58F48FE28AEDA +:10735000C6C6BD79575C41F99BD5199A86F1C0B96B +:107360002F8556AB987FDD09610DC9FBD1D7A99F49 +:10737000BC7608EB9C556D01B2736DF139E3BCAF7F +:1073800088CF61B8DAEC5FCE127857B707D6E0D66F +:107390005DF574B7C57E9D25FCCC2F696EEB394930 +:1073A00071EE7196CDCFECF458E3756A676406C64A +:1073B000BFE5B9A7353CF73C26220586B2CFB745D5 +:1073C000B629189F9CB5AB85E7F567B80F23E7B1E1 +:1073D000393EB3FD3E46C8F32F775DDA5E37E20CE7 +:1073E00046DCE114E619BBD14F0F0ABE70B932E496 +:1073F000236FAE6491934E0FD7239D1E1EC7FF4F80 +:1074000039F9EBCAC96F3CD6F843277E63F3B12242 +:107410009C7E9FBED1E3FACFF9FA29F0C1EF4DCFA0 +:107420000768CAB1E4131B795576BA19F7C618650F +:107430000FA43F8F57E215EBACDDAF7F235A8B785B +:1074400019711A80FB6DFB9B53C2978A4BC8C6BD4E +:10745000038E3764C4A7D22BF48F020AF56FC3835F +:10746000E67D61EA3E1D7B7F6BC4791E032F677941 +:1074700044C37B56D818B4DF8779EB87AB707D0C9B +:1074800058F0D6BC7CBDD950C9E56D43A5A2679321 +:10749000BC45ADF71695EFF5A4B32B8C2798EFAB51 +:1074A00028EB0FAFAB3C1A33C3E312F0D8FB999330 +:1074B000119E464BFCEB72E1715F05D08D72AB30D3 +:1074C0002926F9FDBAA53F47A54EE7FA33F58367AC +:1074D00064082F1B5F328DEF29B19E5770E5675905 +:1074E000E45D51F36CF78AD8E4AB2F2E34B8F1EC9D +:1074F000E718DBC5F9147B7BAF1287701ABA7B43A0 +:10750000F67C0C9DF8603F5FE30CD8E0B6F5BF0950 +:10751000DFA5C9F730EE195A27D6B5F58A4EF656CB +:107520008C8189F99E6B845C2A019DEE67FAA657CF +:107530004A8B3F84D3AFB74A797AF83D2556BABB18 +:10754000F2F3AC7C50D29FE7586FCCFBC07ECD7C71 +:10755000BF56FF797E2C7CA9F5BCEF5E2DE937F292 +:10756000C70CA5035EDB3D1683E4AFF2E11080217A +:10757000A632D3AB18AF657384F279EDF54F1BF4E7 +:107580007B632FC16FE8E9EC5D465EED27C3439254 +:1075900040EC935BDB679C8742CFC942AE9F1F00E4 +:1075A000FF4CFCCD2A77D8E6CBE0F8EBC5798FEB22 +:1075B0009EA2894BB0ACF33ED37810E0F85EEEBCEF +:1075C000FFA4700EA98B02EA3357300A51B6CE17CA +:1075D00005E3B44FAE4A3D31F4C7D89C0A219F77EA +:1075E0000E09F1F3E3A67A53593B67A923E6C43C9D +:1075F00010089FC0FAB12074617D8CC7ECAD4AD5EC +:10760000532588A0BCAB054A04DF1BFDE54CB1F651 +:10761000C7CC04D97C1ECBC817205787E1EF9CCC80 +:10762000FC53D6DEC5ECD03DE9F44916B743B39F11 +:10763000F3D279435F44D551248B26E894175CD468 +:107640000861F4E72A3ABB21CA3AFD26C23111BFCC +:10765000C7E9DE85A25D71DAB7CF77F373EC454DEC +:10766000716981699CCA2C2EDF53E778689DF87A8E +:107670002DBFDFA23BB8305E8BE3D5F07D2F5FBE20 +:1076800002C3183D7CAFB9B9FF392109E67B23DE7F +:107690006E85EA45A301DE6DF5D0F37C6B809E819B +:1076A0008FFE279DE75B33715208F3472FFA1A4785 +:1076B000E2BAF17E6B90BE6F7E301CC27C22F9E490 +:1076C000EB749F444ADE6332D430BA4D486AC83FF7 +:1076D00013FE7BBDA67DFE3EBC18BE0BD8381B2515 +:1076E000C7ED381E9617929C7A649729FFC325FC34 +:1076F00046E71A883C5585F797E8D2DD55A6F75E30 +:1077000066B7E1FA3A31407C4FD1536F13F4BE169D +:10771000FDDDA297045DE7D45C72DF64536BA27B4E +:10772000FAE85459CD70EE6DB673EA0D591837C2A8 +:10773000439F6CBC69732A8722BD1E755ACF931B69 +:107740004F39303E5C8E7563450E9A87E27E959583 +:10775000578586E69AFA9F2DE4523EF923A26F766A +:1077600015CF0F617FF545A6FCFF926823BFC7AF19 +:10777000859F9331F62147DE9A6CC32D8991ABAC7E +:10778000E767668AFB504AD73828FFB57432E9505C +:10779000286D03CAB3DA2787AB51BE1F835772F136 +:1077A000007B09836F389BAAA5316B3FFB16D7BFBF +:1077B000807100E37E95D5EDBCBF11A1F0A910C684 +:1077C0004FAA1C642F8F84B007FB1FA93A00CF1764 +:1077D0008D02533FAC3CBCC5DAAF1DDE529FC38166 +:1077E000F10E039E1170C4A3E553FFA0B3F625CCA0 +:1077F000CD2B4E039F7D9C5146BDB1D5D509483355 +:107800002EF4B4E1BE50BFF107E8B7354BD8E13EE6 +:10781000F0A33EDF2571FC632FCAE103C8D7BB0F7D +:1078200052BCA6646527ADEB9D59DCBE5BCBEC0179 +:10783000D589760A7B8ECE2C877280112E87D68FC3 +:10784000B4F2F76456EDD62C8C87654DDD8A7298BC +:10785000A584BE82FCC83AE504DCC7CCD2E234FF82 +:10786000A09CDB191BABCA7270BE65B5B8D2FA6BAF +:10787000ED594E826F5796A4605E28932DC24B69D6 +:107880000A7D6B262B7617688FE3387F2E88D2D33C +:10789000781F5CD81042F99CB6A48AE25FBD9D12A5 +:1078A000C5BFDE927417A66A2F9BDB32EE46468F69 +:1078B000D9B9D127B0DD1239B1D6C9E0597E6B4BA9 +:1078C00005D2A71EF3FD0A70B818F7074BCE841532 +:1078D0003C1756A2249C4CBE3D8193AFF167AC1679 +:1078E000E5DD832761183FFDE5DA3BE837F9C43968 +:1078F00024197A629817E89F0270C6C437F4E9CC5D +:1079000065DCD3359733D17FA0E722D6F6CC685C0F +:10791000E5C39A4476814EF47305C2E3104E39787C +:10792000AAB0DCB4CEB9057EEE690BC5FD489AF06D +:107930006FC260F66FDD022FD4E1674CED9D416BA5 +:10794000590EFC75F130EC6EE9A7FF7E0EF9B8FA1E +:107950006927C53DA73DED4CDCC0CACBF748B4CE86 +:10796000388E73BDFEFE7E89E67DC2E7223DF05E65 +:10797000C043E56677F796CFB172CFD332EC25B22C +:1079800034D07D52E78CF5F4282F2F160ED2F23D1D +:1079900027E6637F8D47DD80EBC4F21F2DB9E973C5 +:1079A000ACBC84C93156597EA0CD358C95EFD2A59B +:1079B0002E2C5F980A2467B13C978E792D17FCDD39 +:1079C0008537ABB48E41680CEE6F7717CE65F2B891 +:1079D000547F6A26B65B7A48C2482AC3E3C00B4587 +:1079E0000CAEE5DF91687D5C76309BDFBD22E877E9 +:1079F0008EA17203FBBE92E189FA7009C46722BFAF +:107A0000961FD8E632AF73EFB65652EA87515EFE44 +:107A10001D360E6BB7E27B5218515C81F90EB85ED1 +:107A2000FEC8DBB04F45FCDA5C153EC46B9D0BEB2A +:107A30002DD1173CE30D217C7B5C33D9F7A5BBF638 +:107A4000B8165721DDE0765C57971DFC0CBFB3C01C +:107A500080AB53267F6165AE672FDD6BAADAEE47F8 +:107A6000E9830B2C702D157A83F97D2EF379B76796 +:107A7000B273494E971D942DE318FC8F9D067E1E10 +:107A8000ED273E3A8F66F0CF58AF0CFEAD342EFA9C +:107A9000537A26A583670BF283C11367FE0D3E1F41 +:107AA0006E0DD2F3D1D610F1693BD2710CCF4BC120 +:107AB000F76CDED6E23D687E0D2F0403C8ABD76AB3 +:107AC000310F332FC2CB85B746A5D025EC74E3B96F +:107AD000DD195D8046CE94EC6FCF50983FB6DD1532 +:107AE000BD1B43D60165EF8CE96CCD6BCA8E4CCAC9 +:107AF00036EDFBAD15F7275D931D22FCD716B9882F +:107B0000DEDB6F9BB44FC49F689DDC7EDBE22730D9 +:107B10003ECEDA7F3E1BFD0BB1FF97A97DE1FC1A3B +:107B20004BFBC2F98D46FB99D4DE73E9F6DBE75FC8 +:107B3000671D7FFE52A3FD4D04BF7A69F80B6F9F4E +:107B4000621DFFF6266ADFECE6FCEDC9F550BE7556 +:107B5000BB379C407D4C17A94DC07CF28ABD58CFE5 +:107B6000587798E6D7307F5B3D945BBD01CC72348B +:107B7000753EC28179596639CAA9C9B2CCAB5C2DB0 +:107B8000CF521E5237CC52BF205266F93EB4E16A42 +:107B90009B5CAA747E91CA08141AE60C4ED7301763 +:107BA000E9A3DA61DC0EBEF7B897CAF75EC7F1BB8E +:107BB00077984AF3186146BFFC5E57F41AF3BDADDF +:107BC0000C2F093773EE54A3F7211EA9F72107BE26 +:107BD000CF12F94E596E207DB7AE74D2BE98899EF1 +:107BE0001DC3993CB0727BB68BD35DF061DDF0C5EF +:107BF00041B3BDBE76B8AB01FD0D7C7F878AE345FE +:107C0000D6E278CDAE9E0AB43BECE3B8CB6A2CE367 +:107C1000784634D238DBB2793CD518C73DA2D1368C +:107C20008EA761AF782FC67904E52CD338EBCAAEA6 +:107C3000B3E23362298DB3DB36CEBA114B6DE36408 +:107C4000717CD87B318E7EA971DCA3A658F119D93D +:107C500044E3FC931D9F914DB671541A07DFE3383E +:107C6000CCF00DE17D592E77CF62E2FF4FBD64E786 +:107C7000B8DCD127C9CEF9B597EC1C564BC37A5066 +:107C8000C9FDDB7BB2F3F8BD5F598CFFAA99CF31F8 +:107C900091771023BFF84E0122E80C22A6DF560888 +:107CA000195C7468F688367C1E9D165C80FEE8A31D +:107CB0003E8AE3BD7F749AEB8E34FAE8CEB8F35C6B +:107CC000D224CF7D7A55C46383D97C1FD2289F13D9 +:107CD000F19F33182762CFB79C40FED059112F4A2D +:107CE000C1DB46EDCE897DBD73BBF83A7571DB69AA +:107CF00027BF37155EA96270CF1368DC19B7DE9312 +:107D0000D92CF8D1F323373F07045A31DD8FD73907 +:107D1000C4122FFCCDF17F7881E7DD4131DEF7FB26 +:107D2000D58EA79EC76AAF4A0B86AF64F8361CD9BA +:107D3000E62C66E5F79DC9F961D5D44F8393CEDF74 +:107D40001B7EC82D51A7C57EFE5AA3B57C9BCD9E38 +:107D50007E23BBCCD89FE5E3867427F26B1EEEB181 +:107D60003216DE864F4ABE0B10BFE607785B039ED5 +:107D7000E6FB9D90A0F52E594071CE5801C569A231 +:107D8000C6BA65836FBED3A345183FE7DF27131D2F +:107D9000EDF0268F676B0EE6E7243BFF9713CFF1DC +:107DA0000C04FFEDABACDF21E6B4DC4760C8C15783 +:107DB0001A6AF79D35C9C72DD159FBCE5AE834DB75 +:107DC00052BEADE5164BFDDB572DB07C5F10BBCB33 +:107DD000F2FD8E8EBB2DE53BE3F759EA2FE96CB33C +:107DE0007CBF4B5F6FF9BEECE0364B7979D70E4B19 +:107DF000FDE6A37B2CDF1DC7AFFA12F981BF94E922 +:107E0000BCF31FD5735BD07EFB6340A1FD9CB7C55F +:107E1000FEDDBBE23EA015287B9371FE8CF7A0DF50 +:107E2000D09CC5E633B325C6A9056B3BA6A01E01B1 +:107E3000BA5AA35A2D5E1B63CEEE64713E51EE74A6 +:107E40004162086EAFA4E2B03D72EABB9264DFC744 +:107E500067FE2E772A69BF2B49256DBF17A49E0A9E +:107E6000B41F63AFBBD39E034FCD4B28864BDC2F93 +:107E700079DE018D66FF6D9ECAE3432F644F9DA797 +:107E800016D071699AEF4D878BA6A2DFD0E44A54D1 +:107E9000A4DBB7E91BAF4BA27B03E7A97CBEDCA543 +:107EA000175BE269CB0E8EB2CCFBD7B2A237ABAC7C +:107EB000DEF91332E959483C37E2CB63717C6D1E21 +:107EC000BE87A305B43EBEDAAAED3BCBFC80D75AF1 +:107ED000EBE8F9ABD6C8BEB3CC257CA3B581CABF4D +:107EE0006D8DD233D9DA48CF33AD2DF4FD6CEB2A4A +:107EF0002A9F6B8DD1F3EDD60E7ABEDB1AA7EFE782 +:107F00005B3BA9FC7EAB4E4F631E18F62E44843DAE +:107F1000D9F78309BCDC2B70900B8D386698EE95F1 +:107F2000EA552F56A01DDDFB9A9BF26E33D1C92E68 +:107F30007799F9A7D17ABF58B7C6998DA7378BF330 +:107F4000C7EB803ACC91583FDA4571B4AC9F7E863E +:107F5000EC71F65E017ECF7278769AFB3ED1FF46D9 +:107F60007E0DC427A3FEB96FFFDBA48555C89F32E1 +:107F70007EEFD773720BE7DBBEF097C70E4C3FB2B4 +:107F8000F98AFAD351FAE96F46607CEABD02839E12 +:107F9000DD2330B8A5A8911D2887BD47DC8457EFA5 +:107FA000B16C9E8F8241B541E4BF2E3BE8D5CDFA3E +:107FB000617957AE6ED51745BA595FF49EDAE7C7B7 +:107FC00079BF3228EB67C7A37C68423EB8DC19FD55 +:107FD0002FEF2AD5554B3FD6726F5CAAA37B202189 +:107FE0009433F712F7A7AE0CBA689C770F8EA2FCF9 +:107FF00003E627EA6779BC53E7E30675B35C36AD61 +:10800000CAD6CF0E49C197A9DFBF367C0047E077BB +:108010009ECCE771077A82F2AF2EBAE7ED98F32291 +:10802000AE3B6EF6BF8F295F48A1B2D16F73971C2C +:1080300073E3795E3864198FB50B193EBAF9FE9C6B +:10804000FE7CB7E683FF166589D66D7EBE3C8AE767 +:10805000CB597F1714B543BA2675BEBC59C8E57213 +:108060004FD21565AFDE3B32EA92F920EFB69E0A99 +:1080700028A3318F20EE4267A4B1EBAAE9A81FDF45 +:108080003BB2BA10E369CBE4DE7BD39D9BFD50E5A8 +:108090007136D09D3D49133E467C0680F5EB49C1C3 +:1080A0008F927ECE54B6EB6BE3E9F0F1B8FB8A43D6 +:1080B000A7677E8EC1BFE2E8072E84E3A81A75F891 +:1080C0004CF84BE27CFDD2836FBA10BFB79DB18AEA +:1080D000FB2FA1A7FAC3A9062DFBA131E8C679BCE5 +:1080E00090FFF602CAD3577ECDA6E63BBF7002FED4 +:1080F0009E83B15F619C7B5804113FD26BE1916517 +:10810000141F7EE7992F0A7B2E3E09E5E33D70D4CC +:10811000217EEFC1CBFEF126FA95FBB81F031DDCD3 +:108120008E31CE05327BD662D72CE9B49617C39C2C +:1081300042D41B8B1F75822EE1FD9FA67B9818DE13 +:10814000F93E6EEF2E8196B568CF296EEE1F2C0C8E +:108150008052CCF4E9F21F3E3609EDFECFF8F8BEAE +:10816000A311C7B82B8FDB7B4BF37517EE27FCEE03 +:10817000C8F8799F43E973EB6B715D869CF4FB7FD4 +:10818000777458E11B087E3BBCC6B9F77EF1140139 +:10819000877C504A9B9F36D927E44EE891877C56CE +:1081A0003B7F9DAD5CEF1371561964E4F37B014F87 +:1081B000CC9143DFE99C6DECB03BBC3A84F76A4557 +:1081C00022285FCC2E1807A67ABF57A3F4FEBCF472 +:1081D000D2623A67AE24C6513E9E07284FD125E4AD +:1081E00041CEF28F836B304EDA424EFD6AAF7F2F65 +:1081F00096D7FAF839A8669CA7ACBFCDFE99A730F0 +:10820000AEEF8178422BC5FD6F6BFCDB1BB296B3E2 +:10821000713EA13EC117C88F3050BC28BBD25ACF87 +:1082200017B69697F6D129219BCF7DF83D6A027F3C +:10823000AF026A94F366BB798587C30F78AF2AAB28 +:108240007F8FB0E757402846798B412E07F7CCE265 +:108250007913F7F842E118FB2E291A9D8F58874DA4 +:108260004DEB58F38712E826BDDEACF4B8502E9BD8 +:108270003F54E8FD6E35FA20D2D5051AD9B91E460D +:1082800034DCBF56D43A8BDD0B25E27E405BFEC268 +:10829000265FC0E2EF197AC129F422D317EB7C05DF +:1082A000A8077B66F27DF5A48BEFEFF07AAE54BDA4 +:1082B0004D0847A67ADE54BD6DE9EA2DFFE1779FB0 +:1082C00089B1F9BEF4FBDFF4E366DA3B4ABC10F394 +:1082D0001F9A0EACF1A31CBFADC4FC88F73B7AFA21 +:1082E000BCF79F097D87F94E785E7E85E0D3BBFFA2 +:1082F000B8F126A4FBC5034E3A6FDF7CD09D7033E6 +:1083000026AE38721797A783EE3779791DFDFE48A0 +:10831000F351EB7C5BFAE4370B43B4B9172B16F738 +:10832000B393FDBC62FFEF67A23DD20C3DA427ECE6 +:10833000ED70FC0FF368FD5A80E7FEEDDF8D7CAB3E +:108340006621F7CD4736525E55F391599447D56C67 +:108350009BE78DC20F39EAB3FE6E83410FD0B95D42 +:10836000BCFA3BDF1AF72683E7FCFE5FF8254BFCDF +:1083700088EB89DEAE3B1E7F369459BFBF2FFCFAD7 +:10838000543B9DDFFF7D94DBF1708C3F9B9C093F4C +:10839000FA4D4D7B9C61A641A0E9BBFB9EF836CA15 +:1083A000F7EB6E8A372CFBEEF3AF5EC7CACB9E723B +:1083B000E6D7733454CC0336F88267DC315FD7E0FC +:1083C000C3D21F3CEF0A8DE5EF1FC84BF163D953B1 +:1083D000275C30B63FFDA6759D70F1F3E736BE749D +:1083E000BD3913EDEED5DFF9930BE7D73BC7251861 +:1083F0005ADABF7DE39EE7C9AE433A111F059FFAE3 +:10840000F8D68F5F899B9E9D40F502B88E0DC4AF54 +:108410006FA3CC14905C7FEF59DC2FF8953B8C74E4 +:1084200068FCDED7FD88CF5B4A0B97EFC7D614E216 +:108430003E7AA3335618A0277FDFB8FB1B24774B67 +:108440004E7FA390E7416945FCF78C62451407DC39 +:108450007533E1B918A2247F8D8FC99487FE470533 +:10846000EA9E4A333F6EF0733DF6D65E375D7EF787 +:10847000162A5CF4175F96757EDE96E7257EC3D8D4 +:10848000F7C0FB1B59F98F1ECEAF02BFC3B8D7CAC6 +:108490006391DBFDEBBA914FEF0ED78662BC92D1B0 +:1084A0002126E826A11E924FCF18CAF90421659211 +:1084B00068C7F4E4347C8FF5BB9D9A779CA59D58E2 +:1084C000D7F8F8F788F119DC59689FBD55C8EC9DBD +:1084D00034F82DF31BF39FD91F263933CD733EEFAC +:1084E000F7AFE7F3DC98F7FAEC3AFCFEAFAFF079C0 +:1084F00084ED709D67702586D2F7137325D20B6EBD +:1085000048A49BDFFB9D627E5BBF33AF9CEC5B436B +:108510004E18FC0AAE5B2979E1FBBC8C0F64BF2DC1 +:108520007E94B537DBE7382ED573A5DE9BD6FB25C9 +:10853000421F5CE7B7FD8ECBAE8241DDFBD3E4D4B6 +:108540009FF836CE5F365F71FD69FAAE93F244FE56 +:1085500070E8B957BFCAE4FC0F5DC6BCB5EA53FB6F +:10856000BC6D3C3C11D2CDDB3FA861483B6FD9FBD1 +:10857000B4F3564D923CFF47E953837E0BFDD63C46 +:1085800027433F66A2A35D3FFEC517227ADAF52393 +:10859000FB7B0526F5974343FE0CB95BFA4FCBE90D +:1085A0007742FAE4D390BF3EF934E4CF8EAF957EA4 +:1085B000F6EF9F4143C58817B3A7F32188F9309E92 +:1085C000FA1399E2A917184C6B199F2F1C2AA5734F +:1085D000C46BBCDC3FBF10E8F1E755D13D3854EE29 +:1085E0002970AD457D61BCEFF1F2F8F785488FDF6A +:1085F0009C07F2E631D98FFB5D491DEAD2F9234C85 +:1086000023131C49C8F49DC78B2FA0FD87E3658DFC +:10861000D0916F336475C42AF4F3E3FCBCFCA2B6BA +:10862000AFF8711FFEC2B1515B517FDDF9A20CE2C0 +:10863000F71315CC37B943F0FF6D886D9FC2F0BCBE +:10864000E318F72B166D4A2F2F4B45FDC5EA3D2E3B +:10865000D44BCC2F38638E872F15BF4BD6B8CBF6B3 +:10866000FED81749AE96DAE42A2AFCC6EF1A7275CC +:108670002D5C2BFC3687399F6D865CB515ED920B12 +:10868000A7781CB2F7984CFCE83D24F1FC278C0736 +:108690004F4679E87199F3D8CEA3FCA5B9DFA0EFD6 +:1086A000FBD3BF99743FABD2F4CCAFC7ED64CFF32B +:1086B000CFBC5EF1632CFFF09F47FC1AFAD79F7680 +:1086C000FCCFB49F7DE1B89BE0B870FC6723EEC798 +:1086D000F2B36EBAAFE6C2436E9EFF79DC47F7D6BF +:1086E0005E18CEF38556FFE44FE3E8BE3EBCC99D5D +:1086F000F1ED353FF7C77A8FFDDB6F317FB8F79823 +:108700003B8478341FCFA6FDADE667BD14A7B9F052 +:10871000933F4D32E7335D293E2BC47D88177CD0D3 +:108720008079CA1772F9BE41F38F27EFC37344CB28 +:108730008F9C70E17ECCB49FFEFB38D43B170E7348 +:108740007BE27D677237EEB3FECE7FFB3A27C677BA +:1087500071BD1E06D09AA3DF88F7E1F4A70BA7C36B +:10876000054607C48BD1A511F565267AFCEFBF5BE2 +:108770007A7C301FC76F3AF6599A3729BA481A7F60 +:10878000EFD3F16813C39FBF3FFEA771681FFDA120 +:10879000AB8DD6F981F02ECAF97F0D6F293118BC47 +:1087A0006BFE6EF1E6F27FDC1FE2797FB679D05F77 +:1087B000CE7F782F95BFE70B13BC839CFF0D7FB74F +:1087C000F87F42BE1F667CF70FCCF7FF92C3F78598 +:1087D000FFFEF01E88EF2F0ABEFB02988770E1278C +:1087E000FF4EF17503FF81F0DEFE7F29DE863DB48A +:1087F000C1118E9795621E76A23BC4E05C53392767 +:108800008E612959E45DDBE17A2187FB17B2C4E36D +:1088100036309CC78F40F81B7DBF03A9F2F3558A01 +:10882000BA96DF47A684E97EBD0D572F0C536E071D +:1088300054BF16C572C914FA7D5BBBDFD52E8126E5 +:1088400031FB4FB9FA0BA7D0FE77563A12EE71F40E +:108850007C139FEB44DCCB197059FC0DD5E62778CF +:1088600043D6EF6ED19F07AAE3F8FBDD1E5509E85A +:108870006C7CB5364EF8606E67DCB46F88BF8F9D38 +:1088800030F9637BF107024DF6E4E5D2EF4F39DCB6 +:10889000FF94A5EA6ECC8B85AB1CFC7E73E0E78A67 +:1088A00037948475BA8F59F897297AAEED463A2AEB +:1088B000C0FC438E1FF99520FC494574A1543A34FD +:1088C000AFB59EF09706E40FE7C78826C19F9516BF +:1088D0007E18F44FC3170B3F0CFA5E2E5FECFCB012 +:1088E000D3FDE7393C3E67E793251FA480FB2509AC +:1088F0006620FFECD03E8A8BBCF78F6FDE84F59745 +:10890000FD5806FCDDC4F70FF92081F357D15DE86F +:10891000672D3D22535CF8FF002820961900800047 +:10892000000000001F8B080000000000000BED7D20 +:108930007B7C54D5B5F03E73CE4C6692C964F29AF6 +:10894000CCE4C524811834E0244040419D104010FF +:10895000EE754011B451470810CC13A4BDB4D51F17 +:1089600003C1343C6C43E5A5453A202AAD5803A623 +:108970005E50D4411E62AB6DB4DC5BB46883A280F0 +:10898000F24869F5C3FB79CBB7D6DA7B67CE994C51 +:1089900040FBF577BF7FBEFC73B2CFD967EFB5D789 +:1089A0007BADBDCE9E4B97E0EF26C62E892B632D67 +:1089B0008C653256F77C3263198CDDBF2B213CA5C8 +:1089C00000AE2F7E3C940D61ECDCB29E4339703FCB +:1089D000F44BC5F714760F750FBD0DEEDFAFB17B0D +:1089E00003A5D171E435CD69626C046367F624CDCB +:1089F0000CDB1953B6EFBB87C6ED98614E50A2FD54 +:108A00006C4E33CD0BFDFCF83CF40B253C48E93BA8 +:108A10001E634BF978BF50387CBBCD611BC2B77D5C +:108A20008B250870346DFF8BC50F70543DFF9CA3E0 +:108A30001BE66BDAADB24809A3BF4B0C9FAB918428 +:108A4000A1743D8E57C6FC76A582B146FCD70BD7E4 +:108A5000CE8629CC01D78E557F511DF8BEF9A36E65 +:108A60006BF4FDBAE75F793104A8A97BE119871798 +:108A7000AE9F753DE560A534DE7D9614C634BB66B9 +:108A8000E88FE35E4CEB3B0ECCCB980BEEF35BAC8C +:108A9000A963059FAFF35F4E32848FC138126E58C1 +:108AA000DF67F88F87B151CEE48C4FAF81FF47B2BB +:108AB000919754B86E4F67ECBABE788AE22BC4E93E +:108AC000F9DC179B43809F33BB3EDF8CF0D7FFFD63 +:108AD000AF9B7F08F863AFDA9C4FC1BA9B7EF91F4A +:108AE0000EA4AF7C6F9A53A1F7CEE5B19007FA9D23 +:108AF0007B2F211C825BE75E3999EF85F59EDBF9C0 +:108B000095CB0BFD17BD323E0BD7BFE8D75559CCDF +:108B1000DE3F1CE79630164ED0C315263A7A77C34F +:108B2000A059D0DC2BAE31F4D8DFB93F1FE13C7B3C +:108B300034C1978078827B8BCB913E40A7A1BCFD4E +:108B400020E0B771C78FFEA20E8D87E7508EC98DCA +:108B500074FD7802C2C9582487B911BF3DAD4E7B60 +:108B6000DFFEBDF43A02F4BCF61BD06DC70A3E6FBF +:108B700007D0CDD1976E67F11FA04F13D22D294A90 +:108B8000B72F58F0E79E226877A6135DE3E12BF23A +:108B90000DF055ABF0F16F70FA7FE044F9D995D440 +:108BA0004BAF2948AFE7BEC86740EF53E69E7BD87E +:108BB00070C67A5E49706E85FBF7BFF24792937379 +:108BC000BF7EC78274843FBB02EB3AC77AFFBA709C +:108BD0009D8D8A58E7B6E44882238AF7C6F0D48987 +:108BE0005E07DD3F4EF7C39C7F117F39489FF0BE83 +:108BF000DB9538F4E87016D23A583893D6DDB0EDEC +:108C00004F16E41B4927A48F320AE9757C02DE97D0 +:108C10007492EB8E1DCF897818A9A3DB362E877D41 +:108C2000E9DA636145F1E805F0E27B082FB4CF6D26 +:108C300049D094147E3F17D671CECC6676201C6145 +:108C4000E58FF1E8CBD8325ACFB3B17229D6772568 +:108C5000B9BC12DCFF285E9E703A697C899F335F45 +:108C6000C7D7CF8750CE01FEDDF6E041E41FC6AC8A +:108C7000E11330CEBD4C61294551BC4978CF688C99 +:108C8000F4EE995FAAE110ACBFB5633FE9D958F99A +:108C90008675F93BE2CCF747315FE3EE7D43510F38 +:108CA0009D797D0FF15FE38EE396108C7368FB0B6B +:108CB00096EED228BFA3FE0EEBF4F7995FED1B4AA8 +:108CC000FA16C78FA36F4E88F19BF61AC76FDAF1B9 +:108CD00017C3F875A10E8BD37EE5793ED3FC3370B4 +:108CE000BD9F759919EABFCF3AD489E138F3BE29FF +:108CF000EC97C453EB3B16B263C3DF4D0C27009EC9 +:108D000016BD33F14F291978B57801B5AC7329E751 +:108D1000ABCE87FC394897CE77EE52D19EBC88788F +:108D2000BC2A3A6EC591E6AA6490DB8A6381E1C8E9 +:108D300056B1FA60E45193016E98270BF5F372185F +:108D4000C70BE330CDE70EC0B8AA63C244844775B1 +:108D50009A9CB6B876958F67B6075810E03283DDD7 +:108D6000F6EAF8C93DCD3194A5E0F23C26D40B0BD0 +:108D700081BD503FBB2DAC4403F89829D1F7148C2A +:108D8000BB70B0BFEC20B417CE71FB42F0DC731B9C +:108D90007FEFACD31E325D8BEDFC30CA51D24595CE +:108DA0007941F59D51DE9ACB40252409BECAE94898 +:108DB000223B93A4793754433BA956F30146D92764 +:108DC000F6605E6A26BE67A1F73CA98AF629AEDB8B +:108DD000C11C286F727CD94F8ECBB4C8505C3FB396 +:108DE000328D815DC9651C6E55ACA7887529C8DFB9 +:108DF0002D531D5BB1BD29B996EC7F3EEBD9E7073A +:108E0000BA3DE9987018F518FC6BC27E79CD46FB27 +:108E10003E60B1B15D10D262E4D76B0A00FF15B5B8 +:108E200019EF6754552E18E063EC9ED4CE891AE8EA +:108E3000EF8C19953B7300A79357BECBDBCF5496AD +:108E400079A0FD1F6B1A2669A047327E5F59960FE5 +:108E5000ED0B69DF9F44CFEB0049D783EA5F3374A2 +:108E600052A8342AB79900668A4AF27C23E2E16C60 +:108E7000E04C2B3E6D98FEA5051EE15F00F190379A +:108E80008AE321D77E6C2783FE034CDD4B912F7F35 +:108E9000FECAFF4AC57E5EE6A4F53AD972E7A75638 +:108EA0005C3C1B7569D8E5F499C63E957CA846E5FF +:108EB00020C515BC3515F8AA7556C98609A86BEBEF +:108EC0007DC45F30B393ECA1ECEFCC20FAD408FA68 +:108ED000209C56E0B339BC0BAB65ED420F8D73E2BD +:108EE0003C4AA85EBD74CDB7876796E49B64968CB8 +:108EF000F7B57A2FC1D595E99F83F8FA2A334857F9 +:108F000079DF3D6BA63708F8BD3135300FD7E199D1 +:108F10007B311FE19F92CA68BCAA79763FDAD50BF4 +:108F20007B41FDC5912B79DDBA84F9B441FD3F9FAA +:108F30009616FC2E8E5FF89A77D76118EFDA1A8BA7 +:108F4000CF06535CBB78B84F4B677C41E87708BAD3 +:108F5000B991962877DF636194BBF3098ADF0FED3F +:108F6000F30F38492FE7D64C398CF6EC7C52414749 +:108F700004EFFFD04BF2081E8082F290B7372562D3 +:108F800073103F7F19C3CF5F1AF9D738EFF94BDE63 +:108F9000DDDD349E538C070E113CCF13743AAF7253 +:108FA000BFFCFC122FC101EEE33EB4B7DF74BEB5C7 +:108FB000A9C24F12F479C8E65F87F400FC6FD0E3D2 +:108FC000FF67FDD37133F6033AD235968E73ADCD7C +:108FD000F9A817EE0F744C008DCD4ECEFD5E053214 +:108FE000F7D4D4E036EC5F3FB3EB9099A0692E46FE +:108FF000B9ED4B6785F4B96BEF7D4BCDD06E423A3E +:1090000079FBD2F3DAC56544371D7D3B70FC6BF705 +:10901000FEC584F04BBA6E50B81D887DFFE55445FF +:10902000CC5BBFD40CF8BCB0DB42FE6F6CBF83A935 +:109030005EEA27DB43AD153E0DE434CBC482F1C6B6 +:109040003DD8675CAB2F210EFCBDE339F97880FF7A +:1090500037F4F8FF6DFFF8FF9DC0FFEFBE25FE8FD0 +:10906000209DFBC3BFF4BBEB847EA863ABC9DFFCD0 +:10907000C43FCD3510E69FA0DA491EE63FA5921CFD +:1090800042FF291E57549FCCBFAE791FAE77FE1307 +:109090000AF16D4D90EBF9CFE74E3984FA7D4EBB66 +:1090A000D17F9A3B33644138E76D34DE9F1F8E8950 +:1090B00007994EAF035F9C89F2EF00AE77DC642F17 +:1090C00055211F55F34A53D05F7AD5ECFD3DF9E3A6 +:1090D0006FAA6C6B1CFCE7A715903D96EDBC664033 +:1090E00092CECEB31A9B09F5A51C77DCBCD22CF42A +:1090F0006B16267B2F1B870D586CB4EB05A144E63D +:10910000D58D5BD49666680F6ACF36F4BF6A63A1CB +:10911000E1F9E0F0D586E7D76C2F37B487745C6F40 +:10912000E87FEDEEB1867659E41643FF6187A71913 +:10913000DA23BAEE32F41F797496E1F975DDF71B84 +:109140009E8F3EB5D0D0BEA1E707463FC6C4484F6C +:10915000B24485F4E68125A72A4E20C30D57C621C7 +:109160003EAB46F1BE0716584C4E075E8B4D4EE0A7 +:109170008FD7E74C213FE0C00297DF4BD70A3FC6AD +:109180003F4C1D333C18C7CF1DEF3C5D7142376F1C +:1091900095D56CD073E39DC6F6B034113F0CE07CDE +:1091A000332ACD285F6AF39488059AD9F30766E1DC +:1091B0007C2067A3D3B89CD1F58A72E668AEC0362E +:1091C000C859655A1C3963C2DE560A7E82ABDF522B +:1091D0008E8C954C76D98F37BD743FA441BC32D666 +:1091E000EACB3D88EB32F9329009C7CD0C1CE0E3A5 +:1091F00009FBCC4A4CDFC63E4B39779BBC21B26B96 +:10920000698CF24B8FCD294E613AFCDE956612FADD +:10921000A09DC791CEEDC33489C742FDFD8923B41B +:1092200092E87D65DE942C943B773F7AD1E22E1A4A +:10923000BC0DF4B1C553405779BF75A66962380EAD +:109240007D1BD2789C21FDAEC151BFAB01F17BD615 +:10925000FDEEFA4180AFC6EA1EF2BBDCA6F605873A +:10926000705DBF5179DE0C3C2BD40B73841F3D67BE +:10927000D24F171C02FD34E7ED41A49FE43C9B96BE +:109280004406EBFD86DC7EE2AAED029ECD4BFC831C +:109290006B06115CA41FA49F9E1F6A9880F1CE00EC +:1092A000D64C71E37A13AB8D37CE0A314E16921C31 +:1092B000E175DA494ECECE3DE6D0601D89C9C115B3 +:1092C000C86FB3AEEDAAE0FE98DF370DF8273F7206 +:1092D000F77AEC9FEFD65858E93B7F5675B0AD0052 +:1092E000D6B73CCDE4B353BB47C1FE090F32960E4F +:1092F000FD97FF5D257896BF7E1DC3782DC1DECC1E +:10930000D0AF95EBDA9FF638E147ED4C223BC8D061 +:109310002505FC7D57D0FE0B774D17FA1D5FAC3548 +:10932000D37C5FC01A9D30FE179D6A189DF7436974 +:10933000891113B4D5B664B2DFF9E88342FFB99D51 +:10934000C9616F41142FDAC6312C02F62E2197AF76 +:109350007F799A3D6C2FA075AFC1754B38E5BAF394 +:10936000FA89432369DCCE327F8981CE1E88C9BA4F +:10937000706E0D9C7F18475D6BA638714EAA9DE0FC +:109380000C2F090DAE31F75D5FAB7BDAAD77023C98 +:109390002D4754A6C238DEEE76C2C75CC047D8DB84 +:1093A00017DF67BD055F9A54823B82FCA86E9C4024 +:1093B000EB62E8D7C37B0D3F57D8E305C897C18957 +:1093C00044E76C137BAAA0EF3ADE48E3F9DBC369FC +:1093D0004EBA5ADCC55C4EDC03076F83F1DE423DBA +:1093E0006565F1FC80DFA7717F9AAEB1FA09EC6088 +:1093F00008E1B8B051217A9E54C21633A0ACEEF603 +:1094000066F207A47E52FD2AF91F524F49B8408FD9 +:10941000BD9FA6B38F6ACA834371DCFEFDB59DFB79 +:109420002CE8AF3919F96B528FF6E7AFA19F86FC94 +:1094300027FDB45331EB84F57D2ED6F779BCF5F5D5 +:10944000D1BF77354B3FE72F6997F133332DF1F5D6 +:10945000D355E99C0E4D4E0BA3FC14C6CBE83FCC74 +:109460003785B7621E4A0BDBA6EAF0939D2EFD3CC2 +:10947000EE6FF4A7F7AE149714AE2A25FD7BA1CBAF +:109480009B9206D78C8F95E678E3A88B9F1D8674F8 +:109490009A6FAB4C4A07389DE9467C3DB6A28FFDDA +:1094A0004A4FE7F8A36B1FFCD9017F26839FF86220 +:1094B000B197F0E749BF8C9F78F6B60F2BD02E9D61 +:1094C00013786AEC8D7BB99ECE06638579AD06E68E +:1094D0007FF244096F5F5268D783F2759BED81413B +:1094E000387ED3EE494FEAEDF7D7693C9FC6EC6969 +:1094F000946F95E3B984DE8738FBC64FBCA4FFBFE9 +:1095000044FA46E3EDEE0A8CB75A7E7D550AFA67B7 +:10951000E35EBCD389D70B190309AF675F4CF02317 +:109520009C67D3401FDBB13DF210E6213E5F7238ED +:109530004D4F97B3BF7AA7C20CE39CDDF54E8586ED +:10954000F90C91AFE9B54797FE501180F743635985 +:1095500049B35DC727566E2FD6DA78BE23D3656927 +:1095600065D7423C92994AEFAF73997E8CF755EBE1 +:109570001FF24FA09CC5E477D69ABD2D76E03388C4 +:10958000E57CB84FB070B0DF3307F33B53DD949701 +:109590006951B81E0DCDE1716846212B2980F1CCAF +:1095A0002655C5F77A3CCCB715BA241C688FA0DACB +:1095B0004BECEAF023F8C313D3089FA3CF38158CE4 +:1095C00027643E48ABE2E3F54CB784B7EAF240EEDD +:1095D000991AD9C524AD83A19EBE2F338DE097F98A +:1095E000A0AA6933039508D7C3268A6740F12AA841 +:1095F0000F73C43A0A3CBB5648DF4673215B324CBA +:10960000FEB055C0FF0301CF0EAFC98FF957476EAB +:10961000E4A819FCBB9CE58C7DA4F323932C42DECB +:10962000DE5649DE92BFBEC93A13FCA3A4449E573E +:1096300075045A17605E1CEF7FA71CE9C2DF27FA8A +:10964000A898A662A11400397994715C49BFCE250F +:1096500056DF4060E85D4B9C747D7A899BE0FAE9B7 +:10966000122F5D7FB2A484EEF727A757BA3EB2044B +:10967000E6D5F153C648C00AAC37436524CF8F8C7A +:10968000A8489915C71F90D7C7971C768D1B241023 +:1096900008F4C8AE776E59594074462182D5BDBDD5 +:1096A000C23F86B187CDFE050C586B4DFAD7E3302B +:1096B0006FB54A31519EEAA7E96FAC08E5E2D54B98 +:1096C000744FDAFF1EC37CA76778BB82F2EEA96FE6 +:1096D000273E18DED5C582E2BE1FDA9E23FCFEC3FC +:1096E000368EE7D58C4D4478ED0A0BE0F59C8DFB6A +:1096F000839FDAB87E3C2DAE43D2839B518EFFE62A +:109700003C5AFC3080672B7D3F1FF73B92F67F452C +:10971000F96075A8C58AF2E1D97B9CF6415453B72C +:109720008581497EEDD13F537E4DB5040A78FBD744 +:109730002BB19DE9086C41978D85FE3CE9801BE4C7 +:1097400006F9E17AC24608E578954DB443C7080F9B +:10975000ABCCBCFDDAA37FA275AF3207E6235EB0C7 +:10976000BD1CC65B95DAE13641DBBEF4BD15876FE3 +:10977000C0B6ECFFDE8A10BCFF52BAD437010FEA44 +:109780008FDEB613DA43746D8DB799955FE5FA1ADB +:10979000F67F752807F8B571AFD281A079F6AE5182 +:1097A000709D9EDD6B08DFF407F281CBA03CA935EC +:1097B00064C1F79F5E72D8B91CE8ACA5B5B910EFCB +:1097C00057B9837E7FBCFC44A6F47FA1BF3ECF1671 +:1097D00036F774EBFC710FE372C396837E88E35F08 +:1097E0000CCDAC3C9D01E3AC55822B55D433CF99C5 +:1097F0009DA8475817D74367C4582C9C4DFE4DBDB4 +:109800008D37CDCB822B07A39EB85BF361FC5C57F1 +:10981000D05E89F6BD6E4F816F298BF24B5D6A87F2 +:10982000AB1CF927D5D86E117997ACD4E6D4D452B5 +:10983000DC8F58938FFB058DACFD9E1F20BC6FA95C +:109840000CFDF4D3FBAE4B190DED0668A3DFD0D0B1 +:10985000F98E05F9F3D10CAE3F1B3B817F609CD59F +:10986000205F7E7064B668CE44D44F4FFB9BAF46FA +:1098700017EFEB47FF6B920DE8FB4CA1DF89F47605 +:109880006798575AC1697CC6E21CCCCAB06D27FEE6 +:10989000AA2B33713962F6DFF835B1FF09EDE38F9A +:1098A0004EBA459FDFF5E0BE0CE0B969933D644ACE +:1098B000217BF3BFD1DE366E3485507F99AC5D16C7 +:1098C000A4AF1BF776893E4EC2DB22A9CF63F4F525 +:1098D000A24969B7607BD1C385CED065F297B51731 +:1098E000935858E71F3D9AC1E5B8560BD13E4AED53 +:1098F00045073DFFE7CD6763E161979BCF4ECFE51D +:109900007CF5D1F988AEFBCB7FB37E20D06DD14EF4 +:10991000B32941C7778B768AFD6A9B3F0BC7C9B4D1 +:10992000308177F0F701BF5A416F3BA4819C3FD251 +:109930002BE703568E1B83748B3E67A30C7AC08F74 +:10994000F1E62389520F5C15BF7F624CFF42D9F6C6 +:10995000AD1C97DB179ECCC468DB0AFDB5FF4EE853 +:109960006D237C6B4C31E3A5C9F947D17892AF8E5A +:10997000A757FE2634109EA7B65762FD46CF1CE6B9 +:1099800045BB8CFCEAD3E9FDE3E95CAE6B2F16190D +:10999000E81DC57BB1E1FEC9256EC3BEDFBCEA454B +:1099A000B43F791CF53C8EC3421457D56ECA616131 +:1099B0009D3FF5FFE1F847E118DD0F1C37FE0FC3AF +:1099C000516090CF281C030DF7FF5138B6DE517C53 +:1099D0004B017459A784AC8568171E3251DE444D83 +:1099E0001DE75D8AFB0F0F69E4E7A14B82F51F8538 +:1099F0001A3BAC95A3FCB4FB31CE67CB78FE08EEE6 +:109A0000B799CBC90E911F5CB437E13EF4D30A6B12 +:109A1000FDF3F1CA724B697F43EE0B32910793FB62 +:109A200019839CAC5203E76D74E67D64A70A03D5E5 +:109A300075E8CCA9C9C313D13EAE338543385FE87E +:109A4000A77CBE4C53B8C38ABAD731D089F62ED37F +:109A5000C1F51F5B594AF66FABA9F0EA0500C7C311 +:109A60004A65E29B88E7D442CAFFE2FD85707FAB7E +:109A7000B05B6AAACF89766AABB05B2D42BFCBFBE5 +:109A8000496981FBD09F3895B1E816EB75A887FC32 +:109A90006DE9606F4E662C5AE9F6A0BDF1165AC109 +:109AA000BE9C5CFB00D99BAD4BBDD9CED4687BD0AE +:109AB0007F83B5263DF1C04AF45796DB17DE8FFE53 +:109AC0000E3CFF8D15F4EC336942EF88E785BD7AD3 +:109AD0000AF412E83175696F3B847AA9B057EF3CFC +:109AE000407A67DB6695DA6FC37CE8FFC03A422AAA +:109AF000AE7790467EBD0D604984B66D7021ED1342 +:109B0000C1BA5922FAD783F97399CFB70C32513EB3 +:109B10001FFB231E6D1EDEDF3295F9705FCB926C4A +:109B2000A73844EE0FA8629F2A51D46928CEA91401 +:109B3000DF5957972FC478CC3AD0B80F6B89A9E773 +:109B40005063EB3BEC11F2BF4E6788BC7E3A735F0B +:109B50002A8ADE07BD5D8E57D79DCB2B11DE85C9C6 +:109B6000CCA9625E2518A17DCE58BB66053BEAD51F +:109B7000C987D5CEFCF1EA090E65723FD67E51A3A6 +:109B8000F866AD02FE0DDAD164CE67D23F323B25D6 +:109B9000DF1AEDAEF497CCA97C2D8B268DCDC2F8C3 +:109BA0005DB5FBADE8E7EC7396535E4065BE5B2B9D +:109BB00075FECEF2C824CABF694E3FF9E145224E78 +:109BC000549D3EA6F7735A9740607915634F56141B +:109BD0008F457978DC16B116217DD79928DEDB5FB9 +:109BE0007E7F48C1FCDB624672FA64856B2CE6D14D +:109BF000B7688194BB515E8EC07C5E4E37BE9FDBE2 +:109C0000A260BEF80B6B2005F5C123C8F73ABC3C37 +:109C10002FF0F1F70CAE7F1E3673B968057822007D +:109C20008776F11ACA6FADC9E4790F4BF538CAFFD0 +:109C300058001F98DF4B60CD2127AD97E7EB12DC72 +:109C400026435DA0767128BDFFF70C9321AE6E838D +:109C5000757A75FACBC64294AF431C3F15C77F791E +:109C60003B93C72356F087BCE49FC4EC73F7F58F92 +:109C7000C85F91F4E9F55314F04F2E138F3541BCB2 +:109C8000ACD7F74D5A0FE9DF268887F1FE39A79543 +:109C9000FC4359F76017FAACD51D6C1F8D7C9EE80C +:109CA000188A79008D7510525663DD03EA43B7D6E2 +:109CB000D3CBFF20F32D36C756ECB75CD44124F943 +:109CC0008CF293C8DA237E94CF129DDC30C477885F +:109CD000C64DF01AEF331664186768EED83A89500B +:109CE0006F3D14D5F369EC31DCBF967E6F8EA847CB +:109CF0003A9BF421E5D1C0EFAD4CA77D801E8A5B75 +:109D000064BEE7DBFAC9453806E61116FFB5E20482 +:109D1000CAD9D40905783F49E37C02AEB896508E83 +:109D2000E1D584F9A9B0FE3B85FDCB50DBA96EE4FB +:109D30003511CFFECD39D3437114E093EA6D127D16 +:109D4000DD142F0A3F4DEDD58F7F5EE137FA9D215F +:109D5000BD9FB76ADD9F572CE7F10AB55F7B3442A0 +:109D6000FAF3619B6CBF4C6DB073118C97D88B0963 +:109D70005EE44378DF8FF2C6EE28263F5B2D64D980 +:109D8000888F710E2BE94DF5C584ADE807435CFC67 +:109D900052BA6EBFF86CF2D17CF487E38C17328C28 +:109DA00097FFEDC683F93BB11E473E1FE7D8185118 +:109DB000F97B5E7C8FE5767D1882F1D7FD3A81AD27 +:109DC00004143E6E36CABBBC6E15F28CFA465F0FA9 +:109DD00069A9AEF123534BB94E7027B2888E9FA468 +:109DE0009C6B1707B3884E4E8A32F9BEAAA6F92992 +:109DF0008FA45D2CA5E77F4799A6799C579827AD3E +:109E00009F798691FEE87F9E0AA15F98D8BFD2A86D +:109E1000AE46EA85FEE43C769F2C562FCAABD48B27 +:109E200059997CFC7D99C6FCEBFD1B3B0E210B7DFB +:109E3000660F1EC8A4FAA8630E34E1F5A6C850E464 +:109E4000E34FFADE6FC4C5BD95CEF3FEC5DB17BC8C +:109E50008EECDA9519FC02FDA0DF648AFD4937D843 +:109E60004315ED1DD88B52CAE77E9181F9DCA077AE +:109E7000C37886F27407E573535C81521CBF755A30 +:109E800005E51C24DCAB96F03A35A967ED5A90F055 +:109E900065D542FCEA0C820D67EC42A679B2A62099 +:109EA0003EB91C1D5D7781E4C0A6F989AF6C4E9365 +:109EB00017FD021BC485A877973A4D7CFFC66DA598 +:109EC000FC7FAB021122E88D85A98597DD1FB75C69 +:109ED0007491BD0548DC7ABDFDCF9F2743D807E3C9 +:109EE0003C9A93FB0D6C3FB7C388848F75FA58FA80 +:109EF00003B1EFC58E2FF129F16B45BC96923D8CD5 +:109F0000EB6FD85CC6FDCC2CA96F338F1647E06E83 +:109F100083D2ED40BF06F4A8CD857A7A488FC3E49A +:109F200025FDEBE27E5048F035B3EBF95AE6A9E5A2 +:109F3000BA24FC0BDF9C63D5EFBFC4C21B6B67ED7B +:109F4000A5C6BA059BD758B720BF0B50B500F18DF9 +:109F5000798CDF8A72B2D459EE443F67B9E6FDA32B +:109F60009FEA2DCCE46F83FF6E985F5E1F01F94777 +:109F700038CA5C26435D8DBC26E33E4A9CF7A6BAF0 +:109F8000B89E7A64DF9DA487351FDF678AA51F63AB +:109F9000EDC42FC9C5CC49F95301AFE30AE3F6C7B5 +:109FA000473FDE67233F591B650D635D67EC7CAA65 +:109FB00039E05750EF9631F293D53C3EBF3A885185 +:109FC0001DB863781A2BD1E1B1D53D8D9E2FCC748D +:109FD00032A4B79A6C0AC4E31789A7812E93816FC4 +:109FE000DC926F3CEF17A31CE8F826108F6F06BABF +:109FF000B8BE4238F4F46D751766C5A34F542F727E +:10A00000BEBA125FCC4AE27E4EA785EBCD06C411E4 +:10A01000C44BF5999656CC7F9FB1F2E7CC5FC2FD59 +:10A02000322BE7B95949F961F4873A357F12FA655D +:10A03000B37AF76DFDF4BD47BDCD9F721DDAC777CA +:10A04000B8DF7CB2D2DEA6C03827CDFE14C4F7C973 +:10A0500077546529ED83F3FA39598774D2EC5D752D +:10A06000353C9FFD33D5BF941E1BFDC133CC3FEC67 +:10A070006DF48F77ABB4DF52F0D3FBD421D0BF06A1 +:10A080001C45E4A75955F610DAE1CEF79B3F447D15 +:10A09000347B73827719D6B16C1CF625B63F5D9D73 +:10A0A000EC4DA03C5BA1E2C1FCD79A0227ED9B2CB2 +:10A0B00066229EBB7D7215E8D05FE2D4327F0D6BC5 +:10A0C000FE94C9E7A155E3609D5767769AEC00932B +:10A0D000B221B4CA0AF47B7869C08DF163876BC67C +:10A0E0002A8C1F5D2E7FD74D102F9E70DD3919DB16 +:10A0F0009D8FCBF1EE5AE507BDFCB22958A0C0F305 +:10A10000A4AC072653FD6A911CBF959ECFFAF95562 +:10A110005F1E85F1CB366C9C8C39B78A6AF17EE87C +:10A1200009826FCE18D9DE9A543510DE4F62863C14 +:10A130009A391A8F529EAEB3D7BF7A7A32C69FB37E +:10A14000C736576930FEB20D3B569582888C6CAF8E +:10A1500074FAA1FDA30DAF4F4E027EEB64FE3A8C64 +:10A1600077576D3830D97A038C9F6E1C3F4315F9B1 +:10A17000D8D0E15598C7EB858FBDB7CA3F30DA7F9D +:10A18000983B61752837CAFFFF2AF81FF8FD572E44 +:10A19000DC07B4761FC2145DFEE21E0BAF7B15F523 +:10A1A00029B9DD4379DD8D689774F33A65D976F383 +:10A1B00076E7B2F8F6FE2F6E2E779D89F19F7F2805 +:10A1C000F439C0EDC7FA9594A3CCBF238E3C1D741F +:10A1D000D949FE0E82BF674D8BCAD5AD20DBA3B037 +:10A1E000FEC7CAE194E3C4BE7F4CE82716BA350D1A +:10A1F000F9788AE0F3229FC2EB7876278507A1BF22 +:10A20000C722DA6DB09EED229FB1DDC6EE9D0A53E6 +:10A21000BB12597027FA9FE9D02EA5F7FD3BEDD16F +:10A22000F1DEE2A2CCC61705B6E178E3B33C652DBA +:10A2300005D17100EEE5D67203DCDAA8347C1ECAC3 +:10A240005E50AAC367295F07F009E10BA679F626DD +:10A250009097CEAEAB0B57C21256B9BC86B8AFA220 +:10A260006B1A7D97F29F6EEEFF302F7F3FB38AD738 +:10A2700085F4EC49A23C05B37615239DE47B1705D4 +:10A280003EAA7E346503F6ABEF3233AAFFDF59797D +:10A29000597FA01EF37A3AFFB15E8B503C578F79FD +:10A2A000BD6138DE5B16B463388E57E4AF312F974B +:10A2B000D9129FFED21ED65F4C65A1617DF56674F2 +:10A2C000FC0C7A7EA57545C733C69D7DC7B3887DD6 +:10A2D0000081774DE0DD121FCE0159824F01DF264C +:10A2E0001D7FCD11FC06DA93FC80732F0EDEBAB20F +:10A2F000403F2FFFEE06F4F3B337A1BEEC4AA4B8FB +:10A30000A542F34FC6FE155D69B4BF20F943F2853F +:10A31000A46B675A33E56B7A1E53C80EC6C2552C20 +:10A32000E1DAA8101C59D541F53E1D7C521E60FC97 +:10A330004E31FEF051243F4F707900B9B91BE5173B +:10A34000F72B711DBEEEA1D386F485FF2768FF466B +:10A35000101D39FE7F6D13F51C1C6F7DF19F730579 +:10A360007AE6D3F38AAED7699DF5FDC8ED5B6E073B +:10A37000C1997534E2F042BF4705FF77767CEC184F +:10A380008D72B15B658A97AF1BF55685D4C76CEEAD +:10A390005B6341FF65F5B6415F7A910EBDFA3362AA +:10A3A000B546FBBFE29E3B65393CCB48E0F29AA143 +:10A3B00082B5298FC2313D8BFB59A382F1FDD27743 +:10A3C000DDC9F45CE2FBB1C555EC6358DFCF5C7CC2 +:10A3D000FF7354774841BA48B98ED5538BB2B83C15 +:10A3E0002EC8FA7FA4A76C57D05336A9A7F8FD83CF +:10A3F000101C613F97AB7BA802FE738DC9EFC2387A +:10A40000ECC43B3FA0EF38E689BA952158B7827675 +:10A41000F36880ECCA697CC8EB571EC218704EBB4B +:10A42000B17E856DE3DF89C6F255948F42C27F17F6 +:10A4300070087B706B42F7AF7891B1519E651BE05D +:10A440006C3415E99EDBB9DD9274007A2F6769518F +:10A4500039FEE8C5AC2DA86F87B9795E31A3C85F16 +:10A4600086EB9772097655F089E9DE6976AE37A6F4 +:10A47000C5E1DF27847CCED9C8F9A6F3BFAA26237D +:10A48000DE3BDF4D4B5DA6D3134F093B28C7957AC2 +:10A4900048BE279F3F29F8637B9683DA4FB99245E0 +:10A4A0009EC714F7BBB9A774F695F8A78DF30FAC48 +:10A4B00037A4E7EF616EC5605F7BEDAAC0738305CB +:10A4C000F00BF8DB6E0E6563DD4E459789C6ABD9A0 +:10A4D0009D4CF580351D1C8F35EDFB4C753AFCC449 +:10A4E0008EF71F59DC1FD862E27544074DC06F8894 +:10A4F000773B87EFDC8B1ED29F8745BF2BDB8D6FB1 +:10A50000A667B658781D29D097EAF91A5ECAD962AB +:10A51000D4D34B05FE832DF81D5BC606E6C35A2B2C +:10A52000C0534401B867B885DEB1F82DF8DD6ACFB5 +:10A53000638CF6F30755FBCBBCD06E0AD8CB15184D +:10A54000AFB89DEBE18AB5E0C7A0DC59A55D787393 +:10A55000877EBE6359C9221EE1FC5CB391E36F1094 +:10A56000F83FCFE215C6F915F9F11C9E8FD6778C0E +:10A57000C6FC937CFFB4A0FF95E0AB40F88647E1B2 +:10A58000C3F1919F983DB00CC76DFCC3AE1CFDB8E4 +:10A590005F66717D9BA1CE1A6B433DBF06EC0E49F1 +:10A5A00067703F7E9750B337D5B992913C9B30EEA0 +:10A5B00091F3D6883C24C85DC554585A71EF3C923B +:10A5C000AEEF3DA75FBFE6E6FEDC3F8BBE9D96206B +:10A5D000ADA76727C0EB8DE2A5B3E3BE6536B41324 +:10A5E00047990FED8484775075B703EB4E9A84FD3D +:10A5F00080F59A307EC9F89997B520DEBAC65A30F0 +:10A600007E8AE56B49A712C6E547C66925B84100B1 +:10A61000ED3CF750A17F18C5BB1FBDF4CAB32B2971 +:10A62000BEE27469AAE674AC740767B833A3720813 +:10A63000FABC02F555CDDA5E7DD4C1EF77E557035C +:10A640003EAF754B3937D22523D061C37D0DC9D7B5 +:10A6500067F70C09AFE474A6F93B3B92C38A82DF2B +:10A66000A1362FC5B85BEA0984475F8729E1E9A5D0 +:10A6700023033A0E89DE1F54CDC76B0279473EAAE9 +:10A68000579B158F427A80F2AC59A807A09DD5C17F +:10A69000FBB1BDFC5C0489A7FA193028C49D7E7704 +:10A6A00029AD43E22BAB3A62AA875B13AD55FE138B +:10A6B0003A7FEDB0D86F40BC4CA37883EBEB7A3592 +:10A6C000908B712BCB4AA0EF38C10E917E39686315 +:10A6D0009A0DC67B03AE6897C6AB0BE83B9AF14573 +:10A6E0000AC931680099F789A03F7DEB4D4924FFE5 +:10A6F000ECEB0706E23A3393381FC23856318E9599 +:10A70000ECA0B007BFCF07BF4E89EAE5838A42E3DA +:10A710001CBCE19AAD545B28F812C743FFE9A03294 +:10A720003597EC6567A6282EE2F0F76FCFBAF3F104 +:10A73000B93E5EC4F82E1A6F96ADBE19786AE4C4AD +:10A740008E88C989D2317CCABF01FCE321DEB4C145 +:10A75000FAEF137C7DB020A43A10AE41B06EB8750C +:10A76000283158DA6C8FCEE312F91B97A8DF457FAA +:10A7700001AF260FD7FF3FF6707BF181B8BA1CF10D +:10A78000F33D1745FF3FDBB99E5E5919FFBBED87CF +:10A79000845D9171E7AD62BF03E2CE87DC3CEE14CD +:10A7A000F5A77C7F04FC7BC26FD58FAA69DFEF8B96 +:10A7B000AEE929FC3C04AE0FE688FACF7B1F9AFE77 +:10A7C00013E4B31358670E78F844F0CB09A7DF8180 +:10A7D00075520D89F1EB889F14F034083C9C5CC2E3 +:10A7E000CF2F9883FB72C07FEBDCDCCF9BD77EDB67 +:10A7F00004A4FBBCB50AEDCBC9FD7F49E7DA4DAA3D +:10A8000021BF3E07F7E5D2FF9178AAAC9F786AB8DE +:10A81000219E92F3C6C6551F2D711BF60166B51712 +:10A8200089F32378FFD9CC4770CF6ECB31EC23B2BC +:10A83000B6CC6FF4DD3FC651A1B8F0590CF73F5AC2 +:10A840006265213D1CA70652FDC443EEE0CB6E03BA +:10A850001C492C64C8878E71D2F744369E87057FC9 +:10A860009CC73170DD62277F7D22FAB3BDF930D0FD +:10A8700023CE14D44B95FBDD23A2F18394B3FA319C +:10A88000F1E38875C20F5AE7E27172CA511957276E +:10A890007A513F4ABF3CF6BD777BF9D7E8575E292E +:10A8A0000F017C1CD2C749B1E39E72FFA3F177511F +:10A8B0003FFC52FC3F127F578C09529E8FB52B54A0 +:10A8C000D332729C311EFA1AEDFA08BC2619E2A1A5 +:10A8D0009A6A633FE6E1F69F79920C7E7C7FF8D41A +:10A8E000FBF14A11EA413E5EA3E08B82CFDEA57AFE +:10A8F000D2311EEE178DC8F62778E0BA5AD493AF3E +:10A90000B6F1EFF9B7FCF77EF76CF48FDE36D3FEC5 +:10A910003FDBCDF9A6F289452D783E80BD4371EA33 +:10A92000BF5FFD97C58ABF06E43A5DE8BB7A1F5F4B +:10A930004FBD2F621968C7FA620E476EC73E45D3F6 +:10A94000F15D6E2DEF97E7311BF2E205A23DC0E30A +:10A950009471CCBE4919D8DFAFA15F90DDA190FD05 +:10A96000CC6E66E457670F5768FC7F19BE45995D4A +:10A970001A5D6F9B696AA913DE6B7325F9D0FE2CF3 +:10A98000C90E5EE541F88E4522682E471EEBD23097 +:10A99000DE5A93ED2F413CC8757A556736FAF14976 +:10A9A000C7387CEDBD79266E7F185B25FCD2ADDC07 +:10A9B0003F53D961C6FD73B2F3AE65256407E57AEE +:10A9C0005C69C28EB85870979DFAB791DF62E57ED8 +:10A9D000806B5931F9F392AED1B8737039C69D4589 +:10A9E000AB23DA2C78EFA54DA6B8E7554C10788745 +:10A9F0007554EAD77125BD25FB99FBC93B4ABE4F6B +:10AA00009A183F9E074B48CF2B9FC8B88BE473B969 +:10AA10008561BE5AE27F4D76E0768427BB638B82E8 +:10AA2000B8F948D4297C94C8F3F11FAD7C5641FF96 +:10AA3000F281F9CCA9B2FEE1AE5FACFA6BF4F2BCE4 +:10AA4000DC427491F14A141E9E8769F070FB7428F1 +:10AA50003B5083F46EDCBD86E2EAF9DB8E5B2EBBF5 +:10AA60000FF10DF1A6D4727FBD7EA695EA992A9FBB +:10AA7000D088EE75CB2DB46F58BF63277D9FC61E5F +:10AA8000643E94FFFA8E9D4A0DCC5BB763A73247B4 +:10AA900087C79CFA30D56F5F952CF72322E44FC708 +:10AAA000F237E611D07F3964E3F27FA6D21EC2FDF1 +:10AAB0008933E6603DF63BE349F2E13EA6C4FB1B69 +:10AAC0003B6FA6F30292772544F0DA66DAEAB642E3 +:10AAD000BFB6AB2D3EE4A735D9C1154897342DD06C +:10AAE00089EFA76624FB707FC39BC0CAC97E7F43E2 +:10AAF0003C8C8CE18B910F72797959E817F8A37A25 +:10AB0000AA273DDC2FC7ED25D45787CC7C1DBB1869 +:10AB100087D7E4F16F443AB1C369346F767D44C19D +:10AB2000FA8BD879A37CE5DFECC9FC3670765850F7 +:10AB3000CFD7097D53F9C436E5631DDCCF79548244 +:10AB40002F7BC71605F367F09CF40DF46758EF945C +:10AB5000BD83C7AB75F07C8E4EBFC875C4D1339D25 +:10AB6000089FFD58D701AE67227CBF40C01B4BCF6A +:10AB700088C74BF34F007781EE5B4225182F1F2AC1 +:10AB80004CA4F1A4DCC7CA69C4C3FDCAEC4DDB14F4 +:10AB9000939DF655C8BF94F0C97E23B2C71EF0102E +:10ABA0001EBA080F0D9B345ACF784B60E0029D3CD3 +:10ABB000BC2BC67B7DC68774AECEDA7F7F87F8B1AB +:10ABC00001E26C8A33DADFB14C473B13FA858AFB2A +:10ABD0006093B98BC2D68B73A72677723DDCD0B950 +:10ABE000539B6D8FF269C167AFD379550D1D090C69 +:10ABF000E32BE0BFA3084F2C9F4AFC483DDB1F3DE1 +:10AC0000411FF1F829641179BE6001C63F524F9B84 +:10AC100084FC333BBFFF855857947F829F790C7A21 +:10AC2000D6467251F059F9EB58EFD9E053E8BC8E93 +:10AC30008C2A8E4F3D5CFA7830564F623E31C0E32D +:10AC4000FBFC69BAEFBA7AF5BD78FF22D29BDB8DA7 +:10AC500008BFCF0AD17E4BF863E937309BFB6571A3 +:10AC6000F84CC91ED1D79E493B5FB0799786DFE586 +:10AC700048FE998C74D7F18F33DB42E33AB33582C7 +:10AC8000677D25DF8F5C6FE6766CFD522BD567BE46 +:10AC90007127AF174BBECB12C1EB41D3AC7A7C7E90 +:10ACA000309BC3D1665A46DFA9815CA66613FF3884 +:10ACB00018D78F5C1FAE7D81EBB3FA909DE2DFFA6F +:10ACC000E0ED35540F9061F3611D2D0B1EB04C4F1C +:10ACD000EECB57DE5DFB2C08FFE40E2E7F920EA01C +:10ACE0004F89BFA43C48BC46F11936C893A487A934 +:10ACF000D79F0816707F89C75BA5E23BC25AABFF9E +:10AD000090D98B710CCFCB968AEF09655E7696A0B1 +:10AD1000CB667BC087EBEC9397FD86F142DDE2DFEB +:10AD2000527C76BFFB4DBA4AB985B8D620DF3709C9 +:10AD3000BA176773FB3E219BF34DDDF00E92CBBA41 +:10AD400013CD24CFF6895CAFD98FC5F88FEC11A154 +:10AD50008757D37BE3933A26E0BEF2F89F2B4E8CC5 +:10AD6000F7FB83731E7E8F8571DFA6FD8EFB10BF00 +:10AD70005F43D4A1FB5E67463697AF33DB01E1C486 +:10AD8000EFCD96CBF9E3571A8F458E28741E88C0F5 +:10AD9000E5991D55D77D82FB40DB537CF8DDFDE74F +:10ADA0003B6EFBFE2700F7996D37F9D04FC8680955 +:10ADB00010FFF464DA7C5B799E7622E6B19676EC3D +:10ADC00077E0F73DA79FBDB61CF576A380F3B317D8 +:10ADD000D4C5889765CF3C7F233EAF0B2BE9E8BFF6 +:10ADE0009ED9FEF3BF67C338B5DB9AF0A431D6F223 +:10ADF000EC6B141798C25BF8FDED29E4E79E7E72B8 +:10AE0000CD8D88EF968E167AFED9935BA8FDFA3326 +:10AE1000CFBFFA5FD0AF3EE0A0EF9E3F7B611FD176 +:10AE2000A53EA8517D7A7F7CBD7EE73EAE2FD1CE78 +:10AE3000A31CCCE47A4CF2B5E4DFD3CFDC7B9DDEFF +:10AE40006EC8FB6D229FD396C8EDC8E7426EEBC675 +:10AE5000DADBF0FAF973363A9FB3D1D25D8C717EAA +:10AE60007D29E78B07053EEA3B16981BEDF43E8DE6 +:10AE7000F39F20EF781D02FC897560D06BDB25AA5B +:10AE800067FA15F5877EA330DF33A3FA38FFBEB328 +:10AE9000B4D95C47703ECB9FC3AAF5CF2B16C58FA4 +:10AEA0002FD767DB0DE7AA65774ECDF5921E48F0E8 +:10AEB0000DD2F9BFD9B5C19664B87FCBA2A00FBFA0 +:10AEC0008F7FE9D4BB13F03B86674A9461447F557A +:10AED000E1762E64A7791A701F09E28FED424E20A9 +:10AEE0007CCDB81ED6335E6319F889EF78C68E988C +:10AEF000492F3C45E3839F43FE9BF7B5194FA1DFE4 +:10AF0000B3DE1CF48CC071DA847DDCC6E187F79D6A +:10AF1000F6721ACF793DF7D717E27BE7974EC94013 +:10AF2000FF1EC6ED32EBE231E0C87CB48F38DE7034 +:10AF3000C4D3C4D04CB2535E0BAD4F9EFB09EB1F84 +:10AF40007AF790A87CC6E69B503F617EF85076E584 +:10AF5000BEECCCE8D5D54FBEC69C03CFD19EE5F85C +:10AF6000E9FA4DCF117D7DC6396EE75F3E4E7CDB41 +:10AF7000887C8BF3074F18ECBCAC7759BFE738F1EE +:10AF80006DCD6EAE8F1B77575A30DEFA7C899F7D70 +:10AF90000C8E6EA3E0BFF54AF75CFA4E6C8F8DBE47 +:10AFA000FF3B27F9B3FDF8A7A87F0A777B289F709E +:10AFB0006E0FE7D3832613E5010E6EBD664B8BD271 +:10AFC000D7AE82BF4D72D2D8CC84BFBDE85DF4CF7E +:10AFD0001A6A793D7A630C1F156CFEA815F92515C0 +:10AFE000BC63ACB3017F66027D3F59CF46A09C662F +:10AFF0008FF3EFC9A17D421E9F67D7823E81F62D58 +:10B0000019F37D78E455EA38F08B91FF326EF061E8 +:10B01000DE6C7D5E472BFACFA1F18CCE575D6F6E53 +:10B020001F8B71F0FAF15E276012F0B68DFC6B5643 +:10B030006211F6AC86FCF246F7777C94D78E95FFCA +:10B040003D4BC9BF6BF426FAF0BCDBC9BB9585DC70 +:10B050009FB13384BF11F08BEDC9E1D16184E7ACBE +:10B06000C09FC4E33973179DBB7BEED709748EE193 +:10B07000E4719C5F53C77590FE7863CFCD64AF25B4 +:10B080005F26BF9840763B4D732A98E760ECB60484 +:10B090008467B680A75DD4EBA60A3B52B49AFB71D5 +:10B0A00029395C9E52724CE26A117C2ECF6509519F +:10B0B000DEE1ACA03FB189EE5CA7869A08C953FDDA +:10B0C0000E3E5E4682BFEC011DFF4AFF4AEECBE218 +:10B0D0003EEDD438FC3D42C051B07921D17D76ADF2 +:10B0E00038F76135F72B18F005E20DE8487C704B16 +:10B0F000C63CA2DBECD5CA5D44C75005E53FA57F41 +:10B10000163BFE75627DDB6D81E158EFD79399ECBC +:10B11000C33A82EDA97E13ED2394A5521E24339DDC +:10B12000FB8B99C25F8CCA7D60B809E639E54AE6B7 +:10B13000F40EFF5EC3FCF6F81CAFF4FF0C7E5EDF7E +:10B14000389F8F37A53D3414E31EB9CF2CF1115E23 +:10B150009A3853AF4F6F12F8080F6633516F403C67 +:10B1600061A73CBC13E6C17CC2D6D14FF27C023F42 +:10B17000FFB92487FB3DE3D303C3D14FCB2C0A2C6B +:10B18000E2F693AF33161F87B2651C704F19C6B134 +:10B190008DB7DB7D28776B5F5666115F87AC7828AB +:10B1A00010F03D97437098A8BE8D0535A247637394 +:10B1B000201C9FEFA7929C3582DF8771C064E4F367 +:10B1C0000CE2FB30E77B6EFF64BE01F5A4DEDF9688 +:10B1D000FA40EA19B46FC8CF522E1A6FEC2E46FA15 +:10B1E0007E53BD72CECCE5FC1CE001E548CA4DF2B1 +:10B1F0004B5C5E562EF556E2F39520F77A7AC7C679 +:10B20000670827C62B52BF2FC90E3C90837907537E +:10B21000A495BE4115FAB8F1A515C5F1BE2392FA61 +:10B22000D82ACECDB48693C2FAFD12ACC1482EA75F +:10B230006B08ED51D2E2F8F998D61C695FFBD4AFE8 +:10B24000B5223CB1F56B2EB45D283F5B93E87B36AD +:10B25000999F8A1D77B1E037491719A7E0BE07F615 +:10B26000DF9AC3F9659DE8F76C8E22E4226CE07FDB +:10B27000AF29781CEB0FFAB363F2BD7F56BE4CCEFC +:10B2800023ED692CFDE5BE0DAE676A69FFFDDAF7B7 +:10B29000893830861F77093969CE61B4EE7673E458 +:10B2A0000B92AB05C98CEA7E36327F3AEE07BE7A46 +:10B2B0001597077F4F318E3F342FE8C81D11CD0BF6 +:10B2C000E37D8C4FEA34164A009AD46D3787F5DF58 +:10B2D000D33C95CBC73F9F6C0DA9C0E7FEBCE0BE39 +:10B2E0009C11743E087D3717FA818DF6B1C0911E0E +:10B2F00081FAA589753B10CF8D6A5731E631AB5D78 +:10B30000C14348FF8F4C5DF9BCFE83EFB31D137939 +:10B31000DF6322EFDB6989E4FD5B46F41CBB0B8C29 +:10B32000D75F5DE832A5611CF8C1EE3F3CF732BC47 +:10B330007DF7CB67EFFE21626B65D23D3F836BB536 +:10B34000550D68BAFCDCB1E4F87AF6CF82BEBDF5E3 +:10B35000514B13E2E6FD9FCFE5FD9A62F6B59FCF14 +:10B36000E5FA34FA7D14DFD7FEA09FF3AFAA72B9D5 +:10B370005EEF14755BB1CF278A79B69B59F146848D +:10B38000674B32D503308D9F5B56FB68810FF7F119 +:10B390003B0BF939F93DEB14B203C7CC5CFFC0DFBE +:10B3A000EDD68AA81D453705FDC45A67286202FDFF +:10B3B00051BB283982E765C27D6D0CCA5AC849F570 +:10B3C000C3B3847D9CDDFCC65798F7A8D598750C4F +:10B3D000BC77D25EE340F330F7BB0FE051342CABC7 +:10B3E000BA5DD4998A73D8FC53D44B4997F3EB8C4C +:10B3F000DF97BC901B30E7C2FAAB5338BEAB1FE0FF +:10B40000E7F1CAFEBB85DD8BE5B7EDC8AB00EF8782 +:10B410000AB72FB1F364E78DED40FEAB76079CC809 +:10B42000C7D50F9C35E8B5734AF7D33F43BE5C9050 +:10B430002CCE4763F9FA3AA521B95C6EEA70DF0CAD +:10B4400054E3F9B2AEE2C505C8FF3DF97FC4BCDBE9 +:10B45000DE04AA73AEC3FD33DD7E777FFB67FDEFAD +:10B460009B792DC8E78D1715E293597BDF388A7ACF +:10B47000BD51EB26FE9965B5137D1A2F6AF49CB574 +:10B4800099CFE8BF975BE4F65F83EB0BFD684C2A2E +:10B49000EDBF65C17DC273099DB7B150D49767E711 +:10B4A00005CB11CF1B921CF7627C78C1CACF576ABB +:10B4B000B2F03A7226BE43967CC272938D7CB0F78E +:10B4C000CDAF10AE1A6B90CEA99C3313E26915E98B +:10B4D0001619E12CD5D37FCCB73A27D7857A03E06C +:10B4E000FFC0C2EB88FAF23FA7C3F342BF7C90CD06 +:10B4F000E5E8837C56BB0BAF57C315DEFBA050B409 +:10B50000CB793B769C7A21471F0CE5F62BB430298A +:10B51000EEF920F708797C21D77F07E255DE7F52CC +:10B52000C0919DE7BF13F108FAF16EE2AB14164922 +:10B5300085F1AA5FE3BF57C096F7501D6BEFBA8A3B +:10B5400005BCAEF8702D8D8E5B83E3413F3FF9F172 +:10B55000AFDAE83B383605F435EAE785790CF533A0 +:10B56000CC5B8FF3C3B89154EA9740EB606DA0B702 +:10B57000817FCF8FF0125D5656029F0E17E7EF7B4B +:10B58000A37C25F929968FBE9FABF4B7BFFF7D84BE +:10B590002B767F9FB181446FE2B76FF13DD9E8749C +:10B5A0008E1790FB965CB2BF91217AB9937896FA88 +:10B5B000F28344235F240A3AAE12FD7AF12CCEB313 +:10B5C000CA28E27650C60B3F13EB72C45CA55D8BB4 +:10B5D000DD1F7008FA3B7279FD14D06503C229EDB6 +:10B5E000611F7A6FE2F4867E9B488F25F4DC930E10 +:10B5F000F6EC0EF093F03C4B78CF85EFF5C95B8C01 +:10B60000E376B8696132433FE1E95C51F73DBC87BD +:10B61000EFDF95F4903E9AC540EF2857A61FE60845 +:10B620003CA00F9FC7FA118043C17AA43452035E35 +:10B630001C0FF0BD3337338AEFD8F98EE123F00BBE +:10B640005FCE15DFD995B132A4D73DEFFC35F96E49 +:10B650002F9E77CEBFEFFDC41E7C0DC739F3FD379B +:10B66000290E38668914B7DBE33CB744366F50A225 +:10B67000CFEFFD851AC2DFB7E8EC3AB36E06F0E50E +:10B68000AC2ED58753CE7AF08BB747A27FDD65A667 +:10B690007D28F02F56E3799FC7445D216B36E6097C +:10B6A000FE24E82EBF3396FA49FA09F3998FEBA5E9 +:10B6B000447EBEFA470BE6D177C6352C7008CF57CB +:10B6C0003FBD7012F9CFF35890CEF79EDD663C5F18 +:10B6D00037F65CDED8F37831A18FF88A3D97F7F31F +:10B6E000EFC5AF9BE9CDBB57C5F737B43CCECF9F75 +:10B6F000F753AFFE37C1AFB2BEA049D617BC72F93F +:10B70000FA82A698FA82A83F22EB0BBEE6F505AFB7 +:10B7100018EB0B3E1F1B1F8EAF7BFD9DA47EC675D5 +:10B72000D0FDCF0B2FBFCE263C6727EE77E476BA4D +:10B73000DF5F7D43A6C4533FF51DA9791C4F4D170C +:10B740003D067B9C99E78DF1C772E979534C9D4486 +:10B75000F439AF8F90F903A02BD5E3493F30F6FBC6 +:10B760007A99DF97F2F3B1C2AC1ECAB7AD11FAD421 +:10B770003714FDE68FD11F43F9BDD9FB6A37803AF4 +:10B78000FB87D7156B8551F98A5D0FF0E567FAEFF6 +:10B79000D807E789F3207CCC47DF390AB9B8E7FB43 +:10B7A000E353707FF6CF0F5619BE5FEBFDBEDD226F +:10B7B000FD40BBC19EB3187B3F7BF79BE4E7D558A8 +:10B7C00003F41DDD27AF7C9FECFC5C1670A19C9CF4 +:10B7D0007FE5AAFCE0FF859D97F0DC16BACFCCFD93 +:10B7E000FB0CF24FA609786EDBCBFD4C93D56FA610 +:10B7F00079FCCCEB745108CFE105658BE7E8DDD02F +:10B800000B7F299DBF3146C0AFE0FB80DF1BC49595 +:10B81000CD0ABA116E792E00709D1BAF2DD7F9BCE1 +:10B8200078BD4909684CF7BDE804D69C8BFD4DD620 +:10B830006E559C5746E7CC2744F145ED64D15E7EBA +:10B84000FB857BE6E07D3B3FAFD822E0B83F4F7CF5 +:10B85000076D65565C77823D729AF60FC535349652 +:10B86000FBEDA1425E979C88E721C0BC76FBD91016 +:10B870002ED6C99CF49DBFCD792182F18BEE77261F +:10B880001AF346E87E678245785EABBFE731BF4377 +:10B890009126E06B117AD283E71516D1B90CA42753 +:10B8A0007F9A3C97CE27CFB42FA27DEDC71C13699A +:10B8B000DFD38588C77AFB89BA7315E07966C078CB +:10B8C0009E42D64C63DB1334B6ADEC18D587299174 +:10B8D00080FB527AF4DC48B3D037B72772B86E4F8A +:10B8E000E471DE237926833F1290BF0F93C6CF5DAC +:10B8F00038E7B25AB14E03FC9347F2B87FF22150B9 +:10B900001AE249FEFB316537F907AD1B8EBF8BA2EA +:10B91000FA96019D5A93BD4B35F4FBEE14BF23A656 +:10B920007550FDC3967B527D58AFD36A735662BE85 +:10B930003494C7F3444DE2BB0FA048DD0E786FCBC3 +:10B94000B41CEA9751D54379D69E158CFCAA3E7C4F +:10B95000FA35F03FE0FB496CE3791035BE2EFC0E62 +:10B96000D8E357A96E593EDF86CF014E45F005DE7C +:10B97000BFA922FA3B4F457BCBF6E379962CA8F87A +:10B9800078DAD24BFC3E5DF8F34D7B2B6F1D0170D6 +:10B9900015750D23361EB857ECD3642488FD667EDA +:10B9A0009E6F6CFF81D81FDA4987BDDFA9C7472684 +:10B9B00088CFF1BDB149B4EE23224FC5847E18195A +:10B9C000237FA3A3F240CFCB44BB49D417E2191481 +:10B9D000FE0A9E06A17E195C3E7C4CFE71B9BD9E9E +:10B9E00045FF709CAAE8B8A4A7C6451F47E5109676 +:10B9F000586EF5B5D443BF8353F9BEFC482DB20F42 +:10BA0000E57DB4B896892B9BD54EF85DB934F2BA72 +:10BA1000B90053320115DB15CE152D38CE0D4A84F1 +:10BA2000AEF933D7B4209B5D9D5F24F241C1F1286C +:10BA30009FADE3F9F7D22DA37C3E273C9A3193E7E3 +:10BA400071A7CFB4521DF6748D9FEFC4B460C11DB1 +:10BA500020677754F3FC31B6AB75F919B95F7204FE +:10BA6000E29B9D71FC83ABF3B95D93EF3789BA21FB +:10BA7000F9BC389FE7CBECF9134EE771F8685FF833 +:10BA80007C9EF0D34A5849CCEFD1FC350FFDAFCAAC +:10BA9000DFF6A7278CCF859E98EE7FD44CFEBDD0D5 +:10BAA00017522F07443D54973897E5BDB11CEFEF6F +:10BAB00056CE277D713B6B267D7E070B9911BFBD4E +:10BAC000FA7FA2CE3F8279A6078CFED28C99B17EF6 +:10BAD00015E75739EF9D41E3F369D2EF9D68F47B99 +:10BAE000ABFFEDEB54B28B594F375C1A10AD7B6A4C +:10BAF0008AA97B6A14754F4DBB171CCCD4D53D3534 +:10BB0000EDE5754F8DBBAF54F7D443FB4F47CCE108 +:10BB10007DB82F73643E8804C0B95FD4C91CC03A95 +:10BB200099F2285F264FE3F959605FDA67C97526F5 +:10BB3000F9909FDA4CE594CF6D7324FBF4F9D3951B +:10BB40004B81EF74795C59E774A49FB8B83C9FFBB4 +:10BB5000C1EB159E4F0FDD69A53830B32860D8BF03 +:10BB6000C854D951CC4B9E167ED07A912FC1FDBFBF +:10BB700061700D2BDCBFE97D1FBF9FC23C668C3E10 +:10BB8000CA4CF7D1FE4166CA10DA0798B9B76C1BE8 +:10BB9000E91BBBCD87DF07C8F16706B768587FD4BC +:10BBA000B4778B56638FF2DDF87CC1AF492C09F96D +:10BBB000B5372FB82B81F2829FD80393F2E1FD7A3B +:10BBC0004B642833F233DDEFCFAECD13FC621E1B86 +:10BBD000B8730EC073FE6D0BCF8F3DC8485E5FD843 +:10BBE000934A794D6D1A23FBB2BC92F1DF8BD9A237 +:10BBF000903F7732959F43B47C2A233B782E6D0289 +:10BC0000D16F3E0B1FC273866A37990DE709DDBFFE +:10BC1000CDD8AE671D646FEA77F4E167D25B523F1F +:10BC20003630AF8A7AA8B1D3F83E1B68D48F65C28C +:10BC30001E0C9B3EAE05EB3C8699B8DE620FFA7295 +:10BC4000A651DC5DCDED287B9ACEAF3A9F7C4AE5CC +:10BC500072CEF5F188A8D634D8A511C2BFBA51E387 +:10BC6000BFB320FDA511E277170E98F6AAF41B3F8B +:10BC7000029EE1E23DE9A7497D2DE952390A7F3371 +:10BC800002E2F07CE1EF14B242A42B8C4FF2A060F0 +:10BC9000A0C48F4CA6DF6F182DE603BAF3F3EB4C6C +:10BCA000D630F251ABD24C7ADACA84BE5682A4970F +:10BCB000FF3D1452910FAE63CDB7E1EF818EB176A7 +:10BCC00025915F6A0FFE44CF272D2C92BF5331F090 +:10BCD0000B3D3F93FADBB8FC22ED4AE43DEE6F4C9E +:10BCE00066E007C2BCFEF7B91F7440E1F122F88399 +:10BCF00007305EFCAD6912F1C3245806F61BEF3421 +:10BD0000D2F966B7B13DC9DB870F54FDEF5980C446 +:10BD10006908CFE412633FBFD46FCCA8DF0AD8D73D +:10BD2000BCAE7EC5A1EF62DE2069312B413F063CEF +:10BD3000475FBCDF2BDD85F68298A0CFFECAAEFC44 +:10BD4000117DF757CE8B3CF1F5AC7BEE0EA52FDFC6 +:10BD50009C3BB85875EBF84BF2F34BA21E43794D60 +:10BD6000ECE30EE7F9C2A89DE77C53215AD723DF05 +:10BD700041FF3F483D207E77E486DDB608FEAE4EAB +:10BD80009918E77AE49FF2A85D8F98EC5E4B21F258 +:10BD900089AF4D55FBFAF3AE342FF1CB30939FF8BA +:10BDA0006504F3A5239D46593B5A34847FCFC89C34 +:10BDB000A0DDC01F7FCC47FBA7007F503EAB8F7D2F +:10BDC000343E8FE11F49C7C3C28FBE9979298E982F +:10BDD00028FCE84801E79F2AFBED1ABEFF4621CF69 +:10BDE000378CC38D47FA6ED56817ABAC463E88E5F5 +:10BDF0002F98D1A49F3796DFFAE39B01C837D22E44 +:10BE0000A65F996FBEEA9F6FBEBA1CDFC4F28BD4E7 +:10BE10002B3B6DCE2A3BE6B76A15D2C7C3DE1ED8D0 +:10BE200082EDAB1A0AA85E6667AA6F3F3D6FE6CF48 +:10BE30008777F955ACA7295A249E1704AAB0DDB418 +:10BE400098EF678C38C2EB6D063EC89F972D6BDE6E +:10BE50008FDF093685F8FB2F9D6EA5EFA5C2ADE2F9 +:10BE6000FDCAF62A6C37B5F1F74FE2BED4B55827B4 +:10BE7000176EC1FB835717F87858CAFDDA9B049FE9 +:10BE8000EE5476EDA7F7DAF97BF30E5913E977084C +:10BE900085DF7AA358E74D9BF83A333EBE857E97FF +:10BEA000744E4F88FCA74F4DF5F4BB37FDC59F95E9 +:10BEB0004A7B2E5E6F467D8287795981AF0BF9BE32 +:10BEC000E5569862C400EE0FCAFD3EAC3FD0D71BCA +:10BED0008C18C0EDBEECE74AE3DFB5B1C793295F2C +:10BEE0002CF723231B98827A19D728FC80B8FB9360 +:10BEF000371735D3BEE4CD03E4BE64B786E7B29707 +:10BF00005DFAEB847879963162DE53A29E42DEAF11 +:10BF10000D17D0EF8CED4426A1EFF29FFA3DB5C589 +:10BF200039E34C7C07B7B380B76F19B0E5276D10C4 +:10BF3000BCCF33356B782E1BCB57E83BC07FED620F +:10BF40009114475FF86FD658C4C2BFE323F8E7B631 +:10BF500058B6F2EF31B95E9A2ED5CE984124A7B7E4 +:10BF60000B3ACD1820ECD330360CF5CD7441B73BED +:10BF7000ACE0B7925E6B37C7C8FF7706A0FC3FD630 +:10BF8000AFFF6C7C1EA31F6AC5BC7385DF3C1F7F9F +:10BF9000CF54C5F3E2B9FF7CEA31EE37DFCF3A2860 +:10BFA0001F79FE71EE2F36C0F2905FFAFCDED77675 +:10BFB00063BBA123F6776643347E9FDF712DE5795D +:10BFC000DDF38F3554607EAF76E3DB943FAE95FAB8 +:10BFD000226CD417E060707DB1E16ACAEB98ACFCCA +:10BFE00077368781BEC0BA9461586F0AE30F15E7B0 +:10BFF00000ACC057C4F7FF03486F4CA47A541A4FE3 +:10C00000A57DE0B7FDDE287DA4DD88D51765325F0C +:10C0100033308DF259527F94093F854D8C8D1FD757 +:10C02000921C0E13AD8D92BE220E927E07BC4F7EE7 +:10C030004797C91E3699F47E4698E4B2DC0AF68228 +:10C0400044C96765E23C81183A6FC2755D268E323D +:10C050003E8FE10319C754083EB893F9293E7A513F +:10C06000F0C1BBEFF1DF839B6E5F447CF8DEFBDC4D +:10C07000EF9471D4B78F9F22FF50FCD44B771BF8FD +:10C080009349F8BB169306ADC3FDF44E1BFFFD6B41 +:10C0900085D3D975E7917C7D7EF15DFC1D17DDEFC1 +:10C0A00043B44C4AB0E23E628B99C717D3267F5007 +:10C0B000314BA73F86A45746105FAD4AD7F7FE84A1 +:10C0C000F1C69BE23CD6BD9944F70B5DFCFE854D65 +:10C0D000D7F84270FB73B338DF4A699E8B25541240 +:10C0E0008EB9E2775FE6A9E157BB713F5609BF58A9 +:10C0F000AFD0EFB4FC0EE5B2CE14B1F0BC5E17E5E4 +:10C10000E9E5F8FDE72943145F5B5EE7F6B14749CF +:10C11000F4F13C6FC8F0FB3FBFF3F27C943F2FF08B +:10C120003ECE23ED5F6C7DC2B10537D377AE7F6322 +:10C13000FE14DC175534FE7BCFB1F3623DC2725D55 +:10C140009EFA982DFEFEC129A16F4B105730EF4388 +:10C1500039FED338FF2911179E12FB63A71C7CBF41 +:10C16000EC6F03781EBCC4CBDF4B14D753623FED9A +:10C17000549A319E94FDECE27A628935B05C47575F +:10C18000EF868466CC4B641689FA93458CC74F7B47 +:10C19000520DE72E64792B4BBCB8CF5124CE2DD84D +:10C1A000C3ED32EE63E33EF313D941133EFF3FFD8F +:10C1B0002524DF00800000001F8B08000000000025 +:10C1C000000BD57D09785445D668DDBEBD857487E2 +:10C1D000CE06618B9D7D0F9D0DC3269D8428B86082 +:10C1E0002780A06C0D0804C8C6E27CCCE8BC3406ED +:10C1F00011F95CE2382AFE2E7F83E0EF366384A0DB +:10C200005103D32A8330EAD820286A465B46013599 +:10C21000242D2E836F783FAFCEA9AA74DFDBDD6CAF +:10C22000BFFABD47FCACD4ADBA75EB9C3A7BD5A93F +:10C23000345A897D7B3E21C4EAD34F2D20A44F225E +:10C2400033DB4DB4D4D1923EEF8B6265B65522A458 +:10C250008C90C1D69A6C6B227DBEC2A7277250BD4E +:10C2600086D6D3A0EEC8B6D27E7DD3453BAFDFC322 +:10C27000EAF49F860C226401FC66A5A5D1E4910B2B +:10C28000E9EF1B743DBE6C6C276753099164E22291 +:10C2900071B4924DAC0E333C1D673996478B28DA4A +:10C2A0004EC769D29B364823B1BBC348C79BC3C79F +:10C2B00023C3CD5A187F361B8ACCE9DAFF93144387 +:10C2C000C85C23593F8CB6CFEB1AACA7332075312D +:10C2D000AE4C0BC04D265A8ED1EF4AAE68F96C3485 +:10C2E0001D1BFE4D082D09D19263627E08878B10BD +:10C2F000807B8417E1DA58E14FFE8F5242FCBB0C81 +:10C30000962DF43B0D5D6F1D91285C0D02BE0E2530 +:10C310007C651C9F8418DD5F1809B99E4864201D48 +:10C32000A7D3E42C037C36187D384F3AA2DE41D7E0 +:10C33000C575E7B858847F307D9FCEE7A5163BF9D9 +:10C34000A72E80CF9516067FB55C5FA54F20E4D45D +:10C35000CDC462A08F56EE5FD86AA4F59577110B15 +:10C36000FBBA5D4346D1F139BE22CD2FD1A1215672 +:10C3700023AFC367670E20D6EC407D88334E51A7AC +:10C38000E31298C7723EEEB0BAA18AF74734A72AE3 +:10C39000FA5FB62657D19EE22A56D4D3368C51F492 +:10C3A000CF68AB54D4B3365DADE85F44D206120A11 +:10C3B00067D33E99B8296A73DCB58AF6BCA76F5279 +:10C3C000BC7F9C343F348EF6EB888A2924948E5AA5 +:10C3D000A362B640495C766F3EC5CFCD1C8E82F617 +:10C3E000058A71BE89B9721FACEBCDDEC5D7124A82 +:10C3F00057233B9729C65D2ED7B3756BD31DF5D157 +:10C40000F79AE90FE0B398F8F70EA3F4D1E8966C29 +:10C410001EDABC64136B17EF2DEDDC8CEF2D752B42 +:10C420009F2F7F5A59775592EC66CA9FBFB59A13D2 +:10C43000901E8692A16783F82A4007B413FDDEA9F7 +:10C44000C764B72105F093F5F038C48F8EB8ADA15D +:10C45000EB758A109B07FA3F6FB6B9687DC9FE85F8 +:10C46000381F4392920EA2AC4A3A88CE56D281D956 +:10C47000A65CF781E5CA7557E337D69E7B4EFCC6AE +:10C480004F52D285C06B39FDF939F1FA24E0333AC5 +:10C4900080CF923DF65613E2894C338E02FCB1F9FF +:10C4A0001A884306394712A89CA1CF6D6C0872D236 +:10C4B00062726928FDECB04ADA63C6C038455ACFCB +:10C4C000EB00CF7AC945E0BD28E24E0279D15AEEA1 +:10C4D00049F6D075293636C3CA912F4D8E97414EF5 +:10C4E000D6EB3D85D02EC6FBD2E4C4E73DD23B8BD4 +:10C4F000098597683D85280F8D04BF2FF0386A00A5 +:10C50000A3E3E5C48172F8254ECF5F7C5487785C45 +:10C510004C9AF7DAE9F7BEF998E177297161BF45DE +:10C520006D4A3C84E04F85374A3656F86E13877B58 +:10C5300019216E4D5A283EA52EC9632E0434740964 +:10C54000B9ED3C5BC2C80EF03986F4FF43F92DF01B +:10C550004B3B48C1F209BE671914F89EC0A7905B17 +:10C56000E23B06D22C27011FA8E418C956AE1301DE +:10C5700021310AFFC37FAF52196A8CE31F1B04E30A +:10C58000C0E409B99C7F872C7026019E8CA40DD72E +:10C590006FA364DB20D3EFC897A5B4128ACF128BA8 +:10C5A0005D86F52A23DE59F0BCDCD8DEAAA5435D02 +:10C5B00046CE58909E063FD570363E008724E072E6 +:10C5C00049444BEBE3797DAA4BF23D9A02F0BCF56E +:10C5D000137C773C2FA74249D78F82F9CF4FE8CB06 +:10C5E000E324EB08F85EEDAB59894037EBA566A272 +:10C5F0009ADF91D7E838B2C61F0FFDAA8953CBF452 +:10C60000AE1BF5CD5B920FE77D03B1DF01A5D06FC7 +:10C610008DA4FDCA59B4DED841F5560C94511E992B +:10C6200096A453854FA23D0A750D8504E87B39D445 +:10C63000C5BAA704DAB12E87D6D7521886C49D5F33 +:10C64000BF3F9C62E1FAD19FC9DA997CABE3F8AABB +:10C65000137ACBAD9C5F37FC328490BFEA294E8AB7 +:10C66000818F8C2ECD40425253385F169242189FD4 +:10C67000F255660A1D7F501CE5432998EF587FD17B +:10C680001EC2772AF849335DDCD114DFE652BD9330 +:10C690008ADC85C1F05E003E841DB10CFA02BC2923 +:10C6A00056AC370CE8FEC00ECDA5DE64D0FF629D0F +:10C6B0009AF4C409F618694FC4EF8AE757A7683897 +:10C6C000BE283D5E009E22AF433ADA43621D2ED45F +:10C6D0001E1A1BCFE62FF0E708C5F734053E09C543 +:10C6E000678102DFD3C2E29BE3E36499F72958270D +:10C6F000D97C6810E0797692E346E83FE288EF98CB +:10C70000A409CCAB5AEE79EA51D0639DB20D78B949 +:10C71000713C93738DAFC8C8FABD5D06B744C7A915 +:10C72000EB7C13EDB39E162A487591F1D40FAF0A36 +:10C73000DFA1F860EB28E059A1827FEE81EFCC7396 +:10C74000AC08E72DE7C1C32DE1F0F0CD6FC83C4741 +:10C750003EC0973FD0971FF86E315FF7DFC7386E46 +:10C760004DA1DF2F7D7F780CE0A75AEEDA3B14F065 +:10C77000B05AB219E8772718882B8AAEF39035554E +:10C78000E49F74ADCA7DCD360BC547D270934DA6DC +:10C79000F8C8BA4576B8E9B8FF58BD2A6E212DBF52 +:10C7A0006EA19FCEA0CF258D03E98D6CFFF4777429 +:10C7B000BC2CF36CDB465A9B63A0F3A1DF49F94D17 +:10C7C000B4278DCA89BFE88911F84D97DA7C703299 +:10C7D0001DD71F2BDBC00E4E90C944A02F81E784CC +:10C7E000680687785EF1F856C9670A3C9FD0EA2F41 +:10C7F0005949CB19B0EE6501382754F94BC0EE11F9 +:10C80000784E4863FD89D69F5C1BC41F65800FDA94 +:10C81000DE0D761DC56763A27E3DE8C15E23AB13C6 +:10C820007B36DABFAB8D8C3FBAA392DDA01FBB294C +:10C83000AC5E1CCF6326A620B918651F7839859B8E +:10C840001C90C9365A7C6FB10F8C457C58D838DCA7 +:10C85000DEEA256412E069F5E4CAC171B44C6C6586 +:10C86000F851D3C9AB29CCEEAF3F4D19AF24F0BC82 +:10C870005EEBD15B4CF05CAF787E94E2CD6508D482 +:10C88000179C48BF92A09CB1AD87FE0B374413574D +:10C89000907DD5C1E711092F8DB15AA2A5F86894F2 +:10C8A00088E35CFD5EFB6F19F1AB9EFFE7BC3DB119 +:10C8B0002A3C7C47003EDA5E75E7B50F83FDD9E878 +:10C8C000D511037DB4FA958AC124CC78FD783E3D1C +:10C8D00096B8E383EA5A1FE2A3F1F415F8BCEACE56 +:10C8E0001E3DD03D8C63A5CF5747D907DBCE81E7EE +:10C8F000323E8FC6D3B1C4151FFC9CC993C0F80942 +:10C90000D8FE2C2090D2ADAB53766FA3AF3EBB4F79 +:10C9100033694B98F9EA5319FCB9895AE4973C0FEB +:10C92000B16F0EF37DD16F501C95D72686E79A82A2 +:10C93000D0F97554FAE6C2FC2F9F48ECE1BE779A15 +:10C94000D38B9877479C6F31A7FBCC1A7350DDA22D +:10C950005CC7442E173AAEF625C3F8BD93991F1F46 +:10C960008A2736CF51DA6609F05191E42C02395208 +:10C970003F8356289D0C9EEDD138F3037C1769DD6B +:10C9800003F8A6FE57C9B9F0ADC77631DE570739AF +:10C990005F12BB49A2FC349FEBADF95B975F4B651F +:10C9A00067BF1FF3D526EAC7D04F7C459ADF3443D3 +:10C9B000BD4D423F658193903554EE2CDE56B21E3C +:10C9C000D4C5FC2442AE8863CF6F83729D2EA06FC6 +:10C9D000F1FF7612AC1FC5F76FBE5B69BFD691BB86 +:10C9E000BF05FBE7AB834C3E508D867EF8E23F2AC5 +:10C9F000C7ABDB7ACD7198679DCA0ECA02438FDA46 +:10CA00002185A9DC4F1B4546811E58B9ED3B7D8C25 +:10CA100035321F7C4DF93D3D03E4A505CB8A547B9F +:10CA2000592AC4190EB0793A529DA353219E72809F +:10CA3000CDEB54FD29A6271E4B40FD6400614E7FBF +:10CA400035CC32BA5BE93CEEA4E2248AE2C76060EE +:10CA5000F690B0036579951C43DB477FB93A0ED653 +:10CA600037E1B9AB26C17889CF45DB019E8D15F63C +:10CA700022881B6CAC31D95AE99046FA3EE80FF790 +:10CA8000B3A3DF180A5642FBFD95C380ECBA5EF7EC +:10CA9000405C6583E6DBBDC368FF0D57105B2B0967 +:10CAA0007CA7A9ABE645984FF234A66736A6D88B8B +:10CAB0002C41E3126ED73572DCF5EDCABA6F2C5DEE +:10CAC000DF47F7A1594DE14B1D08722397B075263A +:10CAD00067289E289DC0B783EDD71EAAAF4856A0F1 +:10CAE0009EDB2E7974149E868E1735A00FEB6FF7A0 +:10CAF0000C9A057AE919AD6D4BD0FC12FE32A4D226 +:10CB00001A13D047B3240BDA0BC23EBF91887FF9CA +:10CB100048373339DDDCC8EDF259D10CBF0B882D15 +:10CB200019DEBBC948623494A56655B597A1BE5AB3 +:10CB3000AE8B053B096009B7DEA28C145F6A7CCA24 +:10CB4000EC92E8BAF74AFE4C18E46B88F9B03893D7 +:10CB50007B4B4AE838EB5399BC68CCE476623AB137 +:10CB60009B29DC8DBBB3366FA44D8601741D8B51A0 +:10CB70002E19CB8BD14E3682FFB3F4B5288F141308 +:10CB8000C00BB1D88B34102FA81D5EBC116CD32301 +:10CB900054BE5006EBD5F992918FA9DC91A8EEFB1B +:10CBA000CF2D936BB494EE1A87523B8CD6DF4D9DFC +:10CBB000C1EAA9BEC51A5AFF614B33ABE7FA8E41F1 +:10CBC000FDEC965B6BB4942F1A8B7D8B655A1FFA24 +:10CBD000E45DAC1D1C424A58594FB6D5B8E8F85F21 +:10CBE000C772FD6EF3CD05FA697C354BB33108DEB3 +:10CBF000F83426B7BE8E62FDBE4E21F36A01DFD93E +:10CC0000BE4C98A7E8F7AF546117B76129E014EF5D +:10CC100091A4F0E3FF99BFB7B48ADB25D16403E0A8 +:10CC20008D2E932B86E27F4F57D616E8FF406A1C65 +:10CC3000C7171DA734308EC0A3184F7C7719E85D45 +:10CC400090C73A166715EDAFA532F949BFB30EBFCD +:10CC500093CFF0DF583BBC08D68DAE9796AF979632 +:10CC6000F9AB9BB13F8C1B5B88F2BF444BFBEF39A8 +:10CC700043FBA704E6ADA68F7D9C3E96B652418845 +:10CC8000765A1AD2D18468661F9252251C43399E67 +:10CC9000E3D362199CFDEB3158C2EFB4723C0EA78E +:10CCA000782FB878B83FE6F3F9B9E10E5A2FBB0CEC +:10CCB000ED9D395B82E121E47EC5385FAF55BD57FC +:10CCC0004E1910E6119786EFDD19458CF89C6CE93A +:10CCD0007F2FA590D9A560AF3670BB9AB8AEC0E0E3 +:10CCE000423D971A0D1BBC7A2BB4B74B7637D067F1 +:10CCF0003A850FF05B7B6D2987CFC2E1B330F8DC5A +:10CD00000A3A2587FCC9D3CCA1F4DB8FF7FEF1F2F8 +:10CD10008BF9780ABE0E371EF047A4F530A5FDCC7E +:10CD2000EB21E6A9C2673F9E55F313F8047EC6F7D0 +:10CD3000F295F4D84FCFA9621D557C9D7289DFAB67 +:10CD400060EF35FC96AE23D82756253D3774A4688E +:10CD500016E407DEEB84B52C0BC4E946A6717F6FA1 +:10CD600038190EF2DB55C9E2A9AEED065BAB15E34F +:10CD70007B2569E1E37BF85CEDEFF5C5EA89847614 +:10CD80009132DED09768F3DAC14E3D496CDBE8B8EA +:10CD900063557607ECDB6C3705DE0BE81365DDC504 +:10CDA000F920347EE44F86F9951A2A77586D845C11 +:10CDB000F7E453289F4B0756AE4AA1F5DA279F6642 +:10CDC000F56195DF418866DA93CFA03C2FCDABFCAF +:10CDD0002E15EA69CFB2F609F61D32EE383C5B3308 +:10CDE0007148C07E989E6665F6479586001D19E4D9 +:10CDF0001536D093029F91CA5283A6399CFD3AB74B +:10CE00009F9FD9BE4639D7CFE5C29FF76915FE7CF3 +:10CE10005F8CD1250F847D2EAA4F29BC4BD39C0B50 +:10CE200001FF4DD13D73C114BE3DFA533DD843922D +:10CE30009DDA1B101FB15AC86C3A4FA967A303EDC6 +:10CE4000C06536A316F1C9E35514B6B3749CD77602 +:10CE50003F73EB30F61907CC6334E7FFA6DD3FFDE7 +:10CE6000F809E8D1AF4D3608078EEE7A6415D85729 +:10CE7000A3BBDEFE89E95B13EE5789798F86B82361 +:10CE80007D5EDE69C0F98FEECA5904FDC7BEDF952D +:10CE900006F431BEDBD30AE2A06FD7CBC39CC1FB43 +:10CEA00057E4B87436EFE2ED8B7E7C7CA927605F97 +:10CEB000527CDC919608F838B318E28BBD8907D70D +:10CEC000FBD04E1BCEE299FC7D6A9767039F9F22A1 +:10CED000036CB0BFD06766E3A8E39C476A287CF484 +:10CEE000F9783F9D4190DD3CE1B4910A9040BD82CC +:10CEF000C42AEA55C6218AFED5961445FB55493900 +:10CF00008AF6C9D62245FD9AECD18AFED7D92A14D1 +:10CF1000F5EBCB272BFAD7D86B14F5224FBBA27FAA +:10CF2000C9BE4E65FB212BAE4349B7A30AEC799BE2 +:10CF3000D7D90AE5E53D6D5503AD2424BE5BEA7300 +:10CF4000B7C2F3B1679ACB3C2434CE4B9639715FAC +:10CF5000C000EB2207ED135478911F7B35366B70C0 +:10CF60003C77F620E7ABB04E6F4914ED14D9571853 +:10CF7000FDF1B05ED5F3EE9163605DFC04E35F1DEF +:10CF80007ADFBD6341CFCF91D1EEEDD012B41F3B1C +:10CF90006616B821067844F2BDF409C8A939D1282B +:10CFA0004FC6530B17E186BD5009D6C9A980BB8275 +:10CFB0002C55ADD30A45BDDAF25B45FFAB92D62ABC +:10CFC000DA275BEF52ADD3FD8AFA75B64754EBB45E +:10CFD00059B54ECF28DAC77FE16B05369AD0E39278 +:10CFE000CD74FE638EB455C1BA8CED76CD017E2929 +:10CFF000F5385B5184EC697E134A0FF5AB20AEF532 +:10D00000464B12967B5AAC1897DADB928DE5BE162A +:10D010001B3EFF5B4B3996EFB4D8B1FC7BCB242C85 +:10D02000BD2D0E2CDB5BDAB1FFF6964E2C290647A0 +:10D0300080BE4888E7FA87D6C1DFEFD5F81A61E7E6 +:10D04000D59FF6BF514EF60EF0F542FD76D76994A6 +:10D050008B9FA413946FF119ACFC29DDBE2ABD8C03 +:10D06000C914E44F9D6903E881768DBD08EC6B6DB2 +:10D07000BAE60FDA1184DCB1D6916489657523AD07 +:10D08000E362836346347FB00F27E44FA03270938E +:10D0900045530BF5BE28D67E364D53EB42FDC0F608 +:10D0A0009DA705F69DB5E961F69DFF74C26A867875 +:10D0B000CBC133596680EB208F2FD949916E3E2D1D +:10D0C0002BB4453AD08B47547684283F335598018A +:10D0D0009E768D6D3AD829AEAB75641B9517B51247 +:10D0E000F347FBEDC074666FF75D67407FE790C65E +:10D0F000BE08E89CCAE927005F195BE36A41AFF408 +:10D1000099FDC98087B4ADB1AC9EE87F42B205D528 +:10D11000750CCEE15B2DB5AEFCB070A6C07CD470B2 +:10D1200066A6F3FD068F7D04E85F513F54636F00F0 +:10D130003D71A8C29E01F339E83020FFB81C667724 +:10D14000060839ADBD6C7A50DCC59DAEC3F7A6E9C3 +:10D15000199F919B64F7B6307EDAEE7466EFE3BAFE +:10D16000813F776334DAE18734A46E7B183C7EC05C +:10D17000F1F3CD80F0F1970FD3991EAC9C6AC6F104 +:10D18000FA5647E1BE6F9F230BEDA0BE668A25CA03 +:10D190001F7D279A4FEEC47683D812C3FDCD595C0C +:10D1A0004EFDA96BD50F8769FF4F5747DB50865B54 +:10D1B00072513FDDC43BCF8937A2DD32A7764425CB +:10D1C000E8A5597C9F6CAE593B08B7CBB4B17A0B3C +:10D1D0001DE76653D17A50FF8B136AF4B1B45E3702 +:10D1E0007CC57A2897A5DFAF8FA3657DFE8BEBC149 +:10D1F0007C6CA0AC5586FE92EFDD163AAF796B647D +:10D200002BF39FB85EB32FBFA87319820E018F4016 +:10D21000A714BFE8171EE1F816EF1DE1F85A9CCEDF +:10D22000EDB602527056B9FFB30CF8A167CEBB99A8 +:10D2300011E2F4CA766EB77DA067DF5DFEB4CE1D45 +:10D240001C4F12DFFD289DD9D787F4C42E811D778E +:10D250009319E9A370E677B79751F80BBB2C1ADC4A +:10D26000BF1772DC4B307E5FF68513E5DCE53DBE13 +:10D27000A70E13A4F34EE093F3E9A9A9AEB5A81F36 +:10D28000467F4FF50FC8C533CE4F0FA31CACE372DA +:10D29000B019E5D79E963558DFDBE2C2725FCB0648 +:10D2A0002E07DBB0FD9D964D5C0EBAB91C7C1A9F13 +:10D2B00077B5CCC472778B93CB41B6BF5ACBE969B3 +:10D2C0007692F33EC093D8C79C6674EA005F7F7D78 +:10D2D000C44064D89FE832209D520E78E2D10438D1 +:10D2E0003763B06CB4869E9F51CBDBFEF557EDF7EC +:10D2F000AE4EB23F0AFCDD7F5E06ECB3CB22D3CF4D +:10D30000416235833CD9917E432DC8E78356AB19E2 +:10D31000ECD68EADBC6EB79A75B4BE337D06CA9797 +:10D32000834EABD940EB2F6D9DC1DA5D567314ADC2 +:10D33000BF9C3E93D5DD0437B7BBD2E7A09CAD20A0 +:10D34000D21EE0872A63CA442AAEA97EACD8037CE9 +:10D350007055D2FC89C00779E956A4C3C9D6B57BFC +:10D36000A07E4DF6666DBC15A2A145EBE0BDCA845A +:10D370001A2DBC3771F88A75F0DE95E9F76B83DFFB +:10D380009B94FFE23AA85F6BDBAC057B300FE45661 +:10D3900062601C5117ED42BE8AF35D23BB1C28C797 +:10D3A0000B3B1D28C7055E2AA7D5DC0171BAA64E26 +:10D3B000C922C13CA649FD9BF612B5211ACF506E79 +:10D3C000A172F6EDF4BAB8B514CE26A88FC1FA1F33 +:10D3D000D68697BBDE70FAE543CEA7A0376BE83858 +:10D3E0001F52FE81F368360E5F53D77CF37CD4570F +:10D3F0004E33E8D7515C5F8EE1E5325E36F1F233B1 +:10D4000093FD63F8CEE791F9FA4BA00FCAB78BD919 +:10D410003C42F85AD9CEF9FA38C72329F52743BD3B +:10D4200081B4619CF07CE7BC9606FB6F29705EA21C +:10D430001DCF61A8CF4BD4132F1BAF5D75DE82F8D3 +:10D44000F4B80FDA19F41CE511F73F0630B93713B9 +:10D450008435381D1914EEECB0706B3312CF09B758 +:10D46000B29DC3BD94B8F17C9B1A0EE24C44DE5AC7 +:10D470006E3A84EB190A8F2F3C3C217030FF5D9C83 +:10D48000671171796A07256494811C341388DF045D +:10D49000CB89C3E790136A79F473C9B973C89B1C2D +:10D4A000C09B5ADE88735AEA52D873B4EE82737AFC +:10D4B000AEDD5118A73F697596C2387D95FE1F35C0 +:10D4C000E09F25F890CE7E3FCC7939E041D2B3FD84 +:10D4D0007AFA4626ACDB098DEBCF601755656C41B7 +:10D4E000B9D30BCA81F2E3585A07BBE7F1A18EF119 +:10D4F000F01EC966F413E95CE7C40CA68F424BA288 +:10D5000038DFD8B7F9A7648C639D87DE23E1A15A81 +:10D510001EE77381BC2F8F4693A747221E89DA7FAF +:10D520003D1583D08EE819A1D742F973FB893D23BD +:10D5300032717CB5BFD833A4DCC8BE7BE524283B60 +:10D54000F5CE4DF3C14F1A6D403FE93D7E2E704A36 +:10D55000343B47F51EEC13D37E538E9E4900FDA548 +:10D56000F6377BF6CFAEB41686FA9D14CE890067E7 +:10D57000FDE79A3BE0D9C5FAA1F56B7E24DA78BACB +:10D58000AE6BCE106DC985F8A5440671517CC4F60A +:10D590002694655F78E30AADE07F0AFB81FBA7E78D +:10D5A000398F54EE67F6C28433245B5B0A71A6019F +:10D5B000B87F2395BFCDFC565E8A7D91716C0A645D +:10D5C000AEC6E4D6A72ACE23256969395BF68D82DB +:10D5D0007A2FF1E23E89DA9F7D8BC7A1A85FFB20FD +:10D5E000D0ED7A7E4E89AE483CD06FF5EF3E9A7B07 +:10D5F0002BCA8128B487FAFDDA9D1A3C67D0A1B501 +:10D600000F1C0F7EED9A0CDB5A5AFFCC9BF8E06B97 +:10D61000B46CB2FC887813FC5BBFE63BC4A7A8F7E8 +:10D62000F0B86F9B8EEA1F5AD6FFB78C7AA89E90EF +:10D630000DB86EE40DFDCA20BD48DABFEDC7FF4846 +:10D640002AF76A0081A8172BA7DA69BF1AEE7F10A4 +:10D65000F226AB73BF8BB852A7DAE9B83589BCBFE5 +:10D66000EB21561F21DA1F66FD33C478FFAAC5FAE5 +:10D670001051E7E3E588FA7BAC9E22BEE767F5022E +:10D680005137B3F1CDACFFEE6D3BA6823D22E4FDF8 +:10D690009E0CAE1F8B48113F9FB30FE57FE47329AB +:10D6A000CA76AE1FE63D23BBF423617D2647BF0B40 +:10D6B000FCDD2EE119BAFADB7418EFFE26AEBD7060 +:10D6C0005590BF22CEB138AACC76B0FF1A5ECADA26 +:10D6D00022F3733D607F10BE1F5D2D9B707FE2D4EF +:10D6E000DD4CEE47B2DF16AF794DB19E21EDB2C4ED +:10D6F000FC71D8B8A3DF3B79CFE0CDE85FA47B71A4 +:10D70000FFFC588624F6E949795CE0DC58421AB1FE +:10D7100083BF9AF03295CFB0C65F78511E2F7E99A5 +:10D72000C57F1B1E7913F5DE02D98AF1DCEBF29D71 +:10D730003D809F5EB317E38A8BD7ECC679FD9F1CB3 +:10D740006E3758FCF9C1F8FC3E14FFA7CF83FFD316 +:10D75000BF26FED571E765A63D08EFB28B3CDFD64C +:10D760006B66FBA236BE4E4735D6511C5F719910D1 +:10D770003F5FE4CD8C95E1F0B177103BB7F44E19E3 +:10D78000F845A79ACD04D67DF6AA7F143AC3C47D86 +:10D79000D5FEC0CDF0CDC400BEAC9921F84DCF2C44 +:10D7A0003B277E95EDBF307E076B7D7A1BECA31E79 +:10D7B0002138CE28EF517DF0F99889994C0F0FEC64 +:10D7C00064FB46EA735F1333CDCC6EE2FB330DB5D9 +:10D7D000EF8C83FD19C10F13A2493BC4DB295DDB2C +:10D7E000385DDB80AE05FD06F669E87B61F82B400D +:10D7F000BF4471AEEF9A4C6E5F06F07A7DE6B9E9F0 +:10D8000056D9FE0BE3B583DAC3B8AFB9330AE329BF +:10D810006A3CAFE47815F86ECD64FC1F09CFAD808B +:10D82000E7C49F1FCFAD9956453C42E03B927E52E4 +:10D83000AF8F9877183E2DBB143ED5677339A5F589 +:10D84000E17953F5BA6F0CE5A77BCFC34FF7FE9A8A +:10D85000FCA4C69BBAACE7FB9DEAE7CF678AF3015D +:10D86000BF0C1EFF7F8BA7CF697E5DD13E6FCD7E43 +:10D8700045FB7CD701457D9CCF5B05642EE2E357D9 +:10D880009CF0BF09F54B8DB3478AAF4FD9B1440324 +:10D89000FB6FE55E16DF6FC8764A5974DDDED3B8DC +:10D8A0005BCD14AF9777B7CBB81FE62EC27DC055BE +:10D8B0007C8EDF8DFBD7A7B752BAF98E1830FEE900 +:10D8C000793D476B2D08A5838AD332B107D98915D5 +:10D8D000C6582DD85315D4520E4737FA2C467778B0 +:10D8E0001E88F2FB4C23D125503E9F3953C2F34F83 +:10D8F00033093B574D4B8F93B64FD1128F81D66B67 +:10D900004C5A8F01F7FD58DEC374364D62D01217A2 +:10D91000B4938478F483A7C1433A5FD92EE379B6F0 +:10D92000E9E56CBFF02653BB0EF4E98DFB6E3F7941 +:10D930002B6D27EB5C65ECDCB6C863FB587331FBE1 +:10D9400080FA2CC6E77D12DF5796743638E7AA7E38 +:10D95000EFE34C06EF1479AD0CE75FFC0708DADD66 +:10D9600082EF287CFB0CC52C4F630CC049749EAC25 +:10D9700018B09FEFAF82FEF587AC8897A6F2B58509 +:10D98000B08E4D13A5CF0D8501FFA669CDF768A711 +:10D9900057CBCFB742FF53475868FCF21E970CFE97 +:10D9A0004A207EE99B0B7C793E3F48CCBBBBC583BC +:10D9B000F4F469CB3E2CDFBBE2ED32B0337C2DDEDC +:10D9C000B0F1CB4B8D17883881881B0839F0D96DA1 +:10D9D0005583812E6D595C2E18A561201788969568 +:10D9E000425E8ECA0A91AF63B2CEAD5795EDBFB01D +:10D9F0007CBD503AAF4F627A514DDF6ABA16F44C93 +:10DA00005F2B93E8776FA2F61EE8D559C455504FA7 +:10DA1000E5ECCC256DBAB1D2A5D3F532D317C92424 +:10DA20004CBECAC5CB732BC22F57C9E81F88F30A57 +:10DA3000621D1AB242ECA115E759B715BFE6BA85C7 +:10DA4000EAB52FE65E9A5E230A7BE0EE50B8DBCEA5 +:10DA50000377DBAF0A778A55E4D1CC953581BC11C9 +:10DA6000384F0C765C9F9BE545D6A5B4C5E0E1CC6C +:10DA7000727F0CD88D4B77C94887446BD70EA1F4C1 +:10DA8000BA84D36B0FF17C00F4B864DC12CCA7AB82 +:10DA90007B2CFCB9E246DE7F99A9430F702EDBAAEE +:10DAA000ECD7C8CF15D73FAF8C8B368EBBEA388CFE +:10DAB000DBA83ACFF35216CF4B2C26C5ECDC85D22F +:10DAC0003E5597BD2D4411AFEC3DD382F180DD5919 +:10DAD000FE075CC383FCFFD0F5DB97756E7B4ED9E8 +:10DAE000FE2BD3AD6CDE8AF955174BB76B73EDFF88 +:10DAF00080790B793C1B6413FDEEECD70C6E17ECB0 +:10DB00008F9659597C5372B7C27E5BDF4F04E3474F +:10DB10000B789C33527EBA386F30FA90BB959D37A4 +:10DB2000B0CB902F3A6A9FA30AB62B4ADE69467B98 +:10DB300024E2BE95C8B3E2E7872E54AE89B8DEA8CA +:10DB400013CD6867D9BC16B487C69C6E7F13F4E307 +:10DB5000CF15EF16FA706C3CC35BA9CF81765EAF30 +:10DB6000CE53F621D809AF4485B51362B3D9FA4D27 +:10DB700075CDD7B1BCC390FDC0D86CBA1E53B9FCEB +:10DB8000D718ED3AC053B5DCF3E00CA01FAF8CF111 +:10DB9000BDD5BF7FFFCF8F5ACFEFF73759BE43BBFD +:10DBA0002192FDDFA461F917C555563CE707FE1425 +:10DBB000C4F744BC4FDD7F426E651ACCAF5A1EE7F6 +:10DBC000B5C37C36B1F9445A9FA635DF2AE28B9162 +:10DBD000BEDFB4ABCCB220880F6ECE9684DF613945 +:10DBE000660CACEF85D2C178FF4C85FDF3FFBA5FC0 +:10DBF0003145A6A625D59F05929BD9AF84D9B1B34F +:10DC00008917CBB9C48FA593B0F3F70B880DCB9BC5 +:10DC1000793EF3811CE74C58973E9D7F109E9F7C78 +:10DC2000E9DFF9403727AF18DB06DB5EBF941DD76D +:10DC30005764C5EFF7EDFC77329C83399F5C589DA4 +:10DC4000645F9E1D66FFF9EF15F24C966FF518EABA +:10DC5000891A7E1B0399C8F6D1484A0AD243402E3E +:10DC60000EDE2CE422ECCF167CAE61E749964AEE3C +:10DC70000CDAB5D3A741D62A5894E296A1DEC1DAD0 +:10DC80000B1A62DD12AD178C8E62ED2B62DD104730 +:10DC90009F437CC88FF3A82884723E61726F21B1C4 +:10DCA000B37C07E24F053B6C5197919DF727BE74FB +:10DCB00090EF8511FC9FB7B299DF3C3295C9F39183 +:10DCC00095CA38C53D5C0EF4E6549EC8A6E5A96C1D +:10DCD000FBBD80979171DE8D0F9462DC9E80FF709A +:10DCE0007CF46F71BF51BC97985BF900F47B416283 +:10DCF000E7D35DBB0C783E82BE31C81174AEFF40E5 +:10DD00004ED523D0CFCDED928878257E45FE6C8010 +:10DD10009F5C38BF91E07361BC9C3E28C7EF62FDF9 +:10DD2000C5ECDA69EB4C18E37781DD9B98EB7C1648 +:10DD3000E7AF27C404F37FDCE0DE82F6697332C408 +:10DD40002B973C61D080DDF01155B79087F2498B5D +:10DD500011CB7F503F18CACFA81F0CE5E7D40F8620 +:10DD6000F29FD40F8672D1E922AA2C283FE5D8DF92 +:10DD700064F41D3E4FAB4BE05B7C7F971EBFDF9B87 +:10DD8000E344FCF6AFF72BC40D9B3A2FC4FA87C6C9 +:10DD90009D83DE22CB198617B15FA86EDFCED7B583 +:10DDA000B0438BFABDB0D317B338A8DF816C3DCE3A +:10DDB000B360E7179887DA6BE9C7AF5DA2204FD150 +:10DDC000B0FA81EC3AC46F6F8EFD04C04DF9FB30A0 +:10DDD00094859DEFFF01F27FE8F878EEA04FF23FC7 +:10DDE000847E800A0E351E045C2FC47A37C2FB2F56 +:10DDF000EC4C0548A8BC218C6F808EA470F0AEC599 +:10DE0000F95E6FF097425ECBF567E5B0E78C7B7308 +:10DE10002A10CFEB04BD093CF1F5BA54BEEEDFFF8A +:10DE2000E6744AC43D1E203BADA087CEC480BD57DA +:10DE3000C3F7F73B3BD2DF03F85CFB64926145FA22 +:10DE400055F0DDB01C4627A22CD8A577C03ABDB04E +:10DE5000EB58FACD265C97F445B47F744E8622FECB +:10DE60005830FAA7FF782001FB5BE0533792CDD5FD +:10DE700070FE6496F1F5BF0248732C9F57C3F99367 +:10DE80007949D25E28E75B53AE847327E27CFCC2FB +:10DE9000EC8ABDC04AD7DA6AD04EAB00E112A40FBB +:10DEA000AA8CD1B029D85FAFB6C42BEA57250D5341 +:10DEB000F49F6C4D53B45F939DA76817DFBDD65692 +:10DEC000A2E83732CE9F0AFE198503F9816C93F1DF +:10DED0009C5EC1CE4357E7D1FA94A7A6DBC02C794C +:10DEE00081B74FD95EE586F5E8A3F8D45303EA4439 +:10DEF000F95D0F3D0083A9ECFFFA5D4FEEB55B2F96 +:10DF0000C2FE8F60F70B39BBBCCB580672F642FDE0 +:10DF100000F5FA8CCE51FA0591E8A69F2F242BA389 +:10DF20009BFD32D916866E08B99DD3212BA71C64A0 +:10DF3000F963172BCFBE0479161FE08FFE52159799 +:10DF40001BA9B7BDB70AE2F4EFCA04F3F1785EDFAC +:10DF500062F85D0ED03BB979F31D4312F0B90BECBA +:10DF60005CC82FB5D3F157E470FBA9FEF53B86944E +:10DF700006DAC9EACF15FDC96DD27A457D5D8AB250 +:10DF80007E77C5FAE0F723C9C5C59BE6EB9D98FFF0 +:10DF900029D9DD61E483984FF51B5178AEEF3A380B +:10DFA000AF421F35961ED0C23EEC7511F4A8903FCB +:10DFB00037CAA4395CFB6D392CCE7FED1B51780E2E +:10DFC000E662C7FD88E212CF19BECCF4E84703BD74 +:10DFD000DAE075BF93CFFB64D9FDBFFF11F6475F51 +:10DFE0002178EEF3642C93FF851DC7351AD0830387 +:10DFF00018BD145A7C1AD02B7D75D12E38D7DFB4BA +:10E00000D4CCF25F52FD1F18E9D2DF97F3CE1F8DFB +:10E0100074DD3E8624C820BDDA074E11AD6F7AE666 +:10E02000ED69EBE8FBD7BC11E5D15C023C9BF8BE87 +:10E03000C4C84AC6E773816EB87E81187BD31DA41D +:10E040005FDF805C00F8A1FE5ECE7B87FE0876F87D +:10E050007EC6E770C24EEDDFCF0AF2EFC9638C2FA8 +:10E060008DF4879D5352F1F79E36BDE99C7CDE8E80 +:10E07000E76E2E94BF77E4F03CE1C8FC7CF01ABA5E +:10E080003E4DAFB07B2D4E7565605E6C247DDEB479 +:10E0900049463EECD75F5DF22437EA29651EBAC0D7 +:10E0A0002BB1DB903FC5FD512BC7FFAB16F4E6CA81 +:10E0B0005D5A764824D27736C8C41AF49D17761B69 +:10E0C000EA30CF8DCFBF4FE8EB5D3FC455E4B3726C +:10E0D0006D18BD47F5B42E01F4748D847EE5E15DC5 +:10E0E000832B014F8725E2B162DE163BA73C950DDD +:10E0F00007CF4D786F4952369E4F16FEA5F02BA7DD +:10E10000EF9A9E0176E5071D0B0ED39523C772D2B9 +:10E11000908F661017DAC187631D23202E31859FEB +:10E120000F381CEBEF01B97C787CB404FBFD74FC68 +:10E130007530BE80EBB0CE3182DD3F21CE25E75E6B +:10E14000D27D71D5F26D15D7C0FEF66C6201BFF2BB +:10E150007A99D9B9E42F8C3F85DC6B92BC7130CFB2 +:10E160000339B5A773289E06AFB997C75539DEB4F2 +:10E17000EC1CE285DAB9FDFEECD312BB17C5C6EC88 +:10E18000FFC671DF3C3803F2E4A8DF2DD1F92CE89B +:10E190007C1DEFFF51FBD9FDFECEFF309E1AEA2F0A +:10E1A00039E27283E2E46ABFA9DF4E17F6DE367603 +:10E1B0004EFECDF10FF72EA7F5D5DBA2118F5F3DF7 +:10E1C0006170811CFF6A8B01FD9FAFE2FCDDABA09B +:10E1D000BEBDC0E6C2AFD914F7A32DD1583F04FD90 +:10E1E00043FEA6C37B3D8E3F6EF0C0798FA54FE600 +:10E1F0006C017FEAF808EB73CF433CF0B944BC678D +:10E200008038D9FBD7717E04FEB252D343FE2F3340 +:10E21000DA114B770C413926D6EFC4E3519847FF0A +:10E22000D5BEA903215ED6A37911F378886C7281DB +:10E230003C5EBE250AEDC035166729C05FF55FD785 +:10E24000CD2881EFBF9F48009EBEAE1D18AF0CAC1D +:10E250006F78FD7EAA2B8DC9817E7DCBCEDDCE83EE +:10E2600073B76978EE760C8CDF40C4FD8BECDC6D07 +:10E27000B12CD931EFE09EF079E4D7E432FBB15E06 +:10E28000C44FE2893109F8D04910DEBE7BB2B680B6 +:10E29000BFB330378E7FD7CFF32505BD7537BE8628 +:10E2A000F113033BEF17157E1F7B462ECB2B5E6CC5 +:10E2B000FC5E11BF695CF39322AED2984F50EF160B +:10E2C000B75A4B56D07215C7F3EA54C74D00DFB2A8 +:10E2D000F6FB5F7A07F1F2D86F3E86EFEE3361DC32 +:10E2E00086BCC3F0A7F667161BBFE5FCB4596107EF +:10E2F0001F7BE4433C6F726C675E21ACDB02D97B11 +:10E300000CEEE5EA357B3FBD9596DBF71DC47551F4 +:10E31000CF3764DF5E6272A51EE08887F32E8EE63B +:10E320005CDC1766FC7E746301E24FC473FBBE0ABB +:10E33000EF6F89798AF1C5FCC4F8A2DFFFE2EB75C3 +:10E3400052EF2D04FD9C06FB166581F69331DEC26B +:10E3500058133C67792D27E3683D886E7EA9FD9DA3 +:10E360009B789CE78866ED2D7A4A7F3DED0FE89C0F +:10E37000C172F422F775C47CC5B9529147FB9FB9AD +:10E380003C9E3D828C88907FFB646E59D8FC5B7C00 +:10E390001E29FFB63FDFF607966F2BF26B4BAB34AF +:10E3A000CDC179B6421E96E6D1E7F9B0EFAFD4EF12 +:10E3B000A52395FD23C9C7F1796C1D4BE3C3E7BBCA +:10E3C0001EE2EBDC4A3CEC1E42AE17C772BC8BFB74 +:10E3D000BF849DD2C8E5B6C8F31CDBC5CE6D8EE503 +:10E3E000793B540A609E6BC83D6F4979A857C53D7B +:10E3F0007D121D6B765CB87C612FCEE30AE2C7D23A +:10E400004E2C5A2829FAB19C481C585E499AB19C56 +:10E4100044DAB0BC9AB463792DF16249723DFCBC18 +:10E42000E76D2CCF74F2120DE8D7D219E1EDE21F9F +:10E43000CF8B0717DE2378B178B892B0FBFE42F09D +:10E44000313C1BE95B8D0F75BEE678E2C38B4B2632 +:10E4500000E1A6811F6CC5F3AD55C48EF5EA0BC46F +:10E4600043B9CFA965F9BD2A7C5485A78BB31C1F7E +:10E470001B40779605D6A9348FC901B15ED4114BE4 +:10E4800002F9AF5E47F1BC34BAF23B2B1511C3F26F +:10E49000EE988E79DC2595ABD268BDE0B907597D41 +:10E4A0006CE50EC8F31E99F7F074CCFB1E5959A207 +:10E4B000B3C17D729BA64FA4ED4E7E6EDAC9CF4BE1 +:10E4C000136791E29E2CE7DA5BF0DE31E708930DEB +:10E4D000E01479E1721ADB5F4D9EE4794347FBED6E +:10E4E000B23807E595C139734F8C15EC84B5D578F2 +:10E4F0007FD49D7AD65FDC6723E013F7DC6CDF9E68 +:10E50000B74A4A3DFF3CE8F8E97989309F0CCC8F47 +:10E5100073EE94783E5CE5E099546EF4787504F2FD +:10E520000BC4F72CA9CE1C980F81A478CA17C3B8C6 +:10E530001EEED99E9707EB549AC7F30713524A0071 +:10E540008F0B521DA5D05FE44597C2BA24462E67B3 +:10E55000E7D98BA1BFFAB9C8CBAECE7396437B5334 +:10E56000F419CC37EB2D7A7FBD2F25344FBDD54E16 +:10E57000DC7A942BCAFCF4BE457ABCCFA9D4E16CFA +:10E580008523CA97CFF68FC27CE13C67158EABF727 +:10E590002517D1F7FE3895E5BFABF3BD77EDDEAFBC +:10E5A000C86F177CD69FDF7E8AE5B707F8EB9155D9 +:10E5B0002428BF5DF08DE0BB3190DF1E03F59C4544 +:10E5C000D06FFCFBDD98DF3EA1DBC7F3DB3F54E6F9 +:10E5D000B7DBFF7549F9EDC7F9BD6FC78DECBE24F8 +:10E5E000719FD4CA9D6CFF77A5C4EE935AF9277624 +:10E5F0009F94F00BEB387C0DFBB7AD877DBEBAC79F +:10E6000016E27D5484DF876AA53FC17EA1B89F547E +:10E610009D07D304FE20DACD1EB4BBD4F9304D8F54 +:10E6200055A13FD8A4B2A36FC9E3F11DAECF08B77F +:10E63000FF96F077010E13FA677AB43B573EBECAD5 +:10E6400066813AE72BB2EF7912DC9F3C168FB4203B +:10E65000F86CE90609ED5781BF914F19EC789FF1ED +:10E660005383D16EA5F636CF6376337F9BD20A9C57 +:10E67000877F21D69F0A76F20BBBB26D54C29257A8 +:10E6800023DE43FDBCEA1EEA2715F7509F82FF8177 +:10E690009D7642E386714691ECFBC6D17AD909ADED +:10E6A000CD6D0DDCCB7CBEFB8705FE0D7CBD2EF653 +:10E6B0003E62F5BDCF22FF417D2FF19DFC5EE2F170 +:10E6C00011EE2536C85D32DA0FDF6B15F7135FCE1A +:10E6D000E12CB71237DCF73BA647AB58FF725F1B44 +:10E6E000017B28EA90561147305895F597F3787CCE +:10E6F00080DF2F128A6F533F3E0D88CFF487119F22 +:10E70000AAFB9E059EFAEF7B1E6E42BA1FB37F875F +:10E710000CF2E062EFFDFEB5EFF93EDFBDDEEAFB95 +:10E72000BAD5F77347BAEF5BAC7B9167A5A2BF7A06 +:10E73000DD4BF6FD4E791F355F6F17FDF939D7FBBD +:10E7400007D57AFF1B2E40A37CF8F7981377035B5D +:10E750004E896672ADDFAF1FA7433FEB3D6B7C95E3 +:10E7600019F89FEB2907D753E4B676DC8777707AE0 +:10E77000B179D93982E223ECFE8A521F3B4F30EA4D +:10E7800044F8FCA0EBCB25C5FE6EE8FDC52CCF7888 +:10E79000EC19764E4FBDEF2FF2866AEC51CAFB1B87 +:10E7A00022E41189380EB5E3891EEC780DBBCF2E1B +:10E7B000CC7DC79BE4B4E03C2227C677A619BDC92F +:10E7C00040CFF129CECBF21303F9461320AF4842D4 +:10E7D0007F90E7E124DC0071C73E48B21D4AC8675C +:10E7E00077C7DE80F70624108B6F1473777176F984 +:10E7F000CE6C18E7A864595F42DFFDFB986F924129 +:10E800003F19605FBB18F77D73A15D7D4FBF4F63FC +:10E8100045FBC2F53B09FD876F60B0D141FCBA41B1 +:10E82000C7F31A557FC780FB53E2EF181CA543D4EA +:10E8300051B93DA793E5512F4FEAE17E18BBC7754B +:10E84000E17013DEFF44EC2536E6870BFF6A987C07 +:10E85000317AF37CE78B96277DA5F073C9F3F11726 +:10E86000B49F18809B8D7FF4AE68D43747EF1A8130 +:10E8700071BEC0F8BDE8F7CF69569E339EB7E62358 +:10E8800005FDCD777DAE68F725F875C328FCBE97EA +:10E89000865C398BE2EFE44EC328E033BA6EF3F2C4 +:10E8A00083FC7BDF3D5913991D703E38BFC17974DD +:10E8B000F373A202CE4F5B8E60DDD7E2539DE7710A +:10E8C00029FC5251EADF20784F8E5F1A600B1767E0 +:10E8D000399ECFECF66E9E07D9CDF320BB79DE6270 +:10E8E00037CF53ECE6798A227FB45B2276384F31FA +:10E8F0005B723C315FC2FCD1DB00CEA665FE42C834 +:10E90000B76B1AE99B2BC9983FDA925F16367FB432 +:10E9100010F2DE5F797EF60D60D79F18E0C27B496A +:10E920005ECC9F7903D8F527F48C3F5E7FBEF2065C +:10E93000C81B7B7CA8F32E18E74B49F6203DBF226D +:10E94000E17E2AB1FBF4B5E7C82F6DCB67FB0BF76F +:10E95000E7B37D0C513E97CFE4D9EBBCAC96EFCE3C +:10E96000C4BC9F4D06CCFBA1DFB16B82F6FFD5F98D +:10E9700059C57F3178406E8838CCD67CB6CF0A79BD +:10E980005B30BF84FB0C2C6FCBE74D863C2F38EF00 +:10E9900003F7669043C4CEF2C0D8FD7D621DB6E693 +:10E9A000F3736770A17E69204FAC61FFD14F418E38 +:10E9B0005C97EF7C1AF99FE72F35C4BC8EE7265E83 +:10E9C000CDB7E27B74BE083F9507EB24C473481CA7 +:10E9D000AE3DBF2C34FF3D12FC2717791FCA4F09EB +:10E9E000E44F05E54DBD0AF310708B7904C6393745 +:10E9F0005D8B785220DE756726F049B78ED97BE2B1 +:10EA0000BEDA62599A574BEB6F71BC88FE9FF2F5E4 +:10EA10005C9DEAD80FF358D6CCE26EA2BD4F6AFBDC +:10EA2000CDC7B06EFB4D28EFD4DF17EFABE16DD84B +:10EA3000BD1FF142E19D0B7006C1FB617E507CF071 +:10EA4000E4AE0F1F02945F2A9C179BCF6C18C0EE98 +:10EA5000450C8D4BD3850DB2A70CE2FDE1CAFBC678 +:10EA60000CF0F711E8F73AB81FD2C1FD904E1DFF28 +:10EA7000FB352ABFB4C3CBCEF57424E9F1DC0EE13B +:10EA80007F6F41E8E1D507D8399FD52904DB617E46 +:10EA9000C00F926F2FEA85FE7BA324AAEF285D7C2E +:10EAA00063719202A06BE72AD413F265261BD0F59E +:10EAB000F6BF5DCDFD2BA677CAB89E298371008E67 +:10EAC000FC81A87F4AF97747199BD1BE1D4D5C3C5C +:10EAD000DEC2E31277ED55F865FF17386EB02750A8 +:10EAE00068000000000000001F8B0800000000000C +:10EAF000000BFB51CFC0F0038AAF9B3330E4593198 +:10EB000030CCB1666060B56160683047C8BD114700 +:10EB1000B0A9897FCB53A67F932403C31620DE06BA +:10EB2000C43B2449D7CFAD8D6037AB3230F000F90C +:10EB300021409A558381E1B51603032F903F03C806 +:10EB4000DF03C42780580528F612480BAB31307C10 +:10EB500001D27C40796D20FB8A1A76F3F9B5F1DB9E +:10EB60007F5C0395FF138DFF401DBFFE2C4D02E11E +:10EB70004B401E1BE6B3273F3E8228D03B10F830A7 +:10EB80005ABA7E6CC2C0F0CB9481C10E9AF60F20A7 +:10EB9000C90700C59E9840E34D8F81E1961903C3D4 +:10EBA0005E1CF9E20450FE36503EC61CBFFD0ACC86 +:10EBB000A87C615E4C35DF9810ECC942A872C7840E +:10EBC00031D5F38A323000002621667DD80300005B +:10EBD00000000000000000001F8B08000000000083 +:10EBE000000BE57D0D7C54D599F7B973EFDC99499D +:10EBF0006E269310C24002CE2411A2243040C09849 +:10EC00004CE0E68B041270F87829565A27E8226DFA +:10EC10004111DDAEEF2E2DC347435454D8A26BAD46 +:10EC2000BFDD812AEDEE6BFB0B162D9B049D8480CE +:10EC300068F88868B5AE6D376AD7061B6C88C1D294 +:10EC4000DF4BCB7B9EE79C93997B33930475B7FB9B +:10EC5000BEAFFCFCDDDC7BCF3D1FCF799EE7FC9F88 +:10EC60008F73C66AB111D775845C85FF1610327F29 +:10EC70002221646EF42A9E57D8492879262169F604 +:10EC8000435D33320859A8C9BE1A0F2113EC0D9DFC +:10EC9000A488903262F3D8BC84B44B3FEB9A41EF26 +:10ECA0004FA4587D3602FFDD4BC83C4236DBE99F5E +:10ECB000B4FC894BF44ABF3FF1474B98488454CB8E +:10ECC000F54482EFED122FAF6B4B3209A922ECBF56 +:10ECD000F99748152D46AADC77D593198454BA685C +:10ECE000293B7B7795952784962F25AC7EDD6E7C1E +:10ECF0005F4A765F949D70D72F070A697D5754E36A +:10ED00007B77CD6F8913CAC53C8771C01F940653AA +:10ED1000494AC687C9F4EF9BC84D57657A55C61155 +:10ED20007273942EE62B212142C613D2C2BF5748DC +:10ED30006006DC13F23CB69F2EE858DB43DC74DC43 +:10ED400019C5C457430738A1566F07BA9456A91E70 +:10ED50001BBD6FAF9E37B14723E4BB179AB3480181 +:10ED6000FD3CBC01E998C1E9D87EE1C577EFA6DF9B +:10ED7000FB6B89CF46EF5BADBE898182E1FDF1D7A8 +:10ED8000A63B08AD676FA02319EB21E4CF57337979 +:10ED90003DB984B40572528371BE13D7C7B6BA08A1 +:10EDA000B145EFF7E8A4B6591B5EEE4598CCB950D3 +:10EDB000FD1AEC6729A7E57725B2BA19DB5D8DF35B +:10EDC000D4CAFBDFA97724F714C0FB48B2858E2391 +:10EDD00074D1429EA555B4F55524417FB7EB9608F2 +:10EDE0003C6FEB53C3400FE26ECE5A5638BCFFADBA +:10EDF00017D7CEC671053718DAFDFB3E3A5E0DC651 +:10EE0000F77CF2425ACF409FC525D379DDCB9FB71F +:10EE1000069B935DF05D6F3ACEE7635BE9DFD3124B +:10EE2000D3E3B1F95FCF096A50CE6EA447DFC0C902 +:10EE30005C3A6F6DFB141F8C6B347AFE3D6F47DCC0 +:10EE4000A7FB22952E5AAFBFDF27811CA5F71132F1 +:10EE5000CE0B72D176CC09F35B4F502EFC810AC7E2 +:10EE6000F56C1C3ED903EF4FC9C01F7E5704C73154 +:10EE7000D41FE8DF34E8A71BAF4FF2F69E8079C4B9 +:10EE8000F16D774CA5FD1D2856B09E03FAF672056C +:10EE9000EBBB1291811F37307ECAF004B75981FE57 +:10EEA00077125FC803F5121CF73FF2F13FCDEB1369 +:10EEB000EDB4F5A5972BD0BFD5C40762522D6F696D +:10EEC00087EFFDEB59FFA73CB04902FA5DB7A507F4 +:10EED000AF61DECF3DF03D2D90BDA95F02BA4DBEC2 +:10EEE0003F82D77DDB7ED90EFD4BDD491CA00BF6A2 +:10EEF0005659D2E0BBBD0B2739E0BD3340059FEA30 +:10EF000003BFCF756F271DCFBE2A05FBB9AF8FD2C8 +:10EF10009F9673865C3E906B67C8C3AF3E1F946F2D +:10EF2000E5E338CADB7D998FC719D279B94D055011 +:10EF3000CE190AE135CCC7493C1B91EF360BBEB365 +:10EF4000066F8479CB18246E42E5F9E8A78B274237 +:10EF5000BBA27E73F9834FB5CC817E8F1F24EF59FE +:10EF600067C035D200ED4D837138E1BEBB41423DF3 +:10EF7000154639F2F75908C98FEAA90CB2ECD55BEE +:10EF8000F0AE1AE548E881D23ED522A5C6CA591589 +:10EF9000CAC13E2E07557D11E4132A67C72C944E33 +:10EFA000A10B54CE287FB5062C38DFCFF4ABA88751 +:10EFB000497E246B59CA70396ABBB86E36F45BC897 +:10EFC000D370FDF1FF867CEDA3E308C6D16BA23DB3 +:10EFD000216FE6F7A3CA9B2B84F2D646E52D04F4F5 +:10EFE0000C581C79207F4D1694137755733B9397DB +:10EFF0000D286F1977B2FE4C58134639184DEEF6AE +:10F00000795CE50AD4BF9AC9695BDFFBDB6C301F12 +:10F010006B08D71357DAE1DEFF00936BB39C99E5D9 +:10F0200030D5DF8DF2E9DDD94FE0EAD9518F7C4D43 +:10F030005B71A0FC2590C33690C3A2FF7FE4B012A1 +:10F04000D6712A7769DAAC4E171DF7A27EC2F0900E +:10F05000B6B713D6F1EA6C1B5BC727BF7DDB3DF467 +:10F06000FEA43519E97F723C7D5804F732CA5DBBB6 +:10F070007757F666FA7E518684EF09598FF25D2341 +:10F08000F0123CA2F253DE239179E950EE833D95D4 +:10F09000F4FB577B890F5EBD9A2D637DC7FA0893F9 +:10F0A000632E9F357CBCC7F8FB81CB240CF2B900E2 +:10F0B00020097DFEE9F9FE2976FAEAF7962B8524E8 +:10F0C00087AEC79C6F05CEA8E6F2FF6A86AC83DEEA +:10F0D00038B625254CBC585F04F8EDD5076C61990E +:10F0E000B6379097FB5C8400FEEB9FBA99BEEF7435 +:10F0F0007D92122B9FBD7C1E3EE2F3DBC7F144CB19 +:10F10000F4C03289E2A257F37251BE06F23E994230 +:10F1100028A9EFC9FDC3877025A4590DA40CAF47DA +:10F120007CDFE50E7E59A2F3D31BFEC009F37DE11F +:10F13000F02733E04ADCE310778D86CF4A040EEBEC +:10F140006DDE01388454513E9917E59309BDCDC752 +:10F15000806E257D0C8F91DA8D0C67BA185D28FEC4 +:10F16000CA82EF5EE2FD6A3D4F719A86E50CF5B406 +:10F170005A7BD60458FDF87D898BCDEB907EE174E7 +:10F180007F529208C3896CFE4AF8F77EA5F9BB80CE +:10F19000B7FD2765DF36FA9DFF724F1589A3870EED +:10F1A0004869C8AF65FD467E6DBD705006BAD0FE99 +:10F1B000CAD0DFD2DE6699E971C66725621DE97D96 +:10F1C000DEA0DF45FBADBDCF239E1FE855505F2578 +:10F1D000A26B071FC74B5C9FB4F179A20C85FD3F62 +:10F1E00046FBFFD008DF570233C6F45BC8DF82CB93 +:10F1F0004906BC5ED69F6EC2FFC6FECE57587BF353 +:10F20000815E2431BDB648E9BCFECF462FB35E1106 +:10F21000F5B6021D0B86F78B00538B7ECBFFFDE905 +:10F22000DA067F30FBE504C819E93924833C56CB64 +:10F230001AEA93D22A89E1723ECE7AF89636552B95 +:10F24000E4CA23A19DB7D82F856B006FF87E807626 +:10F25000E24091CD037A688267AFD213C36F8BF916 +:10F26000F7A2DF47B7EA38DEF6B96F6741B9A3D72F +:10F270006FCB867958E4793B7933A5FF092E772D3A +:10F280005B6BB15CE965F2C82C98973C2667F3F993 +:10F29000583AB9DEE9E0747B99AF9B6F6D0DE2F5EA +:10F2A000CDADEBF17A6EEB26BCBE7AF9790DE6AF07 +:10F2B0002B3F17D7AF5AA5598967579598D6859789 +:10F2C0003C14EFD0F2757D6B77CFA2E33E75D98207 +:10F2D000FAF9547EEE8878A585CFAF28F78AFB0728 +:10F2E0009540B7FA5EDA5DEFF0F2A5BDC6764B89C0 +:10F2F000D40CF8AFD4F7BA42A87DB4A468BF168B7B +:10F30000635A2F641642BDADD2AF56CCF124EE47FE +:10F31000A9BF1BC7B924F28EE249495CEEB4D25DA5 +:10F320003F07ED54A68F4A7DEF55E9B4BD9A82FDA3 +:10F33000F5C817838A05F8A2BEE0109F5F17CEC7F5 +:10F3400012B19E15C9B561E84FDF00F6B3AB401EA0 +:10F350000FFD7BC822235F2EF1D810CF266C7F5083 +:10F360002111902F2582F3748AD6037C719ACA31B9 +:10F370007BDECDEE69BDF0BEDD6BD37C404FB7F0D8 +:10F3800047AC37F0477DDE9C53BE22584F64C4978C +:10F390005D972B94347A7F1AD6574F943F4B397F21 +:10F3A0009E8679073E0ECBB8FE09BC2CEA3B7A3923 +:10F3B000E79122DADEE9B035EEF7812AA33CDEE2FE +:10F3C0004E36DC57658F33DC9FEE9BFD6600DAA37B +:10F3D000FD073C47421B0CFD3F0AFA0BDA7349B8A4 +:10F3E000FE9FB852D5770F940B1BFB65EE47D7E510 +:10F3F0009CC757D27A4F1D96914FABDCC67E555EA7 +:10F400007AF314E8A73AAA5F806E2FE98A0EE33EEA +:10F410007D3825BC8DF2E54B05AF27036EA0FF6953 +:10F420004B683B9584CD6F4586B19E537DEF3F3C45 +:10F4300013F0AE5D463D57F1C78E9D00AFCE16DD91 +:10F44000D709746E2512D2A9ECC20119EA5B1536F0 +:10F450007EBF728D913E1B578E33E97FA37FA9D269 +:10F46000C3FC44F37D17B1BE12F0FFD0FB0ACDE818 +:10F47000179A0FCA20A6DE32935FA8C4C3FC4225A8 +:10F48000E01712E5BC6498DEA7F7D8BEDFB4AE9BE8 +:10F49000E53BA1FC5BC87AF0A790FEE5A3E096ED02 +:10F4A000DCBF62D4B744D927C5E28A166B7332E257 +:10F4B00086594C7F91FEF4B8FE2AB31E21E43EE447 +:10F4C0002B4147E20A918C79307E5EC6ACFF385DF5 +:10F4D0009AE8745CC57520C4F18B27AEBC9BBFCF86 +:10F4E000E6F2BEB097EA4D58AF7DB20BF4C6A9CB99 +:10F4F0004403793C4BF99DB5DC7335966FEB7A9BF1 +:10F50000912F69795C064F5DF6A1FC062632F96DF4 +:10F51000F7D628694C7FC69577B31CF492D0134573 +:10F52000745E4FE5E53EBE927ED77558E8018B8E3E +:10F53000727598E1DED37D9B915F0728BF02D98762 +:10F54000CBFD392D76DDFFAF9277B39C0FC9FF302D +:10F5500079677AEBD4A005C7537949C17AEAAE102E +:10F560005CC7CDF27F9ADB6F2FE96F6A3E580F0BB5 +:10F570003E40FB987C66796776486B2FC1F6CB2EB0 +:10F58000BC2FD3917F61F22EE45CC8ED35CBFB7FBD +:10F59000919C9B9F7FD3C2717F02398DCA7F08CB1C +:10F5A000ED4821F9E0676B91927CDBBD20EFCCEF59 +:10F5B000632E3F4E16FE587BE837745C0D9459520B +:10F5C00029A937929E29C00F13267AF0FDDD969E59 +:10F5D0004CB8FF3DE9CF9C4EAF250A3902EBAFA4F2 +:10F5E00013F200ED92E4719135B309794C0EDA65AE +:10F5F0005A5EEA8DFC51A27426F7130FE0C16952DE +:10F6000030199EDB289D345A9E28E710271212419C +:10F610007A2DE542B7D4AE45D00F5F6CEDEB117497 +:10F62000C7F5638DEBC3E9B45E1291AE4E8F8EF3D6 +:10F63000A0359CE5D3609CE1EFDF0D7EABEFA9BE6A +:10F6400067E3D0DDF219C709EA07E96961F40C59EB +:10F65000927CCFC6C15B8BAEBDFEB792E8B514E815 +:10F660003873381DA53E4A3FA083F2E7AB6027966A +:10F67000BA197FC9BF5775F0D310D91EBE3E4E3F91 +:10F6800036F27E3C26EB37516443E4CA66A44F2B26 +:10F69000CCBF06F4CB20DF8CE1AF85B28AE393EBDD +:10F6A000C8265C5F48C4027A64B4F9B02A44916108 +:10F6B0001EBBAFA2DE6DE4FDB3D1E7DAECC4F325E7 +:10F6C000D7F9FA23749EC8EFD93CB52E32F2E5166D +:10F6D000DEFFFB78BF403DA17D04F5537AC9BF53DF +:10F6E00037C55B27760BFA737A99CBB7DECAC62F7C +:10F6F000CAEF92993C85AE7DDE564DC84D3C6F8277 +:10F70000DFA5BE1389E66F53388E7CCF932D7CBC6A +:10F7100021692CF2B090F3A55C49E70DC6576DA4A2 +:10F72000E30E3EAE35BCDEDB25FD7F023F4C93028F +:10F730007F075752D58DF2073C0EE5A613FD5BFC03 +:10F74000FD569053526B7C4F9F6FC7EF5677637C8B +:10F750004A3C3F26E93B65F6BE11BFD38DEF291F1A +:10F7600036C173CA2F449E0DCF3DD81FCA27C44E41 +:10F77000EF1BF7DFF165A02BFDFE51AC9F9C337CA6 +:10F780006F050591CEAED26C767D0AF88EDBA73B75 +:10F7900056EB4857956CE2F6335BCFE6F3F5CCFEBB +:10F7A00047B60E0EB854F46B290E3D1CA1D7745702 +:10F7B0004407BFF338D21D027B6CD54AD9A0E75766 +:10F7C0009BD6972FDF695C7FD76CC832DC7FF5FE54 +:10F7D0005CC37D70CB74437D6B77CE31DCDFB9BB0E +:10F7E000D470BF6E5FA5E1FBF54FD719DE7FFD99A1 +:10F7F0001586FB0DCFDD1637BE29D6BB072DEF6D65 +:10F8000008D071ED805731785189C62F2D0C8F1992 +:10F81000BFA3ECE751E6413982AE08339F2AA6F830 +:10F8200067CF90FC6C36ACB71D216F064005DDAB91 +:10F830006888FF437A775E66140F547AD6D5C75B23 +:10F840007F457F145EAE9CF454C2BCE98AB19CC271 +:10F85000E3B59AAF1FFD30E678ADE25988EBBBB94E +:10F86000BFEFCA2919A09768DD1E8CD36A635B4F6E +:10F87000471D1FD584631A1F6FAF1CC6999B785C08 +:10F88000F38BFA65E8DE58C715EDA711F78838F94C +:10F8900012569494789F417B6C09F40FD6E7228628 +:10F8A00077ECF41F5B6719FDEB78F9C0FD2E2BE0B8 +:10F8B000E34095B19F751C47513954404F94E49BE8 +:10F8C000DE433F674039235EEAE4FCA8293C5E3E04 +:10F8D0008FCCC379E072BB4CC86D35F3731057FC05 +:10F8E00038FAE2CBB4D01C6CDF907FF05A7E6E12F7 +:10F8F0007CB7A489786C149F3C38779BAB0270BEB0 +:10F900006EF5D5D2D2953EEE6FD265C4B3D7E5B3CE +:10F91000FBFA2AE67F5A1CEC463F60FD9DE16D70C4 +:10F920009DB43EA2603F4C747DCA134E436CC0E947 +:10F930009BC5E99525E8CAE928F4F8A40DC679AC79 +:10F940002F32D26B29A7A799CE4B391D979AE87809 +:10F9500014FEA074999B808E4B381EB5CFE5F6DD62 +:10F96000607A5CBBF129EE1F13FCA398D635A13F4A +:10F9700086D637CEBF8F811E079CE7E23885AF7BE6 +:10F9800089E4A83CAF614F39F8C933AC86F8C54269 +:10F990003ED6923C16EF28C99011F797B8DF88EB56 +:10F9A00067067A57CF8BF2E7D15E667F34BACFC94C +:10F9B000304F75790CE7EFE4F411FEBF56EE1735C2 +:10F9C000F7EBC4945036E0A3939742D99B8BC0FFCA +:10F9D00023219FB4CDBA379BE50BB07EFA797BAF7C +:10F9E0005C0CA1FD76B277E4F8A2C0F966BE29F1FD +:10F9F0008531CE5802FE62DA5E6D3F5D83E8D01736 +:10FA000046FE59F61402AE8E28D09F7AF75A05FDAD +:10FA100065EE0605FCCBB5EEFD95400F3F09EF7096 +:10FA2000825FCD23F92240C70226BFEBE9BF58F918 +:10FA300015FDADE90B2A20EF351EA35DE3E7FC566B +:10FA4000ED363DCFAB417EF39BF86DBBE0B3EBC928 +:10FA5000F5B17CE6E7F3A25ECCE1F21A9FCF44FC5D +:10FA6000E2DFB99FF5573C4EF72E8FEBBDB3D58340 +:10FA7000D757B6E6E3F3E35B7D78FFF6D662BCFFCB +:10FA800039F879E9FD1BDC8FFBFAD600DE9FDDBA81 +:10FA90001AEFBBB89F56F0F12E1E4FA996DBD0BFD0 +:10FAA00058E70BDA5D31FC54C7FB8DAC0F38A4204E +:10FAB000BEFFD536E58802FC756E484E08EA8BE538 +:10FAC000F5DE030F51BAD8BE4D82802B6D1DFFAA03 +:10FAD0004CA5FC5F57EBB5AE83F642CDCA1CE0C720 +:10FAE000C8BF2AB9F0BC7E96F58E38ED8B7612B57C +:10FAF0006FD66F2B6A8D76B05FF8D1FB832118E744 +:10FB000084FE6004FAE777AB9E787EE1F689EBDC51 +:10FB1000C04F8D17836EE0A7C689276466AF337F19 +:10FB2000B8CAF95494F7BB8DF17C95F7BB8D3E872D +:10FB3000FEB6F58F4D0E44B952A559766989C7674F +:10FB4000F637ED94E2DBAD4956866B9D3CBE4A75B7 +:10FB5000A60272062C0AFD9F40D906E44BD398DF1B +:10FB600022D917E47AD9B88EA7150702A097B40C4A +:10FB7000E2AB01F5A6F5B8816FE4E285E7619D256A +:10FB800005317A1BEC1EB3FD1F7B2FE3D2154A49CA +:10FB900087ABB91CA3AFC659A86916EBDFA3DCCFAE +:10FBA00021E8AB71FA96784EFE02F4EAA33EE68FA6 +:10FBB000793483C565078AD7222E2BE176818DECB7 +:10FBC000C1F249A419AF3B38BD078ACF11907B59C8 +:10FBD000A1B83903FA630F87E8F74E937E573423B1 +:10FBE000BD254A933580AF7B1583BD2115333D6F0D +:10FBF000077B1DEC188E5FA2765E905C05E28F118C +:10FC00004FEDB41AED3171ED552CC80F2EAB299F75 +:10FC1000EEFF7AFA9DF842E927ECC4219C77EC6B61 +:10FC200004E231229F50947FC5E46F52B3591CC641 +:10FC30005CEF2D5646F705568E8F059EF09BDB71C7 +:10FC400084809E2AB5A71CD2F07A12B5477A678FB6 +:10FC5000E2B7DE86ED9F555CCC9EE0F940D42C9750 +:10FC60000CF6895D77837D38EC7BB7C520A7C3FB95 +:10FC7000CDE8F345F777093548E1BA54E8E1628603 +:10FC8000279779289EA47F2ED3189F9E2997C2DBA1 +:10FC9000914F7583BD555B5C731EF512B547D479E2 +:10FCA0001CA7D3FE3741BDB49ED7278AEF86F489BF +:10FCB000E5EACCE1F504AA18EE21A17F5914EB3F47 +:10FCC000085076C99F0DF5B2EF69D1F6ABF1FAC1D4 +:10FCD000F556A0F8DEA59A13EE75E949C07B05310B +:10FCE000F800E89A6733D2D9A4FFAA86E93DA3BEFB +:10FCF0005D48F9F7086DA756DE540F2EEF9ABD6BDD +:10FD00000FBF8ADD117688276EBDA7E08F9B01FDAE +:10FD100019F10AF1B13C8ECA90A71EE99E2191B05B +:10FD200017FA6FECC7C26C931D96611EC71E9CC765 +:10FD30000E85AE2374BE3AE83CEE41FB38BE3D254D +:10FD4000ECBC05DE41B4A784BD47B8BDE7A2FF62A5 +:10FD5000F158192F5F7EBF4701FC5B6E37F9998719 +:10FD6000F28F09DA530B88B1BF65DCEE2B33D97DF6 +:10FD700042DE5F14FA52D8B55C1FDE22ECA9B291C4 +:10FD8000E3CB9DA67CBA2ADAF1E66B900302BD8232 +:10FD9000781319A29381BFDABD539B2394AEB7F8B1 +:10FDA0001C2CDE42FBA9087D8E7462387B292F7FD4 +:10FDB0008B4745FEF76B2C7E513F8ADFC25FCCE25A +:10FDC0000667ED125B0F42E44D12931F5EE961FA84 +:10FDD0005A33F145B627500571204D917C61329C14 +:10FDE0005FABB83D07DF6FA1A4A8CAA336F9EC78D2 +:10FDF000F9E5DDE05A2565B40F4F7913CFAFEEEB8F +:10FE0000AF84E919EBFC1213CE3EDBFF3EE6750D25 +:10FE1000144818F769F77E8AF68188EF44E977027B +:10FE2000F351FCC59FA0BD3294B7C5EB5B2AEA2B0A +:10FE30003E86F19AEFB88E25433CE60CC471E9F793 +:10FE400067947E0DEC9045025F518A46043DBDD11A +:10FE50007C9308B7ABCEDADF4806BDF912C7F54789 +:10FE6000FD726D3C3FE70299F999C5F54695AD3BAA +:10FE7000F35486E7C4BD98DF217E924F15313BFCD9 +:10FE80006F0DF36EAE1FCAAF46FF60A460247BB453 +:10FE9000DE44E7292A5FF738DE180DD78A719AE920 +:10FEA000601EA7F93BA7CAFC65775AF5E9EADC684A +:10FEB0003B62BD33975F96202FA7BCD8E89F5C704C +:10FEC000D9989773A73558A2527A562AD2CE540F92 +:10FED000EA3594A78E2B1AE29881FE8E9D30ADC72D +:10FEE00007997FB48CC8611B5B17EA216E27E44633 +:10FEF000F0BFB91FA3B55F36D883F678F9E5FE2ABF +:10FF0000E0BF5BFCEDA8579750BD3A2E8E5E5D2892 +:10FF1000F7ED1C07F2EB63FB3BCEFEB2BB0AEF35FD +:10FF200009F361F5B25C651CF0812BBEBF6A3EE748 +:10FF300093E1F13CA1575D0AE006B3BF6D3E97BB6C +:10FF4000F9267E08AA4338E8A6ABB9A3CF53227E90 +:10FF500018E81FB82F9E1F555C13E55DDD4D4CF46E +:10FF60006D33FA9FCDF5087F1091DBB2419E85FD80 +:10FF70006B2ED7A4B2B8C7F1C2BB486C5E95D00750 +:10FF80006A71B3067EF1AEE291D70B733E5C39F431 +:10FF90003786AE9576633CF609457F10F8318A9333 +:10FFA0001A98BD5ADC80F6EAD202BE2FA8F02EB411 +:10FFB0004F855DDD78F321CCE712F95AC23E35F763 +:10FFC000BB6BE2F398CF335ABF851D7FCA26B33887 +:10FFD00004B5DB3D68B753DC17E7BB576C8C5E3F5D +:10FFE00055F4FD20AF3BADBABB01E28C8536DFB3E3 +:10FFF00071E6A1D7C6E4BB2B41BCF55710F8988B2E +:020000021000EC +:10000000E3403A98D71B61C78A7D4A13DC4C6EEBFC +:10001000B81D5B5AD080F298E6A6762BD0CDC7ECFF +:1000200056D267B453976ADD5930FFE6F54E1EE4A9 +:1000300076ED18EDD65D0EC6474117B1BBE97B875B +:1000400042A1295DFF1E972B8E013D76A511B407B5 +:10005000CEA4A9E10371FC0D6F737EAB963718F83F +:10006000AD8CE312B5AA47037FC09941E6C74B3474 +:100070006F0F99707A4E3E29B739E1DA5F0EF4A01E +:10008000F7BA0DAFFD989FFD70E1BA9C78F51D6839 +:1000900052E2AE4BBFE3F3B65CE46BD7327FE4DDF4 +:1000A000052AFA8527D4BE7702F9B49EF3E9121B1C +:1000B0008EBBAB50C179E9BAD9DB0C71CDAE423BF6 +:1000C000E6A3B417FEEC9790AF5D562C19F24B04E3 +:1000D000FF9601AE86FAEDCCDF79B79BE9E12E8D74 +:1000E000E3179E37B291CFE999C31F3863F34656A1 +:1000F00008BEAFE77E72137EA26A246E1C47E4211D +:100100007F5CCFFCC2778BF11E39B413E4AE8EF363 +:100110004DFBA5756E94CF232C3FAFB1B001FD45CB +:10012000ED13DF52E17EA3FB4315EECDB842CCEBDD +:10013000DDC53F65F9917C5E37823F9EF2FB4B99AE +:10014000D3AD1E7ABF3C72B315FC9DC23F3B2C0E53 +:10015000C5E329356CF8A4C6CDF0F589CC6492943A +:1001600001F492C312D02DE22049907FE6B6861D9D +:10017000F4BE4EE99902B825D984173F7EE1503686 +:10018000C8F7F119BF55A0DDEB8ADF6B84714C2AEB +:100190003E84FEFEAC23873AD3693D4BF3894FF78B +:1001A0000CEF4F355F9FEECE60F94277FBC221D84E +:1001B0007776E10ADB4F51F1C21B95B0AC0D8FCBC6 +:1001C000E804708888EB286E1E17E1F10972E5AA31 +:1001D000143B6F754AD00EFAB7B1F80D27F4773992 +:1001E000A75BCE61B901F8BBEA85395F013E2137D3 +:1001F000DB5CD7D3062FB87EEE9CAAB1F777B17A35 +:10020000E70769F9BA8243D9EB0A87EB9721F92905 +:10021000F8C3D620EDCF99453FCB06DCF606D5BB1B +:100220001E6897EB2DB3BD645E57CD7931E67167DB +:100230002ACB6A6D7361BEBFEFF6C6F019D5036BAA +:10024000A1FF1B9FB4631E57DA91D75519F41BC544 +:10025000EF3552948F36723EAAD398FE6B2C24E170 +:10026000ED12F0DF87F5A52077AFB27CC30947DE3A +:1002700063F9A3A6F5A18BAF1BC2EFDC35F17D942A +:100280009F8F0F73790959A4587F9256DCBF12E6ED +:10029000C52C27E27E7E7F4FDCF5E15D1BF79B0CD2 +:1002A000B2F71AD5DF10D736BFF7737BAA0CAE3181 +:1002B000F5DC6763B8575CAF210FE1896F53F96FC5 +:1002C000DFDDE1BE03F59486B87DE39143F910B319 +:1002D000C93C7CA88AEB0BB4CB643ECE09C4837ABC +:1002E0006AA96667F103139F5B8BF747003E8B7526 +:1002F0001A0C722533AA47E4583F441C3B8C84F403 +:1003000037F362F2BEE8FA4E40AF54BA99FFD5CC4B +:100310002769C554EFE024502E8C89FB9AF9B64E1C +:100320000BBA219E4DE5E73C8B7FD2F50AFC137298 +:10033000BD0FE793F3A785FE83F52FD967E44F6BD5 +:10034000BE6AC02BE67EFCA3CD88FFC5FA9CE6EE14 +:10035000C1FE2DD59AB3A1FD09EE1EB4B7A87ECF7C +:1003600086ABE033A1AF87F8AFF0A6C5A0DF81AFC1 +:1003700021447EA6784E12E8C13A37C329C4E44F1F +:10038000EF728F6C6F749AD6BF332E665FD515935C +:1003900024572AC83BF33B753D92BE3F39C62FF721 +:1003A0004FD6608B2DC6BFEE2CF8D2629713F40C9B +:1003B000CBDF2AA1EACB9A1BF5670ABFA988F70908 +:1003C0003FE9307F66413BE6775945DE058FFF0DFB +:1003D000CBFB4910771457E1CFB46D6F567C3C5E70 +:1003E0008278AC9EFBE106678FE20F65FE078ACF3D +:1003F0007E6E1B3F3A3E3BC8EDCC5E501EF4BADE2B +:10040000E6C2AB06F928B4AB5D8EF8B8ED656EB701 +:100410005D8B7C9E94E13BD6CE4726FE12CFA3781F +:1004200098C9C184E2439DB178B8AC89D286CE9395 +:10043000DA44A690D4C47CB77448EFFDD4C05F43BF +:10044000F878145C2CF8EB92ACFF19E898A85C1DC6 +:10045000EF47A2F78D85B6D5906F45CB9109A9ECF2 +:100460003A8D5E3B671CCAB6D0E7AF01FE8AE9470A +:10047000D7F78EE0387EA5B27D365D97D6E5003E93 +:1004800038ABE8A9F6F163E71FB33CD9E7EA9E6D04 +:1004900054FE8E66DB717D3EEA6638E4752819C32A +:1004A0004F9BD5E075F6B9A8EA7592CE959CE0739E +:1004B000509A5563DB27767B72CFFD81185CB91BA0 +:1004C0005E4D84381FE39B07D51ECCC7B99DD66E01 +:1004D000A3ED1CD3E4CCB5F47EB69DF1E3B1903529 +:1004E0006EFEF36C3BC3CF9BD5C06CE82769DE84FE +:1004F00072D620C901907FE21B9B7F6E474BFCBCEC +:10050000D2CA68FDF3B1FEC3B47EC00D3EEE7F27B4 +:10051000AECCB8FE763EEE0821B5202F8FA619EDA1 +:100520004DBF9DAD7BF3A3F52F8EAD1FF3B3E6E278 +:10053000F32538CFCFB1E7F9762617E5B92CAF4DC3 +:10054000D051D4BB325ADF4AACEF08FB2ECFCEE3FA +:1005500006BCDF02E79BF39F163AD87C44E3A6046F +:10056000F56689C6FCF513FAC3C7E0BE9CF07D9919 +:10057000D2DBB87FEFA8D58BF900ED8E694F6FCA3B +:10058000803C0923AEB7719E51EC3F946371BACEA3 +:10059000714C49760EE2E10E923BA29D237087904A +:1005A000EB05C27F7AE500EE176BE1DF8B76CB4D72 +:1005B000B82EBA5FB11BF72B4EE8EDC6FD89152E9C +:1005C0007E5E44DA37D1BEDEE5B897E1F9C99FE235 +:1005D0007EE505D907E5787E4245F45F7903DB3F88 +:1005E000EA62EBD402815F4D76C64B995D32E0C87A +:1005F00044B8FE84147C26C2FC9A067CEF8F7C6D86 +:10060000C3214A57BD97B81CF4BE24C2E24C151C46 +:10061000D75728E12C581F6AB2993FAAE54FDD59F8 +:10062000B03E1CFF3413D78BEB94FD38DE498A179C +:10063000F1FC4213FEAFB01FDA0679138B14898CDC +:1006400023C3FB05FBD5C08E2871B3BCA0126AC5BD +:10065000819DF1326D1FFC65157FA2F3678987EFDD +:100660008D38A5562927AC1CC7FBD9CCBF341A9EA0 +:10067000AE30D903625E2B943D556097B4809D41A6 +:100680001FB5283B9474DAAF5D8304229BC4CFBFAF +:10069000CBC9B630FB60B2650DD08D58997DB0CB1B +:1006A000F5D776B40FE87BB00F2AB87D5061F7A27A +:1006B0007D301A8ECFB1333BA1FDE254B49F228E20 +:1006C0001F66817E16F9E402DF0BFECB54CA4F8011 +:1006D0003C2FE07C28F0BE4DE0FD2B9B089C275072 +:1006E000A118F1BE8DF35905C7FB2D10F7027E3D11 +:1006F0009F79CA0BF11881F7AFB898BF9BE37DB122 +:10070000CFB203E43306EF779C1FC0BC8597B39943 +:10071000DE17787FC89EFC8C78BF4CE80F8EE76BA5 +:10072000386E10EFFBB9DE33E37CF3FB6BC5F98465 +:10073000E3F8283E36F26FFBEE1C8CAF94B8EC6801 +:10074000072CE80D0EDE4BAF995736FD662FCA51C8 +:10075000B20F3EB3713B6CD43C5013EEA776C34E40 +:10076000D87F539EC7F28ED2B25D55B09FBDC223D3 +:10077000A1FF69985C98ED806C17DA69954A83C887 +:100780008F1B11EF57682EC4DB8A523326BC6F963D +:10079000AFDA3CDB887C9DED30E617940BBDA9DC1D +:1007A0001B42BDA9DC1B01392AB7737F8FE36FDCC5 +:1007B000B1E73AECE2EB81D0D3425E3B1CD39460CC +:1007C0000CFE1AE26B25578BDD5FDCC1F9F2078A5C +:1007D00007FDAD1D76661F98F1D850798EF72B383E +:1007E000DEAFB033BCDF311CEF173B62F09BD3CEE2 +:1007F000F0FE58F30A841D5B63B263DFB71BEDD8CC +:10080000447CFD215FD7A3F4F4325CAB7811D70AA6 +:100810007A2A1CD7DA004FCEC4751571AD90E3610A +:1008200074B5E61A706D39C7791DCA9871EDADB10E +:1008300074315F2B46C1B5BB1C14D76A580E716D5D +:1008400085C0B5495E03AE251AC3631DDFCBC771F2 +:1008500074A4313C6BC66389F107D76F265C21BE57 +:100860006F4921D9E89F1BC225D3E2E2924438C4E4 +:100870003CAE16C025DA5F029778709C663E3F9AC0 +:10088000A2A39D1FC529BFFDC6212A87BB2E123CEE +:100890005141E0157FE48FC71A8A102F1087273A3D +:1008A0004E8157043E11EB638BC2F249057E49E449 +:1008B0001F15D76BC52F2732FF17E21E336E117835 +:1008C000C55C7F8795E199963FBDF59F8A6316EEDB +:1008D000A7DC47E5A45CD9867AC9AC075BC05B4D51 +:1008E000CBBFEC22E110D4FFA773727A1C7D6CC6DB +:1008F00033669C32567CB328EF22E61B8E863B3A49 +:100900009430EE936F51EEB3833E32E31A333D736E +:10091000B24903C40304DE49C4C750EE2E6714076E +:10092000252A47F538E2A384F5D82F5E2B2E3AEF1F +:10093000181117313D50E1667A20115ED9E57369CF +:10094000B179AC627D69CFCEF925EE37EF55F1DC98 +:1009500084F6F353519F26C24B6D26B9EB003DA29E +:1009600045D7AF8474E91D407917B86A347D21EE0C +:1009700013E129B1AE9401E81F9F386E392589D95A +:100980007D0FE6303BDAFC3E9A8762C45524A31003 +:10099000F9F81EBE1F3311CEA22B9893F9AF42D89F +:1009A000CE2A6E87A2CF701ECF43A05D0DE4913C8E +:1009B00058270276263767E64A2837CBE0399DD795 +:1009C000F22A16373A5728613CFD4CB90DE7F5D4A9 +:1009D000C72C4FB13D85F95FCFCC72F80ED02E7C7D +:1009E0000CF5D275F99CA3BB0870C0AC24EE2F485F +:1009F00067E35C921CD98071F339D32D21EF7079B4 +:100A00007F3089F7235DC3F85B1DC7A3103FCC9AE5 +:100A10003D7C9FC1D3495EAC1FF2E7B368B99D9698 +:100A2000EE8773E8238785C55BCD74FD98D31D08D9 +:100A3000638BA1437D9E5D7750FE77DCC8E256470D +:100A4000AB6C98A7E380103BADF7A1FC9C9478FCBD +:100A500021C6657EBE9F8FFBDCE47E5CDFCEF2BCF0 +:100A6000DF8D8A14027AA3A22E82631527ED7F8878 +:100A700016FD4A521AF6EBEC0BAF23DF9E4EE374E1 +:100A8000D025B4D7CE78983C855C5A18F66BD2EF57 +:100A9000ADAB46C807E92EAFC9677134422488AFB1 +:100AA000C11F39C3E9BDA256C671AF70EDBE17E4D0 +:100AB000F15CED1BC9702EE5D2410B01B95BE12A57 +:100AC000B90B9EB7A7303E063A038E5A51F5A56F73 +:100AD000C0F3FA7AE37C9C4CCAC171942A6C3E60E4 +:100AE000FEB2660F6F97AE7E41353386FEFE9FFDE8 +:100AF0008D14B3AE887C167B82FCBE44E39662F50F +:100B0000AE1CF5474E28DEBF07F6CD048AD879180B +:100B1000751E1282F86F9D8F44BC9CBF30CFA633E8 +:100B20008FED17E2F29556BCBF2907FC97830A8B1D +:100B30004B9BD691523A57D9E9E04F67F37366AEB3 +:100B40008C765E6931C3F9A51CE7D7E90D18EFABC8 +:100B50007FA473770EBC97B3ABCB3D3C6E1A433F7B +:100B60007284F9E79699F83CC5E4FF2FF599F206EF +:100B700079BEDFD1FC675CC03F0FA673FE992DA143 +:100B80001CBD2E791E01B910745A9224E233C4633D +:100B90008DE18F217EE0F36BA67B227A9AE964E6F1 +:100BA0000B33BDCFA498E89580FE89E85D5A5CFEC2 +:100BB00017A5EF05ABCD0A7CDB6EFD6D36B78F88D0 +:100BC0001CA34FCC74BBA07952404F9C1B3C87B8F0 +:100BD000EDF464CF57F07C2C2AC778BE279787E8BE +:100BE0003C507970C6CAF3DB53409E299F59A19EA1 +:100BF0007A5DD21D207F8777DD8BE306397546E568 +:100C0000C84CFF61F247FF57447F7387CB91399FF0 +:100C1000ECB3CADFB7409F53BA2D4CF2E055E8D38E +:100C20007AE2FA4AECFE5611676FF73606605F7A91 +:100C30005DAF05CF016A197C5E590BFB5D6B255CCE +:100C4000D634D28DFDD59A58BEC4D4A71E2090CFDD +:100C5000FEC864E2037DA535B1FC09FA1EF3270442 +:100C60007E17E73AD2F73ACB17319EBF94E233E6CC +:100C7000FF2CEFAB403BA2939F8724EC0491F74AF3 +:100C80004CFB5E1AE1C9C4E8FE90A64B616647249E +:100C9000D80723AE667BC17C3DDEF1CFDF003F622B +:100CA000599E8A7EC4B2C1881DEA7BB8A0A316F300 +:100CB000DC6A2517C4E38E7FDABC03CE415A5EF0AE +:100CC0007E5C5CD27AE1091F8CA3D5BAC7970EFA75 +:100CD000613B5BB71CD30A26AF1D01F7046BCB6BDE +:100CE000BD3312E799DC93CCD7F7F6AF1D7810E24D +:100CF000DE7DAA0FEC97C53CCE5FA7EC59BD96CE22 +:100D000067E722C9B78D3EEFBC61EFA60E88639CF2 +:100D100057D1DFD775E96036D819AF7DCF8EF6E8A9 +:100D2000F14F0F3E8D79267DEA3C18EF50FFAFD78B +:100D3000D8FB8F5F3C097A6679FEF22268C7A190E2 +:100D40003DC04FD70D36BF0BE725D4F5AA7341FF41 +:100D50002CAFDD6FFF2BA053ED4FEDD783FD31E8B6 +:100D6000A986F9BC2E2958994CF55E5681F73B1996 +:100D7000D08E8FF874A46B3701BA8AFC04610F948B +:100D800071BE6959E44D2131743D3798930274CE98 +:100D9000A9E5790C8BE400D8CBE75CD7A7A07FB29C +:100DA00096E52F98E9B51C707A2AF4CF3B795D9CC3 +:100DB000F53BA7F60F5B83E00FBE81D9E7E6F77737 +:100DC000707A3B7EB7EE008CD7F17DBB0BE0B5238C +:100DD000417EE6D464AEE7DD63F397083C43E96AFD +:100DE000B7C6F80129DE5F9F1C1377BDD6F6BF9A00 +:100DF000CCF4C02539B819E85FCAFD2565DC5F92DF +:100E0000A85F25A3F831281F219D96831F6326BB69 +:100E10004EA3D7CEC5DEC9063F06D1DDA067CF41C0 +:100E20007C0EF098B26C3BF4A3EB02F36724E2DF94 +:100E3000E579076FEB88D1775D563D1BECDCCE1B67 +:100E4000DECE82F9FFCFE2DF213EABFD69139CAB22 +:100E5000F550C1F2F1A0FF62F8F869988F6BE56375 +:100E600033FD5A16E5A6102DCACF828F87F3A584CD +:100E7000F6A8E0EF44F301E5C01E157C9EA8DCB99E +:100E800045D3E2F27FB49E8B23CAC16ACE57770066 +:100E90005F8D07BDACBB400F2FCC7A17EDD657B88E +:100EA0003E1EE29394EEDBEEA17A27F4AC1DE3E85C +:100EB000472FA978FEFAD167D6FF00D68DCEC10A9A +:100EC000D787B88E97BB56D07EDD00F64301CE4F54 +:100ED000A712E337BC902CE2E6C67CDF9FB87E9376 +:100EE0005ECED659AD9CD27B265F276EF43E93042E +:100EF000EBF94CBE9F62469B1A775DE61082146444 +:100F0000BC6E01E85F70D8584E1BDA9FDE6C81F82A +:100F1000E08DCF99DEF37DD5E6FCC87F4F36ED7FBF +:100F200032ADB7F64B23E769FC0BB77B9FE3F9BF04 +:100F30003FE1E70936F3F3049F877DAEF47A18F6B4 +:100F4000B9D2E72FC23E577A7F84EF7325D9633B2E +:100F5000375E9CF7A4723A344D0C1BF6698AFDDFAC +:100F60002D709E12E001B7CACEA17351B405792A43 +:100F70001C2F5A92FD7615F6737D44304FE5AFCFA6 +:100F800077233FECE6EBAC19C788F31ECDFD52A3E7 +:100F90007454C04F7574727075A0804F18F0CDDC1A +:100FA00009FB1F8AC1D3A91AB32B1BB9DD16BA449A +:100FB000C2CF4AD1F2A72F91830F313F5B4806DCA5 +:100FC000017F51165EDC4B10C72D2EDA85F617E037 +:100FD00040C06578FE580EF8BD5E443CB77870DEC0 +:100FE0005D0CB7E8C370DC10DD64A413C3E745AF44 +:100FF000A35F71716F7C7E8BE637ADEECC8BD9979A +:10100000503F18ACE7F8C8157B6E826AE22B733D3F +:101010006945CC7FBF249FFB7B783C44CCE78E4D59 +:10102000DDE82FEF2AB279C0BF60C689669CAF1693 +:10103000B17D64CACD6C3FEBE24B2C5E880C9319FA +:101040003D9F4DE579BE2DAEA00FFC98753E13EE89 +:10105000E5E74B95E51BF1BC19EFABBDAA09EF879E +:10106000D87AB89DCDE7998F09DA51CFEE63FE812A +:1010700056B787F11F09A3DDB3C06D99F59007E25C +:10108000566C7F66C920417F4949AF07FD4F0BFA77 +:101090004864EA0C3C87B809CF1932D16F01B87A9D +:1010A000D3A11E4FE7784AFF050AD909E7CB64DAD6 +:1010B0001B749003D5BD09F7E3407EC338C647F6DD +:1010C00058FAAA49A77680082CE07E35F1BB1513A3 +:1010D000EC87900F62E66FC4F898CAF94EC4BBCA99 +:1010E00079FDE57D2CDFCDCC0769F68BEFC239CFDA +:1010F00015831A9E036D9EF7E171B0FE0F1E8338B3 +:10110000CFA524DF7698673B9B67318FAADC26C387 +:10111000FE0EA2B0F912F130B37FB5D4B46FCEDCBD +:101120002F715EC256CDB48F8CE3F80ADEBB26C7A2 +:1011300021C3B9B5155CCF0CADDBF65C1ED762E7F9 +:101140009CB6F6CD1E31AED5EA62E7FE11D7F2515C +:10115000F4DE76B68EF0F3054A8B4912E09CD23E5F +:10116000C2F8EB114B38D91B5B3E6CD857EEEC5BE9 +:10117000B518CF6974B9AAC0CF564A58FC52EF25AA +:1011800018CFD4C9213918332E112F51B95F4C957E +:10119000D8B8049DCCFDBB7DD0680F7D2564DC0FE5 +:1011A00071DB03C6FD1BB76ECA32BCAF599F6B78AB +:1011B0005FED996EB8FF92DB787ED0FF081ACF0FF3 +:1011C0005AB1BAD2507E59C0787ED02DB5C6F383BD +:1011D000EAF4DB4CF2AB1BF8FBA8D4FD5D18BF258D +:1011E000F997B923F979CB468B2387D879426807D9 +:1011F000C689B398F7BB7DA409BC609483CE5039EF +:101200003B6FA7D7B3AFDC03F12A9F82062E3F576F +:10121000A89AB072D56E166FA9CA886FCF0B3D68B9 +:101220008E4F8873014BFBBA910FCA4CE70096B8FA +:1012300017C63DE7F33F34D3B91809CEBF18B67EC1 +:101240008F757C3CCE34EAF878BB25A4FB98D39B01 +:10125000787C631DD7507E179C4748E9D10D8F26B7 +:10126000B2F71A95B79D69F978FE4586BD424919CE +:101270001FF577127DCE98F2D1DAB91F9FE82BC601 +:10128000749E6986DDC3F84267F868A7A487E1FC0D +:101290003C731C55CD177154E339188E9D442FA013 +:1012A000240A55108CEB8772ECE11D12E493B37D98 +:1012B000A68D375870FD69BCA8EF81FC94A61B145D +:1012C000DCE7582D6B585ECD66EB931F72EF217FE4 +:1012D000E2357DB5E1FC0EF77617C889FA347B9FBD +:1012E000683C6D13D5D5F1EC859B52181E3AAB04C2 +:1012F00066A6207FE86E168F08E37968222F3751A3 +:101300003E2E058E2EE44322F0019BBFEF403C258C +:101310008EFC56A53039F31748612BE497AE246153 +:10132000EB0876659BDB12D79F5198C2F359AE5CF0 +:10133000C573EE5471EE5E163B77AFDD749E65218A +:101340006FF7788A9DF181F7A021DEEDE7F2B0D842 +:10135000B38EC4E25971FE8FDAFF3EFA99CE8C72D9 +:10136000FE8E886FEDE6FB9A2B2F5902F1FA3F9023 +:10137000A2209D9ED5AC71C7F700EF6FDB141F9EB6 +:10138000B7DAF8B8859D17EF6E9C84FBBE53FE8AD2 +:10139000307F17EBFF622EA77E777807498138F5FB +:1013A0003B4FC2EF87A8C536F0E591333734E0797B +:1013B000B1BBFB295EF446C797C2D71BFFBE8EDACE +:1013C0005CC0432765F4F7D4F4B27CF3A5C5FBF900 +:1013D000392D3DB88FD1FCFB2525B5411DD6E5A59E +:1013E000F5911D887F7C9E72FC3D13E2DB86BFAFCA +:1013F000326CBFA586B8AB6D90F17DDB8F7CEDF8CC +:10140000FB206E811BF5FAEACCE8B96165173B76E3 +:101410004208C67C6E98F9DC216197A9265C29EC0C +:10142000B13A123EA648C3FDCC89ECB1BD29DC1E01 +:10143000BB81DA6374FE6FB7B13C5BFF16A9188CF1 +:1014400046C7166922E8AFA7F83CBD5916C4F35B3E +:101450001A13ECBFFBDF5CCEDE2C8BE03EA7366FB1 +:10146000D0ED1BA17C610ADB27A85E61E77EA87630 +:1014700096D73574E5F93082AFE7396D782D75323E +:101480007B7BC1D5E7B2465A3F4BFC4102E3A1FA50 +:10149000256EBED80BD03EEC178CB0F32BD4A6F73C +:1014A000ABE2C9B390C3CD6AE067A03F764A9BC266 +:1014B0000ED403633FD772A6FCF9F5CD554D3F918D +:1014C00042EB7DCDFA0F1E908F1D41E3EF4E89EB6D +:1014D0006B5AD08EF477772483BD7931297836859D +:1014E000FBBB617F615BFFF376D4A726BA9BEBB9A8 +:1014F000CFC9E653F5B0F7E417BA67798C9FA4CE4D +:1015000029F1F5437F07EA9F6DD5FF0DAE0F56C455 +:101510008F43662A15BF06FA556B811EB8B6F51FB4 +:1015200040FF714A92FE1EDC9729FAFBF0FD3F59FD +:10153000F50F989EAE727D981FDDEF90689E21702A +:10154000F1617E2CBD3E1F9D33EC814136CF7A5038 +:10155000BBC67976D2EB1A585BE8F73D65F1E3ED4F +:101560004F717EA27286F982623F8CDF4DF478EB78 +:1015700097284FE75F7562BE7B2800FBBACE4CB25E +:101580009003317A4E9C63D0D8CFECC281FBA50387 +:10159000CC2E2478FFA3AF790F407C77E5142EC7BB +:1015A0007C3FC61DF71BF7498B766F4E95C6249F6F +:1015B0000FF3728DA94C3E1F4FBD46F9CC60F50864 +:1015C000395515765DEB62F57E98CAF82C294D12D7 +:1015D000F9E9F94E26873D29D7363F4FACC8FDFCC7 +:1015E000FC21E441F519F3F51EE1F220F415ED6755 +:1015F00019CC17ED6730E9DAFA9959F205F0B1D84C +:101600009720274B067F78C0C9F8E90EDEDFB38A42 +:10161000BECCC9E477B97364F95DE564F2BBDA69FD +:1016200094DF5B9D4C7EBFEC64F27B9BF373C8EF51 +:1016300047203F90E7C8FDF8E49451EF505C7C17D9 +:10164000D4BF5891F83E6FF21B29C6FE58DC1B240C +:101650003A5B2C9F89C50D14BFEAB8AFE34D637D9B +:10166000EFF0758BEAB1CD50EF3BBCFD1DFFC6E836 +:1016700007747C3E8E5C0A3ACAB60637EC8B4DB4D2 +:10168000CE059C6C9D2BB7B17D17E4246DBFD03087 +:101690009E6D40B7A1F184A865177F3CA1B8E3E92E +:1016A00036D617339EDD50AF18CF82ABA74694478E +:1016B000BF904757448675DBAFC45F17CE38D9BAA1 +:1016C0003990AC3F09F432F397B886397F25DA1F99 +:1016D0007356A90843FF4A14A6078916E99163C601 +:1016E0005792DF20C61DB4C4FAD97AE3EBC9E79C50 +:1016F0004372F71CF2DF3EB69F87F2F58FA19DDBA8 +:10170000C7B956E1FEAF4F98DE7CEB4F5BAC69B4D6 +:101710009DD5197BBF03D75F3B59DE4BC3C51C2743 +:101720004C434F19DB17D938919DA7D62819CF55AF +:10173000FBB59077AEFFAE41BEDFCA913FBB7C7C6C +:101740005EBD40E9D3CDF5528F23F7DAF4D2DC2F1A +:10175000A0FD955308E2E3C6FD2A9EBF25E4E67688 +:10176000985B760E820E79145FA5F7167A3F0846CD +:1017700037ED47309B10F76C2C1752F19C04BD17C6 +:10178000C651ADE9E7E14AF5D04770A57AE8775C44 +:101790000FF57D1E3D7402C644BF6FA23CD40D7C84 +:1017A000A88479DE2FB747F8584BF28FC5FDBDA945 +:1017B000B6DE035A08F206F3D93ED544ED46C0DE44 +:1017C00080C49504BF6725AEE58FAFB58311B083A4 +:1017D000E23AF0A3BECCED9436685F83F62CF8FBBA +:1017E0003FAF1119E3F0E6FA1A27F3753F85F3F3DB +:1017F000C475685FE9578CFEB54A7778F7EC22F834 +:10180000BDB33BD83EAC2B77905585804F8204CE3C +:10181000E154E915F23745BFBDA953193EE5FD5422 +:1018200089A42C2C88EA91CA7E12595084F806F3B8 +:1018300066A11E0FAF275808EB7D9A02F1BED712A2 +:10184000FC4ED3E372303F35C6DF584E8C7885CEE0 +:10185000FF0DA9E371FE6F4C65EBD074B8D2F92F80 +:1018600080EFFA9C4CFF3D2E0766C2F360060B41E9 +:10187000D3F2BE54C62FB352E77E7E3ED941D8EF95 +:10188000F202FFC6C6AB9FE5FAE1E8F8A00EED5400 +:10189000FD6859E724FAC986E6063CFF78C175FD64 +:1018A0009F9C85FCDB2C15E3818D8F18D7911F72CF +:1018B000FCF3D2B5EB19C41154FF2D81767710A635 +:1018C000FF426EF6FBA30D13731E65F0911A9899F3 +:1018D000D1736DAB5CCBF0DCAEAF3FE79D0DE76045 +:1018E000A95C3F2F74B7AB6B615E21DF348E3E0F76 +:1018F0000EF58F6A6FC33A15FFFC97CD1C2752393E +:101900006E4865F2BB16E6E785F1FA1DA97F41FC3A +:101910002FF4505061FA86DA4D21B09B565DDE748B +:101920001C96A9D5646F35C437285FFE2DF4F3CB20 +:10193000F643C7D94F12862641BB941FFF8E8F678F +:101940000BE7C76F717EFCF6E719D7D753191F272E +:10195000C29F02870BFC4DF5FC23A94CCF7B9C5FFB +:10196000CCBAF10FA90C77079DD7B86EDCFA05B495 +:101970004FF1C641685F4F2523E2DBE7F8F87F9C13 +:101980003A846F7F0CDF2DB5EB3F81EB10DE2838FA +:10199000F91BC8938BE28D7699E30D25D69FEDA7B1 +:1019A000F88BE7D5DD6999179513B53F3E0EA94F22 +:1019B0001DC2214751AFEC6638A47EA8DFBEDE30E1 +:1019C000C8E1242EEFEF307DDCA0F6DC09FA594D9A +:1019D00067F3A8A4337CF92A9FD7F7A494B8FECD67 +:1019E000AE687B5DC85F5B587B72F22CF67B204251 +:1019F000AF58256C47F887EBD3D977A29D45FC2AD1 +:101A000070AAB99D5FA40ED95FBFC071DD2FF60724 +:101A1000EBEF40BBFE285D23B17405FD62991743CF +:101A20004F8EEB12E1B818FAFD078EA789B5334443 +:101A3000BF607C3D7BAB4B167CF2BBD411F8A39FFF +:101A4000F3C7C5287F5CE4FC31908AF884CDC3EDF0 +:101A5000E38CFBCEFF90CAE8B39BD349CC97B9FF88 +:101A60000FF2F743F4F09C7C2616D7FAF3D356AD69 +:101A700006BF6593ECB3D0FBFF032FADAD0C008028 +:101A8000000000001F8B080000000000000BE57D37 +:101A90000B6014D5B9F0999DD9D94DB29B4C924D9C +:101AA000B281246C20D858032E21C42841264F022D +:101AB000448C88888ABA014C42802422B6B6D5CBA1 +:101AC0006242785A637D142DB60B420B16DB88A94F +:101AD000A518700382F80EB68AD6DB1AC4F25084B9 +:101AE00005B55D5A5AEFF9BE73263BB3D905D4B696 +:101AF000B7F7FFE3ED3D9C33E7F9BDBFEF7C334B18 +:101B00000891482A215790FEBF1C13AD17F38A7C19 +:101B1000D42779F208991420AACF46C817F0373E87 +:101B200054C629022129842C946BE29431744079A3 +:101B30008BAB6604213DA57DF36B22F4BF2789F5AD +:101B4000BF21635D798A8BF6F7D27658DF49FF2D86 +:101B5000127263438FE8D18DBBE1A3C373D408F342 +:101B60007C37C944085DAF75A67B9FAB804EE334DC +:101B7000B9379281FD1E4C94B1DF84A13E2981F6D4 +:101B80007BFD1451D6D37E374E13541F3D57253F4E +:101B90005702DF578E2261FF32A8C338B96F4EA4B7 +:101BA000735CC69F57B988DA49E7A95288BA3542AB +:101BB000BFB17C9F136223CF73139F672261F384AD +:101BC0003FBF95EF6B4269E4F157F2F967389FAE7A +:101BD0004822B09F7566805FBE592D56E8B81551F2 +:101BE000F0902A95AA80AF180A3A733E21B7D0B177 +:101BF000263AC1AD80735A3E2C7A2AE1B98782C356 +:101C0000990F94E01D0478ADB0A913605E7BAC5AC7 +:101C100005E538499D08E54FCCEA242809F113521F +:101C200048C8144E3F53AC36BF184FFF51643EDED8 +:101C300067656D5F0C85FF3F53397C092102F10B0D +:101C40005F5C02759F08F35FE1DAF78E40FB5FA1EE +:101C50008D3B2A858DCB500EC7F1BA88FB42F86CBC +:101C600037FFD065330D3CA7566EB779AC0087536C +:101C7000B19E5AD867AB73BDCD45E1FDB2A7D3EA9B +:101C8000A6ED1F271084E3E93875369CBB753B69C8 +:101C9000E8A4ED629CD0D2A9835F8362C2F5E62AF4 +:101CA0000C6F6F48EA5C986F8A556D84725A16C53E +:101CB000139DF7D6E4BE457AB8DFC1F1343F898D74 +:101CC000BF4566FDC2F739973F2F96046F1CECC9DC +:101CD000B6EF4331027F4E827F51FE293EAA4C9FD0 +:101CE000E1A0385B2EBA4DB42EE70A11F9D41BE2FD +:101CF000532FF2A98BF2A99DD2871C993E82BC7FFB +:101D00004514BA1CC3F7590ECF238C1FC1E9B6DCAA +:101D1000D123123ABE98F35B78BFBA2491F1B19BFC +:101D200054459AE787A17DFF10F7ADB07DE79B6B27 +:101D30001E85FA4C657F45226D2EB9CF319D380046 +:101D40001E2662C946385941AE491C4E749B04EAAE +:101D50000BADAC2EC5CE2709B4CC72FA568D04F863 +:101D6000B599DD2E5AFFE0E80722A174B6F1A1D3A0 +:101D700002A1F2627B8090E46C98478619E1CFF46F +:101D80008530703EFACC2569EB51D05C7994A81669 +:101D90004ABF571605A69278C378F2059DCF16E87C +:101DA000F50A803F2BF1C65D8A64FCBB9C549C15F0 +:101DB000E74BA3EBC279E4CF880FCEA33A3DD564BD +:101DC00024218981BE1F3563BBCD3D01CF456CC049 +:101DD0006FA1732E44FED3F625DBFA9EB89FF6EF73 +:101DE000FE3CD67D2F9C3B50798CED8778EDC0D79B +:101DF00062B51BE43B2116DC9F89FE077C362E482A +:101E0000F79BCBF70B8B14E8F64F069EE761B1E624 +:101E100015C0C7AD56A2C6E7A37C7815F86198999E +:101E200076A0706C57049F97F66B7F68CEF26C902B +:101E3000D7AB25F77002744EB60994CEC7D275EFB2 +:101E4000A272472E223685D665273B7FFB7D8E7595 +:101E500071023C97C84CFA7C6CC07F46A0708877B2 +:101E6000D6552BF41C321F2F50C0C178C1A59099B4 +:101E7000F940B7BD2241F9E0447868FCA37E8308AD +:101E800087ADA86A08D057B944BC56DA5F70B279FA +:101E9000AF2401910C033C504540CB52E2C6F27E88 +:101EA000D1730CCE6395295EE9FEAD26AB6F890038 +:101EB000F8AB79B50AE15EAE1CCE0DC9B368720805 +:101EC00020775883ABF8F5E55EC5A2C87CF58F1086 +:101ED000DFFC03F98630BD3C6D28933B7BEC7D3302 +:101EE000F57CBF5C61F26939976B44627CB65056F1 +:101EF000CD89E7E0F3D55C1E8E4862F2B39544E6E7 +:101F0000E36712D9BCD3EEF5B50FA2F09B9224B8CB +:101F1000410F576CA99506BB42FD06717D989CAA9E +:101F20003A60DDD6EDEEA33E07681F19F57BFBBBDB +:101F30006406CC5FCBE5E7DFF8BC6712D93E86F0DC +:101F4000FA41C13E23125CB213FBE1929D08E7F413 +:101F500030B88871A3027EBA0E19CCD7310BB84EB7 +:101F6000CF50261F872719D719CAE51F95FB1727BA +:101F7000A2DCF76540BF97CD6C7FE1EBBA43EBBACB +:101F800071DDF96CDD4920E781FF5DFB5E10757640 +:101F9000D7A4808780DD033C6C2A0CC97BD9E51768 +:101FA0005B687B7114393F8E9F9FAE330EF6455AA6 +:101FB000181EFDA9EA9550A776C17858BF67A88278 +:101FC000F2F2F54126B29EF2656DFAD0EF83D8D4D5 +:101FD000E6F95522A3879EEC76E72C8A2F3940DC60 +:101FE00016A4F306947BC55CBEB46EF71078EE1DA4 +:101FF0004465A66EBC1C986525363CCA3FBED0FA27 +:10200000533E6A0F0C4DF044C08B56AE5ACC44116F +:10201000712DC0710BF9B8F07EB68777C5C1FC2B66 +:10202000A1FF370899CAF1430F8CFB9BC479A735F0 +:10203000B03EAE8FF6DB9E3BDBB01F7C4EF9A83D79 +:10204000F78938B097BA33A91E0039F5928872B271 +:10205000DDCEF0D89E5E47F4F66899D32F1E8679C0 +:10206000CECE26D329FE8A9D1E72913DB4EFE2DCCE +:102070003AAFE0C0F66763E83CDF4EBC08F12EE7FC +:102080007948A50DE0D249EAE8F965C52FBA695942 +:102090001620FEF105D09FCA7981CDE7B2EBE7218A +:1020A0009D308FECA6F400E3027EDCCFF6A3E7863A +:1020B000A32DCF6490DF1A5F52BBEE5EC07FB97272 +:1020C0004D79229DBF714B76BE48E7AF74F6C8B319 +:1020D000F2506EB7029DFC2A456D4BFC5FB4E7667B +:1020E000109F19F03E218BE981294D826F3D854F6C +:1020F0007B989DF018E7C7B12179B716F9AB48B3C3 +:1021000013D4C713CF6D07AF83E7E7B0837F06CF44 +:1021100023D8C19B12991DBC19D6A376F09389CC04 +:102120000EFE39AEFF15E1768D42343BB40BE673FB +:102130002472B9FA7B668F86EFFF1E7EFEE5F4AC53 +:10214000BD4097924F6274CEF8F40ACEA7938E5298 +:102150007EC91B48FFDD94FEBD94FE4E53BB49CCA7 +:102160008E4E4FFE0BE4CB928719DFB73A7721DF13 +:102170003DCFF9B39BAFDF9D2B56033E5F26A222D6 +:102180000A03E76BCFF43841AE87F39F7AD648CF86 +:10219000654EDFEA7CE09B7DB3DDB0AD707E946977 +:1021A000593722B4EFC3C0876374F2890852E5053A +:1021B000F021CCE319017646A204FCD74AD8BADE56 +:1021C0007D22EA89687C44E9E624E0AF1F2E006C9A +:1021D000DDFE29DD04804E289F9DFA3AF4B28AD3B1 +:1021E00007F543FE0AF3E4F27A6D14FF4248EAD79A +:1021F0000F4212F0F74CA687B2135D4847B5C421D1 +:10220000837E51C5CC2C902F745E7312EDFF66C295 +:10221000B9E7B525F5F39F0DFA93BBD8BCAF809114 +:102220003D66E0BC1392A8FD11619E0CBEBF1BA3CE +:10223000F80B399A7D92D76F9FA4C37A39C037744F +:10224000FD1D29EA60A86B7C53CCED961705A35EB3 +:10225000BEA4DFDF677A2E8DDB2F644EFFBC390012 +:102260001F0D9E9A1D50CBE583364F2EE7BF614967 +:102270000A1BDFC0C63BA04EDB2BB9FF44E172292D +:10228000C2DBCA9E9FCF2F7A4061718B3ABE2F2945 +:1022900051D1F41BC2B52A9ADFA584F43FAEE7669C +:1022A000FD4770F8D07615DBABD93EC62A0CEFE1BE +:1022B000F18368F8D1E0EFE4E723B96C7EE2ED87C3 +:1022C000DB64985FA39768707B3381C16D9206B71A +:1022D000363E4F983C5825755A9508E7BC91D3ABCC +:1022E000568FCB35CA8768F1943121F8D4221C0A65 +:1022F000D8BEA3C5572EE7FDAF4CEA875F038EB368 +:10230000B1FD3EC0E5356D9F87ED196CBE3B42EDDA +:102310004DD8EE64FDA3F9FD7770FD3537A97FDC5C +:102320009D38CEC1C685C713B4B299EF6F7E68DC05 +:10233000DD382E878D7386F0BE18DBAB58FBD78D4A +:10234000BF39F9BADF0DC16515F2BDCACEFFB7843A +:10235000FEF6EF637B315B379AFCF85B029B6F05FF +:102360009FEF4AF08BE91C8941922B39C06B8A752B +:102370004FA05DD282AA1FF447E967B20BE47485CF +:1023800068F30A541E4B2E2BFAC9311251C1AFED1E +:10239000F9FC5BCEBE3CACFB41AF2F8B29B182DF99 +:1023A000B93C5B72833E2C794062FEF57113CAFB27 +:1023B0004A713ECEB34BD1ECDCDB0D7EB44B715594 +:1023C000C7C03EAC227131FFBFFA2AFA7C3C97D7D6 +:1023D000BBACC926986F6C268B178C77D5A1BF4EE6 +:1023E000CE323F5AA5FF31F9ADA25E96F93829A346 +:1023F0008508581AFD6D99AC3E258E44BD8076D473 +:10240000D880D1FF965D9547607E99E8C6D175BBAF +:1024100093EC0EB4A772C8F02F28FF58720562A182 +:10242000FE4585E4F1031E26BAEA94527A1E4B86D5 +:10243000C70A7238C7EC1F0CF184B60CD9ED05360B +:102440007CA8DC9A0DFE5607F5CF110E6AD2352313 +:102450004278B214AB04E890E204F9ABBFB4B132F5 +:102460002599D1F1F1240BE2B382D7B5E7E1782FBA +:102470004C8E65728458BD1FE6829C104802A5C32D +:1024800005A42F0BE8312D9DE98F26535F2AD44FE9 +:102490009240AA8396AD1D525524FFE727DC2F5B9F +:1024A000618A6C2FFDC43CF17D80830471834B31C4 +:1024B0002EE0B10C0BC50F347B558B2344B35BEF7F +:1024C000176B8EC13C82E23F03FD07DABF5E76EEFA +:1024D0000C26A7B552DB472D87CBE0642B9E6FE718 +:1024E000DD6564960BF1F439C7D3BECB002AD973EE +:1024F00014C0D34BD98FE4405CCA9AFD9003F8B363 +:102500008A30FBB4C205B29890476D9EB3493AFB3E +:1025100066624E2DDA4DC5592D684F2D8BE2977EA0 +:1025200047C38F4627368F39790CC4BF165A61BC12 +:10253000A4D4C442B93338154B6AF75AE0F9B20C47 +:10254000563F1F1EDEE37229DAFE27805E80784D3B +:1025500046FF3952607EFADC2BE787CEA1DB5F7A3B +:1025600072CAC0FD5993993ED2F625E570BACC35B2 +:10257000D25D4D32933397246BFEE205D3DDDB173A +:102580004277E1E79D98BDA8EA6212DABF765EED78 +:10259000FCF4BCA3E13C15123BFF46C5A3C21414D6 +:1025A000CE05008701E7B246D6FBAE64D397E5A31C +:1025B0004792865DF879BEC4BCD393BF049CF68C69 +:1025C000539D204FDA52287D523CB509ACD4FADB3A +:1025D000397D3EC3CB2F2327867F89F39538851716 +:1025E000401F8EF71C2C8365CA8B4781DA017EACB5 +:1025F000073C94E63D20CDA2F5F6BB67A3FCDC3397 +:10260000AE05F7BDCC6EDCAF56A6707C1467A9C8CA +:102610007F6D9CFF2A08F323B57ECFF37385F347C4 +:10262000F87CE17CFDA84DBD0BF69592CCF61FF22F +:10263000FF7A45BDFF57CAF5D738EB1D86F8C73876 +:10264000EEFF2DFB6CA8CD4B0F7A9AEAB57F8AFF7F +:1026500077863E013F29A3D4AAF7FFDAAC65D8BE3E +:102660002C53ADBAD401FA5874DF4B107EE80F7AC0 +:102670000551D918C11F5C9629FBC7D3E71685FC05 +:1026800014F65746F525C45F2C8A4A2E1A31D02FEE +:10269000DC652D23103739AD9067C11F3BDF7936DC +:1026A000271BFD4209FC423E3FFA854A0BE9C378ED +:1026B0004F1901BB06DA5D2340EEA8C463073D4213 +:1026C000FD429D7C3A6DBD03F93D7C3D2AB79E06D7 +:1026D0007CB5298C8FC3FD413999D9C19A9C0DA72E +:1026E000870A27A39B18BA7533931BDB9323C8FB78 +:1026F0002F2F9FE694830B703D59B2075CB5EB8298 +:1027000001095C9E6F27337EAAB13DDD06CFB5F986 +:10271000C3F1434FAE423C1DEC1916BFA1F61AB5EA +:10272000A3CCD45E5B2984D65FC6E11D0D1FCB40D0 +:102730005F47E0A303C9262E7FC2E3447718EF5F0B +:10274000142F7114B2B83E89007F91DB49CB29BFA9 +:10275000C0FDCD32B3DBA9009D6616BFE3017F3E0D +:1027600053C6FB0822B538AFB10F3CE772889F45CE +:10277000D8DF9F939310AED60C93C13E23E41E8303 +:10278000FD18EDDC84EFCBCCCF25003C73F5F00CCD +:102790003B77B982E706B31EE68D37B9899FF245CC +:1027A0007C1671A3C08A37611C56E37385F3B92682 +:1027B0000F6C0A1B77B56318B3CF445B40A4E75F87 +:1027C000E5A0F6349DA755DD857A551B9FC0CF6FD8 +:1027D0001BC7E28D36BB5F5122C0E17ECEE7D1CE72 +:1027E000D9A14A89E5747FF72BCCFE96C6996A7CFD +:1027F000188F62F15A85C34E2C29B082DD3E091C28 +:10280000F814D8CF56451FB712F97EE2EC743FE7B3 +:1028100090932BC2F61393DB570EFB97B2552551BD +:10282000B7FF0A876607F4227F479BEF3E2EE763D8 +:1028300072DCA40EEC0D9BDB0FF75A316A5D218828 +:10284000C5D85C3799AD6B8F550B475B7474D891C5 +:102850002947BC8FF82F0793FF7649AD81717645E4 +:1028600022704F66E7F672B479A3EDE37CEBDDC42A +:10287000CF3B603D5764BB62A883C90D69DCD61AA3 +:1028800090D36484448647D013290EC6A7F1729F63 +:102890000BFC754A8F9E48F3890E99C3FB5FC41FDA +:1028A0009ADD5DD2B56F28DD6FAB4D720B20BF8A0C +:1028B0008EF6BA74F0A17A7D9643173F106D1E9480 +:1028C0006FA28BDDBB575998BFBD679CF19EAC8151 +:1028D000C3EF7D5E46930BE31D9A3DF6AF39E79754 +:1028E000C55F05E04E07970E800B01FEFA415B6B5A +:1028F000047949E1D3FE55E0B39AC3E5694ED7D1D7 +:10290000E033CA61FA97D241387CCEC7D7213EF373 +:10291000914311E0D86A97D3671BF8BF03ED904845 +:10292000FDEA74E78DC6871A7DDCC4F14205A42157 +:102930002E203BBCBDCCAFBCD3A8E7C4F96E2E9F04 +:10294000C9590AB744DE3FD146FC71F1A1F9E572DD +:10295000633CE179078F0BC4901880CF69F754016D +:10296000F2142CA699A394A1B04487007A2215E60C +:102970001949C8035C7E86EBC11495F9C983498B5C +:10298000C0F44A06EECFC1F711AE07D3A95F03F139 +:10299000183822F8D38369DD0A360851F11E5CF03D +:1029A0009AD05F76129F00F367903E2C87402A02F0 +:1029B0009D3F9BF40A39147F0F54D48D02F9FD0E0C +:1029C0009CE392D039CE678F6AA5667FACFE37C193 +:1029D000FB93B07DFE1F82F792321DBCE51423DD10 +:1029E0007C597837707887C7F38A219E970DF13C20 +:1029F000FF6EE053F92CB33F7AFE2E637CAF2D9B24 +:102A0000C5F32AC4EA35780FEA92D1FD9072FB56DD +:102A1000419E936677A2CE1B168AFB594FFD4082DA +:102A2000380A918E229CF06EC885F22C3B05E53168 +:102A3000B323C6F3FDCBD973AC70EF1DF29FFC221C +:102A4000B33798BD24733A287696A2FFD276F6DC87 +:102A500076C785FA493BA53D787FADF947AD8159E9 +:102A6000E82F858FF34BFEF7E0FCFE80EC827C9331 +:102A70006E7E2FD67D6AAF214E1BEE076976D57824 +:102A8000BEFFB28067DFA570BFA5CC222CBEC9E017 +:102A900020F375DA9CA7F11EFCF9B326F4B74E7348 +:102AA0007FAB18FC2C3BF377EAEC03CF794DCA459A +:102AB0008638BCE63FC138C8AB2B53FC22D8739A8A +:102AC000FF04ED2EFB40FFA9CA127805F637E51585 +:102AD00011F342A2C137DC6F0AD73F335398FEF996 +:102AE000560A8F1784C1538BF785DF4BB76BFC27D2 +:102AF00079053DFF87AF2FEF9A88FB278A2E1E3B73 +:102B000034144F14542FB92B3F143F8C10376C01E1 +:102B10003AD4E2869A1ED3E8D842FB5AF19E397223 +:102B20003CB13B7BEF30E617BE900CFC59A1B0B82E +:102B300091B63FEA17DE93A2C3477180E96DCB7F60 +:102B4000B5F42DA1F02549C4CDFC83169795D62B5D +:102B50001592BC12F9CC86795AC50E01F94EF2C70E +:102B600060BDF2B8DB1743EB965D2F89A203D69BBD +:102B700045628410FD68791D6D810F5601FE4E1F60 +:102B800097DCE7F2BB2B218866F0936243F844F9A7 +:102B90009664A83F22791E4D413B6150689C08F91C +:102BA00060430DF967CF48EA63D06FBA55FD11F65F +:102BB000FFCFC3FB2F53305EBCF72BE13DB40ED3E8 +:102BC0000760B39174DD7A36DA7839ACE342FAEF14 +:102BD0008F4B2F22781FB309700671964F880FE232 +:102BE0002CCF995F14411FB5F379AE201D2E7918B3 +:102BF000DB2FF4DBBCD1B90EE8E2AD946C9CEF396D +:102C00009B67F528DABE6F83340AE236ADAE67AC57 +:102C1000903FBB6B637B469F8EFFF66DF60C89E49D +:102C20001F6A25FD4B3015E1B9E259A98A2627B65E +:102C30008B501F609F6DE852609DCD1BAD3322C548 +:102C400035E454C6EF576C60766D55AEC90DE2ADF4 +:102C50009878A524B88F7113B79F36C48DD8DA5BE6 +:102C60000ABA285BC47B0D5ADF1D4FEB716354F425 +:102C70000F2E1EB115C75FFC49A99BE5517A6DF96E +:102C8000B4BE2AB774CC4A5A1F12EB39067C45F5FC +:102C90004C8784FAB4330EF200E2464C4D59496B2E +:102CA0007102A98964E7FE3D85D9799BCD1A5C251F +:102CB000CC83DCB55146FEDA972EE2FD1385DB7C32 +:102CC000A8FF393D8E504A24E5AAB71CE058413A86 +:102CD0005BC19F2A775DF3423CF90AF02BD8AA002A +:102CE000FFAF8A6287BFC5F7874284D2CFDE0D6D02 +:102CF00037920879D4FD79D671AA2515EE57F8BD1B +:102D00002E714E45FA898EEF7B99BFD9E96F8DA55B +:102D100070BC624BC720FDFCEF42D0356520BE2160 +:102D2000FF995C0AF9B71ECCA76D3D6A42F8BD9CBD +:102D300027F8040A9FBDB922B5D9E8AE72ACBEE14E +:102D4000B4BE9AD371F596FD6D8380E5531DB8EE40 +:102D5000CBB94F58597EEB85C7AF47533E6884FBCC +:102D6000648A8F094AACCF45F1350FA6A0F5718A68 +:102D7000D5E7A7EBF5D87BCB12E812CFA508EEF587 +:102D8000402FB94401F9812E8889214AA175101973 +:102D9000484F0E82F95CAB0AF3D6435C6C6586AB98 +:102DA00013F20D778CB062BE59783EF10EA1E58525 +:102DB00044884B250A28AFF7E6BE89F7747B332C8D +:102DC00004E815137EE9F3B624C6A7710546FBB3E4 +:102DD0002A359BFB9FC46B290CED2B2EC7AAC6502E +:102DE000427A31918DDF9723F880DEF6B9B87CA066 +:102DF000E7DD080691D4214D1F111DAF2F0D9FE077 +:102E0000D2EC62413BA769E0399E137CCB87C23983 +:102E10002EA6E7A0757BAE80EBDB9595B7132C8BC8 +:102E2000EAE11E337CFFF7A632FF50A664970BF24F +:102E3000AD73F9447D7E8C5C74FB145B3CE631A180 +:102E40005D99962BE079261E65F7B903F2B315E27A +:102E5000910DF8A156476A68BEB8CF9EFD36E4FFD3 +:102E60004E2E12FC31B01F9EDF4CFFAF07F48B9C3F +:102E700053CBF2AF73D7E179261599DD709733C93B +:102E8000E6EB28A5F5978E4918CF9E9C3301F3AB4E +:102E9000C3D75FA9107F1585EF4B7912C23BE6A21D +:102EA00027709ED7F34C286F26433E36E42FEBF372 +:102EB000AA511F1AF3B9278BFFAD9640B39BF12B94 +:102EC00091BC8340BE4F711AE1673F6ABC2FAE2EA2 +:102ED000B018EA93F3E4303DEC457A793193D1C5EB +:102EE0008B170BBEF5D9213A9B7434C90774067F42 +:102EF00062A1018E8673C6056415E0B7EFE29F3DBF +:102F000008F72471AE65B7E33D3887BF4627711CCB +:102F1000EFF68C5F7F1BF49406FF703AB870FC5F8D +:102F2000535302F82FD0EEEFC3F01F866F8C416A27 +:102F3000E7183610EFB87EF6407C6B7430E0DCF7B3 +:102F4000752D1F4AF1FAB29D3E003CAF937DF70A02 +:102F5000213C9D17AF392548372B950E1BC8FD988E +:102F60008B0ED9C03FD0E88288DD057A7BFF9F8534 +:102F7000EFD2D5027326DD820FE27A6FC0A3CB4376 +:102F8000EBBC98DA9FD7F5622AD855352C8FA3551C +:102F9000CD67EF5D15307D1A2E1FFE902AE2B81E18 +:102FA000F38B19E7CA53ADB67908DC8FB542BE1D65 +:102FB0003D9FBCBA16DE6820F2B45A949764B5C03F +:102FC000F2108A7F8BF27D8ED3B75488B01E5A32AE +:102FD000B84F17937BC5C9D89FCCD0F2926ADEC791 +:102FE000FD4F63F50BDDD76BFFA47DFD9ED20A8BF1 +:102FF0007731BBF96A1E97D7ECEE2936967738A55C +:1030000058447CBCBE41F0617E24EDE7A574D2C873 +:10301000C9F66A6E079E2E7AA67D940BEC41D560A8 +:10302000770AC53D68F7251419FDC14435D680FFE0 +:10303000E4AA24433DA56690A17FDA8CA1C6B8829C +:10304000E79B86E7831BF20DF5CC962B0CFD87DC06 +:10305000556AA8677B2719FA0F5B3ED5501FDE71B2 +:10306000A3A1FF37D6CC323CBFD8D768787EC9A69B +:103070008586FA88CEEF1AFA5FBAED5EC3F351FE89 +:103080009586E7A3F7FDC0501FD3FB98A1FF65EF1E +:10309000AC373CBFBCEF49C3F3B147B71AEAE30210 +:1030A000DB0DFDC7077719EA25E41543FF32EB6F07 +:1030B0000DF50AE53D43FF09CE4386E7135D1F1B6F +:1030C0009E6B743039F75343FB55EEBF85BDA75354 +:1030D000C3E21C100F18068F3AB08C259DEC5E875A +:1030E000F462F960A1A73C0DE8F3C7DE7648486AB0 +:1030F000F506FE0857D3AF170D4B60F6934AF4F26E +:1031000053CB4FA57E8B378692427C90D2ED684A96 +:103110007741014B2548256B32C47B62B04C0A26AF +:10312000637B7230114B477030B6A704D3B14C0D9E +:103130000EC3322D988DA533780996E9C18BB11C49 +:10314000141C8DE30607476199111C8BED99C1CBC7 +:10315000B1CC0A9661FB90600996AEE0642CB38313 +:1031600013B11C1ABC16FB0D0B5E83654EF0266C6A +:103170001F1EBC01CB8B82B3B1FC46B016CBDCE08A +:103180003C2C2F0ECEC5F29BC13B70DC25C1DBB1C0 +:10319000CC0B7E0FDB4704BF83E5C8602B969706F8 +:1031A0009760E90EAEC27EA3822BB0CC0F3E88EDB5 +:1031B000A3830F605910FC11B68F093E8A6561F038 +:1031C000092C2F0BAEC3B228F8732C2F0F6EC6F24A +:1031D0008AE033386E6CF0692C8B83CF61FBB8E0EA +:1031E0006FB0BC32B81BDBC7077BB05483AF607BCA +:1031F00049F0252C4B83BFC5F6B2E07E2CCB83EF84 +:10320000617B45F05D2C2B8387B09C103C88655515 +:10321000F0632C27068F613929F8298E9B1C3C8589 +:103220006575F06FD87E55F00C96FDF22E6ABEB231 +:10323000C784FE2CF753A3FB0B5E949766FE5E1CBF +:10324000E45663FE7F8BE0C378A1A3EF05A89B8BB8 +:103250002C182FBC9904F03D813F903E3BC8D39E73 +:10326000CB8F6440BCE9F5147FA63EDFC1CCE30000 +:1032700015E27109FCD5298E5D29A04F6FA6CD906E +:103280006744D42F300F720ACF83BC59A20E16DDCB +:10329000EA7E98E172ECE7B7D0FACC6AA2E6D3FEF8 +:1032A000ED975B30AEDF9E4FFD205ADE97CDF26585 +:1032B000BBD298BE7C2A8DF9A5CFA531FFEAC942C1 +:1032C00096C733F3F6E18C9FCA93CFE33731387C4E +:1032D0006324CFB3B505B2303FF602C79D48E57908 +:1032E000B5BCFF836935CFA7D1766F29C96DB1858C +:1032F000FAD1F65D51DAF7803C086FDF6562F8F0CD +:10330000BE2D723FA12661EA39FC84D717F77EF300 +:1033100085E1A1FA1B51FC504296B0FBC35DC7AAE0 +:10332000AFA7FAF0EA22D14D2507F9EFC5DBC67D3C +:10333000389CAD0BF999DE5211E317338BF7EF4947 +:10334000A6F5998B1231EFBE7F5FA5667C3EC5F96D +:10335000F6375FA047BFB9E537E33E34C4453D6863 +:1033600077DDC16994A8E6BFF669CF915E59DCF7B5 +:103370000E58DC05F2CF8CF3F6AA66DFB9F263884B +:103380006A21AA81EE19BC56C1FEC1F7275613ACBB +:103390001BCFFB50B8A2DEF7C6CBBE56019C7757B9 +:1033A00002D05D5C5E809C2BBE0CF0943051A1CFAE +:1033B00006764C3478A63819FD2514AB4E2FC54F30 +:1033C000DBDF45BCE7DA9D58A800FD7FDF9693065A +:1033D000FCE174327A6DEB7917E35B090501E2B524 +:1033E000B1FB739705E2F8562C972E7663D9B6B8E1 +:1033F00008CB95193FB042BC444C91201398C4644B +:10340000CEC17890B6BE397196B5C44DE75B63A95D +:103410008610920871066A2224D2FA12EA539C4D51 +:103420006374FDBAF3431BF0C3D93417D64513BBFD +:10343000378E2BF0AB909710E7564A2557A81DFF03 +:103440001CD8BE1EFC91D749DFEA6B018E2A7B1F78 +:10345000A395BF6FDA5A329CC3551B1786F7303CD1 +:103460008BB21BEFADC558DA3F2F3A5EF39C2C2F81 +:1034700001E84BA2F4F529DF3751E34C309F86DF9A +:10348000D35200F3A95A85C87997851ADC155539A6 +:10349000D73D0A51A4BFEAE5A92D6F5B183DDB506B +:1034A000BE621DF2B9B8BCDA9BA6163BE9FC8BAE36 +:1034B000E472202309E5006D9F7E056DDF66627E64 +:1034C0008A3749467EA14048803C5F6275254C3D65 +:1034D000471EC4B2C58A2A99E17EC09500F05AC63B +:1034E000F3F5E00D65BD1CF857F50BC90B1F9E2BBE +:1034F000BCFF3613E7ABD8183C97C8E1A18D9BEF12 +:10350000E4F238BBA6D689F1115706C8555A9FED8B +:103510001C83E7CF00BEA2F5DBB0AEF4D7EBB1BFA2 +:1035200093F5C7449A0B90C3745C138E93FAE769C2 +:10353000C1BAAD7FDD85B88EA3BFBE08EB19ACFF65 +:1035400085AEA395FDE77F93C9C9CF24352189C2F4 +:10355000A7E6AED935E5546F5F7BD75C2C3F58DCCE +:10356000AB825C3D4CE5491B856B4DC93007F83992 +:10357000D75E35CCE6D2D16B3D8F6BEE5A6EAE0284 +:103580007D57BA42ACD980FCB4C49037B7CA69E65B +:10359000FE0DDB471DE5F1BB29C9D5AFD9FFCD36FF +:1035A0009D3D3A8BB865A0F7D9CBCD21BA263AFE1E +:1035B0005458DB3693E7FB37C039568AFCBE82F39A +:1035C0006B22E1FEBC2BB5E61C7A872CB7104F04AA +:1035D000793C103E84FC95F2C167B61C8CCB524BF3 +:1035E000CD1A695E0D4ED1D6AB8F12FFD5E0A4C1C6 +:1035F0005B6B3FB47AB4C2EC6A9F018EB3EF1B835E +:10360000F1CA7A1EAF278956CE9FAC5F1D5D672B2E +:103610008C935417D03BD423C9176DDD3AFAAFBB56 +:10362000F323C197C361A599E9F130F81E5E333CDD +:103630001EF45038FE2E14CECD1682EF530436DA27 +:10364000591CC93103E76FE0EB13C74CDC4F035F34 +:10365000EF859D717E13ED5FBAD1BE1EFCE093A590 +:10366000DE476A403EAD37633EDBBD3B57BDFD23C1 +:1036700078EF639D19EF4CE6C63D5C08F7B1A7B83B +:103680009EA30AA007BE9FE021DA9F2AC0FCF58412 +:10369000CD7F52BBFFD89880F03C5ABEA17D2C2D27 +:1036A000FB762CA886B8CB919D57ED05BF796E2C83 +:1036B00091D231BEAFC8C87F5EF38746FB400AD5C2 +:1036C000C581F57AA8EBE247737DE60FF5743E6F8E +:1036D00093B1AE8797490F2F57B9115EAE0A03BC5D +:1036E00084E7ED7E5107AFF298E10ED0EBEF3A5D43 +:1036F000088F8698A5A9009F861D2BB09CB729C668 +:10370000FBA16EDD059D89867AF3B674AF5EAF9C32 +:10371000DEF7443CD0E142A7E8FD90EAB9E38BD55F +:1037200056B0634E2CAEC252C3FF82CE6CAFCD30CA +:103730008FB17EBA43A862F2D99530ED1CFCBAD0A5 +:1037400029E33A1F6D62FEE6478BAD5E58E7F862EB +:10375000C5CBD6757A991DC5E035FFAE38EF87A386 +:1037600043FB8B36EF3F7B7FD4C22787AC04DFD986 +:10377000F9E21C7A3BAA5C923E93517F749BFF0C4A +:103780007463A5FFFB02E3A812D6B5799B3B452FD6 +:10379000E41313B2C5B01E1DE73AACE3B7E87AC133 +:1037A000F89D8971100B43F9CCEE413C700F42E754 +:1037B0003B29D996431C41BB0769868568DF05D63E +:1037C0003ED9439B3EE91A76CEF7CC299EB2412FD3 +:1037D00037583B6450B60D9D1797033F7DD2D59A5D +:1037E0000AF2639E78FA5B91DEF7BA3E9DDFCFFB6B +:1037F000CC01A3BFE8D3F6992D19F88CD8FACF4D98 +:10380000EBC7A3BCDF53CBE76DDAB2BF722CDD7F11 +:10381000D3B65332EC232DDD539B9E123ABFC0EF3B +:10382000811A371D94E17C47CDDE8BBE772EFB7E5F +:10383000C03E6D4E43DEA197F4027FCE2A221AC30A +:103840005EFF1E9537C75E3113B83F2467692FFAB4 +:103850003C8B3F9D436AE2015EB3BAE6A1FC39F6B8 +:10386000ECE4BD2CFFA8A310E8E31362C2F7DC3F31 +:10387000216FC68FD6C16F75BA963FC9BE6FA3E5DB +:10388000B7D00DA6637E7A437B2FBC376621929713 +:10389000CB25817DAFC627A03C6B60ED5E625D826B +:1038A000E758CEE49197FE07F5DB3A8CF2A97E8DBE +:1038B000B15E47A6A6427E77DD4366C8202273F537 +:1038C000F28FC2EF8E7466D7D7939676B0E71E97C5 +:1038D000595EF72C854883A91E5AF0EBC70B6B691C +:1038E000FDC17476BFF311F733E0BDC774FABCF1C4 +:1038F0002E9FACE60D3CDFA1AED1D3C7129C8FE961 +:10390000AD46CD6E252E88E30F867F0D8D7EFEC1E0 +:103910005D22DE3B0D86769D7C9EBDDC78BEF39DF0 +:103920003FFCBC84FC00CFDBB8E91AF4DBB4F368DD +:10393000F8D2CE63DE14F93DDF27D30583DDB49DD5 +:10394000C34FF3BB9F0FABBF10567F299DD9F72103 +:103950003F9DD1B799F337A5FBE781EE1758039543 +:103960008C4EFA64FD7DA81CEAF7C2B9FA5938BF3B +:10397000D07E2FA58F89DE2F2634DFEB91E65BF01A +:10398000EBA79E057FB4F1970FC7C365D031A9237C +:1039900015DEB398BF71693CC0E9A8E48D07BA3958 +:1039A000E613AB22C14B1AC4E506516D02C57B93E9 +:1039B00046FFC54BA6807EFFF346B3027E61F32629 +:1039C0008B1FBEBFD4D43517EF6B68FD20AB2FC360 +:1039D000F72A9BB7993FD0E3B5F1670FA7627E073F +:1039E000F10E66F7E9FEC1F0E9A0A60D7FAA043F3B +:1039F000B99904909EC3C7C1FAC12494D7B572C2C5 +:103A0000C0E75ADCB4993591E6AE55A7206EDADCF2 +:103A100035F108F07D33913ED0D35303D034F557C0 +:103A20003E4FE779779791CB40BE68F020BE149463 +:103A3000CFAD9B7F38F220DDCFF10DAFC40B7A7F85 +:103A400095DFB79FEE9CFD7EF239F4C3094AA7FAD1 +:103A5000F73134B9EBDA46379046ABDDAC9C6FF604 +:103A6000C78FA5709DBFCE8CEF87CE7FEA899F3E22 +:103A7000067944EF5AF0FE63DE537BDEBE82D6E762 +:103A80003D6D7654B363D8E03E58C34B33FD1FDC25 +:103A90004F6878687C668F0CEFCF403BF8071A3E82 +:103AA000E63DDD23931103E157D6D923F7D922E070 +:103AB000A5F36025BE67B4F92F32E0FDD84E81A48E +:103AC000650F1CDFB06E0FDA310027C423C7533FE8 +:103AD000DE06E0CB3F657B01F653406E9F0F5F072C +:103AE00040AFA6205DFF623BDD47C3EF2D6E8043F4 +:103AF000C32FEE8887F31C915A187D3FBE3415F210 +:103B0000DC1ACCDE54054BD6DEF0E33B91EEEAF74F +:103B1000DF99CAF20ED5749EDF910EE7BC6DED758C +:103B200078CE3AE241FA6B785CAC813C98CF255272 +:103B3000F57404FEB89BF3C791F514B9F49C4740A3 +:103B40005E3A42FE8EF65EF39DFD7110760FF939F6 +:103B5000BF879C3A48CB5B67F2B79F6E372C43B95F +:103B6000FA51A69A06F793140E9A1C45F92AEEAF5D +:103B700048637862F218C751FA2B8376E8DF6BC688 +:103B80007B61DD382E3FD9FA8BF8FA74DFB1608F94 +:103B90001C498DFC3ED0A67EFEA7FA5647673A3EEA +:103BA000677CBF6105E3738DEF7DD754C1F3CF7E92 +:103BB000C7F808C6813EA2FBF2A7E1F39E6902CADC +:103BC000050BF147E2EF0D66CEDFC6E7D462477B17 +:103BD0004EA313BA7F09BE4716A217BA4E12E201CE +:103BE000ED95BA87E8789D9DDD0CEB623F39D49E58 +:103BF0001DE2E37A2E0FBE3DC8280FC8DA940B8A67 +:103C00000BCC37FB7EFA18F02FE557AF0BF8D78CAB +:103C1000EFDD7CBC65F7DB37523AFFB853E35BA3BB +:103C20003C0DE7DB86AD77627C309C6F3FCE682130 +:103C300011F93683BF3717CEB7197DFF5679AAC160 +:103C4000EF2761F0A3F2F127DB5DD1E1182E1FC74A +:103C50000E72213CC3E523FDFB1D291C48871AFD7C +:103C60006974D7F8F30543400EF5D3A7467FFDF4FA +:103C7000A9D15FF8798DF01B20DF20D949673F98E3 +:103C8000EF255E3BC577608788DF4B3AE90AC4437E +:103C9000FC67690CB915ECF0930AAF27B27A20459E +:103CA0006E0739A1B5076258BCF2644D203E5167DA +:103CB0005F1FEC16E321BEDBE78BFC7D37CC48A40D +:103CC000EBF745F9FE9B168F38191B3F12D78BCDAA +:103CD000F201BE2A445BD65D9037DA21E2777CE6BA +:103CE0002CB93E1EF2434E760FBB7A066DBFED2512 +:103CF000FE193FAF2AA55338CFE6783F4ABC8F1450 +:103D0000D3F3CDEE66F6F39CD591E944BB37AFB360 +:103D10002D92411E51BB35441F049EB3EF2C34AC91 +:103D20000D6BEF9E8CF4D418464F1EEE1F1D1BC466 +:103D3000F3FB479151DC3F31E9F3412AC4BCABE1CD +:103D4000BB9C27F789986F7DBA5B24ED70CE2D82DE +:103D50008F007F7B53902E9BA8FCD0C77F8F03DD05 +:103D60009DE33DBAE3BFFA43E1F76897F9CFBE3769 +:103D7000F247B43CFEECBB173D07F55F1FC87A8FD6 +:103D80000CEC5FB6F3CC2D20FF4FEEB4108CABECF7 +:103D90007C31EB7B50DF6EC1BCA393F75A54B4A7C0 +:103DA00077DA318FEE64268BA7B6EEF8CB48CCDB02 +:103DB000266D8837C760E6779CEEFEDB1FF1FDDAE3 +:103DC0006E7A2AD0B73BE3D01E6FDE1EE30327F5E1 +:103DD000E48EBF14EAEF2FBEEE799A6416BF3F69F6 +:103DE000273320EE753291C5AD9B9FBBFC892574AE +:103DF000FD055D3D32BCB753F6FCDF4782BC39B9E7 +:103E000095D91127CC7D3F266E42860CBEE73E3306 +:103E1000C5D709B0ED28AF3C3778E755DEBC487010 +:103E200061703849E100E7A270690039190D1E85FB +:103E3000FFB1F038750BAC3FBFFB32BC7F08C1450A +:103E40005059BBDD6715F0FCAC7DE75F46823CFE58 +:103E5000B87309EAF7F39DFBBAFFE7CE2DF82FE41C +:103E6000DC8BFE63CFCDE8FFAFA09FC60CE483815F +:103E700074FEEB6F61FD177637EEF702F9FF21381C +:103E80007FCA7FE2F9BF22DEB70A98BF723EBC3F0D +:103E9000F31F7BEEF3E1FD258E77BB0279122777C6 +:103EA000FC3D8BE8CE7FBE73BFF97F94DE353BA827 +:103EB000D7D4A214D0FDBD4B3AAECBA6E51BEAA7E2 +:103EC0000E705B2D51EE694C19CCAFB0082CEF9BF6 +:103ED0005C2768F1A55E43DE534603DA1B53D4FB2F +:103EE000D8F799A4965EC83BED2D9DED5E893DF215 +:103EF000F17B02BDD3C6F1BAD1DF7A5D20AA40EDD5 +:103F0000DB29A593F781BD77B52AA23D484BB403C1 +:103F1000DFCAAA64ED45463FE38630FFE0FA19C6E2 +:103F2000E7D7F1F9A693854A0185D7F40C49F151F9 +:103F300010DD50D26286F3DC70B3403A74F1CDEB01 +:103F4000C2E6FB2304D07476E497855F413FFC16FC +:103F5000223C4889766F771EF81106EFDE69A35878 +:103F60007EB1E466F09BBEC08D7153EE879AF978FE +:103F7000B36D792FF0AD9918FD4FCD8F8C0667C2C8 +:103F8000FD529C676808EE665544BF54371FC24314 +:103F9000C3C797C58386BFAF8B0F398318EE75B53E +:103FA00072AEB5761EDC435821DF9DCE7BF56AF6F6 +:103FB000FE88354F4038D61499F1FDAD3F996A0A15 +:103FC000C170AE1E7D59D377D9B46E80CF5C0EC759 +:103FD0003AD282762739FBC517C58578FB8776EB01 +:103FE0005C9590ABA85F52572CF863E9F9EB25E29A +:103FF0004DC88738A8403ED0C7417DC63AFC5D9980 +:104000001A9AE77CFDA3C9877F76F93E95471F5032 +:10401000A41F8412F366D8EF5D68FEE3ADDD0C8E5D +:10402000CDF305DF50A423BF597FFFBB3983C5679C +:10403000DFBF7B34CAB992FB472430BFB600F379A7 +:104040009AB9BD7FDAEB4A8078CEE9EE610910AF0C +:1040500039BDAF2C3E521ECF7EEE57FE76B115CB4A +:1040600093E542879880EF9D4C413D5C1E4340EEB6 +:10407000848F5B91A1C5655AD8BD246179F875FC20 +:104080001CF5746842920E6FABAF3A268D1C880700 +:10409000F8FB4077AFF275E10B7E2CC0757F4C5F6B +:1040A00065A4EF13FE88CB85EA5D6764881F4CED3D +:1040B000CEC6EF4B4E2D37BE07F86006F7CF4793BD +:1040C000D1B0AFEA5D13E32F07BCEC13DD3114BEB2 +:1040D000CDDDA7644F84FBB97078C2FC10473E6405 +:1040E00076D7013C0FDD1783EFFFBFC6EF8BF2F8E9 +:1040F0007721E1D341103FDBC0E17A2683C5D1AF00 +:10410000AD2E31A7D075F3BA945190573688F73F4A +:1041100093E1C2E783F938ADDFA0F9ACDF4159691B +:104120008A74FE21598C7EEA89FB5B45C27F1EDEC4 +:104130004AEEB7FBE1BDB8D3E5027F6F269CAE091E +:10414000F2C7E92AC107FA17FC58AC570BA8FF5F62 +:10415000D3F2EEA6327DA9D17D389CF767980C7911 +:104160000EA738DCDFE6F4A1C159836FF87EB5FEF7 +:10417000545E8DD7C75BAEDE36EA17609F34750B91 +:104180008A894ED524F5C9C087CDDB1E30C3FDC258 +:104190000DFCF759885433527FBF7B2683FDCECB6D +:1041A000EEFCB1683F7EBA9AD9C7EA9C53F160072A +:1041B000BD6672BF3116F8F175D1F05DF3F0F2BD56 +:1041C000C54A63B9593F6F36EEF3DAF92566080F31 +:1041D000DD34BFC79CA6A3A73319EC7B415AFBA0D3 +:1041E000F92ECC5FA4EBE13EBCDFB710C8C7C8EB2B +:1041F000EC2D8DA3CF6F6A496474D8D0D923639D09 +:104200007D67585B4F5B279C9FA655C719EAB3CBC8 +:10421000FA32002ED516FF2277043A7D2853BB8749 +:10422000FA927A42A5743BF2FF073D71AA32D27727 +:1042300050676732FAD5E987B448FA61E112571A34 +:10424000C07FE18E6169C01C0B5FAA488DA41FDE90 +:104250005ACCEE0F0FF0BCCB93D3A87EB854A71F57 +:10426000A6C5207D848FBB2AF302F58386AF7FB37A +:104270009C790BF44304BEF6641AF5C3F4EE5AD4E9 +:104280000FD3A789C4A58BC75D9F793EFD50927A55 +:1042900003D6CDEEB80874F316F74B00AE50C23A11 +:1042A000A027EECF64723F5C5F4493E7395902BFA9 +:1042B000DF3E8F3CFF5F82B326CF175EC7DEE31F72 +:1042C000488704E5F5C21B04FCFD92853B983C5FE2 +:1042D00078338F4B86C9D71A90AF057AF9CAC6379B +:1042E00079983E68DE96FDC399F4F98D1D66B79501 +:1042F000F6BF31246F0BF5F2F6FE4C49837396122C +:1043000001BF3366C61197515EE5809C3A34EAC519 +:10431000BC6780EE5F63EF99FD89EBF15747BD58AD +:1043200000F1F4C37CDE67B9FC3AB1983496533897 +:1043300094CD61F6F0822D22C2A1A98BD9794D9B33 +:10434000047C9FB732FF0CDE1BCEDBC1EE0DE17BA0 +:10435000BE253A3CCE7BADAF7D303C5F27E0BD67EC +:104360009D7B1E7BEF6F0D8B135BE97F902FB1223E +:10437000367E3DC13C1D15E3CD0B38DCAA2D81BD39 +:1043800030BEFA67827B1DCA35637C7A41CEA46356 +:10439000E01FCCDB14D6EE5E81F7190B20EEACF3F8 +:1043A00047DEE2E7BB4DF4E73D0379816F88117F7B +:1043B000EFECAD7038347C4D38ECA77028F8EA701B +:1043C00068EE7E00F36FBEEEF90F64F2787B3E2953 +:1043D000007EF9934945FEF7BE2CE27BC5731E189B +:1043E0009EA6CF53FA1387C36B264F7B3AF46B62BA +:1043F000EF1FD7AF7D7A0FBC1A3EB3938C82B07D8E +:10440000FD1AA39EECD7CB5D2ED4BB335B9E16E08A +:104410007BFEB789047F076C76BEC503F7AFFB63ED +:104420000228CF343A4CC892D877DCB8BD776850B0 +:10443000A01CFD8A6D82827C02DFD3803AC5037C9A +:104440004F63F7E57FA9E470C7F84CF33686A7669B +:104450008A17E0B34A6AEF821EB989EA1DBC2FEBC6 +:10446000EE3143FF06DA2F19E58E1BFD5D4D3FC18E +:10447000FD5D49AA0E6F3B0E32FADD28B84904BC37 +:10448000E5D2FFCE85B768F8D2EC870BC59B068FC7 +:10449000842C23FEF6C7F4568FC67B2AF63B40A435 +:1044A0003B11EF553EEC188678CCE472369CBEC1C9 +:1044B000DE77E9E24BD7C0C6F1C3F531982787EB29 +:1044C0000E65F6905EBE84FBD1CDA417ED9AB47450 +:1044D000CF5319BABCB0E93C7FA5FF5E37D4AF3EDD +:1044E000734CF47EC4598AF73F5A7E2DFC7214E651 +:1044F00083F1FAEECCC20333E9793F5D2EE2FBC9CA +:10450000D79B5C6F17031FAF3413A0CB4F5F35AB46 +:10451000CC0E8D43395CFBDA213384466A21BF809F +:10452000F6ABBD87C9DB4330196DFB3DD5632A7CF3 +:10453000B784748E81BCFD69EE9E0AC8DBBEAE6096 +:10454000FF52B8A7BBB64C79FB6D80EF0A91007C97 +:104550003F585E86FECA1DB70B48D7EF2CC6DFC298 +:1045600022D74DCB7EFB6DBAEECDCB53F09E6DA620 +:10457000BAA702E86DF6D5761BDCD34DCE15894778 +:1045800007C79B49EF5290DF335B6EBF0EF6DB40EF +:10459000F502C45D1BBAF757A4417DAD80BFA3D619 +:1045A000ECF5C8F00A54EF9A5332C43FEA683F4032 +:1045B0004FF35AD6AF798380EFF7D451F900E7ABC8 +:1045C000DB20107891A497DA7F5636AF0F3ECCD41B +:1045D000BB968EA7F57A180FF36E48C4DFBB6B7ECF +:1045E00095BD1F5457B4642FC8A73A3A8E3E26BDD6 +:1045F0001B6EC7F9E6AE1508A4063714657FBF0821 +:10460000E67BD58CDF0539D0F3A80CFBBE85AE97D1 +:104610004EE79F2DF655609EF5F70405F3A0ABBF5E +:104620008B783BC9F980647C87F199C0EBDC2ED490 +:10463000F4E3C6ACA12CCFFAAE25ED70AE3E6F4AC6 +:1046400036B844CDDB4EC960E77DB8183E3C43F137 +:10465000C6F3E0767B0FC97D3A39B52B6B188E9F78 +:10466000B3AD04F9FC365283F7E29E254C2F1F5C54 +:104670001AE313C01E312BA837772FFDC62370FE17 +:10468000134F99F1BEF444661FC6678FAC35E377CC +:10469000435AD78A28478E6C617121F1F1EB2AD3F6 +:1046A000017E540E00DDED5E5B26833C3CE2137020 +:1046B0007CD9E377A6B2B8AF517ED4B91A515E3C2B +:1046C0001EC3E443FD9AC8F7AB51E5C5A24A26DFF5 +:1046D000C3E4C1828C768CFB85CB89666263F65D10 +:1046E0003EC9877AAF3F1DE9B7E9553301FBAE49B3 +:1046F000526E5903743333066E92295FF8F7807C4B +:10470000FBD427B8BCF4F94DB7FE660CC0EF30C03F +:104710001BF8627532DEAFD6F96A11AE5A3E62FD01 +:104720001A233D6B794F3778C4D07B3EF47F373501 +:10473000C41155D7EFC03D942EE97AB76E137CF0C3 +:10474000FDA303F71CDC7B6701D615A0C3A6BBB88D +:104750005E5D6D47BA3DF09D534B812E6FB95BC0D6 +:10476000FD13AFA71DF44AD31AC10571CDFABBD909 +:10477000F87A3A1EE8E5C0A38C7E281DBB80CE9B4C +:10478000D63EB017FB6F105C30FF8175B5A8871B54 +:10479000BC22C1E71B0EA2BD4CF501E60DEDF68A69 +:1047A000A940E74D6D1605F0AAD18B467F07F9F7B2 +:1047B000A789D53DF25AF87D8A2C5744BA1367640D +:1047C000237D356F3123BD347B193D1D7C4A443A2E +:1047D000DCBDF4FA4AA09F131B8528F447E9AB20FF +:1047E000445FE2E3661C5FBF99C51776AF65747DD1 +:1047F000A48BD9A7658F0F47BFA6FE353361F1079C +:1048000062D3DB1FE7A3C370BA1BA097381D46A372 +:104810003B8FB9733AE41FD4FE82EEDF15825759FD +:10482000FB77300E50D67E039E57E31F78AF05F21C +:1048300036E6742C61F98C12CBEFF9D2FB0ADBC798 +:104840008321FD980FFA11F24FFC741F2F6E79022D +:10485000ED804F9E3C88F98DF39EA3F8A7FD4F6C29 +:10486000B1133FDAD93E94338D5D22E69712C95FCA +:1048700078ADEEFD2D2D2F63DE2FED08F7C6AD16BA +:104880005F351DDFF8ECA191784F7E2FB353BD4FFC +:10489000B2EFCC106FDFC86B213F5362F921E1FA10 +:1048A000D73684C5718EFF260EBFC7246CEAC17B44 +:1048B000A6C6CEEBCD165DDC521C6266BF03F19B33 +:1048C00038F69E19C53FDC2FC2FEF4BF27A1E5854F +:1048D0001CDFCCF8A7719B19EDA3C64DEB30DED7DA +:1048E000BCE914E6CF96FDF2A9788043F336D1985F +:1048F0003FB549F45B30CF4B3C6861DFE530E431D4 +:104900003575B1F73B9A3A799E5058FECCBC5FEEB4 +:1049100078D64B4133EF999FC5033F7DD4BB311E01 +:10492000E049E7C3FCA3AB8BA2E4279D2F2FA9731B +:1049300005CF4BBA0A7FA7233C2FE923F807D5E31D +:10494000F94338DEB5BCAE4D4C6E51EC17467A0FCC +:1049500049B35FE63DF5F98F218FF6F8D68F7F0CCE +:10496000FB9FFF8F4F7F0C791D64678C02F644F329 +:10497000936F61FEA136AE7A08B3A74E6CFE19E6BE +:104980006F9E78D78276E1891D47B2C05E38F1F418 +:104990009954C8CB5CB4A302E3138B7E5586EF8792 +:1049A00046F337813E7D17903F1A8E8FDD5DA2DF83 +:1049B00046F7F9C93B16E4FFFE3CB3CE052C7FCF8A +:1049C000C5F3CBB644CED3D5F2A19ABAAEBD7A1C0C +:1049D000C8BB2EA6D7FBF3A3CE9757F63B8AD74B7F +:1049E0002F007F5B78FE60E75511F3CA3E817F5050 +:1049F0003C350E31E6957DDE75DB4F1E83675D919C +:104A0000DFD3D6F8FA7C70D3F2802F1BA2DE3904F4 +:104A1000F868EBCF318F0FF056ED02FDFF7916C429 +:104A2000378F9A0318370CECB02890EFD5B8E30015 +:104A3000F2CB895FEDC73C5BC2F3714F90FE3F96AE +:104A400037C96317CD1BEC2C1F8DC31FF2D55CF14A +:104A5000D8CEF3D2181D6BF96AD1F2D47E3E84D938 +:104A6000415A7EF20257AFACD842F802FC084580AA +:104A7000AF8386FC3FEDDCE1F3290087CBF4F997A7 +:104A8000D1F201B99D3E005F4C2E9F58C7F331FB18 +:104A9000F32CA949970FF9414C1F36FB840391F081 +:104AA000ABE55FFE340CBFDAF9A2F185C69FE7DF04 +:104AB000F75783CB9A212CFF5F83CFF1B391E57435 +:104AC0000FE777EAB7F887E8FC965BB9DFA2E59DC8 +:104AD00069FB6DEF647AF9F826663786F3775394AD +:104AE000DFD37A6308F3EF9AB6F58C0439747CD778 +:104AF0006F38DD31BA6EDA7250F672B9EDD3CBEDA4 +:104B000028BF5FF62EDF37F57723CED7BCE554C438 +:104B1000F93E92D4EB61FF1FF5323BE4A34E31E244 +:104B2000EF20ECE67AA9FFDC7619FD2E313E16E582 +:104B3000D1227BD13BF05DB7457619F31D5A97F032 +:104B4000FC887BDCF83B1EADF649F8FB0F4B013EC1 +:104B50003A3FD4AC78F07727CCCE9A02F0AFC2DFE0 +:104B6000EB941D26E2D3E35FF2E2FBBD5386FE45E4 +:104B700002BDD3BBD8F8DE48AFA4EC49A6F3F59646 +:104B80000B6EB07707D29971FE6B54D1103F8358EA +:104B9000359CEBB49B7D0FCD6EF22BB40BB1C7F4FB +:104BA0003AD1D173B1DFABFE1F05EC5EF50080009A +:104BB000000000001F8B080000000000000BB57D06 +:104BC0000B7C54C5B9F89C3D67379B6437D990047A +:104BD000121EE1ECE64D4258C2534539092426F233 +:104BE00070414554D4253CC23389F8B8D4D2B24080 +:104BF0008C88B40D824A7BD12E34A87F4B5B40BC9D +:104C0000050DFE170816ADB551D16AFFDA06880802 +:104C10001A6005CBCDF542B9F37D33933DE764438C +:104C2000D0DB7FFCB5C39C7366E69BEF3DDF7C3336 +:104C30009B48E89F8790752BED598A959004E295E3 +:104C4000884C88D3AB04DAF208FE5DA1FF4B24B494 +:104C50006EE775371647B34613E2608FE87BD701DE +:104C60008B44485C1EC9534612E222715E99D637C6 +:104C700026686F4A0984AC77FA27D3CEC915F81B8A +:104C8000DFBD245EA51DC6B3D3FFAE507812C7D2D8 +:104C9000BA3D327E9266AC27135D1DE1D108E90B67 +:104CA000CFE99F4A48B94C21A3702495598231120B +:104CB000BE9F9CDD37026F522AF186E0FD148737D4 +:104CC00040BF7738187C025E0ACF718047A5FF216C +:104CD0003C856D010B41B88EEBE1A07F92CF89F04E +:104CE0001D37C1775C0FDF30D59972B2805614A2A0 +:104CF0005CA1F875D85B09C7F3793D9E0909106579 +:104D000034E053E095BEA7FDB8A54DCA1509F0EAF9 +:104D10009248268E676A37D075329ED769BF7BE18D +:104D20001FD711D27F89DA62A3F3F4D92517A0A186 +:104D30001F85B51590A0B4DA0019CF3A443D64231D +:104D400085F4BB3DEFD9DA68B974E77BF8DE02750C +:104D50005A26C7AB13070C27E4FEE0305F5A3E7CAF +:104D6000373BCDE2C57AAB924A48C3347F9A653867 +:104D7000803FACB16520212F92BA21127D6FAF2FF9 +:104D8000683D7223F015FDEB0FEF0B5AB54278CF5B +:104D9000EB8484089DC78B715D75CD9E46EB9EAEFE +:104DA0007A00EA4D80FCEB61BC82D67ADAFEB0EA8A +:104DB000BB5B1D45C8B4E72C444A21647CA723286B +:104DC000011FB4F521241D9AD5C5015DBAF119C59D +:104DD0002F498D7CD7233FF2EF289C153BE9FCA798 +:104DE000F967FB268E20648CC4F04A5C6D23A63BD9 +:104DF000018EAA256A6AA4DDB4E7CECB1E0ADF12B3 +:104E0000CA53D03EB1C2754B1E852F710BC5960A91 +:104E1000DFFB1F00B8B357F82DC01EE349DB831238 +:104E2000A527F93405E111E334EC97917F1B1EB3FC +:104E3000045723FFAA926FA89E7E6D26FA8519FD5E +:104E4000F61E43FAD5341F63F4DBBBF500D0BFA6D2 +:104E50005972C5A8301FEF2ECA44E4F1E0049F3216 +:104E600088D23526DC0074B59212DFE47CC4EB6393 +:104E7000309F6E78E5F0F586D7174F6D7BB2887E50 +:104E80001AE8B078B349045FE2BB1DAA0DBF2BF24C +:104E9000F89F023CD46E6A6B88A570BD76EAFD046B +:104EA0003F8537BBE37CA888C29B3D0EC5B86BDC51 +:104EB000173BB61DB0D17FBE087C4C5FE410FF6A83 +:104EC00097E36AF860FCDD858F3DC7103F16A8D3D5 +:104ED000E7BB6D6401D0B574AFA40581BF63C8FDA5 +:104EE0003E5A6E5729A351B8F6A9322F2546C70E50 +:104EF0008FA2D2F6A5B75BB4202D137919997F3D07 +:104F0000FF5E61FCC5F121E829F88890C6F8699434 +:104F10008E79B9FEDD46BE792ADE43DF8F6F3FFE14 +:104F200020B144DA6D5F497C73AD91EF28FFFCCC72 +:104F3000D0AEECE1387F61E47BE04BE013337D6879 +:104F4000BB109397A7E2611EFBDACFCB80EF6BA576 +:104F5000ABF979EB4ABF6FA2B567F9F195C83EC0CE +:104F6000ABF9F9518E5FAA1902ED79A0B5259248E7 +:104F700051DD2FDD7F14E05B6A6F4BB89DD2B7A681 +:104F8000E4820DF0B03AFEEC0DFE28FDF40447EB90 +:104F9000A55C878FCEEF60670CE2BB5B3BA0271D53 +:104FA000E7DD95337D1329833E119750C4952DDAA3 +:104FB000B3895CEF4ECC5A349929AD2EBB275D895D +:104FC000216810146A47CAE00985AF62EC2E05EC2F +:104FD0006719D1D94B37F6BB8D0C037A580D766D16 +:104FE00052D62DA7C1BEB42A6D6B1229EA5BD32419 +:104FF000B43F375F6A6C01DB75739AD560E72A5559 +:10500000637D126176528C334DA374E7EF2FE0FF7E +:1050100007717E53558A5ADAFFD4ACB860804EF9D6 +:10502000D6B177F926EAECC57B97E5FB7D85DDF106 +:1050300033D92DF0E343BCFE3E96E26718CC73767D +:105040003D43D3D5F161C6A3192F133F9D3F99145A +:1050500075C7CBB5CEBF0BAF84FC04E6374993C907 +:105060003A7704AF66FCD0BF29F0DD7B25F43B091D +:10507000FC820EC542EB95D74944F805657D7574F1 +:10508000E7F099F16AC69FF03726F176EF00BE2867 +:105090003F4D92B738801F2A7FD43A3199EAB1CA7E +:1050A000418CBE2444914BF17213419C015EB721A7 +:1050B000DFB9ACE86750BBCEF8E3D3F2D3121D7F63 +:1050C00072277D47E12C57A5201511C0CB71135EC7 +:1050D0008E9BF8E2B87EDE66787F0FFFB82E0ABF9F +:1050E000288D7920F713DCD43F01FF2183A857A82E +:1050F0003D1AFDC9C844A61FA2DBC9F19DBEAE7E04 +:10510000183E1A916F24E2EF7AEEA2FD84346B0A06 +:105110004503996077A19C4C20DA9A763BA04246E1 +:1051200038055C97D37CB7BB69FB1252B9A65D8F7B +:10513000E74F853D67F89EC0F13781040EC80950DE +:105140002ADFE8E72DFABB57CC6730190CFED08771 +:10515000AACAF432EF4FCC2F399984240A6058B28E +:1051600007B749003F09D8FA44C6B372FA9ECE9AEF +:105170005EED46BD5E47005FE0B6003D4BF9FB5279 +:10518000BB2304F010BBB5A38B2EE0C390592EF0C7 +:10519000FB285EC895F8087C0FBB25E5645E04BE5D +:1051A0003347EC0199F2F5C474FF0F000F1DD23B99 +:1051B00045802FEA97E5803E37BFBFF0714B0DBCAD +:1051C000A7DFCDC7EFF8BC1683D34DF926BC3F2629 +:1051D000B8CD1D4D9FAF62FAD74E3D519D9C96C6EE +:1051E00031399F447C0AF8970763999CB5C42E44D3 +:1051F00079282775F543697F7F8CBBF908C8592545 +:1052000009E077652E231FF6C6A7B790F07DE0F77B +:105210004ECAB39AFCE800D2E7606C6E16D8B3832E +:10522000B14C2F0BFFE165B7EF5937BECF08825E57 +:105230003EAE8D7A17EC4455C9888F46D2D262F7BC +:10524000D9809EF380BF285EC7027FD1B607A1EB4D +:1052500074E4AF20B49FB3D6C45FF664ECDF47D5E7 +:1052600018C055AA59BFD5FBD55D78E376B2377F14 +:1052700091B428248FE2752EE7D383B13101F0E396 +:105280004A9FA0724CF13787F89F6F94000EABC114 +:105290007F9F1B6B457F6FEECF6351DE69E32D75FA +:1052A00074C8F9F4F93ADA0FC95307EAED3A69D448 +:1052B000B507FADB55E4C7B92EF6AC9DF691DE07CB +:1052C000FAA5DA8DE2936CB69ED7F3A579FC1EFBA6 +:1052D00035B53B28919960570F5AD5815E9DFD7871 +:1052E000D36DC1F99FB7676FB1787AC6D37C7BB2B3 +:1052F000A68C88D44FC6C6CE8CE62788FE045EBB3B +:10530000D617E49BC6967191F5C563ABBF6E3D326F +:1053100048BFBEF8BA55737CFFF5C5A9AD5FE3FA87 +:10532000E2690BF50F016F8A2F7F9ACE2FFADACD43 +:10533000FC976096F635C8E1D3DC8FA41C943F6DD2 +:1053400068F7EFFA2E9F404E50168BB193406C31A8 +:10535000D5030A09588BE17BFF2A0BA5B73293A02E +:105360005DA27A08FD4F331E4E6795FE03F856C8BE +:1053700067691CE57F2A8F4F58D4A646F0B3DF96A5 +:10538000A9CF4A475F3E07FDBFDB962FC4F2DCF191 +:105390004B39A0174A39BE150FB3EBB5F14CAE6AC5 +:1053A000E3991CFD31CDAF78E8F3564D768EA4FD20 +:1053B0002DDE2B7B63102DE10CE0B7DBA6C8A9F036 +:1053C000FC84DD8AEBC7834E46FF1344AA00FC949D +:1053D000BE17E3DB43CB47D34A723D3A3FF1D1B42A +:1053E00089582715D4E1A37CB9CCCEE4E10471330C +:1053F000B8D74ADEEDF4D1F9B5EE44E0CF8356627A +:10540000F047D23D0AC29BEE6178ACEAA4C2398271 +:10541000F15D1D1DBF4A516DE0FF5775DAF039C0CF +:10542000817C196BECC7E361FEB8C7C3F8A9AA5326 +:10543000C220C1C158733F0A7BCEF9DB4C87A7DC81 +:105440001372603E8FA669B91EF45F5505F0533A9A +:10545000B2E563D087BDEBFF8004FABFF692141A61 +:105460004CE7DFB1C78AEBBA0EBE2E38B3E750DF88 +:105470002A5A2EDDF54102AC1FC7727A9D515A138C +:1054800000BE25AF527FBA10D9B9EF3DD87ECEE825 +:10549000756C18BBDE2E5E7F3973A00FBFA3008E24 +:1054A0008EF86513EC8120C07770953C13E846EDCB +:1054B000A6F0CB24D093657B642DB6A8BBBF36D5B0 +:1054C00063E5FE3AA3E3432E364E4FF25DDA194F01 +:1054D000823AF92E555405E02FED4CC0E7674E6D2A +:1054E000DB3895F27D20CD8AEB436A855AD05F94F4 +:1054F000085FF0D13A9D4F0B9FCFE13DB7DD7E03B2 +:10550000FDE79B607FE83713DBFC294CD8E9EA6EA6 +:1055100074C4FF2A7319FD44B31F29EC5945F3865F +:10552000FA0104F01EBCED06E0C3530A013EECE6AE +:1055300067DB6FEEC19FDC807CF4DA9E5FE13AAA04 +:10554000C8A362BD76CF8572E0E31A129A01FDD638 +:10555000EC915D21FAF561B2A700EC8AB0FB022F55 +:10556000A14B87EC5EB00BB1B26B35CCD37E8743D9 +:10557000A578BAE15C610ADA3FBBB502F462696CF6 +:10558000B6638E8E9F0FA6C815C0078753328DCF86 +:10559000ED1B0BC0FEEDB3307DD472F26E471B7E67 +:1055A000775B0AFA71C2EE9BFC561127ABCC96834F +:1055B000D1FC61226FD9144BDF4FCAB51219FCF729 +:1055C000B645E80F74B3FB97FCB83E30DB7F8177BC +:1055D0008A6994976E7E6B04CF06FFF5690F8F97EB +:1055E000A96428F8A3A14B1B17039CE79AE35DABC2 +:1055F000311EC1FC9D73ED8B364E81E7EFC8185FFD +:1056000039774946793AF8C6E2C16D3A39A61604A7 +:10561000E97471F8D7675FA7F4B9F8799C3780FC13 +:10562000B7B320DA7A59ACA3E8C8FD2D69087F7FAB +:10563000CB5814375CB7DE1459B7FEDA83EBD6705B +:10564000399893B42DC76CC01767A80B0FF00628C4 +:10565000F1B753BCDEA4B5C92E1D3CFF97CB7791A3 +:1056600047DB057A25404A0750A7852C88D34A6E28 +:10567000007F741A716DA3F3D97FAA54B2D2FAB81D +:10568000ED6EAF44EBBBC12105BE7D550E6EA77814 +:10569000D84DF5F16EDAEFC2D6469B9B8E1BD843F0 +:1056A000811A43EB9490808753D64046928E4F16D2 +:1056B00065B2714F59FDBF847E4E7D1243607D7887 +:1056C000EAF3B8A876B83893E9CDD7B99D7364AA40 +:1056D000D83ED4F1DA9BFD295CA14ED770C0FBA265 +:1056E00097BE9667D3716EE4FEDAE44DADF510D740 +:1056F00099BA25AC80FEF1055D656082A7BFE4B56F +:10570000825DBA7D87CF0AEEF98C3D7556783F737E +:105710006FE361A8DF1DDA89755BA6FF23C0EB4D3F +:105720006BC387805DB21A89027241BE617E589850 +:10573000CB9DA7D37B3011B9BAC4027CDE35FE8A7B +:1057400056055CA2A9F56C7CDA5F1BF657179E0024 +:10575000F62D6339EB2F831C5895A846FA1D7FA9B7 +:1057600055D2C71B4A7FB804F9E8F947970C4E0693 +:10577000BCFF358664BBB96CA4C0F38141587F126D +:10578000A52D7FBADE3F23A118C637C4CE4AC14F2C +:105790009A9DF1912B0EFC85479EA98B03FD90E20B +:1057A000536D7E1D9D4A374E1EF216F0696C0CC675 +:1057B000ED2E0E677EFDC50D8E6080C5BB8700DFB8 +:1057C0000A7B5505F436C4A384BC33BEA75D04012F +:1057D0000E511269B58BE8EB24940670757A187D2A +:1057E0009B6CEA2C18AF292EC605E355D9B36DA0E2 +:1057F0009FBAE29F1044A47AE206EE6FEE3F753046 +:1058000019E87A71F8AA0C5817842CFF8EFAA83779 +:10581000BE5AE2D1923211CE4006ACABC4F7FB4E79 +:10582000C615823D7C5DF861DED98361BEA25D5103 +:1058300026F30BA83CE0FC851CA4B4126D6B21A2DE +:105840004ADBADC3477E268BE38972B7550D3039ED +:10585000A27E08C8953364CF0479DD9789F5141FBB +:105860007178E9FBDABDD95E594539CFCF4C8DC887 +:10587000FF8D5CFE535AC32877D7BA3E706532BE9F +:105880000D293BB9FC10D443203F4C4F870630FE16 +:10589000080C00BA805EE0F449976859CDE92CE61F +:1058A0009DC2E57E2A976BC003BCAFE4F314EF6F93 +:1058B000E6F82A930B13DBA2C47DBAF86E793A019D +:1058C0007FB16CF9002C2B39BC0BED1B309EBA302C +:1058D0006503C65153B4462C174E6CC4E7695B662A +:1058E000237F2CDC2C19E2A2A27C81FB5F674E593E +:1058F000D07E114B5C7FE03FF1FED7E067B0B8F09F +:105900001D80E7D37B363E53A446E2C2A79B983D59 +:105910005C1067F4EFEEE6F3DAFFCDC164E0978B3D +:10592000B18D53EF0639D92EBB56011D9BCA2435C4 +:105930000AFFE9F10C78AD6DFA4739CCA386B4358E +:10594000809E3ECDFD32B559427DAAEEA5653F2A27 +:105950002C4D4CBF9EB232FD7E4A4A96403E40BF1F +:10596000839E3DF5F9BA8C47818F2427FA37A037FB +:1059700077E9F863F18EAD0DFDE93F6FBAE41A0ED9 +:105980007C15528843AF9F059F087D6B867B05A7DA +:10599000ABE0C31B22766805E00DE2A740B29A0D8A +:1059A000E7317EBA81D3AF09F80DE479ADE0B7E114 +:1059B00016D4A726391EF32FD2DFFB9EFA4506C662 +:1059C00025C652B9A5727D1AE43A0A5FFC9CD36FD2 +:1059D00089C7BF29338ABE3F2DF97F999C1969BFBA +:1059E000EFE42D43AA74FD3CC8F171D1EA1FEC8AA3 +:1059F00082AF085E497FA0F3024A19C003D922B9D9 +:105A0000C0EF13EF53B6B07D8097B91C89E7A22E83 +:105A1000F03D1EF09D89F87E3993D97D1B98E4B442 +:105A200020B3FBC4724B7FB0E30BE3B45B300EB327 +:105A3000C14220AE44A452E4F794A6A74F5E1E09CB +:105A400065AC07F755A85F0DFBA50B9F50711DB8FE +:105A5000FA8558E4B350A607E7B5BAC98AFC76DAE6 +:105A6000DA98817CF9F9A2C1B02F13F884D9A19EEC +:105A7000F029F8E727DC5E0BBEF3AC677CD7A4689F +:105A800071C077C28E0AFE3CBDFDE6629037D13E02 +:105A9000C237AEE1826F66D3E79EB56D32D087D252 +:105AA000ED8F8087CCF561D45F3DD14DECB709FA1D +:105AB00009BD9E906531E0FB330E7F0AF75FBAD3D4 +:105AC0007195811E3746F8FF5333FF5BD5883CFD47 +:105AD000A11739B83ECBC5E20C9FCD4903FD22F694 +:105AE0006BC43EAA18FF2CE7879EF65B0EABFE3315 +:105AF00099BAF9C07EA08A7A9DEDAF94717F7BD967 +:105B0000F698600CA5DF3E7805FAA23D2E087EA22D +:105B10006897AB104D2926E4BF33DD385E2EA80A06 +:105B20005A4F596E235974DC8BD71D6849A0DF4F3B +:105B300009B74D1E46A7B6CFD676FBAD10F725DACE +:105B400022F02730560F7CDEC1FA25AE9D0638AD17 +:105B50005916C33EA898774F76AB277A5C9FC5F756 +:105B6000C7F87BB39C1FE3F83AC4CBDEE53490085A +:105B7000727A1309AC82FD117289B8C01E77C9E927 +:105B80002582F6657096514E453D8A9C0ECED2CB4D +:105B900069671B93532E8F894D562D9A7F32348B14 +:105BA000AD7B139BCA4AC09E24FA08C63FE8345115 +:105BB000AE1752B906790D807CF6037C32FEF2688E +:105BC0008DF7C17B4F13F3AB2F26B1F92EBC513BA0 +:105BD00020839C53BF5EA29F3672B9EE19EFA14499 +:105BE00089D9A744D027378D6B9B00F656857D81D8 +:105BF0007E303F46DFF1E3483044E9AE5E224C4F51 +:105C00007CFE8BFB1E05FDB0C1E1CD5623F627ECD3 +:105C1000F197001E7A9267CA971AC4A396FD9783DC +:105C2000AD037BD81F1FBF5C46FEA37C7E4B960E48 +:105C3000FFE37D6119F09A1CEF4FB32611724FD329 +:105C4000D0E9F641747E6EEADFD2FA4C5A5F0F71EA +:105C5000B73E6D84D79F72A47FFF38DD3D5985EF35 +:105C6000D753B80399DA5D59A9B86F7D0FC073D3C4 +:105C700080B00CFEE7B5EEEFD7427C8ECEE7F81D84 +:105C8000435E984D9F56DDE56B80B7228E3C86C7FC +:105C9000916B9B87637C59174F5E94759578726FF3 +:105CA000E32670B9A7FC8DEBB884B16119F4A2D0DA +:105CB0002BCBB3FA707E6E23B0AE10F2057A09FCDE +:105CC0005A916700714527EE5704F17BA8271647C4 +:105CD000F4CDFA464B4534FE7E3CCB11558F92E60F +:105CE000FFFE8F4747D3F9C22BA6571FCFD2E9D566 +:105CF000A6C6E37D999F4AAD3CF51B1EE46BF98D6A +:105D0000ABBD7FCE02BE7B57C678CA7531B6800464 +:105D1000EB7E8DA8AEBEBC3F10BB6629E42CA2F57D +:105D20006F25A2419CF25B19CB8D3FF655B8216ED1 +:105D3000F2B1C5BB9A60BE02E267EC6012B4D37FD9 +:105D4000EEE5F1CF92130E0DF200CE4976D49FE727 +:105D50008EC505C07E9E735A306EDEB23F06E5E208 +:105D600042561C8F67040D710FB19F73E19D39C9B5 +:105D7000A0F79FE1FB9BCFC4B2B8EA3377E5603C64 +:105D800052C46D1585E2BE0F84A9285EFB807F3C5E +:105D900000E3A9228EDBD73E5B6249456C1CC5CE71 +:105DA000E6D757F14B101FDFDA4B3EC4EB59361ED6 +:105DB00007F0EF01FEAD5DD1668375ABF07B855DCD +:105DC0001EDCE139007911832B58986C6B87C50272 +:105DD000F3DC4AD929C9DD9DBF041F6DED9E7770A4 +:105DE000204B17A79DF618CB3BE8AAF376BFE479C2 +:105DF00007E3DB8FBF02FE1C95F75D867665A97110 +:105E0000FE287A6BC6F21F62FB9EF87F8685F8A398 +:105E1000D99113427F2B7503C04E91BF3F12AF46FD +:105E200089CBCCF8AC2A15F0628EA745C6FF318E1F +:105E3000FF59168F1F65900CD85FEB6D3FD30CF7A1 +:105E40004756FFA068764AD0D93C5EF7F66C1DD65F +:105E5000F59D8DF8773958BFC5BA7E53B299BF33D7 +:105E60004362FBF5E432417B2DF884E2FD3F812F54 +:105E700046FFE9C48838DCE709CBA00F2E7C9C35AF +:105E800010F7DB7B58770A7808F16747CBEBA0E384 +:105E9000F9A2D121299BD1618695ED4748776563A9 +:105EA0001C60466C8C14A3F34F2E77D95BCDB02FBA +:105EB0007B3076CC488C5F5AD581D1F067DEAFBDA0 +:105EC0009C45905F012FDE28FC24F695059E1B4A19 +:105ED000B41285C5C7C83630811AD3A3291504F773 +:105EE000D7C6481AE223339BF94D5B79BEDC857730 +:105EF00064D40BA34BD4206C91527BE1CE1E85F968 +:105F000057AF5874F957824F1A7E43EDB2217EC8BD +:105F1000E44AAC9F93B83EA65EA3B64BF79DBA0287 +:105F20007440C41E0CACB71BEA190FB988A2B31792 +:105F3000495A9AA13ED0E78A8375D3C00AD5D04E7C +:105F4000F09DC8FFC3BF1498B70BE34F7D383C6387 +:105F5000243FF20DE837880F97707AD2F98EC7F98F +:105F600056B45DD0F38D986F6FF33ABE92C243156D +:105F700058FB4A0A2FD50B73D6BB57A521DE5D040B +:105F8000D6132757DAF1F93CDE3E69D3EC86743A32 +:105F90004452BD8A71D924ADEECD74C8B7ACA37597 +:105FA000FA37B7519260BD4EF50CB67B6EA50B4B20 +:105FB000416F177D2F817D2F2579B04FD3931DF32E +:105FC000673B0CEBE1ABD8317FF6A8EE76CC62F7FD +:105FD000BE05FBFF4B9B6515F862CDE43E1AF0D37E +:105FE000C69D9217E26E879A591EDEC619CC9E880E +:105FF00071CFBE9A8876E3ACC4E49CB424A11CD4CF +:106000002671DAD427E17EEC39BEAE5E91E5AFCBE6 +:10601000D6E9CF8DCDA362715FD66497E89F4BA27E +:10602000ED700F4E02FF69F85A2513F5C072809F7C +:10603000CC6F1B119B097CEBFF609C047AE09B0CEE +:10604000A0A7795F4FECFF897DC13FA6F95765EBAB +:10605000F456F7FD3EE33E959C60C73CDEB132CB83 +:10606000E3D5D95F02745D037E22E5BB35C7E2103C +:106070003F6B2E33F9A370FE04C669718E467E1203 +:106080007696C259F42EE90E67AD258CF1421D9C1F +:10609000CF5C1D4E539E2B87AB0BFF7C7F4A762A2D +:1060A00008FF3912E70538F7DABC1FFBC10E9F8DD8 +:1060B000C3F89EA04F0D97B173941E1285F3DCDEDA +:1060C00011B11607F847FE17805EF2A07002F8E7DC +:1060D000879A47E4C37C7ADAA73D9255FA7236CAAA +:1060E00099FF37D06EBCABEDC26FD5C8FCAFB2BF65 +:1060F000BB0BDA7D07FCBCA6E7A3DEF053AB38D6BA +:106100004A2C408E7E98C4F5B499EFA4E603FF05AF +:10611000794754DE30EF339041826B28DE1A8632A5 +:10612000FE2373898A76D9C4272BB27C6F03FC4285 +:106130004EAF829F7701EEDA2C5F2B7C0F700C281C +:1061400046BDF47E36B36FAFD82CD89EE5AF241190 +:10615000CCC731EF9F9FCEAAFA04DB0BFF2BCF2FCA +:10616000B90ABF931C1CBF3A7F85902F96723C2DB5 +:10617000857D5DC857DB63ED30E44598F0F0789697 +:10618000AF83E181F2D948C6676BC855F11186EF3C +:106190006BB3FC17002F4E2BE51740CAD8D9698086 +:1061A000E7C3AAF635ECFBEF5EC5F071EE4F0C1FAE +:1061B000FBDA2DC8D74F93212897C596F3F741FFF7 +:1061C00054BF5C867EC685774AB06EEEB740B58018 +:1061D0005E1E10F6CA96ABF3AD9483EB27BF022583 +:1061E000A5C383408711EFB078CE55F8D60EDF7F78 +:1061F00007BC27E57C07FD43F92A15FA177C75AD26 +:10620000F956942FC8803EDDFBA3EB28DC5F38B045 +:106210002F06F555CD6E09F579CD1B5FE07ABDE609 +:10622000B51864CA89AFC5E2FBF37BD8FBB325D1AF +:10623000F3013272FAA0DD59BAF3019FD14E07F093 +:10624000F9CFB4F3AE2C39B2BF9A3C859D435813B5 +:106250002BF24DD93E6B02E7B3E4413E0DEC507298 +:1062600019C17CC10407CB43EC7EDE80C96D2A6F67 +:10627000E772A912E0D97CFE408E63F985A964FD1E +:10628000D780A7E40AE3FB544705EEBBA69ACE29C4 +:10629000087C97E570FFD946D2408FEC34E55588ED +:1062A000F2FD1CEE07D627E17A50E170B5386DC8D3 +:1062B000B7CB9C769CF7B224923C19EB0ADA7F7339 +:1062C0003F5DFEA76621AAFE1C45451C5175FE5187 +:1062D000AAAF8FA1DE6F667FC3F7E97E8FE1FD80F5 +:1062E00005430CEF07D5151BEA83975F6FF8DE4D6A +:1062F00011A0AF67AEBDC5F07D76E374433D77F383 +:10630000DD86EFF3835586F7052F2D32BC1FBA7358 +:1063100099A13E6CEFA386EFE51EFCF26773589CD3 +:106320004D167EB973A41FF84A76DAA518DDFA6F08 +:1063300019A7474942451AEC5BD63BCBD3607DDABF +:106340009244EDF155E26EDF77DDD628E8CFFDAF60 +:10635000521E773B7B906A11CA7F3587281F0C43FA +:10636000FFAB3187FB5FB355F83E6C437BA278717E +:106370001E3312EC184F33F7BF2C478DBADE922D27 +:106380005ED764A9677C09BEEC0D5F9B395EFFB7E1 +:10639000F8FAC8943724D67BE6767FCEB1707FDCDE +:1063A000BF3B47BFAE2361D987EBBA6FCE0608E883 +:1063B00051827E4D6DBC0BE312663F408CFFC734AB +:1063C000DFEBD08F599FFA96CF67DF59E80243EE93 +:1063D00079BDF7E71CF37AAF6C26D223C966C0D328 +:1063E000FE2E3A6B86F55E7DD2685CEFD55BB5B468 +:1063F0006B59EFEDCF2188EFCD40D7541D3D6D5E39 +:10640000D5857ADEE8BF74F7CFA9FDA3F3DC087E5B +:106410009D047E5932F3D7774B386F31EEF7F0CFCA +:10642000DBF5F6A927FF3C8678D72A32D2EF4BB0AE +:106430004FD41F7F3056FE5EFEF885EF620FDFB748 +:106440007A318FFDFD29325945F178A1624C3F1216 +:10645000451F8BF2288FDFECCE2548B7DEE21FEF19 +:10646000AF5C70D5F31CEF57B23CCDE9C047BA71B1 +:10647000D373195F8CC8E5FB92312C8E71E63F9C7B +:1064800078EEE0CC2D1F261027E4B78D1819803C3C +:1064900066E27D08F26F020E27C609A7578E1AB969 +:1064A000CAA9E3ABB10CCF137EFFA70488FF4CDF72 +:1064B00095991A70F4CC4F23F8FC88D2968379D939 +:1064C000AF9FEEABD272FABEEC5416A734E6AD998C +:1064D000E346D397D718E47869A74482C9BABAD2F9 +:1064E0008AF9814B3B157C7E39C71857EA115FD773 +:1064F000884FF37381CFF72B4F67403CFD6C6C7472 +:10650000FFE37E8EEF2EFE319D83E9E97C4739EF74 +:10651000FF42C575FD40CF4DB7A9D9D712E7127814 +:106520006ABDF4453CE88937E07C4D94FEC7E7B28C +:106530007DA537B4CFE1F80329B1872700DF97F0B5 +:10654000787A94BCFFDB7261BDD459F12FC9FB9FEF +:1065500095CBE9C3F3EAF372D5A879FFBD9D5F9AA5 +:10656000668B6EEFC646F0F721C8EB83CF595D000E +:106570005735F84E10BFDB6AC5F8DD07976208ECA7 +:10658000A77CB1C5FA2BC8575BF05CE6739B687DAE +:1065900041650CEEFF546FB5B2FDB9CAD82084AA8C +:1065A000166C7DB8EF1C3ADE57546E9764D3F7CF64 +:1065B0003D8DF9331FB4AFC3FCEDD320CFF4F98286 +:1065C000CB8FCF00FCEFB335160CA7E5921D92E1FF +:1065D0001CC6A2A658435DE4030AFA1129723E4381 +:1065E000A5F6A421D7781E6B4464DFAC2197D96B44 +:1065F000CCB3AF99C2CE631D3AC9D6FB87B358BEA0 +:1066000060A8F2CEC9C3E93C2A53AD182F31E71771 +:1066100012824427F379FE6FE5270A9EBBAD1CEA80 +:10662000443FF0CD95754807DACE51A63B8F50F91F +:10663000731677A974B3BCF91EF30E4DF986E27C8C +:1066400050B73CC3C8F9A0E3D1F8E657B946B93E04 +:106650007492E515CE7F4766F3EA456F1EE5F3F8C1 +:10666000A07DC8BDBFA5F8F8A08269F10F2EDDFCA2 +:1066700018C4BDBEF04904F23CBFB814FD5CDA3F5B +:10668000BAECABBFEBDC0ED0E7B68A855D7510CBFC +:106690003B7C0F18CEF55CBBBEB9BA3EA9CE65E710 +:1066A00032CDFADDCCF7FFBFF4FBF4CAC3190127E2 +:1066B000962F40D9B18BE947B39C9BF5B980CB0CA1 +:1066C000EFD24ED990873C16F4C028BD3EB7E17B8F +:1066D000EAEEE37C02A395E01A09FD80CF81EF4743 +:1066E0003A82C92574887AD7B6F8ABC56FE8FAF94B +:1066F000347C5FE3F6774099FCC7FEA560EF47BCAA +:10670000B313F308CFF5904FFEA1DB94BF2619F722 +:106710000BBECD2DF910D6FFEB54560AF91C498556 +:1067200090E73B7C9BCBF6E57E0AFB96356F5D449C +:10673000F97CDAE64F83F840A0BFCDBB3D4A7E88A6 +:1067400092F7DDCE25EC80F83CD03D2FCFB0DF07AF +:106750007122CC5B381E8771A2E7D3B4B83CFADD56 +:106760002B695A7C1EE8F334CD91A7B34FF57C9E7C +:106770008A25BA5F5C9627F8DF87767C5E29D5BFCD +:1067800051F8D09BC7F2F94B9EB92B03E2719F1FC2 +:10679000BB3B03F463CBD363AE9AD7F633904FAAD7 +:1067A0003F9F04BD9F1DD94FFD09971B11EF9E67A9 +:1067B000F3E5E8F3B192F392D87EED75BB5B3D94BF +:1067C0004FDAD7CBA8BFDB1D2C8FED8443A9682AF5 +:1067D00064ED520CEDD8F90519F89ECAB1E250BE2D +:1067E000D5EBA332E0E9D49EE759C6E964235E3BCA +:1067F000B4B71DBFC50E76549634178BFF337EB8E1 +:106800008E8E00FCF038D76397D3FCE301EF366E31 +:106810006FAFE3F6567198ECEBC0ABEF8FEF4DD353 +:1068200026423F77A7696540D7BDB64001C8CDDE97 +:10683000B8E8796993F2983F129BC7F98538D07F01 +:10684000C5F164DCA79F9AC7F6E97D50DE3420BC11 +:1068500006F2C93F74BBBAF6B97D789EDE7707BCF5 +:1068600027696DE456C893A3C0C23987D74F1D2747 +:10687000A0BF12C2ED04F269124CF9AEA2FC2A8F3D +:10688000F91FAFF17DCFEE72C7F8CCCFE16CA2F269 +:1068900002E74185BCC0FE3AE44BAC53FD5CEE58C8 +:1068A000BE47D3537D24D867F168AA05F803F24C9C +:1068B000413F99F3839AF3981E053994AE22870FCE +:1068C0007F47396C7A6AB22516E07C94605E075582 +:1068D0007EABEDB4FEFC329717CE8765AE27B80EBF +:1068E0001AB43C6E1BAC93025C9E066F22AB63E94C +:1068F000D76E9EC727F2A2DDF56D0A9E177894E544 +:10690000E99DFEFC16D909FD7F2DFA37E6058A3C84 +:10691000BE468E5F318F251EFF93C01FE6BCEA9EE8 +:10692000F3BFBECC873C87E784BCF33C9C713C0F33 +:10693000675CD3D3188F1BD774B322D14F9E5742B5 +:1069400012ACF79EAFD314B037BFCB637939BDE536 +:10695000C1BDCCF9B191D3B9A77CCA17F87751F270 +:10696000295FC84BD5E593FD80E5533E9EA7E2F72E +:10697000CFF33C9AE7EB58BC6ED14BEF49FABC39E8 +:10698000F19DC8BB1BF810CBBB7B5E698B05FEB9C4 +:1069900018CBE875F10771C15518946F1B1EFD1CCB +:1069A00082398F9CE58F0F0E874B301F8810BC07F4 +:1069B0006148BE6AA0CBD6B02B0EE4A5377BF0268B +:1069C000A7E7B5F2E18BF90C9F51ECE63B80AFEF06 +:1069D00060375BF398DDFC20EFFBD84D6E2F85FD13 +:1069E00014EF8F717A56E751BBA9F36B7576F358A4 +:1069F0005E14BB99428298A7413A2C5E7D5EA8281E +:106A0000FDBCDFB73DDA17D07E1C8FA724741C278E +:106A1000924E0F4DE7722DEE9778B10FB97F5A94D1 +:106A2000794CE1FD596685F13E8A8466296A1EDA51 +:106A3000876EA64FA85EFC4F94B3C1546F4ADDF534 +:106A400066147AFC13BE1FF08E760898E4FAA4A6AA +:106A500078709FAE420F4B7E2AD04393A114F82F3B +:106A6000BE625C470AFCC7E533F9ED9BADC5E6D3D2 +:106A7000F22F5CCE7AA24B7A3EF36386F052E4A901 +:106A8000EF36F9A313F2195E6ECE37C61575F44BC7 +:106A9000CF8F423FA187DFF6F806023CAF9DDA1D9B +:106AA0000F7C24E824F48F995E11395B25F6C9B375 +:106AB000F3A3D81FD1DE6C8722ED0308F756E0A3BD +:106AC000912CDF07CF11F0F308023EC1E71A9FE7D0 +:106AD0005F3DDA7080D70CA7ABC3225D0DCEA470EA +:106AE0008A04F29FA4B9B07CFD944502B85C6105AC +:106AF000F3DD5DDC3E9AED2055171CAFAC9F17B956 +:106B0000DE6838C3F2101B4AFC6910FFCFC9D626D5 +:106B1000025CD5795A1994D7656BE5507EE8667E9C +:106B20004B7ABE560175912F6086D397DF957770AB +:106B30002BE033612209803D84FB64609F2581E75F +:106B4000312468AE52B063095B08E60924C7870F99 +:106B5000C4C0FEDFD3C40BE79F7202AA05D65F99BB +:106B60000F69ABA16C38C3EFC52921787EB22B8F9A +:106B7000AEDE837974206F7A7EADE278AECA677A32 +:106B80008EFA21F7E733B866E7EBFC1021473DF9B1 +:106B9000153A395C80EDAE5D0E6BF3BF9B1C3EC8B1 +:106BA000E5F0A16B91C31F46E4F051F8BE37395CA4 +:106BB000C7E5EFC55EE4F0FFF07E7F97DFA31E5DC3 +:106BC000174D0E459EB0E0779043B0F741DE1FD5DC +:106BD0009F3FCB4FFD5E72B9399A5C9AE5B1ABBF6E +:106BE0006BE4FF9EFCBF0143FC7CDED1FDBF1D3C7E +:106BF0005F5CC833959797B9BCFC9ACBCB0E80F7F6 +:106C000043B78AE398E5ABCBDE84999E80FC3C7D5C +:106C10009ED6E108BE5E857ECC7939E34CF1FCCF8F +:106C2000F2193FBCC3CB84F071027A81E2ED8D7C16 +:106C30009DDD7891CB4B602CCB3BA5925A0A7EE52B +:106C4000BE0EEA470238F90CDE719B5B0F81DF480C +:106C500094C678B8E7AA273C7986A8625F202A9E66 +:106C6000E8F87F86F1CD746B06BA39BAFBF3667A21 +:106C70003573B90D737C7C5F3804FE008E61088724 +:106C80006A59A7B3F39F733D41E16D0778C74F0C75 +:106C9000CB04E10AC5C3FE89D0A764206D3FB27B57 +:106CA000FB8E48FB0EA0D7788DB62F8CB44F825048 +:106CB0007E26E831AACFD04FD6F0BC62839BF18309 +:106CC00099EF9B6CEC7C4417BD1AFB23BDE6AAFE32 +:106CD0006FA1FF26859D1B695AEB92D8794096EFEC +:106CE0007B225343BE8DA287C890EFA68794214C88 +:106CF0000F59875C831E720CE9D243F1F07D38F79F +:106D0000EA7A6800FF7EE090ABEBA10CFE9D67483D +:106D10008FFEC0009897590FAD53191EA2C8E960A5 +:106D200080EFDB5C4D8592CAA97B486AC4AED17600 +:106D300099509FCBDBAF6F64F9160112E78DB6CE89 +:106D4000F00E715C6BFE9997C3F99DF2A837FEB8FF +:106D5000CD06F816794E625C73FEB4A0634DF3AABB +:106D6000116428E4695DCA00BFF2DCB16F313E7284 +:106D700024AB4A83F15BF68F31E46589F197F178B2 +:106D80005A995CB813E2B3E78FD830EE2913F5D9DE +:106D900071149EDA235612443DC5EE1B10FB61D6DA +:106DA000230DAD108FB712DDBD50B89E5113816F0A +:106DB000AD47D8FD4C2485BD0F10FB2A76BFA371CB +:106DC0009F3F4933EEF32757F431EDFB1BF7F9FBF7 +:106DD000CD34EEF3A7FB8DFBFC0316149BF6FD8D63 +:106DE000FBFC8397979AF6FD8DFBFC996BA79BF6AE +:106DF000FD8DFBFCB99B8DFBFCF941E33E7FF55B10 +:106E0000AFD8605D5DF0D232D3FEBF71BF9F22A4C8 +:106E1000354B775FCCB0BDAB0DDFCF6D63F7900D19 +:106E20000FAD33B66B64F71504E87F80CF2F88DF92 +:106E3000067CA690F09B0320BF25287943F4B385F8 +:106E40007B778D86B298C7C5AB371BEF395818349E +:106E5000D6BF7ABBE208E481D58210D17E6A5F9208 +:106E6000824177CF745FFC92B1BD88F32EE6F3398F +:106E7000CF9D82F35B643CB76CE693EAB76E63F731 +:106E80008605B456B8F741E041F08B8BF38B804B0D +:106E9000E063B1BC04E55CE041DC9F55639A7FB7D9 +:106EA000F9EEDD8AEDCCF336CF63FB90AEFBB0702C +:106EB0003F8074931307CB13A2F3827D72399067DE +:106EC0009213231E7AC2DFB5CA8DCAF1109366945D +:106ED0009B5835CECC77486F333EE3F38CF264C6D3 +:106EE000A7D3DB3F2A7F89FB4F713EB01FB25722E9 +:106EF000BF90BAE37541F386860151F8897A7E988E +:106F0000E761C6EF7B26FC1E56FD47413F5DF8F862 +:106F10001B19E9EA6F1B01F6EC2AF9671FF3EFAFC3 +:106F200075BFFD187C2FDA9BF7DBCF419EA4EEBC2A +:106F30008AD44537CD942779E8BF601F89B6F1DB45 +:106F4000200E5BE1B5B3FBC0CCF96BFE736047026A +:106F5000A51AC138E079E25D43FB5BE3FC8F825EFA +:106F6000E2221786A0BFEBC7FB85C687DB2EFC1687 +:106F7000BA575A5D304EB47B484DE70F2FC3B8DF88 +:106F8000F79E47E1B7D3759252C0FC6E5B817E9D40 +:106F9000D475BF2A5BEFF4D48FC823EBA9940ECA33 +:106FA0006857C3529C37DA3D65E905467BAF3BE73E +:106FB000995EA0B3A3350F5F7813F41EC5F7407830 +:106FC000EE7452FF46BA26FF4685EF9F8D4F40BEB6 +:106FD0000EBF250773DD707F959AD8A7B0FB7D4B58 +:106FE00022AFB00EEE534A86E7F98957CBBF28355A +:106FF000DD7365BE97A8A198C155CCE7E9E7F75DB9 +:1070000095F3BA389726E271B53359BCF969531C28 +:10701000B3BCC0C9DA679596039D1ADC12FA4F0D0E +:107020009264D84FBA38A4A41CE6ABF1FECB21364B +:107030009F8AE7EB10AE14D33ADE52C0BEB7149469 +:1070400062092B7AA0B74D96A3E2735201835FF8D1 +:1070500051DFE39E99A33123BBDF3363BE1FB13CF5 +:10706000AFAE05D48379DFF7D5DEEE99395A1E75B8 +:10707000FF17F01BDF27C2F7730B8CF72086E2FCAB +:107080001BA7403CE24FB217CE9B98E7FD4001F3AF +:10709000FBD7F3750BEC2BC17AA40F2FBB7FCFF07E +:1070A00014CCF23D807855285E29BC211BBB0F34DF +:1070B000FC21C171FA2FD00E407D944FC5F3150D00 +:1070C0006EE280FB82C2C32D181749F1BB26C2BDF8 +:1070D000BE295BA43E804EA117AC0A093829BF34F3 +:1070E00016B891CEEBC99A0370BF49E296AF8907F3 +:1070F000D713AE892ED0477349D438E7937C3ED35B +:107100009EF328B02E4BB447BFCFE1493E0FAA1FD4 +:10711000D6C13CC6DB8F8D903C11FD024B5BFCBFA2 +:10712000768BE15CB3284F644E68047E1DB580F415 +:1071300010F7647C7A83EA7B06FA1F7554C5FD8AD2 +:107140006AA1A7E75A08DC3B7A17679FBBB6B0FC79 +:107150007572E9CA1559F8DD04FB27B07F50BDC42C +:107160001984FD84EA6637DEC7471648B8CF51DB7D +:10717000FC9E0FEAD52347BA50BFC54B12DCCB08A3 +:10718000269FE933859C14FC22F349D1FE6772FBEC +:1071900020D6F7D41EAC8FA778AFDEB2F5009C8F57 +:1071A000F87FD4F003DD3E96FD1FFF90F67B073598 +:1071B00052CB8BA154C82C8CABA7613FB7F37E0296 +:1071C000DF12E9A43D32EE1DCD6FE17C3EB6928028 +:1071D0009D3293B5940D6D7D3411F75B457ECE0CD9 +:1071E0007B6319D8B973B670119C9F3AB7FF2F8390 +:1071F000601FFEB31F5D70C2BEFCDF95B0139E9F83 +:107200005AF18113EEC5FB6C05BB3FEA3E6E3F04AD +:10721000BEFFC4F5825AE86B01BADCBFF2F268FD2A +:107220003D3864792AEAFD854119533A845C2D7E04 +:10723000291E3C9BAEFAD29DC986BAB0074B634863 +:107240005DB438A1A590F1D1C21D5B6D035418DF68 +:10725000FF118C7F0A1289295D4EED71A2DF28E0B3 +:10726000A9DA31DC067EC6DF9B634808D62F4AAB1D +:10727000959DBFD4264B941FFC9CEE6638DF7C2383 +:107280001EFB9BF734D33FB3E958CB295EFDCDEC11 +:107290007E4BF33CE67DA696F7A3F89EF704B5E88F +:1072A0002AFB7E05A59B7FF9E3984F6D9EE7EC8056 +:1072B000F93E4B0DF55F35A7EF9CB5C6F7D5CD4F21 +:1072C000623F7389BA1EF206E7359ADF577E017E68 +:1072D0004CB5293FBB53E8A7D1640CE8A783F6CC93 +:1072E000C468E73045D9B1D285CCF9E54A3B96A7C9 +:1072F00056122C5B0A18DF2E697EEF11E09F9ABDB3 +:10730000BBF0FEA143C15129D7D34F263557E27EAA +:10731000E124BE8F7C6FF7FB34E30A69FB890ED34F +:10732000F9673EEF599C0EE23CF42C986F113C57E4 +:10733000BED1CFE7FC914C07FA43853CFF660C9D1C +:10734000977CEDF312F311F313EF97CA94DFA2B415 +:10735000177CDE52C0E216739BA635F4A7A858B37B +:10736000FF0B5C2F13D37D7A13EC4FB6F27C33C343 +:107370007D79F4EF28C8AFE0B76AE2C5FB43CD7C66 +:1073800025E84C1CD600BFEF18FDF82E7E6AFE09DA +:10739000E245D01B6EC6D3DFC744F9CAE037533E7F +:1073A00032D4E7351AEB67AD6D1920EFD5A6DF476C +:1073B000386BCA2F11A5A7D083F23757D5CAE11C65 +:1073C000CD3CE26B6079B8EC1CDE29A5F1CD1F82C3 +:1073D0001C363139F83BA7FFB6425F6521DA2FAD85 +:1073E00008EF415C9D2EC345BFB3D74B2E90AF39FC +:1073F000F5C3F13E9D62A2617FF7F6E0872D296417 +:1074000074A8AAB3121B359E55740CD073557B64B7 +:1074100071CF95634A5FB8B785D163E913BB6CE957 +:10742000B45C5057CDFC8320931B718FB4E03FA117 +:10743000FF17AD3F80EB70BAFE30C8572D9C8B28EC +:107440000239363DAFBB19E9506BF213AA057F7ABA +:107450008917F8D3FF88D30EE7AA7A9B37E91E5F16 +:10746000C1F8CBF923D9E83F9E57D57EF09D3F81E7 +:10747000DD5B2F29FE31F09CE20BED5478553CDEAC +:10748000E37BAC53262ADE37E21F03E7DFDBFE3A5D +:1074900008F76305BF8AF9D6DAD723BFD612E3BA55 +:1074A00072365DC040DC74F6F664CCDBA2FD17EDED +:1074B000057F63BB15FD8900599606F74CF81E63DE +:1074C000F7D056ED4DC2756D553DDB6FA9DA91844D +:1074D000E766E9BA12EFF716F438563FC1968EF414 +:1074E00072E33D5964AF91CF059DBAAF0B4D745A0D +:1074F0007BE0CD34B5FB3A5147A7F61EE864B89F50 +:10750000714B21D78F9C4E6405D73F0F1CCE867DD3 +:10751000A6F375B15E39CA7AA3EBFEDEB9D7637EF6 +:107520009988C755F417BF27E0ED0B74BDB07E14E2 +:10753000D2CD4CAF8A7FCE41BA90BF3A09C469EF31 +:10754000CD24F74FA7CFEF9798BCDCBBA6B202ECD7 +:10755000F9AB85CCBFFA33D55B5A2E5D0753BDA579 +:1075600051BDF501D56750FF70651AD6FFB252C5FF +:10757000F293957958B673BF5FC81165041BF8592B +:10758000AF73F979BD50AC971E4A03D7A2E29F1F93 +:107590008CB240E83370DF8CB24184DCAA19EDE193 +:1075A000CCDB8DF6AECDEA2A87F3BC8127D87D6887 +:1075B00055BE1B0CDF1345B5C13DB8246F44E439FB +:1075C000CA9B6A83F3E8774D4E367C3F63ED0043F8 +:1075D000FD834295F995159986E777CF2A30D467D0 +:1075E000F3FB5C893A16E5E6219E374AC8584617F0 +:1075F0009E8FF24DDD987EFF46E1FDE61D2BBE37E6 +:10760000D343D075EE6699F8697F733653FD4541D3 +:107610006C6FA474A2EDBEFAD809674748C38E11F7 +:10762000EF8EA5F5633B58FEEAB1FAE49F82FF7442 +:107630006C476A02C451FD0D32F7335C78CF99E88C +:107640007742FD2ACC53991D8CC17308B35B02CFDE +:107650008B3AFCC400BA78203747E5604842FAB15B +:1076600038C0CB3118C73F45FD3A571FB83F8CD4BF +:10767000430907A712E9FB7FB4A60641AE2BFE29FA +:107680006B69C04F2FC7F27D1A09FBFBF2BDEC6D91 +:10769000EB90BFD49D2194DF185C2FCC6963F3235A +:1076A00052F100A0FFA924A2255120962EFBCBDF8A +:1076B000144AA78539AD45704FCC2C7728F54EDAA2 +:1076C000AEA3C9CAEEA5A7FDBA687DE9AF63B6321D +:1076D0007DA2F5837B2222F80C16C1BCF3FBFB6272 +:1076E0008652FA7D393F58847A6D452ACA9519EF3A +:1076F000ED363FE23700722045F46444CED8FE1BDD +:10770000556EE9A06FE658BD7DC15EB5AFB7B27BDF +:10771000E1142D611A9E33DD8D7CDCAEA8E530EFDF +:10772000F6B56EBC4F478C5BB55ED6D87DB8942F4E +:10773000E1FB0DB21FEEBF11762BB056F2C33D39FF +:1077400066BE79F0813198F76EF67F457996CAAAC0 +:107750005FE7472CDA2FE3EF5890916DCAED86FB77 +:107760001DD9EF7D10FF58433EEA12CF1FFEE6B051 +:10777000A05F9308EB8ED34765E4B3D39EC6D1696F +:1077800099905E7270F4BFD1FA57530227E15CED15 +:107790008383FD2301AF8B2DEB3360FD74AEF9C401 +:1077A0004FE1FED82F7F63F5C2B08B5E5E3818E3E1 +:1077B000F4DCFFEEAEB7C4FDA45A3ADC17B458DDD2 +:1077C00089765CDD211136FF20C229ECBA6B9384E7 +:1077D000F7049D18E55C07EBE539A6735D27F8BD56 +:1077E00015E543993E11F6FE315E9F63617C4DDEE7 +:1077F00090D8BD52FCF71E843D10FA5AE8FD19439B +:107800003D2C9EC1F535213B516FCD87DB94E83C83 +:1078100097BC14C3E2CB2A5DE08FC67B4BF16FE3CC +:1078200050A62F16D97EF30CC852356945F8BFB45F +:1078300006E7B7BAA1FDD6FA3ED8DEEAC5782BB77F +:107840002F70AD3DE8A56A2E7F4B1B25BC1F8970AC +:107850003B398FF74F5EB246EC86278A7D31D9954A +:1078600079DCAECE23A6786DA3D1DEF9E2D9E2773A +:10787000111D17EC67042EEA3F53DCCDF707DF9CA0 +:107880008A704BDE601438AA493804F7442DDDC1F4 +:10789000E2D766B8CCF3B85638E77BA74D4C1AA9A7 +:1078A0001BD704B7C037067C757410789F1F60F82B +:1078B0009CDFCCF6033EE7FE1AFDC338B399FED534 +:1078C000C43715F2F3AA3751FDE98EF083E08385C2 +:1078D000BB82B85FF115694C70503958B279D78CBA +:1078E000EB54583FBF87EB90597D42D99624BA2E6E +:1078F00008BCFD4CC5A0DEE3F5FF2A3C117E6F36C7 +:10790000B6A37899D7C4EEC5D67DC7F3D00388AFA8 +:107910000581800DE2990B787CB037386B1576EED7 +:10792000BD7778191EFFD57087861AFDD8887F9499 +:107930001D75BDD5E517F5628F3FB58606813D0EF5 +:107940000F52D01E7DA378FF529202F6391BD70D3D +:107950003DE9DBF9DC2ECF033B4DCB939B5FC17B35 +:107960008F3EDFF40AEE8FDA7E332F01FCE5939B26 +:10797000E7FC14CE059CDC3107ED72F52F845DF633 +:10798000DBF4F67EC2E6D9BFFC11F0E94BB118D7A3 +:107990009FDFE2E7FE38D57FA0173733FD4736314A +:1079A000FD580DF6AB10ED572E7CF7C87C7F2EF0FE +:1079B000BBEE39DAB547E6F8C7607BE20AF1FB7B3C +:1079C0004360BF847D1576F7DD74FFD9A16017E4AD +:1079D000773EFC019DFF99DD32C67496CA5B33E0A9 +:1079E000F7507AD2E3DF1FDF962E7CBBAF01DF5565 +:1079F000806FF48718BE8FAF65783EB19EE1BD61A0 +:107A0000476602AC838FAFCD443FE8F88E6CC4F775 +:107A1000DC7514DFE807AB463F682DC537F8FF80FB +:107A20006F3A6E558BCAF1ED65F85ECBEDD07A56A4 +:107A3000CEED86D7C07DA0571EF9558C17EFA18ECD +:107A40000DA5C23AE5D42E9940DE42979FC4FD1998 +:107A500081E77F90C6E7C1AFEAE6DF6C882110DFDF +:107A60005CF8AA13CF0D7D2995F403027434FE212E +:107A700001C68B8CDFE5D7788A46E9FC9A6BA44F68 +:107A80000DF1615E7F4DF31F3E06BF1EAE1D827578 +:107A90007F8DB82F62AFF1BE0849059D86E747ED9F +:107AA00076E08381E6FB34FCF8FB3017B3BFBE6F92 +:107AB00019CA733847BFBF521B17B2423C2ABC4B8E +:107AC000427A2F7DA824A184C0BE541DC231BE8835 +:107AD000AD2B244DC338630CE59B38B8AF0C2ED1C9 +:107AE00085E7AA8BC51DB7D0719D1178CDCFA78230 +:107AF0002202FBEE881EB7AD2B627EC052D982EB0C +:107B0000902536B61E11F921B7F2F7B716B175C92F +:107B10001D452CFFE21C2413D17ECF6D88E7F9CEE2 +:107B20001331FE29EE0B5004DE5CCA59C3EF27F077 +:107B3000F8C2DFA00D85736E0C8FFFC24FB6D0F672 +:107B4000F7F0F6F734FE09F7E5E84AE639B0BFF793 +:107B50002E8FF1E2FD8C701F1CE5BBC7E3D83E0AF7 +:107B600049495440AEEEE67AF69EC6277D608FEE18 +:107B70006D8CD7A0A4E304088FB78E847DD8FE3621 +:107B80008CB7CEB2B7FD06DCEBFBD34E3C6CA753F3 +:107B90005B6561FECBAA3E04F36B8651371EE2B7EC +:107BA000F4D59E2BC957E31F633C7909C475AF27F1 +:107BB0008CB1C6225E0D758A5FAC3714DD70E7A606 +:107BC0007184BC4FD4A140EF25801BE087D9891870 +:107BD0001FB815E2CB7DA05490CFA62B246061E5A1 +:107BE0005A07DE87C1E2CD53F9BCEF184B428974C6 +:107BF000BEA1B78821DE7D67C812CAA574B8550931 +:107C00001D00BEB6D8552BAC0F7C155231AC9B97DE +:107C1000ACBE36787F5E547EE7A681B46E61FBFF12 +:107C2000E11F48787FC93D54C8813FEF53488B5CC2 +:107C3000CCE807FC57DB87DDC71D7E80F1B788B332 +:107C40000B3A0DA7DDEBF17B0F878FF6B33601DA28 +:107C5000DBA2C797B673B9107EE7622EAF8B05BF64 +:107C6000ED30CAE961212FE0E752BCDDC3CB9EF8BD +:107C7000FD20E7F7839CDF77168975F8B58DB7345B +:107C80008684F4BFD724C6BD9597A122E63F0B3862 +:107C9000043F131E9FB250CD017CD4DEB806FDA672 +:107CA00005A67831D1C7B1E468F52EFD63B902A508 +:107CB0002D3C17E0916E8AF5025FDF63DB99CDEE14 +:107CC0005F317E27F6716791562BBF8F8CC5B9B88F +:107CD000BD2A931D784E7F96C4EE5F3A57E20C584A +:107CE000A8BFF829BFFFE47C1D3BFF3AEB07EC7C03 +:107CF000E7BD898F4C05FF7056824D81F253FE3BE4 +:107D00004FF79356A7DB1DF14F1A4A647E1FE8BF59 +:107D1000DD09FB196B40AFB0FAB3DA388C2AF1FAFF +:107D20008ABFC0FBDB2F513EC0FA8FEED4E8B8E724 +:107D30000EF3F7015A87FD92C7043FAFC6FECE3D52 +:107D40002DDE37B0FA13E2FD93ACFE13D13FAF6FD7 +:107D500030BD5F657AFF7356BF50F4E49D70CE71FD +:107D600016DFC79975BD847AA518F88DD277D6EA43 +:107D700010E27996E5202B4B4908CE5DF4F6DDE064 +:107D800061BEE2A254B8D7A2DD09F63B77B886F50A +:107D90008143FDFF04BBB6689A14B081BE3C1ACC87 +:107DA000E1FA3D6ABE7631E7DF415ED69FC037ED2E +:107DB000276658EA77EF6707C035CAD08FEBFBF428 +:107DC000B3BC3B3CE9DFA79FCF4CFD08FFE8E16275 +:107DD0006D24F44726DE6088FB2DFEB13711FC2BA5 +:107DE000F22EFB7DA5C5AB77668CA0FD2FFEEDBE08 +:107DF0008CF9BAF5784DA74C34AA8F6A3B252CBF75 +:107E00003AF0890DEE1FA8D973C0565E08BF0B73F8 +:107E1000C0364107D71291874ADA94E93AFB7EDDF2 +:107E2000300BD71BECF76516FFF634EE772EB6EC69 +:107E30003CF90B88035DCFE272E6F9B979BBBFC1AB +:107E4000FE7314FF7DFC30A68FE68FD46E1A06FBFE +:107E50007B80335A4E58137D1F7F2DEF6F561CD3F6 +:107E60007373463BEDD066D451FF1A381F367F8BB3 +:107E7000BB18E2BCE38796560CBB6ABC34CCE2A5C7 +:107E8000CD2C5E3AAB4FEB4354899335BF7BF95908 +:107E9000FB8D844C7A9674DDF30B71483C2E8D7209 +:107EA00077E0CE890331FE85F5F9C35E7F3640DB8E +:107EB0001FE1F7FEDF3B66681CE8873677BCC545E7 +:107EC000E5B9BC70F61A80E3DE313796C3F3921839 +:107ED00067CE6C167747BE282FF4DD07F386EF21B7 +:107EE000DEE1B7B1F897FF6D19E35FFEA2787FB4CA +:107EF000FDED591C0F6B8631FFE58885C2591C8149 +:107F0000438C4F1D96875A697FEDABD387C339BC2D +:107F10006D8525AB112F7CFC6D85FE5AA88BF1E990 +:107F2000748BE0F9B5C2B184C3B11ADAD27E7CE3B6 +:107F300028BFE9D68DD327C61BEAB74F4E269A3EF7 +:107F40000E7BFB00437DE6AC4CC3F777CF2D30BCF6 +:107F50009F12D33AB2EE3BF8C1B54E671CF8639F4F +:107F600035FFE3A37BC0BF6B92F1776A16EEDFFEAD +:107F700011FC6ED3793AE1640C86AA180FFBF20863 +:107F8000FB1D4EEAD729FA7D9D33A4F519D807D5F4 +:107F9000ED1744DD4F15FB058B5D2D98C7F7BFDD51 +:107FA000D7D9368CAF878B21B519ECD2871887AB20 +:107FB00071B0799DD9770C7FD702F20AAE503EBFDF +:107FC000191AC2BD7A9DABF0F7C226F0DF139E00EE +:107FD00097B0C3BA60E0030A9C6BAFA525D897722F +:107FE000AAA712299FB41E2043F7405EAFDB897910 +:107FF000174B3B6FC338F791B840E103F4BBC56B37 +:108000002BB15ED3198FFDFE596E2DC7FCEDDF4BF2 +:10801000B89F3065C0BDAB017EF8FE413ADE94DF0B +:10802000DD5C0178AAD9C3F233A6C8EF8F847E96AF +:10803000345662FB29323922517F21B1F31EEC778D +:108040000AD87A5A97473BD781FD956DA19C7F0747 +:10805000BD6273A25EA9ED8CC5769326303BFD36DA +:10806000D71BD636065759E7347C2FE8DF3ACC6366 +:1080700038776F4D6D52E03E4F6B9B84DFDFD259F6 +:1080800080A598E7DB79BFC2DFA1B2A67E530EF9C7 +:10809000996FA7482E743F4C7AF742DD98441245F9 +:1080A0002F758DD3C9F29D633A59FE73EB70ED24A1 +:1080B000C8D7D4156D0AECEF1087DD05F89A3A762B +:1080C000B83A5F274FF2C1BB6C4017EBA6F76C6064 +:1080D0009763683941F77EA9C8EF37E9E58E6116E5 +:1080E000EE3FAEC2F90A3B438EEC457EBC4F9C8FFF +:1080F000E5F2F209FFBE0B4FC0EB40C75763703D7E +:10810000757AB8FF0AC0DB5AC27EAF8628AD19B0B7 +:10811000AFF2AF829FD2D92EA1BFDFC67EFF77AC70 +:108120006A81FD02C52BEC0B935B318FFF017C0252 +:1081300054430080000000001F8B08000000000076 +:10814000000BC57D0B7854D5B5F03E73CEBC92992B +:10815000C9E43D210F4E208420012643124208C964 +:10816000242408486080AA840699208F8804424409 +:108170001BAFF6CF842410042D8AB7372AD2019181 +:10818000A2D53620B6698B382168E3B5D7467BDBAC +:10819000E2ADB5F151048B3580D72FB62A77ADB556 +:1081A000CFC9CC9924886DEFFDA37C27EBEC7DF63D +:1081B00063ADB5D76BAFBDC37ABB184B60EC163B54 +:1081C000E33F8DF18C253176719A8E31F8F5572287 +:1081D0006BECCC866749499F3B8EB1EE7BA64F176F +:1081E00065C6AEE04F0954711AA81EB30F7CCE725B +:1081F00019DB7C3252BE4F60AC3216DE013CF0829D +:10820000D17F309DDE33210E9FC68302946FB60D61 +:10821000647A2C8CCD79D11C6053A1DD17CD1283EB +:108220007E3A72BDF1CE787C3FB15CB031E63E6102 +:108230009418D41B3BCD9DE0CC83364719AF3A9EB2 +:10824000F027633E3EBEF2593A96CFD81D26FED99E +:10825000DC25822F2A8A316FFB7CC660AC3583CB4C +:10826000189BCED8EAC14882BD7BF8FBCBF5897359 +:10827000198CFBF2BD306898C7EA7B8529C7615E1F +:108280004CB63A27001E2A93576E6330CE4A5147A8 +:10829000F3AD9C1CED6F81AA1B07A3E9FB4A91F586 +:1082A0000A318CD50DA653FB9B0663E9FDE64133ED +:1082B0003D570F4EA6F7C64191B9015E33283037BE +:1082C000C037CCB1FA7430BE492E6F05E2A3B2E5D7 +:1082D000FA79D88F775B52AE17F0B1E8DE7EC90429 +:1082E000E3621683FD49E86F51418E639D2538EFA7 +:1082F00096EE2A1822B41BE731B8E1FD1A78CE09B0 +:10830000295F0BA8EDB42026EC731360DC8B5AD3E5 +:1083100075F7B160F90227CC07F1CD9AE9B948ADFC +:108320003F0AFE6728F5575B021374D09EBEDEEC51 +:10833000DC06E3BA1427CF45BC34ECE4F86BD07B01 +:10834000E65861DC0D8F084EA00CBB35DF6A623049 +:10835000CFFC33F5066F76B0FFAAC1A94C063C2CC2 +:108360001BCCA067C914EF72C443CDE04D0A9DA693 +:10837000D293C9053A1CCF56A4AB8C032AE074569D +:10838000C6F749FD8CC46F41FF9FFC524FE5796EE3 +:10839000DF2D381EBDDFE83C00E33967F68A48DF91 +:1083A00073A9CCBE1786784ECF7C76A0D7AD1D22A0 +:1083B000F341FB6BE0E985E7B968E68E76213E6123 +:1083C0009E59BCED2BF0EFBFA53D696C3CD0B7E1E9 +:1083D000776F4BE318BB2DB36F6A00DAAD2E0DC477 +:1083E000DF0CED5E38A477FAA0DF8DDD6FE4EBA043 +:1083F000FCC37477221381AE63BC0DC8CF1B96FA01 +:108400007FA807F8F6FB9FB3CD9483F8EC94021392 +:1084100024F8BE13F0E8837175EE16E7F9895E2C37 +:1084200072C994205FAB7C1CCEDF1B06C7137E2E67 +:10843000D71BA71C47FE057EC5F7750A9FDF8E7CFC +:108440000F4F7DFF7C852F39DFABFC5C274165F842 +:10845000AECE12E5F7C17C2A7F04FC0728DF747CCE +:1084600089A714F92E4B704E80C746659D548A0724 +:108470001F2844FEFF38CED902EF7FD2E400640506 +:10848000F9BF627009D58B1AFC26F5A7F2BF51E13E +:10849000773DF27F08DFC3778CC177F7E5789F449B +:1084A0003C95FDE06FCFFD17BC5A2005321F8BC3F2 +:1084B000A795F827B80E4CF627D3691DC8EB42F8EC +:1084C000483C556590015FFA87DFA1756084E79CA1 +:1084D00090F24DC8D7D988997E69A935F8FE6927E9 +:1084E000977FD7CAFF1D0AFFCF33B2551E6C4FEAE4 +:1084F0004B0B6DEF7C4ED90B388F534E81B7F74F36 +:108500001A37E0C984F885F1BB915E8B0A64DD7D82 +:10851000E9D88FBA7E399F7CD5F87FE4BC3679FFE5 +:108520001B45DE87CB7706EDA17CFFF885497E945D +:10853000FF6F33D00700FB4E44CA4F2AF29FF4432B +:108540004494FF6AF27F5DEEADBF413C8D20FF7F1A +:10855000FB8FC87F95AFD4F5A2AE0F753D84AF1FDA +:10856000753DDCB0CB19F52DA41320E6495C3F9294 +:10857000EF199C479D1C9983EB525D479B8E0BB472 +:10858000CE86E90565DD04D789564F8CB64EEA9450 +:1085900075B1565917EA7AE8113BF716C277753963 +:1085A0005E634EC8BAD8782C5C2F8CCA570CF96A17 +:1085B0006D5C3D43BEAA8367285F1947590F969C9F +:1085C000AFA70FFE7A8DFC3436C740EDFD2FF2D3F6 +:1085D000D89C91ED0919DFFFB3EC89CBF5BFCB95A2 +:1085E000613C977341CEA607F9ED865719B717C6B8 +:1085F0005B9DC83FBD117C9EBD86547F0BD6BBC220 +:10860000EA118FAAFE5F8B748F0DF269B5CB5B8E7A +:108610007456E9DF1BE1CBDE927DED7436C6F519A9 +:10862000DCD948EF3E8DFEAF1B85CEF373BE9EDCDA +:108630009B91736D745E91F34FB713D78E4457E6D9 +:10864000E6F640902EC66564BF0540A109A3D35548 +:10865000DFC1F1AEC26D0149D5B7B1A86F815FD658 +:10866000E5FC03F2A7720EFC3A06C11797BB8B809C +:10867000EEDF5160D6B31CD7E14D056A79A0C32D5A +:10868000A1DC81DF0BA9073733117E39ECEB3E53B8 +:108690000EF56FD83B54EEC3F28AA228A53DE6162C +:1086A00058B07EDBD1936776D33CF6F0F5EBED97CF +:1086B0003C5342E05C80AD21704118BC8FD7B74974 +:1086C000FDCC4EEDF8F97A85F60517E71F4F883D8A +:1086D00002949C1B8DF6E471C17E1FD07F45D1C7EB +:1086E00006A45770FEAF2C77A780BC3C2128F07FF2 +:1086F0009CC1F9AE38CEE11F1C7DBDC32729ED0119 +:108700009E372A68D6770A6E11DADD5820F8C7A599 +:108710000FC7F30F86F8561D07A860EDF7CC10F7CA +:10872000F5BEC7F54DDF8FA3EF03C6AFD1FFCD4533 +:10873000CCEDB70CAFF773558E7E0EB0DA3EE0721B +:1087400019CCCF9F3DBC7E8F52BF4FA753F075B65B +:1087500003F9A7CFA0E2F34F0457300EFFC7D13F74 +:108760002DF771BE65EEB0F95F6DFC3FCAD1DA0B33 +:10877000F8236BBF0F5C0D7FCF0FC39FC23FB55A6D +:108780007E8A923CA72F433B5171821DEDE24D1E24 +:10879000F36EB4FF83FC3140FCD1676643FCACE56B +:1087A000FF8BCBCBB3C9FE51EA5FEE40F9E6D10DAA +:1087B000D5E7EB41E52FF83E0BF8094D64FCFE834D +:1087C000A3973A7CD9441F2A2758BACA7AE80C835F +:1087D0008BC2D68FC2FFB47E51CE037E268C20671B +:1087E0000C2E8EDF8F04B61CE5645F19B713FBC631 +:1087F000F167A64B20BCD95C1C8F09CAB32F220499 +:108800000F29413AC34F00FD909079139EAAE2D4FC +:1088100079C7562DCC80EF6378B9EC8A7AC4971269 +:1088200084C3DB1BE78AAD42BC04DB8F7E13E552B9 +:108830009582B74C57CC9B0A5F09B82EEB884180D4 +:108840002F8E0B3E11FD04E48B11E6FD97E17CE5D4 +:108850000BFBDEADBFCAF79F0C5F97EEB0EF993E02 +:10886000F7EB7CAFD06D61185DE785D1B53C0CAE00 +:108870005661BF46FEA9727175D7836D09308FDBD3 +:108880008F08A86642F839BD0AD7E7ED76957FC70D +:10889000BD89FC1AE4E7F184E7A59DAA3CCC78C425 +:1088A0000D745B82F2B030082F437941F0842AF7CF +:1088B000B4507D91F908CACF9BDBD5FA13A9FE8A83 +:1088C00056B5BD2C82553A32DFA42AECBF2A57D1C7 +:1088D00017BEEBDEC4F20D27F8F755C726BFE9CB6C +:1088E000B8CA7AD81386977D61B02FACFEC35FA15A +:1088F0005F5AC3BEBF37AC7C7718DC1106B76BBFBD +:10890000AF5923D03AAC017E40427CD5BABC4D5918 +:108910009743F480190816B2DB34EBEA86160EDFB3 +:1089200071ACA0AADD1202BB0A69DDA8EB42CFF848 +:108930008F318ED1BAD08F222F6B5CA3F06556B8E1 +:10894000BEE5E57FC45F93D00E661ABBA047D4C2D4 +:10895000DDA23AEE796F6ECDC6972A7C7D15FA07B7 +:1089600037FC9B765EE0AF2A704555794A885DE218 +:108970002BAF7287CC53AD3FF78B2B22F6B7D35575 +:108980005E7508DAAF2E0B4CA8877AD531FC097AD0 +:108990004D44BDB95989C7CC7D41F4A05EAB8E086A +:1089A0004C68C80E9927EBCCC47976DF23127D7C06 +:1089B0002D401F8CAF317030C135EB8E8A6A3C0C74 +:1089C000F57BEE111B518FBEDD189B80E33FEBE280 +:1089D000FE424FD4D884B5007747AE32C850AF7B43 +:1089E00047053D4F89EEED03B0D6BE7F6C599565C6 +:1089F000129647117E9E702DAE6A06BE3EEC92E93D +:108A00007B6F8C3DA10BEDE7FBF4EC4919C7E3DC70 +:108A10004F7C73BF3107FDE79AE6C909684FAEFE88 +:108A2000D7257393A0DEEA36BD53A07A6C2A8EDB7D +:108A30007B5F8501CBD7B42A4FDFF5F47CF1CB27E0 +:108A40005A6C507FE071C17910EACFFEA4F3D5A92A +:108A500000AF6F1FEF44D29C1CD4313BF4F36EC7C0 +:108A600044BF08FCF89EB9FEE545BC3EC3FAEB3FA7 +:108A7000975F5B948BF545FB36A87F16DEA33D7CA4 +:108A800076A77850C071D9AC11024CE9EC17F26BA3 +:108A900068D742B97D1BBC3FDB765B02DA596705BC +:108AA000D926C0FC7B8ED55439805FD67718157ACD +:108AB000D624D5C0FC6B7443FC42FA635D34877BDB +:108AC0005C35554F227E1F9968433CCF9AEE3EEDB0 +:108AD000023C9972DD2FE1F33D33D7532F7E29AE4F +:108AE000427BFCE717562760BCEE57CAFA3939B803 +:108AF0003A617588BDB3EE2389E8FEA241DE8AE3C0 +:108B00007C312255407F19E81EBB04D6EF1AC5FF01 +:108B100000FE6D7C6E04BBE76997487CDFBD2BBE11 +:108B200048D6F0713DC94FF21B00EE3FB6F1111F60 +:108B3000C8D7F78D8DEC3D5C7CF742C14C78F69838 +:108B4000297EA57FC6EC37A763FCD33D17F9993979 +:108B50003A33975A43D69D52FF0F3E2BD5FF03D48D +:108B600047FFED0FBEDF5B9965B81DBFDE66F5A15F +:108B700031F181D52A211DDE969ACEDE0DDFAD7B47 +:108B80005C4F727FDDE3F1F70EA0BC017EC1F858A7 +:108B9000F8BCA64CD713BE465D87BE6F6BD721FBD2 +:108BA00036C9EBD1D6E15F8FDD5B75C832FA3A5C2E +:108BB000AFF829731FD77B701DADCFB34A0CF447B4 +:108BC000D9E32F3D89FCBE7E8BD9658481AF7FDCE4 +:108BD00048F4EAB75A7D7628F7DAAC52343C4DD3E4 +:108BE000397DAF9BCED7CD1C914926173D5B314EC9 +:108BF0007A09C6130BF0F9C6BDDF9D01FD7CC8FCE8 +:108C000037CD00FC5D4282015E2E1D17297EC824EF +:108C1000B75409F2B19671B950F7CA738652F8B5D4 +:108C2000B67EFD42F4EB6EF3EBDFED577CB62BCA5C +:108C300034519E6EE6AF40AF6ACB37B3DD17C5A99E +:108C4000C4C6065C8F759D61E5F5D77F80F197CD31 +:108C50004C7AB75F8DD7C238E4E9D6B8B39100B883 +:108C6000980B30C42ED5EB33194C71BD05D615CCFD +:108C700077CE3E81C6BDBE51F41BA1FE9C581EF7A7 +:108C80007DBF09E83F91E6EDB303BCFE61AE67D658 +:108C900033C16F825FAFDFB745C2F5D081F205E324 +:108CA000D402F3207FBF6776A6A1BFBEEE7133E189 +:108CB00077FDFEDB7EFB087CD7DF5C1917EA1FE738 +:108CC0002B7C01ED33534CB09D0F9ABF9D86FC3F2A +:108CD000E77BE0E7C27CD747B31F56A523BD92D2FE +:108CE000644BB0DEFA6DF764F27AE027C3BC6B76B2 +:108CF0008A340FF6BC91F41EAC7507C965059F6BED +:108D00005A5F3118B2514EEFEE13A1FEBB008B1625 +:108D1000C2974FC1A301F1B50ABF4DE2DF38F2158A +:108D2000BB5B2639E2C5F955EB84554B49AE0F18AC +:108D3000685D4FE7F1CDAAE9DC9EAD4973DE427173 +:108D4000E4078C4E9453F823AAE300BFAA4ED7B78A +:108D50000EE3B9ECC7468A8F6C6E35BBCD36F23B5D +:108D6000DCC7707C12930C808F8D3297176B143E8A +:108D7000DC2C2FB91EF906CACF48B8BF62E572B124 +:108D80002E1AF0CEED54B70EFAF9187F1BCFDB4D3B +:108D90009A1AD2BFA0BC8776645BB0DD5E1D6BC73C +:108DA000380BD69F3415F1187BD3721CDFB322AD7C +:108DB0006798FC030568E73D2B4E47FFB66667CF13 +:108DC000DC0E848FE6D8B1C99A1FFE9AF4C6ED0A6C +:108DD000FDFBD1DE473D02F051787E7B3AD7FB5E4A +:108DE00091C77DBEADE049E503B5BC6EA79EC7DF68 +:108DF000DB8C64C7D435FF8EDAADB3F625A0FCADAD +:108E00007B5E9F8F72DAA78C7B75736AD119E0AB9A +:108E1000D5FA28BB00AF36FA2A0D086FDC23101CE8 +:108E2000FC2E3E0DF9F4CFAD3FB121FFBC670E4CD7 +:108E3000407D34B0C5EC3C881350E26E7F6E9D706F +:108E400010E3336BEC7D5601CAD76C1D1F83F2FB18 +:108E50006D7BC080E56F77A6EB1076DBED4508BB38 +:108E6000A56904FF1944198F2B31F29F37099CCE55 +:108E70001B9FE9318C83FE9E54E6FBD1B3BFCE44E9 +:108E80007D5597D697897A05F8203319F1FCB440BF +:108E9000FA78D333A2DB3C35C8079B900F60DD6DB9 +:108EA00050F860D3F19F7C0BD7C326A4BF6B381F4B +:108EB000019F9EA6F7C70ECC65FCFBD3C827AA1E50 +:108EC00003B8558FF1348302433F081F9ECED7135A +:108ED0009497F3725F36C953D66F40BB737397DEB6 +:108EE000D71FB2FF331A9D7B143AAE6E3692DCED7B +:108EF00051E6DDBFF3791BD2F1A3677B5EC6FD921D +:108F0000BA63A0ADE511D6858297CD88071BCD83C6 +:108F1000EC8BCD386F5B100F43FCAFACC7CD8CCF63 +:108F2000539DF76649C1835AAE7C7F5AE19B8D4CB5 +:108F3000C1DBF1897CFD29EB0DD733CA55757EDE87 +:108F400018FEBDCAA7E715BDF08632CF8DC017CE7B +:108F50006CE21FB741951350F4D1D10314FF51E9CE +:108F6000A58EFB6F417DE28E8E09D2B15FC76A3B51 +:108F700047889BBCABE0EF9DB6C4B42EC0DB9FC15D +:108F8000CF427B0AF9550AE94FE51BB5BF393F5877 +:108F9000B200E70BED07B07DB5DFB77D9112B6F3F8 +:108FA00036E3EB03F913E5A7BA2EE7B4AC5C9063A4 +:108FB000C37A1F59C767E37CB95CFBDB743B3DDDBB +:108FC000682FC0F7EE2E81E2CFEF287EFD3B6D3F8C +:108FD000B1AD0EC1D367CAB8553EC31F8C4BA9E3D0 +:108FE000ED8DE1F1DCF071AB72481DF79C1D372F60 +:108FF000C0F7EAF8557E55F953C5A3CAA7ECDE7849 +:10900000B26BC2F995784DD5ABA246DE937EBC3EDD +:10901000E5A2C16B19FE3E1C56EDA1F7304E83F25E +:10902000E329D14FF2A3D5713A2344CFC38F2554FE +:10903000EF346FB9DE5E8AFBAFCF084E347942F46D +:10904000CB6E2944BFA876C12DB9E3B8BC8F739FFE +:10905000473A6E3CD737D72607EDD0D99F04C428AE +:109060008C4B1D4F7785EAD38D174E13FFD7B1BEBA +:10907000EDE847D5ECFC75E50CE4F3A7F4B43F53F9 +:10908000D3566140BBFEB6276FCD473E7AB77D3CD5 +:10909000C9F5F387F2A6135F317BC24DC0FF6B0E9B +:1090A000EDBD6905BC5FD3253A49BE433BB86E6B45 +:1090B000EE9CCE906FDE33F75716A2FD7EB7684761 +:1090C000FB7DD69379F762FD59D6B1D1380FF7A160 +:1090D0005882DD5214E907D5EE7D5B91932D7ACE4F +:1090E00017F372F97A2A197A727E9BD3D29289FB8E +:1090F000E90307403EE3BEB241EE0C607F2F2492AD +:109100007FB119DC2107D0FD9CC0EDB25A03332595 +:10911000B9E8BD2909DEBFA2EFBB13F5C82B775A0A +:10912000739A7100E2E7F9ABB93DCDF70F6379FFB0 +:109130002ADED4715CAFF41FDE9EFA7D2FFA11286F +:109140004F95F19F6F7DEA26D483E78F4C88C179D4 +:109150007FF082B91DEDA90FF45C2E0EF9DB7EFDC8 +:10916000FBA1761AD8751A18EC380D0CFCFBBED68C +:109170002EDCC6ED8B5CAD1DA7F27BF5960951A1E7 +:109180007904E1F63BCB08DFB79911C5469037EA81 +:10919000F34213200A1835156D7AF8BE3CF28BE7BE +:1091A000FAD0DEDF63B41B619EEF23FFE3BED4F38E +:1091B000A21FF761D036C7F5F0FED11C3FFA91EB44 +:1091C000DEF2CEC5F64F3FB883F20CD6827D9928E9 +:1091D00084D8CD0F3F7813B2FF25A7777B127C7719 +:1091E000E908CF8B80624B98BDFC7292FC8FDBCB81 +:1091F000D76A27ABF186ED88E7C9F0BB933911CF69 +:109200002A7E55BFE945E083025748BCAFA996ECDA +:10921000E40B4D5E7A7E2CBCF3C02CE45F6B94F3C0 +:10922000207CF6F3AEBD6232D2F978CEE7E8F716CD +:109230005AA2ECB86EFFD2D4489B8F179AEAE9A9DC +:10924000D2598DB7CD3EDE4DDFFDA56BFA8959F0C1 +:10925000DD494B1497FFC3F67B383DC3F340EED88E +:10926000322311DFABF3FAF06E4E5775DC1F1EB9D7 +:10927000D586F3EA7E2CF6C44CA46764941DEDBD3C +:10928000F54AFEC7D90E6E4F9F33451D5E88792380 +:10929000FB96253090B36BBBBF7113BE5FF7826046 +:1092A000473FC0F9C2121BFA6B7F92FA6D767CC2FF +:1092B00077011C8FE417511E15CE63B41F5518900B +:1092C000989C4E5BBDC42F332F487ECC1BF933EEE8 +:1092D00053613CE4F3088A873065FF69ED4F791CE0 +:1092E00065C8BF55FCBB59CABCDFCD8DE1FCADBC28 +:1092F0009F53C0DF7FB0EFB945D8DEF9437A3B8E8C +:10930000FB2F87F4D4FE06F0CB7430DE7347B8BF72 +:10931000B3A153203FF9FC11D0D730AFBA2D7AB7A3 +:10932000216A381FCE81F27E4B900F37B8FDC4DF23 +:109330004CE14713FC7765DC707E8C669DDB111F6A +:10934000FF285F9E095BF743FC381A1F28F8C27597 +:109350008CFCA8D27B4307DF578FE9CC2945BE524E +:10936000E9AFCA095F19CB42BDDA6260599887E359 +:10937000D34538717D2FB1C87A01F0B02CAEBF1C37 +:10938000C569451E9793E21C9D5B87FAA5C5487287 +:10939000205C8E5CCCE5765223F234FCB3E6713B64 +:1093A00042CFEAC90F519FA07752517F2F898CF984 +:1093B0006F19AA7C79FCDB2B2418FF925931778E28 +:1093C000778253F67CCB0A09F877C9F498E7C7018E +:1093D0006CCADBC6CBA7C5E4E9016E6E6E5D510EAB +:1093E000F0843CF7E7B9F1C17ED476E1FD157CFF4E +:1093F000CC64AF2E2F1EE5BA85E4F4C7C2C0D4C634 +:10940000F460FDD705F6F6CF8520DCAF676968DF2D +:1094100059B1ADF8D19F8BF2DC917979C3DFAF669A +:10942000AC8DF2E77CBF3823703FCC63027A2D56B7 +:10943000F86AB5C912207FBE5D7F6188DEC847CE5D +:109440002809E9BA48E1A3C552A01BBF9FC45AED41 +:10945000674D6442EDBB123BBAFC8685C7CEAAEDD0 +:1094600001BF7CAC87F9025F0BC09E8DB0640440E5 +:109470007235C82FE1C42F3EC3765B7CACDF4C74E1 +:10948000A8B6A3DC13985777059E7591B6A918372F +:10949000A98B4CF323DF373CFFD16964AFDB54FB6E +:1094A000C55B40FCBED5CEE7C3BC85C48F772AFC24 +:1094B000F84113ABCF80A5B7B8AFCF26C3A02F2CF0 +:1094C0000A64E27ABF9CE6CD453A7CB0AF25A5019F +:1094D000F8E7A36346E742A87FCEFF1CC5E1362A22 +:1094E000F6283B14AFAC7B315002F57AD3271D44EC +:1094F000FD529CC7F5F585F440DA3D2837D2B9FF17 +:1095000003F528CF6DDEB6EBE3B1DE85A33B32D6A3 +:1095100002FD8C12F35963E8C96C30EFF9D0760183 +:10952000C07A8045DACFF5537B58CF86FA5EBED538 +:10953000C1E3EDCC837245A5974A8761F48121A0F0 +:10954000BDAA33313D8E7F12DB67C7F5AAD2E9038E +:1095500013E011E36726C023ACEF0A0C3AE4223E85 +:1095600079BCA541E86F8D45F85981F2E686EBC1DB +:10957000270D88F2DA7DB792FC51E58E0CFF8D2421 +:1095800077BE76DC68DF9C11E5CEFA3C45EEE4B0B0 +:109590009C2BDC4024FAAE57BEAD10AB6509C71D4D +:1095A0006F72623CADE1F1F1A46F58F67FB2D07AF0 +:1095B0006C5F2CD7ABE922E1FDB62E81F21B2BBBF1 +:1095C00092990C450BBB62E9691B4CA2F7E70FBFF0 +:1095D0009ACBE512A74BE5F713CB28AFE8FB13E9CD +:1095E000A98EA341E1BB0A31BB3380768405C60155 +:1095F00070C32B5C6F35DC28525C93A1884E4062AF +:10960000F21F8FA59DE23F1E3664DF0B57284E2BBD +:1096100047215D3CBD2243FE016FC3C7F16C6A4622 +:109620003C1B1D3A268F607F18153A99E50826875E +:10963000F81D926FD2778A301EFB0DBDD30FE52D3A +:1096400066DB415C4FCCE7EE437F61B9F25D9F99E9 +:10965000F34764568CE6FB1DB6B9BDC86FCBDD5C25 +:10966000EF589D6334FD1BC58D7A6432E6E5F6A2A2 +:10967000CA0FC497D0EF628F40FAF5C6E5501ED2EC +:10968000AEBEE822C9717D91D6CE347AB4F5BEAFB4 +:10969000D27F129B144AFF20DE2D6EB4D32FB9ADBA +:1096A000C4C7A0DDFFAD08E09B7AF50CE76B8CE04A +:1096B000F3BA8498C2B8A85BF463BC6407E201DE25 +:1096C000471568F119EDD6E22F769E161FF11EEDB3 +:1096D000FC13978FD3942779AFD39427D7BA3470DC +:1096E0006A7DA1A6FED8C6320D9CEE5BA0A93FBE46 +:1096F0007DA9069EB06785A6FEC48ED59AF249FE66 +:109700000D9AF2C9471A34F094CE7FD1D49FD6B5C2 +:109710004D539E13B84F533EBDF7210D9CD7F7A86C +:10972000A6FE8C330735E533FB9FD694CF3A774CB2 +:1097300003CF1EF899A67EC9E0290D5CCA5ED5D478 +:109740009F63FAB506AEB0FF5E53FF7AC77B9AF20D +:10975000F9F29F35E537645DD6F26B04977F95CEBD +:10976000BF69BE1353BC9FA23E60E20509F9B6650E +:10977000A5C062319EDEBBCC847260308C0F3FCEC0 +:10978000B52B7E0D4B43795621160570DD5EEA122E +:1097900068FD87EB3BE9CF1E37C6F3D84F0427C6D9 +:1097A000D9A2406D4921FD47BB4DE04806E1D8797B +:1097B000760D1CEF7168EA272E9735E549DE2C4DB2 +:1097C0007972AD5303A7D61768EA8F6D746BE07496 +:1097D000DF3C4DFDF1ED1E0D3C61CF724DFD891D4D +:1097E0005E4DF9247FADA67CF2917A0D3CA5B35174 +:1097F000537F5A974F539E1368D7944FEFDDA38141 +:10980000F3FA3A34F5679CF16BCA67F61FD194CF2F +:109810003AD7A981670F7469EA970C063470297BDF +:1098200045537F8EE9750D5C617F5353FF7AC73BCB +:109830009AF2F9F2794DB96ADFDC907551FB5EB1AD +:10984000772A9D9F69BEF795B919F287EF98E06C6A +:1098500091417EE5F3F80BC8F57EB388F69187E277 +:1098600046319820087C1905420CF90A5D856A8A00 +:109870003FC551DC9754938CF93E60270010A34BF1 +:109880004F477B3A3268B7A55C997EED76DB1A6864 +:1098900013F97C6FBEB72A3F0FFD95A373D16EBF3E +:1098A0008DF9B6E33840EF45F5C3FA78CDAC8D6756 +:1098B000A8CFF926C04B487FAF98F7A4B8AEE2F71F +:1098C000CF375DA0FA43ED2A710E01E6D710D2FE24 +:1098D00003E0574860D7ED698275030EE3434D7688 +:1098E000821F6E7210FCDD26999E1D4D59F47CB4CA +:1098F000C949E5FB9A0A08DEDFE426D8DF348F9EEB +:10990000079B3CF4FE50D372820F831F8DCF23E060 +:1099100057E3F369F08FB1FC19F09711FE61938F53 +:109920009E9D4DEDF4FE58D31E828F377510FCE3DB +:10993000263F3DBB9A8ED0F3674D9D547EA2A98BE6 +:10994000E0934D0182034DBD049F6AEA23F874D36E +:1099500019825F6EEAA7676FD3397AFE7BD30095D1 +:10996000FFB26990E0568CD7023E1ECCE77E908A0B +:10997000171566AC9CF841B50F17A19D8FCC51A06F +:10998000FF8BC6CE0FB3B7C3E9F1A11217D69781EB +:10999000B988F1C33199075B42FCACC795FE7644A8 +:1099A000309F19F8BD59C7FDDAE6184679D64CB193 +:1099B0005FD72B7CC9E2B8DDBA4E19D77A653DE492 +:1099C000217F66117FFEF2EBF815AADF9832C5FB06 +:1099D0002CF167AACE47FEB3C59F89F673C9146FF1 +:1099E000677E3CEE37AE7D99FAB33B69DFB1D218A2 +:1099F00088BF19E323AF8814CF1BADBFCD4AFEF853 +:109A0000A8E527CFA7A0BD3DEF4BD18B787A4D6F4E +:109A10005D8EF1829E7C1E7FEEC9D7699E2F4DF12F +:109A20009EC2F17C6AADBF4507E3FFB478CBE13B52 +:109A3000D283FEF4627449C10F5AC2643DE52732F5 +:109A4000F74BE9D0D48D6060217C33F3D1736EB6CF +:109A5000F7556CA70A0C7184BD85C6B491E6153E16 +:109A6000AEDF2AF4FA6DBE4EF3BC3CC5FB1B3E2EA6 +:109A7000378DEBB599D767E2BCD471E54E9595BCAF +:109A8000E481FD38BE4F5FB87856181FC4BFEAB7EF +:109A90006F2F55F24AB6083C2EA7DA6B4A5E8AEA67 +:109AA0007754DF29F8D15E5F09FE0EEE2FBDA5D8F1 +:109AB0009F6F99B97EBE54AFCF42BBBE5A8870E249 +:109AC0003EDCA5FA3F5950DD427D86FB242D98737C +:109AD00000E52D770B94CF5D0DEDE8A09D6A0C0499 +:109AE000E277F70AC47F13A7A6D3B8ABC1FC233F24 +:109AF0002B6E200DF74B815F2EE37C37CC147D0657 +:109B0000B0875FD3F93305DA975E6B10609CEBE3A7 +:109B1000804FC68DCE0F9B94F307EA7BE0B32FB046 +:109B2000BDBFFC744616C5F14FCE94116F2D3A7E21 +:109B30001EC9F7EFA293E7BB70512DCE9A42714A2E +:109B400026399D1867AA54CEAF748BACF1E8087221 +:109B500074EC0CCE4FAF39F4F3FCD4AE76BF267163 +:109B600006A763E20C4EDFCA53AFA4E2F9AB4DBDCA +:109B70007AB247586E7FB6C73AC27C1A77DD951124 +:109B8000C2DF9BBBDEE1F91AAC3F3B343FBD40E98D +:109B90005FE527D160F51EB0848E6F88BFD3662045 +:109BA0001F45037F8F27FE3E8BF6F622A31C7533DD +:109BB0003CFB014501787ABF67A77C2335EF680D30 +:109BC000F3D0733DB003F2B3C7F7A001F1BF8175C5 +:109BD000D2FB4D05B7A621BC990D943BD09F686F71 +:109BE0007EC901A35CB6E7C10A8CCF2EF5D7BC8431 +:109BF000CF258784B3E8BFC2FA983603E327427DB6 +:109C0000DB18E86FC533A56DC9F07E91C8E9C15E68 +:109C1000E5F400BE718B31C3E709EB61067EFF6995 +:109C2000B49BE621DAE669D643F536E616E282F918 +:109C3000F343EBA3E0F63F26A33F240DD0FEFBE663 +:109C400093C618A4F306C6F57730FEA1EA6D467CEC +:109C50007E3B8B7062BD0F15BEFE3095115F7F2875 +:109C60008083E70ADA932CCDEB708D0FEADF0F7556 +:109C7000FE7CDB78D2CF8B10EF2F3B96C91837BB19 +:109C80003DCEE414B13CDA9FC6F75187E43CBB12E9 +:109C9000198C7B3DA0E771A8F07109052F7F86F62E +:109CA00083D1C07CB8BF01EB9BE5E3BA1E63A0750E +:109CB000D582A8C5F85999471EA9FD56A5DDDE2F06 +:109CC000B81FEC83F9E079C961FDD8957E22783F11 +:109CD000AA1EC1FE488E24304D7F9B31C905D78115 +:109CE000D54DE36FD64593DCF978AC7713D24B8D25 +:109CF000FFA8FE616FFA0719E4C77FDE9282763A09 +:109D0000F02FCF4B2CE6F2E935BDEC43F8B5D27419 +:109D10008AFFAB727771018F972D56E3634561F12E +:109D2000B1B0B80C2B1A395EC698538FFD4E626FD6 +:109D3000A9F8A178CCA92289E8EE03BA63BCF9940A +:109D4000E2A7964672FFFCF73362899F62E66710CE +:109D5000BFD9625980F6A3AC22F15B0FCBB1C484AA +:109D6000C889FB9438EB6EB08758487CFDBEDC0692 +:109D700013E61BECB0F0738CF79745D486E6BBFF77 +:109D80006EB69EF0797B71E92BC83FD9167F19A971 +:109D90006DB724E37C04657E93ED807F1D36ED5125 +:109DA000E2A54E138F4F9593DE56E97EAD7AFB699F +:109DB000C9BF2D02E71FC7681D5A3BCC244FC54EB3 +:109DC000770053AF27152F3D4CF4943C59D84F776B +:109DD0007E04B340FD4FBB0DE4E79FD4ADFE1EE60D +:109DE000C50FBC6964B8FFD9694D96506F747E7118 +:109DF0005D393DADB3E6321EEF8CD481A0C8B1B35E +:109E0000277E844453CE9F750AAC9751DCCD1DA9A3 +:109E1000035FAC53C72E97C0B88E595C7BA711EB7C +:109E200079449CE77B45DE9F225EF2593DC1F71BDA +:109E30003CB507A0DFFB634CC42FF714794EF071DB +:109E4000B2B68530BEE23902C3F3BC6D066E9F59CF +:109E50009D117C6F8A713BDF339849FDFF429197DA +:109E6000AD0E771F1E1C19156F766960283E427C67 +:109E70009742713D158FA1F4B2E76BE8E5D587D223 +:109E8000AB00E83525945E6EE1EBD0CB8F4966F1EF +:109E9000C3F9D457263F589ECBF51BA6CA85F36954 +:109EA000A971B605F35CBA6DA20EE9D61D919C8D21 +:109EB000F139954F55BE1D815FB7F4A0DC4891EC98 +:109EC000B86F6CAC8CA07D18957F55BEB514F2FCB4 +:109ED0002DE0DF5585F05C69F154A06C09E75F8CDB +:109EE0009385F269F5A8FCCCECA1EB7811D815515B +:109EF00031680F9D3BD419C2A7D5F517252E57AE53 +:109F00009444E407E37A8B8A04F66E28BDE1DFBB54 +:109F100059CAFCC81E92C80F53F17AADF8D77FA377 +:109F2000390BEDBBED786E11F0D52E38DD8918EFC9 +:109F3000AA7FE70E7CDFA69C1BF6651BB8DDA5ACEF +:109F40001BB5BD49C5655105B82F30E342E43AA8B9 +:109F5000F769824E46E4B4C9AB7F44EBF04C24C3AE +:109F6000EF6CB17DB54FD0BA9AC870DFF0D3DBBCCF +:109F700063711F7F27D0E95D4AB2F627EA688FAB8D +:109F80003F11D71520D7C19F5E077FCF94723FC185 +:109F900087668E53F2ACDD4AFD7EAABFD3B0C714EC +:109FA00081FDA49BEC0743F8BF4489BB5716A8E783 +:109FB000755A64B4D72A0BB85DB3B7E9C8ECF72774 +:109FC000E0783A67BF0FE3895DE8675EE0EB882CD5 +:109FD0009F8CA921A62FE70878AE815DC73A311E74 +:109FE0008FEF9BA704DB7715F07567423B06E867A8 +:109FF000DAE69343E5A849277847CA83393C53E218 +:10A00000DF6D63546E3AF5089DF38FCD700A980F9B +:10A010006DDAB687E13E8D39C0DFC765B885352179 +:10A02000EDC62D847187F005F0972F0AE48FE920A3 +:10A0300030662ED22182E292E1FD2E8A2FEB956CC2 +:10A04000A3F34938BF3185DF54BE51E74927564253 +:10A05000CEEB978FE376725BA3E100E5A116441384 +:10A060007E3F892B8B6223D89FEA733FF081CF8894 +:10A070007EB3899E07C1EFF64D44BFD941F061F030 +:10A08000BBF17904FC6E7C3E0D7E37963F037E3734 +:10A09000C23F04BF1BE14EF0BB113E067E37C2C774 +:10A0A000C1EF46F8C7E077E3B30BFC6E7CFE0CFC17 +:10A0B0006E2C3F017E37C22546E00F9C4F96CFB1F4 +:10A0C00014E8DA7EB7C18D7984FB15BAF6B8C7C536 +:10A0D0003A81FEE62C1DC5C4CDBF7C88E17CCC0E48 +:10A0E0001D9D0BDBEE7888DD8AFE6CBE95ECA9B673 +:10A0F00067B99D6296F632943BFB055F2D73C2FBF8 +:10A10000AE926ADCDFCB706C298B01785757C53E65 +:10A1100013AC8F4C79C9F2E61058B6BA361CB507A5 +:10A12000E1B1D90724F058D89E8279FBF048108E0F +:10A1300003F3871FED5A50DD0C2C1418C7C8DE1826 +:10A14000483750DECE1AA417C6230A783CF106D64B +:10A15000E2C0FDCCB132784502D50FB0B86BAFBFCD +:10A16000BF40A6F7E1DF5DAD9E2EF79AEA31F12AF6 +:10A17000ED61B97095764CC232531F8C7D975E911C +:10A1800053F1169253ED18DF01BCB79BF9F3BF678B +:10A190002A7ECECCB25533E1B96A26A76BBBD9670C +:10A1A0002FC3FEA7E8289F8135A6FF7A1CF477D736 +:10A1B000BF4B0CF34155FE7C5EE1830963AD742E09 +:10A1C0009FDD63A2FDFCEBC73EDB1A03F084279CF6 +:10A1D0004ECC7BD8C59C11C827BEDD3ACA7BFC415A +:10A1E000EEF89825507D72DEF33128D763677279D7 +:10A1F000E357F2859ADBD68DC578D4A7AF7379780B +:10A200005AE9E780BEAF9EE89967213B04284FF6E4 +:10A2100046B303880D3A5397C49F06BD7D05D633D8 +:10A2200080618079D9862F6698D0DF6B1934CEE3B0 +:10A2300079B37D648718CC5E7B34BCDFE3D3915C5B +:10A2400068912D94E7B6CBE2EAC573CE3EBB8EF2A1 +:10A25000617765EB088FAD969BFC68E74B42732DE9 +:10A26000EA31BFFD98291DDEFBB37594DFE8772F37 +:10A270009D87B0CF2B51FE15FD60B93786CE77EFA5 +:10A280006203AF4EC3F26A6E87B525FCF55424C64F +:10A29000BF6FB43BF9760B93313F8C52C574E877AE +:10A2A000F76F8BC4715431C59FF591FF6A3372FA11 +:10A2B0007DA77BBE7D1CD91921FB5A468CD5394D13 +:10A2C0004E289F6A71CD43FF52B2BA4C98F7D76AB5 +:10A2D00077996A68FE3C5F8DF232A0DD16BB8EFC7A +:10A2E0005C2CBF359BD4E1E98C7C25155FC6793F9A +:10A2F000D48DF890D632962EE3F8245FE8BEA1699B +:10A300007C51AF0CF3685F1743F3900427C16CAD29 +:10A3100044E31E2347D0B9E6BD86CA5EB417C7988A +:10A320006EA7FDADA45A49B3FF94E8D5C2F1CBB5F1 +:10A33000702C9382FB57D0AF7DA61A7FD3E22D1CE1 +:10A340001F49F6D6D771FC495E3A04396CFC8FD8A8 +:10A350001F8E2E65384E0B8D33C1B2BA14EDA67820 +:10A36000E66946FEFB47C739D5BED4940EFD4F8D36 +:10A37000D39179348D0D6CC3767729FCDE9ECEE9BE +:10A38000195C5722CD0BD6E53C5C97631B75E0B09A +:10A3900005DB4FF781E3A6D93F88D1C013F68CD1F6 +:10A3A000D49FD8314E533EC97F9DA67CF2119706AB +:10A3B0009ED259A8A93FADAB4C03E7041668EA4FFB +:10A3C000EF5DAA81F3FA5668EACF38B35A533EB329 +:10A3D0007F83A67CD6B9060D3C7BE05F34F555FB48 +:10A3E0003E5C3F96CDFCFBEC7AA3638CE67E9B70D3 +:10A3F000BF21DCEE377DD9226F437EB619889F25B9 +:10A40000D4E7B8DF7C37F78F4CC54E19E54B81C2D6 +:10A410008F9F15BB1723DD4A6D26D20B9285D793EC +:10A420002C73C95E49EB30D0BD3B929D0D9547A280 +:10A430007C6EF2CDCE98101CB7D9BE87EEAF28B592 +:10A44000CD63988FA47E2FD9DDCC6BC5FE64EACF97 +:10A4500064F7513DB30CDF87CCE3A44EC72C28C76B +:10A46000C18F43FF6034BF4DF5D7543F6D34FF4C6F +:10A47000F5CBD2742C029F0784FE3BD07FCFAE7FFA +:10A48000BD2C9191FFB605E77D3F9EDB46BF6D2A4F +:10A49000B7B3DA1216C818CF694FEFEC1D87E389FE +:10A4A000D751BC14EC66E7D2107BF1B199DC0E9564 +:10A4B000C6B5F7A3FE6B8836C9682F49A603B3DF7C +:10A4C000077CEDD7F73F85F18956C1BEB113E5E2B0 +:10A4D000DD16CA03D9ABE04DB6EAA66F83763B9B87 +:10A4E000DD129ECFEFDCC99CADB83EE24AB745C352 +:10A4F000FB0929353A0C034DCC68DE86CFFB67F2A9 +:10A500007D9F49D90774B1503E39B77439C6BD44EF +:10A510003BF4779538B468EB60381F96219D45BEB3 +:10A5200042EBFE0A0CBD34C644FB9266A4B7404F12 +:10A53000C28379D0E237239CC1F162760BFE488159 +:10A54000DBAD9847571AD341F455ED59B473B1FDBB +:10A550007B8ABC8F213EE3166AE92A990E113E766A +:10A5600029FB12EDD1F22F513FB7A767C4E07E96C9 +:10A570003A4E55AE1C56EC7BF5BD2A571C986B9392 +:10A5800017B46F80CF3B30FE6696F6D0B94CF3BD62 +:10A590007B18F2B5194FB193BDEF933DA43F3C9AA0 +:10A5A0003CB4F271CB4DA8AF2FC7B9C89E3537FE6A +:10A5B00098C6178E37733FCF471B0DAFB6CC4749B0 +:10A5C000BF830096F13CCFA9044B6D68DC537DBA84 +:10A5D0000BB8DDA257F386C093407D7659CD4B7200 +:10A5E00047F2F14573B82773058DEF8E7857E2D5A2 +:10A5F000EC6D33F89BDE10BAEF943C26C443DBE7E6 +:10A600004BE6D1BC255A0C6CD717D907289EACF85D +:10A610004B6EC53EA9445F0C9E69067E8EC019B77D +:10A6200090EE3353E3209766F2FC45A78F893C8E6A +:10A630003794B7AEBB328DC62A1B54BD4BA62CD760 +:10A6400053F07F37E6AB8C6F97B479EE8A1E57F5DF +:10A65000F4843DDAF2891D5A78927FD8F7FF897A1F +:10A66000FE46FE3BE8016DF9A38ABEBE11F535EE4C +:10A67000677D83E78B98604457B89E0DEA3D900351 +:10A68000A99D8152149B295B254D9EC998307D78E8 +:10A690004F914C78F0F44A7AD4B36A9C265C0E0B46 +:10A6A000F75CD882EBA534325246F989710CAF9130 +:10A6B000FBE55EF053EE979CBFAB46BFAA57A43CA8 +:10A6C0002A954EE174AD2D14147DEA110BC93FEEAD +:10A6D0009F8EFE3AF6E70DE94F8DB79C2FF69A3123 +:10A6E000BEA1C65D2ECD935E12E4601C458D0BAC01 +:10A6F00052D6CF2EE71BF53D308E9E33468A8154CD +:10A7000088BFEC6DC23CA95489E4977DC6C6EFA111 +:10A71000FF5DF67B28C778A22C27925DDEABA738B9 +:10A720004099C2C7658ABFA5C65BD20B399FA72ACD +:10A730004FF82282FBF58108B45F271F01D9ABA532 +:10A7400067242FE771B6299DE1E56ECA5FBA4EE135 +:10A7500017CC3B2B4DC0742F0E773221D60E749C34 +:10A76000B6BCFF14BA0ED9AFBC14817C78D4CCED42 +:10A77000B5A7157E48608213F3F3138E589C7EA80C +:10A780006715D9D13E9887F3B4A4C9339B7A420B9D +:10A7900067B310381DC7A18577CBF5B8F5CC7657D0 +:10A7A000834D0E539E59A8E46567B24CE4AF0AD1BD +:10A7B0009283FE5343A985215E8DEF4CFCB73E94F6 +:10A7C00017AFF37BABEC91F283E5F0BDFDD5586795 +:10A7D000B31CA4FFD3E047A37EF8EE15276BD50783 +:10A7E000E35ACF003D33687FD94EE59D4057848FB3 +:10A7F000815F9D41FBCB59F4FEC7E05723DC057E0A +:10A80000353E7F067E35BE3F017E35C2B71797DEE7 +:10A8100084FCF216D443BE88C8396E1A8F716E8BD1 +:10A8200048E76EC2F97147FD7B969B4156153BC6C2 +:10A830002E8C477ED82AD2F9E49B0AC72EC4F3DBBC +:10A84000A171B5D0386330AED62FA8713523D0E7CB +:10A85000F20C59C95F50E26B5E1E5FFBEA76DC6A60 +:10A860003B14BF1CD6CE501CD3E47B3F0B8F6C092E +:10A870002C0ADE7F74F77F1D463D9398E4ADC579C1 +:10A88000D7E5BD6BE076373F4F95A2ACA37D669EC2 +:10A890004F9AA2E40185C72F8BE7BC73473CA0EC1D +:10A8A0009E9FCD5E89FE7FF1EDEF4C4F03F854E1A2 +:10A8B000532B31FFB7F8FBEF3C970C78CA9AB58160 +:10A8C000C37BDFB99CE2C43C8C875762FEAF2D96F8 +:10A8D000EBB77DCAB9A421BDA7AC97CD8D4F901E13 +:10A8E000073B83213E5A123CA45F3F8E1BB0D540EC +:10A8F000FDCDF10309ABAFA20F36371EA6EFF70966 +:10A90000CE737E1CF74C13CF3B55F4CD2585775580 +:10A910007DD360E6A03A1ED0B0F47EAF120762EE9F +:10A9200064FA2ED6CCE11E5B21E9A507CAE45FC913 +:10A930007CDF92FCE31EDB75DFC1BCBA967912EDB9 +:10A9400027EEB5B8CCA8B79E53E418B4EFA3FC9596 +:10A950000A13EDF3B0B8E5B4AE63D47EE2AA291FC2 +:10A96000214619CFE9C28800C6075ACA4D07518E41 +:10A970003E641947EDB514187C189751E16D853088 +:10A980001EC067B42D261D6155CEA9716386BB6AB2 +:10A99000D06E9932ED3235CFC1A4BF106A5F5B58DB +:10A9A0001FF18F53278B681FBA67C9448FE9CCB951 +:10A9B0001CDF1B847A1F3223CE43173A0FB95C3B4E +:10A9C0000FB942330FA1C11440BBB0A502E601F597 +:10A9D0004F5BF369BCE17453E7F3FD42CECFE1F383 +:10A9E00064CA7E927A7EA0CC5E741CC755A173B7F0 +:10A9F000E2B85EFAAC3A0E2F929CCBEA257C3F3E41 +:10AA000098CFD3FA75F2258ADF13F8FED7ED069AB0 +:10AA1000DF2BB3F9781E35F8D3E96087E44FC27DA8 +:10AA2000DFD1F8F84F0ABD837CEC66B8BE5A62DC11 +:10AA30009C8FED03B666E4E3E881846D34AFC08893 +:10AA4000F409E7E7707A0DE05D09E447FB44C4FFD1 +:10AA500057D157A56BF83E98CA2FEE597695DE0E62 +:10AA60009A67204DB34F082DC823ED8F6F87F6E40A +:10AA700090FD3483C34376B63ECE9985F1E6962F9A +:10AA8000C511CF4DCAB3F87A6FB64590FDDD62E3CC +:10AA9000F677B76D81C66F2A073F0AF791C558D67A +:10AAA00089EB4A8C5A41713431112D2F620BAD5D07 +:10AAB0001BB590DBB576D755CF4F49FDA2E65EB505 +:10AAC00061766DCC026ED7DA0C64D7EEB31A961F9E +:10AAD0001841EE0C16723BBD1BE73182DF08FE22E7 +:10AAE000C533557FD160F792DFA7CE7350E177B5BC +:10AAF000BED15ECF30BE261A9C32DAB1A272BE152C +:10AB0000F39AB342EC02B5FFCBCAFECEDBC5FC3CE8 +:10AB1000849ADF5EFC2BA17E24BCE7CC52ED92919F +:10AB2000F9EE1FE01B92132E8BC18D7687CBE2A02E +:10AB30003CF0D1BEC32DEC73314139E3FC325F24CC +:10AB40007D243929AFBF53DFFFDCAFD01F7CC94262 +:10AB50007AA7D39A52166A9783D14AF9C9E0FFFAC5 +:10AB6000B2A0B1A37F8315A90BFABDE087DD302B1E +:10AB7000645FF254C359DA070AB757C3E30A43EBD9 +:10AB8000DD76389D8FC79F84EB5768284844BE0AFE +:10AB90005FEFEA33D531FDBA3530AED4A41C7AAAC2 +:10ABA000EF1F67E2BC91EE4F5B3D4407AEA7274124 +:10ABB000675122E9E7D538EE8FB6BE91E094F19C5B +:10ABC000ED45D2D397EA0BA27620BF67C5907C4DA6 +:10ABD00051CE8FA9E349B9AD3B3AC682797C039344 +:10ABE00030FFCDDFE4B9AE5C4F7E867BA4F13E3012 +:10ABF0004B89C305C6B2D0FB81E4B8BEF91301EF9F +:10AC0000B245E794697DD949FFA972A0548A2EB74D +:10AC1000039FA73631A745C6AB93ED14174BBD2252 +:10AC200012BFA5F6F0FB9DC7C60D0878FFD0503FB8 +:10AC30004A9E93BABFF2497D39ADCFD444C6FA28B3 +:10AC40007EE9A17D884FE2024B707D7FF2301F517B +:10AC5000EA13DA72D0B914B75EB735C22F43D363A3 +:10AC6000EF85F1E178BE27B094741C474FFA0E8C43 +:10AC7000FBFC2492E23E624706C56D6E4BF2DE4558 +:10AC800078F5CB77E9C62B93857A75DF8AA0FB042C +:10AC9000F6097DF3299FE24E1D7B7284B8D4BFCEA6 +:10ACA000E2EBFCBBB3F83A4B75E4737A3B72AF5BF3 +:10ACB000137BEDEBE914CA6D18C7AE283FEDD3A99D +:10ACC0007961BBF523F3152BE27EEA903C56F067E1 +:10ACD000422F08F8451414BBEFC8D34F3F9DC0F86E +:10ACE00011C3717C3F3274DF3822C34F85114E3758 +:10ACF000C91FC1EEE672D65EEFF0017FEFF8421C8D +:10AD0000B1FFD715FA35A7DEE5C0FAE5B2939EDDAF +:10AD1000A9F9676A007F168B811943E4B0CA27E15D +:10AD20007ABEC13AEEAA7EBC01E4B17C953883417B +:10AD3000C9FFDA7E6AA609EF0FDD6E71F5A1FDB5D8 +:10AD4000DD12E7A238BC05E446485CCA627999F88E +:10AD5000D0E2E4F13A0BCA5F8C4BE1FCB371FC2FFB +:10AD6000D3FCD57ACF2A72C8E20CD07EA9D9B98794 +:10AD7000EA99240F9D9F33C531CA6730D9F9BDA325 +:10AD800011193A661A411E1F9EC5FDC0EDD9AEBE0F +:10AD9000321A9F84C7AAD87687CB41FA10F10CDF0C +:10ADA000F758F3A342F1F39E220F5ABAF9FC3C8DF7 +:10ADB00049F6723C6753ECF9AF5979D8CE6A13DE85 +:10ADC00073275A73AFDACE8561ED3C92501E4BED7E +:10ADD000BC87ED8856971DDBD12BF7A786E3F933A7 +:10ADE00085DE7F6F3C0D3048793C8417224C404310 +:10ADF00097F0A705E362B1237DC7E562BAE2BF80A1 +:10AE00005CD417C1BCEAB2DF7D99AF31EEB7C4CCD8 +:10AE1000E779429780B3F1DEAAF0FC8B703B46D510 +:10AE20003FAA3E8276446CE751B4632606D7911A56 +:10AE3000CF49AEF5F0F512E7217E01BB46C6F522FB +:10AE40002A797EE1F3B9A188E35FB015C8A82FCABB +:10AE50003FEF4FC6EF4E5ACF25733B56BBCF7CFA20 +:10AE6000B3C3662CFFA4B6ECAAF68ABAAF3CDA7E6E +:10AE7000B2ED5F3EDC126AAF8CB6BFFC55FBCAA7D1 +:10AE80006C068ADFED17B4E7E32B8AB8FC7317A9C9 +:10AE90007119EF8C228C430A1E273FF0CCE3339FBD +:10AEA000157B0B914E69ED06E603BA9EFC2CDFE1A3 +:10AEB0000D69E75AF1ACC6E1C728F6D418CB610199 +:10AEC000D7E9985ABF8071F4E4DA4EC17D957AB122 +:10AED000455C8FABF5F54AFB25D28088FAAAC4CE33 +:10AEE000F562F2A0C4B242E48EAD88AF5FBD62BF2E +:10AEF000DB4E3D65C6F64EE93CED99A81F6C3AF96C +:10AF0000C990F5AEBFCD652A0B995F0BEE0F8D4052 +:10AF1000C74D45AA1E0C90FE56F5AD5ED513719235 +:10AF2000464F6C8EE47CACDA3B9B0BB93FB4399254 +:10AF3000FBE5AF3ABCEB11FF1F177EB868BC8CE78E +:10AF4000643B0DB89FFE55FB2443F68DCE5FA3FAFC +:10AF500033C8FF4EC9FEF37EF83EE7FBA564EFE57C +:10AF6000E18D23226ECD72FB0FECA93B8BE2F9D56C +:10AF7000FCA1F46661F70B8E361F2FDE6B9A87F10A +:10AF8000BF3E8ACFDEFFB930E27988AE22D52E1AD5 +:10AF9000DA0FD4C4599315FD96AC94CB18674DC7FE +:10AFA000FD2D6D1C747AAF16CEEBD3C233CE84C5A3 +:10AFB000557DEEDFE0793FCC1FC046F7C13A4339FB +:10AFC000B146D9F74CF1F94BF19C782AEBA4FDC5B9 +:10AFD000E4DA180D5E8B4525EF02AF3956C7093FFD +:10AFE000C952E579FCFED921FAFB9826BFBF7CCD7A +:10AFF0005D782526DBC3CFF999A073C4D7FAF94B46 +:10B000002B90AEC3E2B5F5DA386D726839E061DDD8 +:10B010003EED79418F3B87FC8165DFD09E1B54F369 +:10B02000D271BEC9AEE1FD7F75BFF02F6678FF6AB1 +:10B03000BB8F82FC21F9AADC279C8A45D88E14108C +:10B04000709F7B4C3DA37B8593B732F748FB057F10 +:10B0500054F0158E67E62B21FCCD51DE8DB1F07CCE +:10B06000D5315B75640F8E01B9407F6F6023C800D6 +:10B07000809337CA644F2EAED531D40FECF326CD72 +:10B08000F7305C8AA7AA747FD4C2F37153EB985F40 +:10B0900087F3A9BF8ED6138D6B5C901F005F9A7BE0 +:10B0A00005161768CFEBA6869DD355F92039ECBD60 +:10B0B000AFC8AE5917A0E7FE58447CC2F5DF04D4F0 +:10B0C0007F30A48F669E398CF975C5DB18BFD726F3 +:10B0D0003A82DF6B13DC8F10AF00BF9E32CDC942C6 +:10B0E0007B65973D4287790F27A3FB1F63D18C5D5A +:10B0F0002C62BEF222BCEF7060B200F017275AF744 +:10B10000B7CF8672F3C00F30986CD9BDEB9679A992 +:10B1100041D8F6C0F70866054CC67B8130E714D7E6 +:10B120005D847DC111BCEF3A22DB42C1C908A6BDD6 +:10B130007FA7B550DE8D7923AD1374CA39E99072BB +:10B1400098C786D9EAB97F37E5DFB1793C0F20B4DB +:10B150007DCCCF1EB5FD05D07EEED768DFC4C79F7E +:10B1600080AF40CF24E0F8310E8EED237D3168149E +:10B17000DABFD29EC47C0770FF06FAB308BC3F3B1F +:10B18000E6A524306D1EC2507F76E86FCAFFC17CF1 +:10B19000960FA787FE6AF458F1F5E8D1AA73D37821 +:10B1A0007D532DE407E13D56785F9D59E9CFACDC36 +:10B1B000DB85786DCD0FE215EC406A17AA375F5139 +:10B1C000F08C7986097603E17934BC9DB2F3BCA892 +:10B1D0009DF6087F73FAFF077A3938BD42FB437B3F +:10B1E000F29AFB5B01FDC55D7B7F885F5C3F43F8A6 +:10B1F000059A6C4BB876FCC2A87CD782DF53D0AEE0 +:10B200002E04AFC1FCA347ECE81798F51E13E663C4 +:10B210007E6B7634C9EBECB8A526CA47885F4AF93D +:10B22000C56DD916CA876FCBF886491FA2A7DBB2B6 +:10B23000ABA91CEA53DE54762002C3146C0AEBA3BC +:10B2400038C0CEA27207FA85BE7A9E87A5E625A9E8 +:10B25000FA9029FB9F342FF8306AF6F18153507F22 +:10B26000677D2EE59D4545FF95F2AD76D53A9D5813 +:10B27000FE9899EF637E57D9C74246A578DAD4C2C3 +:10B2800027703FD735A141A0FDCB8D57DFBF745D3F +:10B29000EC2BC3BC2D56C3F3B21CD552983ED4AE92 +:10B2A000DB5D88579E3FE517387E35ED3D3B3B9E85 +:10B2B000F0B633E320C3BF3BF41CB4256AD7970E26 +:10B2C000F398C2D7A36470D33D63AC4147E348C64B +:10B2D000D4005071AE290B1D35F03E65AD44F7F931 +:10B2E0002666DF4BF94C60E593BD919DFDCB328422 +:10B2F00087CD738D761EE1F30A1FB77ACFB14A2F3F +:10B30000D7456724FA57AE094B29DF8C7ED4F52E3A +:10B3100086CD07EC61739C8EEE838BC8089917D39A +:10B32000D453FCB77F2EFC18E82A5A47E1FB62FF92 +:10B330008F9F1B3232A7C940DFA9E76CF87EDB186C +:10B340005C3B48F734C6F3BEC3BFCFE7DF3307DF4C +:10B350007F334630139EB3113644501CD368041813 +:10B36000CFE128F78D3DAAC4DB9A052625B942FB1B +:10B370000B50DEBC68BA2103FD8653A665763ADF22 +:10B38000A6F851FA680FE52DB2AC188D3F7A4A390C +:10B39000A7D6705B7A22C6EFA2A0AC0FFD6AC9697E +:10B3A000427AAB7113DBF8FE6FA21E3F3B5BBFCA54 +:10B3B000847A1B9DE042C62EBF70653FDE33ACAE83 +:10B3C0004FE320BFAF630896EA292FC43898A679C7 +:10B3D0001F50FC301576C749E5141F2A9609CFA5E2 +:10B3E000CCDE8ADF95027234F70328F77F0C6F3FBB +:10B3F00045F33E00FE75E8BEC0E8ED476AEE193041 +:10B4000082BF3372FB9961EDDB476C3FD86EACA60F +:10B41000DD3689CB0D5F5C847FA4F81EE6FF17C77D +:10B420008F9EB79655ACE4DB9B40A2E13E94C23FB1 +:10B430003B1CF594C72646F07D533D8811E4A71EBA +:10B440006B2DCFBF48D1E6B1A9F78BB4E1BD215038 +:10B450005E66D1DAEBA56CA0679A807EAAD65E2FD5 +:10B4600046498AFB532CDC8EAFA77D527D8A562E2F +:10B47000F4E07A81F9E8ACB97D94F7166FA1BC8647 +:10B48000D1E20B6F3531CAC7D2477AEA51E7959EB0 +:10B490004C1ADB56007014E7B3C527A7AEC2B8D16B +:10B4A0005B0A3FB7811CA073A40D8907C49076ABDB +:10B4B0000D8109A857AA75FC1C00FD40FF6FC58FC0 +:10B4C000A1386B78BFEAFD312ABCB25E989D11327B +:10B4D000BFB794F531D4DF1DC907D0AE1DEACF1830 +:10B4E000C8A3FE86F28A94FE12FEBEFEFEA0AC6FDA +:10B4F000B5BF957769E7B7D2D047F35BA9DC5BAA04 +:10B50000F6F7079C5FFADFD19F920F36D4DFB7B40E +:10B51000F35B69ECA3F9AD1CF22F95FE12FEBEFEA3 +:10B52000D47C07A3B1BE16F969B4BC0735DFA1D03E +:10B5300091AAC97700CF6661A9C4D88302E78BEFCF +:10B5400014CFFA1EF2C5E5850D4EB253147F8FCE8F +:10B550000789743E88F4E8E2146E87A8ED1F692A13 +:10B5600060EE893C1E84CFAC2281CE1F4C2A10DCB9 +:10B57000B8CFB60FE407DE83B71FD63996FB9B1C06 +:10B58000F43CD824D3F310F8976E8A7F39090E144F +:10B59000737FF1C1247BD51AB43F4A2378FE75D15D +:10B5A0002CB06C83FE1BAC975366CC73BC89E5E072 +:10B5B00039B4CC0E8ECFB8F204BAF73E22E7745FEE +:10B5C00013C03B0A4419F3CA77C823C7737E5ECC05 +:10B5D000E3443B94BC491F9E9724A502FE24CC7FE4 +:10B5E00095422A262EA4F3368BBF154DF64DF5371E +:10B5F000FAAD7618C72D42CE6F32001F7F54EC9BF8 +:10B6000055690B481E84FBA771A8A972319F50F49D +:10B61000FBE1D765D665E4DF2EBB91B118F87E312A +:10B620007E077AEA578A7DF45ABF91A1FFE72BE79C +:10B63000FBD7B7DCABF54B1F3407EC68173E98130C +:10B64000C7901ED55BB5E53B0C7CBD2D0BF35317A6 +:10B6500087E5FDA8F720EEC05F6732D655ACDCFF6A +:10B66000A2E4FDDC85721EE338293194E4AD9ED35B +:10B67000341AD988FB926A7BBF53E4168B73131E6E +:10B68000D43C39263E9383DFABFDA9DF3D2A3C93B2 +:10B6900074B5B829D88167FBB3B8BE477BFD3F8A34 +:10B6A000B5F94997178EFB4E391B896F07248C53C8 +:10B6B000A8E3FFDFE2D71DC57CBEBF9AF3492E3F4A +:10B6C0006797C242CFD7A9F95FCB866089EE15563E +:10B6D000F3FF9863201BE9FD9FB3239DF711FF291A +:10B6E000F648E04DDD95C8AFDFDED0381CEE54CD16 +:10B6F000F955A5BDD1F03CDABD13F413921FD9D290 +:10B70000EC74D079BA78BECF3626AEEC3C9EDFC260 +:10B71000F27735FCA53DA7D5D2FD94807ECB63782A +:10B72000BE4D1FEC17E3C06D166CD7CFE34A81A75F +:10B7300028FE9B521B105AB383E781C2E562CA46BA +:10B74000ED79B3F0FB142B2DFD922063BC7F80CEEE +:10B7500031CE2FE1F4A23B3BB05E3CB727C5641D60 +:10B76000CF17192B73FB3263202D74BF636A899244 +:10B77000671AF9C65619446F46C943AB306FAA32EF +:10B78000EA8DADE9288A4BF6AEC23CA9CAE4373E41 +:10B790004907793BA9E4610E4F7EE39371004F2E78 +:10B7A000F9570ECF6284A42925DF5D85FBAA534B90 +:10B7B00094FB95581F9DDB4E4CE27CF4F73E45A36D +:10B7C0006EC47539A3448D5B323AA7ED39F18B33E2 +:10B7D00028A73C6A9CD7ADDDDF64CAFD8937A8EC99 +:10B7E0001567237B6901FE0EF8BC41B97747670AEC +:10B7F000105E2706EF3579F8EBDCBB133C27CFEF63 +:10B80000116A69645EEDFD886E85FF79DE903A1EEF +:10B81000B5FF61E3C2FB016342C7B58FDA51C7F5DB +:10B82000718ED1274C0BEED7AAE3FA5818D88F4166 +:10B830008F033D7D3548D78FAD0369F8774E60990A +:10B8400079098E1FD82F3843603DA7E3CA921F9114 +:10B850003D559CE45E5982F97B067E7F41BB624781 +:10B86000EE8AF7FAD0AF077EA3BC4D5F2A3FC750E0 +:10B870009EABFD7B6CEB4BB85DFA27E55961DC5361 +:10B88000FF7A2EDEA72EB066A8BFF9F3CB06F4FB35 +:10B890002B4FF0BFD7BAE9F83B06F4DF37210CEDA8 +:10B8A0006CDA6718F1EFC17D888709F8FAD5F82BB3 +:10B8B0002FA566B6C5C17836ADE1F76437FC34BA5A +:10B8C00002E1861A9A255B5174B4023F5BE9E96E86 +:10B8D000C3E72AD6FF12EE4B5479B57EC4376BB559 +:10B8E00076FFCA7AADBDBE6A0F5007F4DAAAC6E485 +:10B8F000B0FBFCF83D81550A3DAB1CBBFBF0FE8163 +:10B900002A16764FA08FC791BEC967004F6D7CA4E1 +:10B9100012FFAE14CE63A34871DE9752B74B78FE88 +:10B920006D733DBF9FACA2EBA281CAA11EEE2B2579 +:10B930008CE1F7E1A9F253D5EFDF7CE1801EE3054E +:10B94000E1F705AE5A3E8FEE055F2E6FE0FA7DEC13 +:10B950006F2B62E07DF83D80D55D5CBF57370A7E76 +:10B96000BC77F79BB55A7F6025EB6B437F6665BD5F +:10B97000F6FDAA462D7CA444D1BF93D9645C1FCFA9 +:10B98000960812AD1705BE90FADBD702C83F499E54 +:10B990004EE4B78D86C054D473E5495E82D5727883 +:10B9A000BF89EB21AEFF75B09248FEEA79DCC25741 +:10B9B000C7EF67FBE6307B20C45E1087C3EFA9F2B8 +:10B9C000D3ECD94A7ED80B02FD7DF072C92DC58417 +:10B9D000F8C9E17CF8BE223F5F63FDD938AE4C6404 +:10B9E0003AA04BE632FEF79F335FACA1BCCACCE96C +:10B9F000825347EB58C71AF15E3190172817D0FED3 +:10BA0000C4FB3232C5CEE524A7A719ECFCDE1D0726 +:10BA10000B5DFFEEA79880F9823874DAC74DE9A56F +:10BA20007B371675ECBE88722E63BCDBF5208C6FFD +:10BA30009772AFF6AE9F0A64CF6ECA7E99E4612218 +:10BA4000B005F6BBC9A1C8C52EED7D188928A7F0A1 +:10BA500000CBC26CEA3749DD7F50F37A036574BFCF +:10BA600054A2D2EF971532FF7B7B1B3A059C772AB5 +:10BA7000F335631CEAD7280BE3834F759FE0C6E0DC +:10BA80003EF97AA4679DA39FEE8751F7C947A8B7EF +:10BA9000A5247E78BDD1E4EFFFF5F37F007E0B583F +:10BAA000CA008000000000001F8B0800000000009A +:10BAB000000BED5A7B7054559AFF4EF7ED4E7712FE +:10BAC0004227813C0C819BD72C90109B8420E8EE70 +:10BAD00078BB3BC984D7D8E1310642A49909BB5150 +:10BAE00092741474A3656D1A616207DD2AA1D045B2 +:10BAF000CB3F1A4A5CA756778366B1D186ED80A109 +:10BB000050519B151D184B2AB0AC23C50089382E07 +:10BB1000CEB0C37EDF39F7D27D3B378A535356ED23 +:10BB2000EC26953A39F73CEE39DFFBFB7D171430F4 +:10BB3000C15C80071C002003D499AF650C5760FFDF +:10BB400040492E607B9D7EEE1CDB9A6D26906DC079 +:10BB50007FAEE39FC5910AF2F4787FD1F46C5D7FEC +:10BB600089B34037FFAE7925BAF146A55C37BEAC44 +:10BB7000A15AD75FE1BD4337FFEE268FAE9F92B744 +:10BB80005037DF2E2FD5F5D3A6AFD2CD9FE0FCA93D +:10BB90006E1C26F5E7792700586D81611FD221C8F8 +:10BBA00000E665E1BED6F4209B08509E8193B14D1E +:10BBB000ADB6A7531B9C9D126519D8DE925149FD65 +:10BBC00094B71FCC8BE236B6892FDB5CD8FE130B03 +:10BBD000B9B3710F2493AF1FE938F351504209F400 +:10BBE000FC3B8F09A026DECE517C77BAB0AD7849F8 +:10BBF0002E408EE04F6CA67716AE4FC57FE7E0DF94 +:10BC00003E5B684F11C0ADB827CC8FEF03F5AEF99E +:10BC10000AAD7B54590093B01F064719CEDB6D0562 +:10BC200085FA817D56BEAE223C6C52D2E3EB86147F +:10BC3000C6DFFBB4D7BD80F6EF8C3007E0BCCE9DED +:10BC400067AD7205F50733146C2BBD67AD909EF898 +:10BC5000FC8C959E774A23A90E6CFFA5DFDC103281 +:10BC6000909307152BDFFF4821B6788E9607CDA15C +:10BC7000143A3B288B5D286F4D20E4AD65EF48D426 +:10BC80008CEF6FE960CE003E6A92EF5B0C4857F094 +:10BC900059CE0E23C96DF87BBD18CF999FB11B6E8D +:10BCA000E5EB017200D608D6C1AA79510BD1ABB928 +:10BCB0004DCCD7F8B96679FD795689FB76253D9F3D +:10BCC000D23B6ACEA0F5D2D9614D1EF0DE3F53269D +:10BCD0004CFA2C0D3BE55071BD04E0A4D76478AF5D +:10BCE000CD1E0960328EFB3C9CDE4F23DDCC8CE800 +:10BCF000984C2741BF6FA3CF2BC4EB043E25CF0B3D +:10BD00007A049F5E61D0D49F3E76FC5DE2239E67FD +:10BD1000378B558119C0EF4DE572DA6C5BBBFE5C69 +:10BD200035D1FFAB5E46F4FF570629B8FF27836F76 +:10BD3000E7C824E77B877286713F7FFF500EA09C87 +:10BD4000B55BE44DD2242E07CE4DC897CE70949F9C +:10BD5000BFA3BF7A909E778499D38E47F50F8CD678 +:10BD6000F37BC270AF239DDE6B7CAE6D8A899FEB47 +:10BD70007945E6E7F7FBF09D93687D4A28C488EF94 +:10BD8000C3562E17FB193C85FDDD7DB6A690C13E3E +:10BD90007F4FF4C6F56FF55941423969C7F5748F85 +:10BDA000238547AC36929BBD782F46F738BE228D4F +:10BDB000F6DF680199C5CF77B130769AEE7FAAD5C4 +:10BDC00002017CBEB9D5CCE97D6AA399EF635EF729 +:10BDD0009FBD05D85F89F29782473DDC7AE548012F +:10BDE000EE7BAA0DFB785FCF3A0BD7BF95F7333EBA +:10BDF0003F597E35797D4E95CF953EBDBC25CBEB29 +:10BE000018396DFB6E721A8ECB69E57533E77B5D71 +:10BE10002EC9CFC3E0DC43FA73EDB02517CF5BDC4E +:10BE2000EB703E86FD59E6D0CF73C82E1C16E3B3E7 +:10BE3000DB7731615FE45574AF82A015B63292238F +:10BE4000C1AF77895F93E96A232C8DF4558A1593E6 +:10BE50001DC2572BC4E7572DD0B4B7829E0BFB32BF +:10BE6000EBF5BC5D5B13E4F611551E35BB576E0553 +:10BE7000DFDE749ADF7F4B23EEF30AAEA7E753D5DC +:10BE8000FDCA4A46EA1BB1BDA0083BF8917A0EAD47 +:10BE9000FF0F1EB11FB4A396211D97D804DD17769E +:10BEA0004757D33DE64EF17D42F66FF1D48FDB016B +:10BEB000ED44B0F89D0A1F9D0F9C269AEF57E97E2E +:10BEC00078FEAF9FDF80F7B5CF48E57C6D3CF46C22 +:10BED0008CF8DC592A01F1DD5E3627D767207F5ABE +:10BEE000EBBF5A04BEEC78BF33325AAF18E8F57690 +:10BEF000F5BCB3ACE2FE104122E5737B2CCDAB8ADE +:10BF0000CFD3EE0FF018BFA7BDEC05CEA70DF7C33A +:10BF10006C333FF136BE4F73FB71B616F7B9DBA237 +:10BF200058D291CE1F4F6C5A7FAE0CE09D1E3491BB +:10BF30007891633D36F0FD05C0FB3D0EDE8FF5E4E4 +:10BF4000F1FEBFF7C8BC9D31D5FB0705F759F15687 +:10BF50005719D1EB70E1335E37BEE7F2310BA7031F +:10BF6000809BD369832A7B572266B0E1F89501163E +:10BF700002163FFF3D570BC087F6E457F43E5CD8EE +:10BF8000D1FD21B773CEB6D17A399DE4EA4C2FF5B5 +:10BF9000FDDDBFADA7B8E134FA09922F7F98411EAD +:10BFA000EEB3FA6A365FDF113E6E95490E4C23F50B +:10BFB00044FFC041062497FEAE516E3F9FC77B29C8 +:10BFC00078EE1FBA32F9FDFD91D926C1CF39224E44 +:10BFD00051F93F38F3771964BF6CDDF20777101F12 +:10BFE0008F9A391FB7BA47321C067C3989FB428ABF +:10BFF000383FB5C9E34DD6409913D735A9729B3C5C +:10C000007EBB4BC82552D8427102FD30A4DB6A5575 +:10C01000BE5AF02A13315E581D66D154D4DB96887F +:10C02000E7BC446D1783B33A7B007056D367F3F8CF +:10C03000F276B36D27ED5716EFAFF4E1A609714E16 +:10C04000735B1A39D184F707F83D520A4B737DDFD1 +:10C0500010DFF987315E437E75622024A3DC775CB4 +:10C060002DE7EDA5FD8FCBA427B6D49167C82FC0CF +:10C070000F4C8E3DC8DF8E803EBE2953F5A0CC23E9 +:10C08000E8B6D4C5A4CFA673BB554EF7AECDF7AD79 +:10C0900070E1F3DF147E9C7188D4DB1AAD04E3E712 +:10C0A0009D80FED846FA84EF2D47FEBC6A70EE995B +:10C0B0001EF72A8A9FA6C2535CBE01E59BE42AF9BB +:10C0C0009EEB5CE25C9A3EAF3C74DE4AF1AE3F6CA4 +:10C0D000ACCF351ED73A3A4F1F4083919F2B57FD67 +:10C0E00073C74EC6E9E5DF99CDE97411767ADD288C +:10C0F0009717F11CBB512E2F7BBD6999B8FEB2CFAB +:10C100009B96951ED7FFCE9D697C5D5FE9D2ECB50D +:10C11000D87F4495FB4B618F8DE87CCF4EA177DAB9 +:10C12000FB4E47576693FED45846AC4E1C9F1239BF +:10C130009341715DCDFE65D9A47FE39DF33EB7B811 +:10C140007747F786F5E7B2853C98519FD6AB7ECC12 +:10C15000FF58D44AF45FDF0D5C7E07F77DD249FAC1 +:10C160007B2992E620BF77F1405A80ECFDE58329D8 +:10C1700021136ED54EF28EF6ECA265F8C73C7EDC3C +:10C180006F7604709EFFE08567481FFDFB501B71B2 +:10C19000DFF591C747C9BFB547169C97A87DF9FB46 +:10C1A000D5878EEE87F87DB5FE851E9B4CF6F39203 +:10C1B00024ECC4FAF06B3C9E5D7FED4AA5B782EE9D +:10C1C000F9FBB964CFFCFF76652ED931FF9B57E6AA +:10C1D000D2B8FFF5B42EA3F8E4798F99D355F38F35 +:10C1E00045272425715E9DAA07455B9E6A2846FA6D +:10C1F000D51C5FEE34CB09F25566F2D2FC9A8F6AF9 +:10C20000B3D725ACDB12931AE8F99CE3B569AD0905 +:10C210007279BBC7A2DA21D46AB43F2B551AAECCCF +:10C220007B3266AEA4BE1450E308769DC7DB204B7C +:10C23000C8E766FA0F55B12F26F17826D0660E951D +:10C24000E17873CCA4D82B691CD725C41900DE452E +:10C25000B388DFF74E766E95B9BF871EEA3F5C164E +:10C26000227F0F01DB5069421CB432668AA6A0DC33 +:10C27000344552A2140FAD8C4967785F8D8F4E3BC9 +:10C280005EFD7931F0F8E85C629C83F1D0397DBCC9 +:10C290000413E8BC5ABCF431C55518CFB66C8C5A9F +:10C2A000C85F619CA49BBFA6E947E7290F5BD3AD9C +:10C2B0007F5E14934C4BF09E4568EE880C7DB11D5B +:10C2C00036D20F2DCE247E0D18E8FB4FDD429F3570 +:10C2D0003DDA1233713E6C89B96DA5D836ABE303F4 +:10C2E0000E130470FF2D91657B186EB6E5DADD69DB +:10C2F00044AF2D2796C263A4EF0EB7AD8CD65DFB7D +:10C30000916D45455C3EC6D80FB7B08FF178C0D867 +:10C31000CF4D51DFFB7DF9BB3CF79F87BFC3BC7A94 +:10C320009A7B32CFAB9B293ED4F2EA643FA1D95F1E +:10C330006DDFBB547A8FB5BFE779FC82F92FB7BFA9 +:10C3400077B9653E6F4AA4319BE7C5279667CBE96D +:10C3500063F72F919CA6AC8AB1FB6BF19A3FA00CBE +:10C36000D9288F51CC5C3FFDCB598851DFCB789CCD +:10C37000ED5F6D09D1B8769ED872C6E7AD70B29008 +:10C380009DC5E33F2D3EBC313E07C78BE2F1A216AF +:10C3900017C6BC8CE741CB150B1F9F31D557EFAEAD +:10C3A000A1FBD9F9F39AF9625FB40343941FDDFD51 +:10C3B0001306DC0EA8F1A2269FC9F1E41791928919 +:10C3C000DF841B3DAFCAA5A65F5393F442F3538F9E +:10C3D000B8047D3AC94F57939FFEDA4A7A305EDC43 +:10C3E0008D7E7A959BAF03BE7ECE4792D728EFBE57 +:10C3F000A8FAFFFB886FD84E89BDE5A2F316426C00 +:10C4000013E58BE3F9CF856A1C33DEF8232E91AF59 +:10C410007C9B1E3FADDEEFFBD2E36D6E71AEFFED98 +:10C420007A7C23FEB31ADF73A6C7F51CC96FAAB9BD +:10C430002BE622BD7B17F54E1E3BEF2E2D9F944021 +:10C44000C79FA142AB89F21E7F9BC0018299F20770 +:10C450003C3F79DB0CB4CFFAABF93C4EBBEF6A261C +:10C460006F83F920FCE883451CB7B9EFA5E31605F7 +:10C47000D7376F64B3090F6A6ED3DF273859E138B5 +:10C480005BE000E3F17230BFFF08E955604F894C73 +:10C49000FBB7D065090F69CB0C6D26FC82709C5BE5 +:10C4A000E9796A9C0EF89E0EF5F91D2ABE034971C2 +:10C4B000C09B83A738DEE31F6040FA6B8DA0FD2090 +:10C4C0007B7254E01D9D1161173EEFB6737BF2B98C +:10C4D00024EEE1EF66A14D2C1E479C8F6CCB213DD5 +:10C4E0001B134F28184FE4C4E3898E173EE2F63041 +:10C4F000397EC81A10EFF1B79B4384C70C15CE657F +:10C50000D4EFC07C3097E24459BEAB409C0B42DC78 +:10C51000AE283A9C64F72DC2EF7F71F43F781ED9A4 +:10C52000BC9F41368F3B9458694E3CEE58135CC813 +:10C53000FDBF1667AC997664A880F653E30C07FE3E +:10C54000127E981C6774868F5B282F18134F24C5A2 +:10C55000119FB9F5B8E03449E0ACD322CC4178D290 +:10C5600034959EB7F5A5F2B8B8FED3D66CD2738DCC +:10C570003F971A05BF2E9DFAD245EBE67E2A39C8B1 +:10C58000DEBE796AE38705A22FDB645AB7318DF2EC +:10C59000904B9F3E9046F47C135B407D7DFDA464F0 +:10C5A000881F2E57ED11FAB7DF73FFF6A88A1B4BD1 +:10C5B000E8DF26C4F197E4751BD475414C3338EE9F +:10C5C000B81FB8FC06F37D0B79FFD962D8C3711F81 +:10C5D00021AFAF45321D14EF95E365BBD14EFC731F +:10C5E0002A6CB157913CFBDEE1FAF1AC89CB2FAE5E +:10C5F0000F30EAEF95B9BF2BC7BFD538BFD28A67D6 +:10C60000A902F132D4B7992ADFF2310FFDCCC64529 +:10C6100068F975A453F994A35F131F2B5341A2FD2E +:10C620009FB0F8B6CEC0254F0C4ACE4DB4467266C8 +:10C6300037E2BD9EB08BAD9ED88FF28AE742E9E625 +:10C64000E7EAAC387292D633D901AB717D675E7A76 +:10C6500094F033085B7E73432E510E18BDA752C869 +:10C660001BE5A30C14761DF9FB873A59D8859F78F2 +:10C6700081F2A0CDF3BA80F2CEDFD5811A07D902BC +:10C68000E770FE0A5C31119FE7E6FB96505ED89199 +:10C69000376C1571C58895E28A55E47FB8BD15B829 +:10C6A0009D09E793BDDC3AFD552E6FCDF43C419FCB +:10C6B0002111DF338FED3FEDD6F64B7EBF2CF2CE4E +:10C6C000A4F7CFC9FC2287E72FFFFD5F19DC9F4548 +:10C6D000AE70BF73792405621CB71B163875C4C2CF +:10C6E000F3F5CB98074D4EF067AFBB041D0E453CEC +:10C6F0005C1E0762B56934FFB4FABCEFC4F2654B47 +:10C70000484E6292B38C9F52E4350331A946C40768 +:10C7100063E8F4D76E033AD952853D4F96CF1C5546 +:10C720003E733CE2DE9E53225FF16F14F50387AA4D +:10C730006FFE2EC6EDCA91C21CA6E1C8B946F585AA +:10C74000FD23DCCEB6DCCB9C0179FCFAC27635CF7A +:10C7500048B6439DE1BD826FC9B86D433DB73B37D5 +:10C760008BDB0265C373E376FA7E8F6A5766091C1A +:10C77000F7AADBC1EF9BD535DB950BF1FB1BD0F3A3 +:10C780008CC780EF06F3466A0DE86E306FB67273A1 +:10C79000F3FEE626E73D7893F39E566EEE1E176E87 +:10C7A00072DE4737F9DE5F18E92DFC1FAD8326D70F +:10C7B0003993EBA2C9F5CE94B7D70568EC71F6E4CE +:10C7C0004894A89BB1AF89A1CA4A992FD8484F165F +:10C7D000CF177581BE5A5B68178BD747357A9DAAEC +:10C7E00013F197A36234908D749EAAC46AB3519FCB +:10C7F0002FCF079E3F5CB68BFA00488EFC46CE3F9B +:10C8000047FE52B4FB41BB719DE94975BFF1EC098C +:10C81000D4BB3E257D71505C6EC0C78D2A7EE70873 +:10C8200003C76D4092F397F2F7CAF9E46F26BE256D +:10C830009E674441D9C5CF25172DE571B45C44E707 +:10C84000DBAED6BFB216FEA088F0BA2CF4BB541FE4 +:10C85000D94675129E0738F83CED7DADB5E27DDB1B +:10C860002DC0A89E1598C1789C0AC31319C99F565C +:10C87000DF3866899E5BCB787DE3AA07EFF79E29B8 +:10C880005AB1BB48F085E85B31E0E07597F7E7FF08 +:10C89000E3741F7F8FA8776C7088298729DFC073A6 +:10C8A0006C3850CDE5B7F9D0FC5FAEA6B8B054E215 +:10C8B000741E138FAB79D649354FD4F2AC61CA17C9 +:10C8C00013F28EF45AD378FE30DDC8DE6C67220F87 +:10C8D0000EBC27F2E06AABB3A42B814F79B5827FFF +:10C8E0006BA3028FD5F2DB4A2564CA413A543F6CF0 +:10C8F0008EA6A0BFAEEE9D6525BB5DDD5B98CAF13F +:10C90000A5D6BD268DDE467C2F56CFD9777484D729 +:10C91000275E4BAA53B6D65AF9F887AAFCB4D602BA +:10C920006F3794499BC90D4FFC4B87D9081F6FC1C6 +:10C93000F89FCEB73628CEABD5435AA2B287DE7366 +:10C940006668A497DAAAB6220FC70FDB477BC97FB8 +:10C95000FAAF5D397227C703AC32C557C9FB5EA871 +:10C960001338E26B149010BD1648219A57BD40E26F +:10C97000FCCE6AB1F37C3CCB02E674EA370A7F5600 +:10C98000D530C9437D589EC9FD71D55139735D4578 +:10C990003CDFCF5AB07132D1E9DBEA441A6E306322 +:10C9A000AAE2213E7ED73A51C7B11356BAF73DC32A +:10C9B000FA3A9156F719AF4EA4D569FD0D5FEAEA30 +:10C9C000CA7E69A49EF095EA0367789DD81F668E9B +:10C9D000BCA278FDC83F306AE5F455EB4638DF4A23 +:10C9E000EB067A44FD681FBE9FDA30DE57C173BC88 +:10C9F00081F7A53682F7A5E7077BA6F336DAE3E4ED +:10CA0000EDA19E79BCAD46B1C9CFA2BAD328AF3B48 +:10CA1000DD5BCB248A53B5BA855697A8CDF7B613FC +:10CA20009D12EA16BC9F5CB730A78A7CD47FD4E203 +:10CA3000DC8DCFFDC76CDCCEBA226BA7515CF6D57E +:10CA400071DF3407AF0364F3BC5293874B8AD39EE4 +:10CA500049F980D769A77A41F5E079ABCCED4EB4BE +:10CA600000F2087F8A5929EF273A283C9E73D9891A +:10CA7000AEDF8AEF87FF1FDFFF2EF8FE485C2FB97D +:10CA8000FDA8F29A945DD41E55ECEB12EC439F572F +:10CA9000E0C47DA5C55CFF76788B335B13F1FC06A3 +:10CAA00091C7652D28B5273EAFA917787E1603AF2D +:10CAB000911D7BA3D6345E1CF846AD615C645C17A7 +:10CAC000E86B107644C3FDC7D6099C6F9726E0FD3E +:10CAD00097DE4339C5BC75707F0AF7E75F1D48D9FB +:10CAE0004DF1775543EBB409D8AF3A990245C21FCF +:10CAF000E9EA0BCD0D26C59E61544F500A4C28B76C +:10CB000063EA060D266EDF6FD40D1AA433BCAFC6E0 +:10CB1000E9F78CFE7A421123FA87829467BCD6C16A +:10CB20009C8330B68E801B17C03CBC45C3095E5742 +:10CB3000767631A72C7F7B7D2147C5193AC399664C +:10CB400092F396B700E8BBADB17586061EEF57C1EC +:10CB500053C15AFA1EABD4E4207F968C17909C9058 +:10CB6000FF4FC60947547F34A2FABB87D5F8BE4AA7 +:10CB70008D4BB475C9FCAF53FDD378B8634D9D8818 +:10CB800027B63454F511FF028B4D407E604B83DB9A +:10CB9000569AB09FB94E7C47B39DEA169312EB1696 +:10CBA000A23E915CAFD0EC54F5E0D7F5C4FF1D1167 +:10CBB0008127F9F304BE597DD07594F43E7E4E7101 +:10CBC000BF1DC8E3188FA39C9920EE0536817B71A9 +:10CBD0009CA16AF19787D2887E5EF45764978E9500 +:10CBE0006E4E277BB258AA6132C7BB6FE0DF844F1D +:10CBF0002DFBA06D2190FF5F31FB38D17DC56A0B05 +:10CC0000FF0E49F357CB3E68AA17E3BB1E4BA5F1B5 +:10CC1000E9CC6997E979839B9E2F7A394A481F2C82 +:10CC2000A1D3A1DEC48E9D93485F664CF595D4E1F7 +:10CC300079AB1B551C7CB5F0AF2B228D16481FEB32 +:10CC4000EF0E177EC5F3E82B916A8E6F6753FDB523 +:10CC500022EE2FAA0FA01F9AF0A7F34375750E4E70 +:10CC6000CF5BD10FD179B21A459D3099FF6695FF00 +:10CC7000E3F995F1EC28F911D33CA1372C2FEE7F85 +:10CC800065CAAF6F8BFB614718FBB9DF807BABF6E2 +:10CC900029739C38EC21557EC7FD7E23FCFDE0E026 +:10CCA0000FD4FD99E0E06A9EA3E1E15A5EF49E4A4A +:10CCB00067AD7D5F6D93F1320D27CB5500BABF0193 +:10CCC00027CB251C2D8BCC7605C7EDF2D533DCC0E8 +:10CCD000CDA259A6EBE5384FC5ED34FC2CE79E7E7E +:10CCE000467146210436917D19B2826BEF24FA6EAB +:10CCF0008FC126D2EF50238F73869EFB55EF2FE80E +:10CD00007BC301E620F7D3D17F9CFBE90E8C6B78C7 +:10CD10003C14B92070AA7EF1BD694798294638E8CD +:10CD20006F55FF5CAB00B71B1DEA777DF50342AF83 +:10CD3000E338D14352224EE4976393B5EF0543C2E3 +:10CD40003F197ED7D70923FC7BC0CE36E68CE2F3B1 +:10CD500064DC28192F7A4AFD0E705CDC48F96EDF1E +:10CD6000FBEDAB9B30E933025355FCF99447D88572 +:10CD7000261F63B4BFCDE46DE7DFFD1E640EA3EF95 +:10CD8000478FA972BF48C56F5FB40A7978F17616EC +:10CD9000A2786E11089CF6C5836B397EFB62157311 +:10CDA0009AE89E2A5EBB50A5C78C385EBB83F0DA3A +:10CDB0001FA33B219C7691CA7F80107F4FE3CED486 +:10CDC00028C51B4F58FAF3481FB5EF8D1EAD13FE53 +:10CDD0002E3505BA8CF4335CE77AB48ECF1B37BF9F +:10CDE0003C596710EF14D58A7D4FD7E9BF2F4A8889 +:10CDF000D3CFD0BA84389DF793E3F43F155EFBB7E9 +:10CE0000E3E3C555C6F1DA98797B6E12B77BD68815 +:10CE10001E9B55FC2499BE4ABD6687A73838EE781C +:10CE2000E3FC20EAB92AEE35A4FAB920937F79070A +:10CE3000AF7F5978FD4BB333C10962FF89F5C2EF6B +:10CE400068ED4C75FFA0C518A7A951E7FD305FC973 +:10CE5000A8C779E52FE971B359FD7ADCECD6709655 +:10CE6000AE3F3B7A8B6E7EF5D162DD784D6CA66E5F +:10CE7000FCB69355BAFEFCE1DB75F3EFF8DCADEBE5 +:10CE8000FFD5881E37BBF3AA1E37D3E4DB8512918A +:10CE9000B8CE63FB996E5E419BFE5E855DFA7B4D6D +:10CEA000EBD6DF4BDBB728A0BF5F49507FBF2CC25A +:10CEB000F52BFE785C7F6FADACE2FA25765AB7BDF4 +:10CEC000A1D44E714C6EBE90576DDEFF0085A782D7 +:10CED000721032000000000000000000000000009E +:10CEE0001F8B080000000000000BE3146060F85185 +:10CEF0000FC1D3F9191836F323F8F4C0C7981918DD +:10CF00008E83302303C33E20DE0AC46B80F83D03CA +:10CF100003C352203D07882703711710BF048AD529 +:10CF2000B1623787858D81810D884F02CD3AC54C1E +:10CF3000BCFD8A7C08F6215E0686B5407C9497BECF +:10CF40006130D8F00C41FAD9F50C6AD76ED181F76F +:10CF50003708B38A3330304A20F8FD12A8F26CE269 +:10CF60000876960C65769501F50300295128158001 +:10CF700003000000000000001F8B080000000000FC +:10CF8000000BED7D09785445B670DDEE7B7B49BA28 +:10CF90003B9D9095257480202A4BCB1201113B219B +:10CFA00089010306440928D26C2184249D01661E50 +:10CFB0003EFDFF6E0842C4D1898A1AFC195F83E0E6 +:10CFC00004079DE0A0139DC0348B8833E804C70597 +:10CFD00097795F401E204212A338E8F3C9AB73AAC9 +:10CFE0006EBAEB763769B7FFF97FFF840F8ABA55BF +:10CFF000F7D4A9B3D5A953754F149D9124DD40C82A +:10D0000025F8A1E5AB0A2124255876489DC3E58182 +:10D01000C1F6B55E1771190979C06BC272BD379D33 +:10D02000B8AEA0CF47EB8AFC1642EEF7DAF1F9E38F +:10D03000DE122C1FF59662F988D78DFD1EF29663DD +:10D04000F92B6F0D96F77A8BB0BDCEBB0AEB372A62 +:10D050000BD2605C425CA6AC64423C2F0F1CB981D1 +:10D06000D6D6678E4F9047D3FA5FF5449F45DF1BB6 +:10D070002D17F987D206B9A4286B74B09F8AE78D63 +:10D080004A5E5F80F3F8581DEB67AA792D3B72BFAB +:10D090002C3286E2395646FC89A564727672C47ECB +:10D0A0008301DE2343D93C89DDF9DAA0C8F0AE065E +:10D0B000780F0DE5F825DB270F8A0CCF09FD7EE5FB +:10D0C000E4F0D23B0F0F8CDC6F0CF4AB7372787D05 +:10D0D0007DA60191C71D0FFD62E013C589105F8B0E +:10D0E000D19F9DF5FDF9455CF42FC5A763AF79EBA2 +:10D0F0000609F9370DE8B4D6BEFCCC163A4E7BCB08 +:10D1000030A7DE41C8672E6782DD1213DF6E81799A +:10D11000C4C0B752182706BECD8D916F0BA05F0C0F +:10D120007C5B02FD62E05B658C7CFBD94F846FF712 +:10D13000021EDF836F1B62D4B75FC5C8B78D31F2A3 +:10D140006D538CFAF6648C7C7B2A946FEA73B5DCA1 +:10D150004124B48B372A253BA09F27B3CD3620EB43 +:10D1600027C1BF3DDF53EFF6C7C8BF5763E4DF11E8 +:10D17000A04F0CFC3B1A23FFDE89917F1FC4A877C8 +:10D180006DB8CE58E4AFDA8610FCB93400FEB5D8DD +:10D190004F5DCDEB7AC03B89908C7039504BCA51B2 +:10D1A000940799B8DBD9BA55F0CDA51C425698E83A +:10D1B0007FE9FBBE3C12D0D3F17D36E2AF9584FE11 +:10D1C0009F039E84E47F732955E8EFD345EC4F74A9 +:10D1D000D0FE30C815E5FF66EF102CEBB91C6D2EA4 +:10D1E000D2A13CF8920D285F4F789DD8DEE01D8BD0 +:10D1F000E5635C2E3772397A00E4EE0A90C3522E52 +:10D20000574CEE0829719453BA76EC89271B1C28D9 +:10D21000576609F09499BCDDBBE7CAAD1B28FCCD6D +:10D2200035BA2BB785C8D91345AA7C51C94C0EF61F +:10D230007BA2FC846DC150A4B70DE03414EBD47E06 +:10D24000BED07E0DEEEE7EBDA0DF63C55CBE641277 +:10D25000081DF7B1D2EE7EE912A5CBBD12296DB241 +:10D2600084F3658AC4F4942A0AF243E6F4DD9F77D6 +:10D2700096B4D1F76DF6916984964F827EA2FE39FD +:10D28000B054DFAFA77476537A641A494D13E04B5C +:10D290005A2585E22B8F7524821C3D34CE45242BE4 +:10D2A00021FDA19D8EDF67741BC9A265E2F83622BD +:10D2B0000D837EB49DD653787BC650DA4EE13C0494 +:10D2C000EDD6607B2A6F4F73F0F7AF63ED0F7B09EC +:10D2D0008EAFF6BB8FF2D94DF15B47F1C5E7C5C400 +:10D2E000057494293BFD21F39F2DE971DE95BC5413 +:10D2F000F1BF2FFB54C6FCA1417CCD832F66CC0F20 +:10D30000C1EFBEC173B0AEE263BEA212EBFD57F532 +:10D31000A69E18D707124EE7D49903847687EC446B +:10D320003FCD71444F7C945F0E2A9E91F8F3051512 +:10D33000E71F54FF5C8C1EDAF6BB3574589721D278 +:10D34000C1D05BA4C3BADE221D0C7D2E4F8729926B +:10D3500003E147A3873AEE862BC571E3AE12C7DD22 +:10D360007095386EDCD53FCCB8EBFB89E31A33C53A +:10D3700071D7678AE31AFB7FBF7189ECA40F99B953 +:10D38000200EF8679E60DF2E10F7C3A0DF60E7F481 +:10D39000C9413B27DB4B88DB12E42791E9CB39A15C +:10D3A00070EE14EC2A85F37F381CD7E5E1D8357090 +:10D3B000E66AE16CE37048A89D0E8343EED0CEE3AD +:10D3C000B7FCBD802E647CBABE92126BE87B4ECD5A +:10D3D000F8B76BC7DF0D760CE6A1BBECF80E0D5D60 +:10D3E000E768F1D9C3E110DDE5E841EC1A38B3B5DF +:10D3F000700E713801E9B2704AB5F3785DE5AB247F +:10D40000AC5F941EC382EF75E4759E423FE845C54C +:10D41000B19DB64B7FB2066EA0FD8F6C91FC465A53 +:10D420000FEC8DC7F5E3FCB6E958DF778D11D7898E +:10D43000F3CEC97E23B527935E78DB06F6A5EA0511 +:10D44000BD0C75DDDE8F6D6D142F8FB1F5C1EBE86E +:10D45000F3CE17F4642B4A63A10EE87E8ACB2659DB +:10D46000C5EA656656ADDAB2EF4E805BDE6C2466C7 +:10D470000AA7EAA525D3AEA3F5258715025DAAB6AE +:10D48000AF36F4A6F5A57EA909EA1D79A41CF469B6 +:10D49000CDDEFF6C87F5E8FC6E251BC63F4BD70938 +:10D4A00007B5C747ACADA933291E15FE5D85F05EF3 +:10D4B000C54EC9492D1CC577FBA10CC07787E43444 +:10D4C000527A2F6B8C270ED5DED1BFA776EB71FE7B +:10D4D000CBE9FC0985B784D417023DAB803830BE58 +:10D4E000D3E8374B417D3BEB3D8CE3A9F5AA1D7496 +:10D4F0003CFA7EF5739213A65AAD236EC0B3FD2598 +:10D5000073E9531698E76AC3602BCC6FBD01FA2DFF +:10D51000F1CF7FD1EC003CB7180A01DFCD5B0C6581 +:10D5200043817E645EC950C0EF2F227E0D7A17CCF6 +:10D5300077F935C6AD7AE0A72530688635DCCE9E12 +:10D54000A5EB952364FDAC20CCEE13D96F983E2C4F +:10D55000F8FC257D22CAC1B2463D7184DA0D2E1F2A +:10D56000BEA384F9317BACFEED59413E2EB77379F1 +:10D57000E57C5C9EC8F92A77E6CC18168ECF83C06E +:10D580001723F38FA07C98AE9B0EF47F1C48BFC777 +:10D59000A8FFE440FFC889CF9FA07E12949BA99F5B +:10D5A00004E593D44F82D24FFD24E8B795FA495051 +:10D5B0006EA37E123C7F9AFAE7503652FF1C9E3FC4 +:10D5C00043FD7228777A7DF8FC396F1D964DDE7A1F +:10D5D0002C9FF73660B9DBEBC77E2F7A1BB16CF658 +:10D5E00036E1F397BDCD58B6780358EE053ED332F9 +:10D5F000E06DC572BFF7189607BD6DF8DE21EF1913 +:10D600002C7FC9E96E9B4072652A2F3617B1039BA8 +:10D61000928A5DB9E0AF2495B07AEA1DBE5C03AD95 +:10D62000A7BA699DD2B1776520D748EBBD6B587B0F +:10D63000E63D24CF44EB993ED63EE097AE3C33AD79 +:10D640000FA867ED8337FBF2E2687DB09FB55FB549 +:10D650003390174FEB5735B1F6E12D649285D6879D +:10D6600007587DE411D7242BAD8F6C65F59C0F7D99 +:10D67000936CB49ED3C6DE1F7F2E302981D6C77728 +:10D68000B2F6895F937C3BAD4F2412D6F32CB9F9E7 +:10D6900089B49E6767F5C2BEF3654784F57DAFD256 +:10D6A000B6104CDACF7539B932F513F61ADA56805E +:10D6B000C95DAFBB21571E47E9A79045D0BE49576A +:10D6C000C4EA06B212DA7FAB9B8EF5FD8A03DBF764 +:10D6D000E8E6B0BAC181ED7FD52DC4FA41C585ED2C +:10D6E000C77595AC6E7061FB67BA9FE37887143796 +:10D6F000B62BFAFFCDEA0637B63F2CAFCFCDA7FD4C +:10D700002BF56E8F8ECA75ADE42E2703415E9BD23A +:10D71000C11EAEE37EEB2C9D03E57E5D8601F56CBC +:10D72000EF7FE53C857A063FC9502F7B1AFC5E0AE5 +:10D730006715C251281C7DCF70267E33568033F189 +:10D740009B7215CE6A84638E0DCEDE6FC68BF87C1D +:10D7500053A1C2D9A0A3F6BED61ADBBC265E9A207E +:10D76000E273A95285F308E293181B3E01E55A01C2 +:10D770004E4059A2C2D98C705262C3C7651827C0E7 +:10D78000711996AA70B6239C8CD8E0040CD789F83E +:10D790001896A9709E43FAF48B6D5E2EE3F5223E37 +:10D7A000C62A15CE1F109FACD8E0ECB78AF4D96F0B +:10D7B000EDA64F00E164C736AF3C9B489F3C5B370A +:10D7C0007D5E433857C60667BF4DA4CF7E5B377D6D +:10D7D000DE4438C3629B575E82489FBC846EFA7CED +:10D7E0008070AE890D9F8329227D0EA674D3E72415 +:10D7F000C219131B3EF9A9227DF253BBE9731EE146 +:10D800008C8B0DCEC154913E0753BBE9F305C2B9D1 +:10D810003EB679E5A789F4C94FEBA6CF258493EBF3 +:10D820006E447C0885638D0EE7503F913E87FA7504 +:10D83000D3C7A407380514CEC09EE114668AF42924 +:10D84000CCECA64FA21EF462726C700E658AF4399D +:10D8500094D94D9FDE88CFD4D8E655D85FA44F61C8 +:10D860007F461F8FB173921DFCC644E2DC4A5F996C +:10D8700094FCB383B0EE2816E204B047A4C036800F +:10D880004FD756F44B65A7EA073909F8B9C536876B +:10D8900013E2017AD5DF21ADB81FB1EC4C14E24D93 +:10D8A0002FE9F38603BE56EA1586FA3D0963E304C1 +:10D8B0007F2BD19524D47B15F516FAA7940C10DA9A +:10D8C000D34AAF12DA33DC23857A9FF2F142FF7E2E +:10D8D000357942BDFFAA2942FF2CDF0CA13EB06E74 +:10D8E0008ED03FBB7E81D07E454385D07EA57FB95B +:10D8F00050BFBAF15F85FEC39AD608ED239A370868 +:10D90000EDD7041E16EAA30E3F21F41FD3BA5568C3 +:10D91000BFF6D83342FBB8B6E785FA75675E16FAEC +:10D920005FDFB95FA8DF70F1CF42FF5CF237A13E45 +:10D93000C9F481D0BFC0FE91D07E63FA271A3F564A +:10D940008C5FD4E612E6CF6618D09F0D580D58377D +:10D95000EC35B3FD0DD493210E518C75C3FE858E2D +:10D960006488070000EA4FE4F62EBF02E255BF18B4 +:10D97000EFBE02E2B8BF30B847D823F841EDB2FBA2 +:10D980001E3DC6135B25920EA54307659C9EC713DB +:10D990008C4C7ED767E53CE50BD183BA7ED4BFA023 +:10D9A000F5F57A8AC798A0FEACEF57963E3F649C87 +:10D9B00075FD0CA55B87B2E70B2D305EC97D309EEF +:10D9C000C7D03918F0D28E631C305618C794598EC0 +:10D9D000E36C84715282E31833CB35E3984AB7F293 +:10D9E000E77C9CC7406FA28DB37EC078713E9915CD +:10D9F00038CE16CD38EB332B34E3C4B1F9D0E77C05 +:10DA00009CA72E378E71E004713EFD2B719CE7B40C +:10DA1000F3E95FA919C782E3C0731887F4A5BB981F +:10DA200034CA67636719CAC19FCC182733F4A9F8B1 +:10DA30000DD4C90766920DE338E8B8B41F199244B3 +:10DA4000859A907FD127217FBE88A3FC0F89A705E7 +:10DA5000F7E33EDCD72FE628123FC588EE93AAB93C +:10DA60006C2EDA393D73858396CD07063D02E36C53 +:10DA7000B43AB369BDBD7992616104795A5CAF9CD7 +:10DA80006A0B91F3EEFD591E195243C75F116747A8 +:10DA90007CD4BA5A26E9C4E727E8BE8BD0FDC987F3 +:10DAA000749F42E87EE52385ED33FF9DEECFA0DE37 +:10DAB00046F767D04EC86A7CEF048F339FF8A5E421 +:10DAC000077A7F71D7CF145C277CE4ADF4548826A5 +:10DAD000B09F79ABE2291382F8CDF7F512EAD41C96 +:10DAE000F7D1A5E3BE16E3079D2F19FD5B81AE7547 +:10DAF0007D284D79BF0184BCBB77EA21C986D53E1C +:10DB0000BAB184CCAC995E90865A24F55B4EF19CF8 +:10DB1000B1FB1A85BE41DA95B63B9D96205CE25278 +:10DB20004E007D4CF40FC0B9A588D643C6BFB5449E +:10DB3000ACCF2272B04EF97D523F80B0F83F1FD774 +:10DB4000E15280AF25748E1994D5B3A01C09CD2C59 +:10DB50005E536A67EFAAF878162A2480FB6B5F0A87 +:10DB6000C4B1892F19FBCD51F7C91AFC4A1593ABE3 +:10DB700084D2B574BE1EE9AAC5F7FDBDF12EDD70D5 +:10DB80005AD63DA24068B627FC67BBC57652CEC6C2 +:10DB900053E9AACACB29CEDF13C07F5A9E06FE5393 +:10DBA000BC4F72FE07E598F1DF63744F03FE776E9A +:10DBB000D213E417E7FB6D9CEF8BEB45BEDF06E766 +:10DBC00071B4FF6D2BB358BCA9A197C05F3A719196 +:10DBD0000EF50F1550B31A86FFDFB91CCCA9DBF583 +:10DBE0000AB0F7F672CDFC381FEEE47C98ABA1C703 +:10DBF0006D9C6F7339DF9610DFBD1918BFF02B10C5 +:10DC0000D79B5D2E11B0179EBB55BEB5097C73AB7B +:10DC10007CD3E07B27E7DB9D7731BE69F16EE37C47 +:10DC20006B6BF84C2103C2F1D6E2396F95665E3E0C +:10DC30002DDFEAB95CDA0DE04F4D77E5AE3819D249 +:10DC4000FF96A2C92B4E86D8855B4BA60BF559A52E +:10DC5000B385FEB3DDF385F6DBCB970AED736B7E00 +:10DC600026D4E7ADBA4BE83FDFB75A685F58779FD5 +:10DC7000D0BEB8FE21A1BEA46193D07FA97F8BD076 +:10DC8000BEAC7187D05ED5B44BA87B9A5F12FAEB1D +:10DC9000F65E7933C8D791B7F504E27D179CA731BA +:10DCA000CE78C1A938A1CF49AF03E5F8947708969B +:10DCB00067BC4E94F3B3DEB15856834C8E033B7B66 +:10DCC000C002F1534F1CB5FB89741D97C7ADA99BCA +:10DCD00000EB0D6D1F4FC8BFCA37ACF1F5A55A0058 +:10DCE000716F4AFFE20603098C2254BA7B77CB732B +:10DCF000A73EA4BDAD87F60699047A85B717B74548 +:10DD00007EDE21750ECE80B8EC7B46B23D24DE1857 +:10DD10007EDE42FA805F11ADFD9C8E94879EF76C8B +:10DD200095D939CF117DDE5699E2556960FA5FF9D0 +:10DD30007C461EB1413D30B8C67299F19A283269CD +:10DD4000C0E78182DE2F69B83AA8E704C661F6749D +:10DD5000A97F94F07C59E375C27B6F48EE2D80C794 +:10DD6000B97D7A5CAF49E040E62DC3003FD7561934 +:10DD7000D6D1E614F4BB5ABDAE15271542DEF41613 +:10DD800061F996B704CB77BCA5581EF3BAB17CDF16 +:10DD90005B8EE587DE1A2CFFDDBB0ACB36AF0FCBDF +:10DDA00013DE3A2C4F7AEBB13CE56DC0F28CD78F85 +:10DDB000E5596F2396E7BC4D58B67B9BB154ED6790 +:10DDC0004FF27786AFAF67410E8DE1727670EDBC92 +:10DDD00035757D837276582E433953E95BDC60E4F8 +:10DDE000F2902AC8C35F611D4E0179E9A1BD41E1EE +:10DDF0007218EDFDC8ED206FBD7F047923640DCA54 +:10DE00008105E4EE7BC81B8153841490A73E1A79E8 +:10DE100012E550952355CFDF904ACE817CA97265DB +:10DE200091993FA4CAD5FDE02746F0B77A2B125F3F +:10DE3000FF987F4402B93A20D9727E5E417C2EACB5 +:10DE400077F1B16B29B856E827FB87C03AD235E4A1 +:10DE5000ABC110DFEF3A4685202BFAFCB4F2129DDD +:10DE6000EE2EDC3F94F929F37B85B79BE3185DCD5B +:10DE70003A524446C2F972CE3137E567DC9FAE1E96 +:10DE800009FB66FA5C264900C7EF9C1EE1BC800CCA +:10DE90002248E79EE8ABF63FF5C47FE6C0B9BF0570 +:10DEA000F49CCE3DEE80BE86E9EF53CE5B42CE972A +:10DEB0003C46673AC4C13BB30D76E63F4C12E94895 +:10DEC00026E1F9814AC703D95F0C86F399FBA81CA8 +:10DED000827E750D1A9C402E231F3DD9FB9EE8B90A +:10DEE00000E61B133D0D04CEB9283DB7C27DC758CF +:10DEF000E9D9939DECC93E9ED8C0E87C84FBA7D1AC +:10DF0000E8AC9E8769F1B84591391FB81C933B3442 +:10DF1000F42F15E8DFD7EAC0FE07F77E9009E7780F +:10DF20005DBBAF48204343DF2F60E73DDDEFE70BEC +:10DF30007A20FDE9EF99B03F3EF8C2BB58AE254CC0 +:10DF40000F375A4AE62A6382F062BD47106D5E1EA3 +:10DF50004512E7D5837E76A4AAFAD99A09F2B49B32 +:10DF6000DB81B0F9F5209FEAFC0EC0FC289CA920BB +:10DF7000D3741EF972C95DC2FC46A7E0BC7B9A9FB0 +:10DF800027C140A411143FABC14012A83C2AEEB5F2 +:10DF90000AEEEB9C6D3E8853EC8D77D65296786CEA +:10DFA00067DF0838E03D319EB1ACD15C23FA4F8980 +:10DFB00035A2FF945113EA3F751D7ECAE6A6F82DDF +:10DFC0004FD7D79CEC05EB9C8BAF736C5D55F1ABD9 +:10DFD0006ACAAAB10870C47A57BD54C4EEE13812B7 +:10DFE000664638EF53CBE5E9061CE76CE3C004183E +:10DFF000F7ACD754C3D6577B0D1B37BD26747DAD08 +:10E000005C155F73725410BF68707F68FCA8449001 +:10E010008F4CB02ED2B681D1FB47E5A7FCB901CF1A +:10E02000D55B942FC07F370F51FD7719EB2A5C4FDA +:10E0300093DE671C01CF770AE3D1F71CEAD938BC1D +:10E04000175D6E64724AE5A71ECEBB08DF1F98906D +:10E05000CF6E0A3181C2EB902D7520577E85E9B3D2 +:10E0600087CB6995A9CDE07620B95B41AE178C5579 +:10E07000E5DC31EB036AA73FFE8B82F7CCC8D714EF +:10E080007A4EF0AAC322526283A0EA82DDCB8A6173 +:10E09000DDFEF8C59BF83EBD3E07E67D9EE88AC0E2 +:10E0A0002E9D276FDA4685E8EB6985C5B1481DDBF3 +:10E0B000E7F8E81F98DFE27A71DFB3A441AC9791EB +:10E0C00019A9606FCB362AC44F715F0AFB2675DE33 +:10E0D000D4FEBEABD811B925A4661DECD31F53588E +:10E0E000BC67819DC87DA8BDAEFAC3AF7320EED3D7 +:10E0F000AE307F573D0F5F9AC4F6831533FD061788 +:10E10000EDFFD1EE51B7518B4BDFF7AF43FF673ACD +:10E11000716E27E1745F5827E2D713FE5A7C553F92 +:10E1200028EC5C9EE391DC2845BC2FF535B773AA3B +:10E130007E2419EC42DC274D5357E540E172E0574D +:10E14000DC56430AE33BF051923B0DEE907E866035 +:10E15000BF24C398E8FD8CD04F8FFDD258BFCE426C +:10E16000DC1F132A4F4383FDCC41787DD9B862BFB1 +:10E17000AA3F3CFBA28FCA4BC5EF1EB511BA6E7EFB +:10E180002CD7A73AE9F3CAEDF7DA5CB43C23FB6C71 +:10E19000C0CF8FFDFA88F77D6F31A8F470592488BD +:10E1A000A771F924753E8C537CB15DB1E33942A36C +:10E1B0003160A4F259BD7B6931198EF5E3ACBEFE26 +:10E1C000533DD49B457E55FCE6D15407BB27C4E2A2 +:10E1D0004924807E6EF5B6FF2884F5C2433A51CEBD +:10E1E000B4EFC1F8179350AFE71B12C2DBF16270B6 +:10E1F0002ABCCF7E3CBBEFFF546F8372F269D02301 +:10E200008F464ECAB9DF0AF482FD7EBEC19A8CF6F3 +:10E21000FE5A722DE8BB4A17E267FE6BED8EC78788 +:10E220001FA7789DDBF6179B3434D44E3079EB6A08 +:10E230005AF86F265D747BD24EE531D44FA280F13F +:10E240003D4733F7BB5B5859A9046C701FA7728B0D +:10E25000E2A492482A9FD513B89F40DE33FA213EAC +:10E26000BAECD957DE194FE9BF6C97925CCCA66324 +:10E27000915283FCF1D0BFAB4606F951F1FB570C2C +:10E280008E61ECF93D4941BE2CDBB5CF408685D38C +:10E290007152D33E439B25027F9A8E17C27A5BBB95 +:10E2A000E31F06882B7EBC57226959E1EF976F79EF +:10E2B00005D73DA013F293F3AB9B7F617C0B4C7BA6 +:10E2C0007934F6B3833DEC896FD9B09F4B41F97E29 +:10E2D000EE65B8C7F4BED10974287F6E850DE6736C +:10E2E0005AAE6172FEEB7B5341DFCB155FAA1D4B2B +:10E2F000F6BCFCC99FA3FC2D39FAF354F41F882BFC +:10E300004387B6D99701F35CBCF9569C671971A392 +:10E310001C96FF5A5F02F74C2FC8A46857043DF9BA +:10E320008B81ED5F4E6FA5CCA5F33C0DF8817D7B15 +:10E3300053EFDF8E71F39FE13DB89FF339D3951012 +:10E34000EB174C8C5F5B0C3A351E6A12E477DBFAF4 +:10E3500056E0D3D97EAE3438F7A074F071BA49973D +:10E36000285CFDD18234C627E29073F87BD4DE4F5F +:10E3700082E7D0BF557199870BEF71FBC8C65FC9A3 +:10E38000C7A778C7C1FA753A35B2FFF70F3E3FFA13 +:10E39000D34A42E42C44DF99FE6FBB8FE9BBAAFF4E +:10E3A000FEE945D0FEF95B4C8FE03D582F285E8199 +:10E3B000346CDF375342FB40F7D991F47C9BC2F5B4 +:10E3C0005C6CA73B1C5CFF5539A1F8CB5242A8BC42 +:10E3D000D07192900FB83F2EDB48DF0FF1CB3C306D +:10E3E0002EF633049F87AC1B4BB85D38A4B107648D +:10E3F000734A4C7E74A5E27FFA09D0DFF78C4E9FFA +:10E4000003F4572981F97FB2F3C03B73A89C7FD2F4 +:10E41000A4EAAD6857B57A5BFEFC1812496F3FB1AC +:10E42000D07D5724BDA5CF23EAADA50DE5F9FF9614 +:10E430005D55E9D7AEA11FD8C7971DD1E9A8B58F03 +:10E440001B0C8E88F691FEBC4572C2E550953F5577 +:10E45000EE2A7E5BD51FEC50B77CAAF2D72D9FAA7F +:10E46000FC69E72BD24FDBFE07D06F8AD7EDA64DB4 +:10E47000D3C07F3675128CC3E7CED4E33D4DD3E7CE +:10E4800084DDD3B8231EEBB3F46DBF079FF083AADE +:10E4900059C3609DBF9DF814766E5FAFA01FFBF55A +:10E4A000A54B13E87CE670FADE4EC93D95F2A35405 +:10E4B00096027114CFD932F12524413C59222742CA +:10E4C000F0B8BD5CACC3CFC4D4209C9EFA7F5BBFC8 +:10E4D000FBBB9647295F4F6413F2372871FF411D3C +:10E4E000EB10799ADEC2CE313CA325FF00D4C336AF +:10E4F000B924641FE13132FB7334FF963140BFDC35 +:10E5000059C312989C0FC6FDA287DBB12E9F230131 +:10E51000EC7B57CB40DC17761D5E687547B067070C +:10E52000B89CBDC2CF613A2C52BD9ECA7D07E9445A +:10E53000BFC66731478CCBCD31AA769AF38DFEE802 +:10E54000E9F8A55C0E67D357134686F06DE6D48FC5 +:10E55000655B381FE0E744C8BEE2FBD217E41AE867 +:10E560007BC0DC565812217E53C9E93771FF9706EC +:10E5700058F7F25B7265A063BE452FC4431619B904 +:10E58000BE0E254301AF89FB973E3086CAB1E7B086 +:10E59000DE69A6F3F3B47C6A7047D8DF69E909F055 +:10E5A000C1BFDC6A64FEF2DB4AC962A0EBDBB7B232 +:10E5B000F3DEBF199C5591F04C37337F733629B980 +:10E5C000305AFAE9D1377796359047E9D16561F746 +:10E5D000B5C3E58FE97D975DF2AF96400EF5AC9E31 +:10E5E000CCEE371712F7031324D4F71B42ED576E06 +:10E5F000F3F467E13E4D758B64D7D1F66AB9CD006F +:10E6000072EC69DE2583DF7E9383B8707F2DD70C93 +:10E610009B1912FFA2CB1ED2EBC05773E6027D3FBF +:10E620009B692480976BE8A73658FF3F6B19857A62 +:10E63000106D5EAF7BC9B47C05E0307BA69587C2C8 +:10E64000E478A17EEB24D217CE81271ADB5638233B +:10E65000F02FDFC4E42C66FB66FAFFCCBE4DA0F6BB +:10E660008DC9B5126ADF2CA630FB9616C9BE2D5F88 +:10E67000ED4803B958BE67207EBFB5FCB5C52991EA +:10E68000ECDBAB7CDFFB1ABF07DED197DAB71121D9 +:10E69000F6AD2FB56F11E2E45FC46ADF4CFF33FAC9 +:10E6A000F72AD8B708F3359B44FB56D4B21AED5B72 +:10E6B000515FBD705F8998A87D8BBF9C7D9BFFE8F3 +:10E6C000AD58579CF111E407E80AF6ED356EE760A6 +:10E6D0001CB0733798587C33563BD72F563BF73FC7 +:10E6E0004467D5CE2DEF27A1FF122E87CCCE2DCF9C +:10E6F00062766EF91E66E79667333BA7B56F796160 +:10E70000F68DBD5F3D84BE8FFBC7ACC7EF80FB8439 +:10E71000A58AD344FB173BD4EF276AC684DABB1B18 +:10E720004C32D239CCDE393FC5EF607AB2777F0503 +:10E730007B978D766C10E891563EA60C8A17EEB347 +:10E74000BDFDE5A9DFFE0EF4E5753DDE177A57C77E +:10E75000F6477BBF3C350AF4EE2113B3BF4B4C8C1C +:10E760009FED5E1FDAD3494399BE57DDC3E857BD1D +:10E770005B62F35DA9F73B601DF8EA22EE9FE7EECE +:10E7800061FBE759C6D69478B897F42F0A61DF7D0C +:10E7900090E2F921F2507AB102E380CFC7D9B6C234 +:10E7A000FEB2542626F063E71D9EF231F8AFF32E39 +:10E7B000D6A1DF3B0F9EC33909BF27A1DEA398D3A3 +:10E7C000BCEB953E24FC7EC44423E3C3C415927F76 +:10E7D0004B16DC4710DBE769FCFA757C9ED49F453D +:10E7E000BA90BFEA23C6EFD669E9E164F3AF5AA94C +:10E7F00017E9512345A407E568F1FCD4E0FCE7BE26 +:10E80000D0B6AE0FB42F95703FA5D2433B4F953E87 +:10E81000EA7E651ED7114FCB2E05F8A59DBF4ABFD6 +:10E82000B079ABF4D4CCBF4EB51F579361A06FEF56 +:10E83000EADC0F8C01F9F833A503C5EBB6D9D96929 +:10E84000A1F6F8416E97A6BA8FE7A73A806EECBBA7 +:10E85000C439E5BB5E49A5F3B9D9953512BE1FBED3 +:10E86000F52B831BE20B07CC9D68DF54F9FA84CBB0 +:10E870007B80C379BBB73D1FD79166C98E7A13D011 +:10E88000D82F7E7FCC730FD3AB03D23FD6F5198D33 +:10E890007485658014AAEB10F081FE776A0BE38320 +:10E8A00007F840FF3B8D741E023A57274BCE00F409 +:10E8B0006FDE752FC8CDAB66FA1CF4B75C72B2EF91 +:10E8C000CB882523F5B2F22947924F0C4EE404D7AA +:10E8D000C579D02F29DCEF98686C7D1BF09848F53E +:10E8E000610B09F74354BE0FA17F2E45BAF7D383BE +:10E8F0001C7FCCE5F355A0B705E8DA69007FC613A5 +:10E9000060EB87DAEE911DF9481F95DECD747D1816 +:10E91000CDE8AD8B40CF9BD53AA7A7A74552E0FDE8 +:10E92000C974FFDA4B82D3AD2F0FA9720CDFC36914 +:10E93000E901F1808C10BD07FB147A3E59DD7C148F +:10E94000E932652575AF42E80E76EB72F489A617B9 +:10E95000D5CD3F8C5E7CA2D18BBDE6CEBF8C80F83E +:10E96000D71E09ED03694914F6FBF166E6671C3012 +:10E97000BB517E3B5F53F0FEB9D68E7CCDE51EF6D3 +:10E9800017A1DFFD4D8289809DB39BC9472A1E03D5 +:10E99000981C85DAEF57CD6EE45734F8717C1D8EE4 +:10E9A000E63FA9F51B613CB88FE810C70BF32F7841 +:10E9B000FCA7A779A5F171BFEBBCBACF3349AB81F6 +:10E9C000B0F8FF0A63C8B9D46DFC5CA03B4E16ECEE +:10E9D00067375DA61FC45F0274DEAFEE7C0AE3BF3B +:10E9E000E79F393E0DE477D91FF5C444F9DCBED367 +:10E9F0004A02ECDE8501D6D98ADDFA88E72884D47C +:10EA0000B2EF1C7F6745FB52F1BCD15F4CDFAF78A2 +:10EA1000F1A3E110B76A5FC3EC8CEF192E1FBEB6ED +:10EA2000E170BE5E21B373612DBCEBB8BC9C7B2949 +:10EA3000BE14ECA4D4C8BE5FAD689AA51843F6E92D +:10EA400023CD0A8E4BFBE1BD65DF0E09E3E5E1F85E +:10EA5000AD66F07630FB57D1ACF8E13BD88AC62DD5 +:10EA6000B8BFF5347E6A00BF6ED2EF9E65DFD73641 +:10EA7000EBC5F861A33E60C438A7FEB87138D35B1C +:10EA800049884755A15E5637F13899267EB4EC7710 +:10EA90007B5EF451D22CFBFD6F6C606FCEB66EB70F +:10EAA000617CAE91C5DF648B1C393ED7535CAEE907 +:10EAB0003E1E979B7A9A0C0F8FCB9D85FF503D9CF5 +:10EAC0006FE6FAAAC6351B7BC5747EBEECD90B4F28 +:10EAD000C279D2B9E73F7912F0AFFCE6B327EF86EF +:10EAE0007389BD663BAC7F9E67DEC6F8BBFADEDD90 +:10EAF0005CCEDB77FCE6E927A81EB6BF67C47B5B6C +:10EB0000ED7B4E67C2F78CEDBBBE4C85F8E6CA3D87 +:10EB100005B89F59F9C2A4B4CBDD3F01F9F4C77021 +:10EB20007EA2E5C781DD7A02DF739E3F6644FFA3C4 +:10EB30003BCEDA54C5E2D70E1E5FDD19F9BC4A8D13 +:10EB40000756EFBEE5E6EB611DDCAD381DF89CC74E +:10EB5000077B8AABBE45F93A2206FEEDE4F1F3A647 +:10EB6000A911E3AAE7E13F944F9BCC625CF5C2EEAA +:10EB7000C5FFF604B4EDEE1535AE1A88816EEA795C +:10EB80005899D9B5CD0CFAF1FC6F318E0D7CA33EAE +:10EB900039697FF64226C423CE289D77E23DE53DC4 +:10EBA00046BC6754B1E75DD497F6178EE23913E19E +:10EBB000E751EDA4FB879D1BF0BD8E679B95C56358 +:10EBC00039FD215EEBB0E1731E976572ACC66BA395 +:10EBD000C569DF37B3FB50EAF95CD5B60F0C4413B7 +:10EBE000FF96C602BF8E0BE78AEABCB5F0EC408701 +:10EBF0006B43CF1FA2C5C3B95D0DE3173B7768DF39 +:10EC0000C2CF23BACF1908E93B12CEC7D9B9B9C7C9 +:10EC10002FBD1B89BFEAF9C3DB5AFDF4C776EED0DE +:10EC200033DEDF8D2EAF9AD9FE56A5CFB9AF23DBE9 +:10EC3000E94EAEEF749DE930E3B9315B67E6F175FB +:10EC4000A69AD28D7DF7C6F03DC7F781E79ED1FB2E +:10EC500061BFBCAEE900DA5BAD9E571316FFD28EE2 +:10EC600027C531FFA0BA79DF70B047E7F6BF84F25D +:10EC700057BDF3B8C147E11C6AFCBDA16D6850DE09 +:10EC8000C18EFB43ECF8B9E7F60D67E72291F3B4C8 +:10EC9000D8387C4F8B08DFB3F35301FE325F93C14A +:10ECA0006EE9799CB3B26B16CCF76CAB42E03EFBDD +:10ECB000D9267D913FC2B89FC13A362648A77556DE +:10ECC000F61D9F3EC9807EE64AEBD863F0FDF84A08 +:10ECD000ABC101FBEDDAD5EC5E65EDFF72A6035F1B +:10ECE0006A136FC373A37A0D1DEDC9F65CD887DB79 +:10ECF000F34B46835869ED41A24B27E0BDD25A94AD +:10ED0000E6B0405E2FE6A710D989DF19EA6D854588 +:10ED1000300FBD5D6737475C5F193CC5C2F266289E +:10ED200076F1BBBFEF900783403E8E6F9D07A353E4 +:10ED30009307A3FCC6FFD7F260F8609C9F401E8C2F +:10ED400000C677D43C18C93F721E0C882F8D0EC99F +:10ED500083D1A9C983C1F9F8CF3C18FFCC8301A5A1 +:10ED60009A07E39D0D650590A742CD83716683A741 +:10ED700000F252A87930BEDAB08AD5791E0CCBFDEC +:10ED8000AB0B42F36064DEBF01DBD53C18CEFB1F4A +:10ED90002908CD839177FFE682D03C1833EFDF5E00 +:10EDA000109A07A3ECFEE70A843C186BFF50007929 +:10EDB000305E8F77B7C6A544CF83D11CE788290F73 +:10EDC0000685F31EC2899207430B275A1E0C0AE7D9 +:10EDD00044DC98E87930C2F089920783C2F904E1F3 +:10EDE00044C98311864F943C1814CEE738AF287974 +:10EDF00030B470A2E5C1A070FE0BE144C983A185C7 +:10EE0000132D0F068563884F899E07230C9F287951 +:10EE100030289C048413250F46183E51F260503868 +:10EE2000E908274A1E0C2D9C687930289C2C8413F5 +:10EE3000250F86164EB43C1814CE55F163A2E7C1D7 +:10EE400008C3274A1E0C0A6714E213250F46183E12 +:10EE500051F260503813104E943C185A38D1F26079 +:10EE600050380538AF287930B470A2E5C1A070A63B +:10EE7000213E51F26084E113250F0685330BF189A1 +:10EE80009207230C9F287930281C37E213250F8620 +:10EE9000164EB43C1814CE528413250F86164EB469 +:10EEA0003C1814CE728413250F46183E51F2605060 +:10EEB0003877239C287930C2F0F9AE7930CC814183 +:10EEC000D240CC8381F938BBF360247FEB3C18BF80 +:10EED000027CFF9907E39F79307E8C3C18B75ADD9E +:10EEE0007F8FC77DE377CB8371265E9337A2873C04 +:10EEF00018B75A4BCE823C7FDB3C1817E2BF5D1E31 +:10EF00000C3ACE3F2E374EB43C183ACBB7CB8341A8 +:10EF1000C7912D632E339F287930122C62FE901FEB +:10EF20002B0FC6B1F8249C4FB43C183FB97C137426 +:10EF30009B05FBB4E9288AE427937F62B485C70D5B +:10EF40007FA8FC1330E99C9F52FE09358F41930244 +:10EF5000EBE1FB9CEFEF70B9F880E7A13816350FB5 +:10EF6000857F2AC677978A7928A6703ECE768BF25F +:10EF70003085B0739429F959FE5AD8AF976BF25087 +:10EF80000C11CFE98BDD47F3293832D529CEE328A0 +:10EF9000978769A59F1E04F6DC3C36721E8A199C71 +:10EFA0001FD3357499C2F9369D97B7C3A739549EBC +:10EFB0008BCB8FCA40D7698E3619E3F437A9FC731F +:10EFC00008FC9BC9E16AF19DC1F9376332E39F16E2 +:10EFD000EFB7807F14EFB7CA4721FFB4786BF1D445 +:10EFE000F29F84F23B247F482E11F34F4C3289F973 +:10EFF000270AEC62FE891BD3C5FC13931D62FE89B0 +:10F000009B8688F927A63AC5FC13378F15F34F4C1A +:10F0100077ADD6E4BFB84F93FFE2214DFE8B4D9AFA +:10F02000FC175B34F92F7668F25FECD2E4BF7849C5 +:10F0300093FF629F505F58F79AD07F71FD51A1BE38 +:10F04000A4E13DA1FF52FF71A17D59E3C7427B5569 +:10F05000D3A742DDD3FCA5D0BFA7FC036FF1EFA17E +:10F06000DFE1DF431FE3DF43BFDF43FE8B772C4B42 +:10F07000D785E6BF78DFE2590779098E5B1C3CAF84 +:10F0800040E4FC16DDED51F25F04DFFFF6F92F528C +:10F09000927FF87C043A2BFB1EB0B7254F674DF9E1 +:10F0A000EEF9086E2D11BFEB9E552A7ED7ADB3B297 +:10F0B000EFB567BBC5EFBB6F2F17BFEF1E11E7960C +:10F0C000000F6DFE8BDE1697CE0AF692E72908C078 +:10F0D00077BAD9106F2BC2F220E4BFC886785B29BB +:10F0E000968721FF052DFF0CF92F687904F25FD078 +:10F0F000F20DC87F910DF9337C3C7F461DCF9F51A7 +:10F10000CFF36734F0FC197E9E3FA391E7CF68E20E +:10F11000F9339A79FE8C00C239E13D8CE5496F2BB9 +:10F1200096A7BCC7B03CE36DC3F2ACF70C96E7BC46 +:10F130009D58B67B2F62196BFE0C552E3F04BFE124 +:10F140000A189FC9B32AA7573FF0C8BAD0FC1923A1 +:10F150001ED884721A2D6F460E7CD397123D6F46CF +:10F16000777B94BC19C1F7A3E7CD481BFDE3E5CD40 +:10F17000986BF961F266CCAD11F33ACC5B75F9BCD2 +:10F180001923E24A6E41F9E3F238D7125BDE0C9F95 +:10F1900055E2DFE553BA80DF45E982EB750F790769 +:10F1A0000E5A9F1E02FB89AE21575D36DF83562E15 +:10F1B000A2D39BE57798F323E7CBE889AE6AFFF704 +:10F1C0002B581E87B9966F992FA3877C0B07B3BF67 +:10F1D000403B196BBE8C9ED6879EE839E347CE979D +:10F1E000D1935DEDC99EBE3985D1B9770F7456BFF5 +:10F1F00097AE34B51EC297ED2E546D997F0F9F3B8D +:10F20000D38EF1998E9DFC5E9C8B38ECA9EC7B7DB6 +:10F21000F0373B9E4F184EF03B7E3B7151FEC4F3DE +:10F22000E7D2CE7DFBE05EC05A1B71252681B34735 +:10F230001CFA81B00FBBC604F19AAADD9FBEF1474C +:10F240000AD7DCA2C7FB721D148756F4FB5C89C089 +:10F25000B778F24BDCA7C319DDA55EA1DF756B7E25 +:10F260000F0774490D9E3F15E82DB86FEADACCEE12 +:10F27000B3EAC9D58F4F188DF7C689DF81FC433FAC +:10F280007519C7B38B106700FAEFB4E2FDD525AF4F +:10F290002D34C0A070DE1A1A37E85524C6811ACC66 +:10F2A000B6E1706F2F5DBDBFE773B5821FBE88C327 +:10F2B0004D2911E3449F2C283A0CFEF3227719DEE6 +:10F2C000AB482B15E346847F470FDB32F03365C232 +:10F2D000EF75FAD97DCFB0EFEA9BB7209E4BFD9A30 +:10F2E000FB4B8D625DA5DB392BBF9762219698E8B9 +:10F2F000D676C5E31392BF3DDD8CE922DDCC0E91BD +:10F300006EF14344BA68E966758A74D1D22D61AC56 +:10F31000185F53E9A6DEA7FCA1E89664E3F73C82F8 +:10F32000F42A31A5A2C9473C33E400CAB7561FFAF4 +:10F330005802F01B7E48BF64FF6A7CCB6995C16EA2 +:10F34000A533D0445AC4DE8B077D80FCBDC489FA46 +:10F35000A0FE3E8A78F22197FB8FC8255AAE987E90 +:10F36000F0F802DABA19E46D04FB3D1A18AF4A222C +:10F37000B89F5388D30EFBA826AFC9B94881734DF7 +:10F38000E25C940DE799762C1FE4DF3B770C25B8FF +:10F39000EF6F0A7C9E0AF7061E1CD9390DE20F9EFC +:10F3A000C5A404D6AF59096C7D5DC64B5B028BCFFB +:10F3B0006C28D111D768F87D4A7ABF44C76BB7BBB8 +:10F3C0005EBB01FCD116763F80D83BDFB81DDB4722 +:10F3D000E1F7E119BAFA6B001FDA1FBF2BEE68F9EB +:10F3E000C8B630C40EB7373F7225DC6BDDA48BFC8A +:10F3F0003D73818DFFFE1D7E3F654430DF42816D90 +:10F400000CE6657870001DA77A7A17F25195CBEB60 +:10F4100038FD0F964D41FC5E68911C10AF2BD4DF78 +:10F4200071D3308ADFB8B7657EAF97DD5F1FCDFB44 +:10F43000D79AA9FEA2FDAAFF1BFC9E95974ECA98DB +:10F440000F71744D19DE13FCA3ADF030F02BC7D54E +:10F45000340AE429BF2511CF713D1F12277E9AD5AA +:10F460002ADE07CCE1F7B673DA881F84E2DA63623A +:10F47000FBB836B17E9D66FF39DFC6F5D4465241F2 +:10F48000EE367EAD9760FDE8E824CE3514DF8E457C +:10F49000BD71FC8ECF09FA891D5FEB8B22DD8F5980 +:10F4A0006E63FCDB642068BF379559F0DEF9FEB26D +:10F4B0008AFEE05F7C7197BB7FA43865889F96C009 +:10F4C000BEBB772590B120876B2546EFFA8C92085A +:10F4D000EB962A77AA1CAAF2975116E78E740FF5BD +:10F4E000339B8472965736443280FCEC9530FCD5C1 +:10F4F000BE86E2759975DB47D6F4017C3CCD9FE171 +:10F500007D32538BE48A744FE7619B8DDD6F5CE342 +:10F510005B0DF7467E419508EC5486A13E2B127C8C +:10F520001FD9887EE95D36077BCFC4F320C9F51962 +:10F53000709FA2BD79D2E47514CF27A83EC07AB5DA +:10F54000497122DEBE2A42F09E2C8FD7F59D46B629 +:10F550006C08F17F37DB721B6D145EA38D7D6FD954 +:10F56000CBED94006FE77FFDC306F03B2E1A917F31 +:10F57000BDB9BFA9BE7780D3675C826B2BBC4FE05F +:10F58000979F51E3E374DB9C8B46415C9ED23BC466 +:10F590000E06F9E663F951DC04CF3F922C3A94430E +:10F5A000E27239ECC27D761FEA8DAA07242011C8C9 +:10F5B00053A0DA37A9450A58A9DC8F365902708F53 +:10F5C0002EA99CCE3B19F29A9818BC56F99C18D7D4 +:10F5D000A2F29803CE3DC1ABF3104805F8AADD5363 +:10F5E000EDE5DA44668FD63E24635ED4CD729B1976 +:10F5F000E2A9592E471EA4884C921D78AFA65F3908 +:10F6000071520C49FCC05F2776FB0154C9AFF94623 +:10F610003F2FD2775B176DCCDF1E97E0FE33D06BA8 +:10F62000F8E1CEFDE02E38CDA417BBFFC5ED04F701 +:10F630006B0AF97A37EE3F74EC7BD1C00D24F43BB2 +:10F640002AAD9DD86466EBFCB8EBD9BA37EEBC05A1 +:10F65000D7BD6E3B515688EBD4C8965107E09EC586 +:10F66000C80F997E126E1FECF40FD029E7B04F0F30 +:10F67000F4F9B67641CB6F123075D787EAE01C8675 +:10F68000EA5BC8FB67357664C5F441B5185EE6727F +:10F69000D4FF1EA7DE1D4247EDFBDD714AC9D4FD34 +:10F6A000DC3110ECC8113DDC0BE9C8A5F3A3F3DF96 +:10F6B000C8F525F173FF6498D7C6961BCD20DF6B84 +:10F6C0000379F662FA4EA2A9049997485C18CF19FB +:10F6D000493D32C88F518B4241FD41A58424A4C0CD +:10F6E0003DB42221DE432C493CFF4B00F9D22DA72B +:10F6F000548E43EFE5AAF2A99547557E6BE1A0052C +:10F70000CE0721624E4BBDD484878146B2D90EEB21 +:10F71000BBEA5FD6727FAED69CE9C7EF977C19E84B +:10F720001FADE4FE51ADA5D084E6605F32AEEB2B99 +:10F73000217E42E9B03285D979753E5AB9F45CD45C +:10F74000137FC83EC12377E27D44CF45033E5FA7C8 +:10F75000B807C0FC55FA5CC3E9A3A58794C0F79D20 +:10F760009C2E3DE39B63877BC1892617598FF8E662 +:10F77000E13DEEA6C04813ACBFF76AF08D01CF6B38 +:10F7800013C684E3295BA2E099CCF0BC8EB8FFD805 +:10F7900046E53767455D6D3CEA15792B3D275CAF43 +:10F7A000B47AA4EA8D1AE7BDB6B2FE005EBBED41A5 +:10F7B0006F3CF18C2E4EA504EF5739F7C4A31DD131 +:10F7C000EAD3E77CFE9E7846BF058A7B06CCCFA3B2 +:10F7D000EBCC043919EE20BD8A2992C39BF5A8E72A +:10F7E000A435B67BF8AA7FA5FA55DA7EAA5FA5DA1A +:10F7F00063F51EFCDA04F77C9003A999CA2DC5A70E +:10F80000D6CEF64B9B6DEE4580573CC53D0EF68D32 +:10F81000430259ECFB5F512FA2E941BC46CE9B024B +:10F8200032AE0B3EBA2E644BE178A8E30F4A48642F +:10F830007CA45A0EEB7DDF1CC206AB269837A7EFDF +:10F8400070E28675ABEF48769F714D02B3BFB50984 +:10F850006CDD52CBCDB692BB51BF65E2338EFCEE70 +:10F860007803AA70DF7C6D82EB2EA087A9C885F390 +:10F87000E863274EF04BFBC84D127C379A54E99051 +:10F88000D83D7312FC7E8BC2EB53ECC8057DED03B3 +:10F89000FB6BE8DF1239CFD8A309EAFD5EE67F3AB9 +:10F8A00049771EAF471398FF7908529FF42A56F301 +:10F8B00082A9E7394E09E8D46EBD0D916EBF2031A3 +:10F8C0003F3D91D14BBB4F00C287FEFEBD7B0D4437 +:10F8D000362791E0EF59D599D0BF8F27CE26B05764 +:10F8E000BB1206F0734C671DD47F25779A128706EA +:10F8F000E55D95E30727CC70422A52DBF55DC361D5 +:10F900004F45E57A27D0BF7D42D760CC41493A3395 +:10F9100099FCB8F442BE20950FCD8AC00733ECC3E2 +:10F9200043EDA4D53004FCD17629CE09F72CDA9723 +:10F930004A0C5FC9C4F329C9C23CD3E3997FDDC136 +:10F94000EDD53B09592827AA3DA6F3AB83523B0FBF +:10F950008F11EF7490CE3DF1FEAD706EA5C93FA939 +:10F96000CD4F3969A105EF7F6CDC63C6FD6B57098C +:10F970003BC7EF6A31A27D8EA6B7696DE688711C20 +:10F98000B5A4F47B0BE897A6D424823D4C9B7BD294 +:10F99000067CD7D2A543F25D7308F645AF2B11BFA5 +:10F9A000BB55CBF4F49B1217D1FEE91993B1549FC8 +:10F9B0003758E488F7CD4F73BD52E5F14A3A22DF5C +:10F9C0000F9D06793CEF7EF31D1709DEDF6F88631C +:10F9D000746C886374EC728F4F781AE4CD9781FA57 +:10F9E000B0583D07E5FB7F35CF943ADE46AF29514D +:10F9F000A62AD0B0608A19D68914E29A3C1B947565 +:10FA0000A342E03BA2C7BC3B12F3318E6D12EFF96B +:10FA1000DAD9BDE1CF3716E077DEA9648D7930A55C +:10FA2000475989CE09F183F30BDEB7E9A83C2DE8ED +:10FA3000D39A03F2FBBAE226F63118EAC2FDC99264 +:10FA400052833F40F996DC400D05A5CB7F03F9D4E6 +:10FA500012800080000000001F8B080000000000E2 +:10FA6000000BB57D0B7854D5B5F03E73CE3C929922 +:10FA70002433794E1EC009E19D108724BC1F4E9E81 +:10FA8000448830BC0485EA8028CF2488D6DFB6DEDF +:10FA9000CBC444F4A2B745E9AFF4D6DB7FB0A2A84B +:10FAA000200182069AA41340E4113408A8A8AD519D +:10FAB00029620BC908EAC5D67BFDD75A7B9FCCCCFF +:10FAC0004922D8DE4E3EBFED3E8FBDD75EEFB5F684 +:10FAD000DA872EC977134B64CCB7D8C0B64A8C7D71 +:10FAE00087BF1B43ADD96E602C89B196383BB54EAC +:10FAF000E70CC7D284F07E8563693E63D5D6D85CB7 +:10FB000016876D7F3F8B85F18A58EAD202685BAC1D +:10FB1000AE5A95B12546AFDD0ECF774EBA3CA48ED6 +:10FB2000E12FD8DF3392B12E236B94E2B01F606CCB +:10FB30000C4350F8CFED56EDD097F0FFE1FD448B2C +:10FB40002D20C3B8CCA35CECB0F047BE1B281E4DE3 +:10FB500066CC285E939ADEF846CA652C76721163ED +:10FB600070DFCA5C8FB22CB8318CA99E18C6A2D89F +:10FB700033F6F3D98C19F07D584757F3BBFD7C0061 +:10FB8000C71FFEE54A0C83FB1F29C118570E6317D8 +:10FB90001E3C15E3B6C1F507E5723FF46F4740C65A +:10FBA00087F0926F870BA3197BC4EE1981EBBA63C0 +:10FBB000DD7F8FF1DA42F7D903703195B1157E19E7 +:10FBC000E7E6F0C27FABB65919B384FA95F509118F +:10FBD0007DC018E1B5D2CCD6D4DB7AD26305D2038E +:10FBE000E65DB17D8B295DC5F9BD93ECD0BFA0C0AA +:10FBF000AB80EF0B0D317E5F66089E25DB4799D207 +:10FC0000E1D6474D6616807530A5DDC86C84B50A0F +:10FC100009F0E61578D3C379B8C54AE3DDF57F6509 +:10FC2000BF1996BA18E67A201E9E6F5A51C1727B90 +:10FC3000AEE3AE3FA8652940BCBBFE4D623E953F9A +:10FC4000FF601E3CFFC0235F20DDF4EB5CEC337EE5 +:10FC5000D211B16E376300CF3241EF3B1F8DBCBF75 +:10FC6000ACE9311A6729F39A909E776DD4DFBFE92A +:10FC700033E4BB654C095D073C5C3E9265453CDC6A +:10FC8000618F493C0F20038F8DFD0EDEDF7D6460A8 +:10FC90009C37A7277EB5F6E23AE06F33637F5E6755 +:10FCA000A1F6C23A46ED08BB4AF459DD74F27EE48F +:10FCB000AFAAC65D261CA7C5FFA78409F04861D37B +:10FCC000373232572173DF7B0EF0F92326B3EF0072 +:10FCD0007FBB19E79FF546CF3D48AF1BAF96D37D5D +:10FCE000FDFA1769FC7F249EF86711AE3B17AF2B16 +:10FCF0005FF6B6AE9FE2BA809FD95858977CFDEB6D +:10FD0000D2D6A3AD4FBB5F2903DFF5F2BEC6EF230A +:10FD1000843E58FADCACF569808ADAE6CFFA7710CF +:10FD20003FB1D328BF1A3F2D1374D2F38D46C76E4F +:10FD3000FE68FA775A9F463FE07FA7C1896DC06988 +:10FD400018D7934FF47CA1E7834E63477F945F3DC0 +:10FD50001F744A6C416FEBFA37FB405AD752D55D9E +:10FD60006687FB7731CF7A3BAD67235DBFA06C3CE4 +:10FD7000FC3394ABE7385F77EB3933973776DCE8C1 +:10FD800047BDB936464D71D804FD80CE9DBBCC3EF3 +:10FD90007C4E9BE7FC3AB77B9011F15E4EED9FD70E +:10FDA00079DC830687EEDFFDAB2BB12ABCDF358C17 +:10FDB00095A3DC77C644C2BBCF2E133CFB900EC884 +:10FDC0007F4AFBFF7C803AE9B9F631A847CF7FFB39 +:10FDD0005FB11E78BEEB5B73796FEB3C2DE807EAF1 +:10FDE000E5B413F8EC762167B73755125D963C33CE +:10FDF000CB84FCCC1EE0F8B4C01FEAD7B6A8D86705 +:10FE0000711D8B1B24D2237A7ADCE59AFA39EADB5E +:10FE10003BFD85F47E0FFAB0C789BE77213D86850C +:10FE2000E831D6A1727854F803BEB943F0CD7965B4 +:10FE30008DC9007AE4FC33806F007995C2DCBDE99E +:10FE4000C1FE0ECE877DAD47BF8EBEE05FF65CCDB6 +:10FE5000FA3486EB1F654AEB45EF68EBBF8BB9625E +:10FE600049EF88F5B28E1B495EAB2D7C5E6D9D2BF4 +:10FE70009AEE9C817C51B519E895D973DDA8771766 +:10FE8000F7026F997CD16881F7BA1E905CA86FFB6E +:10FE9000A283A627EE12F85AB96DF10C349A8B6141 +:10FEA0003E3913F5D1176FC624A25C415FFA1E7A62 +:10FEB00035C91F9B711D8CE37B09E07B8374FDF4C6 +:10FEC0005BB6B9D03D28ECB915FE9BDC83C2F59931 +:10FED0008EAE6CDBACD0F364B7DD26B4C7F10EA1F7 +:10FEE000BF845EEE5BBE60E100E7DA1D0EB26F6CB0 +:10FEF0008D83F46375D31653B8DDD5E44B93B7B156 +:10FF00000E3BF15955E313F41CE85FD501FD4A4B54 +:10FF1000C7CF6F55C3F0394ED051AE30A1FEEE4B76 +:10FF20007F82BEF9B2236C9D231CC2AE08FD7B2DDF +:10FF3000FDA0C1AD1F57D3071ADC1ADF6BEBD1F35D +:10FF40007D5FF0E9E9C2989FFB0B3AFAAC427A84F4 +:10FF5000F5115E05F0DBD66CF53F04F0B6491C7E6A +:10FF60005F7314C1DFE92C769F033FAF2A7521B57B +:10FF700027F0C554F4EB3CD3109F9A3FC70A1222D6 +:10FF8000FC247DABF93779C29FDA1BE5CE07130954 +:10FF90003F4F02F2C3949A8E391620D9AD8EEDE50B +:10FFA0000A8C3FE5898E3951D05FE8D8C1FB5B3BB5 +:10FFB0004E595C8CD5B057CA4BA07F3BA013C7BB32 +:10FFC000565B60F62C44F95D0D7E9205ECD1EAD3C8 +:10FFD000430EA1DCAD6EAF2897C0EEAC0683238143 +:10FFE0003DAA74C706ACB9D46713E0B9E7EDDE6586 +:10FFF000C42F57EBC86EAD3EAD70B9399248EB5780 +:020000022000DC +:1000000000F62878AF2E1AFC55C0575DBCC5559B2D +:1000100049D77D51F1D877AB6AD8758D1EF81EC2CD +:100020005167606E07B4AD4787C4757C8FDD6E5D28 +:10003000C72A14E08383EB2CD4EAEF179AEC83D021 +:10004000EE151A98B7377DF9A483FB8DC0E4E94813 +:10005000E7AA23269277FCA11F5829F451151028EE +:100060000EE0A93CCD02D1B1F85CD9E70AB60D1279 +:10007000FB24C25F61A1BEDC37DCD7DB56E17883AD +:10008000C3F984E3A948912A94B0794B6C51117D4E +:1000900039C5300CD7C3E468D756C0AF9C6E58B38F +:1000A0001BD62F0F8016F0A1D85DF2626837164F6D +:1000B0009197405B6BE476B5D6C09687E3E90581FE +:1000C0001FADFDC0E1D98A74BFF456FB182BE9AB14 +:1000D0000C3BC9B9586FADE40A50DCD4CA5C5BE193 +:1000E0005A9DEC619C8FEB19F2F11B621C97D9B001 +:1000F00047057E6D747C40FCEB8A33DC9B09FDC0B8 +:10010000131FF17EBAE14A26F0F781273ACA15900B +:100110000757B6E1CA40E81F7AE2637E7F220C09E6 +:1001200006EAF0139F94FB6C382ED7676CBB3B1B21 +:10013000E7510C12C9A972C0E4AF85FFAD8BE5FC95 +:1001400054073C82FCF786B0B3EB6B8A5EB602FFC5 +:100150002B456E750D8CE3C78069F4DFDF6A7894F8 +:10016000AD068A53B0457CBF29D6ADD18135B8B331 +:1001700067A15EA87767CF8E41BC7A4F225EF3DB22 +:10018000DAA7A03E6E78FBFD31E8AF22BD709CFC83 +:100190003688DD603D975EEBB7450E8B473F7014A8 +:1001A000BEE3003996DCDC9F94543B5B047257EB52 +:1001B00066AA09D695A28BEB1A18D72FCFDB3D7F05 +:1001C000C4F7584680EC4DA1C3FB31CEAF8F5759D1 +:1001D0007B7CAF7A59AFB74CB90FC8E8E7C4A737F3 +:1001E000BEB704F5FBEFCDAEC12AC2E5660F003CF9 +:1001F0003B0D4C61F1C426C394028C3FA35D1B50A0 +:10020000EE5DCCE90339C3308D80845FE298B0B8ED +:1002100055AC07DE2F61D08E45F86EA0F5C9C857E2 +:10022000A3984746FD3586F9ADD87635BFE644BC80 +:100230003D19C5EE40BFCFB28DB9FD61FA63403CB8 +:10024000F7F726251809EE6863FD6CE4D7E82F98C8 +:100250001DFDAAAEFF3429383E08C874BCEE3A6CC6 +:100260006008E70B46BF3D0EFAC1E18AFA2C0B8D00 +:10027000D725E8AD8DFBA4491DEE407D93C0FB2F33 +:100280001472FB1CFCDCE47F3613F16359E30F931B +:100290002F673CF75BBD4945F1F1D0D63747339C1A +:1002A0007F6C4BB401E9F0F2F6BC28E4879D881B13 +:1002B000587FBCD97E0F8E177F05E0CDA4EB6EC2B0 +:1002C000ABA28E8A03BC4E9866533700DE5F88AAC5 +:1002D0009F86FC1FDC6160CFC2143B4DAE59D8DF56 +:1002E0007959B5A3BE7D21B33E9AD6B3C340EBD9AD +:1002F000191D1CB116E0DE304C2947F8142B535061 +:100300000F2B8622F51EB83E349EDB574D2F2F88CB +:10031000E7F2F3A404F3E7E17385243FA5B28DE48B +:10032000AE2BC8FC669827696EBB8CF4889E05AC22 +:10033000847CAF046406FD491E46498D4936A35F9F +:10034000257DEBB62D06BA4F11FA76CA87AB2B780E +:10035000DCE33A3D11C63B6833325CD764D621A357 +:100360003F38F92A7305907FAEF278C60E7FE83FDA +:100370003DAFF3074BC578EEA0BD042F17B2483F41 +:10038000AE7473D9E712CDA32A68A78B2DBAFBE808 +:10039000E7C5621B193795C50BFFA63FEBFF1DE9AB +:1003A00037E05E98EF3E3B9FAF54CEF915AEAFAB52 +:1003B000DCE4423CECB2B9DF9D887AB1DDC8B6B26C +:1003C000BEE5E979883FFDE0730CBB6A65FE7CE21F +:1003D000471BAE67C4E68DBE2858F788417C7CE495 +:1003E0003BD42343FF333101F5F855A15FB456E305 +:1003F00033E4277B1CE727FB0D2139BC333E939E5A +:10040000D3E40AF90CC7D96FF42FF4F46227813FC3 +:10041000EF44FEDC656314473D966A598072A5CDB2 +:10042000F3BCE0637DBBBE666DAB11D7FD15D80391 +:1004300080BB24EDAA29DC9EEF49E27C552A7F4B44 +:10044000FE766793C4D0CF4F6EE2FA3B9C3F527B5F +:10045000E78F5F225EAFC51F5ABCB0FB87F2C79122 +:10046000BF8F3F365C933FBE8D453CDCD75C9CC262 +:10047000BEC7BF6914FCD0D7FDF156AEE7F4D75F15 +:100480001178DD67DA383D17F5C0CD0617CA395047 +:100490003F7D36AC635F347F8F296BB2B0BF4BE1D9 +:1004A0007A65579399F4CA2E9BD74B76DC6961E83D +:1004B0003F30C5DBF133D4876916754318FF2E8DA5 +:1004C000E7FC566F0C8CFF0CFDE2A39CCEE36ECED6 +:1004D000934DF05CEA522EE705174C5B300E2B4D26 +:1004E00028DC817C74027516B4D5E7E029407CD500 +:1004F0003913E9BBD75A4E96617E11FC1E37F2D9EB +:10050000D8FD27CB8A72F079AE4FF78A56EB8FC7AA +:1005100035C5B3EE78D723ECC678C6F59207F92433 +:1005200037D4676E23C56B1A3FD447033F805CCC3A +:1005300067AA3116869C73CEF330984336A73C9257 +:10054000CEF303D3283E9C7BBAFD55D0CC6C9E479E +:10055000775FF0C17C1D1F809D3D1E8FFED2F18014 +:10056000C980F399D664737F684D16F293264FF4D1 +:10057000033CD5FF61D8B31BC2EC7B6C0297A3C7C9 +:100580005D0ADDF77598FC83E1D2BF33FE5EBDB036 +:100590003F9FA33C63FC70DF2B0BD18EE62F771FB0 +:1005A00044FC4F4F92E9FA2F58C09285F47129E428 +:1005B00097D51BD5E2CFA4D0734CF10CB3C1FDFD90 +:1005C00049D1F9387F6982F722D28929C123F8DE1F +:1005D000D80979F9285FB6517509688F34B801AE2A +:1005E000F2ADB6101C1A5C67055F94262CBE88EB32 +:1005F000C7F750BF347E7CDE82EF6B74AF6FFE8234 +:10060000D33B8CFE48EF10FDA53BB0AFE1E12BA141 +:1006100057B4FE3F4A7F2D7F704DFA637E20F6EF80 +:10062000A2BF352129447FF0B3E2B1AFF7B3EA4D61 +:10063000E077E7F4BC5EE828A4E75D265821FA5588 +:100640002D1077A23C7A1DB42FB0C7CEE7EAFAC3CB +:10065000F9FEE022B2C109F184F76A537008FA2169 +:10066000A30212F985A340F01791FF95417ACF2597 +:10067000F0C4CE4BD2F961DC45FF2E1DFDC3400214 +:10068000FA51A3CC1501E4F7DDD629E9E8D7E559FD +:100690002765215FBD3AECBEE368825E4D5BBEE735 +:1006A0003935E4FF68FAEDA018569BBF2081EBA115 +:1006B0001B41DDA21F882E63381C9A3E47F2201C86 +:1006C0005260BEE13B2BE9E5A60EA0C78D0807E00E +:1006D000A155620DA8CF0B0DEEC462F4D392020AAD +:1006E000F7F7BEE98FF9C18AA637DE43782B703F52 +:1006F00004E35097F162773E62604F3F58F357B47E +:10070000B840F367B4F813FD1EBC3F405CB79B01D3 +:1007100040B447018BBF06E67FF2B23ADC2DE456C7 +:100720008175548875CC64ED0417FBF6BBEF260188 +:100730007D66087C541C81B83117EF337633E0E1D5 +:100740006685C79337BB207E0CE3A399E322FBF8B1 +:100750009B921C1AE75ACFEBEDC044DDFECC3FDA8A +:100760001E017BF409B8CEC7D6F1B874C240D9A730 +:10077000A0E11C9769407EAC16F60DC2E85EEDD292 +:100780004BC22F9E60E8C875017E5BF7FF8DECE0E1 +:1007900081FD7F7B07FDBCF19F2BCC0CEF4FF8BC9C +:1007A000200EF5041BA7125F69E356FFA9C1CAF822 +:1007B00075E2FF2AB1F6C3008F7B28C267A1F677E6 +:1007C000179FDC84E37D794EE1BC2DE62F3379075A +:1007D000611EBBCCC4F3018725EEFF68F70F1B0138 +:1007E0006EB8BE2941CB0BB493DDC79F398CCE3791 +:1007F000633E202F44D79B2F947FAEE4F6A40FFED8 +:10080000FE37F2015A1E60ABC01F3B78D6A4025CD3 +:10081000531BEE51D0BF9EEA94993B6CDE9B542B48 +:100820007387E5039E49D0F923075FDC3403EC4965 +:10083000759BEC8A42796DDA753C17FBEDB2CBDA29 +:100840000B1FE9F13BB5E91E05F9DF98A8927C5F23 +:100850006BFE0923804F6E40BA33F2EB3AC748244F +:10086000477AFA1ED8FFEB848E9CBEF1DD17FDF5AA +:1008700074F8DDC522DAEFB9163DF47CDB02EBF447 +:10088000C1FA02B04E1FF85D07D6D9A97F689D93C3 +:10089000FA1ABF5637FF3601FD368D4F4B1338DF3E +:1008A0008CDFB72981D942F4D2F0F5A1B0577BA3F0 +:1008B000347FC3356F065C3A05768718D4C7DA9D56 +:1008C0006342F66BFEE932F23734FB355F5E544A21 +:1008D0006A53D82F4C23A35ED3DBA9B9EA6223EB7A +:1008E000CD3E2D88EC97B76D5462A867203A4992A7 +:1008F000C087F0B33538CE300FC1A9A7A706971E21 +:100900001E6D7D9A7F3D5FD06FCEA04C23C2DFC3AA +:10091000AE8A75E2409887B85EBBFAB58E9FAF5C31 +:1009200028792BB717BEED8B7FF5F7357D508613F1 +:10093000E451EB43BFC298984C742BBB6A626EB013 +:100940001B2C238A7D1A665758C550E29F7B851D54 +:10095000EE8B7FAAAECACC9B1FE22363E31356E45F +:10096000A37DCA462BE62727DB66D5C6019E4AFE35 +:10097000543417FDBCEA0E03C3145669D31707316C +:10098000AEAF7E8FB9502F1635B51623DF1D52DA64 +:10099000658AB3BF64EC89307FB1B1A9D68AFE54B1 +:1009A00063A24C71FC6107E74BEDFE9644AE3F1A23 +:1009B000CF5D9EE1EEE5FE1971BFE4E33CE2A3B238 +:1009C0004741AE310E4D8AA1BC4489649F53817E5C +:1009D000C84D46F2F3218EF923EE035E6A34EFC26E +:1009E000D47E69E323F7D88110F5FFFD698D19F3F3 +:1009F0000BB324D7B3F05C991A6CC57ED9DC4CAA32 +:100A00007B18FB3F32F9B3C15B25CA8B9401BB60F5 +:100A1000BF6C51A61FF313FB25DEF735F37D02668D +:100A2000F725CC8079DEAE4818B581784AEB0FCE39 +:100A3000DBC0042387C557F7ED9549CFDC572AF96A +:100A400071BFA9D49ECE7C617C55F6A889D635BBF2 +:100A500029A508F9784EB9CCFC61FC1D107EE13C5B +:100A60000FC4E161EF1D8EE270051703DC52486E82 +:100A7000A7093E9FC5B89F387F4142C47BF0C62D71 +:100A8000688F6E6D8238157AD344FC7AAB373D623D +:100A90005E0FE37ECD09162C8983F1FB250D24FE24 +:100AA0009B11B48F0EA8A877CE24A25E63C3B89C16 +:100AB0006872572AAFAE237E70F27DB279124893E6 +:100AC0008CFA2F529E668E8BECCF72F7A8378890E7 +:100AD0007FBD5ED7E47E5EB34CFB72F30A2517EB55 +:100AE000453FE8FDECB1D17DE8856FD587E37AD34A +:100AF0000B1F96FF5D7AE135082BC681FCFE345151 +:100B0000E8877EAC1FEA875279FB26E4972EB07700 +:100B1000E65EF845B3175A3C5E06F24AF27E91EF64 +:100B200067945E4D65BEFC503CDEAD2FC09F70F5F6 +:100B3000E2E73C9D984572D4AD5F34FD11E64F1855 +:100B4000C7FCE3FE4429F891A63C842F83E02B6385 +:100B50003C1F588685439897737E41F9966A88F3BF +:100B600029DE67BF25B850CF49F12139D0FB195A8A +:100B70005ED72AF2087ABEE8CEF3CD35521D8CC678 +:100B80001765762E1F657365CABBEBF9449B4FCF83 +:100B90001F015D5EE69AFC21E4EC87F24773A2D860 +:100BA000571DC4065D0F5F68FCA0F187DE8E1CD365 +:100BB000E567FAB2236FA21D19DDB71D797D989103 +:100BC000F4B5DE7E68F6E277495C2F6724F27D8E0D +:100BD00069C3E7D9D0EFB026F13A0DCD0E75E7978E +:100BE00036737E78BD638922A13D41BD9019867F11 +:100BF000916FD5F8AFEA5189F28D15422F7536F312 +:100C0000FC5B7589ECB7C0FF16373DB189F78D9451 +:100C10009F2B545A150B8C3BD325B930AFE316F9F3 +:100C2000BA196E89E7EB5C91FBF42D3AFACE117C90 +:100C3000349305EBD01FD7EBA53957B95FA0D74F39 +:100C400073C4BEFB1CDDBEFB554DDE07B001FF4C7F +:100C50007FC09CF4FDFE80F6BE46478D7E2AEEC521 +:100C6000A11C1DFCC6A4C670FF19E937F5AA42E312 +:100C7000D893045F0A7FE6CB8B79BFA0984F3C5F87 +:100C8000DDF485C93BB26FF8AFE5B7C6A29F3E3A27 +:100C9000E4B76BF34E53184B47C74C674F6689EB6D +:100CA0003FD47E0CD7AD43A383A6477BE059E8D958 +:100CB000BEE8742D3DABE9B37FB69ED5C6D7EC80B8 +:100CC00036AF5EFFF615B769FA74FD1603E54B26DD +:100CD0008BF878B2C8C3CE4FE2F1C1AD493CEEEC1F +:100CE000FACA62407BB9B385FB272EB3FD38FA05FB +:100CF000A17C1FA7E7C331CC87FBEC4C69B7D0BE02 +:100D000067119012F73DD3F8BEE77625E0213DED5F +:100D100052580DC8C9397C0FE679F8806F21EAE98D +:100D2000873F1962A0FD7725D08EFEC9D83C85F695 +:100D30008F1C6695F2C19DCD663BBED7B5EFFFB463 +:100D40001A719CAF980B43B843CDE6EEFD1BD40758 +:100D5000A5729B8CF9FBAE20C8083C3F6941A018E6 +:100D6000E3A0C9ACBD16E57B02D2B117FAFD2A4952 +:100D70008BB37BCFEF1737733FAE3846263F6E8A73 +:100D8000AFBD18F7ADA62892AB169FD5E5F75FD19A +:100D9000C51FA1FCBEAAF0FA435DFEBE91EB99EB24 +:100DA000CDEB4F40DD067CBC5EE373A16F581FF9AD +:100DB000FD9D26BEEF133C6964E807B30B89BDE6D1 +:100DC00063AE95E7DFD712ED5663719F8EFBEBFBA9 +:100DD0005AD2DC6A6EDFCFE776048BD03CEEDC3E85 +:100DE0005BA1FA35911FEDB17FD2C7FE88BBD17EE2 +:100DF00008D5695FFB21C55FAA94F6B95EBC697529 +:100E00000B4CD43FDDC8B49F9BE474E7F96837F21C +:100E1000F9CEF3696E84EB79C1A71ADFEF3B77391E +:100E20009AF6414D6E15F78F830E8BEB59E25BCE30 +:100E3000EFF5A943FCB84FFB1B21173BA383C7B2B7 +:100E400013C3F73DF83E47CBBA47679F33D27EB90D +:100E500084F9486D7FD9077243753DF18CE20F2309 +:100E6000AB67386FAD9BFD1ADB2993D438C4FBE523 +:100E7000446D1F538DA33CC4B757A8CE508FFFDDE0 +:100E8000EB9807EB511AD6593C0AC8FFABEBECD4F0 +:100E90006F5CE7A476FF3A95DA878EC73E8076BF0F +:100EA000DA6DF22861FAE39D64EE77E5657F524CD6 +:100EB000C5DF7F6354873EE5C10E19F5C58D5761C7 +:100EC0001D117527CA65C437E537B342FD4C6971FA +:100ED0000CF66FBC0AFDB0E7AF2439B83DAA53EA5F +:100EE000462793B4105FFC2DC9DD9104D7EF7178CC +:100EF0003EC176B734FFE02546FD73BC7FAB7C096D +:100F00009ECB0F14525E391FF3CA7934EC42C4DF12 +:100F1000E85613ED976BF9DD3C4DFEBE8ECC33E702 +:100F20008BBCEEABAC83F2CD051608B40C0817A74A +:100F30009F5B9AE794301F98647261BDC3E82C4FA1 +:100F40003EE6635B9318C547ADADC9196A0E720FD3 +:100F5000CFFBBAB5BC2FFBFEBCEF918F627DA4B76F +:100F6000AE9A687FFAC8A9585780F60B2DE4FF693E +:100F7000F5C82DD1BCCE80652CA03CD38DA29ED1CE +:100F800062F69A93495F050E9E80F77E7F99F17D08 +:100F9000C7F60F695FBBD8303C05EB7E0F4A43E3D1 +:100FA000B07DEAA3D81C6A4FC55E44FCB418AC2AD5 +:100FB000CE7B669D5A82756D27D6B112AC637B6B72 +:100FC0009D85DA93EBECD49E5AE7A4F675B88EFCB7 +:100FD000731C9E477E71BF65A37D92296FD9146CE7 +:100FE000F316C650BBFBB61813C2DB12CBB66BF3BD +:100FF00060BD5A203AD080C9FED6A7BC8F59FA816D +:10100000DD337B474AA3186B7BCA3B5D990CE34EEB +:10101000EDFF93AFE0FE9BC9CB1EB3005C734FD9CD +:101020001ADAA0FF76F2F2C76CA86F8F4783D2C39B +:10103000F5AE38EE1E047443A590C605978D837EE9 +:1010400082D65F31BD641263B71477643360ADEC50 +:10105000E495D32D80C75BACDE1F63DFE44B9A5E63 +:10106000D20FFBCC87F56041C948713FCB9012B1DC +:10107000FE65A6C3FB467258FD9E5BFA13ED338DE9 +:10108000714BCC41871F8CB4EFC5EC1F2784CBDBA1 +:101090004C47E91B488F89C9BC0E78F424C91D5EF2 +:1010A0005FA17F6EF439B504E934E642591DB633C9 +:1010B000CB1DD4F72C185B87F25C62EBEBFD627AF8 +:1010C000BF3C99D78D142952445D89FEB97C6026B6 +:1010D000F48F8347A3294F30FAB4B716EB4F4B9DDB +:1010E0009979B2A6FAA8EFD882FB6DA32BCE9424EF +:1010F000A0FCD824179A8931ACA32E01EE17DAB1DF +:10110000A00AD7F54431D6FF8C562517A2ADD0DD05 +:10111000DA80EF17BA625C85E88F9F564BD0F49C5B +:1011200052469D2880E7A60E925D1618E854E0A668 +:101130008997A05F382C8EF2BC85CA9A2B27A81FEE +:10114000E3AA51711D5B7E5D45E398C9AEEF9E51E8 +:10115000FC2FC83F459E38CA09023E4AC2EBCA600E +:10116000DD0477A15DF64749C8DFFF5A6287FEEECE +:10117000FE1296CBC37CC3FF42F78F44AB5100E80D +:101180006E93BD04C7DB6D92EC0F51DF538CCFFB28 +:10119000861855CC1F952546458C3FB5441A7F0EC1 +:1011A000E1CF891B85D7CA331C11F7DB6EB3929D43 +:1011B000A8782B87FCA2B6DBD2C95E54BC35A9083F +:1011C000DB3603F7D32BDEAA28A7FB061E07572C16 +:1011D000FC915BF429EEAD585849FD5629E52738B6 +:1011E000DF959CB83CCCAF4D1B945AA244F88103C8 +:1011F00049FEF3447EAFD0307CD32480FFDEA37C55 +:101200009FA2222733E2F91905524978FDA86752B7 +:1012100054447F7689A324BC0E756E456A44FF96BC +:10122000B99911FD92A30564BF410F5494801E38F3 +:101230000AED5260C1025107A5E59F0A054B15B69C +:101240008BBCACC2E3EB61F0877AB0C41669A777B8 +:1012500047733B5FCED6D00649F911BEBF5D966895 +:10126000FC24DC4E94CB15365E97158987BCA346CB +:10127000B2977931921FE3FA92A34BEBD0F49667C1 +:1012800044BEAFF961E5023E6D5EE673B7A33FA2CF +:10129000C1ADCDAFC15F2E2F2AA17CF735D6A18776 +:1012A00097C17A503FE8E1684A16FE1AF81FE4AF8A +:1012B000897324F04BECCD7E6BFE7A05E82B47B8A2 +:1012C000BEB2498958B7D797BED2C6EDCB2FD3C689 +:1012D0009DE9F0D0FBEE1D9F9E9A2087F5333F4E8F +:1012E000880FEFBFF8E9A688FB491FCF7184F7B7D5 +:1012F0007E3A07EF4F51D45A1BF0E53126B97CC82E +:10130000076DAA1203F4283EEDAEC3B6F4432F9640 +:10131000ABB2A9E77C75D84EBCE86F33C3BA6E1A7E +:1013200026AB18BF6B7E881EDEBF26F3BCC3B1ABF5 +:10133000AA15F75977FB542BFAF3BB1F54ADE88776 +:10134000EC76F37319EE2C039D8F7167F37AC5BFAA +:1013500024F3BA834EF1BED6FA8DDE4E841BEBCC5D +:10136000D137A8FA264875E5C7D0BFCAE9E95F1D9D +:1013700053FC369CEFD8837E5BF87EE2F5FA577F0C +:10138000041E43380A99E409D723C596284FB8DCD0 +:1013900096DA1D11FD93C20F99EA4C8D78EF263530 +:1013A00033E239F01B87A15F526B62546FEB33F06D +:1013B0007A5B3D1E57A4F0F8CE65B3A33B83FB6672 +:1013C000726FE7915CC5865ECFB7A5A4707FF03FD2 +:1013D0005218C1352B85C3A7AFAFD5F76BF17C0F82 +:1013E000E293B99CC8E72EABE10AB8BCACE0E927B0 +:1013F000A6535D6DBEE1DE2CE8573CBD753AAFAB40 +:1014000035ECC13ADB194F3FCFEFDF60C837823F81 +:10141000B0CDF7C274AC2BAF8AE2F5095551A23EAC +:10142000B46E7444DCA3183E7E6A21C69FFB8D0C0B +:10143000F3FC8F99C00EE685F6D9AD661EAF5A4D06 +:10144000BC0E7C7DE6A9F5A83F3E8BF2E6A5509E3A +:10145000B148453C5EB45BA83EF4BE7DA529C807F3 +:10146000B35278DE2B7BCF44279D2FFBE7C151FC85 +:101470007D7060FD308E73717736F9E5D903189D64 +:1014800027D1E801E1335D8F82F081CE6330B7135D +:10149000F36FB50E138D332B85F3E3F5B63DEA8973 +:1014A000E30C6B7641BB2085C7CDB7E2BC046FB0BF +:1014B000FF2CDCD0B307FBCF1EC9FB486F59CE0B06 +:1014C000A27F1BFC510CEDC3BC1FCDF1C63282B410 +:1014D0006FF3EEA26CD706BACEF1B8C03FB0B643F8 +:1014E000C5FA0F7F3FACB718E8F42E457CDC66F6F2 +:1014F0000F26BEB2AD89C179AEB7DEB8EFF921E0F3 +:10150000047B327F3CA797363FE0D882747C579C9F +:101510003BD1E001387E8C70687075C3A3AB3FEFA0 +:10152000147E7B278E971BCA5357FFC940798A6A5E +:1015300009F424F4F77CC85C3E95E8437950DCD28A +:10154000C2F9C69F58526C83B6A071158F8FDB9578 +:1015500088BC9866CF268AE7C7BEA744D8A389224D +:10156000FE1DAFCB4F4E6C9C4EE7F826EAE2E25FE1 +:10157000A488BC651A4B0BCF23AC15F1C6E5B68128 +:1015800071E89F2A10E7CA806F932AB371F121BDD9 +:10159000D0B08E459C53D4F870E469FB9D38DFC809 +:1015A000D3EC0EF207B471BBF3131C2F97DFE37873 +:1015B00019D531ECE949D0371E3132BF1A5AE70448 +:1015C0000E2A833087E2A4CB176C645FC61C9D4350 +:1015D000F5DE66A781A961EB8F52A3991AA62FADFC +:1015E000C3E223FAB2A04F5D54A41F902FE6897185 +:1015F000A5458CB73FBEEC08FA05F9B6E5E417C47B +:101600008D1B18311E6B5322FC833CE67163DCE8B2 +:1016100002FAE27ED998D34A841F302EB091CEA12F +:101620008EFB30F2FA847391FD037DD1A52FFCB1BE +:10163000DCA7D12FFCA1F873B823F197501E89BF06 +:10164000244F24FE521644E227D51B898FF4E5234C +:1016500022EEF75B9317D11FF0C08488E733C18077 +:1016600085F7B31E9D16F1FCE08DB323FA4337DFF7 +:1016700016F1FC70FF9288FBD9DB56FE207A8FAC06 +:101680005F1BF1BC9EDE3734FE34627C8DDE3EF89B +:10169000FBDFA437730AFF50D03B51D859879BD743 +:1016A000AD75196D8FE2797C3C3682FACE81E7E91F +:1016B00063D1FEAB5497E79BC6685FFB97B2474286 +:1016C000BD940EA8356451BD3CD5F5FDDC6088D8CD +:1016D00067B73BB93F6477723DFE6B133F2F950EA2 +:1016E000FE26D929030BC5D916AC77648299AC8F35 +:1016F000639C5DE7E818A63A306F07FDC921BDAAD3 +:10170000E9D1DBCC6A6D07E8975132D793A03FFB54 +:1017100039619EF7A5078DDCFFF019D1FF48B7307E +:101720005F6C1ED919CA433B58A284E700E2427A93 +:101730005CFD0E88757065369DC37A134140BF59B4 +:1017400075D17ED3AD9A9E5A3E9CF4D4655BA4FFBE +:10175000767969165D3F7BBB99EA07CE8A3A470DD9 +:101760000FFAF3D6DA396CEDFEF22D9B62D0EF3C26 +:101770002BCEFF6AD7270BFC4D76CAC2FE59D66026 +:101780003E6C1118F138C07BE5918ED8DB18F99BBF +:101790009370DD555BAEDCFE2AF4AB0DC1646E3791 +:1017A0007CF4DEFC77F9B9EEF97F8BFCAE408593D3 +:1017B000C7F91562FC5BA0B1039E6E013A38B07D9B +:1017C000635219F2275CA7F371338F3023CAF32CCD +:1017D0006F26D54D9C62AE337B01C4F94E95E09CDB +:1017E000CB3C46CC5BBD737B650C3ED73D9E360E35 +:1017F000300CFA25EF3A7CC664CC1B4CE6751330EE +:101800009F05AF7B16A53F8C76499BEF1DE6BD7407 +:1018100006E83B9BB9685C6D7C86E9F9303DB57B99 +:10182000F9AA8F1260BEB5470D948F58DB6CA6786D +:10183000AD6BE57FED780AEEDF91DED10FEDF6FBC3 +:101840002BFF3604F9E1D6CD325381DEAADD7BA72A +:10185000336C5FE5ECD22B31781FECEED6A7D05875 +:10186000BE6CA63AE2F757BE3C24DC8FAD74162E50 +:10187000C7F7D8B8EB3BEF58FCD2F014AAF712FC2C +:10188000B442F0D3DA178792BFB536A69B9F787F14 +:101890002BAF1BD1D67146F0E3CA97BE89F8CEC4F0 +:1018A0006EE023D5CCF7C5D4A160EFDB2EE7D2776D +:1018B0001F8CDE7F75C2BC2D573F89C5FE9E37FF4A +:1018C0004AF0B3B9D7072FCAA26F4C687F5A3BEFD3 +:1018D000B9A029211FE90E72B601C7BFED772F5EAF +:1018E000FA00F1D3FCF2D69FE133D779FE739796D5 +:1018F0007714F6C625F001F686E28B2E16CDCF932F +:1019000008FF46C11DF92CFA9E874A7CED66C77117 +:101910001FA7B6D5407526B1B8091496AF8B950DA3 +:101920009A51725B9CA0AF859EF97FCEDB2AEAA814 +:101930003E20D21F2A38B432C20FF2C05FAF7ED031 +:1019400033DE5ACC2FE9FDA1F101C36253DCF7F875 +:101950004587A6F5EA174140ED96C688AD21F835D2 +:10196000E8F4F37E2157F53816E6FF03D1FCFC338B +:10197000980EF47B7F9ACAF5B72D83F1F36952E78D +:10198000300BE8CB16E7A2C71F856B96417CDDD8EC +:10199000AFA53335F9C47FDD7ED7A111A4B7D8B781 +:1019A000301BE243E43DF4742BC0F3ECF961722781 +:1019B000DE0F1CFE6B2CE67D77C4AB6F213D8247AA +:1019C00065DAFF89523A4C8E5EE2BB57510F029F97 +:1019D000CAA9DC1E581A797ED1A2BA19C60F51764F +:1019E000FBA8F0737F8D4E1E4F561E7EBFBF09E8C9 +:1019F00071C9D0169B03E3AFDEBB3B16DDFF0C9332 +:101A0000F703E4C35567DF1E63A7FCCD96FE180FEE +:101A1000D607F87730462ACCA7E4F584A37A332C8E +:101A20002601CFE927503BB2297F19F2597580AFC3 +:101A300013C7C642BEE18D12F53B1B6BE371BCEAD6 +:101A4000DF37A7A13CBD9CC4E3CD97AE66F3F71585 +:101A5000A6E0F341A74310D36FC0F8E46511D77433 +:101A60005E95E9396DFE918D85B21DF82127B0F1A3 +:101A700000C5514D6615E91AF51CE378688A22B94C +:101A8000AF6E99CAD0EE7739984B82FB3BA2837F29 +:101A9000A4F36ECD6615F3AD51F68D2C1EC6DF2175 +:101AA000F659870347E17929EDBA365F54D3D31845 +:101AB00073203F50DE374AD9C826DBC2F11C437879 +:101AC00076A4723EDA111D30609E253898B1670900 +:101AD000AE109C8CE6D5E01CEEC7F3843B4CC1F302 +:101AE000786E06E0B223FD87330E276B1AAA629E3A +:101AF00020CAEEA67544D955974FEA0957752EF3BB +:101B0000A35DFFF943AC5B6E518EABA3437D0BC865 +:101B1000C08E814CC8F9CF1F2FC908EF83621917F7 +:101B20007A7FC8AF363E5E3789E2099F8CF12FB4C9 +:101B300031F1B84E95D6A7608A298FE301F7DBAD66 +:101B4000167EBFFB79E06F1BF66DFC39579CDD3AC2 +:101B50004D2239E1F5B8421FDC2705CEDF08A4FD90 +:101B60002A702057055856BFB19FF87495A1E9A96E +:101B70009170FFEE28AF2B15E67BED43039D6BFDC7 +:101B8000F38B51FE0AC0C7B07D5B92DDBDC8877E76 +:101B9000FC47DE7BE8C974A4FF3E49C53C6C973125 +:101BA00048DF37A96AFACC44F50D8D1F53DDD39B6E +:101BB000A9DE4938CFB8C61ADA8F1ECF36D27E7466 +:101BC000B6380F5EEFE4FAE3F2E921CFD684E17F85 +:101BD000492A972F16F40E40B96912F2D9827E0A6B +:101BE000B47B85BFB4B7F5D62C352C7F58C30EA473 +:101BF00023BE1F6287A8D5AE77F9F9B9CAEC772C56 +:101C000077B8C3F86F9190F745A9224F96EA9D8D5A +:101C1000F0AE6AFDC414ABE23999FAFE6857EAC126 +:101C20009FB2F782976EB9D5C951B51234E1F3D599 +:101C300017F8F957A0731D9E3778F99DC6118BE1EF +:101C4000FA5EC035D695FACE9AA9BE72AFD1938E00 +:101C5000CFD79CF93A17F556090201F07CDDBC6A32 +:101C600000E20DF8BE281AE56B17233DA6C9670EE2 +:101C7000CA27BC9F837C5F80FDE1A4877798DAF94F +:101C8000F9D3BDFCFC29F03DC901F0BD1DFD861C4A +:101C90003BC801BD3F94E47B47BB81CEC9FA408F6E +:101CA0000FA67ED11CECEF682FB1937C635E3F0FD3 +:101CB000E5347080C6A987D8044927314FB83FD989 +:101CC000E88C25BA69FAF1B093093BA1C6E1790322 +:101CD000AB2C47C845983DE47D612F4FFC2AF0F8B6 +:101CE0002FD176B8855D10FE14F3E6939EBF57D8CA +:101CF000AAB5AF4F98B91DD6B9F684DC5D3F8EFE0C +:101D00006B40F0C901E1CFA29D5013783D0E5E1FDC +:101D1000BD99D7D58E71AF29C6B3CFE3CA371EC4DC +:101D20007682A7BE18CF3E4F5AD07E909F81E6E7BD +:101D3000D91B0EDC948DFBDE5D67CD0CF75D1AFEC2 +:101D40001AFCE34B8087FB5B00FFBDD825580EF1E2 +:101D50001F58EC74E6EC79BF4BD2F4C7A90AE4C76C +:101D6000CE0639D40740AA80C1B1FFDBD4938FFBE4 +:101D7000A09F95E67E3E15FDED742FB55D27FF9A79 +:101D80008CB660EF69EE473598DCD9C83F0D032368 +:101D9000BF1FA0B54FA61A890E057D7CBFEB482A50 +:101DA000CF6F0EF1B1C7908FAA1A64BB1FE87EA94E +:101DB00041769BC01F3AEFF626E3D99C0BCC77CB3C +:101DC00044B4F3228ED4BEF77217FA2960A7EEFE50 +:101DD00065EFFB0FAB99F65B6340BE5AD624B1FFAB +:101DE000001C2C7F26F2F9D5DAF76A1AB71CC6EF69 +:101DF00088AD7C4E771FFD15FA0E46A41F7324553F +:101E0000F827592C0BFD13E023D20F46851D310313 +:101E1000DFAE48F7EE437BFCB2F8BE02E85192C752 +:101E20007D4E615744FD417007AF2B1EBECD2F1B69 +:101E3000E0FD098A5F467BC5A0C57D87716E6F197D +:101E40007D87C9E73E8DFB3ECB853E5CAEF9697E62 +:101E5000BE3F026637C24FAB16AB1FCFFCB5B1B861 +:101E6000FE6D12C5CBABB645EEA7548BF5AFDE7C4D +:101E7000F2309ABCCA7ADD7DB1FE6ADDFAB57DF337 +:101E8000CF5323EBBFAE773FE42F46EE37BC2DC6D2 +:101E9000D1EE9BD2B87EAC826520DD56FB65BF9F3C +:101EA000FB7936FC5ED09D625D770AFAD33AE1B9E0 +:101EB000CA6D923F803CFE78649DE95DF58BCB90C6 +:101EC000AE7A3E5929D6BD7CBB91FC55FCFE0FCAAB +:101ED0009D9E3F568AF5AFD4ADBFCA2BE9E0E37EA5 +:101EE000744FF8EA6F413A576E37B2DEE0D3E8B587 +:101EF00052E3EB3EE0D5E0D4E0FEA1F0F64F13F95B +:101F0000AD116C04D1A93CE1BAE8A4F773771D1EAA +:101F100041DF5BBB7C6420C5FB1A1FE8DF2F137E0B +:101F2000F2D4CDDC6FBCD4586C1D89F14C9BC1251B +:101F3000A9149FC58E04BCE437CBAC02FA5D4D59A1 +:101F40009BF0FB8379270AE660FC9F7FC240E7EFA6 +:101F5000F61C29A07DE7FCA38312B228CFEDA2EFE7 +:101F6000E3C038645FBBDAF236E1F984AEB69202C0 +:101F70001C5782E7D00FC81376A2A62DCF1A7EFE7B +:101F80007C4C1A8FEFD73B3FFD39FAE9537719E9BB +:101F90009CC55463F04DACDBDA7344A17DF2D527C8 +:101FA000963C1485F47D51A27DF2C3ED6B1317228C +:101FB0009F3519EDB8EFDDD5F4E30378DFB75DA207 +:101FC000EF5E54379766EF807EDE967C57F8F9B364 +:101FD0003C874AF0B1542BC5CF53FB19C96E5E4CF8 +:101FE000B3FE16FD9F95EE2D24DF17F7EF3151DD7F +:101FF000DE0E89A1293BEC3CF80AE2E3E2AB274D77 +:10200000E88417379C34757C8F3F70C92FB300C5A7 +:10201000CD1B4D18C7546ED1FA1D26A49347F8471F +:1020200055CF7D4CFD95E8CFC37C2B9F91A97EF7C2 +:1020300060F36B26E4E7AAED124BC90CBBBF598ACB +:10204000F85EC312C6F96089D03FAB987F7D1A3C19 +:10205000B76A23AF5B608F46D6016BFCBD42F0F7D9 +:10206000AAEDB3E8FB533DBE5B8871E30DF81CE7B6 +:10207000EF659B23EFAF107CBD42C7D73F4913FAF2 +:1020800067381B8E7CFD75A11A9703D7BF3EB972C6 +:10209000406FE7ECDB84BDD6ECE5E58081EC8DFE9E +:1020A000B9CEC62B046775DB6513FAA7654D5F10C3 +:1020B000FE2B9A5AA97EE466E65D8DF8BAB9C96A24 +:1020C00047B9AEE8E07A685A93D9EF97F07E3DD5EC +:1020D0003977B5F0BA49DF7E89FC1C4D8F69DF770F +:1020E0005C26F0B80C14787A1EFABB3C6EAE127106 +:1020F000F28A615B0EE33E7B95B8BFFAE8C158F403 +:102100000FA7B12F6E47FAC07C0CE763CF44E27D86 +:10211000BAD08BD3B773BDA8B76B5DA9D933298F5C +:1021200009712AC2B57A7B24BEAB74F1F963693CAC +:102130003FF6820EDF154166CD413854D9E5A7A799 +:10214000DB159CF7482ED85BB4936AD6F77E87F1EF +:102150004DE1676BFD99E21C78BD7DA32D3C6E8E31 +:102160004AE7FEC2CAF1B20FE9D51D6F0C3A98AB2F +:102170001A42F106C419CD69493CEEC08292373249 +:10218000649698188A371E716EAAC8837EF5762EDB +:10219000F79DE3603C3C7FAD30F247ABB79BE99CD9 +:1021A0006235D09FE28A267E9EC2D3249522DDC16D +:1021B0005F3F9A86FBB198528575CF6AE47C3FAB4E +:1021C000E40BE297A383F87A2F2B6A4A6FFEBBE6F3 +:1021D000B7E3F93035CC7FAF0239C5E7AB9A783D2C +:1021E00052C3816FFA67A29E6BFEAFFE8BA1FD5AB0 +:1021F000D845CD2F0C825F3890FB45F4BDC9BB8517 +:102200007C2DB3F37DBABB85FD61521DF17995B18B +:10221000FE503CFA593B78BD00DB871F8503FDF873 +:10222000F64B75F1B0EECE9724AA87C3F7F17B94F5 +:102230009D4BEA3F41BFFBEB1D16F237EF06BF6532 +:102240004A5E4FB9D4E45BFB6E560D7B88FCCF87AA +:10225000581DB595829F3B1B6BE9FBA09ABF42EFCF +:102260000FECE98F540ABEAFD4F15F547A24DFD566 +:10227000BC1D4D7E63D751D98EFB3180AFDFA48565 +:10228000E345F8210D07A288AE5D276D6447FE2C5B +:10229000F8EDA2C83FD78C93090F86F1BCCD6E79BB +:1022A0006D20D211F18EF5F72FB7BC36829FFBF669 +:1022B00013FE576D9323BE0F5B591FF9FDD79AB7D5 +:1022C0006FA3EF0855EFEF866B88293104575F72D3 +:1022D00020493C8E3448917164F53ED9135E7706EF +:1022E000EBB903F551BA9007A6049331FF35009D71 +:1022F0000680AFA689D3D5D0CC5B98FF169E273138 +:10230000D2FC3DEE17F956E3FDAF33AD7CFFFAAAE0 +:10231000AF02FBF70F94A9AEF3FEB7570E0DD7A38C +:102320000CE104BA561B83C9146F9E34107CD52768 +:102330002F270FB2A15EDA5282DF0F9D2EF4DFE16C +:1023400081D6E5C8CF3E9C372534CECB69BC7E8F85 +:10235000E17A9DE86DFC928F2BD6FB109B2DE26AF3 +:10236000CE4F39697CBD108F8C4BEF251EB95EBFF7 +:1023700013ECC3A98512D633293E8C87F7BCC7F569 +:10238000424DF3B28F90DFABDF37539DD7FD2DCB9E +:102390008652BDAFD77B03FA1B5FB7ACB881F2831F +:1023A000D24304970FE173A25F732619EB522B9B64 +:1023B000CF2493DDDD3B7A932F06FD97BCE9781D92 +:1023C000FC09E23FF06B88FFF6B415687E8C15C7F8 +:1023D000AD3CAA78103F95470B8E57A07F71A2A8FD +:1023E00000D5B974A280FC987CF4636C21BFA65B15 +:1023F0004FA6733FA6AB358AF20B121BC8F9870DA7 +:102400008AE09FD50DAF93BD5FDD2847D42F6AEFDB +:10241000DD99AED038CB34FEA997DCC41FBB78BBA6 +:10242000BA710FAD6F95B19EE85DB3DDC8EFEFE017 +:10243000ADF67D581F8BF7213E8EE325A0C3349364 +:102440003F03F3D3C732B99FAFA7C7E7E93CFF719A +:10245000ECAC7700F2CBB142EF507B2F76C2C78A4B +:10246000785C2B097C37F07353FAE73E4B97C477BF +:102470004222CFB76AEDA974AE3FA7997AFF2EE04A +:102480006FD2B57309EC31430146C546FB06E1D76F +:10249000A7867DD761CECD46F2174E31FBEB58EFC4 +:1024A0003843D3B3E3B87DD5E7CBE789F73C9B55F9 +:1024B000BE5FA43B3F334F3BDFA43BEF364FF83BBF +:1024C000F374FECED3E9C28F1FC286A01EAC17E7FD +:1024D000EFD60E8FF287E7B3F4ED61B12F82E78775 +:1024E000B0AD19FE2EE57D8EB59E7D85EADDCE462A +:1024F000B1813CAF47F9EFCA3EF2DF35DD723937C3 +:1025000082CF34BA5C12DF83D1D365B7A6AFC4BE25 +:102510005DB4D8B7F31BBDBB519E2B2D174DBCEE40 +:102520003068427D56339CFB4D974A25DA6F073859 +:10253000FB9BC3F4FBA5541E7FDD7F8B4479D756EC +:102540007C1EE3AC7A89EABC2B03ED26E4A7210DBF +:102550008B1F26B9F5B1D32CECBB1A332DDC4E768C +:10256000D34F5B77B71D8BF7717D9C482D3E8F76DF +:102570007186B083FA735143597B593AC033DF2DCA +:10258000B9B01EA02F3ACF5E30EA7544C3F5D2BB76 +:1025900033DDFB4E3ACA79FBE55B308F7A6CF86726 +:1025A000FDD18E56F5C1C71F0B3CEBBF2BE31AAA1A +:1025B000D6E2F7556A9DDE0ED29F866F6347301CC8 +:1025C000A7E3376B25A41323FEEF4B7E3E13E37E78 +:1025D00096CEBF770FB8A77D9755E9BC4EEB98D143 +:1025E0009F41798A9CEBDBF7AAD9F7462EEAB3CE56 +:1025F000D6A3B9A630BA5E5C0B7A00ED4AF3C1648B +:10260000D516CE7706E23749D2F84F11F632920F3F +:102610002F221FE6607B267610EAE35DA76207E3C0 +:10262000787B79DBCDAF4DFC7BF6101F0D9917132E +:102630000EDFC304DFA57A3E0E631D43E68C0CBF9C +:102640005FDB171F5B33888F3B22F8585B6F3D7E43 +:10265000CF07E38016337DCF07F3D78E3039199A31 +:10266000C1F5CF58F1FD9EF1CC47DF391C2BBEE3FD +:10267000335E6101251EF7CD0232DFF7E5E72DC697 +:10268000087E1EAB045AB18E62BCD8E799C0DAE965 +:10269000B9292C48AD9BD9E91C451173513BCE1289 +:1026A000988EEE544E7D3DD525069215C7798B3810 +:1026B000AFD10BDD42EB57E8BB3DC49F329ED7E95B +:1026C000FDBB2FB333B8DCD3C74590BE9718E5B92F +:1026D000F07B6D38C9448595637DD3648559A2012B +:1026E000DE5D870C24CF2D1DAA1FEB535D09E2BDD3 +:1026F000CF19D5E18E757379459383F518DA7AF59C +:10270000789800E3619E6DAC029128E13140F3DDE1 +:10271000C8F8399242A652FD736946A6D0F7418A9D +:10272000A38A218E427D6FB0F8081FD33354BA8F2D +:10273000FB25B130CE848D127B0FF73FB2F87AB50E +:10274000F1270023E0F9C2E919DC9E614AF5BD7862 +:10275000BE8F124B05CD2576FE9DA364FACED1F532 +:10276000E2B52B997FEF32F6CE60E7CF0A42FB4904 +:102770002EFCEE516CE83B9B2EEDDF830844FE7B84 +:102780001077642CF911F2A356AFC7BCFCDF7DD0E3 +:10279000D7EB85D5E7B10B61E7B0B5BA926DFED93D +:1027A0002A9EF35B9068A173BF7996FEF968C7060D +:1027B0003ABD34FEFBD2F6C13498E21FED8909F12F +:1027C000BB95B9C721BE437583FC3B50DDE7AE9294 +:1027D000199D57B49A797DE563201FF81D26902E28 +:1027E00015EB68D883C5548FB9DE6171E17909337F +:1027F000C26D0DC15D6B11DF05B5F07D717D3D686A +:10280000ADCD40DF1DAD65D1740E3D29DABB2E0381 +:10281000E0BA2FA688CE7767EF9CE444BF317CFDF9 +:1028200093B4F51B7AD647C27A1FC9E8A51E515B3F +:10283000A7F6EF76D805FEB475DBB5734A6E25E2D0 +:102840009C92868FC7A2F9BA8DB8F39F45EFAAA8CC +:1028500037F4EBFDFFDC29BC16A06400000000008B +:1028600000000000000000001F8B080000000000B6 +:10287000000BB3D36660F8518FC0C19A0C0C5DD2C7 +:10288000A862B4C41D120C0C9780F80B106702EDFF +:10289000F5926460F006E26D40BC1D88C5A518186D +:1028A0000280381088FB80FC7E204E07E224A81BA3 +:1028B000B30519187281381F880B815848808141EF +:1028C000588078FB8B1519185EAB22F85A6A0C0CED +:1028D000C91AF4F3FF60C381B6F4B5EF16D0BEE5B4 +:1028E0006E08BE0490BDC20D55CD4A37FC66AC42A1 +:1028F000935F8DC65F83477F810D2A7FAB292A7F37 +:10290000AF3903C3072435DB4CF1BB051D2B00FD9C +:10291000A788274C9730A2F22732A1F2F9A17C00B8 +:10292000BE1E313CA80300000000000000000000B3 +:102930001F8B080000000000000BED7D0D7854D5C2 +:1029400099F0B93F7367269999DC24433260126E7F +:102950007ED0A001879860B0586E20E147A30E0892 +:102960002CB440262888166DC49FC6DD500609BFCA +:102970000921E14F70D11D105DEA63FBC5565B75FF +:10298000BB7682D646AB3568D787767765A015BF0C +:10299000BA761BD96D976EBBF57BDFF79CCBCCBDB0 +:1029A0009900FEECB7BBDFF3C5C7E770EE3D3FEF24 +:1029B00079CFFB7FDE73C725BB59701A631FE31FF6 +:1029C0009413731963B5A9B2C5C362D9398CE5767E +:1029D000488CD530B6B25D89CF827F1676B4BC8282 +:1029E000F5E56D6EC35DCA58FF036E7F0DD44F6F62 +:1029F00057C26EE8DAA8F8A8BEACCB15761BF07CFF +:102A0000EB472FE7E3FB8D5298419DB1BB199BCC5F +:102A1000D81A0FFC13EACB2A921DF8FEDD2D52388E +:102A200086AF99E99B04EF6F65FC7DF3038AC6646A +:102A3000A8EFBBAD894D64EC961E98C5430DD9C770 +:102A4000BC3D63058C45F823D6B205DE57A6DE47AC +:102A500058D7470AF46B8E399EEF9BF53E0BE07B0F +:102A60002DF51CD6730CFF3185B14B993F783A1B7D +:102A7000FE1D66E18F15281BF2191B9DC297B364DA +:102A80000CA01FC5D85CC65CAC1CC6A9BDCCC5CA11 +:102A9000607D161EDB381E97354984C7653E46F5B6 +:102AA00077E74AF1074BA91F9B5E0D253C2FC88392 +:102AB00032C8CC4228231E96C806F8E7B65DF61E3B +:102AC000AE7F034E359ADA2702F07E018BBA18C02A +:102AD000F7672C46E56216A7F2CB2C41702C6543B4 +:102AE000252AD4EF52129B18CC130E45A7E3FEFE05 +:102AF000AEFED8BB12BCBFBF5AAA9D0225F3E5D1DA +:102B0000BA2FB43E6B7E9545AEC37118935D113FED +:102B100063E3AD751E66B18A20637A8F8FD3CB6174 +:102B2000D6CFA03EBE41D04BE3FB7208D6DDF33CCE +:102B30000B633D049B3905EAA1AEACF806A8F73C4F +:102B40001EAB47BC1C6B01CC43FF638D6E295A053D +:102B5000A54B7745A00CA98C2980A7FA86F592028F +:102B6000EDE646F938E34D4D665742FD704C52C5CF +:102B700073ECAFEB314987FA78A83F28E17BDDC5DC +:102B8000609C86865C57B20AF1DD334687B2E2B0BC +:102B9000969001BFF5A64ECF195B4474355ED0DA2E +:102BA0005C93F79B7B38CFCFE83DFBD3C7D67BC088 +:102BB000EF25457CDF8E1D2ECB417859D4DEBF48F2 +:102BC00065314F5E0ACF3BD7C10B770ABFBB0E976B +:102BD0006D45BC1DEB53C382946DE3C3B8BD0DF0CE +:102BE000FE4C951C560CE4B3220E7F85EED77DA9D2 +:102BF0007176AE83F697A5E06854A6F6133E4C4670 +:102C0000FC38B706DA57A5DA3F81ED018E3D080F93 +:102C1000F55B73D48BF34418CD33123DBCB04EA793 +:102C20007E83621DD7FCEF30EDD3DC861689CF2B77 +:102C3000E06BB0C36795167C238D7F4CC0658D6FAC +:102C4000CDF7C4BA10958D4AD523F7E2BA8E687CC9 +:102C50005DF38DC77723FE8E78C231A83F79DDDF23 +:102C60008CB91786B862FAF3973FC370BEE50FDFE1 +:102C70008EEB7A2E8BD6F5D487675EBB910D9FF7CE +:102C80002D81879F9E9B3F44756BFEB9A6344602FB +:102C90003AAB34A5840BE8E558FD571EBED7C07A81 +:102CA000BF89F2A4D23C664A504E846168BF99FA4B +:102CB000A78F419E554277E4C7490D520BB67BE280 +:102CC000C687BE741F3CFAA98BC37DC55F72B82F3F +:102CD000BB7EED9308EF6537AEFDF93350BF02853B +:102CE00020F0DDA537ED5FF377F0CF6F2CFCCBE55F +:102CF0007B18C9855836C0916B4A0CF777D9F7DD38 +:102D000036B972EC793FC99542B33486FCB7AC4F03 +:102D100022F9DCDF08721FDFFFCC1D77237F3D2007 +:102D200099D4FE59771CE5C3311763288F971DF797 +:102D3000C6915FD8AA6524AF2396BC36F397DE0B05 +:102D4000E3BDDB60C9734EA7F41ED6F7AEF98BED79 +:102D50005743FF33A62B8C62D392174E3CBF2BF008 +:102D60001BA92F273A58A6265DE10CF4D0DCA6D883 +:102D7000E4767DC349A2AB6550B2343E9D2BF86C1E +:102D800059C32F047FEA24979CF0BC515B589C895F +:102D9000EE4E09789282DEDEC5FDBE0CE1835E4810 +:102DA000375D4A5C4993D3F0E78A4CA07A0C59FA14 +:102DB000962D76382DB9DD12CBB6E92B90BFFF8268 +:102DC00072B3B92DDFF67C6E0EAB9DFAE9E4F01F0D +:102DD000480E27258207F42FED7F242EC5512E5A49 +:102DE000FB7387D89F4805A3F5FCEA80148FC1FECA +:102DF000FEEA8858DF3E29AE4844AFE6690F8E0BE5 +:102E00007396A7F6FF76B1FFA9FDE3F8B1F095D26E +:102E100073B99B9200428B2F5282F2DAE21F0BBFF2 +:102E2000FD7B7E5482FB57D856DA5D87701E508832 +:102E30007F3FAC3F598CFBF6AE0BF00AFD23871F9A +:102E40000B305F0AFE1621073FE8007A81E712C2C5 +:102E5000599906A780DB857568777B83D4877CFAD0 +:102E60004B31AFD5EF475B66CC44FCDCD12331C49A +:102E7000CFED477A97FD39AC7F753C3B8C53FCAA6C +:102E8000B1387009C0B3A2C7BE9FA7B6DC1C40BA58 +:102E9000F9B02FBF00C7B97D6A42433857275ED5C6 +:102EA0000CA0B35966AF96CC40571FF66D0860FB77 +:102EB0000FD59E1BAFC179F629E1F530FEEA23A5B7 +:102EC000334D4EA744BFAB057E4FAA3D33C7007CB0 +:102ED0002DDF282779F05E9F323B9E417E7E5D523A +:102EE000880E56B7B9655CE748F4F261878B2570A8 +:102EF0001E3541F81CA9DD077D2DF4BEFF81C21BE4 +:102F0000D07EBBBDDD45F2E2F63637D1D3EA0629E5 +:102F1000CEA414BFAD10F0AEDEADD0FB93A644F24C +:102F2000C3DAAFDB05BD9D3C7CD52BA8EFCF80FC81 +:102F300041B93B63E30FB54B000F2BB67079747248 +:102F400077EED27B508E087D798718F7B6B862E3AA +:102F50008F95EDD9B6FD8876E5DBEAA78FE4DF58DB +:102F60008774DDA590FEBC65E3635A88E493DDDEDB +:102F7000440E9B5490B22F4FB0A105D748297AB286 +:102F8000E8E7D636B03703C3EDCD962312D9A317A1 +:102F90006D67B6819D3971B89D69C99108DA67E599 +:102FA000293962C98DBB94E8D820C0F16B57F4B2BF +:102FB000FC72921B0F48B54827FA6FD1AE6431A559 +:102FC00016E5DBC5CA0B5AACC547F0F75E07D0550E +:102FD000067A9D817405F3CCECE9CF48CF33248386 +:102FE000C64BD1CD2D01E25B1C14E068F6985D085C +:102FF000E72530B1B79A4AA6E4F15285FA668419FA +:10300000E8E1D45A297EA894B7F3A13C05B8AE8173 +:10301000E7CD5D97C7B7496817C21FEACF366E770D +:10302000433BD39F47CF4D09CAA2F6D297717F2E5B +:103030000101A055F3F6380FD8598412689F7057D4 +:1030400053D75800CA62E827F3FEF41EDB05488E0A +:10305000C769BD383E8E53A1C4D7A09CB1E878990A +:10306000903B20572B55A0AF66961546BDD9DC5630 +:103070007E5EFBE586B05D7EDC5467D703734DBB97 +:10308000FCBF79F625B6F60B22E5B6F77FB6E80A5F +:10309000DBFBC5D1AB6CF52FAFFA82ADFDD2D619F3 +:1030A000763FE9A7B9B49E35822F4782FB75212F61 +:1030B0007FE2B04FADB2E9FA44CDDBB04F6C9D3B3F +:1030C000FC381427E6B0457D6972C5274B84CFDFF5 +:1030D000009B70FFE04F1F131E437CDEA6BF70B73E +:1030E00066A23B4DF4437309ED2567FB138B619E8C +:1030F000B47EFF26494487E7FA314FCF2F01E4160B +:10310000E0E41C40FD9D2C5982FBE6CE35E8FD5DD8 +:1031100072B200EBBF61437BF3717F7DC962E49FB4 +:1031200066953D27E560BFB0C70DF38135C4DA80F1 +:103130003E5ADA7E741CED38C908B22558F7F812E9 +:10314000C8DFACC3F561D2C23BF0616F28FAA104BD +:103150007048EDFDBF97F0FDF799817A98258B7245 +:10316000D17FC4A9D2F9B069066B457C9D68B4E3F0 +:10317000CD2BD6F17349A676CF31F3B7C8472725B3 +:103180009DAF4FC0BB4D32CFE27C16DCEFE6EA1AB2 +:10319000FB74702B722DC2FD23827B432B4B662B5D +:1031A00023C37D0533DDF2A8E1F09C656656A6E7F2 +:1031B000B3805D333DBFDCCD2AD15E3D216585D72F +:1031C000976239F48F5F03BE8A7DC3177EDC184E89 +:1031D0001753E55C9ABF59D8BB85ED52221BED53BE +:1031E000E621FB95F53C647A50AE0911D7D2269DB5 +:1031F000C4F5B38E4633E949AD9719124B6F776E1C +:10320000DFDBDCD4DE923796DCB2F069C9154B7E89 +:103210005978758E3F929CC1F1D43C843F3A494E17 +:10322000A7131DF03101E131AB71FFAC7D033732E3 +:10323000E6A91E79DF2C3905ED18FAFF23ED17E01A +:1032400089EC3A5798119EDE0D0E2D7D0AD63DD0A1 +:10325000C6F5F5BB458CECC3336D570DE4207E3CC1 +:103260009E0AC44F219F8A150687D6A17CF5A9899D +:103270007E84AB50E82F2FE3FAAB90193BAE46FFAC +:10328000BEFDE4126C67ED4FAED89F66D81FF447C1 +:103290009A7D43C56827B951AF413B37C85D94CB90 +:1032A00085EDEFFF07EAC542875E4448583A1C594E +:1032B000553BAE36D2C7FF6823DA97D6B8D4217D06 +:1032C000FF83DA49C46F61FBE6BB95806D7CE963DF +:1032D000C48390DB68769D9BA714ED5539E10EA45D +:1032E000E8C20997D56F243A61E9F394DBEA644FA9 +:1032F00038EBEEB06693CFEFFEB13CA7D5771E7AE0 +:10330000738EE7A46F271F083C7C0A3ADDC4E9945A +:10331000CB058B6FFFB3E8346AED6B2CF78E23A8D7 +:103320005FBBB4F02C03ED84A11F723BC16D1C4246 +:103330003A8B495995F03EDAA192DD68D915FD6BBB +:10334000FF7A4B193C3F512B931F71623DA7FB3D08 +:103350000F707BD4D2DB51A1B7D12E40BC82DD30BF +:10336000E0E6A507C7F1AFBFB95402B83DC650BFEC +:103370001BDBB71964AFE6D4C5F54628E315873CD7 +:10338000E38C945C4AC6F2F396C37E7D2BD7581625 +:1033900021FB3A3A7AAE3FF5FEC732D74FD34A58AF +:1033A000DE6C182FB9550E3F08FD932EBB1EB3CA15 +:1033B000350AD797492F2B413F78A476438AA557E2 +:1033C000758DF665FEC071DCA791F6017640A738D1 +:1033D000E6393AE478877968FCA4DFAE874E0A3D87 +:1033E00064C1FF09F4EAC262A08FBD5266B83F1201 +:1033F000E3459F030060BFA32A3333B573AEFB1FC1 +:1034000044BF84ACD27C3B2A76CEC6FD8EC5947078 +:10341000FA7E58E55F285C7FE6CC6DC86D84766CDB +:103420007DE67679A2DD63F7652D42FF0A50A7623B +:10343000BC2614D3E7CDC678E4D4BC49E863FF18B2 +:10344000F50FCCBB3B72466FF17D227C14849491C6 +:10345000F1F1A62CF37D74F0ED1E70D7507E262579 +:103460000FC55F5A62EE8C7C6CC929A73C72EA39A1 +:10347000C934595BF570B9628DFB49F519C8872CC1 +:103480006554CA6E3FA7CF2E961E47900325328BF8 +:10349000F665F04FAF56389EFA633C4EA19A32E97A +:1034A000AD994A1393004F1B828CE4411EEE35F216 +:1034B0006D038B030A583E0B0FF8509E046596204F +:1034C000BFD5E9079A4DE8070639684C1F55D65F06 +:1034D00008CF83F357D239038B7079ABC37F9C8FAE +:1034E0004CD2176E81D7686C12C539F39AEC72DC36 +:1034F0008D7E20C847BDC1F17CFE4C3A6F70B3B4DD +:10350000E7B08EAB147FF03498F6AC9AD5207F5696 +:10351000EFBF6AD76218BFE6919BDFC672F2C17B2C +:10352000F2BF0465DDE3BB6EC6B2E4B5E8D84CF18A +:1035300054AB044E61721DC0E763863B67E476C6F8 +:103540007A25827635EC6307D24332569E85F4BDE8 +:103550004AE1FCDFBF400B607C46DDC2E5AA3A1FB2 +:103560009047F4CFFDF4E6943F4D7E852AFC24A5D8 +:103570005DA13842522FA378CBA12DB28625C8D9A0 +:1035800018CE63CDDF2BE2D49D22DEEA84AFB76490 +:10359000A818E5E089F51F917DA8E859E1D9305FC9 +:1035A000979F95101C225ED02CF62FB9B6DE931E85 +:1035B0002F52849FD37174CE80817430A084BD0655 +:1035C000F18D86E346B74C67187F99A58719DA1302 +:1035D0009DC2EF517C26C37DCDD6D94CF46BE195CD +:1035E00016C2FE552C9CC0FEEDFD885B58AF793BA2 +:1035F000F2C10FAEE576C88952BBDC0612EA823D05 +:1036000065B38AD6AB489B4DC1495721CDFF5E2992 +:10361000107295D3EB1BB5531EDB0674F09CDBBC1C +:103620004719F509F8C821D77F006C82FBF6A8641A +:1036300097E75679D0C9476D12D985AAC9D73953AA +:10364000F9B011F5E446B01B0B8DE1FCB2F1754603 +:1036500076E346E0BF586926FEA99650465C2CFFEB +:10366000E4B5E74A18C7F8ACFCF3978A38A713FC0F +:10367000037496403BE651C9E89C02EBFBCEBEC604 +:103680001F4F81D7CF1E58917D0D94DF8B6FBCFEED +:103690001A98FFF6C7F764E33E3FFA2AF0D379FCA5 +:1036A000788B9F9AD1863D4F9CCD586BE727637DE1 +:1036B00005F1D35B0AD75FFD0B7EF7C6D5FF9F9F51 +:1036C000CEC74F6F2B409FD3FE74B6387A1EF9D603 +:1036D0005CC434B4B7A08D89741E0DDA4B9F9A4533 +:1036E000F85EE7E272CCEFF272BB23C4DF3BC7FBAC +:1036F0001BF593C70F16947F763E5DE7333FFA3C88 +:10370000F81DE40EC99B13E3EC7CDFE9E274F72BB0 +:10371000D7275EDF3B5FF81CD607763DD977D7A960 +:10372000CC403F60E20B1E1216AF8EDB780459626C +:103730001A3C0FE5F1F7EE3C929771B46386944A18 +:10374000EA6F326EC737D56C3EC2CF25062B168185 +:10375000BF3C07FE85F6C8753EEE57C0382C04E323 +:10376000AFF6468BD551341EF997AF3EBF2F88F286 +:10377000E5758F5982CF5952CDC5F301CBEE18991B +:10378000DF55763ACDCF7A5A6304C7A94B358A57AD +:10379000A2180B407D6BE9A514A764E1D87109EB71 +:1037A000A37486725C094616931DD2E63666417D87 +:1037B0002B1850B120D12DC94DA5BD37144039006B +:1037C0007609BE5763733D1AFA2FA3640C42337710 +:1037D000DB47E4779F28E6F2B6630AA3739A810772 +:1037E000FE6DA98CF64EBB9BCE2DC06E247E8D0A3D +:1037F000B9910C4E0FB5A09F51A48525A86F8AFDE5 +:10380000E2F8D7B83C313D93D3E3233CDED112E25A +:10381000FEAED3EEDBFCF5CBDE3470BC1FBED6753E +:103820003994AF3FF9F3D72F87776F7CEBB51A8CBC +:103830007BBBEB345BDCD1CD8C37D1DE029F29A181 +:10384000A17C8E9D5C829B99F2EBA418E2275AE33F +:103850008FE37A91B7113FC9290A3F5F84BF10C037 +:103860001710F075074F55D13CB1F7FF2393BCA754 +:10387000BFC9428F40BBCD79F7C7518EA4E69B44A8 +:10388000F2290AF209FDC8A8AF67C91A9ACF1F7EAC +:1038900010FBFC11767572EABCF0D096792D88E7A2 +:1038A000B90B3C3AD2993BB6F96EA473E73ACFF81C +:1038B0001EBC144373B6F9814FDC159AE925FB97BA +:1038C0001DA6FD104D2CB8755020187780FECB56E4 +:1038D000B00CFD0DE88FEB047986F6B6D50FC8D88D +:1038E000C4F59EF14DBF94E2FD225E61F5BB292631 +:1038F000D139C14DE5C006E5C3F1B4C127FFE46B82 +:1039000078EE12537485D341A8220D6FF8678F9B10 +:1039100071BAB86C9F5DEFC2FC0B4BF17D4C217A04 +:1039200071F2CBF8B8BDFD06DFF9CFF587EF27C7F9 +:10393000F344C16F567F0B3E8257CA145FB79FCBCB +:10394000DC5467AFCF1D868FF3C3355DB59FDB3485 +:10395000F8ECE3CD0CDADFCF2EB2D73760FCE6937C +:10396000ACDBC1774F8F31BFA37E06BFDE92BBEFCA +:103970007B227F4BE3A86186E3F42FD83B7F1ED0E8 +:1039800041A1CEED8EC2F90B1B726B504E31916787 +:1039900092D9FE2814FA5E697F49C9417FD4E4EDCB +:1039A000934BDE9A9183E7C5758CCED3A3EA3DB1E4 +:1039B0001C23658FF4ABE55988E7CFDF1EB9DB9B8D +:1039C0009E7793B2471E78D5A8C9608FA8F748267E +:1039D0008C336B09D82355E9F648AB8432287B0930 +:1039E000D823647744DF437C8D6497FCD8B2EFFD25 +:1039F00099EDEA3FA85CCF829EF9A7CFA267C6796E +:103A0000CD7F513F077B605A89B13292810E3F5082 +:103A100079BCC3D29F8DC1848267E7A03755173C1C +:103A2000BFB62EF9128AE30E7D6710D70DEB71B980 +:103A30006A3FFD7ACEA81C9E892ACF8319A9DFB7D9 +:103A400046F057BC9A57D82DF6FDEE5FF08E2EA3A8 +:103A5000FF027E0CFA2F495FD9368C0B9E89A91480 +:103A6000AF53E7AFDC3D17E909EC6C4ECFE7B7AFDA +:103A7000AF1D926D7C3CED6C968DEFEB99FD9C6ECD +:103A800086C77E4ED7A8DBCFE96685ECE774730C5A +:103A9000FB39DDF595F6733AA77D3F73B4EBBFA70D +:103AA0007D1F6A64C44F17B0EF819F6E427A1A89F6 +:103AB0009FAECB37EE8F64D8EF6A8DDBA9ABBD919B +:103AC000054877D30C6ED74563EB291F302F0AF2D8 +:103AD000A694E28614F7B2E25A56DCCBCA0BB4E2E3 +:103AE00059CEF89515F7B2E258528CC7AD9A3DD130 +:103AF00015086F73FB4919E588FE1CCC838C609D0B +:103B0000E30D8BCF7179D0D29E392EE78CBF8DD843 +:103B1000EE53F2D5E7A01FD6E37A2DFD007CFEE040 +:103B200067E173905BDB70BC7F417E1F45F2A49B15 +:103B3000F6AF02708D763AEC838671FA05A7F763CB +:103B40003C4E3DEE26BEBD58FF17131D64D8B42869 +:103B5000F8E018CF8AC64A49BF587C63F189D33F41 +:103B60001EC61FFFD5FC7391FE31F0CFF75CE7D185 +:103B700047C01FCF23BEA75572FC3AF9C1A27F20D0 +:103B80008984548DFB1D4D607B8BDED98B6113E1E5 +:103B90009C28FC9A13A335F22F4E3CFFEFFC1CF639 +:103BA000794F789C5823BE9FD85D10DF569AE23338 +:103BB0008B9FDA3DD11FBBD2F240AC7CC7C31EF352 +:103BC000757C1E52FB12E8AF8466B3F00683F8ECF6 +:103BD000187FCEF9D41766143FFDCC7ED95E571CF2 +:103BE000CF875AA4A1A58CFC56A621DFAA429EBC71 +:103BF00098153D89F86C9E1E29E1F43434CE077087 +:103C0000FDA243217FEDB3F253F348F83F878FE8DD +:103C100090AB76787E40BADC42F9160A69F10D5213 +:103C2000067925F01567E131B83ED8CF7F473CE6ED +:103C30005531899623F8B8D963FEC1F5D9EC0F4503 +:103C4000AB4DF131E0CDA3A15CAC06BC950FC7DB59 +:103C500049175FBF93FE426A5246FA0F811CDD206E +:103C6000A59D930ABC58EB19493E5B749A76DE1009 +:103C7000D2D2D7FBFFA85CB6E4E5E59EE864DC079A +:103C8000B71911F2CFA4FD75CA99E176904CE78C73 +:103C900067C0EEC16E172B5FA79DF5E261099B7AA5 +:103CA00056A1F2DAB37478C2BE78369B4AF36C3E02 +:103CB00095F56773A99C7EF6122A679C1D4D65C316 +:103CC0005900064C9CC6B3A554CE3C7B0595B3CE9B +:103CD0008EA772F6D9ABA8DD9CB393A8BCEEEC1707 +:103CE000A8BCFEEC142A9DF68FB15E25F96DC92F94 +:103CF0004BBE3BE5B725FFFEAFC9EF58C345D93FE3 +:103D0000A0FFBEAA9D477E8F242F80AFEFD3D2E5C0 +:103D1000444A3FDFAF7D06BE3E2EF814F8F73D8CD7 +:103D2000C378C08BA3385598C7A9028666609EC623 +:103D30003E6C025BEA2F8D9CC4B841F3028F1E03D8 +:103D4000B8074A35924FDB821A9DBB6D96F4D15C61 +:103D50001E2413487F3B431A8DB7ED8F8A17F31744 +:103D60005E1A5510C079BAFDB28EEDBF959BDC7717 +:103D70000B9EE34F61E14330DE8A3D7B3CE97EF8F8 +:103D80007E340E00BE40EC69C680AF378EFADD523D +:103D90009CCF3795513C064A3353BED837DDE27C81 +:103DA0005A1D0A219EB6FA64D207DDBA47E4A1265D +:103DB000075AD0CFAD93D9369877C3E877B620D8D5 +:103DC000EAB8B21D6550DF5957E6C54D7AFA950F2E +:103DD00042644FC03B0405CA8428CD1CD89F4E6F57 +:103DE000D838DF799B620CAD4362C5FEEEEA91DB09 +:103DF0006DF20F84903E3A264DAEBC05E6EF9D5421 +:103E0000301AE7DF5E73D4860F45B7C753140C38FA +:103E1000A21F5E97A4B8DA06D9D85106EB0B887CAE +:103E20006B00B33292967760C1A184611D1CAE8491 +:103E3000C2D7C30AE0796E5D2296E4EB3531EEEA33 +:103E4000F32543E82F2A75A729DED6E94F2EA2BA1B +:103E5000030E6BFCDF6A565E00E71B9FE09BE649A2 +:103E6000DF5E4479E4551AED5BB76B6801D6636B8E +:103E70005DECF10CF19B0D829FB7559E3F2EA3FA8E +:103E8000EC70747BEDFEA205CFFBA274C2D1EC1ADC +:103E90001A9569FF3EEDFC175AF7E73D5FE708F911 +:103EA0000397BBEDFB1010F2BC79CAB743782E6EB6 +:103EB000C1D329C13ED47CFEFBD03C85CBEBCF7B6C +:103EC000BDFFD3C6FDBDC6E32AC0A7B3CB31CE38F4 +:103ED000667208E3B53E2B1E1D8E537E5200E3D161 +:103EE000D4CB203DA4EA7C0C456509E44339FBC3EF +:103EF00004EE9352AD190AC9D9CCFBAE8437515E9A +:103F00009B933F2DB8E96FB2301DE8FCD06BC5A77D +:103F10000D7532BF2F81F15F8559E7B33C3E6DF5DA +:103F2000572B648A4753203B6D1C15F4309EE328C1 +:103F300018A7CE1B3EFF7753F4689FBF88C7C715ED +:103F400095FB81EF491C1FB15715CAF7EC7A9ECB40 +:103F500037769C91FCEEAA35E85C6507FC8FFE4342 +:103F6000ACD61747BA551CF978672AA787508E5ADE +:103F700071719A8F9F0F509C1BF314296E6EB00ABB +:103F80007CDF2D40B3C651ADB87CE59A49D8CE6FE1 +:103F900030CF73B03E7F1D4B5C02F006DDAD5B2F72 +:103FA0002FCD100FAF5CF38D2761DEDD4F4DFFD5B8 +:103FB0009350DF25875FAD8376F95FAE23BC3AE38C +:103FC000E1DB2A655347F9E0F31DC27D051B9AE842 +:103FD000E2D61E2986CFB37DBE837CBF5B430AE257 +:103FE00005F424E2C5EBCC8B4CC77719C2B17360E2 +:103FF0001EFCDBBB75DE329C17E1C6FCCA15BDF5A5 +:104000001AEA99E012FBF985BFC95EF756D9E1DCDF +:104010002AF6EF42F4EFCC43EC31E72D42BA3D13E0 +:10402000D418CA9B8D6BAFBE91E4FE76858D2BCDE7 +:1040300040BF8E75756A2ED2FFDD46FDDE0AD41BA9 +:104040000D1AE5F574C7BD714CF1DE5E973A37B1D4 +:10405000D9EF86C6CFB16AE4843B931D2FCEC70249 +:10406000E219739C8375CF96C9AEE9EEE1F358E38C +:1040700075D7BDE5413931D2B84F8F318FB8D19E58 +:104080008AE65DD4BD8BFB36BA385D4FD1E252294A +:10409000DAA3FAC24550DF3C4E267B8809FFAFFB0E +:1040A0005A7E9EF8B066D8EE576C9AB292EC869B18 +:1040B000DCBAE02FB00B27A4EE5B1CF09A2FB8E11E +:1040C000B9FA1C8C04F6C07BB9E11B912E1A831F30 +:1040D000911D756B91AC237DADD8D348EBDAACCB99 +:1040E0002C8176AFDA4A466A136B35F13C00133502 +:1040F00091EEE6C01B99EE45240F75029C73C61520 +:104100004EDA063577512BE5B1341A12F961D70131 +:1041100066501EB4144754A90AFBCD7F07EDBE3983 +:10412000C15219FDFDEB54D6A0A5D9E760171F7346 +:10413000A7ADEBC4B83D41B90AE7877970FE451ECB +:10414000BA4FE046FBF8CA947D3C1111996627FFEF +:104150001A8D4A8C6714257E4F79DEDF4FCA382FBF +:104160007B81556F933EB95F0DFEE52F713FE3CC28 +:10417000E8C754C3CF1A97F8BA26F649DC5B39EC86 +:1041800089FC06C7B7E20113357EBF79730B0BC7F5 +:10419000D2E22A9B9FFFF3E368AF5AF197737977D6 +:1041A000024E0BEE4D12CB223DEF89FEC19DEE1764 +:1041B000B364D9DC099F1FDC19F2E57CB5C04F63FD +:1041C00005FFE4D55678516E8EC57C1FDC87762EB0 +:1041D0004F4CF82F3DDF4711CC170CB7F6CBC6700C +:1041E000B9A4887B5340D712DAB1CE7C2005F37E88 +:1041F000260E971B0704FD5FE211F93F93D964EE89 +:1042000087DBCFAFFC4BB9DE67AD7919EFA17E5FDD +:10421000E8FD17855F9910F71A8F8A7B8B2FAF33D4 +:10422000C8CF7B655D259503EBC2F4FCB57575546D +:10423000A6EE57F179F3851DA662500DCFF97D2CBE +:104240006E00BCFE516B064A91CFEBF8FDEEEEA678 +:10425000535BCAC96EE4E7169B8BAA1385E8BF00BF +:10426000ACF95077F9FA3CFC9E97395859C0D51CE7 +:10427000E2FDBFFABCC24917BAB5FF8EFDF6B156D2 +:1042800086F22E60DAF73B3BECF46FF8FEBB8A2E29 +:104290006EDF7BF11FB08F5FB2F6FD6A7635FF3EB1 +:1042A000C3C5C963E4A34A2107C6003F1D007FDEE2 +:1042B000ADF07CF57C9EE76A8638BF992AAFC7C609 +:1042C0008BF62E4E426C208FE7B517F3F304EA8786 +:1042D00079E5F81EC3922FF0F816CB11F9EF63C5FC +:1042E00038ABC5B813ABE9DE2E3FFF677D3A963E8B +:1042F00096A47A2EF0019641D62A2132C7B041F217 +:10430000B78BA521AA1B929E85F532295CC6FDF0CC +:1043100038E9CF72C5FC7605213F22F3785172311E +:10432000D993A097512EC6D5C822942F1BDAB4304A +:1043300060E25C9E1CDE9FC372435FCD009E7FC423 +:104340006232C91FE53996A55F49F61EE9AF0DEB4C +:10435000F30E6653BE4692F2DCF77B4A6D7A6AA290 +:104360006FE1753AECD746914FE782FE2C43FEA9E8 +:10437000954F07E396647A6F951BFDDAA24C7EFF9A +:10438000C31E49C43392A3290E28F6353E55CE7874 +:104390009F719F87DB358F9666B6A7197B90C6DB2A +:1043A000EFD11DE3265BE8FE8CCEE31B592E93F282 +:1043B0006B36B6F17BFA16FE46835D8BF6F0C6BE11 +:1043C000F9B391BF63952AE59BC3FA7D883F97C8EF +:1043D0004BDE383E78309BC7254A514EF723FE6AA4 +:1043E000D3F0175CD984F8EB7895E7F7823EF7B104 +:1043F0000CF98616FE5C3EF6C54CEFADB26394B682 +:1044000028D3BDE1A31ECB4E4F96723AE1F8CBBA4A +:10441000568D646A9F10F82E2963D1F3E1AFDFA3B4 +:10442000DBC6B5CE7D9511E25D922F4171AE891A42 +:10443000B733362CE678DDF0FC35C7A369E710BF4B +:10444000C421A7A4E2C156DCD8D29BED9EE83F7AF6 +:1044500046A5F425FB3E23B9CB5EF01CC47DCB7092 +:104460000E71CA539BE11CA2E7E2BEEF3256F0ED9B +:10447000A12D47E7E13C7F55C7C8BE0A3CC3E7CD45 +:10448000D5595C2EC5EF149812C659AE89E8F56867 +:10449000BFB9DA9989F9336345DCA6B0BD4F41BA9B +:1044A00008C25E164A78AF2919C3EF998CDDCDC8D2 +:1044B0004F540B67AE5A6F08519A961FA5B0A17E54 +:1044C0005A5FBB663C5E4A60FD14F5C318F13ED0EE +:1044D0003EF3572837C744A294870BFD627EB42F62 +:1044E000041E0BBC9C6F9737842509DA0783498A21 +:1044F0004F3AE5FA18C0CF2569F65B40D4D92A2E89 +:10450000A765F80FF57C7EC42EB7C739EE45071CAA +:10451000792FB95E91EF6EC9ED22BEA913D441394E +:10452000935F9ED2AF0EF8508655A7FA07ACFA6794 +:10453000840F0881E8D98207AF52A2DCDDE3D2BF45 +:10454000F214EAE77A8DE79189FB72D902EF3E74A3 +:1045500098A1DDC094574CDCD71D61FE5D9A3353A2 +:10456000E7911F9A5D67DDA7E3F795A18C619C2E0B +:104570005BCC6FDDABCB66C69BE5400FD96692EE98 +:10458000D5E9D677154C96C03C1CDD27531E9DEE11 +:104590008B907CEA59E0D1F13B1F9AB8A7E712F75C +:1045A000C7B3CDD374BF2E7BD8FAF8FD3A0BEEEC2F +:1045B000ACAA37CB0DDB3CEB31BE0D6B1F9DF17E02 +:1045C0005D1DF793B24D1E87481B9FEED7ED985A9D +:1045D00066BB5F47F3A01F27E8CFBA67E784EB5CB1 +:1045E000BF9ACC76DA84B0DD8EB8D0FD3A57C8DEFB +:1045F0007EC705F2B33EF1FD3A818761ED1CF6A05E +:10460000CBB24347C90CF7EF4C834CDF11C9FD28EF +:10461000199921515C82F4BD65E7E5F1A1FEDBD972 +:104620007979565EBFC3CEB3ECB7DCD9767C3BED6F +:104630003E775584FA5CAC9DB70BFF01F4F290D73E +:1046400061E73565A60FA7BCC86783BBAF84718ED1 +:10465000D6FE48C17CB55DB9FCFB476C987FF0D6AF +:104660000CDA171FFFDED1AE29FD2A7EFFE6774B5D +:1046700019D949561CC12D60DE5524AFA7B07BD790 +:1046800043849FA0C043137E80AC8670151F477C77 +:10469000667A316F21BF8951A3C28A30ED3B7E9685 +:1046A00040A64B5B3115F5783D62250D4F333CF646 +:1046B000EF0434EAF98E7DB4EFF3B973F007F9F73C +:1046C00014E618F67DB7FC24346771BEEB2BED744D +:1046D00070428A0C2AD0E5E9AC5261FF0CEAA82F9F +:1046E000BBD7BAC86E7C6849D9D62BD15F0DCA3A00 +:1046F0003F8E1C1A87F651F351D38B76DEF6C874C1 +:10470000EF3878FF50871246F3F0A9256B5EC57A23 +:104710006CB78BECA0A7FAE615AC48E3BBCDBB1792 +:104720002C5C8CEF3B5CA4DF57ECB96FA03488FDA8 +:104730005DB5E9DF9B6AD9789F8E7EDB1BB5DE8C89 +:1047400076CCD559DC2ED9A82529FEB4719EC6D0C9 +:10475000E5DA58523F7A05DA0FD76819EF93DF95FB +:10476000E5E6F7F95CAD12CAF7C268E67B0156BB15 +:10477000B135BFA5738CE06C99A11FE7BA7E9E8C02 +:10478000F587605F7529454F79829E3616DDBBB58A +:1047900002D73790F9DEA155AECD1AC7E93462E7EA +:1047A000735761D3685CB7CB1D19A847E22A94758B +:1047B0008C8BB8DCAD919BD11EBDDA8514CE3677DB +:1047C000FCB06111EE4B58D2259827A84656119D92 +:1047D00005B318EA8386259156C44B21E83F0CEDBA +:1047E0001516FD92CE290AEB34E685BA67494FC209 +:1047F00005EF3D15D1AB10EF2FADE5DF79290CFAB0 +:10480000E85E5061849FC315B6BB199A0C1BC105A5 +:1048100076917F20519CC8C947D6BA9A977239BE03 +:104820007BED6F4765FADE4C455619E1D56BD8D75D +:10483000ED41BD0BE34C35079710BE6BDC2C4EFCF5 +:10484000EB26FADE55EB22B8764D39F91584EB7775 +:10485000BFCFA2FDBE969912C2953FC4CF59AD7984 +:10486000F29B06151E0FE77CE8E43B8B1F9CF0EDE6 +:104870009C3D8FCEE336B3C1F988EFD85999E868EB +:1048800073D11A6F7A5CB455D01FEC03C99798CED8 +:1048900068BF957F65EB311F76E3172395C81F6FBF +:1048A0007BF9BDD5FB966AB48E87E66A146F7CC827 +:1048B000DF4A747F6AA32B7C08C151F585B89FBB82 +:1048C0008B2BC2186FFB3B3C7C4EF30F768FFA525A +:1048D00025E2F38B7FC8E2E34C51AD717E46F45E76 +:1048E000EB25386728ED3F5B8176E8127932E54E9B +:1048F000AF5A42F2CB25E4F8CB4BF2EAD14F09DCB8 +:10490000B09C7179C8E31481B5D5FC3E8343EE2792 +:10491000EAD4DD33689778FCA75EC8BBB1374CAFEB +:10492000C775D60BBD60AA99BFCB982BDA170E4579 +:10493000D0241B16FFC915FA63EC6EC773A117725A +:1049400087C5C1072B6E06F9F3A52C61478E10F7BA +:10495000D9B5641EF1C319E0078A4B979C24FA8FDE +:10496000819C40BBF90D29195A91761E667D67EE30 +:1049700027221E14314B294FF82D110FFAA9F8EEFA +:10498000DC3B221E745CC4837E2EE241FF80F1205A +:10499000FC7E98F772DAB771751FF5631C6767CDF7 +:1049A000028F01E34CD5075F4220BF680EFA44FE38 +:1049B0003DC11BB4F4D0DCF3C7A91208971BE35226 +:1049C0001CCE97C5F7E85E11700D08B85E137059DC +:1049D0007A10E506D2191BABEA99E461506D95F0A7 +:1049E000BC17E5457F90E405CF130FAE918C09C34A +:1049F000E5048C373ADD4EB7E8EFD4281FD1B17308 +:104A0000FC47B3F8BDC397D6CEDACF8269F228B29D +:104A10007015D25D3EEC0FCAA3681397E351BC77C3 +:104A2000912657AD781AEC4898F4CE0D1C4F23C947 +:104A3000970BC99542875CD98D7205EABB51AE04CC +:104A4000D3E54A6B3FAE3B887285A5F45030F2C97E +:104A5000E4CACFBC65B63889255FAE0636263B3141 +:104A60000CFAD4FFE9F5E9DB424E5C48AF5AF91F76 +:104A70000193915EDF837921E8CF8C67740F473112 +:104A800007299F28B7DDC5301F642B76198DFECC12 +:104A900042CA07D931DFA3235D3C2C254288CF7D54 +:104AA000528F97EF8BDE8FF6C2B6093C4EB2E38F82 +:104AB000F778D1CE7EE9F682009EE3F4E65A7920BB +:104AC000FAE25BA17EAA91119DACD8B3C296F7F031 +:104AD000F3AC3CC2476E0CE40FE0E3E1DBB9FED17E +:104AE0000D9E070265C63C10B74FC483D45808E931 +:104AF000639B14F5501CA651263DD51BE6F92BBD32 +:104B0000E097E3F9606FC3CE39A89F37DC2A33CA38 +:104B100017AFECB907E54CC7848506F2A56B74D9CD +:104B20009B688E6FF0C9DEF43C523C4ED0AAF9B9B6 +:104B3000A128CD1C0079B3D734CE777F54157E1FC2 +:104B4000F6779F270FBE3337341AE304BD8D0B432E +:104B5000386FEFA848288FF253C6903DB071D4A6A5 +:104B6000C5187FEA58AEB1743B69D87C41BB7D6DF6 +:104B7000C519D5069E3FD22173FF32579C4F035F64 +:104B80005522DED2D78970AA26CF1FC1F52A7CBD57 +:104B9000F47DD3DC06F00FABF8FAD17FD57DFA684F +:104BA000941F6A03CF1FD9ECD717A3DFE884C31A79 +:104BB000FFDA6CC9E61FE956DE42FD1A7E8E58C444 +:104BC000F3167A5DE7CF5BE810F2D0F21B47C2879D +:104BD000CB714EDDEBB5C7012D78AE14A5138E91C8 +:104BE000F2053EEDFC175AF7E73DDF4879046BB25A +:104BF00025DBFD8A5C2B9FA5714D08E58405CFE67A +:104C00000BE48F7C5AB89A1B79FBCF7BBDFFD3C6D0 +:104C1000ADCFE6FA11F87400EF51764C9C19423989 +:104C2000948AC70C0D94A33D27EE335AF9232E9D89 +:104C3000FF5355F977EEE4EC22FACEB23A9DE78FB6 +:104C4000D05F863C904D8CCD467F4715F11B279F4A +:104C50005E087E67DEC8CD3EE137461DF3893C1114 +:104C6000E6C83B51433CBFC4CA27E992607DC154AA +:104C70003EC888F33AF0365EC8FDF71CFD87AD3BB1 +:104C8000CCEF575AF927C3F248A6CAFB710B86E549 +:104C900091887C949E5C23CEF3C4795E09AA4D8CE6 +:104CA000E70DCB23993A3D84DF949C5622FADDC070 +:104CB000E8FBBB3D5E5EEF9DC3E2F8BDB35EAC2397 +:104CC0003FD532CA6B19965F32750DE14963916524 +:104CD000FC7C879FF75B7870E6975C90DE2E9047B0 +:104CE00012F459DFA388D03C3DFEF04FEA083E990C +:104CF000CEE30BBE743C9C3EFE253E2E277B441E1D +:104D00005E4FAE3D1FEF3EB12F15A29D737FF52282 +:104D10004ED75DF53AC5DDDD0D3C5E39EC3B103517 +:104D2000767FC019CF3B21E4F585D6EF8CEB6D1B68 +:104D3000E1BED9021FCFE37A68C921CA8B3DB30A0D +:104D4000F42CE0EB61CC67A9B9F87C96D7B3783E38 +:104D50004BAF51BFF052D463518DA13CEDC57C16D1 +:104D600078BFA161847C16114FB4E2A323E5B3E4BC +:104D70009E3B8FB7E7B3F4DECAF3597A7BF83CD693 +:104D800078BD0DD564678D34EED3634CD987FB5F56 +:104D90007171E7A7D34A227F86F92B3DA59AFEA021 +:104DA00081F4C2E9B9AB5123FAEE72713F36369AFB +:104DB000FBCD4C8D8716429B2DFEC4228A278BBCCF +:104DC0008C5E717FFEEFB30C9B7DDCD9F8DD10DAD1 +:104DD000F540872FEB9C4F689C7CB5743DD880CC08 +:104DE000ADB798E8530E64F338822B746CA02E8D07 +:104DF0004EB7087D87F891013FB9D2397C45E5026D +:104E00008AEED3DF1A419F6F64F3F92D3A64EAA466 +:104E1000303FFF631528472CFF75583B0F6F374C09 +:104E2000FE38E4480FE6B761C592273758F2C44E02 +:104E30009796FC600E39734E9ECCE176FA39790272 +:104E4000F2033F75E69443BD5EAE2F2C78DC2898C4 +:104E5000418EBCE70ADBE2344EB973213EFABCE571 +:104E6000CE4BD9F9C2FEE0722788B4817C936D9D48 +:104E700023F27B0F67A63E48F2D0A3F2757B228C0B +:104E80007E2700EB28CF3D788E9251AE574B146FA2 +:104E900010E722F9E2FB830FBBC2949FF630F03398 +:104EA000FA79130CA77D76FE7305E779D2C36BBF41 +:104EB000C6FD33C037FA5D172B872C39F161365F99 +:104EC000F739FA32399C167DA5D1337D5FC0A25FD8 +:104ED0006B5C8B8E193268C179E855D03586A32971 +:104EE0004E1D93E21807B1F2C8ACF1DEF0717B649D +:104EF000A4FB5556BBEF587ED7B978B01ED0299F7A +:104F0000AC87EE9BB32E4E7F73D86E754D15E513AF +:104F1000A88CF2092225E8CF1CF6D9FD622B1F6C64 +:104F20005A493884726283B0D3AD3C322B2FEDB036 +:104F30002FD73A67B6E5A76D18E17EF69BE7F073C9 +:104F4000F1DF3FC1EFB6ADF69A8FA35C047C99E226 +:104F50007B4E9487668DFB5D81A7D73DE693BECFE0 +:104F6000707FF2C52C7BDE55A7CF70C405385E2755 +:104F7000EAB17ABA8F17E5F7AA9CE7EA23DD7F75D5 +:104F8000DEDB3B77FF559CBF377BA22F13FC2FF254 +:104F9000FC373D1C3DD8C93EBFF51CF09A3FC1F11E +:104FA0003B057F4F0BF27B3BEF7BA26FE3F3EB18EC +:104FB000F7AB2D3BE730B683FEFE97416A03BD6C2D +:104FC000AAE5F45A54C9E8FBE3D35B797DC752FEE6 +:104FD0005DD3FED7F9BD8F6D51FE3D53E8D7270352 +:104FE0005E768CE7FA707F15EFB71FEF37219F567B +:104FF00070BB2B0FA3F70A8AEB2895D36B7ABC13EF +:10500000E0FD81A532C545F708BE083093E21CDB00 +:105010002AF93CBB2AE427C4F76816DD02F5CED98D +:105020002B27E3FD92ED229EB26FF1CA2730AFEF3E +:105030008340B9A0BB04DD7BED397E1BC5471E5AFA +:105040009227AD8435EE3B9839BFA5CAAF8A7E3131 +:10505000B788278932A161B9D51479ABAD4C7C8F63 +:105060003DA661FCE999419EB7DABDFA99633351D7 +:105070001F57CA9467D63578D47B19AEBB8EE7F537 +:1050800014A90929DD7FF1FA5DDC4EAB39EA31AABA +:1050900086B77F66F028D1DD76C0BB92E6FFC902F5 +:1050A000CE6EF427A0DF5E57CFC04C68B7775C9E0A +:1050B000143352ED46FB39FF752F91C577E8197D02 +:1050C000C7A1D33CE541B9D989E71FD0BEBBC6CA49 +:1050D0004BEDA17B597BE74C9E8379E2DB6EE0C10F +:1050E000D2AEF021F2937B6673BB6CAF04ED605FD0 +:1050F000F6B568D7D33DA6561E278232639CA81703 +:10510000138111AFE2DC8E525F60DECE86BE019C61 +:10511000A7A88E7FDFA2A82673FF17026EEABFCF73 +:1051200015A3F8E748FBF7AF3E8ECFCE2A7E5EC0D0 +:10513000589CE252BB85DFC5D4A891FE9DD0960055 +:10514000C7CF4E1733315EE6ABD348AFCB6183ECAC +:10515000503FD88F188FDB26C516637E486C92C6E9 +:105160001E278C98DE7118BF9B901746FADB24250A +:1051700042F85DE5D8381EDF3E1AD949F7AE0E80F9 +:105180001D4DE16096203DD51DCDA3FB504723D595 +:1051900083D4DF57A1BB2D8D8279F3F4A148C626B5 +:1051A0005DB6692BDA359D53641DF3363BA5FA28AD +:1051B0008E17CBF5501CD935651EED9F6B549E9410 +:1051C000AE8F6EF473BD30342172A31FD6159A7260 +:1051D0002A17E396DB6B5FD987FBF7C8FD1EA2A3F6 +:1051E000476A07EFC679F69FBDEA7894F8929FD791 +:1051F0003D5A7BBA14ED9E5D4DA772117FC5189F75 +:10520000037D585CC1E368A801C93E537BD8CD80BB +:10521000C7E2368D1969FAD8CBF8791EFEF92693C4 +:10522000DCA3BF67064F795A70BC252C7169809E3C +:105230007B309E65C999E23A96280079B87FC53BD4 +:1052400031CC937B646201DDA32C12EF4972C278EA +:105250002562BCFE375E598FED1EAD2E30505E14B8 +:105260000F0CCD4325515C759AE26C21EBFE47D4BF +:10527000D87F2BD1A74CDFA92C0EBFF317B88E8097 +:10528000AF8FF41CB4A7B899731D8189E67D7EC0E9 +:10529000E337A5D657C70553FE18FD213FDECBEFF8 +:1052A000651767FDC35C252DDFB644C40536498309 +:1052B000B3C92E7D80DBE163599CE45C7155EC6ED3 +:1052C0009E6F1BA57C5BE7BCDBFDE7F4AB44F7A856 +:1052D000F39BC4BD12FE3B3625E2776C9C741F0A1B +:1052E000E557755C95AAEF8B9E22FA7F5A33EECA7A +:1052F000F4BD877D422E6C12FE9835FED85C3EBE12 +:10530000557F54E7F4F8F4CB79D757C17AFEAAADAC +:105310006C12C63F778CE0C7AD0C70FACB1E000B49 +:1053200007F440FF6BAF79319FE56999AD4239557C +:105330005F95F024AB041E617CF2C560FC03E16F55 +:105340007B502E7D35504970AD98CAE3069D550FB0 +:10535000D2395048E77A07F913E5BB2F149330EEA2 +:10536000BDBC86E98744BC2506F8A7BBF3324BE5F4 +:10537000F56FCF253F077885DFABC1DCA4C9E2F725 +:1053800027CAF19C68D3DD227F56467C778A7980D4 +:105390006F699E0345629CFBB8FD8FFE05F62F17D3 +:1053A000F394D77DF76BA8C78B744E1729F8FA3C96 +:1053B000045FABCC083E35F12AFAA1DB271518486B +:1053C000370742E1B79BA0BE7C914AF1F8F21A0E72 +:1053D000C78156997E0FC85FA71DA4FB6326E88B83 +:1053E000347C1962DEA29A8484E75A462B5F17B494 +:1053F000F3A25C34C2000FD40DB1AE73F04FD208EB +:10540000FE22CF20E6169DC3C34A1C0FE877651D18 +:10541000EFE70FF56D4139B6BC8EC30DFA9DE0295B +:105420000A6B0751DF1785F878CB013F87A4145C1E +:10543000D9165C7532E55F15D56807D10FCE16F029 +:10544000AD0C7378FA5F3F3520F1F10C1C2F5BC077 +:105450009B2DD64F09BB05423FC0784FB912F57856 +:105460002FE7D414661CE2B3513CCB7ABFAB15F0E6 +:1054700000F8F18B79D86E37F1132C31F6B1CC7F6F +:105480003FC4488B5B54ECD66C75BFD83FD6C59FE4 +:10549000931F472A91D765E1D7ADACB2F763356961 +:1054A000F532BC5FC6E97DFDB5FCBCE3C0046E1FF0 +:1054B000A1DF718EBF91CEA7188F7505F1BD46FA99 +:1054C000AEA4DD3E6E716BC174940FC5030FCF9314 +:1054D000613D45F73259C9217A96CEC93F98EFDB35 +:1054E0006B12747F367B209287F2AEA4356F3A7EC2 +:1054F000FF2D7B204AF5EC815693E79F810B938724 +:10550000F97A69F394A29CE6F974AC55EB43B95669 +:105510009B0E27BC2F79B9672EF6DF7CF72BA39162 +:105520007F0B1CFD3D39DC7F287E195A0570FED3A8 +:105530006BB1BD15DFC94688F3A87C19CB621FC8C3 +:1055400063284B44FE9D252F3A27BC3329EA13F4E8 +:1055500043F9782C916EE73B4B683F5EB48F49E787 +:105560006D779ADA8D146F1A08F0785340D8AB3DF6 +:10557000CCD84FFABD86E77BF8F039E88FBE9AA306 +:10558000D3693FFB5818E9B9B8ED4FEE74797D73D4 +:10559000A054DC834E10DD6B255974BE077C4CDFB4 +:1055A000373DA0B6D2396B5F113FD73C3AE71509BA +:1055B000F159F41CCFD3B6ECE5E93589103EEF7A0A +:1055C000357A19F1E708F6A7656F3AD77349FD8375 +:1055D000240FC6469917CFD7FCAB55CA632D890255 +:1055E0005C55281780A40B01FE9AD87AA41B23CA05 +:1055F000EBC66A51AE82F26AB06FD70D94FFD295B6 +:105600001A776B05D8B5683F0DEEF6DC80F64A2BAD +:10561000582306DA8BA73CF83D95EED6E9F988E7E2 +:105620006722967D999070FCA29F9A642FD6EA9A81 +:105630008E719809EEC4E8F473BA0373DEA9A6EF7D +:1056400089CDBFB87CB291F409C222A7E991FEAA24 +:10565000A3A45F9EF08F273D64E9154B8FD088206F +:105660005F6E117CD465243C12C92BE05D80F3167B +:10567000942340C7FE222ECF410E733967E993BBB6 +:10568000B9DEB7E4678518E71694B7D0AFBBF689E3 +:10569000DC1B50AE0839EB0F1933F17CAE42C85712 +:1056A000A6C6249CEFC014FEBDCA80439E56B4F229 +:1056B00071BA428CE809F4D041A49B034509BA278A +:1056C0007EA0F5A8947ECFD4D27781D624C3FD1FC7 +:1056D00057C7E5E0382157BFE337387D7AB85C3DDE +:1056E000A7F784BCDD6A1E65E2BBB019F3B0FE5EAD +:1056F000E8F39E8A43E4176CBBF514E1D38A8786EE +:10570000443CB4BBEA2D7ABF3DCAEF01EC32A7CFCF +:1057100021F823CB35CA3FAD393AA70CFD8DA6E55C +:105720001ADA75270305D6F9977721DA93ADABC856 +:10573000FEF5897D7C28CC84DFA9919F75DFD26F2F +:105740000F60FF10F84592818DFA3C6EA473FC9EA9 +:1057500002E23B3A489D7D35067D07C2B98EEF05D2 +:10576000F87769FDD1E4C038DA5799AEF4F86A18D1 +:10577000F99DCBC1AFC36177AB61EF0478BFBB4983 +:10578000D6D7B354FFFF15E0F96813FDFC9EC2CED7 +:10579000C5A7B7609C6FE752F19D3307FCF735F65C +:1057A00079149A07630294C79CF17BFB55FE2CFE8B +:1057B000FD859ABE01B4E703551CAE170306C7FB6F +:1057C00020C7634F44263EDA3558ED457DE7B41BCC +:1057D0001FC97E7712CF6BB1EB9B0BD58B1D727FF0 +:1057E00082BBEF3A9277DF94495E31C6E59DC4648F +:1057F000037F57A325C0E9A94AC8EB0E57623FE6CD +:1058000015743CEB63EB8D145D1489313B5BE58CC7 +:10581000BF9F7628A0F0FD1FBEEFDC7E10FBFEA42C +:10582000C0C385F61FC32C684FF7C5378DB903E594 +:10583000782BF79FFB126F51DE51D1EC85E4F71CFA +:10584000397829F9034555A6EDF735B347F05B2BB9 +:10585000723CE78D078C248FF7ADEE203F7BDF6035 +:10586000E67B3105393C2FAD0FE4257EDF64A4F9DA +:10587000F51CCE7FFF14107437E71DFA5E469A9E22 +:105880007D59E859D2B7C52A8B2969790E1304FED0 +:105890009CFA93A971CFA53544E784BF7DE2FCE271 +:1058A000215326BC5B748EE7078857588729E890F8 +:1058B000CE377A58DC837C136BE2791E4EB827F81A +:1058C000E58B5A5F3087FB21E7E613FEFA443F87FA +:1058D0007B67EDFD74CF11E60B217D483FF88FD338 +:1058E000741FEA5917FD9EED8C675D098C69DD799F +:1058F00090FFDEA2FCA297E0FCE7C3FCFBEA093FB5 +:10590000B7C77EADF3DF2BFAAA7BB0FB0B501F7A33 +:105910005661644FC6417101BD9E16F4CA9EE3F5FF +:10592000955E5EBDF360FF321C6FD5733C0FF3CE06 +:10593000E76FBBF10B50BF6DC0457706EE7C7CBDB9 +:105940003606EAB7C7A53EACFF663AA3DFFB8CE597 +:105950006914E7FA4D60B06001E0FB83751E665C78 +:105960008671D2C182F980873BE24FCFC47E773CFB +:105970002585916D673CFBF82BA301AE3BBF215100 +:10598000FED7578E64DBECC2D3B09469F07ECD4174 +:10599000FEBB91B7B19E99888F3B1FEFA5DF3FB447 +:1059A000F0F9C1BA4A66A4FD6ED89DDF789A7ECF21 +:1059B000F0AE6F49F4FB8A77C9FC1ED13F3FEF5D23 +:1059C000F4980FD7B75EBBD48FEBDAAC61BBDBE2E8 +:1059D0002DDFC594A63BE207B599F0FE8E0307B50F +:1059E00095E897B95933EA9FAF1CB9C226774EEFB5 +:1059F00053C83F5893EBA1FBF5CC6786E64D18BE24 +:105A0000CF1FAC6336B8EEB0E2046A5C9B9BD6DE77 +:105A1000A573FFF72B4714DB3C961D103BC6F542E0 +:105A2000EC6FFD143FB7F66F8DF0BBADFD5B63050A +:105A3000E2D5A1C999E0E9C6FD00787AD6E954EE2D +:105A40005C17A272F73A83F6692FE211CA2E01772A +:105A5000602AABC7EFF3074C9E769CD764D6E3DD94 +:105A6000B2BC08AF172C89921F32921D63957B5DE3 +:105A7000D116F4213B77F4CF52C1EED9AB45EFC636 +:105A8000C897DEF1EAAC06A8FF4D4E64630EC99BD1 +:105A9000B0817C67F9E75FCFE17277D3688DF0BDA5 +:105AA00077E9E4C714CBFFC2B8DFD2954FA03D0120 +:105AB000FDB7E710DF86E93B5D23F52F585667EB0E +:105AC0005FB06C95D57F0FF5F79CBFFFDE65D7D82B +:105AD000E75F7687D5FF1182DF777EF80B9AA7DA2A +:105AE000E76F5E4DFDBFEAE6FB3B94EBA17CFA0E4F +:105AF0006F38E122FF99D1F739D4BC4B0FD1F7931E +:105B0000CEC599064DD4B3BEA772AB518EA5E86839 +:105B1000FA37711D7EE0AE743ACAA9CBB2F155AE28 +:105B20009967ABE7CF1E636B3F2A52667B5FB8E88D +:105B300072075DFA74CA83655C9F9A18E70438B5EA +:105B400031FC7B4DF5633CB4BEFB5FF452FDFE6B54 +:105B5000F8FAEE1FE3233E26DD05FB7EBF16BD32BD +:105B6000DD3E86754918F27A468F0EE4D4A63F379B +:105B7000647C9EA5F0DFB1CB72737DB9B974F2631A +:105B8000B1347C6E29067A80FADB399A2DCEB3B90E +:105B90007865A8256D9E4DC5DAA24355FCF92D68A0 +:105BA000C7EB91BFC3F9BEAA0D5D8AF6AB731E7732 +:105BB000599D6D1E4FC92A9A27E998C75DB2CA310F +:105BC0008F67D121F15CCC730AE964A47936975DC3 +:105BD000635F4FC91D34CFAF719EDAB4F594DCE139 +:105BE00098278BAF079E8B797E73DEF5944FB5AF08 +:105BF00067EC6A9AE7DF1DF3B8C7AE76CCE3A3790A +:105C0000F039CEC38AB81FA5B98756D2FEFFC0CBE4 +:105C1000300EA4B9A37F4D9754FEDE4B71616865C9 +:105C200062BBFF03D8CCA6FA008000000000000091 +:105C30001F8B080000000000000BE57D097854452B +:105C4000B670DDBEF7F69274773AFB4208378010E3 +:105C500034C40E840C203A0D41061DC0E00A2ED03B +:105C600061C99E74449C87A34E1AA28888DA286A68 +:105C700050601A04071CD0C0040810B001757006EB +:105C800035BEE7B8CC82CD2241884983A8F866F1B9 +:105C9000AF73AA6EFADE4E079837F3FF6FDEFBE3B1 +:105CA0003753D4ADFD6C75CEA953D52427819051BF +:105CB000841C8CA3E90842BE89715FEDB012F23DED +:105CC000FCFD90D03F2F21C93C4D21642EE17FFE89 +:105CD000C5022924A4D6CCB273364FCD5A08694BDD +:105CE000515A4901FDC70A9BF30A8590CE9622E3DB +:105CF000ECDC707F6A3AD7279F0CE6B0B6DF93F0F2 +:105D000038DE7124A78E8E5F16E7C0F9A8F993F5E7 +:105D1000346F22E4583DC1B45D26338BE9F713F5A7 +:105D2000740283B5F35D88ED4E4AF49F49345D25D6 +:105D3000F8BD025DD7F20F64320087F93087AEE319 +:105D400076BE8CB9BE5842CCE179784CC405ED42A0 +:105D5000BB4CFE75027C75F531A4D1A43191107550 +:105D6000BEFD09F9D3BEC96F0B76CCF6318C24E4A5 +:105D7000CE255BDF826A1F09257DE7D1F54E6B5E7C +:105D80002EF7A1F94E3938C369D5F4334D3E06EBF1 +:105D900036D3FFA09FE96E9AD78C7F57B93E7F0F0D +:105DA00091C2F96C42AE72F4E7F8E0E32A7E19F092 +:105DB000753B5D533A45E13D900E836207E26B8689 +:105DC00083B555E7E379502601988F144C26B950D6 +:105DD000928CF5DC504FE939BF19B2D9554CF139E5 +:105DE000E30111E11839DFE0BE5897218FA68D5FDE +:105DF000C9A4FFA5E73F7381BE9C78D9782A5C557A +:105E00003AB863DAD8674F68E863BAFB86674FE849 +:105E1000E0345597BFA76EBAAEFECC0525BAF21294 +:105E20006F85AE7CF6927B75F9B9BE0774F5CB1A17 +:105E300017EACA2BFC8FEBCAAB362ED7E56B9A5606 +:105E4000EAEA7B5AD6EACA0DFB86DC44281C1B7E94 +:105E500027121385E3D7D6934F5D9304A9E404B8C2 +:105E60009FAA4F43BA3E5DAF605A0BB4370AF8673A +:105E7000B8D94DF1E48909959278421EF68D59B250 +:105E8000640CCD1B69F9684AEDBE714BBC99842C3A +:105E9000712848F762A3910428A90A24A19BAE4364 +:105EA000A2A63C7889F246890486F72C1783D1BFD5 +:105EB0007709A14119741DDE4F4D6483D093CFC380 +:105EC0007C49FA90B4DECB3B0CA4BC49237736382E +:105ED0000C389F64C7B80D0E4A0FD546C6EFD5DB08 +:105EE000D2C7113BE40383EAAC1719AF894E2615DC +:105EF000FA61FC52E1EF13E65FC4DF001DDF0F8E95 +:105F000073AF77D0F13AF68BD3601E247030EB96E6 +:105F1000A130BE6B037C272DB49374CADFF5AE6746 +:105F20004F5C41C827F51331FD7D7DF1B3276442F5 +:105F3000FE583F0DF347EADD9806EBCB313D565F47 +:105F400087E527EA1760FE64BD17D353F54B303D54 +:105F50005DEFC3F28EFA46CC77D6FB3155F980CA95 +:105F6000A399C5C0A7C5C506E0D37916C2FF58FEE0 +:105F70001C5F8348FFDD867CED4C03BE3E67FD66FB +:105F80005006A5B7739F5062CAEE1D4E9174D73B61 +:105F9000FE5C06C05FA99F124F62CF724B0CC38F8D +:105FA000C54026122A7F1EBFC248243A7ECC1B570A +:105FB000AD13B3F1BB04A443370EE7545B94FE0763 +:105FC00012C4D7A5F0A4D63FF9E29F0B67E5027E85 +:105FD000FA239DC41C14EB18DE5E7602DE2E053F0C +:105FE00089F357241C8537FE9415A4F5BF4C56E160 +:105FF000D99645687A8BA3F814D0C1B96613AEEB75 +:106000005C6BAC9F401F8E24A48BDEE1C6E651B5CD +:10601000D1E2D3CA879AA6789F5E5EA4FBB4F2E26F +:10602000DCA197EDC0F7F3D244DF89E1401F2E4E8B +:106030001F8CEED4FE6B9AB27D565D3FFAFC399F01 +:1060400030B109E5BC1277EBD0DEE7392FCD88E31C +:106050009CDE38200EC63D5D6FF6C1381DF50E1F63 +:106060001B37CDA7A5CBEA05B1BE1389E1F9F5D65B +:10607000EF3F7B7E843493E36682A0FF7E40EFF5A2 +:106080007BC58774DE580CF4D12A7F03FB4E4C8EFF +:10609000BAEF489857FBF534895ED3D5F07DB36EDF +:1060A0003CDA4E39A9E2A9FFC5F02E9193EA3AA94C +:1060B0009C1C4A6537D0292566C4B39BF61847FB5C +:1060C000EB92AC4B043A8E295EC1720F0C44E9A9E5 +:1060D000C61C34BA1504771BE859B346AA7CAFDC5A +:1060E000F1074A725FFC56264BA1FC2FB4775A2E5B +:1060F000F3D239A4D84EE878B39AAB26819CFC62DF +:10610000C78FB99EE22B84757F490C13814FBE2443 +:10611000FF6E1FAED1CBA6C41BD9FC96B0FDD94BE8 +:10612000FF83F5513D4DB75F9735EAF3A5E4E614DB +:10613000E087D21532F1D3B957C07EAFAE9BF2FDE6 +:1061400075F14C8F2B23758B414F592A936980EF42 +:10615000590E22F5A172A266E7EAC2129ABF2DDE9D +:106160008074759AEA770A954315094C8FA94CF209 +:106170001B5DB4FC78F3F0DBAF21D0DEBF18E49AEE +:10618000D7469C1B484FB8CF5EA29FDFA5E61F39BC +:106190005F4216E17CD579A8FDAAF310370A2E7F5D +:1061A000147D7676BC10D693697A5FBC5E7F5D0005 +:1061B000798D7EFB70447E51445EA51399D3892965 +:1061C000DEBD203E19E8223401F53442E923375C74 +:1061D000CF18AEF7F0C5EA99A09E88F5165DAC9E83 +:1061E00025DCDF63D1EAD5ECDCB2C34BE9A9F2F5DB +:1061F000E7EC84CAF32F245F8A937EAFDEF0A81DFC +:10620000E0744AF2DA01DF5FF8C589D1E0B5AF1B6F +:106210005E2EAB007604923685FBAB4F4C013DE918 +:106220009B0DB243A4553C1B4D0113A5DFDAE68A52 +:1062300049240FF34759FEB1B322E45BF4F8ACFCF8 +:10624000C573298A0DF1C0F46D1240BDA376FDE738 +:1062500013408E7B4808E930B21D8C7F2101F9BEC6 +:10626000C418D7B39CCE13F5640FE7334FF313670D +:10627000453BA437B4039F7922E8A8BC7B7F091A69 +:106280008BE97C5E8FB7259DBC8A667F407E00F2DD +:1062900040850BF133BDA261D30B7947E9BC3AD6F7 +:1062A000FFD62EE46AE508A3C7734DB37FBE5BE952 +:1062B0005DDE7472BB28DCCE8FED9416A607915676 +:1062C0009656CB013BE89DD56B6527A55452BDE59D +:1062D000E5575E047BED5313DA6B555BDEFA6834E9 +:1062E000CD576D959326B1E5588594307E3CF47F6B +:1062F0000B8685F151F9ABB78CCA50F6FDA18430FD +:106300005EAAB6EE3792A13DE158D4B4DF18B44688 +:10631000C14FD3D109A0B7346CFAD608F6D717FB12 +:1063200004929ADDB37DF9DAB7705F0438213E3903 +:10633000BEBAF1D7036F8129BB0BB09E03E4E5A57C +:10634000F0E6E372BA66A78DC4D37994FFDEE49FCA +:1063500004F87CED3E3BACA75DAA6374BEFAD11491 +:10636000171DBF5CF6A6383065DFCBD7DC8FF4573E +:1063700026D4A538909F5CE90694DDDE7458E7DCEE +:1063800055B7E13A4B891BE9B07CB558ECA7E9D782 +:106390001299B8350A9F1426303E695F47914BD752 +:1063A000D90E7A3FE8DBFF2EFA37A07D7A2F01F96C +:1063B0007F3F5F33DD2931FFB599E1CB9A6050ED26 +:1063C00045B38E7ED73FD606783ADDD7950AF3A43B +:1063D00070F072B809DFD37EC50FAE4F6578228AA0 +:1063E00054C8DBD1FDA008BE43FD36D965C9D3B57D +:1063F000E3F2938D3F9F8F4FE71D03FB5B7B0AD535 +:10640000EFA3AC6F16AC0FF745BACF69E84CC3EFFA +:106410008CFFD73FCEF85DE57FFFD489507EFE43E9 +:10642000C647D00EF6133AAF402A96EFBF5540F953 +:10643000602281687CBE5EE67CAE2FF7507E053F11 +:10644000814A2774FE9210A7A5173A4E02E201ED89 +:1064500095D215B4BD56BF8171B19E31FC5DB3AF0D +:106460009471B9909F40E5416C581E9055C997A50D +:106470004756CBC40B2A67F5A726B4C7ABB7C8C528 +:10648000B0FE339B0F7E7427A5F3334D2ADFEAE578 +:106490006A24DF966FDB20009D46F2ED9972BA8B7D +:1064A00047E35BFA3D2ADF9607FF9FCA55157ED367 +:1064B00013F4F294CAC77EA042F406C748F9F8352F +:1064C000E85BC93DE523FDFB9014F6A44395FE541B +:1064D000BAA31A5C3F90EBDDF4A9D25F377DAAF432 +:1064E00017B95E3DFC22CBFB838D44E9A47817D518 +:1064F000E8283EAB5B05BF09F9DCFB769F0284937D +:106500000BB737E27BBB4F9236EF8FC83745D47756 +:1065100045E48B23EABB23F275BAFAD52D078D0427 +:10652000F11FD0D5332D78891C8F620FAAFB8FA75E +:10653000F9ACD10B7491193282DC931751D50DFC53 +:106540006B7B45F4AF7529217B02FDFEA885D969D7 +:106550005D0E9E8F67F950B27131C83DF57BC84220 +:10656000D03EEF2A0ED9E335F6FFD156D1AED0F2A8 +:10657000A09F4CD4FA11C2F369407C07496FE5CC67 +:106580006FD81563CFC3F162B2FC407FD78BD6AC16 +:106590000560EFF94427251F3267E11D7642E9AC1B +:1065A000AB75C04DD3E8F7B9EF88A06E53F4B8A42B +:1065B000744A37B3391D9F22DEE7C7D0F5CD6E652B +:1065C0007AF89C65D1E9BE92D72FB5CE37827CA5EB +:1065D0007AF431AD5FB4922C43BA2B5F15F1BDF55F +:1065E000C7C81F9511FCE1E6F6C35E953FF2493E30 +:1065F000CA174298FDCBE5F2F562EE4DD3281EBADC +:106600000E89C4A4803D2B92C5B0CECD821FFC055F +:10661000C49B8C7C564B42280F553875001F0DEEDD +:106620005D4E756CFF53E183402F3BFE90F7124D9A +:106630003B767C3A680FE4777E9CF507D2B37ED137 +:10664000BEEF66C07ED6B5CF847EB1AE7DBFCE7ABA +:1066500010F2BB4DE817EB5A6472011F78F7D9FCB2 +:106660005740795F663F34ECFD362F88FBEB23887B +:10667000B75309CC7E39D7FAE7234212A47455A048 +:106680003FEC8B453EF2ECB6A0BDDEB5F7DB42B782 +:10669000F59FB79E5A2371233DDAC8B46D40BFF110 +:1066A000CC7FECD933EAE58574FC9AE6FDC6D9B413 +:1066B000BCE88DBFE681FCECDAC6F4A24E39B886A0 +:1066C0003809F92AA1EC7119FC7CC04C19843C9D55 +:1066D000B8F1066F6E34B83038745138C0BA285CDF +:1066E000CA41EEF7068F984423D2FBBF1E3CCECEA4 +:1066F0006072ED0704FC4261B8082EF6DDE6370B48 +:10670000B87EF67DDFB7792077CE342D447DE55213 +:10671000EB1E92F8AF4A07FFD5750B81CB59F7C432 +:106720007F597C33FA7F2F41C17946F2414F3ADFDE +:10673000F913CCBF6673E27C2F93FFCBFFB7E17DEB +:106740001BC5BBFDD2787FEC7F2CDEDFE178B7394B +:106750004C20CFF6FE15FDACEAFA2FB5EE57FE87BA +:10676000AE5BD5E36F34D41D9E4AEB1F268115C561 +:10677000749E6F665EFFE1545AFAEB5EF4938F12DB +:10678000991DF86B503EC0FE4B13FC1BD0AE6076DB +:10679000531161FB7A514E19EA1B45394FA0DE4077 +:1067A000A4BAC3F9141E3766CD752EC5EAC33E716F +:1067B000D3FC8FD2AF75A2FF30C27E3C2810974029 +:1067C000F5D8A22B6F380476CCF84C3960CAC3F4E4 +:1067D00028A46FDB27B2EF56BDDD3409EC1D8D1DFB +:1067E0007883A22F9FC0FB9B48E61D9E4AC79F98B7 +:1067F000293AFCD06EAC4F82F54CA2CCEDD39C1F55 +:106800004D88E86F1BD531B5FEB5BF177EE624660F +:1068100067FE9A8E9F0FF0CB94D17F7849F801BC28 +:10682000115EF9FEA5A05B494E84DF8D19351C9ED3 +:10683000CCAE96787BC9BAB80DF85622D42E667ABB +:1068400019DAD3AA5DDC1B9C09B7B3253EA40A77ED +:106850002993DAD9FAFE101E2A3EFE5E3CA8F8FB08 +:1068600047F1F17BC0C788303E32CF3B24E0CF22D6 +:106870006E0F8C3FDF26623ED329E1F90BB707C6C6 +:106880005AE325B007AE953E10812FCBCCBB2AE151 +:106890001CC1EC1490AE077718D0DE31170808F74A +:1068A0009C4609F31F181C2340D19E72CDCE330F96 +:1068B00010F027BB8C4CF12E66FEFCBF7CFFFD98D0 +:1068C00042F0ABB0BF32FABFC914BE735691400C50 +:1068D0005DE75C897821C4612E5DD4319D3F589F6E +:1068E00087BFEB52C2FD5CAA7E6F72E49F9DEEA44F +:1068F00072EBD81584EC829439FB25ADDDFC835610 +:10690000062FCF61E2EF8F72C125166BCED9FE2D17 +:1069100089C98F9D7FDC361CFC6763BB72E3983CA2 +:106920002D30005D7AB85D708E287110AF70AE7535 +:10693000401C9E231E126DEE287E9B4DDC9EFE6544 +:106940003D3A9549D77AE213C16E2221F4DF7AD716 +:106950009BA39E07CF4A3270BAE178A37F62219C45 +:106960005BB0F1E7D2A6715ABC754CFA42CAEB890A +:1069700007F83BA6395FF947E10BF63BC077932553 +:1069800038A1388AFC98CFE137E5C077E8EFBCB290 +:1069900075AD01E8F7CAF506DDF9647512B7BB8677 +:1069A000916130AF29072CB602C0CB21D169A1EB90 +:1069B000F3B49E35BAA39C7345C213FA073FFAABF2 +:1069C00049EC5C608FDC341BE0BAE74B33F152FCDE +:1069D000EE32FAAAA2CD332985C9B9B9A4E9BEBC61 +:1069E000EC7F3DF88EEDB206C6819DB99E70BF4624 +:1069F00024FD11A4E3731B891FF653B04B412E9C59 +:106A0000DB4C703FA7207912EC6ACAEF3FD4FA69D9 +:106A100006B76CFD25E801B5AD82C340CB6BA5A0E0 +:106A200011FCB19E967811F6DD7C85B8F07C587229 +:106A30000CBD55C317AF264908DF83A3F7DC05E378 +:106A40007ED56124A08FB8DE0CD961DFFEAA75382F +:106A5000F2416FEBFA553DA91C2F433F4C1E46D225 +:106A600043EEE6185DFE1AD19D01FC35C5149CEF7E +:106A70008C82BF49C98CCE2E5BBEF9FF3F936F1F3E +:106A8000AAF2CD2D166BF8282999D1BD46BEA54690 +:106A9000936FF3042515E03E6FEF8054C0EBBC7795 +:106AA000E4E468F26D4B3D3BFF7B9DF223A45DCD9A +:106AB00054BE5DAD916FCD54BE65F76CF7B7CB9505 +:106AC0006FFEFF1EFEDB02F22DCA7AE339FC54F999 +:106AD00096D77A14E55B5EB381281ABF9339F952D1 +:106AE000F24D48BE15F4E143B233360AFD6CE1FACB +:106AF000F7EB3C6E0FC60139F7A364765E7AB97284 +:106B00002E3D85F1C925E5DC7F139C5539376F3B58 +:106B10009573D9D1E890C9B979BBA89C13801E9907 +:106B20009C9BB79730FF5B847CCBE921DF08D6AF15 +:106B30000DB0F69E96EC17EEA6FD0D73C94E33AD63 +:106B40003F2C2CEF4668E5DD8F922584730F797713 +:106B5000E8F2E4DD762EEFA81CEB0FF235923E9CB6 +:106B6000AD31BAFC9E51ED9B7F05FCF2AE88E78B00 +:106B70001F18D839D07BA3DA0B80BE56F2F97838CB +:106B8000FD75D67BB1FFA237D9FA6A3633FF776D30 +:106B900033D30F6BD78B7E85FE73C2E8EF8C30FF4B +:106BA0008ABD0249A5F9A926DFF35690C1BF900915 +:106BB0003B172393F235F430676415FAF11B2CF67A +:106BC0007584F2F11C8998C15F5F659DF005F8E955 +:106BD000AB4632FF7E15FF4E78DC801A0759DA7219 +:106BE000EFDB7D48CFF881292686C7292F0BFEB51C +:106BF000D910BFA42FAF8A887F7C8AAF73AA1844AC +:106C0000B890F7C5A8710C4F45C2E31087075DBF68 +:106C10000E1E7E212A3C284627E5A784D75FF16E09 +:106C20007031F8F32B560A78EEABC223729D2A7CA2 +:106C300054FF74156FEF69BD17CFFD23D7AFC2AFF7 +:106C4000C7BA557846ACDF97CCCFBDF2C97088A7DC +:106C5000A1F480F2C3FB1B0A073A4EF1D82B52B5C0 +:106C6000F2F8790E87E1BEB145E904E046EA807E9C +:106C70004A1BEF7D3B9DAE7FC427CA30D826AF1993 +:106C80006D72C339EA264B08E59B4A5FED2ABDF3D6 +:106C90007EF664D48D437BBD4570807EE10958103B +:106CA0008E1E4A67165AE5E0CA6F2670383A4CC8FD +:106CB000577CDFA17037D0FA13D47D88C21DF866E7 +:106CC00078EB593CCF2D20213C2FA96D149C01BAA3 +:106CD0008EDA16062F55DED23FAB161F51E8518AC9 +:106CE000468F049CC485E17DB08AD79B62F27D0407 +:106CF000E7305328BDAF25613CE6D0FF008F917887 +:106D000052E17929FAFC9CEB1F5B008E5680578874 +:106D1000E95101BA2FD8C2E51EC9AB8363D18B17E5 +:106D2000187DED1514384FE88613D02B2D1FD1CACE +:106D3000E815E0A600DC5B4B44C89752F82666F7DE +:106D40005C279C5F6AF9B762EF51D6FF6AC149A21E +:106D5000D0AFBAEEDEE8F71FA5DBF608BA7DCF129A +:106D60003A3C1CE876AFC0FC08ADF1BA7347530A51 +:106D70003B77DF64A1F40DE75DEFC8CE754A4F3E67 +:106D8000BFC0E109FABFA2F14B0D8105C059E04631 +:106D900033C69FE13CFA33FD522B5FB75848F2AD42 +:106DA00005BDF76FE4F6406FFA8D9A1F0AE381DCA8 +:106DB0006BA1E3E584C78B94EFAABD7FA97525A6D7 +:106DC000FC63EBEA8EDF246D78FE648A773F98845B +:106DD000FE1F169F743B8F4FA233403D4B532F2D08 +:106DE0007944EFF5489A19F7E1FB785CFCF5A29538 +:106DF00078E93ABE72C948A77497FEDD1890CBE3D4 +:106E0000E83E4293AF0E8FF8F86E2C17F13CEAA6DD +:106E100077136BE09CEE261046F4FB4DF902EEBFB3 +:106E20001F4067A3408F3513978993302D1FF98337 +:106E300078F41BE5AFF71529949F866DF43740EA87 +:106E40002C0A25BD07F01B2B12805F9B2BB108F687 +:106E5000AFFB3E27F9A282FB2CF633EC1049867A71 +:106E6000A35DC9680E8C6A5E5104FED1A907AD56B8 +:106E7000A0F39C5506E2D6D0EF68E26F8073F8511C +:106E8000275CB700FF95537D01FCCEE5AD6B1BEC95 +:106E9000905F253815DABFC7EB9E60A7F3DAD2788A +:106EA00076C255C087B41E74E359C5EA79D60B4E35 +:106EB00008952D6D5D8EF138A5EB05E280FA7E8197 +:106EC0009859BF7E33ED77CB2ADA9EE6CBA03DF40E +:106ED000BBFEEC87B7009F1F1659FBCDECDCBA94C4 +:106EE000B653805ED7DF8BFD55AC12481AEDAF7CF0 +:106EF0003393FFE58765279437EF5F89FBD8243A02 +:106F00005E7A36C8FBC078C893E18203FD9D99770D +:106F1000225F7771BE261DD398DC10789EDB0DAA08 +:106F2000DE742085C507973A171A13693FEF8D4C19 +:106F3000CE8630014FCB593C8F3E41E1ECA670FE2E +:106F400080C7731C1C79DC18D4EC3F9FA50C403A19 +:106F50009CD33216E31CE692628C7398328AE96BFA +:106F6000EF5F6BF10B745EEFCBA14CF87EF05A1320 +:106F7000EABF9D5B643C2FEEEC1B44FF74FB2A9937 +:106F800040BC46C32A11E562FB66B68F8BAB6F9B94 +:106F9000900EF0DB2038416E1E5C5564847DADDDC3 +:106FA0002F60FBA2D5F7A7303B86C943D56E2B7562 +:106FB00054E8F68F48F9A6CABF1A0E87483957A376 +:106FC000EE331172AE06CE9BED90EABF7B8895C979 +:106FD0003FD0FB01EF81EF907E6B0FCB04F47EE19D +:106FE00078C7048CDB827D93968F6A155C70CE5FC8 +:106FF000FE89C98FFAAABF64E64F417E7F6A22826A +:107000000271F014EE542E8C3485FEF82CFDFEC572 +:1070100007668890A17452827056E3450B36B0F82B +:1070200096820F56A494021CC627A29C2D6B14892D +:107030005B232FBE105CB7DCC9E4B16383461E1529 +:10704000187DA5B07F3952991C5436C8103342B60A +:1070500073F944F56917E80D15BB96A71869BDC506 +:107060003C1EA462EFF2142A1A4803EC5BB47E853E +:1070700091F55FB14F70ACD5F4AFB657FB53FB3110 +:10708000EED2F733602FCF5F663FEA3CD4F17BD37B +:10709000C747FEC7851502ED6FE4FB2206298F3C2A +:1070A0003E6980F6BC434D55FF6BE18706E2D2C0D6 +:1070B0006DE41F63884B4317CD23287F53BC4D6E6F +:1070C00061FA50F388A3C69A02CC3B809F6BB99FAC +:1070D000B6763C3BB76ACEFFE011E0EF490502D23D +:1070E00001F1BA8D8949A8072970BE5056C0DA97B8 +:1070F000D1F6C077CD2B191F5279A080BCA85DB501 +:107100007C02D65F2F28D07FF3DA12DCE7CB478AE8 +:1071100004CBD71F45BDA3BCE56812F02BE5CF1506 +:10712000B0EFD68E3139803F54BE53F9F87D99C502 +:107130008710B36328DC03284B51A2F2AF78983054 +:107140003B75B38C7CE719C9F8F2FD2D22F2F3C12F +:107150006BEF98007CD8B941E8858F299F1684F998 +:10716000545CCDE275CA36317BE5E02A261FDA9BF6 +:10717000999E58B45A9E0CF9B27765C2FC5E4C1FBA +:10718000BC5C7EEEA1A76C8CCECFBDF1EF14B9E94B +:10719000A3FBE8FC6E7A8DCE5F09C3ABE8BA07ECBF +:1071A000E8A7BF6E3AAE579543A5128B679AE35B8B +:1071B000C8E27D2516F7F677CF2B621E8FA5D8C2C1 +:1071C0007244047A8F6771D2EB65A4F7487EFC475E +:1071D000F9E89FC5D7DB391DA9F311F7B2F61057AF +:1071E00016A070FCF5E69731AEF5CB578F4E013CFB +:1071F00057EDA1F44BD7DBB9D9460220B7243FEEB7 +:107200003795CD22C68F132950788B4DCB9F2C3EBE +:10721000A9EA751BD24DE53616775AB9E3781EC632 +:107220008B2C0A61DC95F755AE6F7A837940DF9538 +:10723000128B938AE4F7B1A94CFFECD8153B0DD61D +:10724000216CDC8FE7AD954D77C8407FDDF223558B +:1072500056EBE139A697D22F9CB3C3FCA60ED5CE30 +:107260006F21E2A96313E3FFCA16D96F81F96D5C40 +:107270008BFE6CCFC6B3181F5FF4FA16F423785A4E +:10728000447D5CE44611CFB3688AE75691F189B535 +:10729000CD3578EE56DBC4E3FF22E2E2AA5EDFBB27 +:1072A000C34B4153F5AB5FD8411E9C6EDB60077842 +:1072B000D2FE30AEF0BAF3922E3EAAF77860973E37 +:1072C000DEB0E9711E6F38B99DE4F58C373C0DFFD7 +:1072D00080FD2635225E7363228FEF0E141647F170 +:1072E000E777DFFBD9F2F51A8893EFD876660DCCF5 +:1072F000BFFA6F5FAD81F826B2CF82FB94E7D5DF8E +:10730000615CB1DA6E612AA3B7CE4DBFC0B8ECCED6 +:107310004F4D68EF74EE6DCF82F8B6CEADDFA5802D +:107320007F6EFEDEEBD17F397F7B512A8922EFD53C +:1073300014E8D37F1971E191F838D87C10E3B0BE1E +:10734000FCC484F2AD3B7EB4A986C5E52A3C6E74CC +:1073500073F4387C35CEB1B6F9969BAE0579DDCCA9 +:10736000F4BBEEB8C74BC58B7E48F17AF565E06F8C +:10737000338F0B6E9A1C355EF44BF807C5D3CF5391 +:10738000F5F1A25F37CFFDF98B50D69CD86BBC6866 +:10739000E032E0A6C6F957A7BA5E4D053EDA16EB15 +:1073A0004D6378F34F12400FFC3A0BEE479C92432B +:1073B000180712DA6B7240DC63E5DE8F915F3AB733 +:1073C0007F80FE56C2E3EC3B49F71F8B8716F83AE5 +:1073D000D7DB589C29873FC4A12A76FCCEE34D1900 +:1073E0001DAB71A8BDC59F0653F9FD617EEFA08658 +:1073F000DA4D2C4E3D1C972A8C047C1DD5C5F5AA70 +:10740000EB8EECCFC1E56838AE3A7A9CAF1A47D81C +:10741000135F6C5F51E3A63BD7F2786BFA3D7318AC +:10742000C4C9B1FDDCE3173E8E865F35AEFA0F119D +:10743000F855D7D71B5FA8FC79A979FF57E1F26E01 +:107440002AF367ABF0E9F84B7439FD0DE7776AB7BB +:107450007E9DAAB16F6772BB55859B3ADFC54D4CC7 +:10746000AFE8D8C8EC8748FEA6EB71458BB397D23E +:1074700098FE5BDBB23F0FE450C7815D9CEE185D68 +:10748000D76E3ECAE274A9DCF66BE536617EE4C8CD +:10749000FEECBC3F4F6BF4FE3C9BCF46EDEFB4E4FB +:1074A000BA03E67FBA8DE951A79BC489FE28FD5F28 +:1074B000E0FB52F7BA6D468C9712ED31A84FCDB76D +:1074C0008DFC242E095223C6FD342CE471420F3B5F +:1074D000D300CE0DB61B09CCE751808FC6FF203BF1 +:1074E000DC04F43839ADB84054C2F355CB8D4906AD +:1074F000E2D7E25F0A64827C3F92DF2E437F9F45A2 +:10750000F84D3E93C8E2543AAFCFBC8273A1D2BBD0 +:10751000DEADE6DD0F893A3F47AD297404F477F21A +:107520008605FDD6E23E8B17FD666B2CB8CE83DB5D +:10753000BF7D05E0D5F9731361E7089430A85C2896 +:10754000E3FE8BF6EDDFAEF933E899D0988E5FB6A7 +:1075500086D607FD7A732CDA035DDBE2F2509F7C5E +:10756000E3C1292037CA600F033DEFF5547F03EDD7 +:10757000EF6432CB9FDCD217EF13546DB361BCE1E3 +:10758000C1ED3B6B41FE77BE1E0BC7D1E44B39F812 +:1075900037C87BF6C491B50AEA818A76BFAD2092DE +:1075A000A2D5F3AA20AF8B7F2168A7A33F8ED27309 +:1075B000554B1CDE1FD1D4E3FCECCD60F7650219FE +:1075C000C077549FD48DA396DF9AD69FDFEF0DFD31 +:1075D00084BDAFC0EA7B8CA15296F76530BE6DC307 +:1075E000FA252ABDF2F29EFDB2FA33D3FAEBEAA9EC +:1075F000ED6B4DA42E1A1F54A709FC7EEF5F0747C1 +:107600007BCF22CAFCF1FBFD02F11A400FD86AC100 +:1076100038AE6A636010C4B7EF30B2F3916A7B6032 +:1076200010C4B7EFE1F2AF3A86E6E9F70C3E0FA8D7 +:107630000F79620EBE06F8AED969214BC17E7FC3B9 +:10764000E6023CD7ECF8F6E44B0510CF168B7EAB88 +:107650009A37FE0DF15F630ACC00FA0F6D35917514 +:10766000B47EC7D677B2408FE8900359091739F72F +:10767000A96932E9CEB1D5759CAEF70F84FBEBEA70 +:10768000BDC5CA5EE4C5DE34A68F2E4F733D9D8610 +:107690007C6D75A0BC86FE44E8A76580F65E73A588 +:1076A000125D8EAD4A9375F768C5F03DC555D0EFB4 +:1076B0009724B83883A2A44608E1F979E5C6B34314 +:1076C000C11EFEEC6757E1B9D667C6D05090DB9F6C +:1076D0006585866AE5F1A97AB322C9E897C0B46BDB +:1076E000EDD9D20C02F1839669D1E4D396B4589CBB +:1076F00047E543B151EF83EEE6F4B61A6830998D51 +:107700000B7E0875DCCF8C7E23CC23375DC1F2CA9B +:107710004CBF11BE576DDC3540F7EE84E4C37A945C +:10772000BF101E156485B1C0DA53AE542CB02A12B6 +:10773000DE8F96FEB39BDEC4309ED0C909716A1CF1 +:10774000877467423FA87A1F40928BCD002F232970 +:10775000764822A0DA877C1A439A30B5527584EDB8 +:10776000437504E28A4EF1F35B93A43C0DF2C374BB +:107770004844797E29B8FD3ACD8EF3364975C489DF +:107780007AC72407E8D582D74DBEA7F4D050BF7181 +:10779000C00976FEEF8278380C8DA3F3B33BDEFE92 +:1077A0000EF4034A6768677BAF23FE063A9E646463 +:1077B00079328EF8A39DC777703C10EF7E943F56C8 +:1077C00012FE0BD17C2C4A283A6EDCDF46829D6B80 +:1077D000759000E84DB1561288A5A935573AADE528 +:1077E0005F3B61F9FE949C41AE39C6E8CB23E99A30 +:1077F00038A5F3DD7251C4F6E723DA9FBF587B1535 +:107800001E1EF3806C76FF9DC12586AFC13BCE79ED +:107810002108F0C8B33B1B008FC6D09107011E7929 +:10782000566627263512AD1D37209DC9AB4704B6D5 +:107830005FD2BF62ABA63FE230A3FFF4710EF7EE5A +:10784000FAAA5FA5477D8B0470ED51DFD25BFD98EE +:10785000E8F56DBDCD2736FA7CE27BE9DF1BBD7E06 +:10786000ED1B1FBF1750E023931B1231A8F7A00791 +:10787000A483BD157724A58451053B2788C05B0CE4 +:10788000D01FA58798819AEFF07FB91AFCF58F82F7 +:107890007F1240BA2BE1F3A1796B3A9DDF9D7CBA50 +:1078A000E3D7B373CCBBE7333FD29D0FB1FB424765 +:1078B0007FC6EEEDDFDDC8ECEDBB17B0733352CE03 +:1078C000EE0139E87F30DE3DD009C5F73D3EC11FEE +:1078D000C886777022F4D7EEF776EE97A07E4984BB +:1078E0003F46A527F5DED26CAE5F6773FA9C4B422C +:1078F00036E0FBC87BF4CD692C2E8D9A632E58DFC1 +:107900005D7C7DEA3EE05D4E72E05D00D110E38477 +:10791000F31191DF5B257623BBB77A6B824EFE9C19 +:10792000CB51E260BF236FF2EFFC3DA2793728A96B +:10793000DA7B5ED285587C7FA44176A6815C942F49 +:10794000FC9828942F8C17061045730F8DEA77C882 +:10795000ECB283A01F4772149332D00BE3399D25FC +:10796000DDD8AD87BD4FE1326FB982F760EF486770 +:10797000FBCBD28CE2B94017A27DA4D36DED895721 +:10798000EF76B6BE06585F76CF7937189D4ED44352 +:107990006FA41A04FA7B9C66988F68523E56803F0B +:1079A0007F2B13B0FF7BC281E1F35C52821FE25F49 +:1079B000E6D8971E01BA5D56EFC073B425F5399825 +:1079C0002EAD4F433D7471BD1353152E66A7CF25C1 +:1079D00052389B07B2FECC0E37D333E83E04F11782 +:1079E00092A32E007973661D01FDD7D20D1F1FC211 +:1079F000C7D89D7763DE04799ACA8D9310BEB43DD3 +:107A000029033F6A867B19C0C7A25C49140D5D98A3 +:107A1000D286E9F23DE0A6D2C71606BF2705461F6B +:107A200091F07B526E53E0FCF9C91BBADFB541F807 +:107A300051759FC1EF37EC7CAE57F83912509F9DBE +:107A400053B8784603FDF4043F877CAC7E24C2EB38 +:107A50007188EB1A0CF6810B5311E047E9C894EBDF +:107A600025226D6F52D89C4DD66297A180D12EC031 +:107A70004FB432789AD2EAF03CCE6C65F012AD5E2B +:107A8000848B6C65F012AD8CDE8C3C2F01FC866320 +:107A90007BFC4EE1D79C3E02F0305A072F63D2B8F0 +:107AA000CB83DF4A0A3F3A8F24CE5F917048827BB6 +:107AB0000AB961BEEA4DAF7B8EAE1FF6F117287C86 +:107AC000204DEEC57E4CCE607234C950B75F06784B +:107AD0002410BEBF7849662161A18AF097E6250A85 +:107AE000E405360FB25E8F57D12145BCFBA6BC0022 +:107AF00074B0E21DD900E7A4E2821FEBEE938AD3B3 +:107B00005CF10AC2D32DC0FEFC44BD82F85B0E7846 +:107B10001C0CFB23B3C71EE5F87C0CF804F1CBF872 +:107B2000E349CE2F4F733E6970B2FB13CB26B2B838 +:107B3000ACA47C037F0F2D40B4714FF1CE2662A41C +:107B4000F3421D5BC134807AC62726FF15B45D6CF5 +:107B50002E71019DC47FF2801FD74A8AD3412F8A9C +:107B6000E7FA2F19A3C44FC78BB40189D921541444 +:107B7000A25DD36688F60E5683F38019FCA6BDCDB0 +:107B800067FFD41D4897A5576378304974174F9FF6 +:107B90004BF3D6C658F40FC63ADD858F029F37DA0D +:107BA000904EAD74FE651ABCC7F682D717336E309F +:107BB00064503A144169A3F87DA6718005E0FC9CED +:107BC0005C9C0EF2F539BECF521C28DA73A80E2E3B +:107BD00027ED0557EAECD915B20BDB39C6E8E5C04D +:107BE0000A2E7713C6EBE95D95BB1F75CB5D773227 +:107BF000CC27E5C278E4C7A49BA3CBDF06D9E885F0 +:107C000077051A86327EF79618D97D989EF200FD88 +:107C1000DAE7DC83D6813C55E96B1161F2C74B6230 +:107C20009CB81FF1777454FD7809BC37C8E52CA4C3 +:107C3000E24023D24DCADD068CCF5BC6DFCB7A8A09 +:107C4000D217A43E4A5F905E9BC1CE33169987E15E +:107C5000BB6D0D5603CA0BE95393DF0AFAEAFE51D6 +:107C60000EF02348B2B3CD05FE409BD4B48E40BD88 +:107C70000233BC2721C41738800EBEB1CDE977B1DD +:107C8000383C8A4E01E8C891544C8EE5E2E901DEA9 +:107C90007B911D3713F02BBE90546701B8E5663019 +:107CA000BBABB1A410E148E13B2E2339DC4FEAB471 +:107CB0001BBBDFDB826E5FE8E5FECC940CAE476752 +:107CC0007AC9400DBF370A5C0F53BC2447C3F78BFA +:107CD000AE9840E05CA927BFF722CF363079F6880E +:107CE000105D9EA9FAA72ACFE40839A1A68BFB4D07 +:107CF000D4DDEF322639817621F51A288A24EFD592 +:107D00004FDE158F70980D7020693776DBB53FEC2C +:107D10000F7A6561547A8B946373BAF775570AE0EA +:107D2000E994ACA44E077A7AA7B77DDD558A74E84A +:107D3000EBA3C0BEB4FF991FA35FE7C4333605E4CD +:107D400050D985C7717F28BD300AD3F2C61B703F5A +:107D5000179E9D5C08F4D0BEEAFABC4FC1CFE3B3D6 +:107D6000E1BEDDDE583408CF237DB10AC477B437D5 +:107D7000D2F2827039C48B8B9A780102DE77CDFD06 +:107D80006F52A0A05EAABE7B46ED3AFB68F00BAD39 +:107D900016F15E58E9B33617E89FBDD15FE9AAE84E +:107DA000FE00D86BC1EF4A07CC013D7ABF7D742835 +:107DB00040FB9DB38E9D2334185D2703A0373D63A0 +:107DC000C173C88684E8EF82CCCDB87E19C881B96A +:107DD00019AEE7104F56F64E69EFFCC0C63F098753 +:107DE000CC708EF5227F1F4572DBA7EACED9D83939 +:107DF000D649EE6721E65ECA6378B9D24BB99DC514 +:107E00008B1047F472D5CE880DDB194DB08E9AC613 +:107E1000338B3F4578713B83CFFB94CCE67DEA15ED +:107E2000937F5114FA3FC5E3532A04065F950F4E22 +:107E300075EB476E7C0F27924E8575435E1845FBA8 +:107E4000FDEA908CFB4635A52FA4AB75A3303E5EB2 +:107E50007866D4D310377CFEB088E595172C58DEB1 +:107E6000F1B0F305887B0ABD2B13904FE70F5D1F20 +:107E7000C7FC447A3FF63D7D985C38C6E543E9850A +:107E800027907EBBE9C437D708FC577AE12946DF43 +:107E90001B057CB79278ABDF1D3B90D3E768685F2A +:107EA000317911C07B8C0FCF49CA36989CA00F4402 +:107EB000E2F95886A2F37B94059761BF84EA5F4993 +:107EC0009AF3F4533CCEB8EC027BAF9038BC240D4F +:107ED000F881CBA7301DEBDFA1EDB044F7D39FE3D2 +:107EE000FA4FE9856B747646787DD7E1F752BEFF8D +:107EF000970547613EBC9E1746455B4F781D63B0B2 +:107F00007E477CF4F1D3399C4FD6971317956FE5D4 +:107F10004656AFD477BF11E44EE9AAF80441B3AE98 +:107F2000B2C62A5D9C47D9AA12E32C4DBF613C2CF6 +:107F30007E77AC14C643FA4B0B272FB2825E502CCF +:107F4000F7017E5A5751F85305FA63F2E90BD997B6 +:107F500005F2BABDF13E7BB47B13E97D22F0D3C8B4 +:107F6000F143F5EA020D7E54BC44B63FB9B6ACF01D +:107F7000A7E08F5EC95E21E95DFE44E02D3B3ADC5F +:107F80008675C32D07E38D2E0DB7AB7471453DE0AB +:107F9000C6F1ABC245FD4EF5A8ABFA8C80F108BB2B +:107FA000BFD3C8F07F297885C7E5F81F1B7D1DD397 +:107FB000BAD7B1807829A3CEB9E43A1E245EF3453E +:107FC000D6A1E29FBCA2C3FFB497D6221FAAF89EF7 +:107FD000736025D2EF1CCA8F70DEDFEEBBDF1E2D73 +:107FE000BE685A6F781FE825B985FFF7F0FE85EC6B +:107FF000CD82B832EF720BDA23A7D63D91A585F377 +:10800000DC8CB1F7005EC8FAE4CBDA3FBCE39C87B6 +:10801000C0BEF43E23A33F6D6B86BB0CDA97733B67 +:10802000FC91F80983A2E9078FD61F1A027EBA864F +:10803000FA364C65AE5F12D02FB3515F72457BDFCD +:108040006B491F26571EAD6F637E4FB39738B4F749 +:108050008909D39FFE93307F8DDACE28BB1DE03F88 +:10806000350AA418F53EC9BD24BB00FC1E49F95EC3 +:108070000DFC16F761F79196A51D70C0BD6213ED5A +:108080001FFC39E64CE99CFE9C93E5F3854F45883F +:108090006F96939A08FA4373E9770DBC8D496D3A50 +:1080A000FF74241C24B31DCF9B24C2F43975FDF446 +:1080B0000BEE4B8FF17D6905F76B3E5FDF847EFF32 +:1080C00045B176DCFF16F733307BCA2CE17B35A651 +:1080D0007856DF18C7E66D01BFB708FB6A00F336B4 +:1080E00078D147C4A7D104C8C71345807C22092C86 +:1080F000C67752C6067F02DF9D696E3FE0F19BF4B2 +:10810000B62302F8B18BDD8361FF6D14BDF90AADB2 +:10811000FF7331940FF5B268D127092CED07F1D028 +:108120006ECDB9167B2754D1FA0523F3FD164811FD +:10813000E73D7F19AC2D5F9EE67A1DE6D16061EFC9 +:108140000C251D17F03CA7C1C2DE1B6AB0DD1E075F +:10815000FBF86FFA30BD1DE900E8E810D367CE499F +:108160004A5C02F3932A6FEAFCFC66E54DCD3812B7 +:10817000B7F7D653BA9434E72A03259701E8E60AFD +:108180001FFDAE9D67147F5C82159FE58D7A9EA3CF +:10819000CE0FE2F6018EE2850968AF45D2C39E6E2E +:1081A0003FB357047C4E57DF2F961E61F978A2FE2D +:1081B000A1FDF569B73EFA08CBF3734ECF2C768E4E +:1081C000D9501287F171EA3CA6B73ED6067AEAF496 +:1081D000D6F4D970BE35DD3AE87348F7C8A103B1CB +:1081E000A007DE2FE0BD923B7FF7A61C4BD3ED1F0F +:1081F000AEC3FBCC9F73793A8384F05D783771F01E +:1082000073763F7E9F459C3CDF24835D7F77C07FF4 +:10821000DB649ABBE74DFF6450DB661C0ABD056258 +:10822000C0DDE4988067086ABB16E7DB2CCFDA75FF +:10823000AF5F32E37AC2EB35E3FAD5F5D19922FC90 +:10824000BBE1C3DF6B52E121CEA2EBA6F4323DEEDF +:10825000F61BC945F4F2E9D69CCFD9A1099B4F245E +:108260007CCE4311D51F3BFAB84826C5DF1FFAB8AC +:108270000448ABCDA12CA93FF2890CF95AD1DD0FEE +:10828000429FBFECEB1E9C0C70684BBC2CF979C470 +:10829000C2F8FF08D033C4795D48C275A9EFD01F7A +:1082A0007CA0DD067AE7E2ED1FE33BCB3562F0C947 +:1082B0003BD01F2AA2DD74AE79F045EF9F1D013F30 +:1082C00015DDFFFA66AAF72CD93A674A8C4F663655 +:1082D000C7623CFECC05A2EE1DE9990B583C1F91EC +:1082E000DAF26ED5E9EB8FF4DA0FF80B22FB99BDC9 +:1082F000A0881C1F0EE7B48EB1E83F58C3E86BF6A8 +:10830000789708F1CEA3970878DE3AEA84D212A4CF +:10831000F9D9FE7827B0E7EC07FE6300BC7350DBA9 +:10832000C6FC81A9E2BDF90F839FE500DBC7217F71 +:108330002FD089D5A55835E7051D725D3EBCF7E7FE +:10834000BDC7EA02FE2FB9D5F529BE17C1FD15EA52 +:10835000BEBAB3B104E3644BEE564602FE4B9A2C10 +:108360002E4CCD448AA172AC44226648538D44B24F +:10837000401A43CC90162E62EF7697364E45FDC0DC +:108380003EB2D808EFF196B4FEE26B685F2605F6C0 +:108390000B7961F894B4BEF31DE075AEAB18E31928 +:1083A000AFDA68D4D981439BF4F9AB5BF4F9FC8074 +:1083B0003E3FFC903EBF2193201DCD32DF920BF05B +:1083C0003AB0D744F72288FF3361BCCB3181E1C793 +:1083D000BBC982F2B0A8AAB510ECE033AFD90C60EB +:1083E00047EFF9EBAFF03C3CB42596409CD5FEDF5F +:1083F000C7901888577CDDB20ECAAB28EEC07F59F3 +:10840000F5BA652DD8E13BAE54ED787F1EAC67C759 +:10841000DF587C4D6893C90FE7E36776FDE2353896 +:108420004F3BB3A90FEA57C704AF2106C6FF82F935 +:108430003F83FCBDB8207F2FAE6AA3DE2E9E97C976 +:10844000E44C70D13571D1F42635CD494BCC1D4F5C +:10845000E7D6F5B86926F8810637EAE1A2D61BE22D +:10846000D77F7F90F73F9A18C3749A0D7102FE066A +:108470003BECBF2F477F277911E79F575FED6E27B2 +:10848000F277E288A2B9371596DF647E1F88DF0095 +:10849000F8F70F7FAF229AF968F49389BCFFAFCC4D +:1084A0002C9E3989BFDF7FBAFE10EEFBDD7A5FBDFF +:1084B000CB355E932F6DDC9F5202F6D3AAFD29B314 +:1084C00034F0AADE7430E52E8C7B92C0834BAAA7D1 +:1084D000BFF214F82BAA37894D304F2807B87534EE +:1084E000BD65877A541F1E067E90B03E7ABD6BBC78 +:1084F000868FFF5EBA55F9AD9AEB2F3B47B64D809C +:1085000038F5AA46C109D5AA9A6EBB6532C07B155B +:10851000BBE75A28916291F257F5D6DB7E3C14E214 +:1085200066568F70C27C6817B7C2F7AACD67F13E56 +:10853000C3D288DF3D50D3DD994C2FA4F503065AF2 +:108540007FE9EDD672905FB4DF37217F20671DBED3 +:10855000AF623FC5CE1FE8F74F0C546F3935CEFBE5 +:10856000DE5DB4E919D2F4D164F02B35EAE991D299 +:10857000B7007A596883E05C875F1715DE0C2AB76D +:108580006B21C6FBD2F299D1EE5B57F8F5FD44E2C0 +:10859000FD233E5FFA97A3A59FC87A8993BC184F25 +:1085A0005EBD80CA438D9FA0FA840FDF978C1C8725 +:1085B00068E99AE913440179B8C5A2BE7F24980BF3 +:1085C000799CEE0096C77715814E29A1545D49C666 +:1085D0002B00EF9BC9444847835C81F7F44736E59D +:1085E00041FDDD42F09597B03F1BCAF10E4700DF19 +:1085F00099CCE0F74C3B1496EFE27E4EB5BCB2D579 +:1086000082713667BE34A29C5DD87410E3E83B5E8D +:10861000B3180C541E9CD99A380EE2313B9AD83BC1 +:10862000C5A79B12C7192FB26F47CA0D753F3D0AE8 +:10863000FFA4FBEE9F335DDF64C23EF5088B574D10 +:108640004DACCB8FF6FB176ABB24635D3ED831A1DE +:108650007BACCE7508276FB6847EF03427C40995AD +:1086600008AC5F63BF62B12FAD6FA375C11F9D7072 +:1086700048C4DF6B382E3A7FE21880EFC9A31E345E +:10868000A7C08DEF539247585CE56C8904244A6F6C +:10869000B3613FCAC33CCAE5D9AB048C2B9BB34C36 +:1086A000BF1E782757BB8F56103F7BDF42EB47EC4E +:1086B0000FF12E74BF81772DCD2CFEA272BDBE5D51 +:1086C0001509E07CAA377F6F8A06AFAF89BA2E57AB +:1086D00026AC4BB8D98CF3BAEFB93876DE63242ECA +:1086E000D84F43CFD950BE571137F67727DFD73D44 +:1086F0000F94B8E6801C5E30DB352711EEDBB2FD4F +:108700000F4D3EE46F01F79DAAF124D097BDBB4108 +:10871000605FAD6A150243216F265EFB30F61DDEF9 +:108720001F80756BEFD794131F8E57BE4AFF9D7C39 +:10873000C8F05ACDEF3192F59AF2FEA09F317854ED +:108740006F36E9FC3AA3370B5E1BDE77F537A4D012 +:10875000F9D59EA2B282409CEAF7265DFF10CF3386 +:1087600002F77D62A1787BAE5BAEFB87448BF33F63 +:10877000C2E1F8DC6DA5E9C0AF4F83DE9AC1013DCF +:1087800012E516F71F9080998E1333BC3B8FE58559 +:108790008B587ECAEA57A6348EA1769EECC673A18A +:1087A000D962F1DB701FECE57EEE9BFBD271661B9C +:1087B0005C5912F2AD6B10FA43173038BC30AC6E16 +:1087C000485D143D50C5F3F3425300CE65BDBB98E0 +:1087D000FE652B08C9DAFDB5BA2F93477107827879 +:1087E0006F22B45DC07B962B85A3781F71E50D0ABF +:1087F00001FB3E8DE209E4F14A813C2250B8143479 +:108800004FBDF72DC073418C137EEEA2A679AC58F4 +:1088100063C5F5333D2DB66E2D9CE7A4CECC19066D +:10882000744ED73DF366FAFDDEBE0A8E976E65780C +:108830004F5BE4CD86DF818A3B507CEF5BC0874392 +:1088400063F09E6C2A85952D01D325A07FA5918587 +:1088500002D47BCECEFA4F368833A7427E18CB2780 +:108860003C24B8D621F12DC7FE534D6422CC13BE53 +:10887000831E6906BF0296FB197E8BEAF2A1BFD464 +:10888000012C4D320632A19FC3DDF876A35D319FE6 +:10889000EF63F3B78E4D053BEF700735B8A9DC3AAF +:1088A0009CA6EA43012BFE3ED4C01C569FDB85F3F9 +:1088B000F3D97D83A42C7DBD2ED915371CE4E807A0 +:1088C0004C8F3F6F75A17FFA1A63747FD64B7D99E9 +:1088D000DEE2B92010BF661FF04CFB06F54ACF055B +:1088E00049F7BDA3DEAC8B73AE2E3F80F7EE6B482D +:1088F0001BC661D734C5EAE276AF89893EAE4ADF4E +:108900009E0B22F1461DD7A8FF7E21917813A3D597 +:108910004BD17FA7EBD0E55BBEED5E077C272383C1 +:1089200076B0072771BDB6CB6FF0CA5787F1D2E991 +:1089300008EAF69D4E85E5BBF8799C5AAEF6DF391C +:10894000CDC8EF15B17795013EDEC184BCD87A164B +:10895000FDD1D5ADFB27B0DFF76274A18593572316 +:108960003F521ADA0206CADBFFDEF7D453B94328B6 +:10897000891D50F9F8F4532ECAB729A241C7D7B1BF +:1089800005DD7C8EE2E53983C8E5C299A7C68FD1A3 +:10899000E659FD70FB8E29E3A96E5F90CBDAFFB13B +:1089A000EF97EF2D1A18964B741D59C5364DDE1CE6 +:1089B00091B7D2FC504DDE11519E14519E1691CFAD +:1089C00064F53B6C812CD149487BDFB353A45170D3 +:1089D0008E1D98012F0A2C6BF86ACA789AAF296805 +:1089E000C3F899DA56C189C7FA6A7CBC93E959562B +:1089F00067107FCF2EB6A0ED6D9003D52D8243A0DA +:108A0000F46E6DDA8A7135D5D04ED1B46B6276676B +:108A100075D3516CD76BFF3906E4E7A539C7B09E13 +:108A20007A7E7407E9FEBD8E0B202F6B9ADAD93E51 +:108A30001C717ED499EE3A88F230E2FEAB07FAB5AB +:108A400086E95EADFF87A1ADBF836E62E79F5D28BB +:108A5000D1FA7FAA691F01FA12BC710972FF79C1AC +:108A60003F04F6E717897B08EC47F7D45CB1DF4099 +:108A7000EB1D9183ABE1A9864159969B242AA78FD0 +:108A8000D8827D052A4B72D624DE04F03C921CC4A9 +:108A9000171A7EB6268995F70DF68573D7DCAC1FBD +:108AA000B2FC15C1D590BF75CD952C3F34D857A4D5 +:108AB000EDFB7BAFBA09E0BFC1119D6FFB66317959 +:108AC000AECEAF2CDF959605FA6635DB2FE0FAA522 +:108AD00099CAC51995A7B76CA07098F1D358945747 +:108AE0001B3A6EB9B118D7EF2D863837F6C43BDF85 +:108AF000CF502E4BA807A4C31E9610C6872DAB4D92 +:108B000041797F65DD56D8F75367E4A2BC3F9FE902 +:108B1000AACF1A114EBF1DC0D2FA2C76DF235534CE +:108B200060BC41EA8336D4839EE6E749946F10BF68 +:108B3000568E8F61594CFE0DCB62765246DFEBEBC1 +:108B4000613D7772FD74C5E3FE4D160AFFDF0391A8 +:108B500024A17F1BF5DDBBD652B91107F114AE7409 +:108B600090077781FF37379C57F5F715F9346F0D6C +:108B7000DB692BA6BAD2B571402BD6B27255DEACEA +:108B8000C866EDD57D27B581C127F5E921EB601DCC +:108B9000B112C1FB1773A70D5AB710F7EF9B71BE47 +:108BA000C4E54A07FBFB44457F03E8952A7E1ECBBC +:108BB000774DC2F5882C5E5DC5933A7E3D5FF76CBC +:108BC00091EEFF749D0FF673231CA93E90C7820B94 +:108BD000983E500F8ED8E4307C89141C01DFFF17BB +:108BE000C1E95E58F73F0AA728F2E267306ECD026E +:108BF0002A2F0C1A79C1E1F7BC1090530B34EF9770 +:108C0000D0EF6007DED1D7FD6896E61C67C68335D6 +:108C1000A8FFA9F38AFDB79D13EF203DF92C523F21 +:108C20003BF27BF332F4031A9B502E1EB991381796 +:108C300082FCE0E7B2AA7E59F8D3AAC360479DCB75 +:108C400012B19D45C5AB50BCB594C2E971BAADC275 +:108C50007D74EF5416DFA3EE9B2BF8BBBB2B1EB825 +:108C60000AE3FCBA48107F97CD3B92A0FCEB2E9F05 +:108C70003E08CB29BEBD16E0F78A18FCDD8115F948 +:108C800004EFD9AC987E2596EF51FD4AD3CD38CE6E +:108C90008AA98C9E5654B0384CD847006EBDD1433B +:108CA0004A03F36F10C995A78D077897E32FB62075 +:108CB000B8FD63D02B975950AF84BD13CF477CA923 +:108CC000381EC5EBF62CA46F368FD9CFA6FB97E2E2 +:108CD000B84EB4CF1FB3B94A505E3D1CABC0FC5771 +:108CE00059C812F3303047C82328F7F87C88EF05BD +:108CF0008CF398C9F5B5CFCACFD9401F7893CB1B59 +:108D00002018B0976711563EEBA1D8A360DFCC7A4C +:108D100048C4FB8564C9F52EFD79079D6B0AF8C729 +:108D2000F95F63C8067070433B3BF4FF9F3678CF12 +:108D3000C4FD10BBDF4BBCB4BD261EFA63E05FF080 +:108D4000B38B6CFEA43E5689F62EE8C75CBED3F901 +:108D5000BBB4E3A9E344F64BEDBB4F005E14EE0158 +:108D6000B807167A58E4BFD7AA9F6F9231F4A4854A +:108D700096CFA817E3175178BA17D870BDEA7C6769 +:108D8000A686AE65BF0BABEFFF646C6D21F8C355D3 +:108D90007B843CA4B7C7C02FD19D17314E1AED9AE2 +:108DA0001EDFB93D1B690712F23793B65EF73D0D22 +:108DB0004588983FA72B4590006F6E1EBFD08DEF62 +:108DC0008879ABF034F48B0ECF2463B02FC82DF725 +:108DD0000213C221B2BDBAFFBD60215EB0131B05F4 +:108DE00001E9B1F18158DCCF8899E1D15319A30091 +:108DF0007DBE680C611C937737FBFDCF2E4B680757 +:108E0000CAA581CC9FD0F59EB816EA752633BAEE76 +:108E1000DC25737E22EC1D89F7C475582EB07E3B8D +:108E200017C6627C14DCFF34C2BD4CEF9FEBC1BFA0 +:108E3000A2DAF1C777B0F714E0777BB47630DC9B29 +:108E40002D1F16960FF83E0CF0734B2CF713B92B11 +:108E500070BCBB6208C461D41A048CEBADADBC120B +:108E6000EF9110FE8E73359F5AAD81DA83C3C27CB9 +:108E70005E6B383608ECA96AF3327CDF9996BF093D +:108E80007618FCCC6EF7EF7864F7A4EBDA6567FE32 +:108E90008AF7DA9BF5F8AF0ED309DE8FABD4D24D4B +:108EA00076981E50DF0639319EE0BD7C1BCFC74E41 +:108EB0006CF3839FC6C3FD16C907D8BBB5B682261F +:108EC000027E53CF29A66F8C6E5D7B10ECDFF88994 +:108ED0006D6071D1FACCEF16797F6854EB7211ECAA +:108EE0003A554FD1D895436E1EAA4DD97D5BB053EC +:108EF00061BC207C02FE90D8FEF63CDFDFE83E88B5 +:108F0000F278AE6F30EE83B04F811C53ED5C906B06 +:108F100020475EEE376E5A3FBACE3C65DC2DFDD859 +:108F200039CC10D4EBBD9777DEA4D6037BF7E2FEF5 +:108F30003006B7D0CA382627E00740C14FFC5B791E +:108F40002DBEEB0D8297CE77DEEA6C94BBAA9FA66E +:108F50009AFBA94AB95FA794FB75C0AFAA8D7B05A0 +:108F6000BFA5365FCDF9BE067E4F0ADF0B3085E325 +:108F70005EC19F339E046C500E7E1D3BBB5FA76D90 +:108F8000EF21FE2209E9FC7B93EE5DAC156CBD334D +:108F900039DE575A983F67F4436B45E6A462EB8D80 +:108FA0001BE6CA7EB420FC3ED7E71C4F2A5C8CFD32 +:108FB000C6DD03708F11D9FBE6A147D9EF5D9FA0F5 +:108FC000FBF356EEEFB8D98AF78B5D03212E417281 +:108FD00064DD1CE5775B97EEB6E03BFDCBFAB1F3C1 +:108FE00060F5FBB87EECFE2EFA8100EE0B6351CFEC +:108FF000A660CE033A2AECAFEE97240FFC4F4779D8 +:109000007C67EDED5637F417E47EF195FDD8BEB5DB +:10901000B21F7BEF5FCD77DB759C5ED4732CF0C7FE +:1090200068FDD7FEEEFACC7FA2EEAFCF57C4A05CAE +:109030000AD3AD01EF4FC6E6161BC18FB49BCB918F +:10904000126EAFEF86035A90274DDCEF2C3966C0C5 +:10905000EF02ED3E958BF1924946265F76DF19438C +:10906000207EEFD0E9579F788F969F3B65C4F7F03D +:10907000E6707FEB6E78F71DE4E57613FA11AB8DA1 +:109080004C5FACDE3794E92946F74A88EBF66E93DD +:10909000D1AF556DF76F7A05CBD39D14B3701F9484 +:1090A000E9B9BB6259FB18FF2F5F03BB735FAAD3FB +:1090B0004BEB2F4873EF03BC66989438A29EAB0A23 +:1090C000E1FBA2C7FC4C2F3E068207C669B5F1DF63 +:1090D0009173A5CFA5FD1C7F3C15D743E52DEA4F25 +:1090E000C79F32E1B9D9F3DDE332FFE731B918DFC9 +:1090F0008B39B63DDF492D4BD2556C0C807FDBF3AD +:1091000034D3E7661B9435001FB22FD6A9B3479F0F +:109110002A63EF47543E34E562E7D820DFB5FEDD31 +:109120004E12CA427BB4BC7F13C49376B60E71B2A2 +:10913000E3AA343C24A9E5E7CB276406DFD05E1917 +:10914000E9F972FB07BAE8FE9D3B91E0EFB769CF02 +:10915000D322CF217AE6191E3DBB53B9DEA62FBF1D +:1091600025D31D02F956FBCCB7471628305E08E51B +:1091700021F1317FFA09D93503E8367E7C4017A703 +:109180006556185FCD36F1FD9E048C5A3E54CB0BCC +:10919000C791A8E7362685E901367EEE1C59FE7F89 +:1091A00000F2988AEC008000000000001F8B08008D +:1091B00000000000000BC57D0B7854D5B5F03E7360 +:1091C000CEBC92996426992493F7C93BE4014308E5 +:1091D000112DEA24040C98D209A062B538BC41C90B +:1091E00043B0BDB1C566201102A2861A1128E084E1 +:1091F0008762D5367801A346EF8048B1D5FBC747D3 +:109200005BB4F7F78B4A29528188964BEFB5F55F2F +:109210006BED7D92394322D8DBDB3F7CB0D967BF51 +:10922000D65E6BEDB5D65E7BED1DB36A602C81C159 +:10923000CF4C334B64EC1AC67F324F316FD0C69897 +:109240004555A9FC9A5321D37CC867AE0C99168961 +:10925000D40FE909230B59CA21DD620FEECCC29667 +:109260005E86FD2C9A00FF85A68B64D66629C3EF27 +:109270006A4FBF8BB193079C9EF5F09D7DF995CC0D +:109280002A189BCB443D336BB7C431F67C9B14B298 +:1092900040BDB99BCD3BADD05FC56AAF6C87FCC00C +:1092A00076C9B313EACD6DABCCDF02F93BF7977A01 +:1092B00064681A83E3603EE80CCA50FF9AE649EC02 +:1092C000E3718CCD37074D0A7C674F4B6C0FA3FEC3 +:1092D000DBB0FF65D02819E0F90A7FAE1F4A176F8F +:1092E00036C364F9DCBFC27F8261F96CE8B7BB4B5F +:1092F00066305FB617BE170E7D5FA6840E49318CAF +:10930000D57747B4677F330FD643405980F0E832B2 +:10931000B13B7C369A74525D29637FC0FF26336669 +:10932000CAF48D53C763263769861DE65DC5E735E8 +:10933000B04F22BCD6B32613C37E3AE319BB3A6CB6 +:109340005C0B0B45437A520E50F922F3464A6BD41C +:109350002C1AEF4ED66F6239D8EF80C907E3D9FBDC +:1093600080AE2597CEBF06F960FCC87C3055F0C1B1 +:10937000B2532C742D8CB76C250BD58FE6A91DD25A +:10938000450A0BC4005E17010E62451A55C6F1AAC4 +:10939000160EE16569509F477CAA6178463C869726 +:1093A00037F67C650ECF279918B3C60DD11908453D +:1093B00070274D6A1ADB04705EB3322833985F4A17 +:1093C000BA77522EC01B5DCEE7DB78DC6251C760F6 +:1093D000DEC7B2A1DE176995CFE54179A3C2BCDD36 +:1093E000501E0D78E982EFDBAD2C80FD3F9EA75229 +:1093F000BF6E13E75FA3E263636D4897BE9001E918 +:1094000092C01CC88F1A3EB7DBA15D19B693A8DDC8 +:10941000607B0B6B8B0A6B5FF5A29531582F175E43 +:10942000B007CD509529FE4C27F497F87B335B0F9E +:10943000F9B32FDA97607F678D6C7637D477C9AC34 +:10944000A99BF8650DE1FF8748D7F1C84D55A90CD8 +:10945000795F9A96CADC58BE9ABED73B81BF86A177 +:10946000EF607956DFCD9CAFCCEA4E18EF82B3FFA8 +:10947000079807785800F2CB550E77E3FE49637FD3 +:1094800004DF1B7D360FC7BE7F2CF2AB59BEE766EB +:109490000BF0D71479E5C0BD308FFA749BC30C4D27 +:1094A000AA33FFE3B7B742FE93FD4666463AEF990B +:1094B000349B655F0A87962E0D1A3FEA0F5B2F7764 +:1094C000EDD5E7EBBBF5F946A67CD4AFF101A06082 +:1094D0008B6A779D8C26D9E1F90AF8DB6C6E3AD558 +:1094E00005F09A5F327B56C1E706D5BF03D7538399 +:1094F00061E028E2D99CF9E9683FE0A52AF3CBA313 +:10950000A988FFFB9807E1BE60AD9C4BF4D862557B +:109510000361F2AB51F07F67462D95776E35AB1244 +:109520002FAF1D0F726B092D61AA623100FE1B3730 +:109530004FFD441A4DE516A44727F029B57B4E0A86 +:10954000AE82764B362FAE65507E86054D1680E78F +:109550000F623D35CABD532CF0DFCEB89A51285F5B +:1095600094BF2A3EA4FF5AECEAEA217CBD34B83EFF +:109570002D1D27002F373289C5E2BC9DFE97709EB6 +:10958000F5967E5325F473FD5FBF20B9BCB8F9D5BD +:109590009C13E350DE78E712BD617E284716DF7B1F +:1095A00088BE4B332C04DFC9745BD00CDF5FDD62F7 +:1095B000E679A789F227B74B945FDC2D052D595822 +:1095C000FF627C25CAEFED4687995D8AA748BCFCFF +:1095D00071DBEF621880FC47102DB8BE98A329C636 +:1095E00067C7B2A69819A588AF1B3E41F9B578BBED +:1095F000EC09A19C7ED9EEC963989F3C6AA10DDB62 +:109600007F1E5F89F8DB31D921D377D9877288290A +:10961000DEBEEBE1BBB2E32A15D7CB91ED1CEEC564 +:109620004ECB1348E7EBFF2A13FF2B06E6DF674319 +:109630003A7847E1BA53B7ED9982F8FD635D8A81C4 +:10964000EA3F2B3107E2C3D99C88DF174B8A0FD73B +:10965000D992CD4B6B59CC10DED7A832E1BD327315 +:109660006562BF8DF8FE66D477F5DB81CF71FC199A +:10967000EFFFF656D710DF4B33364FBF06FB7FD2D6 +:1096800048FCA5F5D3B8EDDB823F180B019E160B05 +:109690003C993357E6E3F8975B0F8B5737E53B6C04 +:1096A000975F1783EB7D1BAC8F62C6FEAA4AEC2B3B +:1096B000A0034B8B233D33D27AD4F493ADD0C0F5C5 +:1096C000BE8779F7409A64665E09E457769642E56C +:1096D000D95926C287F297E57BDF04F89F53FDD165 +:1096E0005990CF64DEB1A867D40147552CF4664386 +:1096F00006294738CCC13D24E7200F78DA94C09E74 +:10970000581F066786E80FD6AB0BFB39FBDE974781 +:10971000118F0D199F8E46BDDD78F10B930AF4B4BD +:10972000F54A24676D1E1F43FE68ECAD630B4A8645 +:10973000E463A387CBEF4BE44C9691CB33D700F592 +:1097400033359BCBB74E275F9F5B9BA38228F7B631 +:10975000BA8256043ABA3CC050BE4F2F973D08B665 +:1097600066A7F82C9C5E16EFAB4C467EF5C81E141F +:10977000F17DDE8FDBE221FF66F9648F0C799B7748 +:10978000577B36CEDB6314E539019CF71B132BC9DD +:109790005E99EE95695CB6242688AAA2CFFB8E6BF3 +:1097A000018CFB1DE67DE404D0B1069437D2B10FE5 +:1097B000C7067A9D71F827205EB4F97CDB33F591FA +:1097C00013E1768697DB03F089EBB1F2E1F1305AD1 +:1097D000ADBC0EFBB9FE3A4E87D3CF9A83AB61FC8A +:1097E000D356D03361FAE2B49DEB1D5F9624ECC2F0 +:1097F000EE0C94FB8379659401D7FD3D0E8E0F9797 +:10980000A93B03D7DB9F247D3F77B6CB2C0872663C +:1098100069BBC48200E2E9A79ECF40F9FBC99EE77D +:1098200033E685C117D94E4BBFAB8DD7F198D70220 +:10983000E3CD63DA78A1341C6F9EC7FC21CA0FD632 +:109840003ED9DB1F663F90840CABCF367B497E9FB1 +:1098500083D5887CA7B53BB724CA8B76E6396609E1 +:109860004A30D4BC5E3964C6FEBCDE5C17D0BB4156 +:109870006B1FD17FA7E01FA9470AD9A17E74C90039 +:10988000C9DBA516DFD154285A8A7484FA53918E05 +:1098900012F2ABD784F356242ECFCF387C7767C132 +:1098A000BC1676E8E9989EE5E0F375B8B83DD86057 +:1098B00053505F24B6326E077EDF10447DED8A8AF6 +:1098C00019CDC08E31A5B86D28A7AECF8F6A33C42D +:1098D000E2F78C20D64F4F29A476812ACEDF81442F +:1098E000166C95B0CB2689EC40473F53E07BDA04F9 +:1098F000E6580FD9DE2C6E27BA9967B34C7662B75B +:109900008476A286074DBE23DFA0DC3B2D59886FED +:10991000A45E89EC3ED9D03D07FB1D898FB644F08B +:10992000D1967F321FED1A918FFC2AF191DB323CE8 +:109930001F81DCFC46F559C0A700BE9204BE1E166E +:10994000F265E0FB16A21BFC4838DF5AD15FADC5BB +:10995000169247939CF874507E433FDBC0FEC47D53 +:109960004A32DACF90A6B6CE55B9FDDED72F417F69 +:10997000D1575948EF3D60E8CB423B3FA9A8691F4A +:10998000F247D29C92B256B24FD29C28F751D6E001 +:10999000FC1B9A27F9B81D00FD221FD599683FD1FD +:1099A000706FA58FDB0135B43E1A375855D46793D5 +:1099B0007AB356217F34AE04FB08E56F4FD7964546 +:1099C000906F9865F3A09D62B5CC2CC176AC5DBF5D +:1099D000CED649DD641707A6320FCAED734143C0E6 +:1099E0003806E56CFF8E1FA11E5F5AE209A8B8DE9B +:1099F000045FE632D20B9D4E6F721CE0F5E0DF642F +:109A0000DA17758E853CA42F097A76D679939D90C6 +:109A10009FB7C14A78EFECE2E5E7EC8020E83F45EC +:109A2000E6FDB1580BD73397CA030BE23D7102D361 +:109A30007E36633E45CB773C46768CB6DE3BB3380C +:109A40003CF6125F165ABEB7ABE3FAA260BD27CA56 +:109A5000066D531440BB3B1AC7E4792F0EF7A801DB +:109A60000049C1EC7F6FAC9E189EE7F587DA3F3066 +:109A7000A33A8DF4EB6039820D7A57CB7BAD00C7EA +:109A80005AFB50B902F6A4A54712ED27CC980CAAB0 +:109A9000F89C24C60F281BBD808F87AD4C375E38DD +:109AA0007C4A44FF46E8DFA68AFA8152DFE45C8004 +:109AB000B74C6BBFAAC30BF03D6CD4F7472815ED2C +:109AC00031A38DF7EBDCD7376E481BD2FF600FD880 +:109AD000B3C70FD9016BDFAFED180363453B3E37CA +:109AE000A17ED5F479A34B223B2372BD2665F3F505 +:109AF0000A766D5236C90D6EEFD6A2BD2B939D3BF3 +:109B0000059756E34A1F43FB12EC86D46CB21B3E0A +:109B10003D7908BE77CE384D767EE34585EC8F469D +:109B2000B03FD06EB7F4727B96F51849EF6A74BFF8 +:109B300053C89F4E27E87DE4D397A5F1C8A78C357D +:109B400065DC043468C9F6E6211CDA7E2C12DEEBF3 +:109B5000B2B95DDE5858B5251FFBDF2D31D4FBEBC4 +:109B60000B3F4A44FBA4B1F7C3C48561ED96F63CB4 +:109B70004A7858BAD738ECFCAFCB9669FE0D2F1C4B +:109B8000F0E27A3F1D94682D2F5182EBD0AE5CB28B +:109B9000C480961A2B0FCEBD15D73D9B6D627930D0 +:109BA000BF5CD44BB89FD83B33700DEEDBE0AF0405 +:109BB0009FB6FA16D1FADE3ADB62635908E7BCBBFE +:109BC000090F8E282FE2617D6155328ED35037C543 +:109BD00081FE9346B0B3B0BCE1DEEF923F45836BAC +:109BE0007D8FB106EDAF0AB0B7FE15E04E8F9B56E4 +:109BF000E381F5982AEF1BBB02F29B4690BFBFC9D9 +:109C0000E1F46C937C81EFE0BA7F41627BD4A1F2F6 +:109C1000CC1E6ED7DD9CCDED40EDFBCDD9DCDE9CBE +:109C200018E89B84BCF78AD21F8DF66F23F37E86DB +:109C3000FB4EE6B3A97B884E5CEEB85A54F22B5922 +:109C40005CFD0F8CC1F2890AED2798D2FF088E7B4C +:109C5000769DCBB39E09FEC5FCBD2541DA3F64FB72 +:109C6000E7237D2B841D79F6851BC6CE2B19B29375 +:109C7000D6755983AB010FEBECEA4F6A50BEFD4538 +:109C800021F9C62C037D93901EFF1547FDAEB30648 +:109C9000D721FD031B8D54BE2FC5DF807C79AAAE72 +:109CA000261FF7C1CC16C8AF037E32BA3A18DA0BBA +:109CB000B07D203F83C5E5632AE42705E62A12CA62 +:109CC000F908FB6312FA7968DF0083C3F72A21B62B +:109CD000F2800B4E5A6809B47D153F648F1CFB72ED +:109CE00096821F353BC560F12FC5A6D5B3A3988CCE +:109CF0007CBF66E0A801E613EDEA233BB6BE5BA29B +:109D000071EA0B9F33A1DFE4AE6EBE2E1BC53E0091 +:109D1000F09781F6C0DAEC68A1C7DB38BFB33EDA52 +:109D200047B367383D19837AF6F0FDC42AAAA7F530 +:109D3000675ACDFD5EF5C21F037290CA7F922D89CE +:109D40007DED6A9176F0548CBB49EAF3CA88D7B1AD +:109D500092279C6FB4F429212F620F0F4CC1F53B61 +:109D600000FC857E992D52DDDDAFC1FCB68C2FF253 +:109D7000A009E5067692CBF03BB022E0BDBCE7B38C +:109D800029C8376070D37A6DE8A994EB6DA4B769E0 +:109D9000FF9814DDD485E5497714925E8D1AC7EEDD +:109DA0009801DF7F2EF09A6CE37E2EF7EA40D6F220 +:109DB000121CDF77F76B387E6914F929938036F629 +:109DC000384ADBD12FE466AB24ACF7680CEF3FC117 +:109DD00020DF5157427297F2711EC9BB13D29E6C9D +:109DE00027F76799590DC289DF693F069C81FB59A6 +:109DF000F473613F49393C3D9B1C5250406C65FDFA +:109E00003BF6207FF6981D88A7DA9E5F1E477D5996 +:109E10006B61DD32DA2B1176C6CAF49987903FCF99 +:109E20009D39B9E37EF8F6E84D073D7EA28BDE7ED4 +:109E300088DC2FECC42AC923DB7BBFCBD6DB7B833A +:109E4000F97FB8BDC7EDFAC09E68754F983C6F1496 +:109E5000FBB4734BCEC7A09EF97890BF404F570C10 +:109E6000D92BF376477F88EB6AD0EE8FB01B8E3DFF +:109E7000111D40FA9FEFB6929F4E41BB07E0396338 +:109E80001FF80122C765F27925DC3FEC337A56438F +:109E90007F8D779EFEB901D69DD205764F2CDAFBD9 +:109EA0006A2CC9D9D765B607ED32C5EB40BF870626 +:109EB000BFE29CE2F696A05CE4F35F660AE5931DC0 +:109EC00064624B281F13CA47BBE725A1779645411B +:109ED0001EBE37BBFD7F41BAA598B9BCC276F8BD9E +:109EE0004BD85B5D801207E2E538ECBBB384FEC65D +:109EF000FDCF83E9C1F5E4C7B1103D3F7EC5BC137A +:109F0000FD3C1F171A4226EE97203F96DAAEB0644A +:109F1000A8AF1EB70655EEEFB21840FFCF7FF8AEE0 +:109F200037705F31FF15EEC79A7FE7CAE9B8FFF8CF +:109F300078C61413CA9B85CC4F7EE7C58CFBA197CE +:109F4000B220F757338701C7BB0BC4C6561435017F +:109F5000C0FE55F05932486857A86D9027A3D9DB49 +:109F60005103E3CE6B33D0BE647EBBDE9F7E61FDCA +:109F7000DD35A8C7D7B619B8FDD82E911E9FCFBC26 +:109F80006EB43B34BC16E4C473FF689BC18BE35CC6 +:109F90009F6322FE031205697E226D330A3FBC8057 +:109FA000631533843035483C5DEB506A86D3CF5A15 +:109FB0007F6DC6260BFAC306D20DE407BE60F2CE53 +:109FC000263F6A5C3E433F629BBDA9BD8697D39AFC +:109FD000B9601DF051F9B50A37F8981A87F2323D89 +:109FE00087DB0F91F35DD8A1CF479E4F2C0DEAF38D +:109FF000F399BF203907FD46FAEFE9395C5E5D58F9 +:10A000009F25CE013C740ED06654DFCE4279B54E0A +:10A010002179B92A8DE3CB90CED36C67F56CE25FE2 +:10A0200027D817042F873FFB5A97847AB3CDC9F9F5 +:10A03000F27F0A7724BC37E4E413BC6D68E4C1788E +:10A040006DEBA420C71787FB4AFD174B72F47268AB +:10A0500030FF8FDF77727E5C278BF5E6203934CFB7 +:10A06000C1E7F4B1E4792284DF6D601F00DCF3D72F +:10A07000C96568A74C9A69A37934BC62257F6BFDDA +:10A08000CAFE0CB267ABFAF39B86C12B42AB68F2F7 +:10A090000BEACD73C13E01D76DBBFE9C0A342D0B7C +:10A0A0003F779A99E6BD2F2701F7231FEFFB25D2B3 +:10A0B0007B9F95F413FCEF9019E5D70B596437E5B6 +:10A0C000A7F9EFCF41BD1E15DAF16416DA29DC4E8F +:10A0D000AAEF3577A11D38AF2DECDC0BFFD9A03FDF +:10A0E0000763ED71E4DF609DFAEF4BB645B4BBE466 +:10A0F0005C8CEBFB4D26FF28B4EFAEBFCE9B8C7281 +:10A10000F5CC520343FACE973D8B508E9CB1EAEDCD +:10A11000EF33764EAFDD8374F6E4239D778F486787 +:10A120004F3ED279BE81F9C3FBA9473A037D970917 +:10A130003A9F3970553ED2F9D37D57E5239D3719A3 +:10A140003BBCB86E7665FAF7221E4F4CF691FD04C3 +:10A15000F22AFF9BF0E38B11FCF8E2FF1E3F52BB9B +:10A1600091F4E1D19CE1F5A1CBA4A6A13C9C67317F +:10A170007FAD5EC49F61FD6B1633F9255EF9F2F386 +:10A18000879E403BA457263B44EBEF15C59F837E3B +:10A1900085578EBB3D0169E4FEEF16FB18B78505B8 +:10A1A000D0FFA1D9FD9AFD18298FDF17783C9DE3D8 +:10A1B000FD36ED1785BF7689E8D312FC9CDBA9BB81 +:10A1C00025F2C75AD46E2FDABD0D2FCF75A0BFF67A +:10A1D0005490FB671B0E8C25FFEDD2E0ABA154B46D +:10A1E0000B7B2507EE1F96EEFE3006CFBB613FFAD4 +:10A1F000494ED87E74B2D88F9E0A7E1C83E7E23027 +:10A20000FE54D4CBD1AE0113F26F03ECD3A00A6B92 +:10A2100050068E627F0D2EE609A0A8E8D1EFDBB4D0 +:10A22000F3CBAD3E13C9BBADBD5210F76989267F94 +:10A23000561AEA2796E6A0732EB15EFE33C79B98A6 +:10A240003B3EFCDCD8FB971C7EAE4CEDFBB7C4124A +:10A250001FF61B9997EC802D7621971492537FDE81 +:10A26000E6A47D0FFD40FD3F07B328AFE9EB450AAB +:10A270000B2980F745B3BCEF21DD507E8722E477C0 +:10A28000787EF03C9AF571FD02F23C34DCF9B83886 +:10A29000A7C6F3DDF0F60D6C80DAE139AFAE5F6D85 +:10A2A0001FC09AC6AA00F75DB7DB3C68BF34025FE7 +:10A2B00037970DF1E13231158D0F1B849FB771C9AE +:10A2C00047B41F68EC911CE8DF5DE6E17CB80CF652 +:10A2D00049E6D197AE5BD60D7C1806F748EB785C63 +:10A2E000AE7E1D0FE6FF49FECCEB72F5EB579BBF30 +:10A2F000E6171F9C67AFC4D757C4BC22F79791FEDF +:10A300006C6D7F78A572EDA6087CDCF4BF8C8F9114 +:10A31000E4DADCDC91E49AFEBCE01BCBB5C87383C5 +:10A320005CEE07C773033CD7FD9F9E1B7CA276247F +:10A330001A480F7A75E7A968A7E338EDDB65B20F15 +:10A34000A6C8FC1CBADE6E263F6DE4796BA33A45C5 +:10A350009C2FF6FDF66AD49FFB8D0CF5FA12DB629A +:10A360003ACF6C949F3139D461CE19954364BF7F45 +:10A37000D3F3F775B983E7EF5978FEFEAAEDF378CA +:10A380007F185DAB4AC0D02FA1389661E5F62382D5 +:10A390004FA245FC844509306758FB91DAFD34979C +:10A3A000DBCBAF8A381AB789B5637CC6C3F6682F92 +:10A3B000EE4BDC061EE7D392EDDB8E72D2A2723C2E +:10A3C0003FFEC22DCC00F37FDCD84DF224506FF35A +:10A3D000A05CD4FC305AFF56B15FBD52FE3F30C87E +:10A3E000779CFF07F3FF2479F06FDA78DFF49C6C39 +:10A3F00033E046B74E189D87BD81E73B5997F2F38E +:10A4000048FD8CC4D76FE7FADECC25B9E01D4DE7D7 +:10A41000FE572877A2CB073E467F0FDB6F5671DFD2 +:10A42000817E0FD2971B92B91E533C158867B0F7F7 +:10A430002A304EEA03FCEFD523DB87A706E513B7E6 +:10A440000F4F8D289FFE3EFBF04799BED3C867276C +:10A450002ABDF9A83FD7DA017EDCF73DC5E36BB62C +:10A4600059397F6E93385FB2E678CD7F42F30A3C6C +:10A47000CBCFC723F98AE5E9F96A30FF4F96ABB62F +:10A480004138FE97E5EA92FF8A413FE8C8FD04881B +:10A490006E15557D84B7819725B633CC3FDDD8C77F +:10A4A000E3D4D205BCDAF70BC2DE5D94E7CDC07809 +:10A4B000AF4FDFB358582C9842C8636897F96C7453 +:10A4C0003ED0D0CDE3481A56323A0F6E40FF6709AE +:10A4D000FA05EB18DA7FCFA9FEC2BCF1789E610BBA +:10A4E000C8B1E8379FC1D0EE3BFB1ECF37A8FE12A4 +:10A4F0002C6F5CD9AF3B87A8F8EAF335E8D7007832 +:10A50000C94FE042BF4D189D66E7F1F84B2DBD29BC +:10A51000027EF4E313FF77CB41B417A3D53E3A177D +:10A5200068D8CF8DB80AD94BFE7B76571C433E6A5C +:10A53000D85F39F635AA6F1D8BF66EC5EF6B1DE837 +:10A54000A7F8F45A17C51F64C8FD4BD1DE3A92ED47 +:10A550009F84F8B09707A7A2BD9A09F62ADABF9F91 +:10A56000EE9B3A16E1D6E4DF26F47F43BF9BEC7AFC +:10A57000FF36B378B3EE47FFF7CE24DA3FEE4BF168 +:10A580007F1BE7BFC9CAE10D6CB4F2F52AFCDE916E +:10A59000EB5F5BF749B281C649BACD42E7D49A5C1A +:10A5A000D864647E4BCE903C1927E2E9001F3C9EA4 +:10A5B000AFB78EC78188BCCDA58F6B3C9D33791C0E +:10A5C000C2332E4FA1760B2D0312FAE1178AF3F94D +:10A5D0001B449C85166775C6E15B80F8602B6B8613 +:10A5E000CEE5B3B1BD83F3BF889F89BEC8EDE86CEB +:10A5F0008789F8C6DECEF8B912F00DD267E240DFE7 +:10A60000A458984F6E676822E2F3958B06C2875272 +:10A61000F7069DA7C422D9A09F9C0DFDEB0AD09FF1 +:10A62000E278F75AA48BDAE1A842D43DA7FAEEC942 +:10A63000A375DE5488FBCBAADF1879BCE0CBD164CC +:10A640000774662CA378C1B3EF03BF665DAA0FB48D +:10A6500034C056537C6076CF3BE4D7B7EF97868DF6 +:10A66000FB7C38CFC6E36F027D1487C626BA081F6D +:10A67000CACBBF0FA0FDA1AC53C893D166F41AACEE +:10A6800048D7558CFCF0799D0E03D22553C49D9C70 +:10A690007BE5BF47FB69BFA2F9F1833C4EC8D8BF39 +:10A6A00006F75FCAAAFEEB6005B3FAFD4E4303FA54 +:10A6B0003D8D030DE43779399AFCA3993D39ABBF41 +:10A6C00005F9CC76079350FEBC785726F27500E664 +:10A6D0009937CC3C9BF38CB45E9497A30DA8B794A8 +:10A6E0008D8CE21415676215C1FD28E4A19FE582F7 +:10A6F0006FB4F34900D78DFA68519E7F37D23B5A29 +:10A70000C801D61C45FE44BBC2FD1EF6E6F79F5DA0 +:10A7100005F91DC21F7BF895E219E4BF5BA7484805 +:10A72000870BCEB9990EF8FE8B3C6E8FD8953EE61E +:10A73000B085E3FF30C56566BFCCE3D61423E713CD +:10A74000659DAB0BFD835FA4F929FEF4DAB6904C4E +:10A75000E75B8E138FD4A861FB9BCD5C8F34ECE557 +:10A76000FBEAC8FDCCE5F4C7B13CBD5D3E98FF27D0 +:10A77000D925EF0C8EFF77EE53987E7F17699F44A3 +:10A78000EEE72EB1BF23FA1BC94ED1E23CAA86C622 +:10A79000217E78D5AED941015D1C4C958D8FCB2C97 +:10A7A000FAFE9F12F13B5A5C4C62ABBA0AE3CF0748 +:10A7B000EE63E46FD3E276B4389D4015DF47040CB6 +:10A7C00020F7B2F07CA883E27352594892683FD0D8 +:10A7D000CFB07D12C6E940FBFEBC6C827F3BF3B478 +:10A7E000CB24175509E1B7627C473CC21DDCB20897 +:10A7F000C7BBC946E35931BE239EF611B48E537CC4 +:10A800003CAE73D2121E0F9A02FA17F329B99C2F8D +:10A81000ADB34D14E7A9C56D68F11D1A5EAA04BE5B +:10A82000530A1665E17E418B03D914157CCA2A634D +:10A83000FC8790FB4B0D24F7B5F8BACE3C3588FC6D +:10A840007E0EE3406D571EEF11895F2DEEE3FA7423 +:10A850007F72FE788AFB203DAAC56B68FC1246C752 +:10A860008015C6DFFA32B7DFAB969808FE734BA7A8 +:10A87000917FF1DC5203C37554D56BE6FC1731DED2 +:10A88000D6D92616C27E95A015E5A7C60797B35F51 +:10A8900081AE85E8BF3DDCB237E704ACF9232DDD9E +:10A8A000949EB34ADDF2184C07E6A0A41AFD64C6D4 +:10A8B0004CE56A8C6319C8908075CAF6E6CEA27C16 +:10A8C000C2C007989FF6E4AC590AE8897379033B44 +:10A8D00024A8EF2FF87026E5912753189BF0C46F3A +:10A8E000660668DEDC1F3549F8A3CC4EFFB5F909D2 +:10A8F000785FA07F4D1FF97D78DC3FC605223DDCE7 +:10A900003613D9376E118FC9AA457C269ECC40BE1E +:10A9100035792C9D67DB98BABF0FCBD3CC5CDF3386 +:10A92000CECFAD79DC5F4C2A1265679AE65FEA0FFD +:10A93000A0BC6ACD7252FB41B9BADF1CE47E2E3E48 +:10A94000FE5B074AE91C4A8B3365CC913EAB94E22F +:10A950005174F987ADFC5C94298E74B41F5A8DC272 +:10A960004E15F9A834FF77F3C3ECA4B726FF4B09C3 +:10A97000AE8733077F948B72EA0613D8F1C3C8A55C +:10A98000D4422E97CE196DED12D86D6FA4FAE7233D +:10A99000BE8E47CF99E28479CD8EAF343911DEC0B7 +:10A9A0005332CAC904416FE72C0E9FB3DA272D84B6 +:10A9B0007E5BADB09EA17D825FF192BDEE9F25DDF5 +:10A9C0000470B74AC27E676A2CD9ED856A2C9EFB5B +:10A9D0002D6B7E87E2AE652107642107DE6EE9CF2D +:10A9E00055F240E5766F94D1DE7E479C3FBF93C51C +:10A9F000EEA81B66FFBB299FDB873364B514F9C83B +:10AA000075FFC4776A812F64932748F44BB7ABC8AE +:10AA1000EF87EC15EE7EE847CABCAF1CE3965BD32C +:10AA2000EF2BC7B81339CEE3F685E537E5733EAEB5 +:10AA3000C67A88B7E8A672D463FFB0FE62A1BF925F +:10AA4000BFBFBFC17ECC1CAE6596810C05D6A7C723 +:10AA5000EDDF8A74BB30F7433A8FFD41CA5B1F605C +:10AA6000FCC45BC68E49312887B224C1B7DC5E3B8B +:10AA70005AA0F93D79DCFBD162EEF70439C4E32B2F +:10AA80004BF93D9BDA598CD673AD88BB98E2E0F761 +:10AA900096A69467795A616AD3D98082727ACA710C +:10AAA0005F0CD28FCDF297FB4A47B6C398DBA886DE +:10AAB000CB95A96A581EFEDE58A8CF7FDBA3CF7FB7 +:10AAC00067C25F0BC2F31BDDDEE771DE2F493C8EF0 +:10AAD00033703573D03C5D5200EDA5E2E753BA8484 +:10AAE0007F97E20D7F26F673CF4F60549EB8D7B2A2 +:10AAF00013EF1F687E72599417BB9925338EF0416E +:10AB00007A764012718B2E3A0B6207EF7670FC4119 +:10AB10005D13F47370AE4AEB38D16660D7E15A2FFB +:10AB2000B790FDA4AD8B562BF037E0B122D512853E +:10AB3000FCDE6AF46CC6BEE428B38A7AB532C6423B +:10AB40007DCB3F56482FADB29A29F4F5F08351944E +:10AB5000AF50980FE33500C45998BE65F4049B705C +:10AB6000BE500FE7DBEA6424AFE40A13E969E89713 +:10AB7000E87A78A321C868FE950AC5630A98B57576 +:10AB80000723D1F7C7C4BA960D2C44722CC5427264 +:10AB9000EC08F48FFD1E7E5DEE223F5BA17A3B96B2 +:10ABA0009FB714D0FD9CC6C17B478A01812B1476C8 +:10ABB00094B397DF0FD3D6B3265F22D73348C15C57 +:10ABC0005722E320AAF80F4C2311F53E237B5E3B6E +:10ABD0003F4CB768E58A17C7491EACCFEF67258A97 +:10ABE0007C6A4116AD37A8123294A1FDF1CBBF208B +:10ABF000DF6AF261C7DA1F937CB814FF85DFA7FC18 +:10AC000034BB83E3BF200DD7A11C559086FAAED587 +:10AC1000E9517D61F9425846B3E3103F500FF233DA +:10AC20006B3ECC55C2FC83A9052A094BA8E78D07CA +:10AC3000380E5BD5345CAFC38C5BCFC78DFEC78E3F +:10AC4000EB8671A1DE613B8C0BF5765BCD2143CCAD +:10AC500070E34F5071BCCB8D0BE824A44E137806E3 +:10AC6000BE08A05FEAB0DD40FC394DC4EF1E4EE0E7 +:10AC7000E3B1427D7C4D6E148C4FFE587D3CCD0D72 +:10AC8000D2B636D4CB8F596376223FFE52F0C9D16B +:10AC9000E81FE7A25DF5CB39F94750AE4C895DD589 +:10ACA000864C328D7593BCD1E4DE85E40F2B300FDA +:10ACB000F2EF9A02A0FB0FB2DF9A839D1F713E96BE +:10ACC0008BFA0FE4C3B70A122E855FE3470D6EE4DB +:10ACD000435C07837C1801BFC6476C7A3705206E3A +:10ACE00007BB1453CD4E65AC89C789ABE943F30369 +:10ACF000269E6269E2F3581520B86F703E42F168F3 +:10AD0000D78EF2FB10DED9633ECB50B0B27B6E0122 +:10AD1000EEC300DEBAFF9FF046DAE5978B97D6E0E8 +:10AD20008A5CC7DAF8D28CBD142FDD38CB46F1D35C +:10AD30009344DC69E31203C511C1FE8DECFE066687 +:10AD400009A21CBE46D8D15A1CFF8B12F77F060EF3 +:10AD500098D53D61F6F8A571D42AC5690756F278F1 +:10AD6000EB417BBB9EDBDB837A4DDC1BE81CCB65B8 +:10AD700079E7DD2AC553BC24F1FA81B98CDBEB7588 +:10AD8000A27CA143C45BC05C1287E2D93BBB18F133 +:10AD90007FA73D9BCA5364AE7FD8B7B8FEE9CCE22B +:10ADA000F664E7ADF9540EFB825188F7F932D8CF3B +:10ADB000FCFC9EEF0FF2F878917EDA4D05DC2E1B3D +:10ADC000B473443ED22FBB2BD3BF05F965618937DD +:10ADD0004302BE9A6FE27E57E0BB6D7867A6863568 +:10ADE000ED5672F0FE45D3BB861CE2BBC789EF8AE5 +:10ADF00081EF72747C172C18CFE52F0A538DEF0664 +:10AE0000F9AD30325ECEFF148EDBE9ECFE7D03EE51 +:10AE10002B7ACD44072DEE31729D87C173C2C8E1F4 +:10AE200071C932C1B36F3878AE84FFC3F92D89710F +:10AE30003E1F691D24292C602F1B5A071BDDFE10A5 +:10AE4000C23FB81ED6F07DE42570CB36E28B9B6FF7 +:10AE50009539BF46737D8EE74DC9307E9D18FFE65C +:10AE600075BE6A27D6AB93080F75BDF51417C6AA31 +:10AE7000F9B99107FE203CAD42CE69E75BB345FBD3 +:10AE8000998E3A23FAE366D5EACF9966DBF839D68C +:10AE9000CDB38C1F85DB3DB3D986CF308E71369E06 +:10AEA0004369F5818FDE2F183C872AC073A823C21F +:10AEB000CF720EF81AF9FEB584C5DBEE06BE2BF88C +:10AEC000694919FAE326272EDDBD11F24F6E2DA236 +:10AED000FC6B89B7DDF31696EFC8A77CB541223E1F +:10AEE0003D57CFDB1756DC3A2D2B06E5BFE817D7C9 +:10AEF00013EED7A3FC9D7550CF3D3ABB0CE34BAB93 +:10AF000085DFE0DCDD8CCA6F1C63E721BB8B55F26B +:10AF1000FB554789F2EFF17EDF18FBBB328C33AE75 +:10AF2000CE1E9883FCFD46D94B45983F227D36675F +:10AF3000B873AFE24229340AF0521DC7EBD7963DF1 +:10AF400095827E98EA2A9E2FF654AECBC172C3F941 +:10AF500039C3DDFF8D12FB9EC1FB6C625D3FEFFDCF +:10AF600090EEAFF92C9207A7E89BF021F91D984DC0 +:10AF700072A0EBCCE7CD52D0CF3DC9CBE350AB2C88 +:10AF8000AB92517E4DF79BCA319ED861197B04E389 +:10AF90000C6227548E47BA4EB230A22BF0794C2166 +:10AFA000FAB5AFFA2C230699CBA6E7738D8FEA3456 +:10AFB000FEAED6F331AC4F57E1F8CBCBDB91F818AE +:10AFC000C6CFC0F6B3BFA5D73783FD45ACB7C8FE23 +:10AFD000479203F8132E1787E0E8A6759586D17D72 +:10AFE00039B8EE3AB4753706E13019FAE81E4FA6C3 +:10AFF000E429A20BAD133C16D24711706BF0A58368 +:10B000006C636597C2853F8A662F72081C8E441C4C +:10B010009797433B2F8B1B820BC6BF1EE9C0D67090 +:10B0200078B64B4D5C6E88FD81E6CF68D0E6DBA339 +:10B030009F6F4514BFD7EE46BF13B6738D2DFA3AF6 +:10B04000B81B853E9D65F13D688639DCE49C4FFC6C +:10B05000700B683427CCFF6FA9FE3AC447AB147855 +:10B06000B93F8BFCF114FF01F49E5118660768701C +:10B0700045E2A3610479180977241E86E8D3978CEA +:10B08000A9761F6E705E11F369B5F3F53A30DECC28 +:10B09000DFB550C01485FC9B5211C5A16870BD2955 +:10B0A00071BF6440E2F78F347B2212BEC87B7A1AEC +:10B0B0005CE8EFE3700CACC23B820F166A7E3E4E3A +:10B0C000AF24019FC9200D7B1EFE60A141F3B3EAAE +:10B0D000E819797F4DC39B16E715892F2D4EEB920A +:10B0E00073B78873E591EA4960A7A7C65D8A47ED03 +:10B0F000DC2E6ED04FC9FD4003F7DA490EC60DFABB +:10B10000298F2968DF4FF21C52D02EAFAD81090084 +:10B110000DDE147E1F0DDF0F64F8B71492DEEE1FF4 +:10B120008FFE959F4C7D82CEAB3E30703F7D247E5E +:10B13000F68C809F91F87D24F8A3D27C4FE2B8670B +:10B14000A4BE0A2CECCC16E742CC9F85EBC1E9C823 +:10B15000AA44FF11C8D7AFBEC24D2B16015DCB3339 +:10B16000FDBFC076B730DF64A46F5C8DDFC8CF4908 +:10B1700018F9E1978BFDE364A177CF6FE3F11ED55A +:10B18000DE518F4D44BBF198910569DD7B497FDE2F +:10B1900025E03F0F2A3684F59FB193FE5DFCFA7CD3 +:10B1A0008AE328D86C187A4F03FE8E0A46E9DED36C +:10B1B00028DE1BA7CB9776A7E8EA8FE9C9D6958F3B +:10B1C0000D15E9CAC71D2BD3E5C7F75DA3AB7FD526 +:10B1D000F12A5DFEEAFE69BAFADF3A354397BF7697 +:10B1E000E0BBBAFA1F0FFA0F84DD10F0F615C2BCEF +:10B1F0001788795F7F719EAEFD9F62A61C437E5CBF +:10B20000B081C7A557028674EF8B7470FBA209FE4C +:10B21000207D27B3018A076C084A9E10C3F836BD0B +:10B22000FDB1B4A78BF078B9FBF805AEB90634B917 +:10B230004F170AFBE32A76158F67FD7ABAE6B3BC8F +:10B24000BF8BAE66B79EAE56554FD7E8423D5DED1B +:10B250001E3D5D6327E8E9EAF4EAE91A5FA3A76BFC +:10B26000824F4FD7A4D97ABA26FBF5744D5DA2A7B9 +:10B270006B7A939EAE99CD7ABA6505EED4958F44DC +:10B280006F4D9EE6B42FD7D51FA4BB6F09C537E518 +:10B2900075FC50D7BF46F700FC41BA17301187F94B +:10B2A0003FA47BE1283DBD416F8D1A359EEC8D1288 +:10B2B0004C671708BBDE37BCBDA1C99F70FD1EBE21 +:10B2C000AF1D492E5DA2CFC43E77447D16B1CF7D20 +:10B2D0008F81BEA5413690DFEA56C19F87A338DE35 +:10B2E0003FC7A2ABA11ED4990070BD8770C338EFD1 +:10B2F0004515933FE2BBACDB88FDDFCEFA289DC34A +:10B300000628F53307E9EF79CC43E902E63309FF74 +:10B31000C4F45109E8B7E8AF40FD7F61EE5B1FD090 +:10B32000B9D61BF157F40EC547787E92C7D849218C +:10B330000F4EE0390AE4CF5A07F5ABEA0AC3DB49FE +:10B34000E16F9C3749223DCDE4288AEF9A778B4400 +:10B35000E744F3FE93A78B46493C1E24226D6DD62D +:10B36000F0C7F7473B47A904471AEB16F61CF3DB77 +:10B3700072A81F7EEEB1CB44FB58B785C3F7ACC4AF +:10B38000940971741D8EE8EAB670789E35320BE22E +:10B39000F369E65791180F2820A2F83D8C22E48F1C +:10B3A00079FFF95636FAE9A2A25E98557D359ECB13 +:10B3B0000456919FFC7B4CEF27BFBD49223FF9F714 +:10B3C000004E48DD0E8F1BED7C2DFFB080B71AEBD1 +:10B3D000C1F7247793847EA97F587FFB7FC8EBFD5C +:10B3E0009DFD0DF6C3385CF883F4D3FC9E85061EE4 +:10B3F00027317037DF1FEDFE1EE3FEBBE640650020 +:10B40000CF45653094308ECAC8EFC7EF1CC5FD9E8E +:10B41000C9AC8FFC0BECA866D7FA49FE9688FB17DF +:10B4200067C5B9E2A22E0BC3389D927D87E2F01C5E +:10B430007111F0601FEA61C54FEFBF946C792D8EDA +:10B44000FBFD8C4EBC57A9E9FF91F9546127C3EE6F +:10B450003100DF350D677FBC5AC4E3035A5BFA46FF +:10B46000E139A006CFFD2DC7282F2B1E86E797F8C0 +:10B470003E5478FCA3C905E561F24EB141FB303979 +:10B4800064B4F9E89195352D7D74BE6814EF58AD1C +:10B490004D5BEEF087D989874609FBC71260B84F2C +:10B4A000E02A0A53E524CAB5FF627C1F6D76433F4C +:10B4B000E1F2F362020B3F1F686F394EF0AE91FC70 +:10B4C0007EECC49CCB4256A08F59C1BBC0F07DCB53 +:10B4D0000DC7308ECB645FEE09A923E3CDEC562E69 +:10B4E00084CBD3B723E4E94F5A068A719CD6967E63 +:10B4F0000D5F0CCF6B03C9DCBE6E6DF984BE1BC043 +:10B500003E447E7B754BC12115CA3F80BFF8DE8E5D +:10B51000D9C5E162175DA457E7083E405F5C3AF089 +:10B52000CF07CD46E2B315E9363A2758F166DE215A +:10B530002FAC67134C57FE06700F8DC3F16412F2E7 +:10B5400014F8C987F2C194A2D079419C6306D1E96D +:10B55000EFED4FC3AFC9CAE89D2453BA8DEC822BDF +:10B5600085F36FA3F83B4083F6C94517C9FF150261 +:10B570002FDABB4F1FDCC3C8DFB3E25EEE375C518E +:10B58000CFE81E026B869F8A21BED1F44C02BE50CA +:10B59000031F3B5A60C541170FB55898BF00EC1008 +:10B5A0008CDBCF19A2638757716288C1C66A571DA9 +:10B5B000A60F4D38D181E2EFE1895FF4618A67041B +:10B5C00038BEA38905D13EA6B37F18DFB904F23097 +:10B5D0007E8C288FF1F37CAC288F9DCDF3E9DEE7DC +:10B5E000A46A042CE23C2BDD16373517E5F402C6BD +:10B5F000EF818B7720B60B7D916A8BABABC6F2DB0C +:10B6000019DD0BD1CA7F2ACA936D1FB5E7A01E9919 +:10B61000A56FBF45E021C9F651C7243AF7D2976B11 +:10B62000E74A09B6F3C7A87D89BEFC51D1DE6E3B5F +:10B63000DF3709CB73F5E33F28CAA36D5C1E321FC9 +:10B64000E3EF1588F20744B915CB717C0F2F97B53E +:10B65000773944BD75020E8CA923BFEB28EE77DD48 +:10B66000D1622921BAB45C24FA3CD4C2287F6B5140 +:10B670001CC909430DC7779C8BF383A3990DFB4E1F +:10B68000C1AD42AEC5A8FD5EEF30724F2B8F73F097 +:10B69000771864B789F8C96C137243ACC741B921F4 +:10B6A00035793893713FFDE5F81A16DA05B48F3213 +:10B6B000E007F93AED1E03F387C9CB946551CC1F1F +:10B6C00056DFBD204E974FBC3D4557DF352B5B57AE +:10B6D0006E2B2FD295B35971B46E960BFE8A2A2920 +:10B6E000D3956BEF43B0DDA29E58BFC6DC6B74F5FB +:10B6F000CE17AAB1C8E327A782FEA178068F05E579 +:10B70000C3727B7612EA9FA75B2610729E85750531 +:10B71000462B7BC6C9E3DC9FC1F34328FF598B97B7 +:10B72000BEEF817215D25DB0EE54A8DFD5E2A0FC69 +:10B73000E32D6E4AB7B7A894FEB4A590CAB7B47803 +:10B7400028FF18F48FE9A3D00F7E7FA4A586F21BF3 +:10B750005B7C947FB86536E51F6CF153FA40CB12E1 +:10B76000FABEAEA589F26B5B9A29BDBF2540696B15 +:10B770004B3B6F57C4F5CC33E25EED3395FCBE7C9A +:10B78000241D3B8B841F52C4ADD887E2563A8B30C0 +:10B790006EA5BB9FEC702D6E05E74DFD59F9FC239E +:10B7A000FB7BAA88DB6F45AC6F55345FCF743E9C42 +:10B7B000D7E3591D0D7C9FDAC4E990D53340E5C924 +:10B7C0004B382D9E12FCC95C01965641510254EF34 +:10B7D000ACD45715CDCFD529CE91B9619E15E2FDD8 +:10B7E0002662BBA001E1522670FDA9D17570DE4E24 +:10B7F0000E27CE7F3878F70B78E5F26EFE2E4B4D94 +:10B800004708D93ECADB44EFB25866FB420AA42E71 +:10B810009F9FDE8928BA38053667206F2E5EC75491 +:10B8200048D396E9F76D290BCA74FB22F9E2434C21 +:10B830000539602BD1EFAFA27297EBDA59D27EA80F +:10B840002B37B956EBCAE7DD95B5C68DF84CE5E761 +:10B850004BE60DAB5832C0B5B07323C1F59198C714 +:10B860005949A5FBE5817D5ABC05DF5F3C29F40BF6 +:10B87000B36C207BACC0C9B3F9B10103EA874FFFB9 +:10B880003596E4D2138F1B82E84706F164C0F55F5A +:10B890000C661F9697B27ECA63A80CE6C73255C6DF +:10B8A000FC383640FB2BD85FBC5F8471ABB2FF71B4 +:10B8B0002BE4CFA4FB9FE4717321D29FF9829EF900 +:10B8C000DA7E6AB312E95FEE2F22FF8DFE7E5D9B6A +:10B8D000D85FB459B99F6E95B32209EDD6B323C48E +:10B8E00039DADDAF1E5D00F8B6271FA274D02FA78E +:10B8F0001A86BD3FFE4504FF8F026617FCFF05F266 +:10B90000FF99F2B713D10DD5903B40EBE0ACE47555 +:10B91000CF45FCBE2E737E841D17CE4F11F855F611 +:10B9200055BAE7021E9537733C013634CE132DC746 +:10B9300073300E41CBE78B38DDBD2DC9B9D561DF42 +:10B94000D5624EC742D65783FAAAB0C4E00962C78F +:10B950005E87CE8F61CDEDF0E27B084A19F3A098A7 +:10B960001BC53A56A3EE56FE26539C9572F86AA65E +:10B97000C27EC6660B318C4BD3FA65C21F728F90A4 +:10B980009B5F38AA63E99DCB9441F9873A927D6128 +:10B99000F3F6211F7DD169E4F33AAC2F2FB471BFC8 +:10B9A000E1A242535095F05DB50E7AC751D921B14D +:10B9B000B42C846312E1811D8C263E8CDE3C9A05FA +:10B9C00060BD943BFD9662F4DB85D483861CC193F5 +:10B9D00050AFBED8B413EDB302C48B0DF1726B6ED1 +:10B9E000350E9D5B48F85D28E63DBE98D3AB2D3DF6 +:10B9F000021EE6F1E27BA78B3A353F8E7E9E0F96C4 +:10BA0000577D07DF856CED93B95A8BC0E77A63DF0A +:10BA1000E8B9D0F5997E804B2638C717A30DBAB97F +:10BA20008205488FF3F9D53F2EB1AD5924976A4866 +:10BA30008F8F37B0F0F3532D9D58CCE5EFB1221E18 +:10BA4000876A771F257E1CCA1F39BA00F0F1B481BE +:10BA500015D2B9B181EF8FB5781D19FD0078AFA16E +:10BA600058C845D6C6A6A1DE761A28FE54EE8AA28C +:10BA70007BB3B253A1B8F7365BB5E34EECC7A1D0A8 +:10BA800039D11479621FDAD166A7611CDAE14776F1 +:10BA9000FEB00FE386E47485A1DFABCDA1703B243B +:10BAA000CD40F1808AB3DA82E74AF9B6139588CFA0 +:10BAB000435D3FA07722E4EF8B981DE117330A9294 +:10BAC000B5B126EA3F90A688F766BCB56313C59169 +:10BAD000888AFBA19A4F70BF7DC471DE8AFB02D5B4 +:10BAE000B688FC81F715F37DA211CF0F21FFF8CAAC +:10BAF000F34E945FAF77AD89CB427B3AA8902D523D +:10BB0000F8D7D6147A0FA1CB44EF356878CD0C283E +:10BB1000BA73C8F4667DDE1C711E698CB827B75CE9 +:10BB20008C8F2797A1B0F918DD7CFFC65C36DAFF51 +:10BB3000DC572CDEE914F97B447EAF3190E201FC46 +:10BB40001CEE5A9489F3BAF0829FE2CE47B2FF27E7 +:10BB500015AB62BC80D540EF0287AC1887BEBB85B1 +:10BB600079D0CEB30415BA07B047C8B35C1BE7FF62 +:10BB70003B4AF87A8D4C733BF8BA539E890A4623A8 +:10BB8000DD1CDD650158E7C5AF4E652AE8C15C875D +:10BB9000D780FEF7DC669307EDCF29BFB0119F9CDD +:10BBA000B7F1382EA5F90115BFB7EEAC2854C3E0A4 +:10BBB0000EB6383C289F76B6583C181B1F1C41BE59 +:10BBC000E6380D143FAF1A783CE72EB11E7715F317 +:10BBD000F788760A39B34B09CC403877013D316E8E +:10BBE000FFD0066E1F2F5F65213896BF9E43F6D5A6 +:10BBF00048787BA2C5EDC94578361852D05F55B953 +:10BC00002E773DBEDFB1DCCEDF3796638B1EC3AB34 +:10BC100011ECD74686F67C6BCC359EF961F25D8ED1 +:10BC20009D58887C25CB8114F4E7F43C7DE1268C7B +:10BC3000E705FA6DC57CA8F8839B307E77AF3D9011 +:10BC400082F1BDC78A3FE2E50981AD18DFDB577C91 +:10BC50009297A707520C903F5E7C9A97E705B662D1 +:10BC6000BEBFF82CCFE3D91BC8CE53C5E76F0AA0DF +:10BC7000BFC5E4598202F9E7007F092CB16E919E9D +:10BC80001678D1CA9FC3EFB001DB2FD2C8F283A2CE +:10BC90005DCF08E52F8AF2DE11FA7F45B40B8DD017 +:10BCA000FEB068776484F64745BB632394FF4A94EB +:10BCB000BF3142FFFF2EDAF58DD0FE6DD1EEDD11E2 +:10BCC000DAFF56B43B3E42F9FBA2FC3F22FAFF40AA +:10BCD000D4EF17DFB3ED1BDE47FF7D36C811944B61 +:10BCE00085F60D71B8CE77B69713FFB756F0732A65 +:10BCF0008DDFB32546EF0EDF56C2DF3BBBAD84CBF5 +:10BD000071A584F339F0E1C3C877CBDF94299EA8ED +:10BD1000D5E039154439BADE40F6C0F2D7F97E7D58 +:10BD2000F93A25187E1F486BAFC1BF06E103C66D07 +:10BD3000C314D6DB97C5FC9CD1EC767B6AC3E4992F +:10BD4000D1A1CF83BC602877417E53DC78E1BAAAC9 +:10BD5000F6C2723CEB339005A2D45B42F88E886247 +:10BD6000177AC151DE5188F0D9147A3F4193F3CC50 +:10BD7000E6D6F935DA6C0ABD2727DB79F9945F4CF2 +:10BD800074A09DD5C6FC7D5E6CEF56C88E3FD45E18 +:10BD9000E640B967B22F70E0FAFDB894E3BDBAA1EE +:10BDA000300AE5B5FCA081E4F711075FEF3BDC3C0E +:10BDB000CE0AF40ADDAF0279ED411D51C042AB500D +:10BDC0006EEE7DE8E05CEEE763F6B115747F493B0B +:10BDD000579794B07D406D09C74FA6D0230AEA1744 +:10BDE0004877958B7B3701EE8FCA54983B35ECFE34 +:10BDF000706D89CCEF3D69E7A1722DBDAB95B15255 +:10BE0000D19D23A4DDA3CF9B22F48612A15772DA21 +:10BE1000414EEACE4F1CBAFCB74A849FC7C33C6868 +:10BE2000C74EF9C5069287E751BF4923CBBD41F9FB +:10BE30002BE4F12E4400CAD100BFDF7E6843D9AFA6 +:10BE400090DECBD719E83DEB2B95A30AE218F090D2 +:10BE5000E797482FC0845270DF74393CE4197D7134 +:10BE6000F4DEC765F091F768791CCADB3CBF42FD80 +:10BE70005FA2372E83AF6725CF713FD2D11925EC52 +:10BE80006A6000F4DBC54575E1F9BE49F853B43882 +:10BE9000652549E1EFF58B7BB2B2E0E3FB99578D65 +:10BEA000CBC1F78A9AC8BFBF62DF3D6EB4DBD71A39 +:10BEB000FC0ECC1F8B9B3680E32C874D3FE26F2F0F +:10BEC000F641EF72BE7D33FA4DBA8326ED5DCD109B +:10BED000FEB30FE38FB4773BDD64AF897CD5CDD55E +:10BEE00030DF6EC5518C266847C9E44D46B049F72E +:10BEF00099D8607DBCEFF7F41183E8EFC64DD520EB +:10BF000097F64531DDBBA5FBD0CF4EF9E99BF09DFF +:10BF10005218EF4619F6663B9F99B5C976F5103C65 +:10BF2000BB9FFDEEA655E8B013FB1427E3EFCD9FB2 +:10BF300051FB6390B4B05F595F82FBF5AE1389E1AA +:10BF4000FB75AD7EACA8DFD03BD0F08C4AF53B4A08 +:10BF5000801FEA7B06624A08DF0315E1F563841F50 +:10BF600020ACFEA6AFAB5FA8C1F3CCDB3797F0FAED +:10BF7000DBB0FE59B53F91627A22E089BFB4FF9DE4 +:10BF800004FF08FD1789FA67426F53FDB3AC3FB158 +:10BF9000348BDA3D85E39C7BE3ED0A31EF443CC70B +:10BFA00079D7E6FD197E6FC13E707FA734A9F8BD31 +:10BFB000DBD2E140FBCD6AECF0A11CCEC5F7C72671 +:10BFC0000CA5CFA2F2187FE9F7487EEEB6B0F85A7A +:10BFD000E4D76603ED6F7AFA0D0F205FEE489BE819 +:10BFE000C0FDF33E535F5909DAAF076C64BF1A32E4 +:10BFF0003FB5A2DFDC5CC0D7BFD5D9E42981BC3511 +:10C00000BD84DE0F95EF5DDE4DEF98DFC7DFF752A1 +:10C010007E6CF2EF46FE0A2D2F5C18B6BE7797F2C3 +:10C020007B96EB5EB36DC0FDC13AA3A7A300ED7094 +:10C03000BB42719FCA8F0F4E23FBF0E70646F21FEB +:10C04000E65905FDB6CD55E8F7300C94CEEB2B2123 +:10C050007CF87C55502F234191F07ED0FD8ACF8211 +:10C06000E71D6661D7EDF0F0FB61DAB81784FD7962 +:10C07000A184BFB7B623EDC27B8B5DF8FE8389EE4A +:10C0800075DA961942A618BCE7B6F3D462A46774B1 +:10C09000FF3ABCE71C95A238707E3FAD85323A97D7 +:10C0A000EBA6EF817A03ED1BE29719BCE87F8CCAFF +:10C0B00035E9FC1D361827DC1F1233DAFF47A4E7E9 +:10C0C000B837951B11CFEEBB0DF43EEA83EE772D0A +:10C0D000068033A65CDFDE3151DF3EAE5A5FEEAA4A +:10C0E000D59727CED297BB6F3745F875F4F9268DD3 +:10C0F000AF4026D8404F45F1221665BBD082FB9E4B +:10C10000B5AF4531A2CFCA4D1D05B83EA307085FA4 +:10C11000514551E417589B6C22B9BEB694FBF50FFC +:10C12000A79B6EA43CCC0BF96347DA51DA8F5C8293 +:10C1300017DBA9BF62FF3616F61DFDF2A3BD9652AE +:10C140001E57C3DC15E8C763240F9F95BC9E438828 +:10C15000EFB7B8BF624733F7633F388BC741D20CA4 +:10C160002A70BDF3FA31960D7DB82F8BB1B5DF8DF6 +:10C17000F19D91784D14E70D3BF0762FF29D9FBF16 +:10C180001BBD46BB6785DF2BE8D604BD8B366BB481 +:10C1900078EF4FD809B1EEF892B6B0FB1A89C26FAA +:10C1A000F2F0C47956D41FFBC43B2283FDA9342886 +:10C1B0000F79457F54A9E6AFE1ED3769E73C229F4F +:10C1C000E0E4F97D47E26EC4F5B569565C19EEF717 +:10C1D000D70AFB2E36CDE41D05F37AE49829208D8D +:10C1E00081BCC28E18C12ED817C7C735BD1E15C059 +:10C1F0007B818FB8CBE99E61AD80FBB94ACF3BB85C +:10C20000DE07601DED84FE1F7179AC65E2DC340051 +:10C21000F051A8159828876ACB68BFFB88D763457B +:10C22000BDF9489AC78A71DAD664C581716B716E9F +:10C2300085DE897BC4E277A0FD13078AD484E749B1 +:10C24000E91D53E97E1DE0DA50C18F1A98886FC44A +:10C25000F8C27881CF1DEE050E7C97C195BBFF5FBC +:10C26000D04F1F8FFDC5F0768827A7C0D3AC52955D +:10C27000E07689FEE3173C47F5F1A7AD22AC3F41DC +:10C2800047D35416C47D9A36BED6CF60FFCC4BE759 +:10C29000006B7EC5F1B62A9DBF8F65BA8BD17EEE4D +:10C2A000B94AFF5EE4B381E428927729EE942AE448 +:10C2B000A394635B67E0BD8B35BF8AE2E32CE4FCAB +:10C2C0009EA230CB7538EF04BF03F118B95E938F8F +:10C2D00074D421536A74895CBFC90A6B97E32E5DDD +:10C2E000C7C96E5755FEE861D673C47A493E36F029 +:10C2F0007DEC3F725D6F8FFE602CD72361DFE5CB55 +:10C30000E7DBA4FE75248793155A67E911E3E13B47 +:10C310007B98979841C5B8E8DDA54EC1C7A0974A5C +:10C3200091EF1D936CFCBC9DF8ABEAF90DDFFD3578 +:10C33000E42FE0EFF3815AA9C73AFA482FF6F80B39 +:10C34000B0FE36C5FF38FAD3B71D4FA2F72BCDD1BB +:10C35000FCFD5153C47B299ABED85DCAFD486AC40E +:10C36000BB9BDF34ED4E4B2B7678B0BFB77F6B496C +:10C37000F8C7DB3F6947BA57D9604D3F5372F32680 +:10C38000BCFF6C7D93973F0DF980827859467E976C +:10C39000C31977D2FC5BDF33933FAB54F66CC63CDA +:10C3A000FBBD95FC717B0F4C9C8DEBA4D55EA1A2CF +:10C3B000BD7F40ACE37F1569E4BC6493C78FF64052 +:10C3C000E4F7674B35FF9BE77817D0B7749789DEA2 +:10C3D000711A8C8FE8B2F2785461872E10F26CC11A +:10C3E000C1F5198718BEC351F75A29B45F60AF4E23 +:10C3F0004478522F4ACC0FF26F9B389F4D753D27E2 +:10C40000A19C49731DA944799FCEFA56A1DC486FBF +:10C41000D29F97A55E54A8DDBE142FF5873F18075D +:10C420006A62624DC7F9D92A94F329FCBCC5E48835 +:10C43000E271A1EE6ADD3D6AED7DDBB7851C350159 +:10C440004E8D6590DA147E6F3FA2FEEF443D19FDDC +:10C45000F6E8FC771C3D4EFDDA944FC3E34D715F67 +:10C460004A426B193FFF043C05701FCA62E3F8792A +:10C47000A9D7AB86C7DFA682DC359761FC4980E28D +:10C480004492C5BD082DAE0730E044BF9B16F7B1FE +:10C4900093E9ED112DD5F6E7B9CD32ED3B8A5FB5C5 +:10C4A000F2FD413B0B5A25F48731923BB91BF8F959 +:10C4B000B4E617BB0D1713EA257C0F97C6EBA63819 +:10C4C0006ACDAE02FA92DC5917F1CE94F68EB661BF +:10C4D00034E78B6D2D0EA2A3569EE68FA4A3FE9C7F +:10C4E00053AB977A3195F9E3C3FB0D527FA9CDFB8E +:10C4F000891F522F6650F9B616F532FD678FD07F2F +:10C5000032F1CBC8FDA751F9F6D0BBCEE9808A9FA6 +:10C510000EEC77FA54942BA1A99E61F09C7A8F5E61 +:10C520004E8EE9D1CB5D0D2FDB14AFAB0EF0BDED20 +:10C530001E83A78B61FCA9BE5E4DD66F9CFC5D6B14 +:10C54000AD7EC83513EB2FE3F5BF754A5FDF577932 +:10C5500020B23EC177FD457DBD48FA44C20B70252F +:10C56000DC1406D7248BFEF7DACD9E7B095C09B775 +:10C5700084C175835B5FDFBF6A78B86E2C347F2D12 +:10C580005C5ABDEF4CB8B27A91F39859631E01EF33 +:10C59000BCFE2DB3AFACDFDB967C7DBD3B9A23C7E1 +:10C5A000096871DB3A7B24BE99DBEF0E36407126B9 +:10C5B0009ADD11C71C22FE8BDB0DEFE07F93197B08 +:10C5C00060B46FCEE804C4BFF7F64755BC1FC3F58F +:10C5D00015ABE5EF56C2BEA434FC5DEE21B8565350 +:10C5E000BF2F61BC13E9598B07EDCEE25466494673 +:10C5F000E3CB1DCCC6F7C7EA476BF29AC79717097A +:10C60000DC3D9BD2BDDC49EB3C1887F07CD371EF5D +:10C610001DEDBD67F4F8A1FA23F95B343C994CDDBC +:10C62000F47B1D06EA6D1ED40FEF6211B4DB75B307 +:10C63000398476B516877A3C7ACED10495DE3D589A +:10C640008DFDCFBE65EA1ACC4B87E3D5E536BC3706 +:10C65000D5AFDD2F5D83785B66F167261AE87CB580 +:10C6600000F7C3CC172F2E23FB4A878BD3D0E0A92A +:10C670009638FEA3D2FC0FE338D586BE1D3EFCA63D +:10C68000F4F17DB62381BFBB84EFEB0CB3FE353CE8 +:10C6900054897E0E193D5F0EC0FC0E6D8CA57BF893 +:10C6A0000BE26F99836FB22C34F812F1003D0CEE5F +:10C6B000ED04B76D6E6632C26D14705B1204DEBDA0 +:10C6C000B95F07F760BCCC7D92F67E3AE59F0F38E4 +:10C6D000E9BEBBD9F0F9BB33510F971A3C68776EAE +:10C6E00003FB02DF77FB3F02DFDBF18C258EBED33D +:10C6F000BB6F6E71EFCBBDC940EFBCF8AA5E203AAC +:10C70000ED6AB07970DF3E97A9F4EEEA7C710FE62E +:10C710000F95FFFD723FCCEFA5D1FE83388F3BE232 +:10C720000D19EF121CFE627A476BE295C5CF6AE7DE +:10C73000F033847DB050E07126F352DCEE4DCC6FC7 +:10C74000C471DF3E6BF2A25DFAB68847BE8505E88C +:10C75000FBAD2C48E96D2C44F5BF872FCA42FEADD6 +:10C76000E8D1E9CD005FDD630579B81EC3F0FE06B0 +:10C77000D219F8E50E17E7973F2621DE3B13AE8866 +:10C780007FEB248EBF0746FB7FC3D7ABEAF2204C7A +:10C790008E4969E847195C3FD5099CFF1447DED7ED +:10C7A000AD9FBEF3DA7D7FAF2DB902DFFBE23F37ED +:10C7B00078EFA278718CCB77011DFA547ECF11C42B +:10C7C000863D0074AAA994296E6FED67E27E363A21 +:10C7D00031A0DE2FC7CAF43E99762E395DF4373D7D +:10C7E0008DDF57ACAD9CD9160B7899F2657F79082F +:10C7F000D29A34FDFDC5A9AE2E7AD27C5AAEFEFB8C +:10C800008DAC830E886B4BF471E6D323FC9F87704D +:10C810006CE0AB8BA345BC64112B0ABF6FF01DD13C +:10C82000F67CEDE7A673307EC918FF57488FE5DF29 +:10C83000FEC31CDAD729ECCD7130BF867F97C99E25 +:10C84000FCA80566528071D516E60583FF24D8152D +:10C85000983FD5E2A6F434D801987EDA5248E567CD +:10C860005B3C949F35C6671903FDCE6BFF4C417D41 +:10C87000B4568BC716706871856B45FCC40AFBF211 +:10C88000E318BFB08202DE192CF68E2908FE9D3D0A +:10C89000DD473185EF32EE43566C94C8AFB3F08874 +:10C8A0007F0D9279F11BFDD3514C8CFFCD8944DC77 +:10C8B000A7D7A31D0BACBF22CE9B340658C0DBFB11 +:10C8C000E1D178A8FFC7960904DF272D5E82EF4FDC +:10C8D0002D3594D68FF1A5533DF619BDF3F4ED67D0 +:10C8E0003E54F0F7B34DF64AE4BFBFCECB8241C011 +:10C8F000EB662397EF9B41BEE3FAAC2C9DB1FD1E86 +:10C9000086F2D75F80F3BC296EFEE478F83E7DC2E4 +:10C910005C05EBDDF225E8A0AC213EBC1C5F9F79F5 +:10C920004522FC9C79C549F8D0F0542FE875E660A3 +:10C93000F177F0DDB3578EC9147F7AFEA281E03B18 +:10C940007F3C8AE25323DB2F3F909384F6D89F806D +:10C950007E78F0B1FC4031F9E3FFF4ECBFA8E1715F +:10C96000BF7F8AEBBEF03ECAA9FFCBE514D89B2758 +:10C97000B7A21C4B4BA1F77B06E3D5585334EAB161 +:10C980000693585F206730FFA728BE0FAEF8796A7C +:10C9900015AE171C0FE3BDCCE2F760407F1FFC1003 +:10C9A000FA3BB8D54DEFFD7CBAEFB16C1C7F6FF749 +:10C9B000C2F7B742FF6782FCF7609C61DD675F44A6 +:10C9C00079BADB467ECBB512C085FA744F0AE50B07 +:10C9D0002525AA999C19411E8722A90ABE7FB6EC7B +:10C9E000B92D29C85F784F1DE3EA5FDA184D72EA66 +:10C9F00025A3E78366EC6F3BEFEFC987EEFDA80741 +:10CA0000D307EBCBEE45393786C7312EF8C9D22292 +:10CA10006C0FFA9A7EDFF3D3CF4B21F48394761E0A +:10CA20005A8D714C63B67D68488174EC6EA915D33C +:10CA3000E2F469C7D07F70D71895DA8F7B264BC692 +:10CA4000D8F4A294E0FBD7F3B8119D7E2FE9FCAC9B +:10CA50000AB7999A9E2F92BA4F77E1BE38E37819B8 +:10CA6000BFDFC5DFAF3ED03BF39DDB18CE032C0804 +:10CA7000847BAE89E22E5830D085743EE32FF4D00B +:10CA8000BB2ABEC016E4AF33FE44BA5F78D010882C +:10CA9000C1DFE314F880FFBEA1E777BF1583F1146F +:10CAA000B1FB8D0C7F2F76FDD88129141F92AED259 +:10CAB0007E3C7DC70D35889F86FD07BAA89F651609 +:10CAC0000FFA63971CF89CEEBDB0A93C0EF5CC7E26 +:10CAD0009E7FA0DA4BEF9D2FE9FA33CFF7F928EFCD +:10CAE000930359747F623EB7771E13FA8CF58F66F5 +:10CAF000E1EF2169F47A008AB17C73562019DFBD19 +:10CB0000D2F420E8AF8770FDA1DB91DA3B66F27BBF +:10CB1000F257A8BF4C421F69FD3D66E2EFF4A21830 +:10CB2000C1DF8BB3CDC4F5EE1E9037C82F9ADE85DA +:10CB30007177E0BA3589FB32A9A064C7C27C521F65 +:10CB40003373F97D85E347DE67D5EC90D9F1AD7499 +:10CB50006FF5D354FFCF701CEDFE2A533CF4AEE0CA +:10CB6000EF53BD4F8F49E0EF75E01C402FFE02F3FD +:10CB70000D32D85139617694E5CAF4E2DF52BD072F +:10CB8000709C2BAD1F2987270AF857D80D8487156D +:10CB90008F9AC91F3651DC439D78FE7834CA9315AD +:10CBA0007F2E23B9D2CAD8B0F879B985C779FF1BCF +:10CBB000FA1120BDF68B7E99F623470CCB8E827E30 +:10CBC0002510C87F38D01A5B4E792F92FBBA2F0CF4 +:10CBD000C3EE17B514E8F52EC9E92FF5FE87EBBFB4 +:10CBE00074D0EFCD64B6B82B9AF7D0FB3EFAF96B50 +:10CBF000EF6CC1FCFA51BFAFF8CC40FCBBE2B332E2 +:10CC0000929BBD57385FABCB7B12E18C9C0FC0FF72 +:10CC100029D22712FE417E1FB832F8BF2F31FA7D8C +:10CC200043A0AEC8BFDD2BDE31E85D5A42EF691C80 +:10CC3000C4F748506ECEE0F78E7AC5FDE4DE0407F7 +:10CC4000BDF7F19291E703B78AF6E27DC8DE5B5348 +:10CC5000F87B1DE6A65F9762FFAD3C3EAED718A4F9 +:10CC6000DF53FBFF00D94A3097008000000000002E +:10CC70001F8B080000000000000BE57D7B7CD4C505 +:10CC8000D5F7FCF696DD64936C42C88590B0B91078 +:10CC90008206DCDCB806582041B468038802C6B8B6 +:10CCA0002101426E844BFBC4969AC500A2C51A1E90 +:10CCB00011D1A22E14282ADA50115183CF0A4269C9 +:10CCC000BDA5D5FAD86A692278E59210B40FF6E1CD +:10CCD0006DDFF99E99C9EE6F49D4F67DFAC7F379F5 +:10CCE000E347C7F9CDFD9C33E79C3967CE6CFB8FDA +:10CCF00006B9BC4EC68CD6B939A7F3197BCF67F0FD +:10CD00009AA3196BD1FCB71A0B18F35EB0B0DD69AA +:10CD10008C6D89F1272FE7F92DCBAEA2FAEF3136D2 +:10CD2000B32D07DFDD49B13C3DF837E3EDA5769E35 +:10CD3000CFE5799EBEA4B1F9543EDB9D14C3F30B3D +:10CD4000C3A346B36B787E876FF7D6387CCFA67EB9 +:10CD500086185923D54B13FDFCD12CDAFD81F1BF88 +:10CD600024C61E3533AF2D96B1F1AE45C35D858C1B +:10CD7000796E8C30B16814BA93343E9F47AA86B35B +:10CD80007B359E6D7D88B178C6E65B19FDA9F150B3 +:10CD9000D13A86B179E2335BB078B7CDC3E733AF30 +:10CDA000DAD6A58DE6EBA8BE2BD2C9C79BE731FA30 +:10CDB000C3A278859B4ADC9DD9A2EEDFD331AE9B1E +:10CDC000C66555837886A7267F25E3E3BEDC6365C9 +:10CDD000F772B8FC1D7F5302298718638319FBD4AF +:10CDE00026C6AF6F9BFAC069D51FFFB7DA62DFA80E +:10CDF00045A33CD5C7F8F8FB87780AD0FFF243D7A4 +:10CE00003D70DA1AA857B5B8248B1902E3868E1341 +:10CE10003A5E0BF0C6C71B063CF2262DBCC000FCD8 +:10CE2000B5D97CC01F33F5FC6129CFB7CCBFCA751B +:10CE30002FCFCE9C63756B1C0FBD07C27C611ABEE1 +:10CE400087BBB1AE96C3913E03CFDFAE09F8B7689A +:10CE50008CBE7BF79B7DBBF9B73A8BEF893DBC5D00 +:10CE6000DDCB235D7C6476D0C2FF83F21723447947 +:10CE7000943B6D7D01CA1308BF2F999DD154FE6B61 +:10CE800023A3F2707F560C877753A2678E8BCF7BDC +:10CE90004818C7BF1DFD8AEF2725FD9DE4DD02BFB1 +:10CEA000DEC648EA97C9BCE787837CF7D27ADC49BB +:10CEB0008B915F7535ADC78379F079B1068DD67BDF +:10CEC000D2E1BB278B979F6C1F4CF38893F470B211 +:10CED000F42F6F8CE5F54E1E32BAD0E7074D46BFF2 +:10CEE000250AE5021FDA1C6BD636DEEED48B91AE36 +:10CEF000305E5E767FEDEBF85E7657FD2C4A6BD6A2 +:10CF0000DCC878FDCEBBDE4FF5E45C898FB23ADE3B +:10CF10002A088F77BADCF5C0EF232E4F23D6BB3C0F +:10CF2000A77309E37475DED2F1183332F6EE50CFF1 +:10CF30002A7CEF7EE1933DF8CEF194553A8A2FC3D7 +:10CF4000C4E904F4DB399AE87AB9A4DFF45CCF1DB4 +:10CF5000E88FC3B19C65301691D361C13CD89AC1AA +:10CF6000DF8A4E3E6FDF7D50E3E3D486B737506AE9 +:10CF7000F48D463F67347F94964170F460FF9D7551 +:10CF8000F8A3800F8F81E7397E6AF7EAD7853F13D0 +:10CF90009F572DFE87B7AB6D33BA6DD83FCC67C1B5 +:10CFA000FC6B9925503F4DEC43D001EF6727ED57BF +:10CFB000FB07E53FE478A8796264DEBD1C3FB5312C +:10CFC000877E3291EAF1766ABF18AFCCABF55C3957 +:10CFD0001FB1BEB3721F9CE55FCCA09F7D6182FE36 +:10CFE00099A08FF34F2449FA11747BFE89113ECC2E +:10CFF000275EEE9BF39AD7108E763F62AEDD7C5EA5 +:10D00000CCD53666F628CCBE6DCC9C48C6B64ABE9A +:10D01000563BA86D0CF895E25FCCDA367A362F676E +:10D02000D96DA3E78C0AF03F56DA9645DF7D6D593E +:10D03000687FD0C0AA014F359F9AA79277103CAC69 +:10D0400062BFD63C7535C1478DD3023E027E0C7E51 +:10D050001175E5BA5F766962FF478E49005F1B086C +:10D06000FFD9898372C04ACE2FB0DCEEE6FD8ED8A0 +:10D0700066D1F5A3EA8DF4E9BFFF0AFD737A1B16AA +:10D0800082CF21C69E57C2F87CD9CF389CD895E371 +:10D09000BD29DB3DF9641FFE8C029F8C3915DD38FC +:10D0A000094E024F7FB0283CAD4EE6FCBA1630491F +:10D0B0000FC0EB60AE271972E53CF29037313CCFE0 +:10D0C000D306097F9557700FA5BFBBFEB024B99357 +:10D0D000B7FF6F9781E6150AD7B51C7E286F31B36D +:10D0E000DB4B79FBCF9B4F649C3607D6F371B3DBE8 +:10D0F000CD454D5F7EC9B65C2BF6DDD2EDB9D64588 +:10D1000041706FD99B7FC2C9F17A76AF0923B116FE +:10D1100093EF2713E2F0DDD8E665546E75F3FA67F6 +:10D12000ED47DE44BD25DB63F28CCE40FBA5DB4A38 +:10D13000DC5541F0BF7AAF1E1FA3DAF4F96B0EE99C +:10D14000F3E65C46F4F08FB6CBF5EBF3F927F4F990 +:10D150004FDE597D33B6C1F3E3C4BEF9D417E9B34A +:10D1600072B856BF3FE304E4E8A7079F8F02BE6A88 +:10D17000FF54753C99611D7A3AE578D44C7CBDDE4C +:10D180003D1AD1CB325FE8FE957CE38A7DBD96F0F7 +:10D19000859D154C37A1F83DC3DA6E7673FAAA6BFC +:10D1A0007A3B037A4CF52C4EC890DF6D9B2DCC7EDC +:10D1B000E57803F10F66773B19A7BF8A71A26C422D +:10D1C000D374768AF7C736FD7606F66BC58F35D2EF +:10D1D000372A9E1DF12AE8A66BFF82EB29BD79262E +:10D1E000C1A192B92DE0874BDB357F24CF3BC639F7 +:10D1F0000F75F2768B7D9A0BF35EB42E2CC0CFF8B0 +:10D20000BF559B42E6B125A89CCF7FE9A157BED26E +:10D2100078FFD5DBF5ED967178417ED4ECFA7B583A +:10D22000F077AE0811BC26B4EF3062DD8BE5FC95DB +:10D23000FC63DEC90CEB9B209AB0D3F80F971B96CA +:10D24000619EE2DCC2801C9CB045B4E78CAF02EB6F +:10D25000AEB75B9C5877BD95F923F87C4E445ADCF9 +:10D260000EFEFDE2B648D21F968431AF358F52666E +:10D27000CB433B5734DA7DFC9691F4A47ACE7BA85D +:10D280009FC7355F0BFA316A22FF33915FC6FCB44A +:10D290001ED08D3B789D3E7D9EB50E22BDA4CEE472 +:10D2A0007F0570A9619D046FC6F1E95670E470AB0B +:10D2B000E3EB7C2F16FA97BEFD72D646F5971FFA60 +:10D2C0007B58F077AE67322BAFBF3D9CA7347F1FF2 +:10D2D000C1D168616E039FA7F1CE709F97F490D281 +:10D2E00070D0A959EACB5BEE716761DEEB357796BA +:10D2F000037C6CB3CD053EB6708790435B62B8FE8D +:10D300001A477A33B55F087D0A7ACA02C1EFB6C4FC +:10D31000B4F9C1F7B73C9826F4A9BF19092E3DF717 +:10D32000D97C3B35E8D342EFD9B27904B507BF24A5 +:10D330007DEABE48D17EB680EB96C10E9F97E7FF8F +:10D3400088292641CF766759A91DD7D3D202724AC0 +:10D35000E9D33F1BE6B90BF856EB55FA37ABFE762F +:10D36000FAE66E293F7B36F379F2FE4F6BA5C70DC7 +:10D3700041FAF003B982FF8F99E6DE23EBB950AF93 +:10D38000CA30FBDE297CBE555B0DCE96B400DC991D +:10D39000DB9D05389FDE6CCB039D8D99C6E83C7103 +:10D3A0003257F0F38802E6F6F174BBEC777BAE41BE +:10D3B00097268673FAE3FD9C2EF19B81DFC882528B +:10D3C0000BE42197E1C4CF43D7B13757C8CD2A4BDF +:10D3D000E96F26F5339F3E3A28167ACBE915DA4EE7 +:10D3E000312F81E731FF6E73B5D0BAC5FC14DC393B +:10D3F000DD1492BC977C2BA68F4E7C4FD8386A37B1 +:10D400002B7D1AF8D7747442F0DC72DF28C2E34235 +:10D410008967769F4DD209637F45798993CABFE9B1 +:10D42000BCA5D6C9E980CA39BEFDC077E8794BE111 +:10D430009B997C85A59103E37BD1B898311A077538 +:10D44000B28979C3385C20F3082EF7987C77F1F91C +:10D450000C3509F8A798047D71EEEC0DCFA3FA6E98 +:10D460000BCF573CB094B979FD8A64E6D2447D165F +:10D470008DFABC1B234F2133D0AE225AF45B91C0EE +:10D480007C7749BD1FFC2A13693AF5EB36C48AF64E +:10D490005179D4DE6B10EDDD269E0ECB10FBA56717 +:10D4A0007D18ED9F8ABB53B24007B3A6E9E9203F40 +:10D4B0004FD08D4A1FCF734A39E34AC4FE5EB46E23 +:10D4C00024C98D165B69FD73C0D7D311A40F566CA8 +:10D4D000B8ED8642CCEF9941D070D8E737EE1F0304 +:10D4E0007A5BB46EC1F77E8FF3C85E1B7D6FCFF39E +:10D4F0009CCF85BEAD39CB9FE31F16CD3B6A49E477 +:10D50000ED3D6DB3CFBDC8D31BBDFBDF845E70E3C3 +:10D510004D46AA7F236BFBCB1FC117D689716EF0D6 +:10D520005E3025F2FE6E28D218CABB6C8ED4157CF4 +:10D53000FE15127F7F95FBA0C5C6E6FFD28E79A5AA +:10D5400064A5F3EF374053ED470F1C9727F5C4A9A7 +:10D55000DA76E83DC3A68BFDA5EAA31FF43B19F0DC +:10D56000E0F5CC122E2ACFE14AF5AB36867565443C +:10D570002135FB47F07471C1345B1EAF372B9DCD55 +:10D58000C0B9A9E70E23DB49F3EDA9A07D1F99E5FA +:10D59000C4BEF730E627BEE71B4974DF35B5A7EBFD +:10D5A0006E9EEFDA31C2D5427C5D9CDF173B18C915 +:10D5B000F7AEA982AF29FE72D2D11949F42ACFF36E +:10D5C0009592343E6A9ABE752CAF5F69B774411E5E +:10D5D0002C7E706E9493CFB3720B3FCF7339C636E7 +:10D5E000E9CFF3FCBC9D9137F8CA7379E8F91B3495 +:10D5F000033AAADAA4111D0E6B715992888F690E35 +:10D60000ACAFCAEECF84FCAB72D95C283FDBEC7EBA +:10D61000E034D70FCF37CFA4945DE670E7F3BC0AB0 +:10D62000C8E3FB7E6CBEC7053855B456D0793222AC +:10D63000C743FC69B9A4BB591CCC1AF88DA933099E +:10D64000FBB02B577E8F7564D9899E6D0C70E832C4 +:10D650003BB230AFAEF53603E4E6ACBB045DF37D20 +:10D660006635F1F6F7985838F6FBDFD09EAFB36C0D +:10D67000ADA97407CF0FB53253642CE82A97E8FAA6 +:10D68000E7051E33E0F0E98FD838E805959B36D3DF +:10D690007C145D305347F120E879BBD3F270BE565D +:10D6A00074F4F38269D7E605D3C34D1AD1014F5FF5 +:10D6B000C9207A98338BE8619A3F73259F5789B1C7 +:10D6C0008EB961674864AE303EFF5ED643FA442FA0 +:10D6D000D72720CF143F517C83D381DB1A1FC0EFA3 +:10D6E0009E663E15CE93F7365B297DB2D9C14C1CA0 +:10D6F000BEFB9A1329FF4CB393D2B6E66CFAFECB6D +:10D700006617E50F348FA3FCC16637E50F35CFA44C +:10D71000F4C5E652FAAEF812870BF121C557143F53 +:10D7200052F4A4F852281D953BB137A83DF13DC5F0 +:10D73000EFB00E435E801F29FCA66BA5DEC434F05B +:10D74000B1CE05E01725C6B34F3FCFE1DB5B6D7768 +:10D7500085390117C1F77AED5692F3A9167608E7D5 +:10D76000FF9615EEAEBB83E4EAADD51A3305D1EDD5 +:10D770006D8D36660AA2DBDB9B6274F9B2A6B78FA9 +:10D7800025F0FEFF9EE2F1022F27EFFCF8D1FFE427 +:10D79000DF1FBFF3F3E1C0379FC7EE8730EE9AF08B +:10D7A000BE79C422BFCE4C726658B838270D0B170D +:10D7B000E724FC013F8B98D8A78FDFF957DAE75DA4 +:10D7C0004D614E23F40FE08BC3F70389AF454D61E4 +:10D7D00004C78AF5A79E7E1EFB7D8D85F8DDA275A8 +:10D7E000727F6EE4700DD2DB3E4C62A49F696EC600 +:10D7F0009A38FC3EFC91C5CF653FFB50B3FA34DE4E +:10D8000050E387A632FEDDB3F157EF41DFD69A4EE3 +:10D81000907EECB1DAFD46CCCF6B3E1BDC9FD6741C +:10D820009CEAB1CEA1311F47D0566480634481DBAE +:10D83000023E01DA06FE16651F61D8DFAC55730C97 +:10D84000E7EBAA92DFAB366AA47728F83F9167A48A +:10D850007D753AD744789D863D3B981818C929456F +:10D86000B79C6FB87DD81FADB9962541FC7891FC67 +:10D870005E996DA0547D3FCDB725FA9986CDC5FB45 +:10D88000BD373BDDB298F89DD3027EA0EA2FCACE09 +:10D89000DB905E807EA6C6B1A07DF95C9E49CECBB2 +:10D8A00021E49895CB31DEAE6E0079A0F4934FF170 +:10D8B000BFE369FE74FEAA79E6A9675E845DE2FDB6 +:10D8C00030C253CD35D2BE91E31B3397F41AB75D06 +:10D8D000E3EB6C90F82F7EEA4F519DBC7CF901611F +:10D8E0003FE56917D28635D5642F6B70F17D827D57 +:10D8F00070C8FC6167105DBEFACCFB519D74BEF030 +:10D90000261B1291FA93194F1B0E9C9AC1D01FEB44 +:10D91000D9E0B05FD96EB97699CE996A1D2587BFD7 +:10D920008CA7F1B54BF154FFF0FAF8FEEC20CB993F +:10D93000E9C3BEFD4B7606B7CEAEB69C6DBA60E4C9 +:10D94000F35DBE66E627A0F3D0FA9FE445C6817E6C +:10D95000D8583696EC18266600BE575A051C7A7DB4 +:10D96000C3A3D9D7D85F966FE38DB8AAD56B72469B +:10D97000BBF87CBB613FEFA77E4EBE90EBE7F83E65 +:10D9800062FC2CD5BDCF48E785EE7D9144FF0DFBB1 +:10D990001E383E91E71B76691896D5B30E8253C3A5 +:10D9A0000123B306CB33D877060D3CCFDAA7221B71 +:10D9B000414FCBDA34F76E3E9F5EAB337A70D07C4A +:10D9C0006CF9829E6AC3DAC6105CE5FCFF2EF999F9 +:10D9D000AAB7ACFD010BF0C5EB9D27FDE517118C37 +:10D9E000EC66ACE74DCCF3CCF67C17EC7BCBDAF6EF +:10D9F0003790FCDF17E118CED7F1B9B4F3AB7E0650 +:10DA0000E78BFD34385FE81D67A43DF7CC3346E271 +:10DA1000439827F6E1E7D07383E6992CE7999C2F8A +:10DA2000F49B23D88F8581FACBDABAA23279FD4FE5 +:10DA30000EBD4DE97039CE327BC768C8CD4F0E445C +:10DA4000CCF451FAD3192FF1F1CEB54D8DD382F626 +:10DA5000555EBE99FA3DB7DD3813F062BE4152CF34 +:10DA60006FA3F59CD997ACD1F916F0E67AFE99032D +:10DA7000CF461968DF7A453B89478355D869C36229 +:10DA80009C52CFB4B642DF58C8B5BB68CEEFEA0FA0 +:10DA90005C20F91BFA5DD5A7FD9684F3770FD93585 +:10DAA000F89F01F45BEF10382F31E624601F945F7C +:10DAB000E3BCE556F0B1D7CC020F439D0FE15C55B6 +:10DAC000FED620B25BAC343B1390FFE2757E10E4CF +:10DAD000F32ECF97FB3BB1B31076CEAE3421D7EB0C +:10DAE00036F2830A5FCF108E772F5F729DCFC83CCE +:10DAF000F9013FD1FCFC745ADF23D506B785FC2C15 +:10DB0000FE2CD83D4F5A9897FC46BFB4097F40BAC7 +:10DB1000B0EB3F22FD4575B1FEAC41B07F493CD62C +:10DB2000CDE1E541F8ACDBE9CF82FE72D622EC7C98 +:10DB3000287720CD13F55A24DDA01FF4DB95E638B5 +:10DB40004F7AE673910CFABEE1F9486157F8B96D66 +:10DB5000675890DCAC9674C575262FD6EFDD2DE6A0 +:10DB60008779417F5E6669CD827EA9C65D16D54AFA +:10DB7000E39D95E32D0B6F15FE098BB047A23E8DFB +:10DB80006F66E447E979228CF4D4CF933A0E62FCB5 +:10DB9000CF9F18C920C7BBD27C4B0E5139D7DF3875 +:10DBA0003E6A9E0CF363BE9F3D11E963BCFE67664F +:10DBB000A10F7D16194FFAD089C8ADE5E497D915A4 +:10DBC000A6C1AEF299C62C8928DF2DFC1835CD4DA3 +:10DBD000E47FA8E1DB9DE5513A93C5A27C24D95BA3 +:10DBE0003EFB35DFA71A7DDF88EF1ED65AFE03EC19 +:10DBF000BBBD116477FBFCC9FF1ED99FDFA26697EE +:10DC0000DEBEA4E84095DF23F9D23D128EF7E53B56 +:10DC100008FFF5116D5BD3699D62BF723CD0B98B73 +:10DC2000EF8F78D8BB4FB6BD10AFD901677FD64F05 +:10DC300001F7BDE27CF3F93E33F95D6A9E8F749380 +:10DC40001DE7EEB106C88B1AA3D0836B0C1C7C3C7D +:10DC5000D5EEDC9B053DBBE5095B1EE0C1E14DE770 +:10DC6000C89EDD46398E18F7B33D29C2AEEF97F94D +:10DC700083A3C8AE3F2B96DD3E87F49CEDA301D76E +:10DC80008BBB220CA00B3E8E5BE3F0A9F9C10F0504 +:10DC90003CA397905ECEF71FF1CB3AC92FEBEF9ED6 +:10DCA000183D11FBE92D23835E70D1E44A003F0C3F +:10DCB00085D70792AFD41E7CD402BF5D1DDF371E0F +:10DCC000BE6F6AA57FACF6498DF4BADA0D131F2238 +:10DCD0003EF8A6990DE7F338DBF64054303E8E4B04 +:10DCE0007E1668EFA2FAB5BCBE68FF5A14CD678FE6 +:10DCF000D985F984E2F15BB77FD2F8ADDAF7D14785 +:10DD00001B97EBA3AF5CF745D6F1FDF7C14FF6D9F2 +:10DD1000C87EC5F19E0ABDE38CB96D09D67DE66962 +:10DD20001BF199333162BF7FC2F9A17704E6F19DFF +:10DD3000FBC9BEF1BBB90CF260A94FDFAF1AF735D2 +:10DD4000C97FEB07B9A26127ABE778407F1C2FDFC3 +:10DD5000A5F66F99A97DE83A9E44BBC2A0FDF9746F +:10DD600004D1CB9921021F679E194172A52B46D081 +:10DD7000399F6F2ACE2B676244CAA08C703AA89153 +:10DD8000E7D13353DBE8FC7D46DB4F699759B4ABF1 +:10DD900069927E634E7789A01BD024FC61D64D1D0D +:10DDA000D02760AF1E9347A93F2CF64ABB33E81338 +:10DDB0007228A340C82F86F1E2A5FF83F494360BA6 +:10DDC000F8B247EA7175FBAEF4C301BF75FB34F2DC +:10DDD0002319543F7CD671CA5ECEE9B1D6ABB96D7A +:10DDE00098CFBA15CBC88FD4B8F956D0BB5A47AD27 +:10DDF00089CDC479A84B33D27CBA6C7CDF000EC1CC +:10DE0000E305E95D91817198239EF44C52AE630A5B +:10DE100084BC42BE95F757B74EDB44E3A4A973A573 +:10DE2000589F8213078B05F6327EDE17E503AC5F41 +:10DE3000CD3374FD6A3EC30B849DA22BCD797F1137 +:10DE4000F0FD86D18573FAC5CBF9D1B15FA397E117 +:10DE5000E4D66737E6F3CF034DF1F97F29F95B2D5F +:10DE6000ECD27C9E59DBF5FE90EC5DFAFC55FBF4A0 +:10DE7000F99C03FAFCE8767DDEF5AA3E3F448EABC2 +:10DE8000E08473AF738438F722C5B9D71926CEBDA5 +:10DE9000C8E3DC8B14E75E7CC7B917799C7B91C71C +:10DEA000B917799C7B91E2DC8BEF9505827FD7498E +:10DEB000BB23F000BF0C7BC1A6FCECB45FBA17C457 +:10DEC00013FF547ED2EE653994EFB3EBCCB6925D7E +:10DED000876C375C2F993BD473434121FCA71D1BF2 +:10DEE0009280375327D97397BF28ECB97579363BA1 +:10DEF000EC0C9DEB3FD900F5296BA8670EEA779BE8 +:10DF00007BF6101D98FCC4373AD73ADF9A22F047C7 +:10DF1000F60E668FA5F34905E45DECC0780CF5AB11 +:10DF2000B04D7A3F4AA85F25D49F124A07CA8FF2A4 +:10DF3000B8B92709FCFED413D64D98FF2969276389 +:10DF4000F3ADA47F29BDBAC4682738ADBC4FDB0947 +:10DF500039B5AA2096DAF79EE0FA763FF256A595F3 +:10DF600097F2855EADF29B3403F9693C6E9243AB48 +:10DF7000E49C52B59EAEBB4123910692E317ED0699 +:10DF80003A175C7CC7487AC4886D06DD7A46FAC2C7 +:10DF900075F475F5DED8107FE0105DFD6B0EA5877A +:10DFA000F803AFD2FBA96E5AFB0ACED77337E5EB65 +:10DFB000EA55954E0C81A39CB7D44B5BD66C4B05B0 +:10DFC000FF5915D94BF35FF59C8DEE5D5471F9E265 +:10DFD000E6EBAE4686F3C76AABFB46C0AFBACD1CD4 +:10DFE00003BB56A5943FAC492F8FAB4DCCEB880DAE +:10DFF000D05DB583B96378FB73B9AD7B0C1C6FE75B +:10E000000CDBB71639E15FDA91EAE074B55A6B8B35 +:10E010001FCFFB3B15E3D951C0F773AAD9FF933249 +:10E02000F0CBFD196C2DAF776AD3B351A4774B3A7F +:10E030004B353BC281EF1DAD463A17C03E057B9084 +:10E04000A2871DAD83C233ED817506F07F99D6C7D7 +:10E05000F142F7467AED4786AE821ED726D65B3D63 +:10E0600055F3929E2CD7B352CA15B64EF4B35AE666 +:10E070004FCBF3825ADFD991AF8C76C2AFD97C28CF +:10E08000D5083E6ED8B72709FA4582A71DFBA77AA7 +:10E09000C7F0FF2CE2E3D6FCDEC8E047FE68CBF415 +:10E0A000A8F1D03F9F36BB66F1FCDDAD3FB3E05C2D +:10E0B0005063F25970EEAC7E628705FEFF6BF7EE9F +:10E0C000A0EF4BF656D0797B296BA473E4A76621A9 +:10E0D000A7153CAAA769DB1D7CDE998582BF568700 +:10E0E0008BFB2025C6A2637158EF5E2D17EBBDA9EF +:10E0F00074BFA5827F7F57F2E1D0FDD1FBFADC929D +:10E10000C1B02BB5093FE840FB619E7F24ED87B984 +:10E1100097D228BDE9D2D574AEFA3D2B1D457C229D +:10E1200027E43CFBBA51D8CDDAC53EA8B6F8E3E601 +:10E13000629FBC6CA67D526F82ED1BE764C626F021 +:10E14000B4B4C8A8A3D7E5C5113A7A9ECF62757E4C +:10E15000E59BD9105DFEA65919BAFAB7DC747508AB +:10E16000FDE705CA898F4CD0DD5FA95FE3756A645E +:10E17000479BA6FFCED3354467D7EBDAD7B33981B7 +:10E180007A3807EFFA2DC199B10E0BCE5BD5067127 +:10E190005F67BEA74B7EEFA4EF7C21BA7D382CC30E +:10E1A000F59F422E9AC93EAFECD3F3F1FF19FDC99A +:10E1B000458E68396EB451D8173C7ABDA383CE9F83 +:10E1C0004CE0A15EDA7BEAB385BDA7DEDB6169B412 +:10E1D00013FC4DC91C240DAD1AD9F3787D6B72ACBC +:10E1E000C8AFC1F703E6809D8589FE2EA1FC84B1EE +:10E1F00002FB25B4BC81AF1B7A4603EC3564679AF9 +:10E20000F909D999D438B27F45A74BB7E9ED470D45 +:10E21000B0EB04E17359A193E8B566EFFEE3433830 +:10E220007CE696C6E4621FD5B5CD3657E45C496FEF +:10E230008ACF5FAC3690DFBBF7F5A3446FBDD52620 +:10E24000A2EB6F824B835BD83543E970095F9795EA +:10E250008FBFE480E6F269A21EE03304F419029F46 +:10E26000E47EE0A6E0D507BF90F2A5F89F02DC2788 +:10E27000D07CFEB4FEE012024F354E08BCD8383DCB +:10E280003C96789C6F81FF2C396164BE6FB1FEA50E +:10E290005827E6C1D78979CCB924EC26CA9F70F3F8 +:10E2A0002513E5FBE8A694C32B0FFB4EBF4FFBE8FD +:10E2B000A854EC9B7997E2A9DDBF8A9EBE898ED4D3 +:10E2C000FC15DF0EECA3BB486E2C2F8C8CFB98B397 +:10E2D0000AFEFF85C417247F1D582FF50A3EEAD198 +:10E2E000CB9961778EA37B47BDF674D22BFAE4906D +:10E2F000435FBE32323D01E51E69B753FCD823EBC4 +:10E30000A9712A78B97310E87A683CECB11BD6651C +:10E31000A47606E92B9EF5E678D80B53D70EA2B467 +:10E32000C2E688871CA9586B2C857CFCF09E84F87B +:10E3300071B0CFAF37C7CDE25D7F7847412A1B85EB +:10E340007C09A5A73687CD0FB673AB745BA1D0430C +:10E35000EBEF7C8FE4DA39C3EB51F3B1EFD63F1723 +:10E3600085AB37B5EBDF1EE3E02AC9DD319E870AB6 +:10E37000C98FBA638F037073EC180D3BF5CF6143FF +:10E380001B1CD01F6AD69724C02E56F7B7A38F4107 +:10E39000EE7BD69AE3A17F7EF60E978B1AC935D213 +:10E3A0001B3EB5313A2F7DBA3BC207FFFDA71A735A +:10E3B000C3BFB3CCF8CA68874ECEB6DF8C79EC4DBC +:10E3C000F0FCBCB010E3FBF624627C9797EE677A12 +:10E3D000D60E8FEECF8EA2D2E5DB845EB747D97121 +:10E3E000A5BD17FA3CF2D0E7D908A1CF230F7D1EB7 +:10E3F00029F4797C3F26EDF8C35A7A72711EF54EE6 +:10E4000063D98D2477EDD9D0D75769E12ED2333532 +:10E410005702EC63EC9D18216F43F0ABD2493D5C91 +:10E42000E70AA2FB2997AC2CF89ED95416A3CB4F30 +:10E43000B726E9EA9738D274E5D7268ED4955FE7F8 +:10E44000CCD5E5BF933D5E57FF06D7545DFEBBE3D9 +:10E45000AED3D59FED9EADCBCF9DB940577F5E69C2 +:10E4600085AEFC96F9CB74E50B3C2B74F95BABEFF6 +:10E47000D0D5BFAD71ADAEDCCD1C26C8BD769CB38A +:10E4800038DC5FC6398BA7ABDE186E0FC66BD17454 +:10E4900043637F76FAF3521F9A38D6FD19E823C5F5 +:10E4A00020E890A76EA81097A55C49667E4D9C73E6 +:10E4B0003B924037A1F542CB8B228E5C74721C2EAE +:10E4C00039187BAB89F391A2B147F23378FE9931C9 +:10E4D0000B447EE29167D379FEE0C1ADB79A38FF75 +:10E4E00028BAE6C845948F1E5B2EF27319A91C4703 +:10E4F000C6FC6DA197AFA3684AFA2697B093F47B48 +:10E500004F53A58003EE37020E48FD9C3E911EE15D +:10E51000F489F4554E9F5566C68E73FA447A829FED +:10E5200037F1FD37FCBC89F4757EDE44FA263F6F77 +:10E5300022EDE0E74DA4BF6B9E4FE93BCD1E6AF78D +:10E540006E7335A5EF3537D2F73F363751FA41B301 +:10E5500097BE278E5176053FD95F949FA901FE3D56 +:10E56000D8E70E99CF06FB61959F50F9055B1A59C4 +:10E570006704F669A729E6636BC0DF37309F35B1C2 +:10E580008F83F4B0CD89EE8C3134FE5007F97BE4F3 +:10E59000F769DADC14B8FE6E1DED193986E37B5E8F +:10E5A0005EE5FA68CE3FA65C6E34835E7E2FEFA9EF +:10E5B00086F67F59D249DC58F768B49B6C15F7F0A2 +:10E5C000265BC53DBBC9A6CE16F0A3962F9913F7BF +:10E5D000685E89B4107F6AB9C7E4839D52FB82519B +:10E5E0007E521CA37CCB971D742F6FB2C39548F24B +:10E5F00046E6FBFCE7F80BBA2FA3FCD9EA9E4CF1E8 +:10E60000179DD3A1074CB25B9C6121FE77F8AD5FEB +:10E61000897C57CD87613CE527DFF525F31B46074D +:10E62000FCE193AD1D69B0134C5A6D7505DFFF51C8 +:10E630007E6FED8B0E23E489BAE7A3C651F38D34C8 +:10E64000F1FEF202F778263BDA7271AFA1A5DE4E39 +:10E65000FD25F0EF963CAAE73652BBB65CD8812781 +:10E66000D5D95DB06F2B7F7B825C37AF47EB2CFE3B +:10E67000C243F70D26C9FB06E8C72ACABDE86752A0 +:10E680009C3FC984F5375A5CB0873EAAF1F6790100 +:10E69000FF3FEA4704ED5FCC13FD66FE85CF177A96 +:10E6A000BBDB4DF09DABCE6F4E9997F29959A79178 +:10E6B000FDCA28F3BF1DED590EBC978639FE1441E3 +:10E6C000FB3C2305768ED9526FFF1A7A59FD3F43E2 +:10E6D0002F6E81EFA18CEC69A174A3F0A2F03C1025 +:10E6E0001D29BC07DDD7223CF7DDBF92FD84D2D7C0 +:10E6F0004074A5E869B255E01D78C53D1A4547DA72 +:10E70000176D3B681D755692738A8E42E9E04A3A4E +:10E710001274D9F23D2BF577251D05F00F78FCF327 +:10E7200074D46184DCFD47E9E7F61E36239A17DDD1 +:10E730007B8DE732E446C525E771E42BD9D4192057 +:10E740002955FE00CA075F591E4A5FAAFE8B03F4D3 +:10E75000E7F9A2C71C1D449793A40CFCC300F55F06 +:10E7600093F7E25FB3A9FB1E6E7B2EA783E9920F9E +:10E77000AF2A11F43533CD48FE8CE9394B49BF67D8 +:10E7800076A11F3BF93F646F93FEF5EB65BB1997CC +:10E790004BD7619C19717AFDFB7AA977CF0CF1B741 +:10E7A0005F9F732DE9E1D787E8D9EF8D917A741ACD +:10E7B0004B13E7EB4DA4FF16CBFD982CF19DE134F4 +:10E7C000B2220EF712E6314108BC7ADEE2467FD76C +:10E7D000322FE5AF633E4ABFC3FCA407DCC0050689 +:10E7E000F2DF658CEE8F1E8DB8B16C39EF6F7AFE5B +:10E7F000F44C7CAFB3F6A45A0CB81DE8F90CF2A1A6 +:10E80000C1E8F933F4CC73299E11381F1F29769281 +:10E810001E76C49A417A21F69339C85EF96B2E4769 +:10E8200033B99C3BCAE52CD2635CCE667279F72B78 +:10E830002E6791BF3E7B2D43BB194EFDFD1ED5FEBD +:10E840003B8EE9CC34686039F69DD12F0C851DEBE9 +:10E85000B59811C5C0DB6B31638BB1DED762120C8A +:10E86000220DB3503AEAF9CCFEF45645AF81F16679 +:10E87000D078A1F055F00C85A382EF3F01CF416322 +:10E880000BAF84E765E8F7B09F5ADF8E4A4C879F4D +:10E8900051C6D345083E58FFFCA804ACA3CE2AE0DD +:10E8A00032A96922A5939BC633533EF999BC80EFE8 +:10E8B0006758020CCE217636669A46F9EF49DACAD5 +:10E8C0004EF00CC73CCEE6F9B3B846C63ED9DE12D0 +:10E8D00085FB99E79E31BA70AEA9333A37B9602704 +:10E8E0007FCD28E2822E1F4D857F93EDEAFFBE7417 +:10E8F0009D55C1CF4B70FDD9356EDA6F0CDED9F85E +:10E90000805E33344CDC3326F742DEC07ACE98701A +:10E91000C167868609FEA8F0C5DB09B9CBFB19C320 +:10E92000F95AF2FDE174AE2918E62EC27AF879811F +:10E93000E28A7AB323C85EF11B199738D97F35C5AF +:10E94000E5CDC4B99D7F378647EDC4BEFF8D8C4BA6 +:10E95000FCC520CFB5687F6D5A5E22E0318509BFC6 +:10E96000CA7556B3CBCFE774DD58B90F47B3D13270 +:10E97000AE4777FE507692DE3823C9A1C92CEB2131 +:10E98000D8098A4F98C94ED077DF2D51F8457B4F73 +:10E990005C3482AF94446A6C505A203E272CD1C01C +:10E9A0009C417ABBCD19CE9C41FB23223B56978FCD +:10E9B000740DD1D58F1E97AE2B8F715FA52B1F3491 +:10E9C000334F971F5C3A41573F61FE345D3EC97338 +:10E9D000BDAE7E72F51C5D5EF1BD64F189A5342E7D +:10E9E000D4B51FD6B448573FCD5BA32B5778605E94 +:10E9F0007747763CF8A2F8CBD8B85257EFA7512208 +:10EA0000DE64A67DC92CECF7E1AD3FD0CFCBF8BAE0 +:10EA100046F1A34EC16FBDFC1FD05149A29EFF4ECF +:10EA200077E8ED1AC98D265D7EC33F8A67CF553AD8 +:10EA30003C87C283E3DDE5477D2EBFBD3C5FF2EB43 +:10EA40004A13F40BF82F82E70FFF45F07AE1BF0875 +:10EA5000CEC37F115C1FFE8BE072F82F82CBF34F89 +:10EA6000E8F15CD8A1C7F3D8F7F47856F437103E34 +:10EA7000C677EAE920141F133F0DA10B8987F9FC23 +:10EA80009FFEF04047114EFFD31B19D9E7BE092F57 +:10EA90002F84E065D2484F3BF6EBFC4117532DC065 +:10EAA000538F6704CE939F493B49E83D4E2F57074C +:10EAB000280EE107468ABF396968D5C097FD299EAF +:10EAC000636379FDDB731A897E1259E9FE257C3E6A +:10EAD000E5FF11467E9CF261225E97E574529C83AD +:10EAE000E277E5C9E21ED11B63E5F9CD25EE13758A +:10EAF0008C15FA6CA4CB41F78E2B72441C073F7621 +:10EB0000A5968F02FDBC6E1B017AD822FC269D883B +:10EB1000178E0BC40B43DF847E9722F5AB963F58CC +:10EB2000AD58C7886D4C272747FAACBA7BAF57EF73 +:10EB300075E8F2A3DA1275F5AF39E4D495E7FAB3C4 +:10EB400075E5F9275CBA7C61C7385DFDB1EFB97531 +:10EB5000F9F19D3375F5277E5AAACB27B39E87011D +:10EB6000DF619A38EF5B395FA27B604E110F547EF4 +:10EB7000778C8803957600A54FABFBD01E4977A113 +:10EB80007AFA308BD0535B9298388759E5798BE9C4 +:10EB9000F5758FBCCFACF454E6D5DF6756F798FB1C +:10EBA000F47AA9B72BFD38E81EB33BF81E73B98C75 +:10EBB000DF0E957F71E3847D2F74FEC32C62BD2D23 +:10EBC0007758286E44CD2B743ECBF304DDEEB6F6B9 +:10EBD0001FBF933E4EA3FE8B724B878CE3F51E3313 +:10EBE000BB7C6447B9623C57A717E7CA1F595C77DB +:10EBF00039BF79BCF26BC47ACA0C86DB67E7D07D7B +:10EC0000B1F9BF0C1A3F6F9CA0EFF8095ABFEB2B6C +:10EC10008F16F7B958B4C509FA1D783C01CF440BDB +:10EC20005B477146F2DEFF6D9BDAEE1BC18BCA2C8F +:10EC3000AD66325E309F19F4306B1AD7A772611738 +:10EC40007CF1113BD7371E6B32919D67FCB8616533 +:10EC50005C13EB8BE318C6CF1BA00FE82C38A73C46 +:10EC600039DE48E32C1C27D65762BCDC77FF9EFCBC +:10EC7000178C49FECDE83E4C3FF44674A8D6F1AF60 +:10EC8000BA8FAFE836144EEA7CC9A4DCC994F352BB +:10EC9000F053FB41C14FC5433857984B77DA29AE43 +:10ECA0006226EE9129FCBD3C5EF0A34D8047A1A8F1 +:10ECB000077E3450BD12634E34ECE1BDCC19EDF843 +:10ECC0001A7BEFBF304E81E03F507CD540FCE10A1B +:10ECD000BE3040BCD540F4497FFF40DC55107F106A +:10ECE000F77A243E7C9906F2A3DF1DA9DFC72F8C9B +:10ECF00013F0F5C87DCCE5AB3D57CF2718ECF72DC9 +:10ED0000EB8D924F08B90A7D03DF17AF3793BEC171 +:10ED100058E956C4117DB4C54CF75B27BB9D335CE5 +:10ED2000C23F4F7A07F9BDF8D42ABC7A79CAE5FB0D +:10ED30004EE8C153986B03FC19951BF5E54BED3379 +:10ED40003E833C5F1C722E5D2ACFAB4B43CEA54F5A +:10ED50008D93F2D8C55CA427493F7FB5ACD3474714 +:10ED6000BE8C686977A1FDC953BA17A6E0E284BFDB +:10ED7000263F90E7F00BCF869C5E67EAF7BE5E1FEA +:10ED8000FC06B88F7016F7119CD8EFBD146FD57BB9 +:10ED9000C026FC94CA1F24EB9FF55EA472D4476F73 +:10EDA000E7723B46430FE9F31F85F8A17AED86A889 +:10EDB00071E86F9F99FA53F72D6AFEEA1BED08F28E +:10EDC000277B3A8DBAFB2D57CC7FED7374FFE2EEB3 +:10EDD00018CF3BE0E3674C2E2BF0778FFD483CE2E9 +:10EDE000E46749BB4DE87CFBF4CE224DF861BD22BF +:10EDF0006EB677A646F700381F64D837EADEC06CD7 +:10EE0000E68F43AAFC319E8DE309CECA1F53E11F52 +:10EE10004FF39CD7B2D41CCEAB743EBCA624DC19F5 +:10EE2000F0D374A6887B3F03F96BE65ECAA5FE6E3D +:10EE3000BA3491FAB9382E4DE85DEBEE5B013ABA7F +:10EE40006A2F33639D9D21F7DE555A29F98D77BCD2 +:10EE5000E2D3F23ED15A8DE87CA5C6D4FD22E2D39E +:10EE60002A7FB155E64B447ED57A91EF348B776695 +:10EE7000F6487B03D68914EBC1B9789FB447601D6F +:10EE800048B10E7C075F421E7C0979F025E4C197EA +:10EE900090822FE1FB22569A9A6B147EA5E2A07D08 +:10EEA00003BF527190DE03BF52701E7EA5E0FAF0E0 +:10EEB0002B0597C3AF145C0EBF52701E7EA5E0FAFF +:10EEC000F02B05E7D9B8EB0279F031F76C5D7E2EB7 +:10EED000D7BF8B83F62DFC4AC1FDC3AFA4EBCFB3E4 +:10EEE00042D7FE56D6A46B0FBF5270FDDB9B349DFC +:10EEF000DFE976F91E40E5B641441F2F8D2E758D52 +:10EF0000E7FBF5CF117FFB9E19E70063FB32D0EDE5 +:10EF1000CAFA7097C073EB4C8177031378EE5940AF +:10EF2000785E6311F91271FFB83FFF4DB159F86F68 +:10EF300090C27F8314FE1BA4F0DF140F17FE1BA4E6 +:10EF4000F0DFE03BFC3748E1BF410AFF0D52F86FAC +:10EF500090C27F8314FE1BB483FF0629FC37F80E92 +:10EF6000FF0D52F86FF0FD24FC4841EF66404FCF93 +:10EF7000D49DEB381DEACE750E5D1E7A7A707DE861 +:10EF8000E9C1E5D0D383CBA1A707E7A1A707D7871E +:10EF90009E1E9C5F3DCE49FC12FA7A703BE8EBC1A5 +:10EFA000F951ADDE63B01DDDB0FDFCAB483B23B5D0 +:10EFB000C734CE0A56BC70A00C7EB64E9B961AC3C0 +:10EFC00039A5597BB1AC98E73DF21EDF68D66300E6 +:10EFD000BEC9CFCEF1E6F133BA773CEAAB242A576B +:10EFE0007E5DFAE378CF3DC048EF3F26E33D557B99 +:10EFF00017731891AAFA817CFFF542C757F5885F0D +:10F0000006CD831F0C7371CF24778D3D0FF7E5F785 +:10F01000183471DFF42E71DF3794AE764BBEB4C76F +:10F02000B0FF4838EE0F55682EC4316499D8097383 +:10F030001EE0D49807FDE0BEF131725D8D1370FFC4 +:10F0400048CD5BD901399FA0F8B5A21E66A9E2E3BD +:10F050004CFA82591683BF5B845E8076382F5EED52 +:10F06000D5DC3B83E8FBA1F142BE79BC2B2654F1F1 +:10F07000EF57EF6B9C80B8B859E1A2DDCF1F8F220C +:10F0800038DEB84EDB89F8C3A27DCC8D78579F9CC3 +:10F09000F7D5FB1C962A1AD741F174AADF8AEDA98D +:10F0A00014FF57C13A8B115FC10A3406FFA8821BB7 +:10F0B0005FDFAB585F16DF2A66D23F455C4EB88CE7 +:10F0C000CB51F1386131A555905B2A2E6752414CE6 +:10F0D00009EEC5B176E64218F00D0515EB07F3FE13 +:10F0E0003D3EB70BF78A267DD1788CF2BB4A294F7B +:10F0F000643086C621B936C2ABD1FB1A377A77188D +:10F10000E29C88D75D6B8E47FD7DCC0575878B1A99 +:10F110008A3B55F3CB611D069B06BCB3A38382E8F3 +:10F120008873809B80F75C9799DEDF986D7298C139 +:10F130003742E5F895F71643F48490FB252D6BDEF6 +:10F140004B35A6E37E89C1E507DF7A2E82F405A55B +:10F15000EF54C8FB6617D71D1B7C0B2FAFD82FF4BD +:10F1600003CF368DF89FBA6F529FE14B35405F1841 +:10F17000B26374AC51C87FF0C533DE676FC616AD9D +:10F18000587F8CE2222AD617468BB828E187A892AE +:10F1900070AA92F78A588E231E7AE6879CEFB847AA +:10F1A000D0BDC4688A2B6C15FA9CB2B7287D50BDBF +:10F1B0001F53F146FE71E0BDE251F92ECBC60A8A1B +:10F1C000BF0ABDE7532BF5BD65EBCC747F6859884A +:10F1D0003E582BEF0BD586E883E7C687E883F2FC21 +:10F1E000A2EEF356BC71741EE92B8D66F2CB95AD81 +:10F1F00015FA0BDBCF7C8867285B3BDD807743CA41 +:10F200009E73BBB47EE8E42DA9C7CCEAB4115CE7D9 +:10F210005C4AA6F4E64B4994DE7249DCA344EC0B4D +:10F22000E8A0F305467AF4DB526F99877B9588470F +:10F23000F486C9FB938CF4A65CE62801FFB8CAAD3E +:10F240001D85DA37CBEC598F7B9BB376308A3FBA7A +:10F2500001FA0DE2BFA0EFC0EE5E90564271183386 +:10F26000358A67B9A16085A46F4EEF0CF4EE95F472 +:10F270005B4AF93EB920E9DCE3ED3201EE3778353F +:10F280000BDEE1F3C873ACA2E3507A2F8F90F62720 +:10F29000BBB02FF5D99F30593C6AE38DBE0DF75BAB +:10F2A000CB61B31BC204E239CC237344F98817A3A2 +:10F2B0006F5B8743CDFFA35DA2CC6010F14E5CDF96 +:10F2C000025FBD6D75AE6551107FF962E2B419132E +:10F2D0000B03785F1412A7B7F29EE1095F172F5A4C +:10F2E000C9E18C7D521EDDF93D4EA1ECDA09CC5D01 +:10F2F000CCCFAC0B18538FF7F8712F70A1CCAF7E29 +:10F3000071DC9F36DA093E949F3E21F5362FF15588 +:10F31000C1B76E05DF32825F79A64E207ED53903F4 +:10F32000F888C8E991EF1048B9146287583DC1299F +:10F33000D61B628FA8CC11FC9C999CA9B7525CB0DB +:10F3400093EC796AFE1F9AF5719A7D7E9109529E1F +:10F3500034FF6BE21BFE2BC3731BD6B7D520E2E64E +:10F3600087185B99B40BD1FE57FC83C9772402F848 +:10F37000E77A1AF9D1354730FE3D1B3511A73E809B +:10F38000FD8665F73CBC1BF6BB660B439CEBE35963 +:10F39000828E1EFF8185F4F0324BC731BC93A5E00D +:10F3A000F87ED3BF9BC92ECFFCC3F1FED7C2469BCC +:10F3B0000BFCF98B89A5AB30EF881C17E16306DFE6 +:10F3C00066E8FF644AE9F7095F9B5E790C71FBCB45 +:10F3D000DBD3288EB4E250EE06BC27F2C544CF0F33 +:10F3E00027C08F6B775820C71BD6C5905C2B4F90DA +:10F3F000719DAC87FC540AFE0F4C10F6ABEB8A04EF +:10F400001D77CBF30818E66C5D3D798F3B649F2830 +:10F41000BB60A87D21F41D8781F68FB223C06E608A +:10F4200009B22B2ABB8439FBC30590A365167DFC6A +:10F43000A14A5F557637791E5CDC27C77266244087 +:10F440006FDEAC3920C7AAECCE5BC6F37CD509339E +:10F450006E60B259B14EF17EC73DE2FD8E457CBF74 +:10F4600082DF94C9FB5855DBC6D37EABF2F1347F03 +:10F47000E07D79EBE6A3292F807EFC6E8ACBAF720C +:10F48000B82DB141FBBEB255D3C5F5ABFC8109C265 +:10F490000E57C6D574C0EFB6D56916BCA153C6D5F4 +:10F4A0000BDCEF7B7582531757CDEBD1BD8659E945 +:10F4B000ECB8783F89CF3B4D8C9717D4FFA256FD0F +:10F4C000FB04BC3EE9452F4F8824FC5538F8BAD3DD +:10F4D000903A689E1C0E04A79EFB787F4E1A87F018 +:10F4E00051E9F79971EE2EC37D0A9E5FE8F09931DC +:10F4F000CEA275E2BD10CF26318E67638C6514F401 +:10F500002693C39202F8E1B01C47F3233E58C5E1AD +:10F5100082782B1577190A9F0A39DFAAD618BD3EC3 +:10F52000D6BAD90C7C2C18E0BD821E49B78BD64DBB +:10F53000A578F32A939BE2193C12BE1FADB0DD0BF8 +:10F54000BFC0822D0F99D370CE9E20ECCF3D72DFCD +:10F55000CD4AF70FA7778156D85C98E702472BADC5 +:10F56000AF0FBE0F727868787FA694E0CBE9C28BAC +:10F57000FB79555BF4F80CCC47C0B76A4B05EDB787 +:10F5800025268FC5113C8F6DAF0CC73D94057C7F40 +:10F59000E3BD23E6F0507CD3C70FDE924AEBE4F3E1 +:10F5A000A47B502EE70CBCF3C3E984E858D18B8AC6 +:10F5B000CB56E359278AB84CEBC46FDA976ED26BFF +:10F5C0005A387E61EF1E685F5A10D8C5C7B5548996 +:10F5D000F7D742F7A9DA9F6A5FAA7DAAF6EF63E63A +:10F5E000527FA216E0335CDE36FEB21F38CD90F3B8 +:10F5F0005D28F1CAE1FA6A701CD73513055ECBD2DB +:10F60000F5FB1DFDA1DF948962BF974DF30F47DC29 +:10F61000A5AAAFC62D8B15ED40F7A0B7948986BE7D +:10F62000FA2BA9BE3E1EA5B28F5FEC5B1F0F7EB109 +:10F630005F23BD77E57D4753FE0DFAECD3429F3D36 +:10F6400053B7BB21097AA3C9971AFC2E56955FF0D0 +:10F6500087C55CFF01BF5822E5747B9E276762D097 +:10F66000FEAD7AE0E92C8FE02F7EF0970F9E7EE9C9 +:10F67000F7139C01F9A9E6BF68E36FCD15F6607832 +:10F6800089F5DD9BDD4B717695768B13F7972BD73C +:10F690005510BF6589FC5CA105F01D4A0715EB34C8 +:10F6A0007A5FACB2698CCFF83FC8972B37CDA637BD +:10F6B00091149ED47B274A9EAAF97F57CE7FA1A49E +:10F6C000E33913C5FE5B589D665942FB3ECD520996 +:10F6D000FA97E50BAAF4DFFBF0D4E75FCED980FD03 +:10F6E00081B8213A9F6C320B3BDFBE48D257CFAC7A +:10F6F0007CFECD9B79BDCFB7EE48857EA2E6B154A6 +:10F70000DAF3164BBBDC12A9B7723C5504E369E986 +:10F71000E3024F95CFBCF127BCCB55962EF9D97D8E +:10F72000229E7F51DB7EC2DB828D9BCD69BCDE8A4F +:10F730008969BA7B32958DFCA0CBE1B970E30E33B9 +:10F74000F8C08A89026EA1F45E26EFFB2AB842EE69 +:10F7500068417E0B551FFC6F3F1F67F50A5B14EC79 +:10F76000D36A9C47245D5736C6C462BCCAC68A9F0A +:10F77000E0DCA1F87DE8BE3B6513FB6111EF0FFBF8 +:10F78000F2D45417C535C3AFD59F5CDD2CF1F653C9 +:10F79000B378BF3139A2ED09C0217979B80BFC21CA +:10F7A00033B393FCC6A067CCDB6210EF3D66D67521 +:10F7B0005EC03CB84A4DF75390E29D29A8D8F13C71 +:10F7C000BFD320E2AFD28D227D5EC28797FB51CEA0 +:10F7D000E23AE9DDB9BE779342E8D5C2766DC47BE3 +:10F7E000379638E66A7106E853F5A3E853D1EF403F +:10F7F000EBFB85E423DFB4BE5369D21E91ED4A458D +:10F800009C4AF9FD235CB0CF7CD33A2DF2FDC1BEFA +:10F81000F572621D17DBCF7A33C5B965E0F56E2945 +:10F8200089EF67BDA1EB54FB44DD69EFF32FB40A08 +:10F83000FFC2298DCB2FDEEED40A1BDDFF52EB5227 +:10F84000F6EF6F1B87F0F6C458694FE88C841E5999 +:10F85000162EF7BF5FE4F17D76D07725F7D57B6D67 +:10F860008A3F9F6E94729175DE87FDCC9A32E87D57 +:10F870009293ADA722F15ECAA9A9627EAADD6AB3FE +:10F88000883366911627DE3FE4E7AB934DF0FBAC7F +:10F890004BA073E46D4D19C4176EF3C608FB83D4F7 +:10F8A000EF97483E18B1BA6203DEF95EBC2DCDA1D8 +:10F8B000F17116DB5D1F6FA3F657BBA00F466C9965 +:10F8C0006D4927BD579C03949F68B5C64A296E0CA5 +:10F8D0007C12FBCBF04A26E4CED26DE21C30CBC0CA +:10F8E00036C24F38ACA5744612F8C4C31AC599B3D2 +:10F8F000EDFA77ACC6E6979EA7F35FC83B70ABCD39 +:10F900006DEE04F071AE6FC0DEB4D85E4A7A7BBD96 +:10F91000E49327B774D17BF40AAE57C4FF58441C54 +:10F92000704FA481EC70DF360EA84AFA9514DD28DA +:10F93000BFD423F8CF78C0C94872ADC45846EF2968 +:10F940006DD8329DD2AACD255BBDA3107F5C1A3F36 +:10F9500081E66D263B5955FD7411AFBB332C06E78C +:10F960009B54B33735582FADDA7137C5FF7CBAC316 +:10F9700046F13FC58ED9C53171F4DE31C5D7A97ABC +:10F98000A94582EFD4D44FD7C5EF2CE67DE29DCDBB +:10F990002FDB22E87E988ACBA94BF024150D16F1B7 +:10F9A00039E39D222E2789EA3BFBB58BABF4E36656 +:10F9B00011E711146F74E302DEBEAEFED928F453D2 +:10F9C000FBE0DB631C06B2430D47FF7DF146DB44E1 +:10F9D000BC51963C2FCD8A2DBD7901E0FF6B23C130 +:10F9E0007FA0F1AA0F693A3FDE6DBE68D25B3D7E13 +:10F9F00066811FD9E360A4177F6A644DD00394FE2B +:10FA0000A2BE8F9770F934BA3515F4B16CCF43A903 +:10FA1000902F9F458A7CD99E5B7E037EE5D9152673 +:10FA2000F47313237DB8D22BF46B561DABDE23B5D4 +:10FA300095733A9A5E1421DE3DDAA68F3757EFDCD4 +:10FA40007E6612EFF320DE08F4FEBEC9BF18F87D13 +:10FA50009FEBAF38C7A61609FA7CBFD53883EE0DE9 +:10FA6000F18D023DE4FDD66723110FADF4B512E32D +:10FA7000076EBCFFB3F23911178CF7E9E9AD506995 +:10FA80000769907690952F986724C791FE455FEAA5 +:10FA90004C7E4B7FF8AB91FA555FFEC07E3AB7D5EE +:10FAA000ED13FA435D5B17E90F4A1F517187B5FBF0 +:10FAB000BA489F50ED1A0E08B8D41F10DF2BB20DB4 +:10FAC000CA8EE2D632719ED628EF7D31BF7CAD2939 +:10FAD000389F57BE16CC7E82B28FF4903E786FF678 +:10FAE000EFE81C5EBF4EF6CBF3E6A0F1AA414485D9 +:10FAF000E27B861DED9DBAF35DFD81186AEFAF0FC5 +:10FB0000DF0839EF6EB09B90B6D4DB49EE6F6F34EF +:10FB100064E39EBA5B0B77418F6B97F7B706D7BE4E +:10FB20006B83FD2089F51CC57BBBFE14CF0F8B7842 +:10FB3000BF0978DDC5188827EA3EFC493EFA9F3C9C +:10FB4000ACF322DED4306B53CAE1A7682992EBC82C +:10FB5000E9CC075D0F3E22F8F3A366B691DE6D3661 +:10FB60009532D8EFFDD2BFE8FDCA40EFCFB66BFEAD +:10FB70009F05EB5787247D9686093FE3CED19E4DA6 +:10FB800098C77735F3A85CBA77681C8EFEBBA51FB3 +:10FB900052E9A9D3247F4E91E72BCB90443BE85800 +:10FBA000DDB7D3DC6E8AF7BC2BE74825E4F38F7B07 +:10FBB000AC142F30AD279CF4D6942133499EA977FD +:10FBC000DB35A78995F1FA47720C7EC4C5FD9859BB +:10FBD000C5BD006B887E6BB0D1FD64ADFD575F8104 +:10FBE000AF271B2F1C8DC67DD97FD3E8FDD1F2DE58 +:10FBF0008F1F7D8BE13CECCBA578E814CF1EACE7E2 +:10FC000064EFCC2E0F47DD8F1D6D569790172C7823 +:10FC10001DED777C15156B08CCAFBBE7637AD7B1C8 +:10FC2000BBC74A76DB69EDF29DC390F974273AE9C8 +:10FC30009E34AF47FA66B7DD40EFBB4D6B3F4AEFEE +:10FC4000154E53EF195AF5EF1932674A0CECCA6496 +:10FC50004BE5CA417C8BC0DFE468FD79F1B522A198 +:10FC60002FBE56A4F5FBDEBD8A5B5172E565FB9E97 +:10FC7000DB845D4AECD3E5CACF7F299DF489DEF6AB +:10FC80008CAF7DC7E26DE8155C5FB8708DFBEDA2AF +:10FC9000C2805C9D27E1A4E4B38A5B9827E135CF5D +:10FCA0006E10F009F9DD154537A17411C0BB88F756 +:10FCB00052F8643FE83886782C8EC751F733C2DF9C +:10FCC00049C2DF57AFAFC7B30B438CEE2E4FDABF3D +:10FCD000047FF47EF7B7C65F4728FEFCB611D02339 +:10FCE0001E34901EA1EE3B7AE47BEDEADE23CB6668 +:10FCF000C40FCA8DE1642FF4C877DA391F38063E85 +:10FD0000A0F6FFB0999DA320474FF2233AE6D769AA +:10FD100068A3EFA993D269BF0E651D49F27E4E21FB +:10FD2000F43763E07D6AA2FB16CDF7F012DCBF9CCE +:10FD300067A77BEEDDBE90F7A9E53BE6DD4CF287D9 +:10FD4000F9EA1D73BE9F79BB2D0B4479DF3BE6C3F7 +:10FD5000199DA3B6E4B22CE85FEA777F067CC77CE6 +:10FD6000592CD94D1F79C43712F240BD5F3D25C5CE +:10FD7000933869F095EF576FD54A17E07760BCA3C9 +:10FD8000C47C3B17843FB34780DB0F7BCFC9A648B9 +:10FD90007AB75BD1A9B2730FF3763D0C38A9B8DA04 +:10FDA0003F4B7A53F05771857121785074E73533A2 +:10FDB0008AC3053E1067D4F7FB316B247F51719DD8 +:10FDC0002FBB9C487F9CEAC99D847DB882C399EC77 +:10FDD000E89DDFC37A1FBD23D28DF99D94BF6B11BF +:10FDE000BAAF8A261994BF98E206CAA57C2B577130 +:10FDF000024DFA3881D0774EC387964E06DCCE6925 +:10FE00006F8FC1C7D7FF8FB1DFFB27D74E127C2280 +:10FE100033D1336312C9B9693A7DF2F5DC4F52E848 +:10FE200077662E1F1D0AF9774B4AE975E8D79629A0 +:10FE3000FC077F4EEAA4388F3F2FF86B0AD99FD773 +:10FE400088F759BFED3CAF8C6B16F4B06AB1B89728 +:10FE500098CC1A898E1303F1B236CCE37F5B5C73C6 +:10FE600020EE782FFDBEC8CBCD6D19A787F783F79D +:10FE7000B023CF3AF9C9C67BF8E5728AFB8D3EB252 +:10FE80002A8DE7371E3E5A4E71BEC9472EA671DC39 +:10FE9000DC7BF85591BFFAC845C4056F3A7C4CD459 +:10FEA00087FF6008633F397CBCDCCBF171C768CF4A +:10FEB000FDC0D7CD971A8F411CFF7EED9CC56914FC +:10FEC000D73A3B255BC4B5AE03DEE7C52F5A1FAD5D +:10FED00005E25AF74D12EDBA2F887DD07D41D079D9 +:10FEE00018F8C1E07F3E55F1BD8A0F0FC42FD53EF3 +:10FEF000FC57C527ABFDCCF6B8369A418CDE7F3A6D +:10FF00006EF8C949B42E7DDC70B7B9E731F22B5DCC +:10FF1000604EF0895722DF75425EB4148AB846AD50 +:10FF2000A7C389FB18450522DF72A1C3093E8F3C98 +:10FF3000EC5BDD3122DE51C5C5B65CF027619F1454 +:10FF4000217E91D72FEEE929071F2DC27DDE34F4E3 +:10FF50007FFCA81C8FA1BF5D1744DC61B7ADC3E96E +:10FF600090E3A01F3E6E1AF863D16A2BDD3B6AB99D +:10FF7000D0B882FA29B3F78DAB858C6BFDFA71A7E7 +:10FF80006B41E366F68AF84E8CEBD48DEBA7B86034 +:10FF9000DE1FC59F76C7B81271EE57F96294F3FC65 +:10FFA00043F2772A8A9C7E23E4808A934AB0C8F77A +:10FFB000B8E5B985D7A3B8CC5DBD629DE79BFD359B +:10FFC000D84FC5926F175B84DC64867017EE639719 +:10FFD000182F1F4FC6F9E405713E290E2BDD8EFD4B +:10FFE000D86012FC86C5A9DF4BEB58F6735EEF773D +:10FFF000F1C9F4FB6243130FB24C9C8F97CFCC81B5 +:020000023000CC +:10000000DCE07AF719E0FB77AC5513BFC325DACFF4 +:100010009D1941F750BA0F8F28C4FE9913E67C8EC4 +:10002000F17DDB3BE92BDAA773A29D8538F1F41E45 +:10003000FE6F914F703E07FFAE957D45FAB9F2D73E +:10004000DE12F0D7FE17C6A99F79CE22F4B31E7A2E +:10005000A7F9BF2789F7E9B8FE4EFA47CF75F2DD59 +:10006000CD1C6721CA53CD3D51805BF7659378B7AE +:1000700096F544DD14E49F7DAC5DBC671B4AD787D1 +:10008000270B39B03CD34EEF9D35245AAD94B65F63 +:100090009841BF07632ACDC4F9C06DE9DFEEF88B44 +:1000A000C9425EA56DB004FCEF5C7EB8C399CA7B03 +:1000B000D938C6767C3FBCEFFC051163192ECF639F +:1000C000DEC4C78B4DBAFA6ED4EF2B67E29936D5F2 +:1000D0003EE765FBE3EB4C723CE07989B83F112ABF +:1000E0002F1AA6C4F6BD57487237CE46F7AE328DEA +:1000F000D29EC7EB3AC82E28FCB7C9FF61A338BA15 +:100100005D364187990691EE32C8785F69EF53E713 +:10011000981F4FF14C9A3298FAF1533FC6FDB9D06F +:100120002B92581B8DAFF433558FEB61366232F250 +:10013000F7DE8A8C867EE1F9CEE4A9A5930B41D740 +:100140005EF651909C381F11D5148CBF06A3DEEECD +:10015000F9CEE469D44EB5AF6F9ACE3EA278443F53 +:10016000D14F7DA681CEAD0D46F62AFDEE00EB20E7 +:100170007FA66AF72EE7931FD1BB0D6E4ADFE3FC23 +:10018000F223BAEF379FD20F9A3DF4FD647335A581 +:100190009DCD8DF4FDC3E6264A6FBE35B200F4BF97 +:1001A000FCD05AF651907CAC6F337B82EFD7BC3BCE +:1001B000B57F3AFAFE64E1B77937ADFFF2FB55F946 +:1001C0006481CFEEC542CFE474B9CE113BB0BED04E +:1001D0001D29EE25BC344D9C5FBB9344BE71B278A3 +:1001E0002FD46D60DBD0FEA56916CABF9B6EA077C9 +:1001F0001DDCB1A2DF77B30CA4A75D3F636A03E007 +:10020000E48EE7DFF302F977AF12E5EE21E2BB9A65 +:10021000AF2A9F34A5CF8E9025CEC7C2FFCEE99DD1 +:10022000FAEFC36FB1985F687D759F3E141EBF954E +:10023000FB96F605F477EC83B4A07DD1E0A47DA114 +:10024000E850D15FC314B15F33C3249D73D945F027 +:10025000830CC3F938C146FE4137FC177C3DBB64B3 +:10026000BCFB15FB41FA03D47E50FB40D17B32DF4F +:1002700067C2DF21D631C9D8BF9DFEA1C962DD1D8D +:10028000F191A41F77B79B1D9037938CC2EFD0DDFF +:100290003EAF00F7C24BEEB637F6C7BFDE94EDFFB8 +:1002A0006938287E30001CAE58BF45DAEDFFC1F535 +:1002B000137F03DF5E2CEE6586D26BFB64657717D8 +:1002C00074FBCE64F741D04FB76633E19CD26DEB3F +:1002D000FF1EF94BD3C4BE50F4D33085C97768F8FC +:1002E0003A33AEE4776A3D7DEB5CCA88EF65CA7845 +:1002F000E350FCAA7505F1BDD7270F0EC09331AEB0 +:10030000AFF07E86D6D9E99CAAE8F7FCE0AF96402C +:100310007ECD9FEC147E268351BE072BE449DF7708 +:10032000CD487157417286416FE9392CFC717E7E50 +:100330004E823F0B36E8E0B86BCB14B1EEDEF985A8 +:1003400006D809CEFFC5EE85DC3A3FA4E724F49237 +:10035000F3DBC47BE7BCC7591AEE8D20FEC789DFEB +:100360006D117E10E3C35F9E843EB4E46123E92FE8 +:10037000E7716CE6ED963F287EE74EDD1FAC93ED0E +:100380005AB65DBC997EDF8CD327F49F8F6C0DE944 +:10039000D08BA73FFCE009BCBFBEE4390DE6667612 +:1003A0001476779EFF78AF51FCCEAA8C3B9921EF53 +:1003B000F7D7EC16F7FBEB106F02FDE5C08EADF83A +:1003C000FDC9FABD6666E3DF67E09D343ECED2B676 +:1003D000487E90E4FD6ED1C78D5ECBBC1B604FAEF6 +:1003E000DEAEFF5EB34B9FAF0BB9B7A84D91BF67B1 +:1003F0003092E5D2FDC42DC25EACF8F695FAAE9708 +:10040000E0EB5EA9EEEB7E41EF7B1B0F7F99FAA13B +:100410005DE467CB7C17CF9FFB52C05FC1AD41F25B +:10042000FC7349ACA08DAFAFE1B0CD013B40C30B35 +:10043000C24E70BE2D9AE0BC3CBC93FC0AEC45A3B6 +:10044000037AD83D878C6457A86FB7FD0CBF4BDB90 +:10045000F09C46EFD5D61F0AF309F85C5882F2A546 +:10046000876C0E27CA5F0C63B03F9FE778C3BDD887 +:10047000F3299D847FE0157609FE370BBF5FA1F05D +:100480006F7C58F893973C21F1B36D9589F0EAD3CE +:100490005842DA95785278FE95E1A93E3CA1DDF408 +:1004A000877F7F5CE29D21DEE6E8B64AFA5D0C8537 +:1004B0006FCBE18F52A1F72A3C1B399E7FA8DA3B14 +:1004C000E57B785F83E76AE0D9FE8FE3F98F908F51 +:1004D00085A4F77EFC53E8BD9116F2A32BBB86B230 +:1004E0005B0CAE7DF7581C1F7878E2B3A4E796C783 +:1004F0009EA95FC1C88E76ED14D8D1AE7B033FEBC9 +:10050000CB7E77FD53B9A08F167327FD6E8C3746CF +:10051000BC2BDF9D367BFBF37CBCE2D8AF52F7638C +:10052000DFBC1C46EE93B9725FE2CF1AFC2E60BBB3 +:100530008DEC6DF5ED61C2BE7640EF3FEB4E12BF24 +:10054000D35762E9295F01BD9CF78771D479B0B6B2 +:100550005DFEFE8B3CBFD52A3BC3BE90F7A11C6F4E +:1005600050BDBA2922DE36236192137CA86501F3BF +:1005700084677C1DBF67C4EFD5EFE50DA8070EC0EB +:10058000F795FEC7BC7A3B87E23F4BE5EF4BF6EDB4 +:100590000F99AF5EEB8DB21A89EEE8DD86BA47C5DA +:1005A000EF2B7E02BA8B0AD053838C4F3BF6FDDFD4 +:1005B00098F03B4DDDBBC4FD08CE21B7E29EFED9CD +:1005C00036110F5753D035C6EFC4EF74083EB46CE4 +:1005D0009FE673A6F54347CCB741BC6B1F424FFB68 +:1005E000BEFEDDC37B037C64D4DF393C77943029C5 +:1005F000B7BCFDC64FF6C9AF90DFF1F8DF16CFDD0F +:100600009BC3D7F335FEC66B13F5EFB85CE7D4FF99 +:100610004ED377B2F5BFD3D46B97F091FAA0D253F3 +:100620000F4D11723C3455F0BDC1A51F479D8BBFC6 +:100630003B4E3FDE6CB77EBC6F8B977F555CEB37D4 +:10064000C1EFB81CF7841CF73772DC7F164E2A1DE9 +:1006500068BCFF5FD3FF0B8D21EA0800800000001B +:100660001F8B080000000000000BB55B0B7C94D5CD +:1006700095BFDF7CF3CC7308210904C224242160D8 +:10068000880324542B94C9D300D6065C2D688401BA +:1006900052C83B80B5D2D6FE3208222F5BA8D1A229 +:1006A000224E82E1A1613B118289863A286411AD14 +:1006B0001B698BFDFD56DCF828F23213A374E55755 +:1006C0005DF6FCCFFD3E321942B5DDDDE4A737E72C +:1006D000BEBE73CFFB9C7BA929CE317C394588DC1B +:1006E0009873E69E08215CAB7A8A12B385E87B4357 +:1006F000154D0E2184DB7BBC3E5688DA8EE16253B9 +:1007000032C1257D6F1A00B78DB36FA2F18DED7FD9 +:10071000781BE3BD07558785C65F6BFF280AFB5C26 +:10072000FC325C88E158F7519420B8FAB2C2F02646 +:100730001A77103CAB5515FE4CDACFE83363FC62F8 +:10074000AA0E7BCD82DA929656730FB5557B5B79F4 +:10075000FC0D9F69F0F8DEC641E376CCA7B6CAE887 +:100760008DB2537BBE5DDFCFCFF3AB53159717FD33 +:100770007BFF10B70CF35ADE895B4AED15FCCCBC4D +:10078000B6FDF4D00B996E5A57D341FB440CEC5391 +:10079000D361D2608977756A6B510CD14BB4282232 +:1007A0008D9A8B62AB584DF4AC6A6FAE16D45F95E0 +:1007B000718F49105D023EB518DFA71F8388A375AE +:1007C00076FA8BE877D1F779D452DAF755DFB1DBD7 +:1007D0005DD4063A5F8FC2770307697EE6003ED399 +:1007E0005D44BF1CB4662146D0BA83AF4739687CEC +:1007F000A3EF75496FA39FCFFD9A0607A8653AB787 +:10080000AB7CEE8A2F55A6BFBEDFAD2E95F799D5EE +:100810009E1689739DF4C9EFCD7539647FEAE23283 +:10082000E07F2261418E9ACC78BB000726CE69DE3C +:1008300044A854F968DFCC6BE9B654DBB7CB24E6A7 +:10084000FBC0B7D4035DA3483E4E140F9F4C235703 +:10085000E7DDE332F0BC22B33B7505CD3B19E188FF +:10086000B4D37E0F158F8B045F5F438BFEE25D6612 +:1008700037B59507E5F74EDABBA3206F270F4E5526 +:100880003DCAC07E776ADF15C2C3ED00DF3CCCA74E +:10089000726F6304F619E09FEC9FEBB2F3FC13DE7A +:1008A00077EEBA87CE773223DC09BE749945B98FCB +:1008B000E5843E82EF752636820EFAF7E6821FB493 +:1008C0002E906160BEF6B69BB479F7348B41F34C41 +:1008D000CCB78BCF0DC6C7EEFDE097F7D0FCEA672B +:1008E0005461A1EE6AD38A389CFF931D83F12BD704 +:1008F000E85C6DF2C7C505C96B75C7557D8960F9A0 +:10090000EED0F5C3C1FCD4F978324395782558BCB4 +:100910008250AE6E6D66B92675F3D8A6702BECD4F6 +:10092000268677272B74FEC407ACCEB584FF738A66 +:10093000366EA03686608384CDD45AA97DC624FB4A +:10094000A1B6583F86D8A9106C2A1E976348A17D8E +:10095000D4D6C9E0EBAB335D8FBA088FCD334B668D +:10096000CC043EA26F99A06FD65C8AF08868210AF9 +:10097000D5F79EC077FB0F9A04EC478DB5A3F263C1 +:1009800092D37E27290AE1DDBFC3E4F5B0FCB9228A +:100990009469422CBB49EACD270EF734751CCD5F14 +:1009A00063E0F355B7A85E1BCDEBAD271210C93F2E +:1009B0006D4DFE01E4B5FAB86AB7D2B9F37DC9BF8F +:1009C0009A0EB8C5E4B4D0FA5A1F75125CBB57F141 +:1009D0003AE4FE027A597313CBBA3863AB4D11591E +:1009E000D4AEE93363DE99C38A788CE66D0E8B6AE8 +:1009F00002DE3599B3CF2951D4AA5BD627D27ECB5C +:100A0000B79B3EECB1CAB557E8BFBACE6D2CB7154F +:100A1000DEC1FD557B07C335C23800D3FECDF8E3F8 +:100A20006621DA5C91B1676EA0BF2788095754D060 +:100A3000697A3CF4E104F84AF2241A88D82385B88C +:100A40006F92331E7ABFD1E8980D3A043A4D76D0B2 +:100A5000ABEEF0810AE0EDAD0E731AE8A8B5AB5F1E +:100A600061BA06BE20BADF486D82E0F30784A46F46 +:100A7000A05DCA799D49F15AB19E68C8FB5915EF2E +:100A80001A1A0A78FAA3D83E09510CBD58B520C7E6 +:100A9000003B07351684CAAF747D506C46251AADED +:100AA000D4FFEF197BD4614176E23F5D298C7F81D1 +:100AB00059B87DD47F5FA4331A723FD61A9505BC0E +:100AC000C65A93BCA0FB5863DF1A7C7FF328C5F19C +:100AD000106D7D24EBE5C90AE0DA0827E4444958A3 +:100AE0006C043D368F5A6C84BC8FB5FB324A32079A +:100AF000E0028C431F8497BF5714E136E23BCF8D51 +:100B000054FC06DA3F6023FCA02746BB09F8054CDD +:100B1000121662CD20FCC82231FCFF8E9F9DF08B07 +:100B200018C08FF81D8DF59F67137DA84D9A2B4433 +:100B300037DB85156C17747A5E24792F205EA52922 +:100B4000526EAA771C29C2788DE85E8F754551F2E6 +:100B50001C45380FE030D9AAB9925FB95A7B7FAEF5 +:100B6000F42FBAFDECC8751973A9DD9E5B62465B74 +:100B7000A866C6F70C61EF5729569693CF49FF60D8 +:100B80008FEF5DA1D8533306E45BD7AB3AD97555E7 +:100B90007FAA7EBFCB2C52F0395777068D970BA9D1 +:100BA000D78B56DBECA9C17A043D237A94DB2B6EFC +:100BB00013A46FEED571F6D4A9D4AF5E340BC89EE2 +:100BC000A65FB1F47B256508FDF285E865FB60D87A +:100BD0006F9372EE8F54BC6B09FFD4DCC17A97A47B +:100BE000E941A35BE1F3357E6564D853AA7841F30C +:100BF0003BA973758C7638CC2BCFF5C23FDE4960AC +:100C000029FA1B62594F7990ECD7BF68E7BCD3E84B +:100C10003F02FB71CCE44BB6D3D0B11AAB13FB2F20 +:100C20001014E8905D2B15DDDC9E0AAF6DF3F3E642 +:100C30009E3190AF77DD1627E2B0C6754D91B0E3D7 +:100C400059629DFD4C06820AB1F7CAD4EBC7332422 +:100C500038E28CCE1738628A53C06F9DAFDB735D6C +:100C600079B939D75F5FF5A7B6DBBF03FB757FB3F3 +:100C7000395E8A4977C6B401BEE97CAD131EC65BF6 +:100C8000E7D755FE11EEA3410FF5E25CB633CFAACC +:100C900082E30A8D7F56FA1D8A7F3A7D676A7C5807 +:100CA000DE21ED51285F757AFF9036C4F7C98FEECB +:100CB000607E080BDBBF50BE7F135F28C22CC5507F +:100CC0007EAC45809F8906691F1397919C10DEF7C3 +:100CD00008F7E11E6AEF0A7FCBC472A8F1E75EF065 +:100CE00087A6BE2BBCDFCF48FEBFE34F476EC903CC +:100CF000C17A18AA77D7D3B36A87F3DF75BF47964F +:100D000086F42B443F43F44FE7977B7514EBD9559A +:100D10003EAA2D525F357E45D0EF90FA863FE87BA4 +:100D200035ED8AD79FFC2DF44F21C4896F8F85E85C +:100D30009DCE9FEBD91DDD4E9D16FE63763AFFA931 +:100D4000141907787E62F136034E3794C3EE9D9AEC +:100D500028DB039A7D0B6D4F539CA3901FDB94718E +:100D60007204FCF529B3BE8FCDDB4CF89F5ED33DFA +:100D70006625AD3F9D2BDB53880B83605798580445 +:100D8000BB7E7AA4C5033A9D5626E4C13F9C561EFD +:100D9000B85DC2F16607E005F17976824F99E47C8F +:100DA000DDAFE8F6FFF482EF14F03C451C053D1C76 +:100DB0008A28E1EF284A4C31E173FAFEB4296BC569 +:100DC000C0F99B720DBCCEABD96FC283E9DEF7537D +:100DD000C5DB445D8BE05208FFE4BCDF14A750FF85 +:100DE000FB3F1B3719FC75AD1AFC7DF8EBE41B01CA +:100DF0006FE37DBEF7659F6971905FBAEA270B3E8E +:100E000093FD653906E84BB9C64357CC8468F0A713 +:100E1000DF3B2E1A7E47F743FDC70F44B883F876B1 +:100E20008EFC94181F044F783429D88F1DD9BD39F2 +:100E30001DFB949B3D594EEA3FDBF87412E28DF2A4 +:100E4000DD8FA4731CBC7B633AF299F2A6CDE92E28 +:100E500086C3DD9C4F19E5B92FECBF79D7A6A0B8A2 +:100E6000BB2A5F65FC4BAD470AE16F67DFF0E9C362 +:100E7000769A97F633C50EF1BA57743F0CFFB81047 +:100E8000F131F2B7062BDB73DACF05FE374FF8FEF0 +:100E900073D0E313191F99CA68DEE55C23D367A1F9 +:100EA000F06E89A771B141B1378BE0F9631A317FD8 +:100EB000F13AC59C003BB062D864D58175C3188FE8 +:100EC000251B2677A17FE183B27FB6C57BF024F690 +:100ED000F98DD9D9EC607B9352326900FFCBB966AA +:100EE0005EB7688BC2F1BFFE9DB427E21A83CF794B +:100EF00059E3BFF8CAA2802F3FD0F872DB83EF1C02 +:100F00004DA07DEDB1EE2BB01B6F3F7E26D54FFD82 +:100F10000531E73221E76966F75315387793C589BC +:100F200073646725AAF1347FCA8F731F43BBE8C17E +:100F3000C54F55C0DE6EB772DEA6E3B74A711A60C0 +:100F40008F5F6FFCE112D0EDECE3568EDB57358EF0 +:100F50008F1743E8A9DEEE21FE3B28D1D9576FE574 +:100F6000F6857ABB70903CECAF4F60F8B7F50E6E2B +:100F7000C57C295FABB4FCF87AFB4DFD325C3828A8 +:100F80009ECDDE60130EB2534971AE517974CEB46A +:100F900089354D1BB573A5D1FAC99EE47CD0217B60 +:100FA000E3CA2E84BCE63C998FBD797243128CF261 +:100FB000F2073FD85941E373F34AC6E551BF75C7FD +:100FC000675C5778BDE39185A0777993459E4F3B49 +:100FD000F7D9C7D3E39FA2FD3D6F9838DFAFDBF1B0 +:100FE000C1CE8DD42EDDB2D21C2CEFDFF6BCC91AD7 +:100FF0003EDFA457D7A3C33FAE579B93587F9A4871 +:10100000AF32FF79BDAA7B700DD3EF81BC92D9A01E +:10101000FB59932709FA7476C20C9673CF6185E960 +:10102000AFDB717D7DB176DE2A836FCBF4E4013BCB +:101030007E4964337D8F747C928EB8F752FB82BFF9 +:101040007BEE43746E3F9DBB9DE8EB1F7FEDF83454 +:10105000B37B9C93CE37CD20E3DD6BE2D63C835649 +:101060002FE83697444A9A2BA8CB68FE93FC982722 +:101070009AF0A9EE54FC6159F067B79E3322DFA3C2 +:10108000BCF1C3E038827E3E0CF2DBD7C3F79BDABB +:101090005AEC93366077BFF36783F007F9E99B7BDF +:1010A000C2843FE8BB57F313EA33139F7A3B46B23F +:1010B0005D00DF8CA8C7754C68027CCE2CF9D87B0C +:1010C00088E22659C711EAB481739EEBB890053BBC +:1010D0001B7ADEDA972FB07C54B73FF299C2E79FB4 +:1010E00075CE98F5CDE73FB2FB4216F877CED433F4 +:1010F0000DF956AFB9270B7CA87D45DAF37F940E26 +:101100007A7FC5063A08E979AD62653929542F72AC +:10111000DDA0F7B8AC1BD476EC627BDADF29EB37C5 +:101120007586EEA278D43B567CD0057BD69F20F303 +:1011300028DADF05BA4D1FA7F941635FD25CB26BB5 +:101140002F5E950799FF9D85FE8EC73EBE6AD8012A +:1011500091152E10579C873E53FFC2D5C9EB21E74E +:1011600067BD23A6C03EBE99F5B75AAEF7BD1A6E4D +:101170005739EEA1DE20FE5D3D875715AE41F58063 +:1011800070E10A9A576776FC80E3E313AA405C5744 +:101190003751EA937859EA53CDBA23E684A0FD7615 +:1011A000429F186F192FCE7EF56FAC975B66BA3AE7 +:1011B000A197E1B085D82F21DAAB28DA3CE27FADE8 +:1011C000864344A796F717AB3C5ED7AE8A915893F7 +:1011D00010E94DA373148BAD46C4D3B3856F3AEABF +:1011E00036C2D8F3CB5B687CCEABEAD44D82F3A792 +:1011F00045259C57BA5357213E32281A5D7DD97335 +:1012000083FD599EF453D35585FD58DFC8708E5326 +:1012100066CDAF2905BEFABCAC61721EEDC37196F6 +:10122000F0F665CD857EFAFBB2E6450ECCBBEBD57C +:10123000F015EC17852FFBAEA0EF84E5CBFAE8E7BD +:10124000E4472027759764BDA350FDEA09C4E7ABC6 +:101250000E93BC203E3424BF6B801D273A83AF170A +:1012600088AF2EF81FB770B9A03F934678A13F759D +:10127000FB1561449DA8C3D2843A52ADA9270EF252 +:10128000BCB1FD4F66C8735DDB3B66C724AC977588 +:10129000275248B6E3759AFFAA691FFF2EEA7C35EC +:1012A000C7A517AD31BEC3F97BD5C156CED3AB852B +:1012B0009FF3F4EA96C1F2D29FE0E0BA48A87E8498 +:1012C000E53B06E9C5ACED522FEE52C50AD839A16F +:1012D000D5696725C4733C32B04EC6BB2EF5C2C378 +:1012E000885F02298A53A1AD02619E75888B3CE913 +:1012F000329E09FCEE85EC656C57BCD977D0B902FB +:101300005ABC3B6BC336A31A84CFAC4E59970C849E +:1013100089F243CC6FF768F041B84A22F27358AFB4 +:10132000B26057030659470D3D47BD562F3A817AA3 +:1013300052E600DE731213A51D135E969F2E83FCEA +:10134000BECB40E35306D62FC997EB07F2215907CE +:10135000BB9E5DD94DFC2923FEEC253EA37D9EFC62 +:101360007119D99916F2C780FF95FC315A5F7D0635 +:10137000F7BF58EF64F860FD4D0C1FAA7731DC5EB3 +:101380005FCCEDCBF525DC7F02A87E17FF7BBA1181 +:10139000F2D0051D1B35009F8A0981470D9E7F2ACB +:1013A00046190C8F52787E76FED38D1ED48B66DA6A +:1013B00035FD764422FE3A6B9375A8B33659876A99 +:1013C0001DE5BE259FC6CB66ADDD2DF350573AE631 +:1013D00015C42CE0FCB59FF257D8A395F9EE3CF06C +:1013E000E5F8F1FCD46D6C276D5C073D75F70DD108 +:1013F0005C077C83F271FA746EC6D475D904E74633 +:10140000282CBF642F6E2CD1F34ADA27BF53DEA3FA +:1014100014AAD565D87FD548DB54D8DFCF5DEEDB85 +:1014200080874EEFA251CB53110F75991CEFA28EFE +:10143000EBF9BD49209FD2EB7DFABC0E57EEDD588B +:10144000372B63DCBA29B03BA464B0732EB36801B8 +:101450005E2E43B8B296ED96C3083B70B726C779A7 +:101460000E1917FBCD0E630CEA3761B9B11E5AD7BE +:10147000A5F1F9B8C6E7131A9FDF429D8CDAB7A928 +:101480001F6D37F5A39D01FA4A7965BA3D91575210 +:10149000C6F22BFA9200EB75C1D9D02F696F92205A +:1014A000D75B34F94DD0EC4D576E49955CE7E37D41 +:1014B000AAB47ADB05ED1E443FAFBE6E60BDE07698 +:1014C000DE8DC263859D7F49E69D6234C52304CFCE +:1014D0007B299EED906ABD23F363D2F37953651E99 +:1014E000200E58E4BC04470EF464AD566FEDF51AB7 +:1014F0003C26D4A763BAD363E07F35FDD2E143FF36 +:10150000ADB2BDAE994230B5AF28F27C35F3BAD357 +:101510008761BD6233707DBB498E9FD4F4AF264591 +:10152000DB4F3B8FB0FA92C08FC0E197929610BC10 +:1015300029C2BF4CDA7D7F3ADB6BE14F9F07BBA826 +:10154000F8DE174E8A2B0BA62E318E043D7C3B0114 +:101550005717E42C31DE8CF1D6F7EDC1E3237C493B +:101560008A1D70B61C1FD1BA7398330836BDF83E79 +:10157000C6CD869C250504CFB1788FD7436E7E2BD0 +:10158000E5CBB6BFED0CE856D521E3F6BCFD6D17F3 +:101590005F845F6E8B74C2BCEFCB4F667AAFEDD8C1 +:1015A000B305F2D6DB2AEF0336B5FC69E7CF799EA7 +:1015B00005D724B4AF2F5BD077561EFDE362E0352C +:1015C00027DCF705E0878ECE643CE70C977AFDC8F0 +:1015D000D1BC25D0D3DEB6FD3F81FECD89A68016D5 +:1015E000F8BC60E33A44E5810905D0D3DEC8EE8556 +:1015F000D8BFF6798B13725A79203E0FF58143F9E3 +:10160000B21E5E31716B12FCACE1E57DBB7F8EFBDF +:10161000D5E76D7C2F541723E3BC4AB571DA4AE64F +:10162000DFAEDD4F03EF7D36BE9FAD40AD8AE08A71 +:10163000DD695CC77FE5EB8F16820F85EA8EDDE8FA +:10164000FFE2399B017438697645CF801E9E347164 +:10165000BE59A1C115A7864B7CC27B8A987FB15B1E +:1016600093E0672B87FFF476E03D47DDBA13F98EF0 +:10167000D863E1BB8973FB886EB4EE5CB3690AB8CA +:10168000DCBB2FD20879B9A06C5DF814F66F96F325 +:101690002ED8B6323D3DCDE305BE47F304ECD6056A +:1016A00065DBA0FE73CD7BB2908F9E7F7E0EE7A59B +:1016B000BAFCEAFA52F99C65905F644B40F6A85276 +:1016C000FB5BD83D2282FC6D85069E3FF464EF53A0 +:1016D0006260FDF91693DF4C34AAB08875D6980184 +:1016E0007DA84CBCB518E7AB3434A6236EA998DAB4 +:1016F000B3107A71CE26AC0934EF4DCD6F551E5C18 +:101700003317F1EFF5F0B9A2D9A34B09D27F5D6A87 +:10171000B77983EF2543DBF7EA85FDADB401F8DE49 +:1017200015168EE1F5FDDE34FBAA91A7D5C648FB60 +:10173000F13ECD6F213BF6B5E6EF16AD1E3CBF3F47 +:101740003F86BF5F6BEE4987FFD3F70FE46B7EC325 +:10175000D8930E7B15BA6E0EC211D8911714B6230A +:101760009507950F54A253A5D5E355411761D6CFE0 +:1017700069BCA2C87509D334BAD3DA0D05C9FCDD3A +:10178000CA169BCB46EBAAC27AA210175547F6445D +:1017900021DEE97D59154D1ABB62E334FEA4682CA5 +:1017A0000BAA3756F84C2E5BD6107C46FC44F396B9 +:1017B000E36FFAFE3305297C9EF2F670FE9EB0F7C9 +:1017C0004C839C96EF18BC0EE7B207E95F6FFBAE47 +:1017D000B8E0BC3C45C33BA07CC07A12F8FAC324F5 +:1017E000F0BDD220D6E1FEF23CADC1BD26C1C22A79 +:1017F00061BEF7ACFC6B4418E4E5FCA56AD6DB5E81 +:10180000A587EDDADB0573D92EF59A7AD8AEBD7EC1 +:10181000F42EB60FBDC37A16C24EBD5DB05C8E8F7E +:10182000EC59E8A0F1FD3A3C46B0DF7FEF680DDBF4 +:101830008F39AA7C57217699ECB21EB4E1543DE76A +:1018400017264770FE7DBA40ABF70CF087F32E5D8C +:101850006F7A8563FF41E8617904D775288E6A79CC +:1018600011F1DE823827DE6B94639D940373F07D63 +:10187000636CCCE565E0CF1DA3DD450539B8DFEC31 +:10188000E13C82A49AFD4DEDEF2C9C4F064C7DBBB4 +:1018900061A7D247BB6717101ED5E6EEF5D984D2F3 +:1018A00045534F174AE4B355698FC41E2957BD9954 +:1018B000BBE43D8D765F79B7467F41494C23E442D6 +:1018C00091FC7DBDFDC05BB02BBDDDE3D81E87EA7A +:1018D000CDB9F6C7A2601FFE4C7EDC1394EFFF79F2 +:1018E000F11EBE679D8FF720D42E5937581EFABFC0 +:1018F000BA83F33EB125A81F72D830180E9523C8BD +:10190000A37F90DDF130DDB76B7A5595D75D0B3A4B +:101910005C85E711AC06C1AF85C021F345898C1306 +:10192000B6C3FF133DAAC7F84F719EBEDF2460C740 +:10193000D792FF62B82DDC8B7CC5B09FFC53ACF412 +:101940004FF00B5551DD5C9FEA6DB3F07DEF431D09 +:101950009F24E1FC24875C87A9EA78290EF9FB3EE5 +:101960002D5F203F18C7EF63DA3AE29077E8FDD5A4 +:10197000065F3AF0A28888E375BDBF46F5A703FF6E +:101980002AA53B0BE3FBF2EDDA7C8255C082CF51F6 +:10199000AD487D171D2ADBF350BE3DA9C92BD98563 +:1019A0002C7EDFF1B2AC0FE876A042B327AFA13FA7 +:1019B00053EABD5DBF57A2A515D0F721EC43428184 +:1019C0001E17AFE0FACDE3050E096BEB795F595FA7 +:1019D000E2F1DA572E64A564629D362FD80E8D1B76 +:1019E000B02BD0FF04D6FF874C7174AECA9D8A73AA +:1019F0002DEC54E99A229A2E961B571671DD4C78DD +:101A0000386F0BC52B548E2617483A551A8615C6C3 +:101A100006ED779E6C7AC214B6337ED89D1FC53E04 +:101A20005A843AC50F4BE5BB81ABFE2658CF719E59 +:101A30001DD28E436DAE18AE95E3E52B1AD7C70FB6 +:101A40008147289E15EEC6A238C7B5FD3ABEE76DA0 +:101A50003A7E79A611C17498BFA66804B5CBADFFD4 +:101A60002C1DE479CF7758FCF0AB15A52BD7470F89 +:101A70002137D7F8831D41FE2B05FCF5F2FDC6F595 +:101A8000F00F6DAB15FF29D48B04E95533EB17E943 +:101A90004B905FB8B920A4EE50BE782CE26AE15EAC +:101AA0003C167E86F46AA17388FC920CE42803BF7E +:101AB00019F1701B8ACF5F0AE4BBA49B0BA49E6F35 +:101AC00099E90AC06ECE500D1C8787EEF765818CB0 +:101AD00027BAE322EFD7DF7380D9335449B74443A1 +:101AE000FFDBD0B7C4B84807EE830AF3C3E5BCC335 +:101AF000363BEA3781C397B9BE1B783862BEBC3724 +:101B000088102369BC2B615253B01FF975A13C6F3B +:101B100078B68C5BEA324C7FBF3E941979B53EC4EF +:101B200071436638DF97F4B67FCE7E2BD09963C7BA +:101B3000BD466F376587A44F755FFF571CFC6B6F01 +:101B4000E75FF81D5AEF579FF0FBB48DDAFBC0D763 +:101B5000DAB5F75DDD8E48F4078A3F2AC2BC4D5ADC +:101B60003B502790F562BDD5F35FBD1E1094078FE3 +:101B70002E1C3A0F8E714704D7091CF143D55582AC +:101B8000EB04A969B24E801675825493AC130046DB +:101B90009D002DEA04E8479D0030EA0480512700AB +:101BA0008C3A015AD409D0FFC57CF95E2640422CFC +:101BB000EB97116CDFEF6B56BD88CFEF3B2CEFA19D +:101BC000EE6B54F89DD645FA3EFCDC35EF750E6A97 +:101BD000EF757CDBF85EAFAE4D75825575A6BE63C2 +:101BE000A8EBD4B52ACE35B02FF5F3F9FB1B3B7328 +:101BF000DE2D457FB3C96970804F97E250AFAAECE4 +:101C00006CE6FA5341FC6133F3B74511A897DE65E2 +:101C100091796E8D4ABD53F83E94E3E01A4B37E755 +:101C20001F557B157B59F07DEE4D9FB11D586B8B79 +:101C30006A029E353E9BBD6C88F71F7C2FEC1057C7 +:101C4000EF9B97C929A226A288EF9B97E19E995AFC +:101C5000A17E65E4FB634A4C87431EF1AE2A03660E +:101C6000DD2EF53EE43D556567EBFA4471ED3D34FC +:101C70002A03E07FE8FDB3BB3032F64C380C859880 +:101C80008CB8A9F8F1B2FD6DF4BDFEAD168E3B56D1 +:101C9000E6BB97438E8E995C5C273976D8C6F9D11E +:101CA000C7DBC60FAA937CEE725717F2FDFC68AE35 +:101CB0005BAC3229EC97F38BC7C5F3BB81E326F607 +:101CC0003F1DAE925ACC5B35C9C1F5A9428BB89F76 +:101CD000F7D1DE6951CBFA54B856F11A085E2C9C44 +:101CE00066E8CF22221BCB8B296203DE532D12F232 +:101CF0007D832E37ABB6291C1770A1200EF7929268 +:101D0000BE8B3AFFED32DE2F2CB5C8F835D120EF6F +:101D1000B31337C9F72D3F126E33FCED72F28B68A7 +:101D2000C94FFEAE87FADDE1A393647CEE88C7FE5F +:101D30008B4F98F8BD6F61FCF7D3DDECAF0BF81D4E +:101D400083E2BF47BD72C3F5F527F41DC33193B4D9 +:101D50002F4447CE8BBA20975C9F71737BA2BE9CA9 +:101D6000DB1933A59DBEFA2E91786407FEE17DEF65 +:101D7000235F4C8C8F74C2DEE97A7FCDFBC430D9EF +:101D8000EAEF13C7502B82DE276E713978FF44C308 +:101D9000C9A90ED0E3AF114ED0437FA7B86566C97D +:101DA0002EF0C915253CF82EEE51B6125D8B701041 +:101DB00005756E9F4B45DDFAB062E777D1D7D8C97C +:101DC0006D0FE31D4F5DAA62571CA8876F2D8C23F2 +:101DD000BC8B529219EFBA76592F650AC5A19EAEF7 +:101DE000E983CBDD563862A07F8EA617BD345FCA6B +:101DF000C92D5EC8DBB7A8A33E87F91E6173366B99 +:101E0000F91AF83EE786315C4FD5E5A6BF25BE0935 +:101E100072F346A1F433A5A5EF98100774E5BA8FC5 +:101E2000E2FC0BCB3E7B388ECF37741D8BEC28DF6A +:101E30004B86D6B174BBBC5BAB83C37E1AB53AABE1 +:101E400051ABB31AB53AAB51ABB31AB53AAB51ABD0 +:101E5000B31AB53AAB51ABB31AB53AAB91EB772B9A +:101E6000B87DBB7E35B7DDF51E1E0FB2FFEF5DC737 +:101E7000FE87D6413FC2BCD03AA8B03AA2D98F92D1 +:101E80007ECBFA7348DDB378F8920D44BFFC06B3FD +:101E9000135D7A1D14EF97EF8B607B70B170C8FAF9 +:101EA000A74EB708AE97F60BDB14D03F2F639CD13B +:101EB00040E37FD5F8A0D71FA11F381FF4032DF4EE +:101EC000C39836A01FCF984985B3A5BFF7B0BFB759 +:101ED000315FD7AF21FB41F052611F643F2E86D89E +:101EE0000F4A3CEE061ECB3AE5BB26FDFD661E35CD +:101EF0005F4E19C29EF8A43D1913E6DB87EF8CA94B +:101F00000DE3F7C1C7B4F758C736CA777165A28425 +:101F1000BF3B845D89023F960EEF7BFF699ABF74D9 +:101F20007304C72DEB472E9BF6BFB12B9F150AA656 +:101F3000DB6FEAFD951F132E056152FE0ACC2203CA +:101F4000F735C210C67A50A86E51703FBAEA5E31BA +:101F5000197C2EB094EC009EF1DAFDB688D5EAAD7E +:101F6000C6EE8A3D049F8C4B74E25E6B74C2218185 +:101F7000F74F8575C599B08BFE31EE09453978BFAD +:101F8000BC55C1FAF04C79FE3B8AC39B205781C3F4 +:101F9000E373C0EF7916471BEA00CEA284A5C8F30D +:101FA000E7453B72500770768D9270BCA34D71224D +:101FB000944D585AC0EFCFAC5B3FB6E2DD9A22A2F7 +:101FC000E95C9661EE1C7CA7A6F85399378B3EF628 +:101FD000633717C9FC6BC46BC28F7BABBE59917C56 +:101FE0007F26321D3918A7B8F2BB45241F7FFC9EFF +:101FF000EB16AC4FD4F08CC72DA20AAE76DBD09E88 +:10200000D0EEF3BA0CEE52B445511E23F71BBCD9E7 +:1020100068DF34F87E8C7E92E722EC57F4D8E489AE +:102020001904275A7C6C273B5CAE5BB1FFAB335D78 +:10203000C5180FAD9F83B7C8F3099FDB302FF41D80 +:1020400096CECFA54552EECB8AA4FD98BE56DEC7EC +:1020500086F2BDACC8A0D9B7BF8F37E15B8AEFE984 +:10206000F88BAD8BB3810FE17B2FF0247C17625C82 +:1020700044C470BDE3FA72E6E1EF951549F9227B9D +:1020800056F5B1B467DCA61BBDC3103F8EFA857749 +:1020900018F01DD5D867C3BFC378D6D367837F7FB9 +:1020A000F6C13E1BFA9F75C977D2A1FB3716C9F757 +:1020B00013E9D3FB78FD58FA5637C7E97DC31047BB +:1020C000A5977FBC5EDEBB64B07F19ABF997B1BF4B +:1020D0004869EF21791BFB6434DF6F8B82581EAF98 +:1020E000B44A3DADFC45D9A1366AC76F277C83E26F +:1020F000AF095EC27B505C64EC97EF2D09069DF63C +:102100009A1886CC22BEAA11F2BDE528CD6E206EAB +:102110002B25BB50537EF432BF03C07AEC8F3B5B60 +:10212000C85FBB49C2E4AE918F2E9FBFA68BF3C39D +:10213000ED57FBB57CB3753DF2678ADF06F5579620 +:102140001DE982BFA9DA3BB8BF66C5679CC752FCD0 +:1021500036A8FFDE1F7FC0EF6CEADA07F7137F9F18 +:10216000029F75FE1E33F92620DF3B5613E694FFCF +:102170007EC0B712FADE541DC1EF6777FD3A8FE5D6 +:1021800046E737AD6FFA76F2B196E77BF24406F494 +:10219000E19BDA5ED8A7B441F6C9C375BED9916C8C +:1021A00077EAB4FCAAB6CCCE7E3EB1D6CAF6AB5026 +:1021B0000D7302AE354A3B238A55CD4EF958FF4F79 +:1021C000DE3E8CEB797C00C03193F8DD71DC5A097E +:1021D000F78DB0B07D28349454EFA1F6A86105DBEB +:1021E0008104BCB824BE3F03FBA0427F655DB5CE31 +:1021F000EC53E4FDBE2307F9AE7EDFD4B0D1DB7A29 +:1022000010F9B2E27D7219EA8A7746F0FD4100F5D5 +:10221000463A4FC33069471B16A4B31F088892D2B1 +:10222000958843E68771FDB16198E351DC27365408 +:102230004CE438FAD07F4BBFDB37D7EA441CD530AB +:10224000D9B106EF551A7EE1E0F15714B99FE75175 +:10225000499F86B9F2FC0D15319CF7E87C686874DB +:102260008DC4FDD4CC31EEFF00DF4769F7730DC993 +:10227000D44FED134AC9821F619F4912DF19331DE4 +:10228000AC77C7164C7C74B783DD891FF74475B3F0 +:102290002307E5C5FF033C759D8B10370000000048 +:1022A0000000000000000000050207000000000020 +:00000001FF diff --git a/trunk/fs/9p/v9fs.h b/trunk/fs/9p/v9fs.h index 6b801d1ddf4b..79000bf62491 100644 --- a/trunk/fs/9p/v9fs.h +++ b/trunk/fs/9p/v9fs.h @@ -24,7 +24,7 @@ /** * enum p9_session_flags - option flags for each 9P session * @V9FS_PROTO_2000U: whether or not to use 9P2000.u extensions - * @V9FS_PROTO_2000L: whether or not to use 9P2000.l extensions + * @V9FS_PROTO_2010L: whether or not to use 9P2010.l extensions * @V9FS_ACCESS_SINGLE: only the mounting user can access the hierarchy * @V9FS_ACCESS_USER: a new attach will be issued for every user (default) * @V9FS_ACCESS_ANY: use a single attach for all users @@ -34,7 +34,7 @@ */ enum p9_session_flags { V9FS_PROTO_2000U = 0x01, - V9FS_PROTO_2000L = 0x02, + V9FS_PROTO_2010L = 0x02, V9FS_ACCESS_SINGLE = 0x04, V9FS_ACCESS_USER = 0x08, V9FS_ACCESS_ANY = 0x0C, @@ -130,5 +130,5 @@ static inline int v9fs_proto_dotu(struct v9fs_session_info *v9ses) static inline int v9fs_proto_dotl(struct v9fs_session_info *v9ses) { - return v9ses->flags & V9FS_PROTO_2000L; + return v9ses->flags & V9FS_PROTO_2010L; } diff --git a/trunk/fs/9p/vfs_dir.c b/trunk/fs/9p/vfs_dir.c index d8a3afe4ff72..6580aa449541 100644 --- a/trunk/fs/9p/vfs_dir.c +++ b/trunk/fs/9p/vfs_dir.c @@ -76,15 +76,6 @@ static inline int dt_type(struct p9_wstat *mistat) return rettype; } -static void p9stat_init(struct p9_wstat *stbuf) -{ - stbuf->name = NULL; - stbuf->uid = NULL; - stbuf->gid = NULL; - stbuf->muid = NULL; - stbuf->extension = NULL; -} - /** * v9fs_dir_readdir - read a directory * @filp: opened file structure @@ -140,8 +131,8 @@ static int v9fs_dir_readdir(struct file *filp, void *dirent, filldir_t filldir) rdir->head = 0; rdir->tail = err; } + while (rdir->head < rdir->tail) { - p9stat_init(&st); err = p9stat_read(rdir->buf + rdir->head, buflen - rdir->head, &st, fid->clnt->proto_version); diff --git a/trunk/fs/9p/vfs_file.c b/trunk/fs/9p/vfs_file.c index df52d488d2a6..36122683fae8 100644 --- a/trunk/fs/9p/vfs_file.c +++ b/trunk/fs/9p/vfs_file.c @@ -114,7 +114,7 @@ static int v9fs_file_lock(struct file *filp, int cmd, struct file_lock *fl) P9_DPRINTK(P9_DEBUG_VFS, "filp: %p lock: %p\n", filp, fl); /* No mandatory locks */ - if (__mandatory_lock(inode) && fl->fl_type != F_UNLCK) + if (__mandatory_lock(inode)) return -ENOLCK; if ((IS_SETLK(cmd) || IS_SETLKW(cmd)) && fl->fl_type != F_UNLCK) { @@ -215,7 +215,7 @@ v9fs_file_write(struct file *filp, const char __user * data, struct p9_fid *fid; struct p9_client *clnt; struct inode *inode = filp->f_path.dentry->d_inode; - loff_t origin = *offset; + int origin = *offset; unsigned long pg_start, pg_end; P9_DPRINTK(P9_DEBUG_VFS, "data %p count %d offset %x\n", data, diff --git a/trunk/fs/btrfs/btrfs_inode.h b/trunk/fs/btrfs/btrfs_inode.h index 7a4dee199832..3f1f50d9d916 100644 --- a/trunk/fs/btrfs/btrfs_inode.h +++ b/trunk/fs/btrfs/btrfs_inode.h @@ -153,11 +153,6 @@ struct btrfs_inode { unsigned ordered_data_close:1; unsigned dummy_inode:1; - /* - * always compress this one file - */ - unsigned force_compress:1; - struct inode vfs_inode; }; diff --git a/trunk/fs/btrfs/compression.c b/trunk/fs/btrfs/compression.c index 28b92a7218ab..a11a32058b50 100644 --- a/trunk/fs/btrfs/compression.c +++ b/trunk/fs/btrfs/compression.c @@ -478,7 +478,7 @@ static noinline int add_ra_bio_pages(struct inode *inode, goto next; } - page = alloc_page(mapping_gfp_mask(mapping) & ~__GFP_FS); + page = alloc_page(mapping_gfp_mask(mapping) | GFP_NOFS); if (!page) break; diff --git a/trunk/fs/btrfs/ctree.h b/trunk/fs/btrfs/ctree.h index 0af2e3868573..8b5cfdd4bfc1 100644 --- a/trunk/fs/btrfs/ctree.h +++ b/trunk/fs/btrfs/ctree.h @@ -373,13 +373,11 @@ struct btrfs_super_block { * ones specified below then we will fail to mount */ #define BTRFS_FEATURE_INCOMPAT_MIXED_BACKREF (1ULL << 0) -#define BTRFS_FEATURE_INCOMPAT_DEFAULT_SUBVOL (2ULL << 0) #define BTRFS_FEATURE_COMPAT_SUPP 0ULL #define BTRFS_FEATURE_COMPAT_RO_SUPP 0ULL #define BTRFS_FEATURE_INCOMPAT_SUPP \ - (BTRFS_FEATURE_INCOMPAT_MIXED_BACKREF | \ - BTRFS_FEATURE_INCOMPAT_DEFAULT_SUBVOL) + BTRFS_FEATURE_INCOMPAT_MIXED_BACKREF /* * A leaf is full of items. offset and size tell us where to find @@ -1184,6 +1182,7 @@ struct btrfs_root { #define BTRFS_INODE_NOATIME (1 << 9) #define BTRFS_INODE_DIRSYNC (1 << 10) + /* some macros to generate set/get funcs for the struct fields. This * assumes there is a lefoo_to_cpu for every type, so lets make a simple * one for u8: @@ -1843,7 +1842,7 @@ BTRFS_SETGET_STACK_FUNCS(super_num_devices, struct btrfs_super_block, BTRFS_SETGET_STACK_FUNCS(super_compat_flags, struct btrfs_super_block, compat_flags, 64); BTRFS_SETGET_STACK_FUNCS(super_compat_ro_flags, struct btrfs_super_block, - compat_ro_flags, 64); + compat_flags, 64); BTRFS_SETGET_STACK_FUNCS(super_incompat_flags, struct btrfs_super_block, incompat_flags, 64); BTRFS_SETGET_STACK_FUNCS(super_csum_type, struct btrfs_super_block, @@ -2311,8 +2310,7 @@ int btrfs_truncate_inode_items(struct btrfs_trans_handle *trans, u32 min_type); int btrfs_start_delalloc_inodes(struct btrfs_root *root, int delay_iput); -int btrfs_set_extent_delalloc(struct inode *inode, u64 start, u64 end, - struct extent_state **cached_state); +int btrfs_set_extent_delalloc(struct inode *inode, u64 start, u64 end); int btrfs_writepages(struct address_space *mapping, struct writeback_control *wbc); int btrfs_create_subvol_root(struct btrfs_trans_handle *trans, @@ -2337,7 +2335,7 @@ int btrfs_init_cachep(void); void btrfs_destroy_cachep(void); long btrfs_ioctl_trans_end(struct file *file); struct inode *btrfs_iget(struct super_block *s, struct btrfs_key *location, - struct btrfs_root *root, int *was_new); + struct btrfs_root *root); int btrfs_commit_write(struct file *file, struct page *page, unsigned from, unsigned to); struct extent_map *btrfs_get_extent(struct inode *inode, struct page *page, @@ -2388,6 +2386,7 @@ void btrfs_sysfs_del_super(struct btrfs_fs_info *root); ssize_t btrfs_listxattr(struct dentry *dentry, char *buffer, size_t size); /* super.c */ +u64 btrfs_parse_size(char *str); int btrfs_parse_options(struct btrfs_root *root, char *options); int btrfs_sync_fs(struct super_block *sb, int wait); diff --git a/trunk/fs/btrfs/disk-io.c b/trunk/fs/btrfs/disk-io.c index 11d0ad30e203..0427183e3e05 100644 --- a/trunk/fs/btrfs/disk-io.c +++ b/trunk/fs/btrfs/disk-io.c @@ -263,15 +263,13 @@ static int csum_tree_block(struct btrfs_root *root, struct extent_buffer *buf, static int verify_parent_transid(struct extent_io_tree *io_tree, struct extent_buffer *eb, u64 parent_transid) { - struct extent_state *cached_state = NULL; int ret; if (!parent_transid || btrfs_header_generation(eb) == parent_transid) return 0; - lock_extent_bits(io_tree, eb->start, eb->start + eb->len - 1, - 0, &cached_state, GFP_NOFS); - if (extent_buffer_uptodate(io_tree, eb, cached_state) && + lock_extent(io_tree, eb->start, eb->start + eb->len - 1, GFP_NOFS); + if (extent_buffer_uptodate(io_tree, eb) && btrfs_header_generation(eb) == parent_transid) { ret = 0; goto out; @@ -284,10 +282,10 @@ static int verify_parent_transid(struct extent_io_tree *io_tree, (unsigned long long)btrfs_header_generation(eb)); } ret = 1; - clear_extent_buffer_uptodate(io_tree, eb, &cached_state); + clear_extent_buffer_uptodate(io_tree, eb); out: - unlock_extent_cached(io_tree, eb->start, eb->start + eb->len - 1, - &cached_state, GFP_NOFS); + unlock_extent(io_tree, eb->start, eb->start + eb->len - 1, + GFP_NOFS); return ret; } @@ -2499,8 +2497,7 @@ int btrfs_buffer_uptodate(struct extent_buffer *buf, u64 parent_transid) int ret; struct inode *btree_inode = buf->first_page->mapping->host; - ret = extent_buffer_uptodate(&BTRFS_I(btree_inode)->io_tree, buf, - NULL); + ret = extent_buffer_uptodate(&BTRFS_I(btree_inode)->io_tree, buf); if (!ret) return ret; diff --git a/trunk/fs/btrfs/export.c b/trunk/fs/btrfs/export.c index 951ef09b82f4..ba5c3fd5ab8c 100644 --- a/trunk/fs/btrfs/export.c +++ b/trunk/fs/btrfs/export.c @@ -95,7 +95,7 @@ static struct dentry *btrfs_get_dentry(struct super_block *sb, u64 objectid, btrfs_set_key_type(&key, BTRFS_INODE_ITEM_KEY); key.offset = 0; - inode = btrfs_iget(sb, &key, root, NULL); + inode = btrfs_iget(sb, &key, root); if (IS_ERR(inode)) { err = PTR_ERR(inode); goto fail; @@ -223,7 +223,7 @@ static struct dentry *btrfs_get_parent(struct dentry *child) key.type = BTRFS_INODE_ITEM_KEY; key.offset = 0; - dentry = d_obtain_alias(btrfs_iget(root->fs_info->sb, &key, root, NULL)); + dentry = d_obtain_alias(btrfs_iget(root->fs_info->sb, &key, root)); if (!IS_ERR(dentry)) dentry->d_op = &btrfs_dentry_operations; return dentry; diff --git a/trunk/fs/btrfs/extent-tree.c b/trunk/fs/btrfs/extent-tree.c index 1727b26fb194..559f72489b3b 100644 --- a/trunk/fs/btrfs/extent-tree.c +++ b/trunk/fs/btrfs/extent-tree.c @@ -6561,7 +6561,6 @@ static noinline int invalidate_extent_cache(struct btrfs_root *root, struct btrfs_key key; struct inode *inode = NULL; struct btrfs_file_extent_item *fi; - struct extent_state *cached_state = NULL; u64 num_bytes; u64 skip_objectid = 0; u32 nritems; @@ -6590,14 +6589,12 @@ static noinline int invalidate_extent_cache(struct btrfs_root *root, } num_bytes = btrfs_file_extent_num_bytes(leaf, fi); - lock_extent_bits(&BTRFS_I(inode)->io_tree, key.offset, - key.offset + num_bytes - 1, 0, &cached_state, - GFP_NOFS); + lock_extent(&BTRFS_I(inode)->io_tree, key.offset, + key.offset + num_bytes - 1, GFP_NOFS); btrfs_drop_extent_cache(inode, key.offset, key.offset + num_bytes - 1, 1); - unlock_extent_cached(&BTRFS_I(inode)->io_tree, key.offset, - key.offset + num_bytes - 1, &cached_state, - GFP_NOFS); + unlock_extent(&BTRFS_I(inode)->io_tree, key.offset, + key.offset + num_bytes - 1, GFP_NOFS); cond_resched(); } iput(inode); diff --git a/trunk/fs/btrfs/extent_io.c b/trunk/fs/btrfs/extent_io.c index c99121ac5d6b..7073cbb1b2d4 100644 --- a/trunk/fs/btrfs/extent_io.c +++ b/trunk/fs/btrfs/extent_io.c @@ -513,10 +513,7 @@ int clear_extent_bit(struct extent_io_tree *tree, u64 start, u64 end, u64 last_end; int err; int set = 0; - int clear = 0; - if (bits & (EXTENT_IOBITS | EXTENT_BOUNDARY)) - clear = 1; again: if (!prealloc && (mask & __GFP_WAIT)) { prealloc = alloc_extent_state(mask); @@ -527,20 +524,14 @@ int clear_extent_bit(struct extent_io_tree *tree, u64 start, u64 end, spin_lock(&tree->lock); if (cached_state) { cached = *cached_state; - - if (clear) { - *cached_state = NULL; - cached_state = NULL; - } - + *cached_state = NULL; + cached_state = NULL; if (cached && cached->tree && cached->start == start) { - if (clear) - atomic_dec(&cached->refs); + atomic_dec(&cached->refs); state = cached; goto hit_next; } - if (clear) - free_extent_state(cached); + free_extent_state(cached); } /* * this search will find the extents that end after @@ -955,11 +946,11 @@ int clear_extent_bits(struct extent_io_tree *tree, u64 start, u64 end, } int set_extent_delalloc(struct extent_io_tree *tree, u64 start, u64 end, - struct extent_state **cached_state, gfp_t mask) + gfp_t mask) { return set_extent_bit(tree, start, end, EXTENT_DELALLOC | EXTENT_DIRTY | EXTENT_UPTODATE, - 0, NULL, cached_state, mask); + 0, NULL, NULL, mask); } int clear_extent_dirty(struct extent_io_tree *tree, u64 start, u64 end, @@ -993,11 +984,10 @@ int set_extent_uptodate(struct extent_io_tree *tree, u64 start, u64 end, } static int clear_extent_uptodate(struct extent_io_tree *tree, u64 start, - u64 end, struct extent_state **cached_state, - gfp_t mask) + u64 end, gfp_t mask) { return clear_extent_bit(tree, start, end, EXTENT_UPTODATE, 0, 0, - cached_state, mask); + NULL, mask); } int wait_on_extent_writeback(struct extent_io_tree *tree, u64 start, u64 end) @@ -1181,8 +1171,7 @@ struct extent_state *find_first_extent_bit_state(struct extent_io_tree *tree, * 1 is returned if we find something, 0 if nothing was in the tree */ static noinline u64 find_delalloc_range(struct extent_io_tree *tree, - u64 *start, u64 *end, u64 max_bytes, - struct extent_state **cached_state) + u64 *start, u64 *end, u64 max_bytes) { struct rb_node *node; struct extent_state *state; @@ -1214,11 +1203,8 @@ static noinline u64 find_delalloc_range(struct extent_io_tree *tree, *end = state->end; goto out; } - if (!found) { + if (!found) *start = state->start; - *cached_state = state; - atomic_inc(&state->refs); - } found++; *end = state->end; cur_start = state->end + 1; @@ -1350,11 +1336,10 @@ static noinline u64 find_lock_delalloc_range(struct inode *inode, delalloc_start = *start; delalloc_end = 0; found = find_delalloc_range(tree, &delalloc_start, &delalloc_end, - max_bytes, &cached_state); + max_bytes); if (!found || delalloc_end <= *start) { *start = delalloc_start; *end = delalloc_end; - free_extent_state(cached_state); return found; } @@ -1737,7 +1722,7 @@ static void end_bio_extent_writepage(struct bio *bio, int err) } if (!uptodate) { - clear_extent_uptodate(tree, start, end, NULL, GFP_NOFS); + clear_extent_uptodate(tree, start, end, GFP_NOFS); ClearPageUptodate(page); SetPageError(page); } @@ -1765,8 +1750,7 @@ static void end_bio_extent_writepage(struct bio *bio, int err) static void end_bio_extent_readpage(struct bio *bio, int err) { int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags); - struct bio_vec *bvec_end = bio->bi_io_vec + bio->bi_vcnt - 1; - struct bio_vec *bvec = bio->bi_io_vec; + struct bio_vec *bvec = bio->bi_io_vec + bio->bi_vcnt - 1; struct extent_io_tree *tree; u64 start; u64 end; @@ -1789,7 +1773,7 @@ static void end_bio_extent_readpage(struct bio *bio, int err) else whole_page = 0; - if (++bvec <= bvec_end) + if (--bvec >= bio->bi_io_vec) prefetchw(&bvec->bv_page->flags); if (uptodate && tree->ops && tree->ops->readpage_end_io_hook) { @@ -1834,7 +1818,7 @@ static void end_bio_extent_readpage(struct bio *bio, int err) } check_page_locked(tree, page); } - } while (bvec <= bvec_end); + } while (bvec >= bio->bi_io_vec); bio_put(bio); } @@ -2720,7 +2704,6 @@ int extent_readpages(struct extent_io_tree *tree, int extent_invalidatepage(struct extent_io_tree *tree, struct page *page, unsigned long offset) { - struct extent_state *cached_state = NULL; u64 start = ((u64)page->index << PAGE_CACHE_SHIFT); u64 end = start + PAGE_CACHE_SIZE - 1; size_t blocksize = page->mapping->host->i_sb->s_blocksize; @@ -2729,12 +2712,12 @@ int extent_invalidatepage(struct extent_io_tree *tree, if (start > end) return 0; - lock_extent_bits(tree, start, end, 0, &cached_state, GFP_NOFS); + lock_extent(tree, start, end, GFP_NOFS); wait_on_page_writeback(page); clear_extent_bit(tree, start, end, EXTENT_LOCKED | EXTENT_DIRTY | EXTENT_DELALLOC | EXTENT_DO_ACCOUNTING, - 1, 1, &cached_state, GFP_NOFS); + 1, 1, NULL, GFP_NOFS); return 0; } @@ -2937,17 +2920,16 @@ sector_t extent_bmap(struct address_space *mapping, sector_t iblock, get_extent_t *get_extent) { struct inode *inode = mapping->host; - struct extent_state *cached_state = NULL; u64 start = iblock << inode->i_blkbits; sector_t sector = 0; size_t blksize = (1 << inode->i_blkbits); struct extent_map *em; - lock_extent_bits(&BTRFS_I(inode)->io_tree, start, start + blksize - 1, - 0, &cached_state, GFP_NOFS); + lock_extent(&BTRFS_I(inode)->io_tree, start, start + blksize - 1, + GFP_NOFS); em = get_extent(inode, NULL, 0, start, blksize, 0); - unlock_extent_cached(&BTRFS_I(inode)->io_tree, start, - start + blksize - 1, &cached_state, GFP_NOFS); + unlock_extent(&BTRFS_I(inode)->io_tree, start, start + blksize - 1, + GFP_NOFS); if (!em || IS_ERR(em)) return 0; @@ -2969,7 +2951,6 @@ int extent_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, u32 flags = 0; u64 disko = 0; struct extent_map *em = NULL; - struct extent_state *cached_state = NULL; int end = 0; u64 em_start = 0, em_len = 0; unsigned long emflags; @@ -2978,8 +2959,8 @@ int extent_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, if (len == 0) return -EINVAL; - lock_extent_bits(&BTRFS_I(inode)->io_tree, start, start + len, 0, - &cached_state, GFP_NOFS); + lock_extent(&BTRFS_I(inode)->io_tree, start, start + len, + GFP_NOFS); em = get_extent(inode, NULL, 0, off, max - off, 0); if (!em) goto out; @@ -3042,8 +3023,8 @@ int extent_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, out_free: free_extent_map(em); out: - unlock_extent_cached(&BTRFS_I(inode)->io_tree, start, start + len, - &cached_state, GFP_NOFS); + unlock_extent(&BTRFS_I(inode)->io_tree, start, start + len, + GFP_NOFS); return ret; } @@ -3283,8 +3264,7 @@ int set_extent_buffer_dirty(struct extent_io_tree *tree, } int clear_extent_buffer_uptodate(struct extent_io_tree *tree, - struct extent_buffer *eb, - struct extent_state **cached_state) + struct extent_buffer *eb) { unsigned long i; struct page *page; @@ -3294,7 +3274,7 @@ int clear_extent_buffer_uptodate(struct extent_io_tree *tree, clear_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags); clear_extent_uptodate(tree, eb->start, eb->start + eb->len - 1, - cached_state, GFP_NOFS); + GFP_NOFS); for (i = 0; i < num_pages; i++) { page = extent_buffer_page(eb, i); if (page) @@ -3354,8 +3334,7 @@ int extent_range_uptodate(struct extent_io_tree *tree, } int extent_buffer_uptodate(struct extent_io_tree *tree, - struct extent_buffer *eb, - struct extent_state *cached_state) + struct extent_buffer *eb) { int ret = 0; unsigned long num_pages; @@ -3367,7 +3346,7 @@ int extent_buffer_uptodate(struct extent_io_tree *tree, return 1; ret = test_range_bit(tree, eb->start, eb->start + eb->len - 1, - EXTENT_UPTODATE, 1, cached_state); + EXTENT_UPTODATE, 1, NULL); if (ret) return ret; diff --git a/trunk/fs/btrfs/extent_io.h b/trunk/fs/btrfs/extent_io.h index bbab4813646f..36de250a7b2b 100644 --- a/trunk/fs/btrfs/extent_io.h +++ b/trunk/fs/btrfs/extent_io.h @@ -163,8 +163,6 @@ int lock_extent(struct extent_io_tree *tree, u64 start, u64 end, gfp_t mask); int lock_extent_bits(struct extent_io_tree *tree, u64 start, u64 end, int bits, struct extent_state **cached, gfp_t mask); int unlock_extent(struct extent_io_tree *tree, u64 start, u64 end, gfp_t mask); -int unlock_extent_cached(struct extent_io_tree *tree, u64 start, u64 end, - struct extent_state **cached, gfp_t mask); int try_lock_extent(struct extent_io_tree *tree, u64 start, u64 end, gfp_t mask); int extent_read_full_page(struct extent_io_tree *tree, struct page *page, @@ -198,7 +196,7 @@ int clear_extent_ordered(struct extent_io_tree *tree, u64 start, u64 end, int clear_extent_ordered_metadata(struct extent_io_tree *tree, u64 start, u64 end, gfp_t mask); int set_extent_delalloc(struct extent_io_tree *tree, u64 start, u64 end, - struct extent_state **cached_state, gfp_t mask); + gfp_t mask); int set_extent_ordered(struct extent_io_tree *tree, u64 start, u64 end, gfp_t mask); int find_first_extent_bit(struct extent_io_tree *tree, u64 start, @@ -283,11 +281,9 @@ int test_extent_buffer_dirty(struct extent_io_tree *tree, int set_extent_buffer_uptodate(struct extent_io_tree *tree, struct extent_buffer *eb); int clear_extent_buffer_uptodate(struct extent_io_tree *tree, - struct extent_buffer *eb, - struct extent_state **cached_state); + struct extent_buffer *eb); int extent_buffer_uptodate(struct extent_io_tree *tree, - struct extent_buffer *eb, - struct extent_state *cached_state); + struct extent_buffer *eb); int map_extent_buffer(struct extent_buffer *eb, unsigned long offset, unsigned long min_len, char **token, char **map, unsigned long *map_start, diff --git a/trunk/fs/btrfs/file.c b/trunk/fs/btrfs/file.c index ee3323c7fc1c..6ed434ac037f 100644 --- a/trunk/fs/btrfs/file.c +++ b/trunk/fs/btrfs/file.c @@ -123,8 +123,7 @@ static noinline int dirty_and_release_pages(struct btrfs_trans_handle *trans, root->sectorsize - 1) & ~((u64)root->sectorsize - 1); end_of_last_block = start_pos + num_bytes - 1; - err = btrfs_set_extent_delalloc(inode, start_pos, end_of_last_block, - NULL); + err = btrfs_set_extent_delalloc(inode, start_pos, end_of_last_block); if (err) return err; @@ -754,7 +753,6 @@ static noinline int prepare_pages(struct btrfs_root *root, struct file *file, loff_t pos, unsigned long first_index, unsigned long last_index, size_t write_bytes) { - struct extent_state *cached_state = NULL; int i; unsigned long index = pos >> PAGE_CACHE_SHIFT; struct inode *inode = fdentry(file)->d_inode; @@ -783,18 +781,16 @@ static noinline int prepare_pages(struct btrfs_root *root, struct file *file, } if (start_pos < inode->i_size) { struct btrfs_ordered_extent *ordered; - lock_extent_bits(&BTRFS_I(inode)->io_tree, - start_pos, last_pos - 1, 0, &cached_state, - GFP_NOFS); + lock_extent(&BTRFS_I(inode)->io_tree, + start_pos, last_pos - 1, GFP_NOFS); ordered = btrfs_lookup_first_ordered_extent(inode, last_pos - 1); if (ordered && ordered->file_offset + ordered->len > start_pos && ordered->file_offset < last_pos) { btrfs_put_ordered_extent(ordered); - unlock_extent_cached(&BTRFS_I(inode)->io_tree, - start_pos, last_pos - 1, - &cached_state, GFP_NOFS); + unlock_extent(&BTRFS_I(inode)->io_tree, + start_pos, last_pos - 1, GFP_NOFS); for (i = 0; i < num_pages; i++) { unlock_page(pages[i]); page_cache_release(pages[i]); @@ -806,13 +802,12 @@ static noinline int prepare_pages(struct btrfs_root *root, struct file *file, if (ordered) btrfs_put_ordered_extent(ordered); - clear_extent_bit(&BTRFS_I(inode)->io_tree, start_pos, + clear_extent_bits(&BTRFS_I(inode)->io_tree, start_pos, last_pos - 1, EXTENT_DIRTY | EXTENT_DELALLOC | - EXTENT_DO_ACCOUNTING, 0, 0, &cached_state, + EXTENT_DO_ACCOUNTING, GFP_NOFS); - unlock_extent_cached(&BTRFS_I(inode)->io_tree, - start_pos, last_pos - 1, &cached_state, - GFP_NOFS); + unlock_extent(&BTRFS_I(inode)->io_tree, + start_pos, last_pos - 1, GFP_NOFS); } for (i = 0; i < num_pages; i++) { clear_page_dirty_for_io(pages[i]); diff --git a/trunk/fs/btrfs/inode.c b/trunk/fs/btrfs/inode.c index 02bb099845fd..c41db6d45ab6 100644 --- a/trunk/fs/btrfs/inode.c +++ b/trunk/fs/btrfs/inode.c @@ -379,8 +379,7 @@ static noinline int compress_file_range(struct inode *inode, * change at any time if we discover bad compression ratios. */ if (!(BTRFS_I(inode)->flags & BTRFS_INODE_NOCOMPRESS) && - (btrfs_test_opt(root, COMPRESS) || - (BTRFS_I(inode)->force_compress))) { + btrfs_test_opt(root, COMPRESS)) { WARN_ON(pages); pages = kzalloc(sizeof(struct page *) * nr_pages, GFP_NOFS); @@ -484,10 +483,8 @@ static noinline int compress_file_range(struct inode *inode, nr_pages_ret = 0; /* flag the file so we don't compress in the future */ - if (!btrfs_test_opt(root, FORCE_COMPRESS) && - !(BTRFS_I(inode)->force_compress)) { + if (!btrfs_test_opt(root, FORCE_COMPRESS)) BTRFS_I(inode)->flags |= BTRFS_INODE_NOCOMPRESS; - } } if (will_compress) { *num_added += 1; @@ -573,8 +570,8 @@ static noinline int submit_compressed_extents(struct inode *inode, unsigned long nr_written = 0; lock_extent(io_tree, async_extent->start, - async_extent->start + - async_extent->ram_size - 1, GFP_NOFS); + async_extent->start + + async_extent->ram_size - 1, GFP_NOFS); /* allocate blocks */ ret = cow_file_range(inode, async_cow->locked_page, @@ -1214,8 +1211,7 @@ static int run_delalloc_range(struct inode *inode, struct page *locked_page, else if (BTRFS_I(inode)->flags & BTRFS_INODE_PREALLOC) ret = run_delalloc_nocow(inode, locked_page, start, end, page_started, 0, nr_written); - else if (!btrfs_test_opt(root, COMPRESS) && - !(BTRFS_I(inode)->force_compress)) + else if (!btrfs_test_opt(root, COMPRESS)) ret = cow_file_range(inode, locked_page, start, end, page_started, nr_written, 1); else @@ -1512,13 +1508,12 @@ static noinline int add_pending_csums(struct btrfs_trans_handle *trans, return 0; } -int btrfs_set_extent_delalloc(struct inode *inode, u64 start, u64 end, - struct extent_state **cached_state) +int btrfs_set_extent_delalloc(struct inode *inode, u64 start, u64 end) { if ((end & (PAGE_CACHE_SIZE - 1)) == 0) WARN_ON(1); return set_extent_delalloc(&BTRFS_I(inode)->io_tree, start, end, - cached_state, GFP_NOFS); + GFP_NOFS); } /* see btrfs_writepage_start_hook for details on why this is required */ @@ -1531,7 +1526,6 @@ static void btrfs_writepage_fixup_worker(struct btrfs_work *work) { struct btrfs_writepage_fixup *fixup; struct btrfs_ordered_extent *ordered; - struct extent_state *cached_state = NULL; struct page *page; struct inode *inode; u64 page_start; @@ -1550,8 +1544,7 @@ static void btrfs_writepage_fixup_worker(struct btrfs_work *work) page_start = page_offset(page); page_end = page_offset(page) + PAGE_CACHE_SIZE - 1; - lock_extent_bits(&BTRFS_I(inode)->io_tree, page_start, page_end, 0, - &cached_state, GFP_NOFS); + lock_extent(&BTRFS_I(inode)->io_tree, page_start, page_end, GFP_NOFS); /* already ordered? We're done */ if (PagePrivate2(page)) @@ -1559,18 +1552,17 @@ static void btrfs_writepage_fixup_worker(struct btrfs_work *work) ordered = btrfs_lookup_ordered_extent(inode, page_start); if (ordered) { - unlock_extent_cached(&BTRFS_I(inode)->io_tree, page_start, - page_end, &cached_state, GFP_NOFS); + unlock_extent(&BTRFS_I(inode)->io_tree, page_start, + page_end, GFP_NOFS); unlock_page(page); btrfs_start_ordered_extent(inode, ordered, 1); goto again; } - btrfs_set_extent_delalloc(inode, page_start, page_end, &cached_state); + btrfs_set_extent_delalloc(inode, page_start, page_end); ClearPageChecked(page); out: - unlock_extent_cached(&BTRFS_I(inode)->io_tree, page_start, page_end, - &cached_state, GFP_NOFS); + unlock_extent(&BTRFS_I(inode)->io_tree, page_start, page_end, GFP_NOFS); out_page: unlock_page(page); page_cache_release(page); @@ -1699,14 +1691,14 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end) struct btrfs_trans_handle *trans; struct btrfs_ordered_extent *ordered_extent = NULL; struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree; - struct extent_state *cached_state = NULL; int compressed = 0; int ret; - ret = btrfs_dec_test_ordered_pending(inode, &ordered_extent, start, - end - start + 1); + ret = btrfs_dec_test_ordered_pending(inode, start, end - start + 1); if (!ret) return 0; + + ordered_extent = btrfs_lookup_ordered_extent(inode, start); BUG_ON(!ordered_extent); if (test_bit(BTRFS_ORDERED_NOCOW, &ordered_extent->flags)) { @@ -1721,9 +1713,9 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end) goto out; } - lock_extent_bits(io_tree, ordered_extent->file_offset, - ordered_extent->file_offset + ordered_extent->len - 1, - 0, &cached_state, GFP_NOFS); + lock_extent(io_tree, ordered_extent->file_offset, + ordered_extent->file_offset + ordered_extent->len - 1, + GFP_NOFS); trans = btrfs_join_transaction(root, 1); @@ -1750,10 +1742,9 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end) ordered_extent->len); BUG_ON(ret); } - unlock_extent_cached(io_tree, ordered_extent->file_offset, - ordered_extent->file_offset + - ordered_extent->len - 1, &cached_state, GFP_NOFS); - + unlock_extent(io_tree, ordered_extent->file_offset, + ordered_extent->file_offset + ordered_extent->len - 1, + GFP_NOFS); add_pending_csums(trans, inode, ordered_extent->file_offset, &ordered_extent->list); @@ -2162,7 +2153,7 @@ void btrfs_orphan_cleanup(struct btrfs_root *root) found_key.objectid = found_key.offset; found_key.type = BTRFS_INODE_ITEM_KEY; found_key.offset = 0; - inode = btrfs_iget(root->fs_info->sb, &found_key, root, NULL); + inode = btrfs_iget(root->fs_info->sb, &found_key, root); if (IS_ERR(inode)) break; @@ -3090,7 +3081,6 @@ static int btrfs_truncate_page(struct address_space *mapping, loff_t from) struct btrfs_root *root = BTRFS_I(inode)->root; struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree; struct btrfs_ordered_extent *ordered; - struct extent_state *cached_state = NULL; char *kaddr; u32 blocksize = root->sectorsize; pgoff_t index = from >> PAGE_CACHE_SHIFT; @@ -3137,14 +3127,12 @@ static int btrfs_truncate_page(struct address_space *mapping, loff_t from) } wait_on_page_writeback(page); - lock_extent_bits(io_tree, page_start, page_end, 0, &cached_state, - GFP_NOFS); + lock_extent(io_tree, page_start, page_end, GFP_NOFS); set_page_extent_mapped(page); ordered = btrfs_lookup_ordered_extent(inode, page_start); if (ordered) { - unlock_extent_cached(io_tree, page_start, page_end, - &cached_state, GFP_NOFS); + unlock_extent(io_tree, page_start, page_end, GFP_NOFS); unlock_page(page); page_cache_release(page); btrfs_start_ordered_extent(inode, ordered, 1); @@ -3152,15 +3140,13 @@ static int btrfs_truncate_page(struct address_space *mapping, loff_t from) goto again; } - clear_extent_bit(&BTRFS_I(inode)->io_tree, page_start, page_end, + clear_extent_bits(&BTRFS_I(inode)->io_tree, page_start, page_end, EXTENT_DIRTY | EXTENT_DELALLOC | EXTENT_DO_ACCOUNTING, - 0, 0, &cached_state, GFP_NOFS); + GFP_NOFS); - ret = btrfs_set_extent_delalloc(inode, page_start, page_end, - &cached_state); + ret = btrfs_set_extent_delalloc(inode, page_start, page_end); if (ret) { - unlock_extent_cached(io_tree, page_start, page_end, - &cached_state, GFP_NOFS); + unlock_extent(io_tree, page_start, page_end, GFP_NOFS); goto out_unlock; } @@ -3173,8 +3159,7 @@ static int btrfs_truncate_page(struct address_space *mapping, loff_t from) } ClearPageChecked(page); set_page_dirty(page); - unlock_extent_cached(io_tree, page_start, page_end, &cached_state, - GFP_NOFS); + unlock_extent(io_tree, page_start, page_end, GFP_NOFS); out_unlock: if (ret) @@ -3192,7 +3177,6 @@ int btrfs_cont_expand(struct inode *inode, loff_t size) struct btrfs_root *root = BTRFS_I(inode)->root; struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree; struct extent_map *em; - struct extent_state *cached_state = NULL; u64 mask = root->sectorsize - 1; u64 hole_start = (inode->i_size + mask) & ~mask; u64 block_end = (size + mask) & ~mask; @@ -3208,13 +3192,11 @@ int btrfs_cont_expand(struct inode *inode, loff_t size) struct btrfs_ordered_extent *ordered; btrfs_wait_ordered_range(inode, hole_start, block_end - hole_start); - lock_extent_bits(io_tree, hole_start, block_end - 1, 0, - &cached_state, GFP_NOFS); + lock_extent(io_tree, hole_start, block_end - 1, GFP_NOFS); ordered = btrfs_lookup_ordered_extent(inode, hole_start); if (!ordered) break; - unlock_extent_cached(io_tree, hole_start, block_end - 1, - &cached_state, GFP_NOFS); + unlock_extent(io_tree, hole_start, block_end - 1, GFP_NOFS); btrfs_put_ordered_extent(ordered); } @@ -3259,8 +3241,7 @@ int btrfs_cont_expand(struct inode *inode, loff_t size) break; } - unlock_extent_cached(io_tree, hole_start, block_end - 1, &cached_state, - GFP_NOFS); + unlock_extent(io_tree, hole_start, block_end - 1, GFP_NOFS); return err; } @@ -3658,7 +3639,6 @@ static noinline void init_btrfs_i(struct inode *inode) bi->index_cnt = (u64)-1; bi->last_unlink_trans = 0; bi->ordered_data_close = 0; - bi->force_compress = 0; extent_map_tree_init(&BTRFS_I(inode)->extent_tree, GFP_NOFS); extent_io_tree_init(&BTRFS_I(inode)->io_tree, inode->i_mapping, GFP_NOFS); @@ -3707,7 +3687,7 @@ static struct inode *btrfs_iget_locked(struct super_block *s, * Returns in *is_new if the inode was read from disk */ struct inode *btrfs_iget(struct super_block *s, struct btrfs_key *location, - struct btrfs_root *root, int *new) + struct btrfs_root *root) { struct inode *inode; @@ -3722,8 +3702,6 @@ struct inode *btrfs_iget(struct super_block *s, struct btrfs_key *location, inode_tree_add(inode); unlock_new_inode(inode); - if (new) - *new = 1; } return inode; @@ -3776,7 +3754,7 @@ struct inode *btrfs_lookup_dentry(struct inode *dir, struct dentry *dentry) return NULL; if (location.type == BTRFS_INODE_ITEM_KEY) { - inode = btrfs_iget(dir->i_sb, &location, root, NULL); + inode = btrfs_iget(dir->i_sb, &location, root); return inode; } @@ -3791,7 +3769,7 @@ struct inode *btrfs_lookup_dentry(struct inode *dir, struct dentry *dentry) else inode = new_simple_dir(dir->i_sb, &location, sub_root); } else { - inode = btrfs_iget(dir->i_sb, &location, sub_root, NULL); + inode = btrfs_iget(dir->i_sb, &location, sub_root); } srcu_read_unlock(&root->fs_info->subvol_srcu, index); @@ -4523,7 +4501,7 @@ static int btrfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) err = btrfs_find_free_objectid(trans, root, dir->i_ino, &objectid); if (err) { err = -ENOSPC; - goto out_fail; + goto out_unlock; } inode = btrfs_new_inode(trans, root, dir, dentry->d_name.name, @@ -5001,7 +4979,6 @@ static void btrfs_invalidatepage(struct page *page, unsigned long offset) { struct extent_io_tree *tree; struct btrfs_ordered_extent *ordered; - struct extent_state *cached_state = NULL; u64 page_start = page_offset(page); u64 page_end = page_start + PAGE_CACHE_SIZE - 1; @@ -5020,8 +4997,7 @@ static void btrfs_invalidatepage(struct page *page, unsigned long offset) btrfs_releasepage(page, GFP_NOFS); return; } - lock_extent_bits(tree, page_start, page_end, 0, &cached_state, - GFP_NOFS); + lock_extent(tree, page_start, page_end, GFP_NOFS); ordered = btrfs_lookup_ordered_extent(page->mapping->host, page_offset(page)); if (ordered) { @@ -5032,7 +5008,7 @@ static void btrfs_invalidatepage(struct page *page, unsigned long offset) clear_extent_bit(tree, page_start, page_end, EXTENT_DIRTY | EXTENT_DELALLOC | EXTENT_LOCKED | EXTENT_DO_ACCOUNTING, 1, 0, - &cached_state, GFP_NOFS); + NULL, GFP_NOFS); /* * whoever cleared the private bit is responsible * for the finish_ordered_io @@ -5042,13 +5018,11 @@ static void btrfs_invalidatepage(struct page *page, unsigned long offset) page_start, page_end); } btrfs_put_ordered_extent(ordered); - cached_state = NULL; - lock_extent_bits(tree, page_start, page_end, 0, &cached_state, - GFP_NOFS); + lock_extent(tree, page_start, page_end, GFP_NOFS); } clear_extent_bit(tree, page_start, page_end, EXTENT_LOCKED | EXTENT_DIRTY | EXTENT_DELALLOC | - EXTENT_DO_ACCOUNTING, 1, 1, &cached_state, GFP_NOFS); + EXTENT_DO_ACCOUNTING, 1, 1, NULL, GFP_NOFS); __btrfs_releasepage(page, GFP_NOFS); ClearPageChecked(page); @@ -5081,7 +5055,6 @@ int btrfs_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf) struct btrfs_root *root = BTRFS_I(inode)->root; struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree; struct btrfs_ordered_extent *ordered; - struct extent_state *cached_state = NULL; char *kaddr; unsigned long zero_start; loff_t size; @@ -5120,8 +5093,7 @@ int btrfs_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf) } wait_on_page_writeback(page); - lock_extent_bits(io_tree, page_start, page_end, 0, &cached_state, - GFP_NOFS); + lock_extent(io_tree, page_start, page_end, GFP_NOFS); set_page_extent_mapped(page); /* @@ -5130,8 +5102,7 @@ int btrfs_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf) */ ordered = btrfs_lookup_ordered_extent(inode, page_start); if (ordered) { - unlock_extent_cached(io_tree, page_start, page_end, - &cached_state, GFP_NOFS); + unlock_extent(io_tree, page_start, page_end, GFP_NOFS); unlock_page(page); btrfs_start_ordered_extent(inode, ordered, 1); btrfs_put_ordered_extent(ordered); @@ -5145,15 +5116,13 @@ int btrfs_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf) * is probably a better way to do this, but for now keep consistent with * prepare_pages in the normal write path. */ - clear_extent_bit(&BTRFS_I(inode)->io_tree, page_start, page_end, + clear_extent_bits(&BTRFS_I(inode)->io_tree, page_start, page_end, EXTENT_DIRTY | EXTENT_DELALLOC | EXTENT_DO_ACCOUNTING, - 0, 0, &cached_state, GFP_NOFS); + GFP_NOFS); - ret = btrfs_set_extent_delalloc(inode, page_start, page_end, - &cached_state); + ret = btrfs_set_extent_delalloc(inode, page_start, page_end); if (ret) { - unlock_extent_cached(io_tree, page_start, page_end, - &cached_state, GFP_NOFS); + unlock_extent(io_tree, page_start, page_end, GFP_NOFS); ret = VM_FAULT_SIGBUS; btrfs_free_reserved_data_space(root, inode, PAGE_CACHE_SIZE); goto out_unlock; @@ -5179,7 +5148,7 @@ int btrfs_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf) BTRFS_I(inode)->last_trans = root->fs_info->generation; BTRFS_I(inode)->last_sub_trans = BTRFS_I(inode)->root->log_transid; - unlock_extent_cached(io_tree, page_start, page_end, &cached_state, GFP_NOFS); + unlock_extent(io_tree, page_start, page_end, GFP_NOFS); out_unlock: btrfs_unreserve_metadata_for_delalloc(root, inode, 1); @@ -5858,7 +5827,6 @@ static int prealloc_file_range(struct inode *inode, u64 start, u64 end, static long btrfs_fallocate(struct inode *inode, int mode, loff_t offset, loff_t len) { - struct extent_state *cached_state = NULL; u64 cur_offset; u64 last_byte; u64 alloc_start; @@ -5897,17 +5865,16 @@ static long btrfs_fallocate(struct inode *inode, int mode, /* the extent lock is ordered inside the running * transaction */ - lock_extent_bits(&BTRFS_I(inode)->io_tree, alloc_start, - locked_end, 0, &cached_state, GFP_NOFS); + lock_extent(&BTRFS_I(inode)->io_tree, alloc_start, locked_end, + GFP_NOFS); ordered = btrfs_lookup_first_ordered_extent(inode, alloc_end - 1); if (ordered && ordered->file_offset + ordered->len > alloc_start && ordered->file_offset < alloc_end) { btrfs_put_ordered_extent(ordered); - unlock_extent_cached(&BTRFS_I(inode)->io_tree, - alloc_start, locked_end, - &cached_state, GFP_NOFS); + unlock_extent(&BTRFS_I(inode)->io_tree, + alloc_start, locked_end, GFP_NOFS); /* * we can't wait on the range with the transaction * running or with the extent lock held @@ -5949,8 +5916,8 @@ static long btrfs_fallocate(struct inode *inode, int mode, break; } } - unlock_extent_cached(&BTRFS_I(inode)->io_tree, alloc_start, locked_end, - &cached_state, GFP_NOFS); + unlock_extent(&BTRFS_I(inode)->io_tree, alloc_start, locked_end, + GFP_NOFS); btrfs_free_reserved_data_space(BTRFS_I(inode)->root, inode, alloc_end - alloc_start); diff --git a/trunk/fs/btrfs/ioctl.c b/trunk/fs/btrfs/ioctl.c index 2845c6ceecd2..645a17927a8f 100644 --- a/trunk/fs/btrfs/ioctl.c +++ b/trunk/fs/btrfs/ioctl.c @@ -48,7 +48,6 @@ #include "print-tree.h" #include "volumes.h" #include "locking.h" -#include "ctree.h" /* Mask out flags that are inappropriate for the given type of inode. */ static inline __u32 btrfs_mask_flags(umode_t mode, __u32 flags) @@ -475,79 +474,7 @@ static noinline int btrfs_mksubvol(struct path *parent, return error; } -static int should_defrag_range(struct inode *inode, u64 start, u64 len, - int thresh, u64 *last_len, u64 *skip, - u64 *defrag_end) -{ - struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree; - struct extent_map *em = NULL; - struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree; - int ret = 1; - - - if (thresh == 0) - thresh = 256 * 1024; - - /* - * make sure that once we start defragging and extent, we keep on - * defragging it - */ - if (start < *defrag_end) - return 1; - - *skip = 0; - - /* - * hopefully we have this extent in the tree already, try without - * the full extent lock - */ - read_lock(&em_tree->lock); - em = lookup_extent_mapping(em_tree, start, len); - read_unlock(&em_tree->lock); - - if (!em) { - /* get the big lock and read metadata off disk */ - lock_extent(io_tree, start, start + len - 1, GFP_NOFS); - em = btrfs_get_extent(inode, NULL, 0, start, len, 0); - unlock_extent(io_tree, start, start + len - 1, GFP_NOFS); - - if (!em) - return 0; - } - - /* this will cover holes, and inline extents */ - if (em->block_start >= EXTENT_MAP_LAST_BYTE) - ret = 0; - - /* - * we hit a real extent, if it is big don't bother defragging it again - */ - if ((*last_len == 0 || *last_len >= thresh) && em->len >= thresh) - ret = 0; - - /* - * last_len ends up being a counter of how many bytes we've defragged. - * every time we choose not to defrag an extent, we reset *last_len - * so that the next tiny extent will force a defrag. - * - * The end result of this is that tiny extents before a single big - * extent will force at least part of that big extent to be defragged. - */ - if (ret) { - *last_len += len; - *defrag_end = extent_map_end(em); - } else { - *last_len = 0; - *skip = extent_map_end(em); - *defrag_end = 0; - } - - free_extent_map(em); - return ret; -} - -static int btrfs_defrag_file(struct file *file, - struct btrfs_ioctl_defrag_range_args *range) +static int btrfs_defrag_file(struct file *file) { struct inode *inode = fdentry(file)->d_inode; struct btrfs_root *root = BTRFS_I(inode)->root; @@ -559,96 +486,37 @@ static int btrfs_defrag_file(struct file *file, unsigned long total_read = 0; u64 page_start; u64 page_end; - u64 last_len = 0; - u64 skip = 0; - u64 defrag_end = 0; unsigned long i; int ret; - if (inode->i_size == 0) - return 0; - - if (range->start + range->len > range->start) { - last_index = min_t(u64, inode->i_size - 1, - range->start + range->len - 1) >> PAGE_CACHE_SHIFT; - } else { - last_index = (inode->i_size - 1) >> PAGE_CACHE_SHIFT; - } - - i = range->start >> PAGE_CACHE_SHIFT; - while (i <= last_index) { - if (!should_defrag_range(inode, (u64)i << PAGE_CACHE_SHIFT, - PAGE_CACHE_SIZE, - range->extent_thresh, - &last_len, &skip, - &defrag_end)) { - unsigned long next; - /* - * the should_defrag function tells us how much to skip - * bump our counter by the suggested amount - */ - next = (skip + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; - i = max(i + 1, next); - continue; - } + ret = btrfs_check_data_free_space(root, inode, inode->i_size); + if (ret) + return -ENOSPC; + mutex_lock(&inode->i_mutex); + last_index = inode->i_size >> PAGE_CACHE_SHIFT; + for (i = 0; i <= last_index; i++) { if (total_read % ra_pages == 0) { btrfs_force_ra(inode->i_mapping, &file->f_ra, file, i, min(last_index, i + ra_pages - 1)); } total_read++; - mutex_lock(&inode->i_mutex); - if (range->flags & BTRFS_DEFRAG_RANGE_COMPRESS) - BTRFS_I(inode)->force_compress = 1; - - ret = btrfs_check_data_free_space(root, inode, PAGE_CACHE_SIZE); - if (ret) { - ret = -ENOSPC; - break; - } - - ret = btrfs_reserve_metadata_for_delalloc(root, inode, 1); - if (ret) { - btrfs_free_reserved_data_space(root, inode, - PAGE_CACHE_SIZE); - ret = -ENOSPC; - break; - } again: - if (inode->i_size == 0 || - i > ((inode->i_size - 1) >> PAGE_CACHE_SHIFT)) { - ret = 0; - goto err_reservations; - } - page = grab_cache_page(inode->i_mapping, i); if (!page) - goto err_reservations; - + goto out_unlock; if (!PageUptodate(page)) { btrfs_readpage(NULL, page); lock_page(page); if (!PageUptodate(page)) { unlock_page(page); page_cache_release(page); - goto err_reservations; + goto out_unlock; } } - if (page->mapping != inode->i_mapping) { - unlock_page(page); - page_cache_release(page); - goto again; - } - wait_on_page_writeback(page); - if (PageDirty(page)) { - btrfs_free_reserved_data_space(root, inode, - PAGE_CACHE_SIZE); - goto loop_unlock; - } - page_start = (u64)page->index << PAGE_CACHE_SHIFT; page_end = page_start + PAGE_CACHE_SIZE - 1; lock_extent(io_tree, page_start, page_end, GFP_NOFS); @@ -669,54 +537,18 @@ static int btrfs_defrag_file(struct file *file, * page if it is dirtied again later */ clear_page_dirty_for_io(page); - clear_extent_bits(&BTRFS_I(inode)->io_tree, page_start, - page_end, EXTENT_DIRTY | EXTENT_DELALLOC | - EXTENT_DO_ACCOUNTING, GFP_NOFS); - btrfs_set_extent_delalloc(inode, page_start, page_end, NULL); - ClearPageChecked(page); + btrfs_set_extent_delalloc(inode, page_start, page_end); set_page_dirty(page); unlock_extent(io_tree, page_start, page_end, GFP_NOFS); - -loop_unlock: unlock_page(page); page_cache_release(page); - mutex_unlock(&inode->i_mutex); - - btrfs_unreserve_metadata_for_delalloc(root, inode, 1); balance_dirty_pages_ratelimited_nr(inode->i_mapping, 1); - i++; - } - - if ((range->flags & BTRFS_DEFRAG_RANGE_START_IO)) - filemap_flush(inode->i_mapping); - - if ((range->flags & BTRFS_DEFRAG_RANGE_COMPRESS)) { - /* the filemap_flush will queue IO into the worker threads, but - * we have to make sure the IO is actually started and that - * ordered extents get created before we return - */ - atomic_inc(&root->fs_info->async_submit_draining); - while (atomic_read(&root->fs_info->nr_async_submits) || - atomic_read(&root->fs_info->async_delalloc_pages)) { - wait_event(root->fs_info->async_submit_wait, - (atomic_read(&root->fs_info->nr_async_submits) == 0 && - atomic_read(&root->fs_info->async_delalloc_pages) == 0)); - } - atomic_dec(&root->fs_info->async_submit_draining); - - mutex_lock(&inode->i_mutex); - BTRFS_I(inode)->force_compress = 0; - mutex_unlock(&inode->i_mutex); } - return 0; - -err_reservations: +out_unlock: mutex_unlock(&inode->i_mutex); - btrfs_free_reserved_data_space(root, inode, PAGE_CACHE_SIZE); - btrfs_unreserve_metadata_for_delalloc(root, inode, 1); - return ret; + return 0; } static noinline int btrfs_ioctl_resize(struct btrfs_root *root, @@ -776,7 +608,7 @@ static noinline int btrfs_ioctl_resize(struct btrfs_root *root, mod = 1; sizestr++; } - new_size = memparse(sizestr, NULL); + new_size = btrfs_parse_size(sizestr); if (new_size == 0) { ret = -EINVAL; goto out_unlock; @@ -911,327 +743,6 @@ static noinline int may_destroy_subvol(struct btrfs_root *root) return ret; } -static noinline int key_in_sk(struct btrfs_key *key, - struct btrfs_ioctl_search_key *sk) -{ - struct btrfs_key test; - int ret; - - test.objectid = sk->min_objectid; - test.type = sk->min_type; - test.offset = sk->min_offset; - - ret = btrfs_comp_cpu_keys(key, &test); - if (ret < 0) - return 0; - - test.objectid = sk->max_objectid; - test.type = sk->max_type; - test.offset = sk->max_offset; - - ret = btrfs_comp_cpu_keys(key, &test); - if (ret > 0) - return 0; - return 1; -} - -static noinline int copy_to_sk(struct btrfs_root *root, - struct btrfs_path *path, - struct btrfs_key *key, - struct btrfs_ioctl_search_key *sk, - char *buf, - unsigned long *sk_offset, - int *num_found) -{ - u64 found_transid; - struct extent_buffer *leaf; - struct btrfs_ioctl_search_header sh; - unsigned long item_off; - unsigned long item_len; - int nritems; - int i; - int slot; - int found = 0; - int ret = 0; - - leaf = path->nodes[0]; - slot = path->slots[0]; - nritems = btrfs_header_nritems(leaf); - - if (btrfs_header_generation(leaf) > sk->max_transid) { - i = nritems; - goto advance_key; - } - found_transid = btrfs_header_generation(leaf); - - for (i = slot; i < nritems; i++) { - item_off = btrfs_item_ptr_offset(leaf, i); - item_len = btrfs_item_size_nr(leaf, i); - - if (item_len > BTRFS_SEARCH_ARGS_BUFSIZE) - item_len = 0; - - if (sizeof(sh) + item_len + *sk_offset > - BTRFS_SEARCH_ARGS_BUFSIZE) { - ret = 1; - goto overflow; - } - - btrfs_item_key_to_cpu(leaf, key, i); - if (!key_in_sk(key, sk)) - continue; - - sh.objectid = key->objectid; - sh.offset = key->offset; - sh.type = key->type; - sh.len = item_len; - sh.transid = found_transid; - - /* copy search result header */ - memcpy(buf + *sk_offset, &sh, sizeof(sh)); - *sk_offset += sizeof(sh); - - if (item_len) { - char *p = buf + *sk_offset; - /* copy the item */ - read_extent_buffer(leaf, p, - item_off, item_len); - *sk_offset += item_len; - } - found++; - - if (*num_found >= sk->nr_items) - break; - } -advance_key: - ret = 0; - if (key->offset < (u64)-1 && key->offset < sk->max_offset) - key->offset++; - else if (key->type < (u8)-1 && key->type < sk->max_type) { - key->offset = 0; - key->type++; - } else if (key->objectid < (u64)-1 && key->objectid < sk->max_objectid) { - key->offset = 0; - key->type = 0; - key->objectid++; - } else - ret = 1; -overflow: - *num_found += found; - return ret; -} - -static noinline int search_ioctl(struct inode *inode, - struct btrfs_ioctl_search_args *args) -{ - struct btrfs_root *root; - struct btrfs_key key; - struct btrfs_key max_key; - struct btrfs_path *path; - struct btrfs_ioctl_search_key *sk = &args->key; - struct btrfs_fs_info *info = BTRFS_I(inode)->root->fs_info; - int ret; - int num_found = 0; - unsigned long sk_offset = 0; - - path = btrfs_alloc_path(); - if (!path) - return -ENOMEM; - - if (sk->tree_id == 0) { - /* search the root of the inode that was passed */ - root = BTRFS_I(inode)->root; - } else { - key.objectid = sk->tree_id; - key.type = BTRFS_ROOT_ITEM_KEY; - key.offset = (u64)-1; - root = btrfs_read_fs_root_no_name(info, &key); - if (IS_ERR(root)) { - printk(KERN_ERR "could not find root %llu\n", - sk->tree_id); - btrfs_free_path(path); - return -ENOENT; - } - } - - key.objectid = sk->min_objectid; - key.type = sk->min_type; - key.offset = sk->min_offset; - - max_key.objectid = sk->max_objectid; - max_key.type = sk->max_type; - max_key.offset = sk->max_offset; - - path->keep_locks = 1; - - while(1) { - ret = btrfs_search_forward(root, &key, &max_key, path, 0, - sk->min_transid); - if (ret != 0) { - if (ret > 0) - ret = 0; - goto err; - } - ret = copy_to_sk(root, path, &key, sk, args->buf, - &sk_offset, &num_found); - btrfs_release_path(root, path); - if (ret || num_found >= sk->nr_items) - break; - - } - ret = 0; -err: - sk->nr_items = num_found; - btrfs_free_path(path); - return ret; -} - -static noinline int btrfs_ioctl_tree_search(struct file *file, - void __user *argp) -{ - struct btrfs_ioctl_search_args *args; - struct inode *inode; - int ret; - - if (!capable(CAP_SYS_ADMIN)) - return -EPERM; - - args = kmalloc(sizeof(*args), GFP_KERNEL); - if (!args) - return -ENOMEM; - - if (copy_from_user(args, argp, sizeof(*args))) { - kfree(args); - return -EFAULT; - } - inode = fdentry(file)->d_inode; - ret = search_ioctl(inode, args); - if (ret == 0 && copy_to_user(argp, args, sizeof(*args))) - ret = -EFAULT; - kfree(args); - return ret; -} - -/* - * Search INODE_REFs to identify path name of 'dirid' directory - * in a 'tree_id' tree. and sets path name to 'name'. - */ -static noinline int btrfs_search_path_in_tree(struct btrfs_fs_info *info, - u64 tree_id, u64 dirid, char *name) -{ - struct btrfs_root *root; - struct btrfs_key key; - char *ptr; - int ret = -1; - int slot; - int len; - int total_len = 0; - struct btrfs_inode_ref *iref; - struct extent_buffer *l; - struct btrfs_path *path; - - if (dirid == BTRFS_FIRST_FREE_OBJECTID) { - name[0]='\0'; - return 0; - } - - path = btrfs_alloc_path(); - if (!path) - return -ENOMEM; - - ptr = &name[BTRFS_INO_LOOKUP_PATH_MAX]; - - key.objectid = tree_id; - key.type = BTRFS_ROOT_ITEM_KEY; - key.offset = (u64)-1; - root = btrfs_read_fs_root_no_name(info, &key); - if (IS_ERR(root)) { - printk(KERN_ERR "could not find root %llu\n", tree_id); - ret = -ENOENT; - goto out; - } - - key.objectid = dirid; - key.type = BTRFS_INODE_REF_KEY; - key.offset = (u64)-1; - - while(1) { - ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); - if (ret < 0) - goto out; - - l = path->nodes[0]; - slot = path->slots[0]; - if (ret > 0 && slot > 0) - slot--; - btrfs_item_key_to_cpu(l, &key, slot); - - if (ret > 0 && (key.objectid != dirid || - key.type != BTRFS_INODE_REF_KEY)) { - ret = -ENOENT; - goto out; - } - - iref = btrfs_item_ptr(l, slot, struct btrfs_inode_ref); - len = btrfs_inode_ref_name_len(l, iref); - ptr -= len + 1; - total_len += len + 1; - if (ptr < name) - goto out; - - *(ptr + len) = '/'; - read_extent_buffer(l, ptr,(unsigned long)(iref + 1), len); - - if (key.offset == BTRFS_FIRST_FREE_OBJECTID) - break; - - btrfs_release_path(root, path); - key.objectid = key.offset; - key.offset = (u64)-1; - dirid = key.objectid; - - } - if (ptr < name) - goto out; - memcpy(name, ptr, total_len); - name[total_len]='\0'; - ret = 0; -out: - btrfs_free_path(path); - return ret; -} - -static noinline int btrfs_ioctl_ino_lookup(struct file *file, - void __user *argp) -{ - struct btrfs_ioctl_ino_lookup_args *args; - struct inode *inode; - int ret; - - if (!capable(CAP_SYS_ADMIN)) - return -EPERM; - - args = kmalloc(sizeof(*args), GFP_KERNEL); - if (copy_from_user(args, argp, sizeof(*args))) { - kfree(args); - return -EFAULT; - } - inode = fdentry(file)->d_inode; - - if (args->treeid == 0) - args->treeid = BTRFS_I(inode)->root->root_key.objectid; - - ret = btrfs_search_path_in_tree(BTRFS_I(inode)->root->fs_info, - args->treeid, args->objectid, - args->name); - - if (ret == 0 && copy_to_user(argp, args, sizeof(*args))) - ret = -EFAULT; - - kfree(args); - return ret; -} - static noinline int btrfs_ioctl_snap_destroy(struct file *file, void __user *arg) { @@ -1338,11 +849,10 @@ static noinline int btrfs_ioctl_snap_destroy(struct file *file, return err; } -static int btrfs_ioctl_defrag(struct file *file, void __user *argp) +static int btrfs_ioctl_defrag(struct file *file) { struct inode *inode = fdentry(file)->d_inode; struct btrfs_root *root = BTRFS_I(inode)->root; - struct btrfs_ioctl_defrag_range_args *range; int ret; ret = mnt_want_write(file->f_path.mnt); @@ -1363,30 +873,7 @@ static int btrfs_ioctl_defrag(struct file *file, void __user *argp) ret = -EINVAL; goto out; } - - range = kzalloc(sizeof(*range), GFP_KERNEL); - if (!range) { - ret = -ENOMEM; - goto out; - } - - if (argp) { - if (copy_from_user(range, argp, - sizeof(*range))) { - ret = -EFAULT; - kfree(range); - } - /* compression requires us to start the IO */ - if ((range->flags & BTRFS_DEFRAG_RANGE_COMPRESS)) { - range->flags |= BTRFS_DEFRAG_RANGE_START_IO; - range->extent_thresh = (u32)-1; - } - } else { - /* the rest are all set to zero by kzalloc */ - range->len = (u64)-1; - } - btrfs_defrag_file(file, range); - kfree(range); + btrfs_defrag_file(file); break; } out: @@ -1787,157 +1274,6 @@ static long btrfs_ioctl_trans_start(struct file *file) return ret; } -static long btrfs_ioctl_default_subvol(struct file *file, void __user *argp) -{ - struct inode *inode = fdentry(file)->d_inode; - struct btrfs_root *root = BTRFS_I(inode)->root; - struct btrfs_root *new_root; - struct btrfs_dir_item *di; - struct btrfs_trans_handle *trans; - struct btrfs_path *path; - struct btrfs_key location; - struct btrfs_disk_key disk_key; - struct btrfs_super_block *disk_super; - u64 features; - u64 objectid = 0; - u64 dir_id; - - if (!capable(CAP_SYS_ADMIN)) - return -EPERM; - - if (copy_from_user(&objectid, argp, sizeof(objectid))) - return -EFAULT; - - if (!objectid) - objectid = root->root_key.objectid; - - location.objectid = objectid; - location.type = BTRFS_ROOT_ITEM_KEY; - location.offset = (u64)-1; - - new_root = btrfs_read_fs_root_no_name(root->fs_info, &location); - if (IS_ERR(new_root)) - return PTR_ERR(new_root); - - if (btrfs_root_refs(&new_root->root_item) == 0) - return -ENOENT; - - path = btrfs_alloc_path(); - if (!path) - return -ENOMEM; - path->leave_spinning = 1; - - trans = btrfs_start_transaction(root, 1); - if (!trans) { - btrfs_free_path(path); - return -ENOMEM; - } - - dir_id = btrfs_super_root_dir(&root->fs_info->super_copy); - di = btrfs_lookup_dir_item(trans, root->fs_info->tree_root, path, - dir_id, "default", 7, 1); - if (!di) { - btrfs_free_path(path); - btrfs_end_transaction(trans, root); - printk(KERN_ERR "Umm, you don't have the default dir item, " - "this isn't going to work\n"); - return -ENOENT; - } - - btrfs_cpu_key_to_disk(&disk_key, &new_root->root_key); - btrfs_set_dir_item_key(path->nodes[0], di, &disk_key); - btrfs_mark_buffer_dirty(path->nodes[0]); - btrfs_free_path(path); - - disk_super = &root->fs_info->super_copy; - features = btrfs_super_incompat_flags(disk_super); - if (!(features & BTRFS_FEATURE_INCOMPAT_DEFAULT_SUBVOL)) { - features |= BTRFS_FEATURE_INCOMPAT_DEFAULT_SUBVOL; - btrfs_set_super_incompat_flags(disk_super, features); - } - btrfs_end_transaction(trans, root); - - return 0; -} - -long btrfs_ioctl_space_info(struct btrfs_root *root, void __user *arg) -{ - struct btrfs_ioctl_space_args space_args; - struct btrfs_ioctl_space_info space; - struct btrfs_ioctl_space_info *dest; - struct btrfs_ioctl_space_info *dest_orig; - struct btrfs_ioctl_space_info *user_dest; - struct btrfs_space_info *info; - int alloc_size; - int ret = 0; - int slot_count = 0; - - if (copy_from_user(&space_args, - (struct btrfs_ioctl_space_args __user *)arg, - sizeof(space_args))) - return -EFAULT; - - /* first we count slots */ - rcu_read_lock(); - list_for_each_entry_rcu(info, &root->fs_info->space_info, list) - slot_count++; - rcu_read_unlock(); - - /* space_slots == 0 means they are asking for a count */ - if (space_args.space_slots == 0) { - space_args.total_spaces = slot_count; - goto out; - } - alloc_size = sizeof(*dest) * slot_count; - /* we generally have at most 6 or so space infos, one for each raid - * level. So, a whole page should be more than enough for everyone - */ - if (alloc_size > PAGE_CACHE_SIZE) - return -ENOMEM; - - space_args.total_spaces = 0; - dest = kmalloc(alloc_size, GFP_NOFS); - if (!dest) - return -ENOMEM; - dest_orig = dest; - - /* now we have a buffer to copy into */ - rcu_read_lock(); - list_for_each_entry_rcu(info, &root->fs_info->space_info, list) { - /* make sure we don't copy more than we allocated - * in our buffer - */ - if (slot_count == 0) - break; - slot_count--; - - /* make sure userland has enough room in their buffer */ - if (space_args.total_spaces >= space_args.space_slots) - break; - - space.flags = info->flags; - space.total_bytes = info->total_bytes; - space.used_bytes = info->bytes_used; - memcpy(dest, &space, sizeof(space)); - dest++; - space_args.total_spaces++; - } - rcu_read_unlock(); - - user_dest = (struct btrfs_ioctl_space_info *) - (arg + sizeof(struct btrfs_ioctl_space_args)); - - if (copy_to_user(user_dest, dest_orig, alloc_size)) - ret = -EFAULT; - - kfree(dest_orig); -out: - if (ret == 0 && copy_to_user(arg, &space_args, sizeof(space_args))) - ret = -EFAULT; - - return ret; -} - /* * there are many ways the trans_start and trans_end ioctls can lead * to deadlocks. They should only be used by applications that @@ -1984,12 +1320,8 @@ long btrfs_ioctl(struct file *file, unsigned int return btrfs_ioctl_snap_create(file, argp, 1); case BTRFS_IOC_SNAP_DESTROY: return btrfs_ioctl_snap_destroy(file, argp); - case BTRFS_IOC_DEFAULT_SUBVOL: - return btrfs_ioctl_default_subvol(file, argp); case BTRFS_IOC_DEFRAG: - return btrfs_ioctl_defrag(file, NULL); - case BTRFS_IOC_DEFRAG_RANGE: - return btrfs_ioctl_defrag(file, argp); + return btrfs_ioctl_defrag(file); case BTRFS_IOC_RESIZE: return btrfs_ioctl_resize(root, argp); case BTRFS_IOC_ADD_DEV: @@ -2006,12 +1338,6 @@ long btrfs_ioctl(struct file *file, unsigned int return btrfs_ioctl_trans_start(file); case BTRFS_IOC_TRANS_END: return btrfs_ioctl_trans_end(file); - case BTRFS_IOC_TREE_SEARCH: - return btrfs_ioctl_tree_search(file, argp); - case BTRFS_IOC_INO_LOOKUP: - return btrfs_ioctl_ino_lookup(file, argp); - case BTRFS_IOC_SPACE_INFO: - return btrfs_ioctl_space_info(root, argp); case BTRFS_IOC_SYNC: btrfs_sync_fs(file->f_dentry->d_sb, 1); return 0; diff --git a/trunk/fs/btrfs/ioctl.h b/trunk/fs/btrfs/ioctl.h index 424694aa517f..bc49914475eb 100644 --- a/trunk/fs/btrfs/ioctl.h +++ b/trunk/fs/btrfs/ioctl.h @@ -30,114 +30,12 @@ struct btrfs_ioctl_vol_args { char name[BTRFS_PATH_NAME_MAX + 1]; }; -#define BTRFS_INO_LOOKUP_PATH_MAX 4080 -struct btrfs_ioctl_ino_lookup_args { - __u64 treeid; - __u64 objectid; - char name[BTRFS_INO_LOOKUP_PATH_MAX]; -}; - -struct btrfs_ioctl_search_key { - /* which root are we searching. 0 is the tree of tree roots */ - __u64 tree_id; - - /* keys returned will be >= min and <= max */ - __u64 min_objectid; - __u64 max_objectid; - - /* keys returned will be >= min and <= max */ - __u64 min_offset; - __u64 max_offset; - - /* max and min transids to search for */ - __u64 min_transid; - __u64 max_transid; - - /* keys returned will be >= min and <= max */ - __u32 min_type; - __u32 max_type; - - /* - * how many items did userland ask for, and how many are we - * returning - */ - __u32 nr_items; - - /* align to 64 bits */ - __u32 unused; - - /* some extra for later */ - __u64 unused1; - __u64 unused2; - __u64 unused3; - __u64 unused4; -}; - -struct btrfs_ioctl_search_header { - __u64 transid; - __u64 objectid; - __u64 offset; - __u32 type; - __u32 len; -}; - -#define BTRFS_SEARCH_ARGS_BUFSIZE (4096 - sizeof(struct btrfs_ioctl_search_key)) -/* - * the buf is an array of search headers where - * each header is followed by the actual item - * the type field is expanded to 32 bits for alignment - */ -struct btrfs_ioctl_search_args { - struct btrfs_ioctl_search_key key; - char buf[BTRFS_SEARCH_ARGS_BUFSIZE]; -}; - struct btrfs_ioctl_clone_range_args { __s64 src_fd; __u64 src_offset, src_length; __u64 dest_offset; }; -/* flags for the defrag range ioctl */ -#define BTRFS_DEFRAG_RANGE_COMPRESS 1 -#define BTRFS_DEFRAG_RANGE_START_IO 2 - -struct btrfs_ioctl_defrag_range_args { - /* start of the defrag operation */ - __u64 start; - - /* number of bytes to defrag, use (u64)-1 to say all */ - __u64 len; - - /* - * flags for the operation, which can include turning - * on compression for this one defrag - */ - __u64 flags; - - /* - * any extent bigger than this will be considered - * already defragged. Use 0 to take the kernel default - * Use 1 to say every single extent must be rewritten - */ - __u32 extent_thresh; - - /* spare for later */ - __u32 unused[5]; -}; - -struct btrfs_ioctl_space_info { - __u64 flags; - __u64 total_bytes; - __u64 used_bytes; -}; - -struct btrfs_ioctl_space_args { - __u64 space_slots; - __u64 total_spaces; - struct btrfs_ioctl_space_info spaces[0]; -}; - #define BTRFS_IOC_SNAP_CREATE _IOW(BTRFS_IOCTL_MAGIC, 1, \ struct btrfs_ioctl_vol_args) #define BTRFS_IOC_DEFRAG _IOW(BTRFS_IOCTL_MAGIC, 2, \ @@ -169,13 +67,4 @@ struct btrfs_ioctl_space_args { struct btrfs_ioctl_vol_args) #define BTRFS_IOC_SNAP_DESTROY _IOW(BTRFS_IOCTL_MAGIC, 15, \ struct btrfs_ioctl_vol_args) -#define BTRFS_IOC_DEFRAG_RANGE _IOW(BTRFS_IOCTL_MAGIC, 16, \ - struct btrfs_ioctl_defrag_range_args) -#define BTRFS_IOC_TREE_SEARCH _IOWR(BTRFS_IOCTL_MAGIC, 17, \ - struct btrfs_ioctl_search_args) -#define BTRFS_IOC_INO_LOOKUP _IOWR(BTRFS_IOCTL_MAGIC, 18, \ - struct btrfs_ioctl_ino_lookup_args) -#define BTRFS_IOC_DEFAULT_SUBVOL _IOW(BTRFS_IOCTL_MAGIC, 19, u64) -#define BTRFS_IOC_SPACE_INFO _IOWR(BTRFS_IOCTL_MAGIC, 20, \ - struct btrfs_ioctl_space_args) #endif diff --git a/trunk/fs/btrfs/ordered-data.c b/trunk/fs/btrfs/ordered-data.c index a8ffecd0b491..5c2a9e78a949 100644 --- a/trunk/fs/btrfs/ordered-data.c +++ b/trunk/fs/btrfs/ordered-data.c @@ -174,6 +174,7 @@ int btrfs_add_ordered_extent(struct inode *inode, u64 file_offset, if (!entry) return -ENOMEM; + mutex_lock(&tree->mutex); entry->file_offset = file_offset; entry->start = start; entry->len = len; @@ -189,17 +190,16 @@ int btrfs_add_ordered_extent(struct inode *inode, u64 file_offset, INIT_LIST_HEAD(&entry->list); INIT_LIST_HEAD(&entry->root_extent_list); - spin_lock(&tree->lock); node = tree_insert(&tree->tree, file_offset, &entry->rb_node); BUG_ON(node); - spin_unlock(&tree->lock); spin_lock(&BTRFS_I(inode)->root->fs_info->ordered_extent_lock); list_add_tail(&entry->root_extent_list, &BTRFS_I(inode)->root->fs_info->ordered_extents); spin_unlock(&BTRFS_I(inode)->root->fs_info->ordered_extent_lock); + mutex_unlock(&tree->mutex); BUG_ON(node); return 0; } @@ -216,9 +216,9 @@ int btrfs_add_ordered_sum(struct inode *inode, struct btrfs_ordered_inode_tree *tree; tree = &BTRFS_I(inode)->ordered_tree; - spin_lock(&tree->lock); + mutex_lock(&tree->mutex); list_add_tail(&sum->list, &entry->list); - spin_unlock(&tree->lock); + mutex_unlock(&tree->mutex); return 0; } @@ -232,16 +232,15 @@ int btrfs_add_ordered_sum(struct inode *inode, * to make sure this function only returns 1 once for a given ordered extent. */ int btrfs_dec_test_ordered_pending(struct inode *inode, - struct btrfs_ordered_extent **cached, u64 file_offset, u64 io_size) { struct btrfs_ordered_inode_tree *tree; struct rb_node *node; - struct btrfs_ordered_extent *entry = NULL; + struct btrfs_ordered_extent *entry; int ret; tree = &BTRFS_I(inode)->ordered_tree; - spin_lock(&tree->lock); + mutex_lock(&tree->mutex); node = tree_search(tree, file_offset); if (!node) { ret = 1; @@ -265,11 +264,7 @@ int btrfs_dec_test_ordered_pending(struct inode *inode, else ret = 1; out: - if (!ret && cached && entry) { - *cached = entry; - atomic_inc(&entry->refs); - } - spin_unlock(&tree->lock); + mutex_unlock(&tree->mutex); return ret == 0; } @@ -296,7 +291,7 @@ int btrfs_put_ordered_extent(struct btrfs_ordered_extent *entry) /* * remove an ordered extent from the tree. No references are dropped - * and you must wake_up entry->wait. You must hold the tree lock + * and you must wake_up entry->wait. You must hold the tree mutex * while you call this function. */ static int __btrfs_remove_ordered_extent(struct inode *inode, @@ -345,9 +340,9 @@ int btrfs_remove_ordered_extent(struct inode *inode, int ret; tree = &BTRFS_I(inode)->ordered_tree; - spin_lock(&tree->lock); + mutex_lock(&tree->mutex); ret = __btrfs_remove_ordered_extent(inode, entry); - spin_unlock(&tree->lock); + mutex_unlock(&tree->mutex); wake_up(&entry->wait); return ret; @@ -572,7 +567,7 @@ struct btrfs_ordered_extent *btrfs_lookup_ordered_extent(struct inode *inode, struct btrfs_ordered_extent *entry = NULL; tree = &BTRFS_I(inode)->ordered_tree; - spin_lock(&tree->lock); + mutex_lock(&tree->mutex); node = tree_search(tree, file_offset); if (!node) goto out; @@ -583,7 +578,7 @@ struct btrfs_ordered_extent *btrfs_lookup_ordered_extent(struct inode *inode, if (entry) atomic_inc(&entry->refs); out: - spin_unlock(&tree->lock); + mutex_unlock(&tree->mutex); return entry; } @@ -599,7 +594,7 @@ btrfs_lookup_first_ordered_extent(struct inode *inode, u64 file_offset) struct btrfs_ordered_extent *entry = NULL; tree = &BTRFS_I(inode)->ordered_tree; - spin_lock(&tree->lock); + mutex_lock(&tree->mutex); node = tree_search(tree, file_offset); if (!node) goto out; @@ -607,7 +602,7 @@ btrfs_lookup_first_ordered_extent(struct inode *inode, u64 file_offset) entry = rb_entry(node, struct btrfs_ordered_extent, rb_node); atomic_inc(&entry->refs); out: - spin_unlock(&tree->lock); + mutex_unlock(&tree->mutex); return entry; } @@ -634,7 +629,7 @@ int btrfs_ordered_update_i_size(struct inode *inode, u64 offset, else offset = ALIGN(offset, BTRFS_I(inode)->root->sectorsize); - spin_lock(&tree->lock); + mutex_lock(&tree->mutex); disk_i_size = BTRFS_I(inode)->disk_i_size; /* truncate file */ @@ -740,7 +735,7 @@ int btrfs_ordered_update_i_size(struct inode *inode, u64 offset, */ if (ordered) __btrfs_remove_ordered_extent(inode, ordered); - spin_unlock(&tree->lock); + mutex_unlock(&tree->mutex); if (ordered) wake_up(&ordered->wait); return ret; @@ -767,7 +762,7 @@ int btrfs_find_ordered_sum(struct inode *inode, u64 offset, u64 disk_bytenr, if (!ordered) return 1; - spin_lock(&tree->lock); + mutex_lock(&tree->mutex); list_for_each_entry_reverse(ordered_sum, &ordered->list, list) { if (disk_bytenr >= ordered_sum->bytenr) { num_sectors = ordered_sum->len / sectorsize; @@ -782,7 +777,7 @@ int btrfs_find_ordered_sum(struct inode *inode, u64 offset, u64 disk_bytenr, } } out: - spin_unlock(&tree->lock); + mutex_unlock(&tree->mutex); btrfs_put_ordered_extent(ordered); return ret; } diff --git a/trunk/fs/btrfs/ordered-data.h b/trunk/fs/btrfs/ordered-data.h index c82f76a9f040..9116c6d0c5a9 100644 --- a/trunk/fs/btrfs/ordered-data.h +++ b/trunk/fs/btrfs/ordered-data.h @@ -21,7 +21,7 @@ /* one of these per inode */ struct btrfs_ordered_inode_tree { - spinlock_t lock; + struct mutex mutex; struct rb_root tree; struct rb_node *last; }; @@ -128,7 +128,7 @@ static inline int btrfs_ordered_sum_size(struct btrfs_root *root, static inline void btrfs_ordered_inode_tree_init(struct btrfs_ordered_inode_tree *t) { - spin_lock_init(&t->lock); + mutex_init(&t->mutex); t->tree = RB_ROOT; t->last = NULL; } @@ -137,8 +137,7 @@ int btrfs_put_ordered_extent(struct btrfs_ordered_extent *entry); int btrfs_remove_ordered_extent(struct inode *inode, struct btrfs_ordered_extent *entry); int btrfs_dec_test_ordered_pending(struct inode *inode, - struct btrfs_ordered_extent **cached, - u64 file_offset, u64 io_size); + u64 file_offset, u64 io_size); int btrfs_add_ordered_extent(struct inode *inode, u64 file_offset, u64 start, u64 len, u64 disk_len, int tyep); int btrfs_add_ordered_sum(struct inode *inode, diff --git a/trunk/fs/btrfs/relocation.c b/trunk/fs/btrfs/relocation.c index 0b23942cbc0d..0109e5606bad 100644 --- a/trunk/fs/btrfs/relocation.c +++ b/trunk/fs/btrfs/relocation.c @@ -2659,7 +2659,7 @@ static int relocate_file_extent_cluster(struct inode *inode, EXTENT_BOUNDARY, GFP_NOFS); nr++; } - btrfs_set_extent_delalloc(inode, page_start, page_end, NULL); + btrfs_set_extent_delalloc(inode, page_start, page_end); set_page_dirty(page); dirty_page++; @@ -3487,7 +3487,7 @@ static struct inode *create_reloc_inode(struct btrfs_fs_info *fs_info, key.objectid = objectid; key.type = BTRFS_INODE_ITEM_KEY; key.offset = 0; - inode = btrfs_iget(root->fs_info->sb, &key, root, NULL); + inode = btrfs_iget(root->fs_info->sb, &key, root); BUG_ON(IS_ERR(inode) || is_bad_inode(inode)); BTRFS_I(inode)->index_cnt = group->key.objectid; diff --git a/trunk/fs/btrfs/super.c b/trunk/fs/btrfs/super.c index 9ac612e6ca60..f8b4521de907 100644 --- a/trunk/fs/btrfs/super.c +++ b/trunk/fs/btrfs/super.c @@ -63,10 +63,10 @@ static void btrfs_put_super(struct super_block *sb) } enum { - Opt_degraded, Opt_subvol, Opt_subvolid, Opt_device, Opt_nodatasum, - Opt_nodatacow, Opt_max_extent, Opt_max_inline, Opt_alloc_start, - Opt_nobarrier, Opt_ssd, Opt_nossd, Opt_ssd_spread, Opt_thread_pool, - Opt_noacl, Opt_compress, Opt_compress_force, Opt_notreelog, Opt_ratio, + Opt_degraded, Opt_subvol, Opt_device, Opt_nodatasum, Opt_nodatacow, + Opt_max_extent, Opt_max_inline, Opt_alloc_start, Opt_nobarrier, + Opt_ssd, Opt_nossd, Opt_ssd_spread, Opt_thread_pool, Opt_noacl, + Opt_compress, Opt_compress_force, Opt_notreelog, Opt_ratio, Opt_flushoncommit, Opt_discard, Opt_err, }; @@ -74,7 +74,6 @@ enum { static match_table_t tokens = { {Opt_degraded, "degraded"}, {Opt_subvol, "subvol=%s"}, - {Opt_subvolid, "subvolid=%d"}, {Opt_device, "device=%s"}, {Opt_nodatasum, "nodatasum"}, {Opt_nodatacow, "nodatacow"}, @@ -96,6 +95,31 @@ static match_table_t tokens = { {Opt_err, NULL}, }; +u64 btrfs_parse_size(char *str) +{ + u64 res; + int mult = 1; + char *end; + char last; + + res = simple_strtoul(str, &end, 10); + + last = end[0]; + if (isalpha(last)) { + last = tolower(last); + switch (last) { + case 'g': + mult *= 1024; + case 'm': + mult *= 1024; + case 'k': + mult *= 1024; + } + res = res * mult; + } + return res; +} + /* * Regular mount options parser. Everything that is needed only when * reading in a new superblock is parsed here. @@ -133,7 +157,6 @@ int btrfs_parse_options(struct btrfs_root *root, char *options) btrfs_set_opt(info->mount_opt, DEGRADED); break; case Opt_subvol: - case Opt_subvolid: case Opt_device: /* * These are parsed by btrfs_parse_early_options @@ -191,7 +214,7 @@ int btrfs_parse_options(struct btrfs_root *root, char *options) case Opt_max_extent: num = match_strdup(&args[0]); if (num) { - info->max_extent = memparse(num, NULL); + info->max_extent = btrfs_parse_size(num); kfree(num); info->max_extent = max_t(u64, @@ -203,7 +226,7 @@ int btrfs_parse_options(struct btrfs_root *root, char *options) case Opt_max_inline: num = match_strdup(&args[0]); if (num) { - info->max_inline = memparse(num, NULL); + info->max_inline = btrfs_parse_size(num); kfree(num); if (info->max_inline) { @@ -218,7 +241,7 @@ int btrfs_parse_options(struct btrfs_root *root, char *options) case Opt_alloc_start: num = match_strdup(&args[0]); if (num) { - info->alloc_start = memparse(num, NULL); + info->alloc_start = btrfs_parse_size(num); kfree(num); printk(KERN_INFO "btrfs: allocations start at %llu\n", @@ -269,13 +292,12 @@ int btrfs_parse_options(struct btrfs_root *root, char *options) * only when we need to allocate a new super block. */ static int btrfs_parse_early_options(const char *options, fmode_t flags, - void *holder, char **subvol_name, u64 *subvol_objectid, + void *holder, char **subvol_name, struct btrfs_fs_devices **fs_devices) { substring_t args[MAX_OPT_ARGS]; char *opts, *p; int error = 0; - int intarg; if (!options) goto out; @@ -298,18 +320,6 @@ static int btrfs_parse_early_options(const char *options, fmode_t flags, case Opt_subvol: *subvol_name = match_strdup(&args[0]); break; - case Opt_subvolid: - intarg = 0; - error = match_int(&args[0], &intarg); - if (!error) { - /* we want the original fs_tree */ - if (!intarg) - *subvol_objectid = - BTRFS_FS_TREE_OBJECTID; - else - *subvol_objectid = intarg; - } - break; case Opt_device: error = btrfs_scan_one_device(match_strdup(&args[0]), flags, holder, fs_devices); @@ -337,110 +347,6 @@ static int btrfs_parse_early_options(const char *options, fmode_t flags, return error; } -static struct dentry *get_default_root(struct super_block *sb, - u64 subvol_objectid) -{ - struct btrfs_root *root = sb->s_fs_info; - struct btrfs_root *new_root; - struct btrfs_dir_item *di; - struct btrfs_path *path; - struct btrfs_key location; - struct inode *inode; - struct dentry *dentry; - u64 dir_id; - int new = 0; - - /* - * We have a specific subvol we want to mount, just setup location and - * go look up the root. - */ - if (subvol_objectid) { - location.objectid = subvol_objectid; - location.type = BTRFS_ROOT_ITEM_KEY; - location.offset = (u64)-1; - goto find_root; - } - - path = btrfs_alloc_path(); - if (!path) - return ERR_PTR(-ENOMEM); - path->leave_spinning = 1; - - /* - * Find the "default" dir item which points to the root item that we - * will mount by default if we haven't been given a specific subvolume - * to mount. - */ - dir_id = btrfs_super_root_dir(&root->fs_info->super_copy); - di = btrfs_lookup_dir_item(NULL, root, path, dir_id, "default", 7, 0); - if (!di) { - /* - * Ok the default dir item isn't there. This is weird since - * it's always been there, but don't freak out, just try and - * mount to root most subvolume. - */ - btrfs_free_path(path); - dir_id = BTRFS_FIRST_FREE_OBJECTID; - new_root = root->fs_info->fs_root; - goto setup_root; - } - - btrfs_dir_item_key_to_cpu(path->nodes[0], di, &location); - btrfs_free_path(path); - -find_root: - new_root = btrfs_read_fs_root_no_name(root->fs_info, &location); - if (IS_ERR(new_root)) - return ERR_PTR(PTR_ERR(new_root)); - - if (btrfs_root_refs(&new_root->root_item) == 0) - return ERR_PTR(-ENOENT); - - dir_id = btrfs_root_dirid(&new_root->root_item); -setup_root: - location.objectid = dir_id; - location.type = BTRFS_INODE_ITEM_KEY; - location.offset = 0; - - inode = btrfs_iget(sb, &location, new_root, &new); - if (!inode) - return ERR_PTR(-ENOMEM); - - /* - * If we're just mounting the root most subvol put the inode and return - * a reference to the dentry. We will have already gotten a reference - * to the inode in btrfs_fill_super so we're good to go. - */ - if (!new && sb->s_root->d_inode == inode) { - iput(inode); - return dget(sb->s_root); - } - - if (new) { - const struct qstr name = { .name = "/", .len = 1 }; - - /* - * New inode, we need to make the dentry a sibling of s_root so - * everything gets cleaned up properly on unmount. - */ - dentry = d_alloc(sb->s_root, &name); - if (!dentry) { - iput(inode); - return ERR_PTR(-ENOMEM); - } - d_splice_alias(inode, dentry); - } else { - /* - * We found the inode in cache, just find a dentry for it and - * put the reference to the inode we just got. - */ - dentry = d_find_alias(inode); - iput(inode); - } - - return dentry; -} - static int btrfs_fill_super(struct super_block *sb, struct btrfs_fs_devices *fs_devices, void *data, int silent) @@ -474,7 +380,7 @@ static int btrfs_fill_super(struct super_block *sb, key.objectid = BTRFS_FIRST_FREE_OBJECTID; key.type = BTRFS_INODE_ITEM_KEY; key.offset = 0; - inode = btrfs_iget(sb, &key, tree_root->fs_info->fs_root, NULL); + inode = btrfs_iget(sb, &key, tree_root->fs_info->fs_root); if (IS_ERR(inode)) { err = PTR_ERR(inode); goto fail_close; @@ -486,6 +392,12 @@ static int btrfs_fill_super(struct super_block *sb, err = -ENOMEM; goto fail_close; } +#if 0 + /* this does the super kobj at the same time */ + err = btrfs_sysfs_add_super(tree_root->fs_info); + if (err) + goto fail_close; +#endif sb->s_root = root_dentry; @@ -577,22 +489,19 @@ static int btrfs_test_super(struct super_block *s, void *data) static int btrfs_get_sb(struct file_system_type *fs_type, int flags, const char *dev_name, void *data, struct vfsmount *mnt) { + char *subvol_name = NULL; struct block_device *bdev = NULL; struct super_block *s; struct dentry *root; struct btrfs_fs_devices *fs_devices = NULL; fmode_t mode = FMODE_READ; - char *subvol_name = NULL; - u64 subvol_objectid = 0; int error = 0; - int found = 0; if (!(flags & MS_RDONLY)) mode |= FMODE_WRITE; error = btrfs_parse_early_options(data, mode, fs_type, - &subvol_name, &subvol_objectid, - &fs_devices); + &subvol_name, &fs_devices); if (error) return error; @@ -621,7 +530,6 @@ static int btrfs_get_sb(struct file_system_type *fs_type, int flags, goto error_close_devices; } - found = 1; btrfs_close_devices(fs_devices); } else { char b[BDEVNAME_SIZE]; @@ -639,35 +547,25 @@ static int btrfs_get_sb(struct file_system_type *fs_type, int flags, s->s_flags |= MS_ACTIVE; } - root = get_default_root(s, subvol_objectid); - if (IS_ERR(root)) { - error = PTR_ERR(root); - deactivate_locked_super(s); - goto error; - } - /* if they gave us a subvolume name bind mount into that */ - if (strcmp(subvol_name, ".")) { - struct dentry *new_root; - mutex_lock(&root->d_inode->i_mutex); - new_root = lookup_one_len(subvol_name, root, + if (!strcmp(subvol_name, ".")) + root = dget(s->s_root); + else { + mutex_lock(&s->s_root->d_inode->i_mutex); + root = lookup_one_len(subvol_name, s->s_root, strlen(subvol_name)); - mutex_unlock(&root->d_inode->i_mutex); + mutex_unlock(&s->s_root->d_inode->i_mutex); - if (IS_ERR(new_root)) { + if (IS_ERR(root)) { deactivate_locked_super(s); - error = PTR_ERR(new_root); - dput(root); - goto error_close_devices; + error = PTR_ERR(root); + goto error_free_subvol_name; } - if (!new_root->d_inode) { + if (!root->d_inode) { dput(root); - dput(new_root); deactivate_locked_super(s); error = -ENXIO; - goto error_close_devices; + goto error_free_subvol_name; } - dput(root); - root = new_root; } mnt->mnt_sb = s; @@ -682,7 +580,6 @@ static int btrfs_get_sb(struct file_system_type *fs_type, int flags, btrfs_close_devices(fs_devices); error_free_subvol_name: kfree(subvol_name); -error: return error; } @@ -727,37 +624,14 @@ static int btrfs_statfs(struct dentry *dentry, struct kstatfs *buf) { struct btrfs_root *root = btrfs_sb(dentry->d_sb); struct btrfs_super_block *disk_super = &root->fs_info->super_copy; - struct list_head *head = &root->fs_info->space_info; - struct btrfs_space_info *found; - u64 total_used = 0; - u64 data_used = 0; int bits = dentry->d_sb->s_blocksize_bits; __be32 *fsid = (__be32 *)root->fs_info->fsid; - rcu_read_lock(); - list_for_each_entry_rcu(found, head, list) { - if (found->flags & (BTRFS_BLOCK_GROUP_DUP| - BTRFS_BLOCK_GROUP_RAID10| - BTRFS_BLOCK_GROUP_RAID1)) { - total_used += found->bytes_used; - if (found->flags & BTRFS_BLOCK_GROUP_DATA) - data_used += found->bytes_used; - else - data_used += found->total_bytes; - } - - total_used += found->bytes_used; - if (found->flags & BTRFS_BLOCK_GROUP_DATA) - data_used += found->bytes_used; - else - data_used += found->total_bytes; - } - rcu_read_unlock(); - buf->f_namelen = BTRFS_NAME_LEN; buf->f_blocks = btrfs_super_total_bytes(disk_super) >> bits; - buf->f_bfree = buf->f_blocks - (total_used >> bits); - buf->f_bavail = buf->f_blocks - (data_used >> bits); + buf->f_bfree = buf->f_blocks - + (btrfs_super_bytes_used(disk_super) >> bits); + buf->f_bavail = buf->f_bfree; buf->f_bsize = dentry->d_sb->s_blocksize; buf->f_type = BTRFS_SUPER_MAGIC; diff --git a/trunk/fs/btrfs/transaction.c b/trunk/fs/btrfs/transaction.c index 2d654c1c794d..2a36e236a492 100644 --- a/trunk/fs/btrfs/transaction.c +++ b/trunk/fs/btrfs/transaction.c @@ -997,10 +997,13 @@ int btrfs_commit_transaction(struct btrfs_trans_handle *trans, mutex_unlock(&root->fs_info->trans_mutex); - if (flush_on_commit || snap_pending) { + if (flush_on_commit) { btrfs_start_delalloc_inodes(root, 1); ret = btrfs_wait_ordered_extents(root, 0, 1); BUG_ON(ret); + } else if (snap_pending) { + ret = btrfs_wait_ordered_extents(root, 0, 1); + BUG_ON(ret); } /* diff --git a/trunk/fs/btrfs/tree-log.c b/trunk/fs/btrfs/tree-log.c index 1255fcc8ade5..4a9434b622ec 100644 --- a/trunk/fs/btrfs/tree-log.c +++ b/trunk/fs/btrfs/tree-log.c @@ -445,7 +445,7 @@ static noinline struct inode *read_one_inode(struct btrfs_root *root, key.objectid = objectid; key.type = BTRFS_INODE_ITEM_KEY; key.offset = 0; - inode = btrfs_iget(root->fs_info->sb, &key, root, NULL); + inode = btrfs_iget(root->fs_info->sb, &key, root); if (IS_ERR(inode)) { inode = NULL; } else if (is_bad_inode(inode)) { diff --git a/trunk/fs/btrfs/volumes.c b/trunk/fs/btrfs/volumes.c index 9df8e3f1ccab..41ecbb2347f2 100644 --- a/trunk/fs/btrfs/volumes.c +++ b/trunk/fs/btrfs/volumes.c @@ -256,13 +256,13 @@ static noinline int run_scheduled_bios(struct btrfs_device *device) wake_up(&fs_info->async_submit_wait); BUG_ON(atomic_read(&cur->bi_cnt) == 0); + submit_bio(cur->bi_rw, cur); + num_run++; + batch_run++; if (bio_rw_flagged(cur, BIO_RW_SYNCIO)) num_sync_run++; - submit_bio(cur->bi_rw, cur); - num_run++; - batch_run++; if (need_resched()) { if (num_sync_run) { blk_run_backing_dev(bdi, NULL); @@ -325,6 +325,16 @@ static noinline int run_scheduled_bios(struct btrfs_device *device) num_sync_run = 0; blk_run_backing_dev(bdi, NULL); } + + cond_resched(); + if (again) + goto loop; + + spin_lock(&device->io_lock); + if (device->pending_bios.head || device->pending_sync_bios.head) + goto loop_lock; + spin_unlock(&device->io_lock); + /* * IO has already been through a long path to get here. Checksumming, * async helper threads, perhaps compression. We've done a pretty @@ -336,16 +346,6 @@ static noinline int run_scheduled_bios(struct btrfs_device *device) * cared about found its way down here. */ blk_run_backing_dev(bdi, NULL); - - cond_resched(); - if (again) - goto loop; - - spin_lock(&device->io_lock); - if (device->pending_bios.head || device->pending_sync_bios.head) - goto loop_lock; - spin_unlock(&device->io_lock); - done: return 0; } @@ -365,7 +365,6 @@ static noinline int device_list_add(const char *path, struct btrfs_device *device; struct btrfs_fs_devices *fs_devices; u64 found_transid = btrfs_super_generation(disk_super); - char *name; fs_devices = find_fsid(disk_super->fsid); if (!fs_devices) { @@ -412,12 +411,6 @@ static noinline int device_list_add(const char *path, device->fs_devices = fs_devices; fs_devices->num_devices++; - } else if (strcmp(device->name, path)) { - name = kstrdup(path, GFP_NOFS); - if (!name) - return -ENOMEM; - kfree(device->name); - device->name = name; } if (found_transid > fs_devices->latest_trans) { @@ -599,7 +592,7 @@ static int __btrfs_open_devices(struct btrfs_fs_devices *fs_devices, goto error_close; disk_super = (struct btrfs_super_block *)bh->b_data; - devid = btrfs_stack_device_id(&disk_super->dev_item); + devid = le64_to_cpu(disk_super->dev_item.devid); if (devid != device->devid) goto error_brelse; @@ -701,7 +694,7 @@ int btrfs_scan_one_device(const char *path, fmode_t flags, void *holder, goto error_close; } disk_super = (struct btrfs_super_block *)bh->b_data; - devid = btrfs_stack_device_id(&disk_super->dev_item); + devid = le64_to_cpu(disk_super->dev_item.devid); transid = btrfs_super_generation(disk_super); if (disk_super->label[0]) printk(KERN_INFO "device label %s ", disk_super->label); @@ -1194,7 +1187,7 @@ int btrfs_rm_device(struct btrfs_root *root, char *device_path) goto error_close; } disk_super = (struct btrfs_super_block *)bh->b_data; - devid = btrfs_stack_device_id(&disk_super->dev_item); + devid = le64_to_cpu(disk_super->dev_item.devid); dev_uuid = disk_super->dev_item.uuid; device = btrfs_find_device(root, devid, dev_uuid, disk_super->fsid); diff --git a/trunk/fs/gfs2/Kconfig b/trunk/fs/gfs2/Kconfig index a47b43107112..4dcddf83326f 100644 --- a/trunk/fs/gfs2/Kconfig +++ b/trunk/fs/gfs2/Kconfig @@ -8,6 +8,7 @@ config GFS2_FS select FS_POSIX_ACL select CRC32 select SLOW_WORK + select QUOTA select QUOTACTL help A cluster filesystem. diff --git a/trunk/fs/gfs2/file.c b/trunk/fs/gfs2/file.c index e6dd2aec6f82..a6abbae8a278 100644 --- a/trunk/fs/gfs2/file.c +++ b/trunk/fs/gfs2/file.c @@ -640,7 +640,7 @@ static int gfs2_lock(struct file *file, int cmd, struct file_lock *fl) if (!(fl->fl_flags & FL_POSIX)) return -ENOLCK; - if (__mandatory_lock(&ip->i_inode) && fl->fl_type != F_UNLCK) + if (__mandatory_lock(&ip->i_inode)) return -ENOLCK; if (cmd == F_CANCELLK) { diff --git a/trunk/fs/gfs2/incore.h b/trunk/fs/gfs2/incore.h index 3aac46f6853e..b8025e51cabf 100644 --- a/trunk/fs/gfs2/incore.h +++ b/trunk/fs/gfs2/incore.h @@ -616,7 +616,7 @@ struct gfs2_sbd { unsigned int sd_log_blks_reserved; unsigned int sd_log_commited_buf; unsigned int sd_log_commited_databuf; - int sd_log_commited_revoke; + unsigned int sd_log_commited_revoke; unsigned int sd_log_num_buf; unsigned int sd_log_num_revoke; diff --git a/trunk/fs/gfs2/log.c b/trunk/fs/gfs2/log.c index e5bf4b59d46e..4511b08fc451 100644 --- a/trunk/fs/gfs2/log.c +++ b/trunk/fs/gfs2/log.c @@ -417,7 +417,7 @@ static unsigned int calc_reserved(struct gfs2_sbd *sdp) databufhdrs_needed = (sdp->sd_log_commited_databuf + (dbuf_limit - 1)) / dbuf_limit; - if (sdp->sd_log_commited_revoke > 0) + if (sdp->sd_log_commited_revoke) revokes = gfs2_struct2blk(sdp, sdp->sd_log_commited_revoke, sizeof(u64)); @@ -790,6 +790,7 @@ static void log_refund(struct gfs2_sbd *sdp, struct gfs2_trans *tr) gfs2_assert_withdraw(sdp, (((int)sdp->sd_log_commited_buf) >= 0) || (((int)sdp->sd_log_commited_databuf) >= 0)); sdp->sd_log_commited_revoke += tr->tr_num_revoke - tr->tr_num_revoke_rm; + gfs2_assert_withdraw(sdp, ((int)sdp->sd_log_commited_revoke) >= 0); reserved = calc_reserved(sdp); gfs2_assert_withdraw(sdp, sdp->sd_log_blks_reserved + tr->tr_reserved >= reserved); unused = sdp->sd_log_blks_reserved - reserved + tr->tr_reserved; diff --git a/trunk/fs/jffs2/readinode.c b/trunk/fs/jffs2/readinode.c index d32ee9412cb9..e22de8397b74 100644 --- a/trunk/fs/jffs2/readinode.c +++ b/trunk/fs/jffs2/readinode.c @@ -567,7 +567,7 @@ static void jffs2_free_tmp_dnode_info_list(struct rb_root *list) else BUG(); } } - *list = RB_ROOT; + list->rb_node = NULL; } static void jffs2_free_full_dirent_list(struct jffs2_full_dirent *fd) diff --git a/trunk/fs/nfs/callback_xdr.c b/trunk/fs/nfs/callback_xdr.c index a2b8b4df125d..db30c0b398b5 100644 --- a/trunk/fs/nfs/callback_xdr.c +++ b/trunk/fs/nfs/callback_xdr.c @@ -782,7 +782,6 @@ struct svc_version nfs4_callback_version1 = { .vs_proc = nfs4_callback_procedures1, .vs_xdrsize = NFS4_CALLBACK_XDRSIZE, .vs_dispatch = NULL, - .vs_hidden = 1, }; struct svc_version nfs4_callback_version4 = { diff --git a/trunk/fs/nfs/delegation.h b/trunk/fs/nfs/delegation.h index 69e7b8140122..944b627ec6e1 100644 --- a/trunk/fs/nfs/delegation.h +++ b/trunk/fs/nfs/delegation.h @@ -71,10 +71,4 @@ static inline int nfs_inode_return_delegation(struct inode *inode) } #endif -static inline int nfs_have_delegated_attributes(struct inode *inode) -{ - return nfs_have_delegation(inode, FMODE_READ) && - !(NFS_I(inode)->cache_validity & NFS_INO_REVAL_FORCED); -} - #endif diff --git a/trunk/fs/nfs/dir.c b/trunk/fs/nfs/dir.c index c6f2750648f4..a1f6b4438fb1 100644 --- a/trunk/fs/nfs/dir.c +++ b/trunk/fs/nfs/dir.c @@ -1789,7 +1789,7 @@ static int nfs_access_get_cached(struct inode *inode, struct rpc_cred *cred, str cache = nfs_access_search_rbtree(inode, cred); if (cache == NULL) goto out; - if (!nfs_have_delegated_attributes(inode) && + if (!nfs_have_delegation(inode, FMODE_READ) && !time_in_range_open(jiffies, cache->jiffies, cache->jiffies + nfsi->attrtimeo)) goto out_stale; res->jiffies = cache->jiffies; diff --git a/trunk/fs/nfs/inode.c b/trunk/fs/nfs/inode.c index e358df75a6ad..657201acda84 100644 --- a/trunk/fs/nfs/inode.c +++ b/trunk/fs/nfs/inode.c @@ -729,7 +729,7 @@ int nfs_attribute_timeout(struct inode *inode) { struct nfs_inode *nfsi = NFS_I(inode); - if (nfs_have_delegated_attributes(inode)) + if (nfs_have_delegation(inode, FMODE_READ)) return 0; return !time_in_range_open(jiffies, nfsi->read_cache_jiffies, nfsi->read_cache_jiffies + nfsi->attrtimeo); } diff --git a/trunk/fs/nfs/nfs4proc.c b/trunk/fs/nfs/nfs4proc.c index f9254fb0c9d0..eda74c42d552 100644 --- a/trunk/fs/nfs/nfs4proc.c +++ b/trunk/fs/nfs/nfs4proc.c @@ -5107,7 +5107,6 @@ static int nfs41_proc_async_sequence(struct nfs_client *clp, res = kzalloc(sizeof(*res), GFP_KERNEL); if (!args || !res) { kfree(args); - kfree(res); nfs_put_client(clp); return -ENOMEM; } diff --git a/trunk/fs/nfs/pagelist.c b/trunk/fs/nfs/pagelist.c index 29d9d36cd5f4..a12c45b65dd4 100644 --- a/trunk/fs/nfs/pagelist.c +++ b/trunk/fs/nfs/pagelist.c @@ -112,10 +112,12 @@ void nfs_unlock_request(struct nfs_page *req) */ int nfs_set_page_tag_locked(struct nfs_page *req) { + struct nfs_inode *nfsi = NFS_I(req->wb_context->path.dentry->d_inode); + if (!nfs_lock_request_dontget(req)) return 0; if (req->wb_page != NULL) - radix_tree_tag_set(&NFS_I(req->wb_context->path.dentry->d_inode)->nfs_page_tree, req->wb_index, NFS_PAGE_TAG_LOCKED); + radix_tree_tag_set(&nfsi->nfs_page_tree, req->wb_index, NFS_PAGE_TAG_LOCKED); return 1; } @@ -124,10 +126,10 @@ int nfs_set_page_tag_locked(struct nfs_page *req) */ void nfs_clear_page_tag_locked(struct nfs_page *req) { - if (req->wb_page != NULL) { - struct inode *inode = req->wb_context->path.dentry->d_inode; - struct nfs_inode *nfsi = NFS_I(inode); + struct inode *inode = req->wb_context->path.dentry->d_inode; + struct nfs_inode *nfsi = NFS_I(inode); + if (req->wb_page != NULL) { spin_lock(&inode->i_lock); radix_tree_tag_clear(&nfsi->nfs_page_tree, req->wb_index, NFS_PAGE_TAG_LOCKED); nfs_unlock_request(req); @@ -140,22 +142,16 @@ void nfs_clear_page_tag_locked(struct nfs_page *req) * nfs_clear_request - Free up all resources allocated to the request * @req: * - * Release page and open context resources associated with a read/write - * request after it has completed. + * Release page resources associated with a write request after it + * has completed. */ void nfs_clear_request(struct nfs_page *req) { struct page *page = req->wb_page; - struct nfs_open_context *ctx = req->wb_context; - if (page != NULL) { page_cache_release(page); req->wb_page = NULL; } - if (ctx != NULL) { - put_nfs_open_context(ctx); - req->wb_context = NULL; - } } @@ -169,8 +165,9 @@ static void nfs_free_request(struct kref *kref) { struct nfs_page *req = container_of(kref, struct nfs_page, wb_kref); - /* Release struct file and open context */ + /* Release struct file or cached credential */ nfs_clear_request(req); + put_nfs_open_context(req->wb_context); nfs_page_free(req); } diff --git a/trunk/fs/nfs/super.c b/trunk/fs/nfs/super.c index 6baf9a393466..f1afee4eea77 100644 --- a/trunk/fs/nfs/super.c +++ b/trunk/fs/nfs/super.c @@ -2214,7 +2214,7 @@ static int nfs_get_sb(struct file_system_type *fs_type, } else { error = nfs_bdi_register(server); if (error) - goto error_splat_bdi; + goto error_splat_super; } if (!s->s_root) { @@ -2256,9 +2256,6 @@ static int nfs_get_sb(struct file_system_type *fs_type, error_splat_root: dput(mntroot); error_splat_super: - if (server && !s->s_root) - bdi_unregister(&server->backing_dev_info); -error_splat_bdi: deactivate_locked_super(s); goto out; } @@ -2329,7 +2326,7 @@ static int nfs_xdev_get_sb(struct file_system_type *fs_type, int flags, } else { error = nfs_bdi_register(server); if (error) - goto error_splat_bdi; + goto error_splat_super; } if (!s->s_root) { @@ -2366,9 +2363,6 @@ static int nfs_xdev_get_sb(struct file_system_type *fs_type, int flags, return error; error_splat_super: - if (server && !s->s_root) - bdi_unregister(&server->backing_dev_info); -error_splat_bdi: deactivate_locked_super(s); dprintk("<-- nfs_xdev_get_sb() = %d [splat]\n", error); return error; @@ -2584,7 +2578,7 @@ static int nfs4_remote_get_sb(struct file_system_type *fs_type, } else { error = nfs_bdi_register(server); if (error) - goto error_splat_bdi; + goto error_splat_super; } if (!s->s_root) { @@ -2622,9 +2616,6 @@ static int nfs4_remote_get_sb(struct file_system_type *fs_type, error_splat_root: dput(mntroot); error_splat_super: - if (server && !s->s_root) - bdi_unregister(&server->backing_dev_info); -error_splat_bdi: deactivate_locked_super(s); goto out; } @@ -2820,7 +2811,7 @@ static int nfs4_xdev_get_sb(struct file_system_type *fs_type, int flags, } else { error = nfs_bdi_register(server); if (error) - goto error_splat_bdi; + goto error_splat_super; } if (!s->s_root) { @@ -2856,9 +2847,6 @@ static int nfs4_xdev_get_sb(struct file_system_type *fs_type, int flags, return error; error_splat_super: - if (server && !s->s_root) - bdi_unregister(&server->backing_dev_info); -error_splat_bdi: deactivate_locked_super(s); dprintk("<-- nfs4_xdev_get_sb() = %d [splat]\n", error); return error; @@ -2905,7 +2893,7 @@ static int nfs4_remote_referral_get_sb(struct file_system_type *fs_type, } else { error = nfs_bdi_register(server); if (error) - goto error_splat_bdi; + goto error_splat_super; } if (!s->s_root) { @@ -2941,9 +2929,6 @@ static int nfs4_remote_referral_get_sb(struct file_system_type *fs_type, return error; error_splat_super: - if (server && !s->s_root) - bdi_unregister(&server->backing_dev_info); -error_splat_bdi: deactivate_locked_super(s); dprintk("<-- nfs4_referral_get_sb() = %d [splat]\n", error); return error; diff --git a/trunk/fs/nilfs2/alloc.h b/trunk/fs/nilfs2/alloc.h index 5cccf874d692..f4543ac4f560 100644 --- a/trunk/fs/nilfs2/alloc.h +++ b/trunk/fs/nilfs2/alloc.h @@ -42,7 +42,7 @@ void *nilfs_palloc_block_get_entry(const struct inode *, __u64, const struct buffer_head *, void *); /** - * nilfs_palloc_req - persistent allocator request and reply + * nilfs_palloc_req - persistent alloctor request and reply * @pr_entry_nr: entry number (vblocknr or inode number) * @pr_desc_bh: buffer head of the buffer containing block group descriptors * @pr_bitmap_bh: buffer head of the buffer containing a block group bitmap diff --git a/trunk/fs/nilfs2/dat.c b/trunk/fs/nilfs2/dat.c index 013146755683..9d1e5de91afb 100644 --- a/trunk/fs/nilfs2/dat.c +++ b/trunk/fs/nilfs2/dat.c @@ -288,7 +288,7 @@ int nilfs_dat_mark_dirty(struct inode *dat, __u64 vblocknr) * @vblocknrs and @nitems. * * Return Value: On success, 0 is returned. On error, one of the following - * negative error codes is returned. + * nagative error codes is returned. * * %-EIO - I/O error. * diff --git a/trunk/fs/nilfs2/dir.c b/trunk/fs/nilfs2/dir.c index 85c89dfc71f0..0092840492ee 100644 --- a/trunk/fs/nilfs2/dir.c +++ b/trunk/fs/nilfs2/dir.c @@ -396,7 +396,7 @@ nilfs_find_entry(struct inode *dir, const struct qstr *qstr, /* next page is past the blocks we've got */ if (unlikely(n > (dir->i_blocks >> (PAGE_CACHE_SHIFT - 9)))) { nilfs_error(dir->i_sb, __func__, - "dir %lu size %lld exceeds block count %llu", + "dir %lu size %lld exceeds block cout %llu", dir->i_ino, dir->i_size, (unsigned long long)dir->i_blocks); goto out; diff --git a/trunk/fs/nilfs2/gcinode.c b/trunk/fs/nilfs2/gcinode.c index 8880a9e281e7..e16a6664dfa2 100644 --- a/trunk/fs/nilfs2/gcinode.c +++ b/trunk/fs/nilfs2/gcinode.c @@ -28,10 +28,10 @@ * gcinodes), and this file provides lookup function of the dummy * inodes and their buffer read function. * - * Since NILFS2 keeps up multiple checkpoints/snapshots across GC, it + * Since NILFS2 keeps up multiple checkpoints/snapshots accross GC, it * has to treat blocks that belong to a same file but have different * checkpoint numbers. To avoid interference among generations, dummy - * inodes are managed separately from actual inodes, and their lookup + * inodes are managed separatly from actual inodes, and their lookup * function (nilfs_gc_iget) is designed to be specified with a * checkpoint number argument as well as an inode number. * diff --git a/trunk/fs/nilfs2/page.c b/trunk/fs/nilfs2/page.c index fc246dba112a..a2692bbc7b50 100644 --- a/trunk/fs/nilfs2/page.c +++ b/trunk/fs/nilfs2/page.c @@ -292,7 +292,7 @@ void nilfs_free_private_page(struct page *page) * @src: source page * @copy_dirty: flag whether to copy dirty states on the page's buffer heads. * - * This function is for both data pages and btnode pages. The dirty flag + * This fuction is for both data pages and btnode pages. The dirty flag * should be treated by caller. The page must not be under i/o. * Both src and dst page must be locked */ @@ -388,7 +388,7 @@ int nilfs_copy_dirty_pages(struct address_space *dmap, } /** - * nilfs_copy_back_pages -- copy back pages to original cache from shadow cache + * nilfs_copy_back_pages -- copy back pages to orignal cache from shadow cache * @dmap: destination page cache * @smap: source page cache * diff --git a/trunk/fs/nilfs2/segbuf.c b/trunk/fs/nilfs2/segbuf.c index 636eaafd6ea2..ab56fe44e377 100644 --- a/trunk/fs/nilfs2/segbuf.c +++ b/trunk/fs/nilfs2/segbuf.c @@ -32,7 +32,7 @@ struct nilfs_write_info { struct the_nilfs *nilfs; struct bio *bio; - int start, end; /* The region to be submitted */ + int start, end; /* The region to be submitted */ int rest_blocks; int max_pages; int nr_vecs; @@ -174,7 +174,7 @@ int nilfs_segbuf_reset(struct nilfs_segment_buffer *segbuf, unsigned flags, } /* - * Setup segment summary + * Setup segument summary */ void nilfs_segbuf_fill_in_segsum(struct nilfs_segment_buffer *segbuf) { @@ -470,8 +470,8 @@ static int nilfs_segbuf_submit_bh(struct nilfs_segment_buffer *segbuf, * * %-ENOMEM - Insufficient memory available. */ -static int nilfs_segbuf_write(struct nilfs_segment_buffer *segbuf, - struct the_nilfs *nilfs) +int nilfs_segbuf_write(struct nilfs_segment_buffer *segbuf, + struct the_nilfs *nilfs) { struct nilfs_write_info wi; struct buffer_head *bh; @@ -514,7 +514,7 @@ static int nilfs_segbuf_write(struct nilfs_segment_buffer *segbuf, * * %-EIO - I/O error */ -static int nilfs_segbuf_wait(struct nilfs_segment_buffer *segbuf) +int nilfs_segbuf_wait(struct nilfs_segment_buffer *segbuf) { int err = 0; diff --git a/trunk/fs/nilfs2/segment.c b/trunk/fs/nilfs2/segment.c index 69576a95e13f..ada2f1b947a3 100644 --- a/trunk/fs/nilfs2/segment.c +++ b/trunk/fs/nilfs2/segment.c @@ -141,7 +141,7 @@ int nilfs_init_transaction_cache(void) } /** - * nilfs_destroy_transaction_cache - destroy the cache for transaction info + * nilfs_detroy_transaction_cache - destroy the cache for transaction info * * nilfs_destroy_transaction_cache() frees the slab cache for the struct * nilfs_transaction_info. @@ -201,7 +201,7 @@ static int nilfs_prepare_segment_lock(struct nilfs_transaction_info *ti) * This function allocates a nilfs_transaction_info struct to keep context * information on it. It is initialized and hooked onto the current task in * the outermost call. If a pre-allocated struct is given to @ti, it is used - * instead; otherwise a new struct is assigned from a slab. + * instead; othewise a new struct is assigned from a slab. * * When @vacancy_check flag is set, this function will check the amount of * free space, and will wait for the GC to reclaim disk space if low capacity. @@ -2214,7 +2214,7 @@ static int nilfs_segctor_do_construct(struct nilfs_sc_info *sci, int mode) } /** - * nilfs_segctor_start_timer - set timer of background write + * nilfs_secgtor_start_timer - set timer of background write * @sci: nilfs_sc_info * * If the timer has already been set, it ignores the new request. @@ -2854,7 +2854,7 @@ static void nilfs_segctor_destroy(struct nilfs_sc_info *sci) * @sbi: nilfs_sb_info * * nilfs_attach_segment_constructor() allocates a struct nilfs_sc_info, - * initializes it, and starts the segment constructor. + * initilizes it, and starts the segment constructor. * * Return Value: On success, 0 is returned. On error, one of the following * negative error code is returned. diff --git a/trunk/fs/nilfs2/segment.h b/trunk/fs/nilfs2/segment.h index 82dfd6a686b9..3155e0c7f415 100644 --- a/trunk/fs/nilfs2/segment.h +++ b/trunk/fs/nilfs2/segment.h @@ -30,7 +30,7 @@ #include "sb.h" /** - * struct nilfs_recovery_info - Recovery information + * struct nilfs_recovery_info - Recovery infomation * @ri_need_recovery: Recovery status * @ri_super_root: Block number of the last super root * @ri_ri_cno: Number of the last checkpoint @@ -71,7 +71,7 @@ struct nilfs_recovery_info { */ struct nilfs_cstage { int scnt; - unsigned flags; + unsigned flags; struct nilfs_inode_info *dirty_file_ptr; struct nilfs_inode_info *gc_inode_ptr; }; diff --git a/trunk/fs/nilfs2/sufile.c b/trunk/fs/nilfs2/sufile.c index 3c6cc6005c2e..b6c36d0cc331 100644 --- a/trunk/fs/nilfs2/sufile.c +++ b/trunk/fs/nilfs2/sufile.c @@ -18,7 +18,7 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Written by Koji Sato . - * Revised by Ryusuke Konishi . + * Rivised by Ryusuke Konishi . */ #include diff --git a/trunk/fs/nilfs2/super.c b/trunk/fs/nilfs2/super.c index 0cdbc5e7655a..92579cc4c935 100644 --- a/trunk/fs/nilfs2/super.c +++ b/trunk/fs/nilfs2/super.c @@ -436,7 +436,7 @@ static int nilfs_statfs(struct dentry *dentry, struct kstatfs *buf) /* * Compute the overhead * - * When distributing meta data blocks outside segment structure, + * When distributing meta data blocks outside semgent structure, * We must count them as the overhead. */ overhead = 0; @@ -866,7 +866,7 @@ static int nilfs_remount(struct super_block *sb, int *flags, char *data) if ((*flags & MS_RDONLY) && sbi->s_snapshot_cno != old_opts.snapshot_cno) { printk(KERN_WARNING "NILFS (device %s): couldn't " - "remount to a different snapshot.\n", + "remount to a different snapshot. \n", sb->s_id); err = -EINVAL; goto restore_opts; diff --git a/trunk/fs/nilfs2/the_nilfs.c b/trunk/fs/nilfs2/the_nilfs.c index 33871f7e4f01..92733d5651d2 100644 --- a/trunk/fs/nilfs2/the_nilfs.c +++ b/trunk/fs/nilfs2/the_nilfs.c @@ -386,7 +386,7 @@ static int nilfs_store_disk_layout(struct the_nilfs *nilfs, nilfs->ns_blocks_per_segment = le32_to_cpu(sbp->s_blocks_per_segment); if (nilfs->ns_blocks_per_segment < NILFS_SEG_MIN_BLOCKS) { - printk(KERN_ERR "NILFS: too short segment.\n"); + printk(KERN_ERR "NILFS: too short segment. \n"); return -EINVAL; } diff --git a/trunk/fs/ntfs/super.c b/trunk/fs/ntfs/super.c index 0de1db6cddbf..1cf39dfaee7a 100644 --- a/trunk/fs/ntfs/super.c +++ b/trunk/fs/ntfs/super.c @@ -31,7 +31,6 @@ #include #include #include -#include #include "sysctl.h" #include "logfile.h" @@ -2459,6 +2458,7 @@ static void ntfs_put_super(struct super_block *sb) static s64 get_nr_free_clusters(ntfs_volume *vol) { s64 nr_free = vol->nr_clusters; + u32 *kaddr; struct address_space *mapping = vol->lcnbmp_ino->i_mapping; struct page *page; pgoff_t index, max_index; @@ -2477,8 +2477,7 @@ static s64 get_nr_free_clusters(ntfs_volume *vol) ntfs_debug("Reading $Bitmap, max_index = 0x%lx, max_size = 0x%lx.", max_index, PAGE_CACHE_SIZE / 4); for (index = 0; index < max_index; index++) { - unsigned long *kaddr; - + unsigned int i; /* * Read the page from page cache, getting it from backing store * if necessary, and increment the use count. @@ -2491,16 +2490,16 @@ static s64 get_nr_free_clusters(ntfs_volume *vol) nr_free -= PAGE_CACHE_SIZE * 8; continue; } - kaddr = kmap_atomic(page, KM_USER0); + kaddr = (u32*)kmap_atomic(page, KM_USER0); /* - * Subtract the number of set bits. If this + * For each 4 bytes, subtract the number of set bits. If this * is the last page and it is partial we don't really care as * it just means we do a little extra work but it won't affect * the result as all out of range bytes are set to zero by * ntfs_readpage(). */ - nr_free -= bitmap_weight(kaddr, - PAGE_CACHE_SIZE * BITS_PER_BYTE); + for (i = 0; i < PAGE_CACHE_SIZE / 4; i++) + nr_free -= (s64)hweight32(kaddr[i]); kunmap_atomic(kaddr, KM_USER0); page_cache_release(page); } @@ -2539,6 +2538,7 @@ static s64 get_nr_free_clusters(ntfs_volume *vol) static unsigned long __get_nr_free_mft_records(ntfs_volume *vol, s64 nr_free, const pgoff_t max_index) { + u32 *kaddr; struct address_space *mapping = vol->mftbmp_ino->i_mapping; struct page *page; pgoff_t index; @@ -2548,8 +2548,7 @@ static unsigned long __get_nr_free_mft_records(ntfs_volume *vol, ntfs_debug("Reading $MFT/$BITMAP, max_index = 0x%lx, max_size = " "0x%lx.", max_index, PAGE_CACHE_SIZE / 4); for (index = 0; index < max_index; index++) { - unsigned long *kaddr; - + unsigned int i; /* * Read the page from page cache, getting it from backing store * if necessary, and increment the use count. @@ -2562,16 +2561,16 @@ static unsigned long __get_nr_free_mft_records(ntfs_volume *vol, nr_free -= PAGE_CACHE_SIZE * 8; continue; } - kaddr = kmap_atomic(page, KM_USER0); + kaddr = (u32*)kmap_atomic(page, KM_USER0); /* - * Subtract the number of set bits. If this + * For each 4 bytes, subtract the number of set bits. If this * is the last page and it is partial we don't really care as * it just means we do a little extra work but it won't affect * the result as all out of range bytes are set to zero by * ntfs_readpage(). */ - nr_free -= bitmap_weight(kaddr, - PAGE_CACHE_SIZE * BITS_PER_BYTE); + for (i = 0; i < PAGE_CACHE_SIZE / 4; i++) + nr_free -= (s64)hweight32(kaddr[i]); kunmap_atomic(kaddr, KM_USER0); page_cache_release(page); } diff --git a/trunk/fs/xfs/linux-2.6/xfs_aops.c b/trunk/fs/xfs/linux-2.6/xfs_aops.c index 99628508cb11..9083357f9e44 100644 --- a/trunk/fs/xfs/linux-2.6/xfs_aops.c +++ b/trunk/fs/xfs/linux-2.6/xfs_aops.c @@ -932,9 +932,6 @@ xfs_aops_discard_page( if (!xfs_is_delayed_page(page, IOMAP_DELAY)) goto out_invalidate; - if (XFS_FORCED_SHUTDOWN(ip->i_mount)) - goto out_invalidate; - xfs_fs_cmn_err(CE_ALERT, ip->i_mount, "page discard on page %p, inode 0x%llx, offset %llu.", page, ip->i_ino, offset); @@ -967,10 +964,8 @@ xfs_aops_discard_page( if (error) { /* something screwed, just bail */ - if (!XFS_FORCED_SHUTDOWN(ip->i_mount)) { - xfs_fs_cmn_err(CE_ALERT, ip->i_mount, - "page discard failed delalloc mapping lookup."); - } + xfs_fs_cmn_err(CE_ALERT, ip->i_mount, + "page discard failed delalloc mapping lookup."); break; } if (!nimaps) { @@ -996,10 +991,8 @@ xfs_aops_discard_page( ASSERT(!flist.xbf_count && !flist.xbf_first); if (error) { /* something screwed, just bail */ - if (!XFS_FORCED_SHUTDOWN(ip->i_mount)) { - xfs_fs_cmn_err(CE_ALERT, ip->i_mount, + xfs_fs_cmn_err(CE_ALERT, ip->i_mount, "page discard unable to remove delalloc mapping."); - } break; } next_buffer: diff --git a/trunk/fs/xfs/linux-2.6/xfs_buf.c b/trunk/fs/xfs/linux-2.6/xfs_buf.c index bd111b7e1daa..6f76ba85f193 100644 --- a/trunk/fs/xfs/linux-2.6/xfs_buf.c +++ b/trunk/fs/xfs/linux-2.6/xfs_buf.c @@ -167,6 +167,75 @@ test_page_region( return (mask && (page_private(page) & mask) == mask); } +/* + * Mapping of multi-page buffers into contiguous virtual space + */ + +typedef struct a_list { + void *vm_addr; + struct a_list *next; +} a_list_t; + +static a_list_t *as_free_head; +static int as_list_len; +static DEFINE_SPINLOCK(as_lock); + +/* + * Try to batch vunmaps because they are costly. + */ +STATIC void +free_address( + void *addr) +{ + a_list_t *aentry; + +#ifdef CONFIG_XEN + /* + * Xen needs to be able to make sure it can get an exclusive + * RO mapping of pages it wants to turn into a pagetable. If + * a newly allocated page is also still being vmap()ed by xfs, + * it will cause pagetable construction to fail. This is a + * quick workaround to always eagerly unmap pages so that Xen + * is happy. + */ + vunmap(addr); + return; +#endif + + aentry = kmalloc(sizeof(a_list_t), GFP_NOWAIT); + if (likely(aentry)) { + spin_lock(&as_lock); + aentry->next = as_free_head; + aentry->vm_addr = addr; + as_free_head = aentry; + as_list_len++; + spin_unlock(&as_lock); + } else { + vunmap(addr); + } +} + +STATIC void +purge_addresses(void) +{ + a_list_t *aentry, *old; + + if (as_free_head == NULL) + return; + + spin_lock(&as_lock); + aentry = as_free_head; + as_free_head = NULL; + as_list_len = 0; + spin_unlock(&as_lock); + + while ((old = aentry) != NULL) { + vunmap(aentry->vm_addr); + aentry = aentry->next; + kfree(old); + } +} + /* * Internal xfs_buf_t object manipulation */ @@ -268,8 +337,7 @@ xfs_buf_free( uint i; if (xfs_buf_is_vmapped(bp)) - vm_unmap_ram(bp->b_addr - bp->b_offset, - bp->b_page_count); + free_address(bp->b_addr - bp->b_offset); for (i = 0; i < bp->b_page_count; i++) { struct page *page = bp->b_pages[i]; @@ -389,8 +457,10 @@ _xfs_buf_map_pages( bp->b_addr = page_address(bp->b_pages[0]) + bp->b_offset; bp->b_flags |= XBF_MAPPED; } else if (flags & XBF_MAPPED) { - bp->b_addr = vm_map_ram(bp->b_pages, bp->b_page_count, - -1, PAGE_KERNEL); + if (as_list_len > 64) + purge_addresses(); + bp->b_addr = vmap(bp->b_pages, bp->b_page_count, + VM_MAP, PAGE_KERNEL); if (unlikely(bp->b_addr == NULL)) return -ENOMEM; bp->b_addr += bp->b_offset; @@ -1885,6 +1955,9 @@ xfsbufd( xfs_buf_iostrategy(bp); count++; } + + if (as_list_len > 0) + purge_addresses(); if (count) blk_run_address_space(target->bt_mapping); diff --git a/trunk/include/acpi/processor.h b/trunk/include/acpi/processor.h index 86825ddbe14e..1172c27adadf 100644 --- a/trunk/include/acpi/processor.h +++ b/trunk/include/acpi/processor.h @@ -320,16 +320,8 @@ static inline int acpi_processor_get_bios_limit(int cpu, unsigned int *limit) #endif /* CONFIG_CPU_FREQ */ -/* in processor_core.c */ +/* in processor_pdc.c */ void acpi_processor_set_pdc(acpi_handle handle); -#ifdef CONFIG_SMP -int acpi_get_cpuid(acpi_handle, int type, u32 acpi_id); -#else -static inline int acpi_get_cpuid(acpi_handle handle, int type, u32 acpi_id) -{ - return -1; -} -#endif /* in processor_throttling.c */ int acpi_processor_tstate_has_changed(struct acpi_processor *pr); diff --git a/trunk/include/linux/backlight.h b/trunk/include/linux/backlight.h index 4a3d52e545e1..8c4f884db6b4 100644 --- a/trunk/include/linux/backlight.h +++ b/trunk/include/linux/backlight.h @@ -36,18 +36,18 @@ struct backlight_device; struct fb_info; struct backlight_ops { - unsigned int options; + const unsigned int options; #define BL_CORE_SUSPENDRESUME (1 << 0) /* Notify the backlight driver some property has changed */ - int (*update_status)(struct backlight_device *); + int (* const update_status)(struct backlight_device *); /* Return the current backlight brightness (accounting for power, fb_blank etc.) */ - int (*get_brightness)(struct backlight_device *); + int (* const get_brightness)(struct backlight_device *); /* Check if given framebuffer device is the one bound to this backlight; return 0 if not, !=0 if it is. If NULL, backlight always matches the fb. */ - int (*check_fb)(struct backlight_device *, struct fb_info *); + int (* const check_fb)(struct fb_info *); }; /* This structure defines all the properties of a backlight */ @@ -103,8 +103,7 @@ static inline void backlight_update_status(struct backlight_device *bd) } extern struct backlight_device *backlight_device_register(const char *name, - struct device *dev, void *devdata, const struct backlight_ops *ops, - const struct backlight_properties *props); + struct device *dev, void *devdata, const struct backlight_ops *ops); extern void backlight_device_unregister(struct backlight_device *bd); extern void backlight_force_update(struct backlight_device *bd, enum backlight_update_reason reason); diff --git a/trunk/include/linux/cred.h b/trunk/include/linux/cred.h index 52507c3e1387..4db09f89b637 100644 --- a/trunk/include/linux/cred.h +++ b/trunk/include/linux/cred.h @@ -280,7 +280,7 @@ static inline void put_cred(const struct cred *_cred) * task or by holding tasklist_lock to prevent it from being unlinked. */ #define __task_cred(task) \ - ((const struct cred *)(rcu_dereference_check((task)->real_cred, rcu_read_lock_held() || lockdep_tasklist_lock_is_held()))) + ((const struct cred *)(rcu_dereference_check((task)->real_cred, rcu_read_lock_held() || lockdep_is_held(&tasklist_lock)))) /** * get_task_cred - Get another task's objective credentials diff --git a/trunk/include/linux/ethtool.h b/trunk/include/linux/ethtool.h index b33f316bb92e..cca1c3de140d 100644 --- a/trunk/include/linux/ethtool.h +++ b/trunk/include/linux/ethtool.h @@ -61,13 +61,6 @@ struct ethtool_drvinfo { /* For PCI devices, use pci_name(pci_dev). */ char reserved1[32]; char reserved2[12]; - /* - * Some struct members below are filled in - * using ops->get_sset_count(). Obtaining - * this info from ethtool_drvinfo is now - * deprecated; Use ETHTOOL_GSSET_INFO - * instead. - */ __u32 n_priv_flags; /* number of flags valid in ETHTOOL_GPFLAGS */ __u32 n_stats; /* number of u64's from ETHTOOL_GSTATS */ __u32 testinfo_len; @@ -260,17 +253,6 @@ struct ethtool_gstrings { __u8 data[0]; }; -struct ethtool_sset_info { - __u32 cmd; /* ETHTOOL_GSSET_INFO */ - __u32 reserved; - __u64 sset_mask; /* input: each bit selects an sset to query */ - /* output: each bit a returned sset */ - __u32 data[0]; /* ETH_SS_xxx count, in order, based on bits - in sset_mask. One bit implies one - __u32, two bits implies two - __u32's, etc. */ -}; - enum ethtool_test_flags { ETH_TEST_FL_OFFLINE = (1 << 0), /* online / offline */ ETH_TEST_FL_FAILED = (1 << 1), /* test passed / failed */ @@ -624,9 +606,9 @@ struct ethtool_ops { #define ETHTOOL_SRXCLSRLINS 0x00000032 /* Insert RX classification rule */ #define ETHTOOL_FLASHDEV 0x00000033 /* Flash firmware to device */ #define ETHTOOL_RESET 0x00000034 /* Reset hardware */ -#define ETHTOOL_SRXNTUPLE 0x00000035 /* Add an n-tuple filter to device */ -#define ETHTOOL_GRXNTUPLE 0x00000036 /* Get n-tuple filters from device */ -#define ETHTOOL_GSSET_INFO 0x00000037 /* Get string set info */ + +#define ETHTOOL_SRXNTUPLE 0x00000035 /* Add an n-tuple filter to device */ +#define ETHTOOL_GRXNTUPLE 0x00000036 /* Get n-tuple filters from device */ /* compatibility with older code */ #define SPARC_ETH_GSET ETHTOOL_GSET diff --git a/trunk/include/linux/ftrace_event.h b/trunk/include/linux/ftrace_event.h index c0f4b364c711..6b7c444ab8f6 100644 --- a/trunk/include/linux/ftrace_event.h +++ b/trunk/include/linux/ftrace_event.h @@ -131,12 +131,12 @@ struct ftrace_event_call { void *mod; void *data; - int perf_refcount; - int (*perf_event_enable)(struct ftrace_event_call *); - void (*perf_event_disable)(struct ftrace_event_call *); + int profile_count; + int (*profile_enable)(struct ftrace_event_call *); + void (*profile_disable)(struct ftrace_event_call *); }; -#define PERF_MAX_TRACE_SIZE 2048 +#define FTRACE_MAX_PROFILE_SIZE 2048 #define MAX_FILTER_PRED 32 #define MAX_FILTER_STR_VAL 256 /* Should handle KSYM_SYMBOL_LEN */ @@ -187,25 +187,22 @@ do { \ #ifdef CONFIG_PERF_EVENTS struct perf_event; - -DECLARE_PER_CPU(struct pt_regs, perf_trace_regs); - -extern int perf_trace_enable(int event_id); -extern void perf_trace_disable(int event_id); +extern int ftrace_profile_enable(int event_id); +extern void ftrace_profile_disable(int event_id); extern int ftrace_profile_set_filter(struct perf_event *event, int event_id, char *filter_str); extern void ftrace_profile_free_filter(struct perf_event *event); extern void * -perf_trace_buf_prepare(int size, unsigned short type, int *rctxp, +ftrace_perf_buf_prepare(int size, unsigned short type, int *rctxp, unsigned long *irq_flags); static inline void -perf_trace_buf_submit(void *raw_data, int size, int rctx, u64 addr, - u64 count, unsigned long irq_flags, struct pt_regs *regs) +ftrace_perf_buf_submit(void *raw_data, int size, int rctx, u64 addr, + u64 count, unsigned long irq_flags) { struct trace_entry *entry = raw_data; - perf_tp_event(entry->type, addr, count, raw_data, size, regs); + perf_tp_event(entry->type, addr, count, raw_data, size); perf_swevent_put_recursion_context(rctx); local_irq_restore(irq_flags); } diff --git a/trunk/include/linux/hw_breakpoint.h b/trunk/include/linux/hw_breakpoint.h index c70d27af03f9..5977b724f7c6 100644 --- a/trunk/include/linux/hw_breakpoint.h +++ b/trunk/include/linux/hw_breakpoint.h @@ -66,14 +66,14 @@ register_wide_hw_breakpoint_cpu(struct perf_event_attr *attr, perf_overflow_handler_t triggered, int cpu); -extern struct perf_event * __percpu * +extern struct perf_event ** register_wide_hw_breakpoint(struct perf_event_attr *attr, perf_overflow_handler_t triggered); extern int register_perf_hw_breakpoint(struct perf_event *bp); extern int __register_perf_hw_breakpoint(struct perf_event *bp); extern void unregister_hw_breakpoint(struct perf_event *bp); -extern void unregister_wide_hw_breakpoint(struct perf_event * __percpu *cpu_events); +extern void unregister_wide_hw_breakpoint(struct perf_event **cpu_events); extern int dbg_reserve_bp_slot(struct perf_event *bp); extern int dbg_release_bp_slot(struct perf_event *bp); @@ -100,7 +100,7 @@ static inline struct perf_event * register_wide_hw_breakpoint_cpu(struct perf_event_attr *attr, perf_overflow_handler_t triggered, int cpu) { return NULL; } -static inline struct perf_event * __percpu * +static inline struct perf_event ** register_wide_hw_breakpoint(struct perf_event_attr *attr, perf_overflow_handler_t triggered) { return NULL; } static inline int @@ -109,7 +109,7 @@ static inline int __register_perf_hw_breakpoint(struct perf_event *bp) { return -ENOSYS; } static inline void unregister_hw_breakpoint(struct perf_event *bp) { } static inline void -unregister_wide_hw_breakpoint(struct perf_event * __percpu *cpu_events) { } +unregister_wide_hw_breakpoint(struct perf_event **cpu_events) { } static inline int reserve_bp_slot(struct perf_event *bp) {return -ENOSYS; } static inline void release_bp_slot(struct perf_event *bp) { } diff --git a/trunk/include/linux/i2c-algo-bit.h b/trunk/include/linux/i2c-algo-bit.h index 4f98148c11c3..111334f5b922 100644 --- a/trunk/include/linux/i2c-algo-bit.h +++ b/trunk/include/linux/i2c-algo-bit.h @@ -36,8 +36,6 @@ struct i2c_algo_bit_data { void (*setscl) (void *data, int state); int (*getsda) (void *data); int (*getscl) (void *data); - int (*pre_xfer) (struct i2c_adapter *); - void (*post_xfer) (struct i2c_adapter *); /* local settings */ int udelay; /* half clock cycle time in us, diff --git a/trunk/include/linux/i2c-xiic.h b/trunk/include/linux/i2c-xiic.h deleted file mode 100644 index 4f9f2256a97e..000000000000 --- a/trunk/include/linux/i2c-xiic.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * i2c-xiic.h - * Copyright (c) 2009 Intel Corporation - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -/* Supports: - * Xilinx IIC - */ - -#ifndef _LINUX_I2C_XIIC_H -#define _LINUX_I2C_XIIC_H - -/** - * struct xiic_i2c_platform_data - Platform data of the Xilinx I2C driver - * @num_devices: Number of devices that shall be added when the driver - * is probed. - * @devices: The actuall devices to add. - * - * This purpose of this platform data struct is to be able to provide a number - * of devices that should be added to the I2C bus. The reason is that sometimes - * the I2C board info is not enough, a new PCI board can for instance be - * plugged into a standard PC, and the bus number might be unknown at - * early init time. - */ -struct xiic_i2c_platform_data { - u8 num_devices; - struct i2c_board_info const *devices; -}; - -#endif /* _LINUX_I2C_XIIC_H */ diff --git a/trunk/include/linux/input.h b/trunk/include/linux/input.h index 7ed2251b33f1..dc24effb6d0e 100644 --- a/trunk/include/linux/input.h +++ b/trunk/include/linux/input.h @@ -58,10 +58,10 @@ struct input_absinfo { #define EVIOCGVERSION _IOR('E', 0x01, int) /* get driver version */ #define EVIOCGID _IOR('E', 0x02, struct input_id) /* get device ID */ -#define EVIOCGREP _IOR('E', 0x03, unsigned int[2]) /* get repeat settings */ -#define EVIOCSREP _IOW('E', 0x03, unsigned int[2]) /* set repeat settings */ -#define EVIOCGKEYCODE _IOR('E', 0x04, unsigned int[2]) /* get keycode */ -#define EVIOCSKEYCODE _IOW('E', 0x04, unsigned int[2]) /* set keycode */ +#define EVIOCGREP _IOR('E', 0x03, int[2]) /* get repeat settings */ +#define EVIOCSREP _IOW('E', 0x03, int[2]) /* set repeat settings */ +#define EVIOCGKEYCODE _IOR('E', 0x04, int[2]) /* get keycode */ +#define EVIOCSKEYCODE _IOW('E', 0x04, int[2]) /* set keycode */ #define EVIOCGNAME(len) _IOC(_IOC_READ, 'E', 0x06, len) /* get device name */ #define EVIOCGPHYS(len) _IOC(_IOC_READ, 'E', 0x07, len) /* get physical location */ @@ -1142,10 +1142,8 @@ struct input_dev { unsigned int keycodemax; unsigned int keycodesize; void *keycode; - int (*setkeycode)(struct input_dev *dev, - unsigned int scancode, unsigned int keycode); - int (*getkeycode)(struct input_dev *dev, - unsigned int scancode, unsigned int *keycode); + int (*setkeycode)(struct input_dev *dev, int scancode, int keycode); + int (*getkeycode)(struct input_dev *dev, int scancode, int *keycode); struct ff_device *ff; @@ -1417,10 +1415,8 @@ static inline void input_set_abs_params(struct input_dev *dev, int axis, int min dev->absbit[BIT_WORD(axis)] |= BIT_MASK(axis); } -int input_get_keycode(struct input_dev *dev, - unsigned int scancode, unsigned int *keycode); -int input_set_keycode(struct input_dev *dev, - unsigned int scancode, unsigned int keycode); +int input_get_keycode(struct input_dev *dev, int scancode, int *keycode); +int input_set_keycode(struct input_dev *dev, int scancode, int keycode); extern struct class input_class; diff --git a/trunk/include/linux/ioport.h b/trunk/include/linux/ioport.h index 71ab79da7e7f..dda98410d588 100644 --- a/trunk/include/linux/ioport.h +++ b/trunk/include/linux/ioport.h @@ -34,24 +34,22 @@ struct resource_list { */ #define IORESOURCE_BITS 0x000000ff /* Bus-specific bits */ -#define IORESOURCE_TYPE_BITS 0x00001f00 /* Resource type */ +#define IORESOURCE_TYPE_BITS 0x00000f00 /* Resource type */ #define IORESOURCE_IO 0x00000100 #define IORESOURCE_MEM 0x00000200 #define IORESOURCE_IRQ 0x00000400 #define IORESOURCE_DMA 0x00000800 -#define IORESOURCE_BUS 0x00001000 -#define IORESOURCE_PREFETCH 0x00002000 /* No side effects */ -#define IORESOURCE_READONLY 0x00004000 -#define IORESOURCE_CACHEABLE 0x00008000 -#define IORESOURCE_RANGELENGTH 0x00010000 -#define IORESOURCE_SHADOWABLE 0x00020000 +#define IORESOURCE_PREFETCH 0x00001000 /* No side effects */ +#define IORESOURCE_READONLY 0x00002000 +#define IORESOURCE_CACHEABLE 0x00004000 +#define IORESOURCE_RANGELENGTH 0x00008000 +#define IORESOURCE_SHADOWABLE 0x00010000 -#define IORESOURCE_SIZEALIGN 0x00040000 /* size indicates alignment */ -#define IORESOURCE_STARTALIGN 0x00080000 /* start field is alignment */ +#define IORESOURCE_SIZEALIGN 0x00020000 /* size indicates alignment */ +#define IORESOURCE_STARTALIGN 0x00040000 /* start field is alignment */ #define IORESOURCE_MEM_64 0x00100000 -#define IORESOURCE_WINDOW 0x00200000 /* forwarded by bridge */ #define IORESOURCE_EXCLUSIVE 0x08000000 /* Userland may not map this resource */ #define IORESOURCE_DISABLED 0x10000000 diff --git a/trunk/include/linux/memory.h b/trunk/include/linux/memory.h index 85582e1bcee9..1adfe779eb99 100644 --- a/trunk/include/linux/memory.h +++ b/trunk/include/linux/memory.h @@ -36,8 +36,6 @@ struct memory_block { struct sys_device sysdev; }; -int arch_get_memory_phys_device(unsigned long start_pfn); - /* These states are exposed to userspace as text strings in sysfs */ #define MEM_ONLINE (1<<0) /* exposed to userspace */ #define MEM_GOING_OFFLINE (1<<1) /* exposed to userspace */ diff --git a/trunk/include/linux/perf_event.h b/trunk/include/linux/perf_event.h index 95477038a72a..7b18b4fd5df7 100644 --- a/trunk/include/linux/perf_event.h +++ b/trunk/include/linux/perf_event.h @@ -452,8 +452,6 @@ enum perf_callchain_context { #include #include #include -#include -#include #include #define PERF_MAX_STACK_DEPTH 255 @@ -489,8 +487,9 @@ struct hw_perf_event { struct hrtimer hrtimer; }; #ifdef CONFIG_HAVE_HW_BREAKPOINT - /* breakpoint */ - struct arch_hw_breakpoint info; + union { /* breakpoint */ + struct arch_hw_breakpoint info; + }; #endif }; atomic64_t prev_count; @@ -803,13 +802,6 @@ struct perf_sample_data { struct perf_raw_record *raw; }; -static inline -void perf_sample_data_init(struct perf_sample_data *data, u64 addr) -{ - data->addr = addr; - data->raw = NULL; -} - extern void perf_output_sample(struct perf_output_handle *handle, struct perf_event_header *header, struct perf_sample_data *data, @@ -849,44 +841,6 @@ perf_sw_event(u32 event_id, u64 nr, int nmi, struct pt_regs *regs, u64 addr) __perf_sw_event(event_id, nr, nmi, regs, addr); } -extern void -perf_arch_fetch_caller_regs(struct pt_regs *regs, unsigned long ip, int skip); - -/* - * Take a snapshot of the regs. Skip ip and frame pointer to - * the nth caller. We only need a few of the regs: - * - ip for PERF_SAMPLE_IP - * - cs for user_mode() tests - * - bp for callchains - * - eflags, for future purposes, just in case - */ -static inline void perf_fetch_caller_regs(struct pt_regs *regs, int skip) -{ - unsigned long ip; - - memset(regs, 0, sizeof(*regs)); - - switch (skip) { - case 1 : - ip = CALLER_ADDR0; - break; - case 2 : - ip = CALLER_ADDR1; - break; - case 3 : - ip = CALLER_ADDR2; - break; - case 4: - ip = CALLER_ADDR3; - break; - /* No need to support further for now */ - default: - ip = 0; - } - - return perf_arch_fetch_caller_regs(regs, ip, skip); -} - extern void __perf_event_mmap(struct vm_area_struct *vma); static inline void perf_event_mmap(struct vm_area_struct *vma) @@ -904,24 +858,8 @@ extern int sysctl_perf_event_paranoid; extern int sysctl_perf_event_mlock; extern int sysctl_perf_event_sample_rate; -static inline bool perf_paranoid_tracepoint_raw(void) -{ - return sysctl_perf_event_paranoid > -1; -} - -static inline bool perf_paranoid_cpu(void) -{ - return sysctl_perf_event_paranoid > 0; -} - -static inline bool perf_paranoid_kernel(void) -{ - return sysctl_perf_event_paranoid > 1; -} - extern void perf_event_init(void); -extern void perf_tp_event(int event_id, u64 addr, u64 count, void *record, - int entry_size, struct pt_regs *regs); +extern void perf_tp_event(int event_id, u64 addr, u64 count, void *record, int entry_size); extern void perf_bp_event(struct perf_event *event, void *data); #ifndef perf_misc_flags @@ -977,21 +915,5 @@ static inline void perf_event_disable(struct perf_event *event) { } #define perf_output_put(handle, x) \ perf_output_copy((handle), &(x), sizeof(x)) -/* - * This has to have a higher priority than migration_notifier in sched.c. - */ -#define perf_cpu_notifier(fn) \ -do { \ - static struct notifier_block fn##_nb __cpuinitdata = \ - { .notifier_call = fn, .priority = 20 }; \ - fn(&fn##_nb, (unsigned long)CPU_UP_PREPARE, \ - (void *)(unsigned long)smp_processor_id()); \ - fn(&fn##_nb, (unsigned long)CPU_STARTING, \ - (void *)(unsigned long)smp_processor_id()); \ - fn(&fn##_nb, (unsigned long)CPU_ONLINE, \ - (void *)(unsigned long)smp_processor_id()); \ - register_cpu_notifier(&fn##_nb); \ -} while (0) - #endif /* __KERNEL__ */ #endif /* _LINUX_PERF_EVENT_H */ diff --git a/trunk/include/linux/power_supply.h b/trunk/include/linux/power_supply.h index ebd2b8fb00d0..b5d096d3a9be 100644 --- a/trunk/include/linux/power_supply.h +++ b/trunk/include/linux/power_supply.h @@ -82,7 +82,6 @@ enum power_supply_property { POWER_SUPPLY_PROP_PRESENT, POWER_SUPPLY_PROP_ONLINE, POWER_SUPPLY_PROP_TECHNOLOGY, - POWER_SUPPLY_PROP_CYCLE_COUNT, POWER_SUPPLY_PROP_VOLTAGE_MAX, POWER_SUPPLY_PROP_VOLTAGE_MIN, POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN, diff --git a/trunk/include/linux/rcupdate.h b/trunk/include/linux/rcupdate.h index 3024050c82a1..a005cac5e302 100644 --- a/trunk/include/linux/rcupdate.h +++ b/trunk/include/linux/rcupdate.h @@ -101,11 +101,6 @@ extern struct lockdep_map rcu_sched_lock_map; # define rcu_read_release_sched() \ lock_release(&rcu_sched_lock_map, 1, _THIS_IP_) -static inline int debug_lockdep_rcu_enabled(void) -{ - return likely(rcu_scheduler_active && debug_locks); -} - /** * rcu_read_lock_held - might we be in RCU read-side critical section? * @@ -113,14 +108,12 @@ static inline int debug_lockdep_rcu_enabled(void) * an RCU read-side critical section. In absence of CONFIG_PROVE_LOCKING, * this assumes we are in an RCU read-side critical section unless it can * prove otherwise. - * - * Check rcu_scheduler_active to prevent false positives during boot. */ static inline int rcu_read_lock_held(void) { - if (!debug_lockdep_rcu_enabled()) - return 1; - return lock_is_held(&rcu_lock_map); + if (debug_locks) + return lock_is_held(&rcu_lock_map); + return 1; } /** @@ -130,14 +123,12 @@ static inline int rcu_read_lock_held(void) * an RCU-bh read-side critical section. In absence of CONFIG_PROVE_LOCKING, * this assumes we are in an RCU-bh read-side critical section unless it can * prove otherwise. - * - * Check rcu_scheduler_active to prevent false positives during boot. */ static inline int rcu_read_lock_bh_held(void) { - if (!debug_lockdep_rcu_enabled()) - return 1; - return lock_is_held(&rcu_bh_lock_map); + if (debug_locks) + return lock_is_held(&rcu_bh_lock_map); + return 1; } /** @@ -148,26 +139,15 @@ static inline int rcu_read_lock_bh_held(void) * this assumes we are in an RCU-sched read-side critical section unless it * can prove otherwise. Note that disabling of preemption (including * disabling irqs) counts as an RCU-sched read-side critical section. - * - * Check rcu_scheduler_active to prevent false positives during boot. */ -#ifdef CONFIG_PREEMPT static inline int rcu_read_lock_sched_held(void) { int lockdep_opinion = 0; - if (!debug_lockdep_rcu_enabled()) - return 1; if (debug_locks) lockdep_opinion = lock_is_held(&rcu_sched_lock_map); - return lockdep_opinion || preempt_count() != 0; -} -#else /* #ifdef CONFIG_PREEMPT */ -static inline int rcu_read_lock_sched_held(void) -{ - return 1; + return lockdep_opinion || preempt_count() != 0 || !rcu_scheduler_active; } -#endif /* #else #ifdef CONFIG_PREEMPT */ #else /* #ifdef CONFIG_DEBUG_LOCK_ALLOC */ @@ -188,17 +168,10 @@ static inline int rcu_read_lock_bh_held(void) return 1; } -#ifdef CONFIG_PREEMPT static inline int rcu_read_lock_sched_held(void) { - return !rcu_scheduler_active || preempt_count() != 0; -} -#else /* #ifdef CONFIG_PREEMPT */ -static inline int rcu_read_lock_sched_held(void) -{ - return 1; + return preempt_count() != 0 || !rcu_scheduler_active; } -#endif /* #else #ifdef CONFIG_PREEMPT */ #endif /* #else #ifdef CONFIG_DEBUG_LOCK_ALLOC */ @@ -215,7 +188,7 @@ static inline int rcu_read_lock_sched_held(void) */ #define rcu_dereference_check(p, c) \ ({ \ - if (debug_lockdep_rcu_enabled() && !(c)) \ + if (debug_locks && !(c)) \ lockdep_rcu_dereference(__FILE__, __LINE__); \ rcu_dereference_raw(p); \ }) diff --git a/trunk/include/linux/rfkill.h b/trunk/include/linux/rfkill.h index 4f82326eb294..97059d08a626 100644 --- a/trunk/include/linux/rfkill.h +++ b/trunk/include/linux/rfkill.h @@ -29,7 +29,7 @@ /** * enum rfkill_type - type of rfkill switch. * - * @RFKILL_TYPE_ALL: toggles all switches (requests only - not a switch type) + * @RFKILL_TYPE_ALL: toggles all switches (userspace only) * @RFKILL_TYPE_WLAN: switch is on a 802.11 wireless network device. * @RFKILL_TYPE_BLUETOOTH: switch is on a bluetooth device. * @RFKILL_TYPE_UWB: switch is on a ultra wideband device. diff --git a/trunk/include/linux/rwlock.h b/trunk/include/linux/rwlock.h index bc2994ed66e1..71e0b00b6f2c 100644 --- a/trunk/include/linux/rwlock.h +++ b/trunk/include/linux/rwlock.h @@ -29,25 +29,25 @@ do { \ #endif #ifdef CONFIG_DEBUG_SPINLOCK - extern void do_raw_read_lock(rwlock_t *lock) __acquires(lock); + extern void do_raw_read_lock(rwlock_t *lock); #define do_raw_read_lock_flags(lock, flags) do_raw_read_lock(lock) extern int do_raw_read_trylock(rwlock_t *lock); - extern void do_raw_read_unlock(rwlock_t *lock) __releases(lock); - extern void do_raw_write_lock(rwlock_t *lock) __acquires(lock); + extern void do_raw_read_unlock(rwlock_t *lock); + extern void do_raw_write_lock(rwlock_t *lock); #define do_raw_write_lock_flags(lock, flags) do_raw_write_lock(lock) extern int do_raw_write_trylock(rwlock_t *lock); - extern void do_raw_write_unlock(rwlock_t *lock) __releases(lock); + extern void do_raw_write_unlock(rwlock_t *lock); #else -# define do_raw_read_lock(rwlock) do {__acquire(lock); arch_read_lock(&(rwlock)->raw_lock); } while (0) +# define do_raw_read_lock(rwlock) arch_read_lock(&(rwlock)->raw_lock) # define do_raw_read_lock_flags(lock, flags) \ - do {__acquire(lock); arch_read_lock_flags(&(lock)->raw_lock, *(flags)); } while (0) + arch_read_lock_flags(&(lock)->raw_lock, *(flags)) # define do_raw_read_trylock(rwlock) arch_read_trylock(&(rwlock)->raw_lock) -# define do_raw_read_unlock(rwlock) do {arch_read_unlock(&(rwlock)->raw_lock); __release(lock); } while (0) -# define do_raw_write_lock(rwlock) do {__acquire(lock); arch_write_lock(&(rwlock)->raw_lock); } while (0) +# define do_raw_read_unlock(rwlock) arch_read_unlock(&(rwlock)->raw_lock) +# define do_raw_write_lock(rwlock) arch_write_lock(&(rwlock)->raw_lock) # define do_raw_write_lock_flags(lock, flags) \ - do {__acquire(lock); arch_write_lock_flags(&(lock)->raw_lock, *(flags)); } while (0) + arch_write_lock_flags(&(lock)->raw_lock, *(flags)) # define do_raw_write_trylock(rwlock) arch_write_trylock(&(rwlock)->raw_lock) -# define do_raw_write_unlock(rwlock) do {arch_write_unlock(&(rwlock)->raw_lock); __release(lock); } while (0) +# define do_raw_write_unlock(rwlock) arch_write_unlock(&(rwlock)->raw_lock) #endif #define read_can_lock(rwlock) arch_read_can_lock(&(rwlock)->raw_lock) diff --git a/trunk/include/linux/sched.h b/trunk/include/linux/sched.h index dad7f668ebf7..8d70ff802da2 100644 --- a/trunk/include/linux/sched.h +++ b/trunk/include/linux/sched.h @@ -258,10 +258,6 @@ extern spinlock_t mmlist_lock; struct task_struct; -#ifdef CONFIG_PROVE_RCU -extern int lockdep_tasklist_lock_is_held(void); -#endif /* #ifdef CONFIG_PROVE_RCU */ - extern void sched_init(void); extern void sched_init_smp(void); extern asmlinkage void schedule_tail(struct task_struct *prev); diff --git a/trunk/include/linux/snmp.h b/trunk/include/linux/snmp.h index 4435d1084755..e28f5a0182e8 100644 --- a/trunk/include/linux/snmp.h +++ b/trunk/include/linux/snmp.h @@ -225,8 +225,6 @@ enum LINUX_MIB_SACKSHIFTED, LINUX_MIB_SACKMERGED, LINUX_MIB_SACKSHIFTFALLBACK, - LINUX_MIB_TCPBACKLOGDROP, - LINUX_MIB_TCPMINTTLDROP, /* RFC 5082 */ __LINUX_MIB_MAX }; diff --git a/trunk/include/linux/spi/ads7846.h b/trunk/include/linux/spi/ads7846.h index b4ae570d3c98..51948eb6927a 100644 --- a/trunk/include/linux/spi/ads7846.h +++ b/trunk/include/linux/spi/ads7846.h @@ -12,7 +12,7 @@ enum ads7846_filter { }; struct ads7846_platform_data { - u16 model; /* 7843, 7845, 7846, 7873. */ + u16 model; /* 7843, 7845, 7846. */ u16 vref_delay_usecs; /* 0 for external vref; etc */ u16 vref_mv; /* external vref value, milliVolts */ bool keep_vref_on; /* set to keep vref on for differential @@ -53,6 +53,5 @@ struct ads7846_platform_data { int (*filter) (void *filter_data, int data_idx, int *val); void (*filter_cleanup)(void *filter_data); void (*wait_for_sync)(void); - bool wakeup; }; diff --git a/trunk/include/linux/spi/l4f00242t03.h b/trunk/include/linux/spi/l4f00242t03.h deleted file mode 100644 index aee1dbda4edc..000000000000 --- a/trunk/include/linux/spi/l4f00242t03.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * l4f00242t03.h -- Platform glue for Epson L4F00242T03 LCD - * - * Copyright (c) 2009 Alberto Panizzo - * Based on Marek Vasut work in lms283gf05.h - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#ifndef _INCLUDE_LINUX_SPI_L4F00242T03_H_ -#define _INCLUDE_LINUX_SPI_L4F00242T03_H_ - -struct l4f00242t03_pdata { - unsigned int reset_gpio; - unsigned int data_enable_gpio; - const char *io_supply; /* will be set to 1.8 V */ - const char *core_supply; /* will be set to 2.8 V */ -}; - -#endif /* _INCLUDE_LINUX_SPI_L4F00242T03_H_ */ diff --git a/trunk/include/linux/spinlock.h b/trunk/include/linux/spinlock.h index 89fac6a3f78b..86088213334a 100644 --- a/trunk/include/linux/spinlock.h +++ b/trunk/include/linux/spinlock.h @@ -128,21 +128,19 @@ static inline void smp_mb__after_lock(void) { smp_mb(); } #define raw_spin_unlock_wait(lock) arch_spin_unlock_wait(&(lock)->raw_lock) #ifdef CONFIG_DEBUG_SPINLOCK - extern void do_raw_spin_lock(raw_spinlock_t *lock) __acquires(lock); + extern void do_raw_spin_lock(raw_spinlock_t *lock); #define do_raw_spin_lock_flags(lock, flags) do_raw_spin_lock(lock) extern int do_raw_spin_trylock(raw_spinlock_t *lock); - extern void do_raw_spin_unlock(raw_spinlock_t *lock) __releases(lock); + extern void do_raw_spin_unlock(raw_spinlock_t *lock); #else -static inline void do_raw_spin_lock(raw_spinlock_t *lock) __acquires(lock) +static inline void do_raw_spin_lock(raw_spinlock_t *lock) { - __acquire(lock); arch_spin_lock(&lock->raw_lock); } static inline void -do_raw_spin_lock_flags(raw_spinlock_t *lock, unsigned long *flags) __acquires(lock) +do_raw_spin_lock_flags(raw_spinlock_t *lock, unsigned long *flags) { - __acquire(lock); arch_spin_lock_flags(&lock->raw_lock, *flags); } @@ -151,10 +149,9 @@ static inline int do_raw_spin_trylock(raw_spinlock_t *lock) return arch_spin_trylock(&(lock)->raw_lock); } -static inline void do_raw_spin_unlock(raw_spinlock_t *lock) __releases(lock) +static inline void do_raw_spin_unlock(raw_spinlock_t *lock) { arch_spin_unlock(&lock->raw_lock); - __release(lock); } #endif diff --git a/trunk/include/linux/syscalls.h b/trunk/include/linux/syscalls.h index f994ae58a002..44f2ad0e8825 100644 --- a/trunk/include/linux/syscalls.h +++ b/trunk/include/linux/syscalls.h @@ -105,18 +105,18 @@ struct perf_event_attr; #ifdef CONFIG_PERF_EVENTS -#define TRACE_SYS_ENTER_PERF_INIT(sname) \ - .perf_event_enable = perf_sysenter_enable, \ - .perf_event_disable = perf_sysenter_disable, +#define TRACE_SYS_ENTER_PROFILE_INIT(sname) \ + .profile_enable = prof_sysenter_enable, \ + .profile_disable = prof_sysenter_disable, -#define TRACE_SYS_EXIT_PERF_INIT(sname) \ - .perf_event_enable = perf_sysexit_enable, \ - .perf_event_disable = perf_sysexit_disable, +#define TRACE_SYS_EXIT_PROFILE_INIT(sname) \ + .profile_enable = prof_sysexit_enable, \ + .profile_disable = prof_sysexit_disable, #else -#define TRACE_SYS_ENTER_PERF(sname) -#define TRACE_SYS_ENTER_PERF_INIT(sname) -#define TRACE_SYS_EXIT_PERF(sname) -#define TRACE_SYS_EXIT_PERF_INIT(sname) +#define TRACE_SYS_ENTER_PROFILE(sname) +#define TRACE_SYS_ENTER_PROFILE_INIT(sname) +#define TRACE_SYS_EXIT_PROFILE(sname) +#define TRACE_SYS_EXIT_PROFILE_INIT(sname) #endif /* CONFIG_PERF_EVENTS */ #ifdef CONFIG_FTRACE_SYSCALLS @@ -153,7 +153,7 @@ struct perf_event_attr; .regfunc = reg_event_syscall_enter, \ .unregfunc = unreg_event_syscall_enter, \ .data = (void *)&__syscall_meta_##sname,\ - TRACE_SYS_ENTER_PERF_INIT(sname) \ + TRACE_SYS_ENTER_PROFILE_INIT(sname) \ } #define SYSCALL_TRACE_EXIT_EVENT(sname) \ @@ -175,7 +175,7 @@ struct perf_event_attr; .regfunc = reg_event_syscall_exit, \ .unregfunc = unreg_event_syscall_exit, \ .data = (void *)&__syscall_meta_##sname,\ - TRACE_SYS_EXIT_PERF_INIT(sname) \ + TRACE_SYS_EXIT_PROFILE_INIT(sname) \ } #define SYSCALL_METADATA(sname, nb) \ diff --git a/trunk/include/linux/virtio.h b/trunk/include/linux/virtio.h index 40d1709bdbf4..f508c651e53d 100644 --- a/trunk/include/linux/virtio.h +++ b/trunk/include/linux/virtio.h @@ -98,7 +98,6 @@ struct virtio_device { void *priv; }; -#define dev_to_virtio(dev) container_of(dev, struct virtio_device, dev) int register_virtio_device(struct virtio_device *dev); void unregister_virtio_device(struct virtio_device *dev); diff --git a/trunk/include/linux/virtio_9p.h b/trunk/include/linux/virtio_9p.h index 5cf11765146b..332275080083 100644 --- a/trunk/include/linux/virtio_9p.h +++ b/trunk/include/linux/virtio_9p.h @@ -5,16 +5,4 @@ #include #include -/* The feature bitmap for virtio 9P */ - -/* The mount point is specified in a config variable */ -#define VIRTIO_9P_MOUNT_TAG 0 - -struct virtio_9p_config { - /* length of the tag name */ - __u16 tag_len; - /* non-NULL terminated tag name */ - __u8 tag[0]; -} __attribute__((packed)); - #endif /* _LINUX_VIRTIO_9P_H */ diff --git a/trunk/include/net/9p/client.h b/trunk/include/net/9p/client.h index f076dfa75ae8..52e1fff709e4 100644 --- a/trunk/include/net/9p/client.h +++ b/trunk/include/net/9p/client.h @@ -32,13 +32,13 @@ /** enum p9_proto_versions - 9P protocol versions * @p9_proto_legacy: 9P Legacy mode, pre-9P2000.u * @p9_proto_2000u: 9P2000.u extension - * @p9_proto_2000L: 9P2000.L extension + * @p9_proto_2010L: 9P2010.L extension */ enum p9_proto_versions{ p9_proto_legacy = 0, p9_proto_2000u = 1, - p9_proto_2000L = 2, + p9_proto_2010L = 2, }; diff --git a/trunk/include/net/ip6_route.h b/trunk/include/net/ip6_route.h index 68f67836e146..4a808de7c0f6 100644 --- a/trunk/include/net/ip6_route.h +++ b/trunk/include/net/ip6_route.h @@ -37,24 +37,6 @@ struct route_info { #define RT6_LOOKUP_F_SRCPREF_PUBLIC 0x00000010 #define RT6_LOOKUP_F_SRCPREF_COA 0x00000020 -/* - * rt6_srcprefs2flags() and rt6_flags2srcprefs() translate - * between IPV6_ADDR_PREFERENCES socket option values - * IPV6_PREFER_SRC_TMP = 0x1 - * IPV6_PREFER_SRC_PUBLIC = 0x2 - * IPV6_PREFER_SRC_COA = 0x4 - * and above RT6_LOOKUP_F_SRCPREF_xxx flags. - */ -static inline int rt6_srcprefs2flags(unsigned int srcprefs) -{ - /* No need to bitmask because srcprefs have only 3 bits. */ - return srcprefs << 3; -} - -static inline unsigned int rt6_flags2srcprefs(int flags) -{ - return (flags >> 3) & 7; -} extern void ip6_route_input(struct sk_buff *skb); diff --git a/trunk/include/net/ip6_tunnel.h b/trunk/include/net/ip6_tunnel.h index fbf9d1cda27b..83b4e008b16d 100644 --- a/trunk/include/net/ip6_tunnel.h +++ b/trunk/include/net/ip6_tunnel.h @@ -15,6 +15,7 @@ struct ip6_tnl { struct ip6_tnl *next; /* next tunnel in list */ struct net_device *dev; /* virtual device associated with tunnel */ + int recursion; /* depth of hard_start_xmit recursion */ struct ip6_tnl_parm parms; /* tunnel configuration parameters */ struct flowi fl; /* flowi template for xmit */ struct dst_entry *dst_cache; /* cached dst */ diff --git a/trunk/include/net/mac80211.h b/trunk/include/net/mac80211.h index 45d7d44d7cbe..80eb7cc42ce9 100644 --- a/trunk/include/net/mac80211.h +++ b/trunk/include/net/mac80211.h @@ -2426,8 +2426,7 @@ struct rate_control_ops { struct ieee80211_sta *sta, void *priv_sta); void (*rate_update)(void *priv, struct ieee80211_supported_band *sband, struct ieee80211_sta *sta, - void *priv_sta, u32 changed, - enum nl80211_channel_type oper_chan_type); + void *priv_sta, u32 changed); void (*free_sta)(void *priv, struct ieee80211_sta *sta, void *priv_sta); diff --git a/trunk/include/net/sock.h b/trunk/include/net/sock.h index 092b0551e77f..6cb1676e409a 100644 --- a/trunk/include/net/sock.h +++ b/trunk/include/net/sock.h @@ -253,8 +253,6 @@ struct sock { struct { struct sk_buff *head; struct sk_buff *tail; - int len; - int limit; } sk_backlog; wait_queue_head_t *sk_sleep; struct dst_entry *sk_dst_cache; @@ -591,8 +589,8 @@ static inline int sk_stream_memory_free(struct sock *sk) return sk->sk_wmem_queued < sk->sk_sndbuf; } -/* OOB backlog add */ -static inline void __sk_add_backlog(struct sock *sk, struct sk_buff *skb) +/* The per-socket spinlock must be held here. */ +static inline void sk_add_backlog(struct sock *sk, struct sk_buff *skb) { if (!sk->sk_backlog.tail) { sk->sk_backlog.head = sk->sk_backlog.tail = skb; @@ -603,17 +601,6 @@ static inline void __sk_add_backlog(struct sock *sk, struct sk_buff *skb) skb->next = NULL; } -/* The per-socket spinlock must be held here. */ -static inline __must_check int sk_add_backlog(struct sock *sk, struct sk_buff *skb) -{ - if (sk->sk_backlog.len >= max(sk->sk_backlog.limit, sk->sk_rcvbuf << 1)) - return -ENOBUFS; - - __sk_add_backlog(sk, skb); - sk->sk_backlog.len += skb->truesize; - return 0; -} - static inline int sk_backlog_rcv(struct sock *sk, struct sk_buff *skb) { return sk->sk_backlog_rcv(sk, skb); diff --git a/trunk/include/net/tcp.h b/trunk/include/net/tcp.h index 75be5a28815d..56f0aec40ed6 100644 --- a/trunk/include/net/tcp.h +++ b/trunk/include/net/tcp.h @@ -939,7 +939,7 @@ static inline int tcp_prequeue(struct sock *sk, struct sk_buff *skb) tp->ucopy.memory = 0; } else if (skb_queue_len(&tp->ucopy.prequeue) == 1) { - wake_up_interruptible_sync_poll(sk->sk_sleep, + wake_up_interruptible_poll(sk->sk_sleep, POLLIN | POLLRDNORM | POLLRDBAND); if (!inet_csk_ack_scheduled(sk)) inet_csk_reset_xmit_timer(sk, ICSK_TIME_DACK, diff --git a/trunk/include/net/xfrm.h b/trunk/include/net/xfrm.h index d74e080ba6c9..a7df3275b860 100644 --- a/trunk/include/net/xfrm.h +++ b/trunk/include/net/xfrm.h @@ -275,8 +275,7 @@ struct xfrm_policy_afinfo { struct dst_entry *dst, int nfheader_len); int (*fill_dst)(struct xfrm_dst *xdst, - struct net_device *dev, - struct flowi *fl); + struct net_device *dev); }; extern int xfrm_policy_register_afinfo(struct xfrm_policy_afinfo *afinfo); diff --git a/trunk/include/scsi/libiscsi.h b/trunk/include/scsi/libiscsi.h index ae5196aae1a5..ff92b46f5153 100644 --- a/trunk/include/scsi/libiscsi.h +++ b/trunk/include/scsi/libiscsi.h @@ -338,8 +338,7 @@ struct iscsi_host { extern int iscsi_change_queue_depth(struct scsi_device *sdev, int depth, int reason); extern int iscsi_eh_abort(struct scsi_cmnd *sc); -extern int iscsi_eh_recover_target(struct scsi_cmnd *sc); -extern int iscsi_eh_session_reset(struct scsi_cmnd *sc); +extern int iscsi_eh_target_reset(struct scsi_cmnd *sc); extern int iscsi_eh_device_reset(struct scsi_cmnd *sc); extern int iscsi_queuecommand(struct scsi_cmnd *sc, void (*done)(struct scsi_cmnd *)); diff --git a/trunk/include/trace/ftrace.h b/trunk/include/trace/ftrace.h index ea6f9d4a20e9..0804cd594803 100644 --- a/trunk/include/trace/ftrace.h +++ b/trunk/include/trace/ftrace.h @@ -401,18 +401,18 @@ static inline notrace int ftrace_get_offsets_##call( \ #undef DEFINE_EVENT #define DEFINE_EVENT(template, name, proto, args) \ \ -static void perf_trace_##name(proto); \ +static void ftrace_profile_##name(proto); \ \ static notrace int \ -perf_trace_enable_##name(struct ftrace_event_call *unused) \ +ftrace_profile_enable_##name(struct ftrace_event_call *unused) \ { \ - return register_trace_##name(perf_trace_##name); \ + return register_trace_##name(ftrace_profile_##name); \ } \ \ static notrace void \ -perf_trace_disable_##name(struct ftrace_event_call *unused) \ +ftrace_profile_disable_##name(struct ftrace_event_call *unused) \ { \ - unregister_trace_##name(perf_trace_##name); \ + unregister_trace_##name(ftrace_profile_##name); \ } #undef DEFINE_EVENT_PRINT @@ -507,12 +507,12 @@ perf_trace_disable_##name(struct ftrace_event_call *unused) \ #ifdef CONFIG_PERF_EVENTS -#define _TRACE_PERF_INIT(call) \ - .perf_event_enable = perf_trace_enable_##call, \ - .perf_event_disable = perf_trace_disable_##call, +#define _TRACE_PROFILE_INIT(call) \ + .profile_enable = ftrace_profile_enable_##call, \ + .profile_disable = ftrace_profile_disable_##call, #else -#define _TRACE_PERF_INIT(call) +#define _TRACE_PROFILE_INIT(call) #endif /* CONFIG_PERF_EVENTS */ #undef __entry @@ -638,7 +638,7 @@ __attribute__((section("_ftrace_events"))) event_##call = { \ .unregfunc = ftrace_raw_unreg_event_##call, \ .print_fmt = print_fmt_##template, \ .define_fields = ftrace_define_fields_##template, \ - _TRACE_PERF_INIT(call) \ + _TRACE_PROFILE_INIT(call) \ } #undef DEFINE_EVENT_PRINT @@ -657,18 +657,18 @@ __attribute__((section("_ftrace_events"))) event_##call = { \ .unregfunc = ftrace_raw_unreg_event_##call, \ .print_fmt = print_fmt_##call, \ .define_fields = ftrace_define_fields_##template, \ - _TRACE_PERF_INIT(call) \ + _TRACE_PROFILE_INIT(call) \ } #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) /* - * Define the insertion callback to perf events + * Define the insertion callback to profile events * * The job is very similar to ftrace_raw_event_ except that we don't * insert in the ring buffer but in a perf counter. * - * static void ftrace_perf_(proto) + * static void ftrace_profile_(proto) * { * struct ftrace_data_offsets_ __maybe_unused __data_offsets; * struct ftrace_event_call *event_call = &event_; @@ -699,9 +699,9 @@ __attribute__((section("_ftrace_events"))) event_##call = { \ * __cpu = smp_processor_id(); * * if (in_nmi()) - * trace_buf = rcu_dereference_sched(perf_trace_buf_nmi); + * trace_buf = rcu_dereference(perf_trace_buf_nmi); * else - * trace_buf = rcu_dereference_sched(perf_trace_buf); + * trace_buf = rcu_dereference(perf_trace_buf); * * if (!trace_buf) * goto end; @@ -757,14 +757,13 @@ __attribute__((section("_ftrace_events"))) event_##call = { \ #undef DECLARE_EVENT_CLASS #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \ static notrace void \ -perf_trace_templ_##call(struct ftrace_event_call *event_call, \ +ftrace_profile_templ_##call(struct ftrace_event_call *event_call, \ proto) \ { \ struct ftrace_data_offsets_##call __maybe_unused __data_offsets;\ struct ftrace_raw_##call *entry; \ u64 __addr = 0, __count = 1; \ unsigned long irq_flags; \ - struct pt_regs *__regs; \ int __entry_size; \ int __data_size; \ int rctx; \ @@ -774,10 +773,10 @@ perf_trace_templ_##call(struct ftrace_event_call *event_call, \ sizeof(u64)); \ __entry_size -= sizeof(u32); \ \ - if (WARN_ONCE(__entry_size > PERF_MAX_TRACE_SIZE, \ + if (WARN_ONCE(__entry_size > FTRACE_MAX_PROFILE_SIZE, \ "profile buffer not large enough")) \ return; \ - entry = (struct ftrace_raw_##call *)perf_trace_buf_prepare( \ + entry = (struct ftrace_raw_##call *)ftrace_perf_buf_prepare( \ __entry_size, event_call->id, &rctx, &irq_flags); \ if (!entry) \ return; \ @@ -785,20 +784,17 @@ perf_trace_templ_##call(struct ftrace_event_call *event_call, \ \ { assign; } \ \ - __regs = &__get_cpu_var(perf_trace_regs); \ - perf_fetch_caller_regs(__regs, 2); \ - \ - perf_trace_buf_submit(entry, __entry_size, rctx, __addr, \ - __count, irq_flags, __regs); \ + ftrace_perf_buf_submit(entry, __entry_size, rctx, __addr, \ + __count, irq_flags); \ } #undef DEFINE_EVENT #define DEFINE_EVENT(template, call, proto, args) \ -static notrace void perf_trace_##call(proto) \ +static notrace void ftrace_profile_##call(proto) \ { \ struct ftrace_event_call *event_call = &event_##call; \ \ - perf_trace_templ_##template(event_call, args); \ + ftrace_profile_templ_##template(event_call, args); \ } #undef DEFINE_EVENT_PRINT diff --git a/trunk/include/trace/syscall.h b/trunk/include/trace/syscall.h index e5e5f48dbfb3..0387100752f0 100644 --- a/trunk/include/trace/syscall.h +++ b/trunk/include/trace/syscall.h @@ -47,10 +47,10 @@ enum print_line_t print_syscall_exit(struct trace_iterator *iter, int flags); #endif #ifdef CONFIG_PERF_EVENTS -int perf_sysenter_enable(struct ftrace_event_call *call); -void perf_sysenter_disable(struct ftrace_event_call *call); -int perf_sysexit_enable(struct ftrace_event_call *call); -void perf_sysexit_disable(struct ftrace_event_call *call); +int prof_sysenter_enable(struct ftrace_event_call *call); +void prof_sysenter_disable(struct ftrace_event_call *call); +int prof_sysexit_enable(struct ftrace_event_call *call); +void prof_sysexit_disable(struct ftrace_event_call *call); #endif #endif /* _TRACE_SYSCALL_H */ diff --git a/trunk/kernel/exit.c b/trunk/kernel/exit.c index cce59cb5ee6a..ce1e48c2d93d 100644 --- a/trunk/kernel/exit.c +++ b/trunk/kernel/exit.c @@ -87,7 +87,7 @@ static void __exit_signal(struct task_struct *tsk) sighand = rcu_dereference_check(tsk->sighand, rcu_read_lock_held() || - lockdep_tasklist_lock_is_held()); + lockdep_is_held(&tasklist_lock)); spin_lock(&sighand->siglock); posix_cpu_timers_exit(tsk); diff --git a/trunk/kernel/fork.c b/trunk/kernel/fork.c index 4799c5f0e6d0..1beb6c303c41 100644 --- a/trunk/kernel/fork.c +++ b/trunk/kernel/fork.c @@ -86,14 +86,7 @@ int max_threads; /* tunable limit on nr_threads */ DEFINE_PER_CPU(unsigned long, process_counts) = 0; __cacheline_aligned DEFINE_RWLOCK(tasklist_lock); /* outer */ - -#ifdef CONFIG_PROVE_RCU -int lockdep_tasklist_lock_is_held(void) -{ - return lockdep_is_held(&tasklist_lock); -} -EXPORT_SYMBOL_GPL(lockdep_tasklist_lock_is_held); -#endif /* #ifdef CONFIG_PROVE_RCU */ +EXPORT_SYMBOL_GPL(tasklist_lock); int nr_processes(void) { diff --git a/trunk/kernel/hw_breakpoint.c b/trunk/kernel/hw_breakpoint.c index 03808ed342a6..967e66143e11 100644 --- a/trunk/kernel/hw_breakpoint.c +++ b/trunk/kernel/hw_breakpoint.c @@ -413,17 +413,17 @@ EXPORT_SYMBOL_GPL(unregister_hw_breakpoint); * * @return a set of per_cpu pointers to perf events */ -struct perf_event * __percpu * +struct perf_event ** register_wide_hw_breakpoint(struct perf_event_attr *attr, perf_overflow_handler_t triggered) { - struct perf_event * __percpu *cpu_events, **pevent, *bp; + struct perf_event **cpu_events, **pevent, *bp; long err; int cpu; cpu_events = alloc_percpu(typeof(*cpu_events)); if (!cpu_events) - return (void __percpu __force *)ERR_PTR(-ENOMEM); + return ERR_PTR(-ENOMEM); get_online_cpus(); for_each_online_cpu(cpu) { @@ -451,7 +451,7 @@ register_wide_hw_breakpoint(struct perf_event_attr *attr, put_online_cpus(); free_percpu(cpu_events); - return (void __percpu __force *)ERR_PTR(err); + return ERR_PTR(err); } EXPORT_SYMBOL_GPL(register_wide_hw_breakpoint); @@ -459,7 +459,7 @@ EXPORT_SYMBOL_GPL(register_wide_hw_breakpoint); * unregister_wide_hw_breakpoint - unregister a wide breakpoint in the kernel * @cpu_events: the per cpu set of events to unregister */ -void unregister_wide_hw_breakpoint(struct perf_event * __percpu *cpu_events) +void unregister_wide_hw_breakpoint(struct perf_event **cpu_events) { int cpu; struct perf_event **pevent; @@ -489,4 +489,5 @@ struct pmu perf_ops_bp = { .enable = arch_install_hw_breakpoint, .disable = arch_uninstall_hw_breakpoint, .read = hw_breakpoint_pmu_read, + .unthrottle = hw_breakpoint_pmu_unthrottle }; diff --git a/trunk/kernel/kprobes.c b/trunk/kernel/kprobes.c index 0ed46f3e51e9..fa034d29cf73 100644 --- a/trunk/kernel/kprobes.c +++ b/trunk/kernel/kprobes.c @@ -259,8 +259,7 @@ static void __kprobes __free_insn_slot(struct kprobe_insn_cache *c, struct kprobe_insn_page *kip; list_for_each_entry(kip, &c->pages, list) { - long idx = ((long)slot - (long)kip->insns) / - (c->insn_size * sizeof(kprobe_opcode_t)); + long idx = ((long)slot - (long)kip->insns) / c->insn_size; if (idx >= 0 && idx < slots_per_page(c)) { WARN_ON(kip->slot_used[idx] != SLOT_USED); if (dirty) { diff --git a/trunk/kernel/lockdep.c b/trunk/kernel/lockdep.c index c927a549db2c..0c30d0455de1 100644 --- a/trunk/kernel/lockdep.c +++ b/trunk/kernel/lockdep.c @@ -3211,6 +3211,8 @@ void lock_acquire(struct lockdep_map *lock, unsigned int subclass, { unsigned long flags; + trace_lock_acquire(lock, subclass, trylock, read, check, nest_lock, ip); + if (unlikely(current->lockdep_recursion)) return; @@ -3218,7 +3220,6 @@ void lock_acquire(struct lockdep_map *lock, unsigned int subclass, check_flags(flags); current->lockdep_recursion = 1; - trace_lock_acquire(lock, subclass, trylock, read, check, nest_lock, ip); __lock_acquire(lock, subclass, trylock, read, check, irqs_disabled_flags(flags), nest_lock, ip, 0); current->lockdep_recursion = 0; @@ -3231,13 +3232,14 @@ void lock_release(struct lockdep_map *lock, int nested, { unsigned long flags; + trace_lock_release(lock, nested, ip); + if (unlikely(current->lockdep_recursion)) return; raw_local_irq_save(flags); check_flags(flags); current->lockdep_recursion = 1; - trace_lock_release(lock, nested, ip); __lock_release(lock, nested, ip); current->lockdep_recursion = 0; raw_local_irq_restore(flags); @@ -3411,6 +3413,8 @@ void lock_contended(struct lockdep_map *lock, unsigned long ip) { unsigned long flags; + trace_lock_contended(lock, ip); + if (unlikely(!lock_stat)) return; @@ -3420,7 +3424,6 @@ void lock_contended(struct lockdep_map *lock, unsigned long ip) raw_local_irq_save(flags); check_flags(flags); current->lockdep_recursion = 1; - trace_lock_contended(lock, ip); __lock_contended(lock, ip); current->lockdep_recursion = 0; raw_local_irq_restore(flags); @@ -3819,7 +3822,6 @@ void lockdep_rcu_dereference(const char *file, const int line) printk("%s:%d invoked rcu_dereference_check() without protection!\n", file, line); printk("\nother info that might help us debug this:\n\n"); - printk("\nrcu_scheduler_active = %d, debug_locks = %d\n", rcu_scheduler_active, debug_locks); lockdep_print_held_locks(curr); printk("\nstack backtrace:\n"); dump_stack(); diff --git a/trunk/kernel/perf_event.c b/trunk/kernel/perf_event.c index 574ee58a3046..f40560b86544 100644 --- a/trunk/kernel/perf_event.c +++ b/trunk/kernel/perf_event.c @@ -56,6 +56,21 @@ static atomic_t nr_task_events __read_mostly; */ int sysctl_perf_event_paranoid __read_mostly = 1; +static inline bool perf_paranoid_tracepoint_raw(void) +{ + return sysctl_perf_event_paranoid > -1; +} + +static inline bool perf_paranoid_cpu(void) +{ + return sysctl_perf_event_paranoid > 0; +} + +static inline bool perf_paranoid_kernel(void) +{ + return sysctl_perf_event_paranoid > 1; +} + int sysctl_perf_event_mlock __read_mostly = 512; /* 'free' kb per user */ /* @@ -81,6 +96,10 @@ extern __weak const struct pmu *hw_perf_event_init(struct perf_event *event) void __weak hw_perf_disable(void) { barrier(); } void __weak hw_perf_enable(void) { barrier(); } +void __weak hw_perf_event_setup(int cpu) { barrier(); } +void __weak hw_perf_event_setup_online(int cpu) { barrier(); } +void __weak hw_perf_event_setup_offline(int cpu) { barrier(); } + int __weak hw_perf_group_sched_in(struct perf_event *group_leader, struct perf_cpu_context *cpuctx, @@ -93,15 +112,25 @@ void __weak perf_event_print_debug(void) { } static DEFINE_PER_CPU(int, perf_disable_count); +void __perf_disable(void) +{ + __get_cpu_var(perf_disable_count)++; +} + +bool __perf_enable(void) +{ + return !--__get_cpu_var(perf_disable_count); +} + void perf_disable(void) { - if (!__get_cpu_var(perf_disable_count)++) - hw_perf_disable(); + __perf_disable(); + hw_perf_disable(); } void perf_enable(void) { - if (!--__get_cpu_var(perf_disable_count)) + if (__perf_enable()) hw_perf_enable(); } @@ -1524,15 +1553,12 @@ static void perf_ctx_adjust_freq(struct perf_event_context *ctx) */ if (interrupts == MAX_INTERRUPTS) { perf_log_throttle(event, 1); - perf_disable(); event->pmu->unthrottle(event); - perf_enable(); } if (!event->attr.freq || !event->attr.sample_freq) continue; - perf_disable(); event->pmu->read(event); now = atomic64_read(&event->count); delta = now - hwc->freq_count_stamp; @@ -1540,7 +1566,6 @@ static void perf_ctx_adjust_freq(struct perf_event_context *ctx) if (delta > 0) perf_adjust_period(event, TICK_NSEC, delta); - perf_enable(); } raw_spin_unlock(&ctx->lock); } @@ -1550,6 +1575,9 @@ static void perf_ctx_adjust_freq(struct perf_event_context *ctx) */ static void rotate_ctx(struct perf_event_context *ctx) { + if (!ctx->nr_events) + return; + raw_spin_lock(&ctx->lock); /* Rotate the first entry last of non-pinned groups */ @@ -1562,28 +1590,19 @@ void perf_event_task_tick(struct task_struct *curr) { struct perf_cpu_context *cpuctx; struct perf_event_context *ctx; - int rotate = 0; if (!atomic_read(&nr_events)) return; cpuctx = &__get_cpu_var(perf_cpu_context); - if (cpuctx->ctx.nr_events && - cpuctx->ctx.nr_events != cpuctx->ctx.nr_active) - rotate = 1; - ctx = curr->perf_event_ctxp; - if (ctx && ctx->nr_events && ctx->nr_events != ctx->nr_active) - rotate = 1; + + perf_disable(); perf_ctx_adjust_freq(&cpuctx->ctx); if (ctx) perf_ctx_adjust_freq(ctx); - if (!rotate) - return; - - perf_disable(); cpu_ctx_sched_out(cpuctx, EVENT_FLEXIBLE); if (ctx) task_ctx_sched_out(ctx, EVENT_FLEXIBLE); @@ -1595,6 +1614,7 @@ void perf_event_task_tick(struct task_struct *curr) cpu_ctx_sched_in(cpuctx, EVENT_FLEXIBLE); if (ctx) task_ctx_sched_in(curr, EVENT_FLEXIBLE); + perf_enable(); } @@ -2786,13 +2806,6 @@ __weak struct perf_callchain_entry *perf_callchain(struct pt_regs *regs) return NULL; } -#ifdef CONFIG_EVENT_TRACING -__weak -void perf_arch_fetch_caller_regs(struct pt_regs *regs, unsigned long ip, int skip) -{ -} -#endif - /* * Output */ @@ -4110,7 +4123,8 @@ void __perf_sw_event(u32 event_id, u64 nr, int nmi, if (rctx < 0) return; - perf_sample_data_init(&data, addr); + data.addr = addr; + data.raw = NULL; do_perf_sw_event(PERF_TYPE_SOFTWARE, event_id, nr, nmi, &data, regs); @@ -4155,10 +4169,11 @@ static enum hrtimer_restart perf_swevent_hrtimer(struct hrtimer *hrtimer) struct perf_event *event; u64 period; - event = container_of(hrtimer, struct perf_event, hw.hrtimer); + event = container_of(hrtimer, struct perf_event, hw.hrtimer); event->pmu->read(event); - perf_sample_data_init(&data, 0); + data.addr = 0; + data.raw = NULL; data.period = event->hw.last_period; regs = get_irq_regs(); /* @@ -4320,20 +4335,26 @@ static const struct pmu perf_ops_task_clock = { #ifdef CONFIG_EVENT_TRACING void perf_tp_event(int event_id, u64 addr, u64 count, void *record, - int entry_size, struct pt_regs *regs) + int entry_size) { - struct perf_sample_data data; struct perf_raw_record raw = { .size = entry_size, .data = record, }; - perf_sample_data_init(&data, addr); - data.raw = &raw; + struct perf_sample_data data = { + .addr = addr, + .raw = &raw, + }; + + struct pt_regs *regs = get_irq_regs(); + + if (!regs) + regs = task_pt_regs(current); /* Trace events already protected against recursion */ do_perf_sw_event(PERF_TYPE_TRACEPOINT, event_id, count, 1, - &data, regs); + &data, regs); } EXPORT_SYMBOL_GPL(perf_tp_event); @@ -4349,7 +4370,7 @@ static int perf_tp_event_match(struct perf_event *event, static void tp_perf_event_destroy(struct perf_event *event) { - perf_trace_disable(event->attr.config); + ftrace_profile_disable(event->attr.config); } static const struct pmu *tp_perf_event_init(struct perf_event *event) @@ -4363,7 +4384,7 @@ static const struct pmu *tp_perf_event_init(struct perf_event *event) !capable(CAP_SYS_ADMIN)) return ERR_PTR(-EPERM); - if (perf_trace_enable(event->attr.config)) + if (ftrace_profile_enable(event->attr.config)) return NULL; event->destroy = tp_perf_event_destroy; @@ -4442,7 +4463,8 @@ void perf_bp_event(struct perf_event *bp, void *data) struct perf_sample_data sample; struct pt_regs *regs = data; - perf_sample_data_init(&sample, bp->attr.bp_addr); + sample.raw = NULL; + sample.addr = bp->attr.bp_addr; if (!perf_exclude_event(bp, regs)) perf_swevent_add(bp, 1, 1, &sample, regs); @@ -5370,26 +5392,18 @@ int perf_event_init_task(struct task_struct *child) return ret; } -static void __init perf_event_init_all_cpus(void) -{ - int cpu; - struct perf_cpu_context *cpuctx; - - for_each_possible_cpu(cpu) { - cpuctx = &per_cpu(perf_cpu_context, cpu); - __perf_event_init_context(&cpuctx->ctx, NULL); - } -} - static void __cpuinit perf_event_init_cpu(int cpu) { struct perf_cpu_context *cpuctx; cpuctx = &per_cpu(perf_cpu_context, cpu); + __perf_event_init_context(&cpuctx->ctx, NULL); spin_lock(&perf_resource_lock); cpuctx->max_pertask = perf_max_events - perf_reserved_percpu; spin_unlock(&perf_resource_lock); + + hw_perf_event_setup(cpu); } #ifdef CONFIG_HOTPLUG_CPU @@ -5429,11 +5443,20 @@ perf_cpu_notify(struct notifier_block *self, unsigned long action, void *hcpu) perf_event_init_cpu(cpu); break; + case CPU_ONLINE: + case CPU_ONLINE_FROZEN: + hw_perf_event_setup_online(cpu); + break; + case CPU_DOWN_PREPARE: case CPU_DOWN_PREPARE_FROZEN: perf_event_exit_cpu(cpu); break; + case CPU_DEAD: + hw_perf_event_setup_offline(cpu); + break; + default: break; } @@ -5451,7 +5474,6 @@ static struct notifier_block __cpuinitdata perf_cpu_nb = { void __init perf_event_init(void) { - perf_event_init_all_cpus(); perf_cpu_notify(&perf_cpu_nb, (unsigned long)CPU_UP_PREPARE, (void *)(long)smp_processor_id()); perf_cpu_notify(&perf_cpu_nb, (unsigned long)CPU_ONLINE, diff --git a/trunk/kernel/pid.c b/trunk/kernel/pid.c index aebb30d9c233..86b296943e5f 100644 --- a/trunk/kernel/pid.c +++ b/trunk/kernel/pid.c @@ -367,9 +367,7 @@ struct task_struct *pid_task(struct pid *pid, enum pid_type type) struct task_struct *result = NULL; if (pid) { struct hlist_node *first; - first = rcu_dereference_check(pid->tasks[type].first, - rcu_read_lock_held() || - lockdep_tasklist_lock_is_held()); + first = rcu_dereference_check(pid->tasks[type].first, rcu_read_lock_held() || lockdep_is_held(&tasklist_lock)); if (first) result = hlist_entry(first, struct task_struct, pids[(type)].node); } diff --git a/trunk/kernel/rcutree.h b/trunk/kernel/rcutree.h index 4a525a30e08e..1439eb504c22 100644 --- a/trunk/kernel/rcutree.h +++ b/trunk/kernel/rcutree.h @@ -246,21 +246,12 @@ struct rcu_data { #define RCU_JIFFIES_TILL_FORCE_QS 3 /* for rsp->jiffies_force_qs */ #ifdef CONFIG_RCU_CPU_STALL_DETECTOR - -#ifdef CONFIG_PROVE_RCU -#define RCU_STALL_DELAY_DELTA (5 * HZ) -#else -#define RCU_STALL_DELAY_DELTA 0 -#endif - -#define RCU_SECONDS_TILL_STALL_CHECK (10 * HZ + RCU_STALL_DELAY_DELTA) - /* for rsp->jiffies_stall */ -#define RCU_SECONDS_TILL_STALL_RECHECK (30 * HZ + RCU_STALL_DELAY_DELTA) - /* for rsp->jiffies_stall */ -#define RCU_STALL_RAT_DELAY 2 /* Allow other CPUs time */ - /* to take at least one */ - /* scheduling clock irq */ - /* before ratting on them. */ +#define RCU_SECONDS_TILL_STALL_CHECK (10 * HZ) /* for rsp->jiffies_stall */ +#define RCU_SECONDS_TILL_STALL_RECHECK (30 * HZ) /* for rsp->jiffies_stall */ +#define RCU_STALL_RAT_DELAY 2 /* Allow other CPUs time */ + /* to take at least one */ + /* scheduling clock irq */ + /* before ratting on them. */ #endif /* #ifdef CONFIG_RCU_CPU_STALL_DETECTOR */ diff --git a/trunk/kernel/rcutree_plugin.h b/trunk/kernel/rcutree_plugin.h index 79b53bda8943..464ad2cdee00 100644 --- a/trunk/kernel/rcutree_plugin.h +++ b/trunk/kernel/rcutree_plugin.h @@ -1010,10 +1010,6 @@ int rcu_needs_cpu(int cpu) int c = 0; int thatcpu; - /* Check for being in the holdoff period. */ - if (per_cpu(rcu_dyntick_holdoff, cpu) == jiffies) - return rcu_needs_cpu_quick_check(cpu); - /* Don't bother unless we are the last non-dyntick-idle CPU. */ for_each_cpu_not(thatcpu, nohz_cpu_mask) if (thatcpu != cpu) { @@ -1045,8 +1041,10 @@ int rcu_needs_cpu(int cpu) } /* If RCU callbacks are still pending, RCU still needs this CPU. */ - if (c) + if (c) { raise_softirq(RCU_SOFTIRQ); + per_cpu(rcu_dyntick_holdoff, cpu) = jiffies; + } return c; } diff --git a/trunk/kernel/sched.c b/trunk/kernel/sched.c index 9ab3cd7858d3..150b6988de49 100644 --- a/trunk/kernel/sched.c +++ b/trunk/kernel/sched.c @@ -2359,7 +2359,7 @@ static int try_to_wake_up(struct task_struct *p, unsigned int state, { int cpu, orig_cpu, this_cpu, success = 0; unsigned long flags; - struct rq *rq; + struct rq *rq, *orig_rq; if (!sched_feat(SYNC_WAKEUPS)) wake_flags &= ~WF_SYNC; @@ -2367,7 +2367,7 @@ static int try_to_wake_up(struct task_struct *p, unsigned int state, this_cpu = get_cpu(); smp_wmb(); - rq = task_rq_lock(p, &flags); + rq = orig_rq = task_rq_lock(p, &flags); update_rq_clock(rq); if (!(p->state & state)) goto out; diff --git a/trunk/kernel/sched_fair.c b/trunk/kernel/sched_fair.c index 5a5ea2cd924f..3e1fd96c6cf9 100644 --- a/trunk/kernel/sched_fair.c +++ b/trunk/kernel/sched_fair.c @@ -3476,7 +3476,7 @@ static void run_rebalance_domains(struct softirq_action *h) static inline int on_null_domain(int cpu) { - return !rcu_dereference_sched(cpu_rq(cpu)->sd); + return !rcu_dereference(cpu_rq(cpu)->sd); } /* diff --git a/trunk/kernel/sched_rt.c b/trunk/kernel/sched_rt.c index b5b920ae2ea7..5a6ed1f0990a 100644 --- a/trunk/kernel/sched_rt.c +++ b/trunk/kernel/sched_rt.c @@ -1146,12 +1146,7 @@ static struct task_struct *pick_next_highest_task_rt(struct rq *rq, int cpu) if (next && next->prio < idx) continue; list_for_each_entry(rt_se, array->queue + idx, run_list) { - struct task_struct *p; - - if (!rt_entity_is_task(rt_se)) - continue; - - p = rt_task_of(rt_se); + struct task_struct *p = rt_task_of(rt_se); if (pick_rt_task(rq, p, cpu)) { next = p; break; diff --git a/trunk/kernel/trace/Makefile b/trunk/kernel/trace/Makefile index 78edc6490038..d00c6fe23f54 100644 --- a/trunk/kernel/trace/Makefile +++ b/trunk/kernel/trace/Makefile @@ -52,7 +52,7 @@ obj-$(CONFIG_EVENT_TRACING) += trace_events.o obj-$(CONFIG_EVENT_TRACING) += trace_export.o obj-$(CONFIG_FTRACE_SYSCALLS) += trace_syscalls.o ifeq ($(CONFIG_PERF_EVENTS),y) -obj-$(CONFIG_EVENT_TRACING) += trace_event_perf.o +obj-$(CONFIG_EVENT_TRACING) += trace_event_profile.o endif obj-$(CONFIG_EVENT_TRACING) += trace_events_filter.o obj-$(CONFIG_KPROBE_EVENT) += trace_kprobe.o diff --git a/trunk/kernel/trace/ftrace.c b/trunk/kernel/trace/ftrace.c index d9062f5cc0c0..83783579378f 100644 --- a/trunk/kernel/trace/ftrace.c +++ b/trunk/kernel/trace/ftrace.c @@ -27,7 +27,6 @@ #include #include #include -#include #include @@ -85,22 +84,22 @@ ftrace_func_t ftrace_trace_function __read_mostly = ftrace_stub; ftrace_func_t __ftrace_trace_function __read_mostly = ftrace_stub; ftrace_func_t ftrace_pid_function __read_mostly = ftrace_stub; -/* - * Traverse the ftrace_list, invoking all entries. The reason that we - * can use rcu_dereference_raw() is that elements removed from this list - * are simply leaked, so there is no need to interact with a grace-period - * mechanism. The rcu_dereference_raw() calls are needed to handle - * concurrent insertions into the ftrace_list. - * - * Silly Alpha and silly pointer-speculation compiler optimizations! - */ +#ifdef CONFIG_FUNCTION_GRAPH_TRACER +static int ftrace_set_func(unsigned long *array, int *idx, char *buffer); +#endif + static void ftrace_list_func(unsigned long ip, unsigned long parent_ip) { - struct ftrace_ops *op = rcu_dereference_raw(ftrace_list); /*see above*/ + struct ftrace_ops *op = ftrace_list; + + /* in case someone actually ports this to alpha! */ + read_barrier_depends(); while (op != &ftrace_list_end) { + /* silly alpha */ + read_barrier_depends(); op->func(ip, parent_ip); - op = rcu_dereference_raw(op->next); /*see above*/ + op = op->next; }; } @@ -155,7 +154,8 @@ static int __register_ftrace_function(struct ftrace_ops *ops) * the ops->next pointer is valid before another CPU sees * the ops pointer included into the ftrace_list. */ - rcu_assign_pointer(ftrace_list, ops); + smp_wmb(); + ftrace_list = ops; if (ftrace_enabled) { ftrace_func_t func; @@ -2276,8 +2276,6 @@ __setup("ftrace_filter=", set_ftrace_filter); #ifdef CONFIG_FUNCTION_GRAPH_TRACER static char ftrace_graph_buf[FTRACE_FILTER_SIZE] __initdata; -static int ftrace_set_func(unsigned long *array, int *idx, char *buffer); - static int __init set_graph_function(char *str) { strlcpy(ftrace_graph_buf, str, FTRACE_FILTER_SIZE); @@ -3353,7 +3351,6 @@ void ftrace_graph_init_task(struct task_struct *t) { /* Make sure we do not use the parent ret_stack */ t->ret_stack = NULL; - t->curr_ret_stack = -1; if (ftrace_graph_active) { struct ftrace_ret_stack *ret_stack; @@ -3363,6 +3360,7 @@ void ftrace_graph_init_task(struct task_struct *t) GFP_KERNEL); if (!ret_stack) return; + t->curr_ret_stack = -1; atomic_set(&t->tracing_graph_pause, 0); atomic_set(&t->trace_overrun, 0); t->ftrace_timestamp = 0; diff --git a/trunk/kernel/trace/ring_buffer.c b/trunk/kernel/trace/ring_buffer.c index 05a9f83b8819..a2f0fe951831 100644 --- a/trunk/kernel/trace/ring_buffer.c +++ b/trunk/kernel/trace/ring_buffer.c @@ -2233,12 +2233,12 @@ ring_buffer_lock_reserve(struct ring_buffer *buffer, unsigned long length) if (ring_buffer_flags != RB_BUFFERS_ON) return NULL; + if (atomic_read(&buffer->record_disabled)) + return NULL; + /* If we are tracing schedule, we don't want to recurse */ resched = ftrace_preempt_disable(); - if (atomic_read(&buffer->record_disabled)) - goto out_nocheck; - if (trace_recursive_lock()) goto out_nocheck; @@ -2470,10 +2470,10 @@ int ring_buffer_write(struct ring_buffer *buffer, if (ring_buffer_flags != RB_BUFFERS_ON) return -EBUSY; - resched = ftrace_preempt_disable(); - if (atomic_read(&buffer->record_disabled)) - goto out; + return -EBUSY; + + resched = ftrace_preempt_disable(); cpu = raw_smp_processor_id(); diff --git a/trunk/kernel/trace/trace.c b/trunk/kernel/trace/trace.c index 3ec2ee6f6560..ed01fdba4a55 100644 --- a/trunk/kernel/trace/trace.c +++ b/trunk/kernel/trace/trace.c @@ -374,21 +374,6 @@ static int __init set_buf_size(char *str) } __setup("trace_buf_size=", set_buf_size); -static int __init set_tracing_thresh(char *str) -{ - unsigned long threshhold; - int ret; - - if (!str) - return 0; - ret = strict_strtoul(str, 0, &threshhold); - if (ret < 0) - return 0; - tracing_thresh = threshhold * 1000; - return 1; -} -__setup("tracing_thresh=", set_tracing_thresh); - unsigned long nsecs_to_usecs(unsigned long nsecs) { return nsecs / 1000; @@ -594,10 +579,9 @@ static ssize_t trace_seq_to_buffer(struct trace_seq *s, void *buf, size_t cnt) static arch_spinlock_t ftrace_max_lock = (arch_spinlock_t)__ARCH_SPIN_LOCK_UNLOCKED; -unsigned long __read_mostly tracing_thresh; - #ifdef CONFIG_TRACER_MAX_TRACE unsigned long __read_mostly tracing_max_latency; +unsigned long __read_mostly tracing_thresh; /* * Copy the new maximum trace into the separate maximum-trace @@ -608,7 +592,7 @@ static void __update_max_tr(struct trace_array *tr, struct task_struct *tsk, int cpu) { struct trace_array_cpu *data = tr->data[cpu]; - struct trace_array_cpu *max_data; + struct trace_array_cpu *max_data = tr->data[cpu]; max_tr.cpu = cpu; max_tr.time_start = data->preempt_timestamp; @@ -618,7 +602,7 @@ __update_max_tr(struct trace_array *tr, struct task_struct *tsk, int cpu) max_data->critical_start = data->critical_start; max_data->critical_end = data->critical_end; - memcpy(max_data->comm, tsk->comm, TASK_COMM_LEN); + memcpy(data->comm, tsk->comm, TASK_COMM_LEN); max_data->pid = tsk->pid; max_data->uid = task_uid(tsk); max_data->nice = tsk->static_prio - 20 - MAX_RT_PRIO; @@ -840,10 +824,10 @@ void unregister_tracer(struct tracer *type) mutex_unlock(&trace_types_lock); } -static void __tracing_reset(struct ring_buffer *buffer, int cpu) +static void __tracing_reset(struct trace_array *tr, int cpu) { ftrace_disable_cpu(); - ring_buffer_reset_cpu(buffer, cpu); + ring_buffer_reset_cpu(tr->buffer, cpu); ftrace_enable_cpu(); } @@ -855,7 +839,7 @@ void tracing_reset(struct trace_array *tr, int cpu) /* Make sure all commits have finished */ synchronize_sched(); - __tracing_reset(buffer, cpu); + __tracing_reset(tr, cpu); ring_buffer_record_enable(buffer); } @@ -873,7 +857,7 @@ void tracing_reset_online_cpus(struct trace_array *tr) tr->time_start = ftrace_now(tr->cpu); for_each_online_cpu(cpu) - __tracing_reset(buffer, cpu); + __tracing_reset(tr, cpu); ring_buffer_record_enable(buffer); } @@ -950,8 +934,6 @@ void tracing_start(void) goto out; } - /* Prevent the buffers from switching */ - arch_spin_lock(&ftrace_max_lock); buffer = global_trace.buffer; if (buffer) @@ -961,8 +943,6 @@ void tracing_start(void) if (buffer) ring_buffer_record_enable(buffer); - arch_spin_unlock(&ftrace_max_lock); - ftrace_start(); out: spin_unlock_irqrestore(&tracing_start_lock, flags); @@ -984,9 +964,6 @@ void tracing_stop(void) if (trace_stop_count++) goto out; - /* Prevent the buffers from switching */ - arch_spin_lock(&ftrace_max_lock); - buffer = global_trace.buffer; if (buffer) ring_buffer_record_disable(buffer); @@ -995,8 +972,6 @@ void tracing_stop(void) if (buffer) ring_buffer_record_disable(buffer); - arch_spin_unlock(&ftrace_max_lock); - out: spin_unlock_irqrestore(&tracing_start_lock, flags); } @@ -1284,13 +1259,6 @@ ftrace_trace_userstack(struct ring_buffer *buffer, unsigned long flags, int pc) if (!(trace_flags & TRACE_ITER_USERSTACKTRACE)) return; - /* - * NMIs can not handle page faults, even with fix ups. - * The save user stack can (and often does) fault. - */ - if (unlikely(in_nmi())) - return; - event = trace_buffer_lock_reserve(buffer, TRACE_USER_STACK, sizeof(*entry), flags, pc); if (!event) @@ -1735,7 +1703,6 @@ static void *s_start(struct seq_file *m, loff_t *pos) ftrace_enable_cpu(); - iter->leftover = 0; for (p = iter; p && l < *pos; p = s_next(m, p, &l)) ; @@ -4281,10 +4248,10 @@ static __init int tracer_init_debugfs(void) #ifdef CONFIG_TRACER_MAX_TRACE trace_create_file("tracing_max_latency", 0644, d_tracer, &tracing_max_latency, &tracing_max_lat_fops); -#endif trace_create_file("tracing_thresh", 0644, d_tracer, &tracing_thresh, &tracing_max_lat_fops); +#endif trace_create_file("README", 0444, d_tracer, NULL, &tracing_readme_fops); diff --git a/trunk/kernel/trace/trace.h b/trunk/kernel/trace/trace.h index 2825ef2c0b15..09b39112a5e2 100644 --- a/trunk/kernel/trace/trace.h +++ b/trunk/kernel/trace/trace.h @@ -396,10 +396,9 @@ extern int process_new_ksym_entry(char *ksymname, int op, unsigned long addr); extern unsigned long nsecs_to_usecs(unsigned long nsecs); -extern unsigned long tracing_thresh; - #ifdef CONFIG_TRACER_MAX_TRACE extern unsigned long tracing_max_latency; +extern unsigned long tracing_thresh; void update_max_tr(struct trace_array *tr, struct task_struct *tsk, int cpu); void update_max_tr_single(struct trace_array *tr, diff --git a/trunk/kernel/trace/trace_clock.c b/trunk/kernel/trace/trace_clock.c index 6fbfb8f417b9..84a3a7ba072a 100644 --- a/trunk/kernel/trace/trace_clock.c +++ b/trunk/kernel/trace/trace_clock.c @@ -13,7 +13,6 @@ * Tracer plugins will chose a default from these clocks. */ #include -#include #include #include #include diff --git a/trunk/kernel/trace/trace_event_perf.c b/trunk/kernel/trace/trace_event_profile.c similarity index 65% rename from trunk/kernel/trace/trace_event_perf.c rename to trunk/kernel/trace/trace_event_profile.c index 81f691eb3a30..f0d693005075 100644 --- a/trunk/kernel/trace/trace_event_perf.c +++ b/trunk/kernel/trace/trace_event_profile.c @@ -1,36 +1,32 @@ /* - * trace event based perf event profiling/tracing + * trace event based perf counter profiling * * Copyright (C) 2009 Red Hat Inc, Peter Zijlstra - * Copyright (C) 2009-2010 Frederic Weisbecker + * */ #include #include #include "trace.h" -DEFINE_PER_CPU(struct pt_regs, perf_trace_regs); -EXPORT_PER_CPU_SYMBOL_GPL(perf_trace_regs); - -EXPORT_SYMBOL_GPL(perf_arch_fetch_caller_regs); static char *perf_trace_buf; static char *perf_trace_buf_nmi; -typedef typeof(char [PERF_MAX_TRACE_SIZE]) perf_trace_t ; +typedef typeof(char [FTRACE_MAX_PROFILE_SIZE]) perf_trace_t ; /* Count the events in use (per event id, not per instance) */ -static int total_ref_count; +static int total_profile_count; -static int perf_trace_event_enable(struct ftrace_event_call *event) +static int ftrace_profile_enable_event(struct ftrace_event_call *event) { char *buf; int ret = -ENOMEM; - if (event->perf_refcount++ > 0) + if (event->profile_count++ > 0) return 0; - if (!total_ref_count) { + if (!total_profile_count) { buf = (char *)alloc_percpu(perf_trace_t); if (!buf) goto fail_buf; @@ -44,35 +40,35 @@ static int perf_trace_event_enable(struct ftrace_event_call *event) rcu_assign_pointer(perf_trace_buf_nmi, buf); } - ret = event->perf_event_enable(event); + ret = event->profile_enable(event); if (!ret) { - total_ref_count++; + total_profile_count++; return 0; } fail_buf_nmi: - if (!total_ref_count) { + if (!total_profile_count) { free_percpu(perf_trace_buf_nmi); free_percpu(perf_trace_buf); perf_trace_buf_nmi = NULL; perf_trace_buf = NULL; } fail_buf: - event->perf_refcount--; + event->profile_count--; return ret; } -int perf_trace_enable(int event_id) +int ftrace_profile_enable(int event_id) { struct ftrace_event_call *event; int ret = -EINVAL; mutex_lock(&event_mutex); list_for_each_entry(event, &ftrace_events, list) { - if (event->id == event_id && event->perf_event_enable && + if (event->id == event_id && event->profile_enable && try_module_get(event->mod)) { - ret = perf_trace_event_enable(event); + ret = ftrace_profile_enable_event(event); break; } } @@ -81,16 +77,16 @@ int perf_trace_enable(int event_id) return ret; } -static void perf_trace_event_disable(struct ftrace_event_call *event) +static void ftrace_profile_disable_event(struct ftrace_event_call *event) { char *buf, *nmi_buf; - if (--event->perf_refcount > 0) + if (--event->profile_count > 0) return; - event->perf_event_disable(event); + event->profile_disable(event); - if (!--total_ref_count) { + if (!--total_profile_count) { buf = perf_trace_buf; rcu_assign_pointer(perf_trace_buf, NULL); @@ -108,14 +104,14 @@ static void perf_trace_event_disable(struct ftrace_event_call *event) } } -void perf_trace_disable(int event_id) +void ftrace_profile_disable(int event_id) { struct ftrace_event_call *event; mutex_lock(&event_mutex); list_for_each_entry(event, &ftrace_events, list) { if (event->id == event_id) { - perf_trace_event_disable(event); + ftrace_profile_disable_event(event); module_put(event->mod); break; } @@ -123,8 +119,8 @@ void perf_trace_disable(int event_id) mutex_unlock(&event_mutex); } -__kprobes void *perf_trace_buf_prepare(int size, unsigned short type, - int *rctxp, unsigned long *irq_flags) +__kprobes void *ftrace_perf_buf_prepare(int size, unsigned short type, + int *rctxp, unsigned long *irq_flags) { struct trace_entry *entry; char *trace_buf, *raw_data; @@ -142,9 +138,9 @@ __kprobes void *perf_trace_buf_prepare(int size, unsigned short type, cpu = smp_processor_id(); if (in_nmi()) - trace_buf = rcu_dereference_sched(perf_trace_buf_nmi); + trace_buf = rcu_dereference(perf_trace_buf_nmi); else - trace_buf = rcu_dereference_sched(perf_trace_buf); + trace_buf = rcu_dereference(perf_trace_buf); if (!trace_buf) goto err; @@ -165,4 +161,4 @@ __kprobes void *perf_trace_buf_prepare(int size, unsigned short type, local_irq_restore(*irq_flags); return NULL; } -EXPORT_SYMBOL_GPL(perf_trace_buf_prepare); +EXPORT_SYMBOL_GPL(ftrace_perf_buf_prepare); diff --git a/trunk/kernel/trace/trace_events.c b/trunk/kernel/trace/trace_events.c index beab8bf2f310..3f972ad98d04 100644 --- a/trunk/kernel/trace/trace_events.c +++ b/trunk/kernel/trace/trace_events.c @@ -938,7 +938,7 @@ event_create_dir(struct ftrace_event_call *call, struct dentry *d_events, trace_create_file("enable", 0644, call->dir, call, enable); - if (call->id && call->perf_event_enable) + if (call->id && call->profile_enable) trace_create_file("id", 0444, call->dir, call, id); diff --git a/trunk/kernel/trace/trace_functions_graph.c b/trunk/kernel/trace/trace_functions_graph.c index e6989d9b44da..3fc2a575664f 100644 --- a/trunk/kernel/trace/trace_functions_graph.c +++ b/trunk/kernel/trace/trace_functions_graph.c @@ -237,14 +237,6 @@ int trace_graph_entry(struct ftrace_graph_ent *trace) return ret; } -int trace_graph_thresh_entry(struct ftrace_graph_ent *trace) -{ - if (tracing_thresh) - return 1; - else - return trace_graph_entry(trace); -} - static void __trace_graph_return(struct trace_array *tr, struct ftrace_graph_ret *trace, unsigned long flags, @@ -298,26 +290,13 @@ void set_graph_array(struct trace_array *tr) smp_mb(); } -void trace_graph_thresh_return(struct ftrace_graph_ret *trace) -{ - if (tracing_thresh && - (trace->rettime - trace->calltime < tracing_thresh)) - return; - else - trace_graph_return(trace); -} - static int graph_trace_init(struct trace_array *tr) { int ret; set_graph_array(tr); - if (tracing_thresh) - ret = register_ftrace_graph(&trace_graph_thresh_return, - &trace_graph_thresh_entry); - else - ret = register_ftrace_graph(&trace_graph_return, - &trace_graph_entry); + ret = register_ftrace_graph(&trace_graph_return, + &trace_graph_entry); if (ret) return ret; tracing_start_cmdline_record(); @@ -941,7 +920,7 @@ print_graph_return(struct ftrace_graph_ret *trace, struct trace_seq *s, if (!ret) return TRACE_TYPE_PARTIAL_LINE; } else { - ret = trace_seq_printf(s, "} /* %ps */\n", (void *)trace->func); + ret = trace_seq_printf(s, "} (%ps)\n", (void *)trace->func); if (!ret) return TRACE_TYPE_PARTIAL_LINE; } diff --git a/trunk/kernel/trace/trace_kprobe.c b/trunk/kernel/trace/trace_kprobe.c index 1251e367bae9..505c92273b1a 100644 --- a/trunk/kernel/trace/trace_kprobe.c +++ b/trunk/kernel/trace/trace_kprobe.c @@ -1214,7 +1214,7 @@ static int set_print_fmt(struct trace_probe *tp) #ifdef CONFIG_PERF_EVENTS /* Kprobe profile handler */ -static __kprobes void kprobe_perf_func(struct kprobe *kp, +static __kprobes void kprobe_profile_func(struct kprobe *kp, struct pt_regs *regs) { struct trace_probe *tp = container_of(kp, struct trace_probe, rp.kp); @@ -1227,11 +1227,11 @@ static __kprobes void kprobe_perf_func(struct kprobe *kp, __size = SIZEOF_KPROBE_TRACE_ENTRY(tp->nr_args); size = ALIGN(__size + sizeof(u32), sizeof(u64)); size -= sizeof(u32); - if (WARN_ONCE(size > PERF_MAX_TRACE_SIZE, + if (WARN_ONCE(size > FTRACE_MAX_PROFILE_SIZE, "profile buffer not large enough")) return; - entry = perf_trace_buf_prepare(size, call->id, &rctx, &irq_flags); + entry = ftrace_perf_buf_prepare(size, call->id, &rctx, &irq_flags); if (!entry) return; @@ -1240,11 +1240,11 @@ static __kprobes void kprobe_perf_func(struct kprobe *kp, for (i = 0; i < tp->nr_args; i++) entry->args[i] = call_fetch(&tp->args[i].fetch, regs); - perf_trace_buf_submit(entry, size, rctx, entry->ip, 1, irq_flags, regs); + ftrace_perf_buf_submit(entry, size, rctx, entry->ip, 1, irq_flags); } /* Kretprobe profile handler */ -static __kprobes void kretprobe_perf_func(struct kretprobe_instance *ri, +static __kprobes void kretprobe_profile_func(struct kretprobe_instance *ri, struct pt_regs *regs) { struct trace_probe *tp = container_of(ri->rp, struct trace_probe, rp); @@ -1257,11 +1257,11 @@ static __kprobes void kretprobe_perf_func(struct kretprobe_instance *ri, __size = SIZEOF_KRETPROBE_TRACE_ENTRY(tp->nr_args); size = ALIGN(__size + sizeof(u32), sizeof(u64)); size -= sizeof(u32); - if (WARN_ONCE(size > PERF_MAX_TRACE_SIZE, + if (WARN_ONCE(size > FTRACE_MAX_PROFILE_SIZE, "profile buffer not large enough")) return; - entry = perf_trace_buf_prepare(size, call->id, &rctx, &irq_flags); + entry = ftrace_perf_buf_prepare(size, call->id, &rctx, &irq_flags); if (!entry) return; @@ -1271,11 +1271,10 @@ static __kprobes void kretprobe_perf_func(struct kretprobe_instance *ri, for (i = 0; i < tp->nr_args; i++) entry->args[i] = call_fetch(&tp->args[i].fetch, regs); - perf_trace_buf_submit(entry, size, rctx, entry->ret_ip, 1, - irq_flags, regs); + ftrace_perf_buf_submit(entry, size, rctx, entry->ret_ip, 1, irq_flags); } -static int probe_perf_enable(struct ftrace_event_call *call) +static int probe_profile_enable(struct ftrace_event_call *call) { struct trace_probe *tp = (struct trace_probe *)call->data; @@ -1287,7 +1286,7 @@ static int probe_perf_enable(struct ftrace_event_call *call) return enable_kprobe(&tp->rp.kp); } -static void probe_perf_disable(struct ftrace_event_call *call) +static void probe_profile_disable(struct ftrace_event_call *call) { struct trace_probe *tp = (struct trace_probe *)call->data; @@ -1312,7 +1311,7 @@ int kprobe_dispatcher(struct kprobe *kp, struct pt_regs *regs) kprobe_trace_func(kp, regs); #ifdef CONFIG_PERF_EVENTS if (tp->flags & TP_FLAG_PROFILE) - kprobe_perf_func(kp, regs); + kprobe_profile_func(kp, regs); #endif return 0; /* We don't tweek kernel, so just return 0 */ } @@ -1326,7 +1325,7 @@ int kretprobe_dispatcher(struct kretprobe_instance *ri, struct pt_regs *regs) kretprobe_trace_func(ri, regs); #ifdef CONFIG_PERF_EVENTS if (tp->flags & TP_FLAG_PROFILE) - kretprobe_perf_func(ri, regs); + kretprobe_profile_func(ri, regs); #endif return 0; /* We don't tweek kernel, so just return 0 */ } @@ -1359,8 +1358,8 @@ static int register_probe_event(struct trace_probe *tp) call->unregfunc = probe_event_disable; #ifdef CONFIG_PERF_EVENTS - call->perf_event_enable = probe_perf_enable; - call->perf_event_disable = probe_perf_disable; + call->profile_enable = probe_profile_enable; + call->profile_disable = probe_profile_disable; #endif call->data = tp; ret = trace_add_event_call(call); diff --git a/trunk/kernel/trace/trace_syscalls.c b/trunk/kernel/trace/trace_syscalls.c index 33c2a5b769dc..cba47d7935cc 100644 --- a/trunk/kernel/trace/trace_syscalls.c +++ b/trunk/kernel/trace/trace_syscalls.c @@ -428,12 +428,12 @@ core_initcall(init_ftrace_syscalls); #ifdef CONFIG_PERF_EVENTS -static DECLARE_BITMAP(enabled_perf_enter_syscalls, NR_syscalls); -static DECLARE_BITMAP(enabled_perf_exit_syscalls, NR_syscalls); -static int sys_perf_refcount_enter; -static int sys_perf_refcount_exit; +static DECLARE_BITMAP(enabled_prof_enter_syscalls, NR_syscalls); +static DECLARE_BITMAP(enabled_prof_exit_syscalls, NR_syscalls); +static int sys_prof_refcount_enter; +static int sys_prof_refcount_exit; -static void perf_syscall_enter(struct pt_regs *regs, long id) +static void prof_syscall_enter(struct pt_regs *regs, long id) { struct syscall_metadata *sys_data; struct syscall_trace_enter *rec; @@ -443,7 +443,7 @@ static void perf_syscall_enter(struct pt_regs *regs, long id) int size; syscall_nr = syscall_get_nr(current, regs); - if (!test_bit(syscall_nr, enabled_perf_enter_syscalls)) + if (!test_bit(syscall_nr, enabled_prof_enter_syscalls)) return; sys_data = syscall_nr_to_meta(syscall_nr); @@ -455,11 +455,11 @@ static void perf_syscall_enter(struct pt_regs *regs, long id) size = ALIGN(size + sizeof(u32), sizeof(u64)); size -= sizeof(u32); - if (WARN_ONCE(size > PERF_MAX_TRACE_SIZE, - "perf buffer not large enough")) + if (WARN_ONCE(size > FTRACE_MAX_PROFILE_SIZE, + "profile buffer not large enough")) return; - rec = (struct syscall_trace_enter *)perf_trace_buf_prepare(size, + rec = (struct syscall_trace_enter *)ftrace_perf_buf_prepare(size, sys_data->enter_event->id, &rctx, &flags); if (!rec) return; @@ -467,10 +467,10 @@ static void perf_syscall_enter(struct pt_regs *regs, long id) rec->nr = syscall_nr; syscall_get_arguments(current, regs, 0, sys_data->nb_args, (unsigned long *)&rec->args); - perf_trace_buf_submit(rec, size, rctx, 0, 1, flags, regs); + ftrace_perf_buf_submit(rec, size, rctx, 0, 1, flags); } -int perf_sysenter_enable(struct ftrace_event_call *call) +int prof_sysenter_enable(struct ftrace_event_call *call) { int ret = 0; int num; @@ -478,34 +478,34 @@ int perf_sysenter_enable(struct ftrace_event_call *call) num = ((struct syscall_metadata *)call->data)->syscall_nr; mutex_lock(&syscall_trace_lock); - if (!sys_perf_refcount_enter) - ret = register_trace_sys_enter(perf_syscall_enter); + if (!sys_prof_refcount_enter) + ret = register_trace_sys_enter(prof_syscall_enter); if (ret) { pr_info("event trace: Could not activate" "syscall entry trace point"); } else { - set_bit(num, enabled_perf_enter_syscalls); - sys_perf_refcount_enter++; + set_bit(num, enabled_prof_enter_syscalls); + sys_prof_refcount_enter++; } mutex_unlock(&syscall_trace_lock); return ret; } -void perf_sysenter_disable(struct ftrace_event_call *call) +void prof_sysenter_disable(struct ftrace_event_call *call) { int num; num = ((struct syscall_metadata *)call->data)->syscall_nr; mutex_lock(&syscall_trace_lock); - sys_perf_refcount_enter--; - clear_bit(num, enabled_perf_enter_syscalls); - if (!sys_perf_refcount_enter) - unregister_trace_sys_enter(perf_syscall_enter); + sys_prof_refcount_enter--; + clear_bit(num, enabled_prof_enter_syscalls); + if (!sys_prof_refcount_enter) + unregister_trace_sys_enter(prof_syscall_enter); mutex_unlock(&syscall_trace_lock); } -static void perf_syscall_exit(struct pt_regs *regs, long ret) +static void prof_syscall_exit(struct pt_regs *regs, long ret) { struct syscall_metadata *sys_data; struct syscall_trace_exit *rec; @@ -515,7 +515,7 @@ static void perf_syscall_exit(struct pt_regs *regs, long ret) int size; syscall_nr = syscall_get_nr(current, regs); - if (!test_bit(syscall_nr, enabled_perf_exit_syscalls)) + if (!test_bit(syscall_nr, enabled_prof_exit_syscalls)) return; sys_data = syscall_nr_to_meta(syscall_nr); @@ -530,11 +530,11 @@ static void perf_syscall_exit(struct pt_regs *regs, long ret) * Impossible, but be paranoid with the future * How to put this check outside runtime? */ - if (WARN_ONCE(size > PERF_MAX_TRACE_SIZE, - "exit event has grown above perf buffer size")) + if (WARN_ONCE(size > FTRACE_MAX_PROFILE_SIZE, + "exit event has grown above profile buffer size")) return; - rec = (struct syscall_trace_exit *)perf_trace_buf_prepare(size, + rec = (struct syscall_trace_exit *)ftrace_perf_buf_prepare(size, sys_data->exit_event->id, &rctx, &flags); if (!rec) return; @@ -542,10 +542,10 @@ static void perf_syscall_exit(struct pt_regs *regs, long ret) rec->nr = syscall_nr; rec->ret = syscall_get_return_value(current, regs); - perf_trace_buf_submit(rec, size, rctx, 0, 1, flags, regs); + ftrace_perf_buf_submit(rec, size, rctx, 0, 1, flags); } -int perf_sysexit_enable(struct ftrace_event_call *call) +int prof_sysexit_enable(struct ftrace_event_call *call) { int ret = 0; int num; @@ -553,30 +553,30 @@ int perf_sysexit_enable(struct ftrace_event_call *call) num = ((struct syscall_metadata *)call->data)->syscall_nr; mutex_lock(&syscall_trace_lock); - if (!sys_perf_refcount_exit) - ret = register_trace_sys_exit(perf_syscall_exit); + if (!sys_prof_refcount_exit) + ret = register_trace_sys_exit(prof_syscall_exit); if (ret) { pr_info("event trace: Could not activate" "syscall exit trace point"); } else { - set_bit(num, enabled_perf_exit_syscalls); - sys_perf_refcount_exit++; + set_bit(num, enabled_prof_exit_syscalls); + sys_prof_refcount_exit++; } mutex_unlock(&syscall_trace_lock); return ret; } -void perf_sysexit_disable(struct ftrace_event_call *call) +void prof_sysexit_disable(struct ftrace_event_call *call) { int num; num = ((struct syscall_metadata *)call->data)->syscall_nr; mutex_lock(&syscall_trace_lock); - sys_perf_refcount_exit--; - clear_bit(num, enabled_perf_exit_syscalls); - if (!sys_perf_refcount_exit) - unregister_trace_sys_exit(perf_syscall_exit); + sys_prof_refcount_exit--; + clear_bit(num, enabled_prof_exit_syscalls); + if (!sys_prof_refcount_exit) + unregister_trace_sys_exit(prof_syscall_exit); mutex_unlock(&syscall_trace_lock); } diff --git a/trunk/lib/Kconfig.debug b/trunk/lib/Kconfig.debug index 8e5ec5e1ab91..b520ec1f33c5 100644 --- a/trunk/lib/Kconfig.debug +++ b/trunk/lib/Kconfig.debug @@ -532,14 +532,6 @@ config LOCK_STAT For more details, see Documentation/lockstat.txt - This also enables lock events required by "perf lock", - subcommand of perf. - If you want to use "perf lock", you also need to turn on - CONFIG_EVENT_TRACING. - - CONFIG_LOCK_STAT defines "contended" and "acquired" lock events. - (CONFIG_LOCKDEP defines "acquire" and "release" events.) - config DEBUG_LOCKDEP bool "Lock dependency engine debugging" depends on DEBUG_KERNEL && LOCKDEP diff --git a/trunk/lib/vsprintf.c b/trunk/lib/vsprintf.c index 24112e5a5780..0d461c7c14db 100644 --- a/trunk/lib/vsprintf.c +++ b/trunk/lib/vsprintf.c @@ -609,12 +609,6 @@ static char *resource_string(char *buf, char *end, struct resource *res, .precision = -1, .flags = SPECIAL | SMALL | ZEROPAD, }; - static const struct printf_spec bus_spec = { - .base = 16, - .field_width = 2, - .precision = -1, - .flags = SMALL | ZEROPAD, - }; static const struct printf_spec dec_spec = { .base = 10, .precision = -1, @@ -635,7 +629,7 @@ static char *resource_string(char *buf, char *end, struct resource *res, * 64-bit res (sizeof==8): 20 chars in dec, 18 in hex ("0x" + 16) */ #define RSRC_BUF_SIZE ((2 * sizeof(resource_size_t)) + 4) #define FLAG_BUF_SIZE (2 * sizeof(res->flags)) -#define DECODED_BUF_SIZE sizeof("[mem - 64bit pref window disabled]") +#define DECODED_BUF_SIZE sizeof("[mem - 64bit pref disabled]") #define RAW_BUF_SIZE sizeof("[mem - flags 0x]") char sym[max(2*RSRC_BUF_SIZE + DECODED_BUF_SIZE, 2*RSRC_BUF_SIZE + FLAG_BUF_SIZE + RAW_BUF_SIZE)]; @@ -657,9 +651,6 @@ static char *resource_string(char *buf, char *end, struct resource *res, } else if (res->flags & IORESOURCE_DMA) { p = string(p, pend, "dma ", str_spec); specp = &dec_spec; - } else if (res->flags & IORESOURCE_BUS) { - p = string(p, pend, "bus ", str_spec); - specp = &bus_spec; } else { p = string(p, pend, "??? ", str_spec); specp = &mem_spec; @@ -675,8 +666,6 @@ static char *resource_string(char *buf, char *end, struct resource *res, p = string(p, pend, " 64bit", str_spec); if (res->flags & IORESOURCE_PREFETCH) p = string(p, pend, " pref", str_spec); - if (res->flags & IORESOURCE_WINDOW) - p = string(p, pend, " window", str_spec); if (res->flags & IORESOURCE_DISABLED) p = string(p, pend, " disabled", str_spec); } else { diff --git a/trunk/mm/mempolicy.c b/trunk/mm/mempolicy.c index 643f66e10187..bda230e52acd 100644 --- a/trunk/mm/mempolicy.c +++ b/trunk/mm/mempolicy.c @@ -1756,12 +1756,10 @@ struct mempolicy *__mpol_dup(struct mempolicy *old) if (!new) return ERR_PTR(-ENOMEM); - rcu_read_lock(); if (current_cpuset_is_being_rebound()) { nodemask_t mems = cpuset_mems_allowed(current); mpol_rebind_policy(old, &mems); } - rcu_read_unlock(); *new = *old; atomic_set(&new->refcnt, 1); return new; diff --git a/trunk/mm/page_cgroup.c b/trunk/mm/page_cgroup.c index 6c0081441a32..3dd88539a0e6 100644 --- a/trunk/mm/page_cgroup.c +++ b/trunk/mm/page_cgroup.c @@ -284,7 +284,6 @@ static DEFINE_MUTEX(swap_cgroup_mutex); struct swap_cgroup_ctrl { struct page **map; unsigned long length; - spinlock_t lock; }; struct swap_cgroup_ctrl swap_cgroup_ctrl[MAX_SWAPFILES]; @@ -354,22 +353,16 @@ unsigned short swap_cgroup_cmpxchg(swp_entry_t ent, struct swap_cgroup_ctrl *ctrl; struct page *mappage; struct swap_cgroup *sc; - unsigned long flags; - unsigned short retval; ctrl = &swap_cgroup_ctrl[type]; mappage = ctrl->map[idx]; sc = page_address(mappage); sc += pos; - spin_lock_irqsave(&ctrl->lock, flags); - retval = sc->id; - if (retval == old) - sc->id = new; + if (cmpxchg(&sc->id, old, new) == old) + return old; else - retval = 0; - spin_unlock_irqrestore(&ctrl->lock, flags); - return retval; + return 0; } /** @@ -390,17 +383,13 @@ unsigned short swap_cgroup_record(swp_entry_t ent, unsigned short id) struct page *mappage; struct swap_cgroup *sc; unsigned short old; - unsigned long flags; ctrl = &swap_cgroup_ctrl[type]; mappage = ctrl->map[idx]; sc = page_address(mappage); sc += pos; - spin_lock_irqsave(&ctrl->lock, flags); - old = sc->id; - sc->id = id; - spin_unlock_irqrestore(&ctrl->lock, flags); + old = xchg(&sc->id, id); return old; } @@ -452,7 +441,6 @@ int swap_cgroup_swapon(int type, unsigned long max_pages) mutex_lock(&swap_cgroup_mutex); ctrl->length = length; ctrl->map = array; - spin_lock_init(&ctrl->lock); if (swap_cgroup_prepare(type)) { /* memory shortage */ ctrl->map = NULL; diff --git a/trunk/net/9p/client.c b/trunk/net/9p/client.c index e3e5bf4469ce..bde9f3d38c57 100644 --- a/trunk/net/9p/client.c +++ b/trunk/net/9p/client.c @@ -60,7 +60,7 @@ static const match_table_t tokens = { inline int p9_is_proto_dotl(struct p9_client *clnt) { - return (clnt->proto_version == p9_proto_2000L); + return (clnt->proto_version == p9_proto_2010L); } EXPORT_SYMBOL(p9_is_proto_dotl); @@ -80,9 +80,9 @@ static unsigned char get_protocol_version(const substring_t *name) } else if (!strncmp("9p2000.u", name->from, name->to-name->from)) { version = p9_proto_2000u; P9_DPRINTK(P9_DEBUG_9P, "Protocol version: 9P2000.u\n"); - } else if (!strncmp("9p2000.L", name->from, name->to-name->from)) { - version = p9_proto_2000L; - P9_DPRINTK(P9_DEBUG_9P, "Protocol version: 9P2000.L\n"); + } else if (!strncmp("9p2010.L", name->from, name->to-name->from)) { + version = p9_proto_2010L; + P9_DPRINTK(P9_DEBUG_9P, "Protocol version: 9P2010.L\n"); } else { P9_DPRINTK(P9_DEBUG_ERROR, "Unknown protocol version %s. ", name->from); @@ -672,9 +672,9 @@ int p9_client_version(struct p9_client *c) c->msize, c->proto_version); switch (c->proto_version) { - case p9_proto_2000L: + case p9_proto_2010L: req = p9_client_rpc(c, P9_TVERSION, "ds", - c->msize, "9P2000.L"); + c->msize, "9P2010.L"); break; case p9_proto_2000u: req = p9_client_rpc(c, P9_TVERSION, "ds", @@ -700,8 +700,8 @@ int p9_client_version(struct p9_client *c) } P9_DPRINTK(P9_DEBUG_9P, "<<< RVERSION msize %d %s\n", msize, version); - if (!strncmp(version, "9P2000.L", 8)) - c->proto_version = p9_proto_2000L; + if (!strncmp(version, "9P2010.L", 8)) + c->proto_version = p9_proto_2010L; else if (!strncmp(version, "9P2000.u", 8)) c->proto_version = p9_proto_2000u; else if (!strncmp(version, "9P2000", 6)) diff --git a/trunk/net/9p/trans_virtio.c b/trunk/net/9p/trans_virtio.c index afde1a89fbb3..0aaed4819379 100644 --- a/trunk/net/9p/trans_virtio.c +++ b/trunk/net/9p/trans_virtio.c @@ -78,12 +78,6 @@ struct virtio_chan { /* Scatterlist: can be too big for stack. */ struct scatterlist sg[VIRTQUEUE_NUM]; - int tag_len; - /* - * tag name to identify a mount Non-null terminated - */ - char *tag; - struct list_head chan_list; }; @@ -220,20 +214,6 @@ p9_virtio_request(struct p9_client *client, struct p9_req_t *req) return 0; } -static ssize_t p9_mount_tag_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct virtio_chan *chan; - struct virtio_device *vdev; - - vdev = dev_to_virtio(dev); - chan = vdev->priv; - - return snprintf(buf, chan->tag_len + 1, "%s", chan->tag); -} - -static DEVICE_ATTR(mount_tag, 0444, p9_mount_tag_show, NULL); - /** * p9_virtio_probe - probe for existence of 9P virtio channels * @vdev: virtio device to probe @@ -244,8 +224,6 @@ static DEVICE_ATTR(mount_tag, 0444, p9_mount_tag_show, NULL); static int p9_virtio_probe(struct virtio_device *vdev) { - __u16 tag_len; - char *tag; int err; struct virtio_chan *chan; @@ -270,28 +248,6 @@ static int p9_virtio_probe(struct virtio_device *vdev) sg_init_table(chan->sg, VIRTQUEUE_NUM); chan->inuse = false; - if (virtio_has_feature(vdev, VIRTIO_9P_MOUNT_TAG)) { - vdev->config->get(vdev, - offsetof(struct virtio_9p_config, tag_len), - &tag_len, sizeof(tag_len)); - } else { - err = -EINVAL; - goto out_free_vq; - } - tag = kmalloc(tag_len, GFP_KERNEL); - if (!tag) { - err = -ENOMEM; - goto out_free_vq; - } - vdev->config->get(vdev, offsetof(struct virtio_9p_config, tag), - tag, tag_len); - chan->tag = tag; - chan->tag_len = tag_len; - err = sysfs_create_file(&(vdev->dev.kobj), &dev_attr_mount_tag.attr); - if (err) { - kfree(tag); - goto out_free_vq; - } mutex_lock(&virtio_9p_lock); list_add_tail(&chan->chan_list, &virtio_chan_list); mutex_unlock(&virtio_9p_lock); @@ -328,7 +284,7 @@ p9_virtio_create(struct p9_client *client, const char *devname, char *args) mutex_lock(&virtio_9p_lock); list_for_each_entry(chan, &virtio_chan_list, chan_list) { - if (!strncmp(devname, chan->tag, chan->tag_len)) { + if (!strcmp(devname, dev_name(&chan->vdev->dev))) { if (!chan->inuse) { chan->inuse = true; found = 1; @@ -367,8 +323,6 @@ static void p9_virtio_remove(struct virtio_device *vdev) mutex_lock(&virtio_9p_lock); list_del(&chan->chan_list); mutex_unlock(&virtio_9p_lock); - sysfs_remove_file(&(vdev->dev.kobj), &dev_attr_mount_tag.attr); - kfree(chan->tag); kfree(chan); } @@ -378,19 +332,13 @@ static struct virtio_device_id id_table[] = { { 0 }, }; -static unsigned int features[] = { - VIRTIO_9P_MOUNT_TAG, -}; - /* The standard "struct lguest_driver": */ static struct virtio_driver p9_virtio_drv = { - .feature_table = features, - .feature_table_size = ARRAY_SIZE(features), - .driver.name = KBUILD_MODNAME, - .driver.owner = THIS_MODULE, - .id_table = id_table, - .probe = p9_virtio_probe, - .remove = p9_virtio_remove, + .driver.name = KBUILD_MODNAME, + .driver.owner = THIS_MODULE, + .id_table = id_table, + .probe = p9_virtio_probe, + .remove = p9_virtio_remove, }; static struct p9_trans_module p9_virtio_trans = { diff --git a/trunk/net/bluetooth/hci_sysfs.c b/trunk/net/bluetooth/hci_sysfs.c index cafb55b0cea5..1a79a6c7e30e 100644 --- a/trunk/net/bluetooth/hci_sysfs.c +++ b/trunk/net/bluetooth/hci_sysfs.c @@ -3,7 +3,6 @@ #include #include #include -#include #include #include @@ -406,11 +405,20 @@ static struct device_type bt_host = { .release = bt_host_release, }; -static int inquiry_cache_show(struct seq_file *f, void *p) +static int inquiry_cache_open(struct inode *inode, struct file *file) +{ + file->private_data = inode->i_private; + return 0; +} + +static ssize_t inquiry_cache_read(struct file *file, char __user *userbuf, + size_t count, loff_t *ppos) { - struct hci_dev *hdev = f->private; + struct hci_dev *hdev = file->private_data; struct inquiry_cache *cache = &hdev->inq_cache; struct inquiry_entry *e; + char buf[4096]; + int n = 0; hci_dev_lock_bh(hdev); @@ -418,30 +426,23 @@ static int inquiry_cache_show(struct seq_file *f, void *p) struct inquiry_data *data = &e->data; bdaddr_t bdaddr; baswap(&bdaddr, &data->bdaddr); - seq_printf(f, "%s %d %d %d 0x%.2x%.2x%.2x 0x%.4x %d %d %u\n", - batostr(&bdaddr), - data->pscan_rep_mode, data->pscan_period_mode, - data->pscan_mode, data->dev_class[2], - data->dev_class[1], data->dev_class[0], - __le16_to_cpu(data->clock_offset), - data->rssi, data->ssp_mode, e->timestamp); + n += sprintf(buf + n, "%s %d %d %d 0x%.2x%.2x%.2x 0x%.4x %d %d %u\n", + batostr(&bdaddr), + data->pscan_rep_mode, data->pscan_period_mode, + data->pscan_mode, data->dev_class[2], + data->dev_class[1], data->dev_class[0], + __le16_to_cpu(data->clock_offset), + data->rssi, data->ssp_mode, e->timestamp); } hci_dev_unlock_bh(hdev); - return 0; -} - -static int inquiry_cache_open(struct inode *inode, struct file *file) -{ - return single_open(file, inquiry_cache_show, inode->i_private); + return simple_read_from_buffer(userbuf, count, ppos, buf, n); } static const struct file_operations inquiry_cache_fops = { - .open = inquiry_cache_open, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, + .open = inquiry_cache_open, + .read = inquiry_cache_read, }; int hci_register_sysfs(struct hci_dev *hdev) diff --git a/trunk/net/bridge/Kconfig b/trunk/net/bridge/Kconfig index d115d5cea5b6..19a6b9629c51 100644 --- a/trunk/net/bridge/Kconfig +++ b/trunk/net/bridge/Kconfig @@ -35,7 +35,6 @@ config BRIDGE config BRIDGE_IGMP_SNOOPING bool "IGMP snooping" depends on BRIDGE - depends on INET default y ---help--- If you say Y here, then the Ethernet bridge will be able selectively diff --git a/trunk/net/bridge/br_device.c b/trunk/net/bridge/br_device.c index 90a9024e5c1e..eb7062d2e9e5 100644 --- a/trunk/net/bridge/br_device.c +++ b/trunk/net/bridge/br_device.c @@ -40,7 +40,7 @@ netdev_tx_t br_dev_xmit(struct sk_buff *skb, struct net_device *dev) goto out; mdst = br_mdb_get(br, skb); - if (mdst || BR_INPUT_SKB_CB_MROUTERS_ONLY(skb)) + if (mdst || BR_INPUT_SKB_CB(skb)->mrouters_only) br_multicast_deliver(mdst, skb); else br_flood_deliver(br, skb); diff --git a/trunk/net/bridge/br_forward.c b/trunk/net/bridge/br_forward.c index 8dbec83e50ca..d61e6f741125 100644 --- a/trunk/net/bridge/br_forward.c +++ b/trunk/net/bridge/br_forward.c @@ -19,11 +19,6 @@ #include #include "br_private.h" -static int deliver_clone(const struct net_bridge_port *prev, - struct sk_buff *skb, - void (*__packet_hook)(const struct net_bridge_port *p, - struct sk_buff *skb)); - /* Don't forward packets to originating port or forwarding diasabled */ static inline int should_deliver(const struct net_bridge_port *p, const struct sk_buff *skb) @@ -99,22 +94,17 @@ void br_deliver(const struct net_bridge_port *to, struct sk_buff *skb) } /* called with rcu_read_lock */ -void br_forward(const struct net_bridge_port *to, struct sk_buff *skb, struct sk_buff *skb0) +void br_forward(const struct net_bridge_port *to, struct sk_buff *skb) { if (should_deliver(to, skb)) { - if (skb0) - deliver_clone(to, skb, __br_forward); - else - __br_forward(to, skb); + __br_forward(to, skb); return; } - if (!skb0) - kfree_skb(skb); + kfree_skb(skb); } -static int deliver_clone(const struct net_bridge_port *prev, - struct sk_buff *skb, +static int deliver_clone(struct net_bridge_port *prev, struct sk_buff *skb, void (*__packet_hook)(const struct net_bridge_port *p, struct sk_buff *skb)) { diff --git a/trunk/net/bridge/br_input.c b/trunk/net/bridge/br_input.c index d74d570fc848..53b39851d87d 100644 --- a/trunk/net/bridge/br_input.c +++ b/trunk/net/bridge/br_input.c @@ -70,7 +70,7 @@ int br_handle_frame_finish(struct sk_buff *skb) if (is_multicast_ether_addr(dest)) { mdst = br_mdb_get(br, skb); - if (mdst || BR_INPUT_SKB_CB_MROUTERS_ONLY(skb)) { + if (mdst || BR_INPUT_SKB_CB(skb)->mrouters_only) { if ((mdst && !hlist_unhashed(&mdst->mglist)) || br_multicast_is_router(br)) skb2 = skb; @@ -90,7 +90,7 @@ int br_handle_frame_finish(struct sk_buff *skb) if (skb) { if (dst) - br_forward(dst->dst, skb, skb2); + br_forward(dst->dst, skb); else br_flood_forward(br, skb, skb2); } diff --git a/trunk/net/bridge/br_multicast.c b/trunk/net/bridge/br_multicast.c index 6980625537ca..2559fb539836 100644 --- a/trunk/net/bridge/br_multicast.c +++ b/trunk/net/bridge/br_multicast.c @@ -38,7 +38,7 @@ static struct net_bridge_mdb_entry *__br_mdb_ip_get( struct net_bridge_mdb_entry *mp; struct hlist_node *p; - hlist_for_each_entry_rcu(mp, p, &mdb->mhash[hash], hlist[mdb->ver]) { + hlist_for_each_entry(mp, p, &mdb->mhash[hash], hlist[mdb->ver]) { if (dst == mp->addr) return mp; } @@ -49,23 +49,22 @@ static struct net_bridge_mdb_entry *__br_mdb_ip_get( static struct net_bridge_mdb_entry *br_mdb_ip_get( struct net_bridge_mdb_htable *mdb, __be32 dst) { - if (!mdb) - return NULL; - return __br_mdb_ip_get(mdb, dst, br_ip_hash(mdb, dst)); } struct net_bridge_mdb_entry *br_mdb_get(struct net_bridge *br, struct sk_buff *skb) { - if (br->multicast_disabled) + struct net_bridge_mdb_htable *mdb = br->mdb; + + if (!mdb || br->multicast_disabled) return NULL; switch (skb->protocol) { case htons(ETH_P_IP): if (BR_INPUT_SKB_CB(skb)->igmp) break; - return br_mdb_ip_get(br->mdb, ip_hdr(skb)->daddr); + return br_mdb_ip_get(mdb, ip_hdr(skb)->daddr); } return NULL; @@ -628,8 +627,8 @@ static void br_multicast_port_query_expired(unsigned long data) struct net_bridge *br = port->br; spin_lock(&br->multicast_lock); - if (port->state == BR_STATE_DISABLED || - port->state == BR_STATE_BLOCKING) + if (port && (port->state == BR_STATE_DISABLED || + port->state == BR_STATE_BLOCKING)) goto out; if (port->multicast_startup_queries_sent < @@ -824,7 +823,6 @@ static int br_multicast_query(struct net_bridge *br, unsigned long max_delay; unsigned long now = jiffies; __be32 group; - int err = 0; spin_lock(&br->multicast_lock); if (!netif_running(br->dev) || @@ -843,17 +841,15 @@ static int br_multicast_query(struct net_bridge *br, group = 0; } } else { - if (!pskb_may_pull(skb, sizeof(struct igmpv3_query))) { - err = -EINVAL; - goto out; - } + if (!pskb_may_pull(skb, sizeof(struct igmpv3_query))) + return -EINVAL; ih3 = igmpv3_query_hdr(skb); if (ih3->nsrcs) - goto out; + return 0; - max_delay = ih3->code ? - IGMPV3_MRC(ih3->code) * (HZ / IGMP_TIMER_SCALE) : 1; + max_delay = ih3->code ? 1 : + IGMPV3_MRC(ih3->code) * (HZ / IGMP_TIMER_SCALE); } if (!group) @@ -880,7 +876,7 @@ static int br_multicast_query(struct net_bridge *br, out: spin_unlock(&br->multicast_lock); - return err; + return 0; } static void br_multicast_leave_group(struct net_bridge *br, @@ -991,7 +987,7 @@ static int br_multicast_ipv4_rcv(struct net_bridge *br, err = pskb_trim_rcsum(skb2, len); if (err) - goto err_out; + return err; } len -= ip_hdrlen(skb2); @@ -1013,7 +1009,7 @@ static int br_multicast_ipv4_rcv(struct net_bridge *br, case CHECKSUM_NONE: skb2->csum = 0; if (skb_checksum_complete(skb2)) - goto out; + return -EINVAL; } err = 0; @@ -1040,7 +1036,6 @@ static int br_multicast_ipv4_rcv(struct net_bridge *br, out: __skb_push(skb2, offset); -err_out: if (skb2 != skb) kfree_skb(skb2); return err; @@ -1140,7 +1135,7 @@ void br_multicast_stop(struct net_bridge *br) if (mdb->old) { spin_unlock_bh(&br->multicast_lock); - rcu_barrier_bh(); + synchronize_rcu_bh(); spin_lock_bh(&br->multicast_lock); WARN_ON(mdb->old); } diff --git a/trunk/net/bridge/br_private.h b/trunk/net/bridge/br_private.h index 846d7d1e2075..fef0384e3c0b 100644 --- a/trunk/net/bridge/br_private.h +++ b/trunk/net/bridge/br_private.h @@ -206,20 +206,12 @@ struct net_bridge struct br_input_skb_cb { struct net_device *brdev; -#ifdef CONFIG_BRIDGE_IGMP_SNOOPING int igmp; int mrouters_only; -#endif }; #define BR_INPUT_SKB_CB(__skb) ((struct br_input_skb_cb *)(__skb)->cb) -#ifdef CONFIG_BRIDGE_IGMP_SNOOPING -# define BR_INPUT_SKB_CB_MROUTERS_ONLY(__skb) (BR_INPUT_SKB_CB(__skb)->mrouters_only) -#else -# define BR_INPUT_SKB_CB_MROUTERS_ONLY(__skb) (0) -#endif - extern struct notifier_block br_device_notifier; extern const u8 br_group_address[ETH_ALEN]; @@ -260,7 +252,7 @@ extern void br_deliver(const struct net_bridge_port *to, struct sk_buff *skb); extern int br_dev_queue_push_xmit(struct sk_buff *skb); extern void br_forward(const struct net_bridge_port *to, - struct sk_buff *skb, struct sk_buff *skb0); + struct sk_buff *skb); extern int br_forward_finish(struct sk_buff *skb); extern void br_flood_deliver(struct net_bridge *br, struct sk_buff *skb); extern void br_flood_forward(struct net_bridge *br, struct sk_buff *skb, diff --git a/trunk/net/core/dev_mcast.c b/trunk/net/core/dev_mcast.c index 3dc295beb483..fd91569e2394 100644 --- a/trunk/net/core/dev_mcast.c +++ b/trunk/net/core/dev_mcast.c @@ -97,9 +97,8 @@ int dev_mc_add(struct net_device *dev, void *addr, int alen, int glbl) netif_addr_lock_bh(dev); if (alen != dev->addr_len) - err = -EINVAL; - else - err = __dev_addr_add(&dev->mc_list, &dev->mc_count, addr, alen, glbl); + return -EINVAL; + err = __dev_addr_add(&dev->mc_list, &dev->mc_count, addr, alen, glbl); if (!err) __dev_set_rx_mode(dev); netif_addr_unlock_bh(dev); diff --git a/trunk/net/core/ethtool.c b/trunk/net/core/ethtool.c index f4cb6b6299d9..0f2f82185ec4 100644 --- a/trunk/net/core/ethtool.c +++ b/trunk/net/core/ethtool.c @@ -17,7 +17,6 @@ #include #include #include -#include #include /* @@ -200,7 +199,10 @@ static int ethtool_set_settings(struct net_device *dev, void __user *useraddr) return dev->ethtool_ops->set_settings(dev, &cmd); } -static noinline_for_stack int ethtool_get_drvinfo(struct net_device *dev, void __user *useraddr) +/* + * noinline attribute so that gcc doesnt use too much stack in dev_ethtool() + */ +static noinline int ethtool_get_drvinfo(struct net_device *dev, void __user *useraddr) { struct ethtool_drvinfo info; const struct ethtool_ops *ops = dev->ethtool_ops; @@ -212,10 +214,6 @@ static noinline_for_stack int ethtool_get_drvinfo(struct net_device *dev, void _ info.cmd = ETHTOOL_GDRVINFO; ops->get_drvinfo(dev, &info); - /* - * this method of obtaining string set info is deprecated; - * Use ETHTOOL_GSSET_INFO instead. - */ if (ops->get_sset_count) { int rc; @@ -239,67 +237,10 @@ static noinline_for_stack int ethtool_get_drvinfo(struct net_device *dev, void _ return 0; } -static noinline_for_stack int ethtool_get_sset_info(struct net_device *dev, - void __user *useraddr) -{ - struct ethtool_sset_info info; - const struct ethtool_ops *ops = dev->ethtool_ops; - u64 sset_mask; - int i, idx = 0, n_bits = 0, ret, rc; - u32 *info_buf = NULL; - - if (!ops->get_sset_count) - return -EOPNOTSUPP; - - if (copy_from_user(&info, useraddr, sizeof(info))) - return -EFAULT; - - /* store copy of mask, because we zero struct later on */ - sset_mask = info.sset_mask; - if (!sset_mask) - return 0; - - /* calculate size of return buffer */ - n_bits = hweight64(sset_mask); - - memset(&info, 0, sizeof(info)); - info.cmd = ETHTOOL_GSSET_INFO; - - info_buf = kzalloc(n_bits * sizeof(u32), GFP_USER); - if (!info_buf) - return -ENOMEM; - - /* - * fill return buffer based on input bitmask and successful - * get_sset_count return - */ - for (i = 0; i < 64; i++) { - if (!(sset_mask & (1ULL << i))) - continue; - - rc = ops->get_sset_count(dev, i); - if (rc >= 0) { - info.sset_mask |= (1ULL << i); - info_buf[idx++] = rc; - } - } - - ret = -EFAULT; - if (copy_to_user(useraddr, &info, sizeof(info))) - goto out; - - useraddr += offsetof(struct ethtool_sset_info, data); - if (copy_to_user(useraddr, info_buf, idx * sizeof(u32))) - goto out; - - ret = 0; - -out: - kfree(info_buf); - return ret; -} - -static noinline_for_stack int ethtool_set_rxnfc(struct net_device *dev, void __user *useraddr) +/* + * noinline attribute so that gcc doesnt use too much stack in dev_ethtool() + */ +static noinline int ethtool_set_rxnfc(struct net_device *dev, void __user *useraddr) { struct ethtool_rxnfc cmd; @@ -312,7 +253,10 @@ static noinline_for_stack int ethtool_set_rxnfc(struct net_device *dev, void __u return dev->ethtool_ops->set_rxnfc(dev, &cmd); } -static noinline_for_stack int ethtool_get_rxnfc(struct net_device *dev, void __user *useraddr) +/* + * noinline attribute so that gcc doesnt use too much stack in dev_ethtool() + */ +static noinline int ethtool_get_rxnfc(struct net_device *dev, void __user *useraddr) { struct ethtool_rxnfc info; const struct ethtool_ops *ops = dev->ethtool_ops; @@ -384,7 +328,10 @@ static void __rx_ntuple_filter_add(struct ethtool_rx_ntuple_list *list, list->count++; } -static noinline_for_stack int ethtool_set_rx_ntuple(struct net_device *dev, void __user *useraddr) +/* + * noinline attribute so that gcc doesnt use too much stack in dev_ethtool() + */ +static noinline int ethtool_set_rx_ntuple(struct net_device *dev, void __user *useraddr) { struct ethtool_rx_ntuple cmd; const struct ethtool_ops *ops = dev->ethtool_ops; @@ -852,7 +799,10 @@ static int ethtool_set_eeprom(struct net_device *dev, void __user *useraddr) return ret; } -static noinline_for_stack int ethtool_get_coalesce(struct net_device *dev, void __user *useraddr) +/* + * noinline attribute so that gcc doesnt use too much stack in dev_ethtool() + */ +static noinline int ethtool_get_coalesce(struct net_device *dev, void __user *useraddr) { struct ethtool_coalesce coalesce = { .cmd = ETHTOOL_GCOALESCE }; @@ -866,7 +816,10 @@ static noinline_for_stack int ethtool_get_coalesce(struct net_device *dev, void return 0; } -static noinline_for_stack int ethtool_set_coalesce(struct net_device *dev, void __user *useraddr) +/* + * noinline attribute so that gcc doesnt use too much stack in dev_ethtool() + */ +static noinline int ethtool_set_coalesce(struct net_device *dev, void __user *useraddr) { struct ethtool_coalesce coalesce; @@ -1276,7 +1229,10 @@ static int ethtool_set_value(struct net_device *dev, char __user *useraddr, return actor(dev, edata.data); } -static noinline_for_stack int ethtool_flash_device(struct net_device *dev, char __user *useraddr) +/* + * noinline attribute so that gcc doesnt use too much stack in dev_ethtool() + */ +static noinline int ethtool_flash_device(struct net_device *dev, char __user *useraddr) { struct ethtool_flash efl; @@ -1515,9 +1471,6 @@ int dev_ethtool(struct net *net, struct ifreq *ifr) case ETHTOOL_GRXNTUPLE: rc = ethtool_get_rx_ntuple(dev, useraddr); break; - case ETHTOOL_GSSET_INFO: - rc = ethtool_get_sset_info(dev, useraddr); - break; default: rc = -EOPNOTSUPP; } diff --git a/trunk/net/core/neighbour.c b/trunk/net/core/neighbour.c index 6cee6434da67..d102f6d9abdc 100644 --- a/trunk/net/core/neighbour.c +++ b/trunk/net/core/neighbour.c @@ -771,8 +771,6 @@ static __inline__ int neigh_max_probes(struct neighbour *n) } static void neigh_invalidate(struct neighbour *neigh) - __releases(neigh->lock) - __acquires(neigh->lock) { struct sk_buff *skb; diff --git a/trunk/net/core/netpoll.c b/trunk/net/core/netpoll.c index d4ec38fa64e6..7aa697253765 100644 --- a/trunk/net/core/netpoll.c +++ b/trunk/net/core/netpoll.c @@ -735,7 +735,7 @@ int netpoll_setup(struct netpoll *np) npinfo = kmalloc(sizeof(*npinfo), GFP_KERNEL); if (!npinfo) { err = -ENOMEM; - goto put; + goto release; } npinfo->rx_flags = 0; @@ -845,7 +845,7 @@ int netpoll_setup(struct netpoll *np) kfree(npinfo); } -put: + dev_put(ndev); return err; } diff --git a/trunk/net/core/sock.c b/trunk/net/core/sock.c index c5812bbc2cc9..fcd397a762ff 100644 --- a/trunk/net/core/sock.c +++ b/trunk/net/core/sock.c @@ -340,12 +340,8 @@ int sk_receive_skb(struct sock *sk, struct sk_buff *skb, const int nested) rc = sk_backlog_rcv(sk, skb); mutex_release(&sk->sk_lock.dep_map, 1, _RET_IP_); - } else if (sk_add_backlog(sk, skb)) { - bh_unlock_sock(sk); - atomic_inc(&sk->sk_drops); - goto discard_and_relse; - } - + } else + sk_add_backlog(sk, skb); bh_unlock_sock(sk); out: sock_put(sk); @@ -1143,7 +1139,6 @@ struct sock *sk_clone(const struct sock *sk, const gfp_t priority) sock_lock_init(newsk); bh_lock_sock(newsk); newsk->sk_backlog.head = newsk->sk_backlog.tail = NULL; - newsk->sk_backlog.len = 0; atomic_set(&newsk->sk_rmem_alloc, 0); /* @@ -1547,12 +1542,6 @@ static void __release_sock(struct sock *sk) bh_lock_sock(sk); } while ((skb = sk->sk_backlog.head) != NULL); - - /* - * Doing the zeroing here guarantee we can not loop forever - * while a wild producer attempts to flood us. - */ - sk->sk_backlog.len = 0; } /** @@ -1885,7 +1874,6 @@ void sock_init_data(struct socket *sock, struct sock *sk) sk->sk_allocation = GFP_KERNEL; sk->sk_rcvbuf = sysctl_rmem_default; sk->sk_sndbuf = sysctl_wmem_default; - sk->sk_backlog.limit = sk->sk_rcvbuf << 1; sk->sk_state = TCP_CLOSE; sk_set_socket(sk, sock); @@ -2288,8 +2276,7 @@ int proto_register(struct proto *prot, int alloc_slab) prot->rsk_prot->slab = NULL; } out_free_request_sock_slab_name: - if (prot->rsk_prot) - kfree(prot->rsk_prot->slab_name); + kfree(prot->rsk_prot->slab_name); out_free_sock_slab: kmem_cache_destroy(prot->slab); prot->slab = NULL; diff --git a/trunk/net/dccp/ipv4.c b/trunk/net/dccp/ipv4.c index 4071eaf2b361..b195c4feaa0a 100644 --- a/trunk/net/dccp/ipv4.c +++ b/trunk/net/dccp/ipv4.c @@ -998,11 +998,11 @@ static struct inet_protosw dccp_v4_protosw = { static int __net_init dccp_v4_init_net(struct net *net) { - if (dccp_hashinfo.bhash == NULL) - return -ESOCKTNOSUPPORT; + int err; - return inet_ctl_sock_create(&net->dccp.v4_ctl_sk, PF_INET, - SOCK_DCCP, IPPROTO_DCCP, net); + err = inet_ctl_sock_create(&net->dccp.v4_ctl_sk, PF_INET, + SOCK_DCCP, IPPROTO_DCCP, net); + return err; } static void __net_exit dccp_v4_exit_net(struct net *net) diff --git a/trunk/net/dccp/ipv6.c b/trunk/net/dccp/ipv6.c index af3394df63b7..1aec6349e858 100644 --- a/trunk/net/dccp/ipv6.c +++ b/trunk/net/dccp/ipv6.c @@ -1191,11 +1191,11 @@ static struct inet_protosw dccp_v6_protosw = { static int __net_init dccp_v6_init_net(struct net *net) { - if (dccp_hashinfo.bhash == NULL) - return -ESOCKTNOSUPPORT; + int err; - return inet_ctl_sock_create(&net->dccp.v6_ctl_sk, PF_INET6, - SOCK_DCCP, IPPROTO_DCCP, net); + err = inet_ctl_sock_create(&net->dccp.v6_ctl_sk, PF_INET6, + SOCK_DCCP, IPPROTO_DCCP, net); + return err; } static void __net_exit dccp_v6_exit_net(struct net *net) diff --git a/trunk/net/dccp/minisocks.c b/trunk/net/dccp/minisocks.c index 0d508c359fa9..af226a063141 100644 --- a/trunk/net/dccp/minisocks.c +++ b/trunk/net/dccp/minisocks.c @@ -254,7 +254,7 @@ int dccp_child_process(struct sock *parent, struct sock *child, * in main socket hash table and lock on listening * socket does not protect us more. */ - __sk_add_backlog(child, skb); + sk_add_backlog(child, skb); } bh_unlock_sock(child); diff --git a/trunk/net/dccp/proto.c b/trunk/net/dccp/proto.c index aa4cef374fd0..0ef7061920c0 100644 --- a/trunk/net/dccp/proto.c +++ b/trunk/net/dccp/proto.c @@ -1036,7 +1036,7 @@ static int __init dccp_init(void) FIELD_SIZEOF(struct sk_buff, cb)); rc = percpu_counter_init(&dccp_orphan_count, 0); if (rc) - goto out_fail; + goto out; rc = -ENOBUFS; inet_hashinfo_init(&dccp_hashinfo); dccp_hashinfo.bind_bucket_cachep = @@ -1125,9 +1125,8 @@ static int __init dccp_init(void) goto out_sysctl_exit; dccp_timestamping_init(); - - return 0; - +out: + return rc; out_sysctl_exit: dccp_sysctl_exit(); out_ackvec_exit: @@ -1136,19 +1135,18 @@ static int __init dccp_init(void) dccp_mib_exit(); out_free_dccp_bhash: free_pages((unsigned long)dccp_hashinfo.bhash, bhash_order); + dccp_hashinfo.bhash = NULL; out_free_dccp_locks: inet_ehash_locks_free(&dccp_hashinfo); out_free_dccp_ehash: free_pages((unsigned long)dccp_hashinfo.ehash, ehash_order); + dccp_hashinfo.ehash = NULL; out_free_bind_bucket_cachep: kmem_cache_destroy(dccp_hashinfo.bind_bucket_cachep); + dccp_hashinfo.bind_bucket_cachep = NULL; out_free_percpu: percpu_counter_destroy(&dccp_orphan_count); -out_fail: - dccp_hashinfo.bhash = NULL; - dccp_hashinfo.ehash = NULL; - dccp_hashinfo.bind_bucket_cachep = NULL; - return rc; + goto out; } static void __exit dccp_fini(void) diff --git a/trunk/net/ipv4/ip_gre.c b/trunk/net/ipv4/ip_gre.c index f47c9f76754b..c0c5274d0271 100644 --- a/trunk/net/ipv4/ip_gre.c +++ b/trunk/net/ipv4/ip_gre.c @@ -1144,9 +1144,12 @@ static int ipgre_header(struct sk_buff *skb, struct net_device *dev, if (saddr) memcpy(&iph->saddr, saddr, 4); - if (daddr) + + if (daddr) { memcpy(&iph->daddr, daddr, 4); - if (iph->daddr) + return t->hlen; + } + if (iph->daddr && !ipv4_is_multicast(iph->daddr)) return t->hlen; return -t->hlen; diff --git a/trunk/net/ipv4/ipconfig.c b/trunk/net/ipv4/ipconfig.c index 678909281648..10a6a604bf32 100644 --- a/trunk/net/ipv4/ipconfig.c +++ b/trunk/net/ipv4/ipconfig.c @@ -187,16 +187,6 @@ struct ic_device { static struct ic_device *ic_first_dev __initdata = NULL;/* List of open device */ static struct net_device *ic_dev __initdata = NULL; /* Selected device */ -static bool __init ic_device_match(struct net_device *dev) -{ - if (user_dev_name[0] ? !strcmp(dev->name, user_dev_name) : - (!(dev->flags & IFF_LOOPBACK) && - (dev->flags & (IFF_POINTOPOINT|IFF_BROADCAST)) && - strncmp(dev->name, "dummy", 5))) - return true; - return false; -} - static int __init ic_open_devs(void) { struct ic_device *d, **last; @@ -217,7 +207,10 @@ static int __init ic_open_devs(void) for_each_netdev(&init_net, dev) { if (dev->flags & IFF_LOOPBACK) continue; - if (ic_device_match(dev)) { + if (user_dev_name[0] ? !strcmp(dev->name, user_dev_name) : + (!(dev->flags & IFF_LOOPBACK) && + (dev->flags & (IFF_POINTOPOINT|IFF_BROADCAST)) && + strncmp(dev->name, "dummy", 5))) { int able = 0; if (dev->mtu >= 364) able |= IC_BOOTP; @@ -235,7 +228,7 @@ static int __init ic_open_devs(void) } if (!(d = kmalloc(sizeof(struct ic_device), GFP_KERNEL))) { rtnl_unlock(); - return -ENOMEM; + return -1; } d->dev = dev; *last = d; @@ -260,7 +253,7 @@ static int __init ic_open_devs(void) printk(KERN_ERR "IP-Config: Device `%s' not found.\n", user_dev_name); else printk(KERN_ERR "IP-Config: No network devices available.\n"); - return -ENODEV; + return -1; } return 0; } @@ -1310,32 +1303,6 @@ __be32 __init root_nfs_parse_addr(char *name) return addr; } -#define DEVICE_WAIT_MAX 12 /* 12 seconds */ - -static int __init wait_for_devices(void) -{ - int i; - - msleep(CONF_PRE_OPEN); - for (i = 0; i < DEVICE_WAIT_MAX; i++) { - struct net_device *dev; - int found = 0; - - rtnl_lock(); - for_each_netdev(&init_net, dev) { - if (ic_device_match(dev)) { - found = 1; - break; - } - } - rtnl_unlock(); - if (found) - return 0; - ssleep(1); - } - return -ENODEV; -} - /* * IP Autoconfig dispatcher. */ @@ -1346,7 +1313,6 @@ static int __init ip_auto_config(void) #ifdef IPCONFIG_DYNAMIC int retries = CONF_OPEN_RETRIES; #endif - int err; #ifdef CONFIG_PROC_FS proc_net_fops_create(&init_net, "pnp", S_IRUGO, &pnp_seq_fops); @@ -1359,15 +1325,12 @@ static int __init ip_auto_config(void) #ifdef IPCONFIG_DYNAMIC try_try_again: #endif - /* Wait for devices to appear */ - err = wait_for_devices(); - if (err) - return err; + /* Give hardware a chance to settle */ + msleep(CONF_PRE_OPEN); /* Setup all network devices */ - err = ic_open_devs(); - if (err) - return err; + if (ic_open_devs() < 0) + return -1; /* Give drivers a chance to settle */ ssleep(CONF_POST_OPEN); diff --git a/trunk/net/ipv4/proc.c b/trunk/net/ipv4/proc.c index 4f1f337f4337..242ed2307370 100644 --- a/trunk/net/ipv4/proc.c +++ b/trunk/net/ipv4/proc.c @@ -249,8 +249,6 @@ static const struct snmp_mib snmp4_net_list[] = { SNMP_MIB_ITEM("TCPSackShifted", LINUX_MIB_SACKSHIFTED), SNMP_MIB_ITEM("TCPSackMerged", LINUX_MIB_SACKMERGED), SNMP_MIB_ITEM("TCPSackShiftFallback", LINUX_MIB_SACKSHIFTFALLBACK), - SNMP_MIB_ITEM("TCPBacklogDrop", LINUX_MIB_TCPBACKLOGDROP), - SNMP_MIB_ITEM("TCPMinTTLDrop", LINUX_MIB_TCPMINTTLDROP), SNMP_MIB_SENTINEL }; diff --git a/trunk/net/ipv4/route.c b/trunk/net/ipv4/route.c index a770df2493d2..b2ba5581d2ae 100644 --- a/trunk/net/ipv4/route.c +++ b/trunk/net/ipv4/route.c @@ -146,6 +146,7 @@ static struct dst_entry *ipv4_negative_advice(struct dst_entry *dst); static void ipv4_link_failure(struct sk_buff *skb); static void ip_rt_update_pmtu(struct dst_entry *dst, u32 mtu); static int rt_garbage_collect(struct dst_ops *ops); +static void rt_emergency_hash_rebuild(struct net *net); static struct dst_ops ipv4_dst_ops = { @@ -779,30 +780,11 @@ static void rt_do_flush(int process_context) #define FRACT_BITS 3 #define ONE (1UL << FRACT_BITS) -/* - * Given a hash chain and an item in this hash chain, - * find if a previous entry has the same hash_inputs - * (but differs on tos, mark or oif) - * Returns 0 if an alias is found. - * Returns ONE if rth has no alias before itself. - */ -static int has_noalias(const struct rtable *head, const struct rtable *rth) -{ - const struct rtable *aux = head; - - while (aux != rth) { - if (compare_hash_inputs(&aux->fl, &rth->fl)) - return 0; - aux = aux->u.dst.rt_next; - } - return ONE; -} - static void rt_check_expire(void) { static unsigned int rover; unsigned int i = rover, goal; - struct rtable *rth, **rthp; + struct rtable *rth, *aux, **rthp; unsigned long samples = 0; unsigned long sum = 0, sum2 = 0; unsigned long delta; @@ -853,7 +835,15 @@ static void rt_check_expire(void) * attributes don't unfairly skew * the length computation */ - length += has_noalias(rt_hash_table[i].chain, rth); + for (aux = rt_hash_table[i].chain;;) { + if (aux == rth) { + length += ONE; + break; + } + if (compare_hash_inputs(&aux->fl, &rth->fl)) + break; + aux = aux->u.dst.rt_next; + } continue; } } else if (!rt_may_expire(rth, tmo, ip_rt_gc_timeout)) @@ -932,8 +922,10 @@ static void rt_secret_rebuild_oneshot(struct net *net) { del_timer_sync(&net->ipv4.rt_secret_timer); rt_cache_invalidate(net); - if (ip_rt_secret_interval) - mod_timer(&net->ipv4.rt_secret_timer, jiffies + ip_rt_secret_interval); + if (ip_rt_secret_interval) { + net->ipv4.rt_secret_timer.expires += ip_rt_secret_interval; + add_timer(&net->ipv4.rt_secret_timer); + } } static void rt_emergency_hash_rebuild(struct net *net) @@ -1081,21 +1073,6 @@ static int rt_garbage_collect(struct dst_ops *ops) out: return 0; } -/* - * Returns number of entries in a hash chain that have different hash_inputs - */ -static int slow_chain_length(const struct rtable *head) -{ - int length = 0; - const struct rtable *rth = head; - - while (rth) { - length += has_noalias(head, rth); - rth = rth->u.dst.rt_next; - } - return length >> FRACT_BITS; -} - static int rt_intern_hash(unsigned hash, struct rtable *rt, struct rtable **rp, struct sk_buff *skb) { @@ -1208,8 +1185,7 @@ static int rt_intern_hash(unsigned hash, struct rtable *rt, rt_free(cand); } } else { - if (chain_length > rt_chain_length_max && - slow_chain_length(rt_hash_table[hash].chain) > rt_chain_length_max) { + if (chain_length > rt_chain_length_max) { struct net *net = dev_net(rt->u.dst.dev); int num = ++net->ipv4.current_rt_cache_rebuild_count; if (!rt_caching(dev_net(rt->u.dst.dev))) { @@ -3101,20 +3077,22 @@ static void rt_secret_reschedule(int old) rtnl_lock(); for_each_net(net) { int deleted = del_timer_sync(&net->ipv4.rt_secret_timer); - long time; if (!new) continue; if (deleted) { - time = net->ipv4.rt_secret_timer.expires - jiffies; + long time = net->ipv4.rt_secret_timer.expires - jiffies; if (time <= 0 || (time += diff) <= 0) time = 0; + + net->ipv4.rt_secret_timer.expires = time; } else - time = new; + net->ipv4.rt_secret_timer.expires = new; - mod_timer(&net->ipv4.rt_secret_timer, jiffies + time); + net->ipv4.rt_secret_timer.expires += jiffies; + add_timer(&net->ipv4.rt_secret_timer); } rtnl_unlock(); } diff --git a/trunk/net/ipv4/tcp_ipv4.c b/trunk/net/ipv4/tcp_ipv4.c index 70df40980a87..c3588b4fd979 100644 --- a/trunk/net/ipv4/tcp_ipv4.c +++ b/trunk/net/ipv4/tcp_ipv4.c @@ -1651,15 +1651,13 @@ int tcp_v4_rcv(struct sk_buff *skb) if (!sk) goto no_tcp_socket; + if (iph->ttl < inet_sk(sk)->min_ttl) + goto discard_and_relse; + process: if (sk->sk_state == TCP_TIME_WAIT) goto do_time_wait; - if (unlikely(iph->ttl < inet_sk(sk)->min_ttl)) { - NET_INC_STATS_BH(net, LINUX_MIB_TCPMINTTLDROP); - goto discard_and_relse; - } - if (!xfrm4_policy_check(sk, XFRM_POLICY_IN, skb)) goto discard_and_relse; nf_reset(skb); @@ -1684,11 +1682,8 @@ int tcp_v4_rcv(struct sk_buff *skb) if (!tcp_prequeue(sk, skb)) ret = tcp_v4_do_rcv(sk, skb); } - } else if (unlikely(sk_add_backlog(sk, skb))) { - bh_unlock_sock(sk); - NET_INC_STATS_BH(net, LINUX_MIB_TCPBACKLOGDROP); - goto discard_and_relse; - } + } else + sk_add_backlog(sk, skb); bh_unlock_sock(sk); sock_put(sk); diff --git a/trunk/net/ipv4/tcp_minisocks.c b/trunk/net/ipv4/tcp_minisocks.c index 4199bc6915c5..f206ee5dda80 100644 --- a/trunk/net/ipv4/tcp_minisocks.c +++ b/trunk/net/ipv4/tcp_minisocks.c @@ -728,7 +728,7 @@ int tcp_child_process(struct sock *parent, struct sock *child, * in main socket hash table and lock on listening * socket does not protect us more. */ - __sk_add_backlog(child, skb); + sk_add_backlog(child, skb); } bh_unlock_sock(child); diff --git a/trunk/net/ipv4/tcp_output.c b/trunk/net/ipv4/tcp_output.c index f181b78f2385..4a1605d3f909 100644 --- a/trunk/net/ipv4/tcp_output.c +++ b/trunk/net/ipv4/tcp_output.c @@ -2395,17 +2395,13 @@ struct sk_buff *tcp_make_synack(struct sock *sk, struct dst_entry *dst, struct tcp_extend_values *xvp = tcp_xv(rvp); struct inet_request_sock *ireq = inet_rsk(req); struct tcp_sock *tp = tcp_sk(sk); - const struct tcp_cookie_values *cvp = tp->cookie_values; struct tcphdr *th; struct sk_buff *skb; struct tcp_md5sig_key *md5; int tcp_header_size; int mss; - int s_data_desired = 0; - if (cvp != NULL && cvp->s_data_constant && cvp->s_data_desired) - s_data_desired = cvp->s_data_desired; - skb = sock_wmalloc(sk, MAX_TCP_HEADER + 15 + s_data_desired, 1, GFP_ATOMIC); + skb = sock_wmalloc(sk, MAX_TCP_HEADER + 15, 1, GFP_ATOMIC); if (skb == NULL) return NULL; @@ -2461,12 +2457,16 @@ struct sk_buff *tcp_make_synack(struct sock *sk, struct dst_entry *dst, TCPCB_FLAG_SYN | TCPCB_FLAG_ACK); if (OPTION_COOKIE_EXTENSION & opts.options) { - if (s_data_desired) { - u8 *buf = skb_put(skb, s_data_desired); + const struct tcp_cookie_values *cvp = tp->cookie_values; + + if (cvp != NULL && + cvp->s_data_constant && + cvp->s_data_desired > 0) { + u8 *buf = skb_put(skb, cvp->s_data_desired); /* copy data directly from the listening socket. */ - memcpy(buf, cvp->s_data_payload, s_data_desired); - TCP_SKB_CB(skb)->end_seq += s_data_desired; + memcpy(buf, cvp->s_data_payload, cvp->s_data_desired); + TCP_SKB_CB(skb)->end_seq += cvp->s_data_desired; } if (opts.hash_size > 0) { diff --git a/trunk/net/ipv4/udp.c b/trunk/net/ipv4/udp.c index 7af756d0f931..608a5446d05b 100644 --- a/trunk/net/ipv4/udp.c +++ b/trunk/net/ipv4/udp.c @@ -1371,10 +1371,8 @@ int udp_queue_rcv_skb(struct sock *sk, struct sk_buff *skb) bh_lock_sock(sk); if (!sock_owned_by_user(sk)) rc = __udp_queue_rcv_skb(sk, skb); - else if (sk_add_backlog(sk, skb)) { - bh_unlock_sock(sk); - goto drop; - } + else + sk_add_backlog(sk, skb); bh_unlock_sock(sk); return rc; diff --git a/trunk/net/ipv4/xfrm4_policy.c b/trunk/net/ipv4/xfrm4_policy.c index e4a1483fba77..67107d63c1cd 100644 --- a/trunk/net/ipv4/xfrm4_policy.c +++ b/trunk/net/ipv4/xfrm4_policy.c @@ -91,12 +91,11 @@ static int xfrm4_init_path(struct xfrm_dst *path, struct dst_entry *dst, return 0; } -static int xfrm4_fill_dst(struct xfrm_dst *xdst, struct net_device *dev, - struct flowi *fl) +static int xfrm4_fill_dst(struct xfrm_dst *xdst, struct net_device *dev) { struct rtable *rt = (struct rtable *)xdst->route; - xdst->u.rt.fl = *fl; + xdst->u.rt.fl = rt->fl; xdst->u.dst.dev = dev; dev_hold(dev); diff --git a/trunk/net/ipv6/addrconf.c b/trunk/net/ipv6/addrconf.c index 3381b4317c27..88fd8c5877ee 100644 --- a/trunk/net/ipv6/addrconf.c +++ b/trunk/net/ipv6/addrconf.c @@ -1380,8 +1380,6 @@ static void addrconf_dad_stop(struct inet6_ifaddr *ifp, int dad_failed) if (dad_failed) ifp->flags |= IFA_F_DADFAILED; spin_unlock_bh(&ifp->lock); - if (dad_failed) - ipv6_ifa_notify(0, ifp); in6_ifa_put(ifp); #ifdef CONFIG_IPV6_PRIVACY } else if (ifp->flags&IFA_F_TEMPORARY) { @@ -2617,7 +2615,7 @@ static void addrconf_bonding_change(struct net_device *dev, unsigned long event) static int addrconf_ifdown(struct net_device *dev, int how) { struct inet6_dev *idev; - struct inet6_ifaddr *ifa, *keep_list, **bifa; + struct inet6_ifaddr *ifa, **bifa; struct net *net = dev_net(dev); int i; @@ -2651,11 +2649,11 @@ static int addrconf_ifdown(struct net_device *dev, int how) write_lock_bh(&addrconf_hash_lock); while ((ifa = *bifa) != NULL) { if (ifa->idev == idev && - (how || !(ifa->flags&IFA_F_PERMANENT) || - ipv6_addr_type(&ifa->addr) & IPV6_ADDR_LINKLOCAL)) { + (how || !(ifa->flags&IFA_F_PERMANENT))) { *bifa = ifa->lst_next; ifa->lst_next = NULL; - __in6_ifa_put(ifa); + addrconf_del_timer(ifa); + in6_ifa_put(ifa); continue; } bifa = &ifa->lst_next; @@ -2691,51 +2689,31 @@ static int addrconf_ifdown(struct net_device *dev, int how) write_lock_bh(&idev->lock); } #endif - keep_list = NULL; - bifa = &keep_list; - while ((ifa = idev->addr_list) != NULL) { - idev->addr_list = ifa->if_next; - ifa->if_next = NULL; - - addrconf_del_timer(ifa); - - /* If just doing link down, and address is permanent - and not link-local, then retain it. */ - if (how == 0 && - (ifa->flags&IFA_F_PERMANENT) && - !(ipv6_addr_type(&ifa->addr) & IPV6_ADDR_LINKLOCAL)) { - - /* Move to holding list */ - *bifa = ifa; + bifa = &idev->addr_list; + while ((ifa = *bifa) != NULL) { + if (how == 0 && (ifa->flags&IFA_F_PERMANENT)) { + /* Retain permanent address on admin down */ bifa = &ifa->if_next; - /* If not doing DAD on this address, just keep it. */ - if ((dev->flags&(IFF_NOARP|IFF_LOOPBACK)) || - idev->cnf.accept_dad <= 0 || - (ifa->flags & IFA_F_NODAD)) - continue; - - /* If it was tentative already, no need to notify */ - if (ifa->flags & IFA_F_TENTATIVE) - continue; - - /* Flag it for later restoration when link comes up */ - ifa->flags |= IFA_F_TENTATIVE; - in6_ifa_hold(ifa); + /* Restart DAD if needed when link comes back up */ + if ( !((dev->flags&(IFF_NOARP|IFF_LOOPBACK)) || + idev->cnf.accept_dad <= 0 || + (ifa->flags & IFA_F_NODAD))) + ifa->flags |= IFA_F_TENTATIVE; } else { + *bifa = ifa->if_next; + ifa->if_next = NULL; + ifa->dead = 1; - } - write_unlock_bh(&idev->lock); + write_unlock_bh(&idev->lock); - __ipv6_ifa_notify(RTM_DELADDR, ifa); - atomic_notifier_call_chain(&inet6addr_chain, NETDEV_DOWN, ifa); - in6_ifa_put(ifa); + __ipv6_ifa_notify(RTM_DELADDR, ifa); + atomic_notifier_call_chain(&inet6addr_chain, NETDEV_DOWN, ifa); + in6_ifa_put(ifa); - write_lock_bh(&idev->lock); + write_lock_bh(&idev->lock); + } } - - idev->addr_list = keep_list; - write_unlock_bh(&idev->lock); /* Step 5: Discard multicast list */ @@ -2761,29 +2739,28 @@ static int addrconf_ifdown(struct net_device *dev, int how) static void addrconf_rs_timer(unsigned long data) { struct inet6_ifaddr *ifp = (struct inet6_ifaddr *) data; - struct inet6_dev *idev = ifp->idev; - - read_lock(&idev->lock); - if (idev->dead || !(idev->if_flags & IF_READY)) - goto out; - if (idev->cnf.forwarding) + if (ifp->idev->cnf.forwarding) goto out; - /* Announcement received after solicitation was sent */ - if (idev->if_flags & IF_RA_RCVD) + if (ifp->idev->if_flags & IF_RA_RCVD) { + /* + * Announcement received after solicitation + * was sent + */ goto out; + } spin_lock(&ifp->lock); - if (ifp->probes++ < idev->cnf.rtr_solicits) { + if (ifp->probes++ < ifp->idev->cnf.rtr_solicits) { /* The wait after the last probe can be shorter */ addrconf_mod_timer(ifp, AC_RS, - (ifp->probes == idev->cnf.rtr_solicits) ? - idev->cnf.rtr_solicit_delay : - idev->cnf.rtr_solicit_interval); + (ifp->probes == ifp->idev->cnf.rtr_solicits) ? + ifp->idev->cnf.rtr_solicit_delay : + ifp->idev->cnf.rtr_solicit_interval); spin_unlock(&ifp->lock); - ndisc_send_rs(idev->dev, &ifp->addr, &in6addr_linklocal_allrouters); + ndisc_send_rs(ifp->idev->dev, &ifp->addr, &in6addr_linklocal_allrouters); } else { spin_unlock(&ifp->lock); /* @@ -2791,11 +2768,10 @@ static void addrconf_rs_timer(unsigned long data) * assumption any longer. */ printk(KERN_DEBUG "%s: no IPv6 routers present\n", - idev->dev->name); + ifp->idev->dev->name); } out: - read_unlock(&idev->lock); in6_ifa_put(ifp); } @@ -2874,9 +2850,9 @@ static void addrconf_dad_timer(unsigned long data) struct inet6_dev *idev = ifp->idev; struct in6_addr mcaddr; - read_lock(&idev->lock); - if (idev->dead || !(idev->if_flags & IF_READY)) { - read_unlock(&idev->lock); + read_lock_bh(&idev->lock); + if (idev->dead) { + read_unlock_bh(&idev->lock); goto out; } @@ -2888,7 +2864,7 @@ static void addrconf_dad_timer(unsigned long data) ifp->flags &= ~(IFA_F_TENTATIVE|IFA_F_OPTIMISTIC|IFA_F_DADFAILED); spin_unlock(&ifp->lock); - read_unlock(&idev->lock); + read_unlock_bh(&idev->lock); addrconf_dad_completed(ifp); @@ -2898,7 +2874,7 @@ static void addrconf_dad_timer(unsigned long data) ifp->probes--; addrconf_mod_timer(ifp, AC_DAD, ifp->idev->nd_parms->retrans_time); spin_unlock(&ifp->lock); - read_unlock(&idev->lock); + read_unlock_bh(&idev->lock); /* send a neighbour solicitation for our addr */ addrconf_addr_solict_mult(&ifp->addr, &mcaddr); diff --git a/trunk/net/ipv6/fib6_rules.c b/trunk/net/ipv6/fib6_rules.c index 5e463c43fcc2..551882b9dfd6 100644 --- a/trunk/net/ipv6/fib6_rules.c +++ b/trunk/net/ipv6/fib6_rules.c @@ -84,11 +84,18 @@ static int fib6_rule_action(struct fib_rule *rule, struct flowi *flp, if ((rule->flags & FIB_RULE_FIND_SADDR) && r->src.plen && !(flags & RT6_LOOKUP_F_HAS_SADDR)) { struct in6_addr saddr; + unsigned int srcprefs = 0; + + if (flags & RT6_LOOKUP_F_SRCPREF_TMP) + srcprefs |= IPV6_PREFER_SRC_TMP; + if (flags & RT6_LOOKUP_F_SRCPREF_PUBLIC) + srcprefs |= IPV6_PREFER_SRC_PUBLIC; + if (flags & RT6_LOOKUP_F_SRCPREF_COA) + srcprefs |= IPV6_PREFER_SRC_COA; if (ipv6_dev_get_saddr(net, ip6_dst_idev(&rt->u.dst)->dev, - &flp->fl6_dst, - rt6_flags2srcprefs(flags), + &flp->fl6_dst, srcprefs, &saddr)) goto again; if (!ipv6_prefix_equal(&saddr, &r->src.addr, diff --git a/trunk/net/ipv6/route.c b/trunk/net/ipv6/route.c index 52cd3eff31dc..b08879e97f22 100644 --- a/trunk/net/ipv6/route.c +++ b/trunk/net/ipv6/route.c @@ -819,8 +819,15 @@ struct dst_entry * ip6_route_output(struct net *net, struct sock *sk, if (!ipv6_addr_any(&fl->fl6_src)) flags |= RT6_LOOKUP_F_HAS_SADDR; - else if (sk) - flags |= rt6_srcprefs2flags(inet6_sk(sk)->srcprefs); + else if (sk) { + unsigned int prefs = inet6_sk(sk)->srcprefs; + if (prefs & IPV6_PREFER_SRC_TMP) + flags |= RT6_LOOKUP_F_SRCPREF_TMP; + if (prefs & IPV6_PREFER_SRC_PUBLIC) + flags |= RT6_LOOKUP_F_SRCPREF_PUBLIC; + if (prefs & IPV6_PREFER_SRC_COA) + flags |= RT6_LOOKUP_F_SRCPREF_COA; + } return fib6_rule_lookup(net, fl, flags, ip6_pol_route_output); } diff --git a/trunk/net/ipv6/tcp_ipv6.c b/trunk/net/ipv6/tcp_ipv6.c index 9b6dbba80d31..6963a6b6763e 100644 --- a/trunk/net/ipv6/tcp_ipv6.c +++ b/trunk/net/ipv6/tcp_ipv6.c @@ -1740,11 +1740,8 @@ static int tcp_v6_rcv(struct sk_buff *skb) if (!tcp_prequeue(sk, skb)) ret = tcp_v6_do_rcv(sk, skb); } - } else if (unlikely(sk_add_backlog(sk, skb))) { - bh_unlock_sock(sk); - NET_INC_STATS_BH(net, LINUX_MIB_TCPBACKLOGDROP); - goto discard_and_relse; - } + } else + sk_add_backlog(sk, skb); bh_unlock_sock(sk); sock_put(sk); diff --git a/trunk/net/ipv6/udp.c b/trunk/net/ipv6/udp.c index 3c0c9c755c92..52b8347ae3b2 100644 --- a/trunk/net/ipv6/udp.c +++ b/trunk/net/ipv6/udp.c @@ -583,20 +583,16 @@ static void flush_stack(struct sock **stack, unsigned int count, bh_lock_sock(sk); if (!sock_owned_by_user(sk)) udpv6_queue_rcv_skb(sk, skb1); - else if (sk_add_backlog(sk, skb1)) { - kfree_skb(skb1); - bh_unlock_sock(sk); - goto drop; - } + else + sk_add_backlog(sk, skb1); bh_unlock_sock(sk); - continue; + } else { + atomic_inc(&sk->sk_drops); + UDP6_INC_STATS_BH(sock_net(sk), + UDP_MIB_RCVBUFERRORS, IS_UDPLITE(sk)); + UDP6_INC_STATS_BH(sock_net(sk), + UDP_MIB_INERRORS, IS_UDPLITE(sk)); } -drop: - atomic_inc(&sk->sk_drops); - UDP6_INC_STATS_BH(sock_net(sk), - UDP_MIB_RCVBUFERRORS, IS_UDPLITE(sk)); - UDP6_INC_STATS_BH(sock_net(sk), - UDP_MIB_INERRORS, IS_UDPLITE(sk)); } } /* @@ -758,12 +754,8 @@ int __udp6_lib_rcv(struct sk_buff *skb, struct udp_table *udptable, bh_lock_sock(sk); if (!sock_owned_by_user(sk)) udpv6_queue_rcv_skb(sk, skb); - else if (sk_add_backlog(sk, skb)) { - atomic_inc(&sk->sk_drops); - bh_unlock_sock(sk); - sock_put(sk); - goto discard; - } + else + sk_add_backlog(sk, skb); bh_unlock_sock(sk); sock_put(sk); return 0; diff --git a/trunk/net/ipv6/xfrm6_policy.c b/trunk/net/ipv6/xfrm6_policy.c index ae181651c75a..dbdc696f5fc5 100644 --- a/trunk/net/ipv6/xfrm6_policy.c +++ b/trunk/net/ipv6/xfrm6_policy.c @@ -116,8 +116,7 @@ static int xfrm6_init_path(struct xfrm_dst *path, struct dst_entry *dst, return 0; } -static int xfrm6_fill_dst(struct xfrm_dst *xdst, struct net_device *dev, - struct flowi *fl) +static int xfrm6_fill_dst(struct xfrm_dst *xdst, struct net_device *dev) { struct rt6_info *rt = (struct rt6_info*)xdst->route; diff --git a/trunk/net/llc/llc_c_ac.c b/trunk/net/llc/llc_c_ac.c index 86d6985b9d49..019c780512e8 100644 --- a/trunk/net/llc/llc_c_ac.c +++ b/trunk/net/llc/llc_c_ac.c @@ -1437,7 +1437,7 @@ static void llc_process_tmr_ev(struct sock *sk, struct sk_buff *skb) llc_conn_state_process(sk, skb); else { llc_set_backlog_type(skb, LLC_EVENT); - __sk_add_backlog(sk, skb); + sk_add_backlog(sk, skb); } } } diff --git a/trunk/net/llc/llc_conn.c b/trunk/net/llc/llc_conn.c index a12144da7974..a8dde9b010da 100644 --- a/trunk/net/llc/llc_conn.c +++ b/trunk/net/llc/llc_conn.c @@ -827,8 +827,7 @@ void llc_conn_handler(struct llc_sap *sap, struct sk_buff *skb) else { dprintk("%s: adding to backlog...\n", __func__); llc_set_backlog_type(skb, LLC_PACKET); - if (sk_add_backlog(sk, skb)) - goto drop_unlock; + sk_add_backlog(sk, skb); } out: bh_unlock_sock(sk); diff --git a/trunk/net/mac80211/debugfs_netdev.c b/trunk/net/mac80211/debugfs_netdev.c index b4ddb2f83914..9affe2cd185f 100644 --- a/trunk/net/mac80211/debugfs_netdev.c +++ b/trunk/net/mac80211/debugfs_netdev.c @@ -48,24 +48,20 @@ static ssize_t ieee80211_if_write( ssize_t (*write)(struct ieee80211_sub_if_data *, const char *, int)) { u8 *buf; - ssize_t ret; + ssize_t ret = -ENODEV; - buf = kmalloc(count, GFP_KERNEL); + buf = kzalloc(count, GFP_KERNEL); if (!buf) return -ENOMEM; - ret = -EFAULT; if (copy_from_user(buf, userbuf, count)) - goto freebuf; + return -EFAULT; - ret = -ENODEV; rtnl_lock(); if (sdata->dev->reg_state == NETREG_REGISTERED) ret = (*write)(sdata, buf, count); rtnl_unlock(); -freebuf: - kfree(buf); return ret; } diff --git a/trunk/net/mac80211/mlme.c b/trunk/net/mac80211/mlme.c index be5f723d643a..41812a15eea0 100644 --- a/trunk/net/mac80211/mlme.c +++ b/trunk/net/mac80211/mlme.c @@ -177,8 +177,7 @@ static u32 ieee80211_enable_ht(struct ieee80211_sub_if_data *sdata, sta = sta_info_get(sdata, bssid); if (sta) rate_control_rate_update(local, sband, sta, - IEEE80211_RC_HT_CHANGED, - local->oper_channel_type); + IEEE80211_RC_HT_CHANGED); rcu_read_unlock(); } @@ -436,12 +435,10 @@ static void ieee80211_enable_ps(struct ieee80211_local *local, if (local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK) ieee80211_send_nullfunc(local, sdata, 1); - if ((local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK) && - (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS)) - return; - - conf->flags |= IEEE80211_CONF_PS; - ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS); + if (!(local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS)) { + conf->flags |= IEEE80211_CONF_PS; + ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS); + } } } @@ -560,8 +557,7 @@ void ieee80211_dynamic_ps_enable_work(struct work_struct *work) (!(ifmgd->flags & IEEE80211_STA_NULLFUNC_ACKED))) ieee80211_send_nullfunc(local, sdata, 1); - if (!((local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) && - (local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK)) || + if (!(local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) || (ifmgd->flags & IEEE80211_STA_NULLFUNC_ACKED)) { ifmgd->flags &= ~IEEE80211_STA_NULLFUNC_ACKED; local->hw.conf.flags |= IEEE80211_CONF_PS; @@ -1897,20 +1893,8 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata, mutex_lock(&ifmgd->mtx); if (ifmgd->associated) { - if (!req->prev_bssid || - memcmp(req->prev_bssid, ifmgd->associated->bssid, - ETH_ALEN)) { - /* - * We are already associated and the request was not a - * reassociation request from the current BSS, so - * reject it. - */ - mutex_unlock(&ifmgd->mtx); - return -EALREADY; - } - - /* Trying to reassociate - clear previous association state */ - ieee80211_set_disassoc(sdata); + mutex_unlock(&ifmgd->mtx); + return -EALREADY; } mutex_unlock(&ifmgd->mtx); diff --git a/trunk/net/mac80211/rate.h b/trunk/net/mac80211/rate.h index 065a96190e32..b6108bca96d4 100644 --- a/trunk/net/mac80211/rate.h +++ b/trunk/net/mac80211/rate.h @@ -66,8 +66,7 @@ static inline void rate_control_rate_init(struct sta_info *sta) static inline void rate_control_rate_update(struct ieee80211_local *local, struct ieee80211_supported_band *sband, - struct sta_info *sta, u32 changed, - enum nl80211_channel_type oper_chan_type) + struct sta_info *sta, u32 changed) { struct rate_control_ref *ref = local->rate_ctrl; struct ieee80211_sta *ista = &sta->sta; @@ -75,7 +74,7 @@ static inline void rate_control_rate_update(struct ieee80211_local *local, if (ref && ref->ops->rate_update) ref->ops->rate_update(ref->priv, sband, ista, - priv_sta, changed, oper_chan_type); + priv_sta, changed); } static inline void *rate_control_alloc_sta(struct rate_control_ref *ref, diff --git a/trunk/net/mac80211/sta_info.c b/trunk/net/mac80211/sta_info.c index 56422d894351..211c475f73c6 100644 --- a/trunk/net/mac80211/sta_info.c +++ b/trunk/net/mac80211/sta_info.c @@ -434,7 +434,6 @@ int sta_info_insert_rcu(struct sta_info *sta) __acquires(RCU) /* check if STA exists already */ if (sta_info_get_bss(sdata, sta->sta.addr)) { spin_unlock_irqrestore(&local->sta_lock, flags); - mutex_unlock(&local->sta_mtx); rcu_read_lock(); err = -EEXIST; goto out_free; diff --git a/trunk/net/packet/af_packet.c b/trunk/net/packet/af_packet.c index 1612d417d10c..031a5e6fb4aa 100644 --- a/trunk/net/packet/af_packet.c +++ b/trunk/net/packet/af_packet.c @@ -1688,8 +1688,6 @@ static int packet_dev_mc(struct net_device *dev, struct packet_mclist *i, { switch (i->type) { case PACKET_MR_MULTICAST: - if (i->alen != dev->addr_len) - return -EINVAL; if (what > 0) return dev_mc_add(dev, i->addr, i->alen, 0); else @@ -1702,8 +1700,6 @@ static int packet_dev_mc(struct net_device *dev, struct packet_mclist *i, return dev_set_allmulti(dev, what); break; case PACKET_MR_UNICAST: - if (i->alen != dev->addr_len) - return -EINVAL; if (what > 0) return dev_unicast_add(dev, i->addr); else @@ -1738,7 +1734,7 @@ static int packet_mc_add(struct sock *sk, struct packet_mreq_max *mreq) goto done; err = -EINVAL; - if (mreq->mr_alen > dev->addr_len) + if (mreq->mr_alen != dev->addr_len) goto done; err = -ENOBUFS; diff --git a/trunk/net/phonet/pn_dev.c b/trunk/net/phonet/pn_dev.c index 5c6ae0c701c0..c597cc53a6fb 100644 --- a/trunk/net/phonet/pn_dev.c +++ b/trunk/net/phonet/pn_dev.c @@ -107,7 +107,8 @@ static void phonet_device_destroy(struct net_device *dev) if (pnd) { u8 addr; - for_each_set_bit(addr, pnd->addrs, 64) + for (addr = find_first_bit(pnd->addrs, 64); addr < 64; + addr = find_next_bit(pnd->addrs, 64, 1+addr)) phonet_address_notify(RTM_DELADDR, dev, addr); kfree(pnd); } diff --git a/trunk/net/phonet/pn_netlink.c b/trunk/net/phonet/pn_netlink.c index fe2e7088ee07..2e6c7eb8e76a 100644 --- a/trunk/net/phonet/pn_netlink.c +++ b/trunk/net/phonet/pn_netlink.c @@ -141,7 +141,8 @@ static int getaddr_dumpit(struct sk_buff *skb, struct netlink_callback *cb) continue; addr_idx = 0; - for_each_set_bit(addr, pnd->addrs, 64) { + for (addr = find_first_bit(pnd->addrs, 64); addr < 64; + addr = find_next_bit(pnd->addrs, 64, 1+addr)) { if (addr_idx++ < addr_start_idx) continue; diff --git a/trunk/net/rfkill/input.c b/trunk/net/rfkill/input.c index 3713d7ecab96..a7295ad5f9cb 100644 --- a/trunk/net/rfkill/input.c +++ b/trunk/net/rfkill/input.c @@ -212,9 +212,6 @@ static void rfkill_event(struct input_handle *handle, unsigned int type, case KEY_WIMAX: rfkill_schedule_toggle(RFKILL_TYPE_WIMAX); break; - case KEY_RFKILL: - rfkill_schedule_toggle(RFKILL_TYPE_ALL); - break; } } else if (type == EV_SW && code == SW_RFKILL_ALL) rfkill_schedule_evsw_rfkillall(data); @@ -297,11 +294,6 @@ static const struct input_device_id rfkill_ids[] = { .evbit = { BIT_MASK(EV_KEY) }, .keybit = { [BIT_WORD(KEY_WIMAX)] = BIT_MASK(KEY_WIMAX) }, }, - { - .flags = INPUT_DEVICE_ID_MATCH_EVBIT | INPUT_DEVICE_ID_MATCH_KEYBIT, - .evbit = { BIT_MASK(EV_KEY) }, - .keybit = { [BIT_WORD(KEY_RFKILL)] = BIT_MASK(KEY_RFKILL) }, - }, { .flags = INPUT_DEVICE_ID_MATCH_EVBIT | INPUT_DEVICE_ID_MATCH_SWBIT, .evbit = { BIT(EV_SW) }, diff --git a/trunk/net/sctp/input.c b/trunk/net/sctp/input.c index 3d74b264ea22..c0c973e67add 100644 --- a/trunk/net/sctp/input.c +++ b/trunk/net/sctp/input.c @@ -75,7 +75,7 @@ static struct sctp_association *__sctp_lookup_association( const union sctp_addr *peer, struct sctp_transport **pt); -static int sctp_add_backlog(struct sock *sk, struct sk_buff *skb); +static void sctp_add_backlog(struct sock *sk, struct sk_buff *skb); /* Calculate the SCTP checksum of an SCTP packet. */ @@ -265,13 +265,8 @@ int sctp_rcv(struct sk_buff *skb) } if (sock_owned_by_user(sk)) { - if (sctp_add_backlog(sk, skb)) { - sctp_bh_unlock_sock(sk); - sctp_chunk_free(chunk); - skb = NULL; /* sctp_chunk_free already freed the skb */ - goto discard_release; - } SCTP_INC_STATS_BH(SCTP_MIB_IN_PKT_BACKLOG); + sctp_add_backlog(sk, skb); } else { SCTP_INC_STATS_BH(SCTP_MIB_IN_PKT_SOFTIRQ); sctp_inq_push(&chunk->rcvr->inqueue, chunk); @@ -341,10 +336,8 @@ int sctp_backlog_rcv(struct sock *sk, struct sk_buff *skb) sctp_bh_lock_sock(sk); if (sock_owned_by_user(sk)) { - if (sk_add_backlog(sk, skb)) - sctp_chunk_free(chunk); - else - backloged = 1; + sk_add_backlog(sk, skb); + backloged = 1; } else sctp_inq_push(inqueue, chunk); @@ -369,27 +362,22 @@ int sctp_backlog_rcv(struct sock *sk, struct sk_buff *skb) return 0; } -static int sctp_add_backlog(struct sock *sk, struct sk_buff *skb) +static void sctp_add_backlog(struct sock *sk, struct sk_buff *skb) { struct sctp_chunk *chunk = SCTP_INPUT_CB(skb)->chunk; struct sctp_ep_common *rcvr = chunk->rcvr; - int ret; - ret = sk_add_backlog(sk, skb); - if (!ret) { - /* Hold the assoc/ep while hanging on the backlog queue. - * This way, we know structures we need will not disappear - * from us - */ - if (SCTP_EP_TYPE_ASSOCIATION == rcvr->type) - sctp_association_hold(sctp_assoc(rcvr)); - else if (SCTP_EP_TYPE_SOCKET == rcvr->type) - sctp_endpoint_hold(sctp_ep(rcvr)); - else - BUG(); - } - return ret; + /* Hold the assoc/ep while hanging on the backlog queue. + * This way, we know structures we need will not disappear from us + */ + if (SCTP_EP_TYPE_ASSOCIATION == rcvr->type) + sctp_association_hold(sctp_assoc(rcvr)); + else if (SCTP_EP_TYPE_SOCKET == rcvr->type) + sctp_endpoint_hold(sctp_ep(rcvr)); + else + BUG(); + sk_add_backlog(sk, skb); } /* Handle icmp frag needed error. */ diff --git a/trunk/net/sctp/socket.c b/trunk/net/sctp/socket.c index dfc5c127efd4..f6d1e59c4151 100644 --- a/trunk/net/sctp/socket.c +++ b/trunk/net/sctp/socket.c @@ -3720,9 +3720,6 @@ SCTP_STATIC int sctp_init_sock(struct sock *sk) SCTP_DBG_OBJCNT_INC(sock); percpu_counter_inc(&sctp_sockets_allocated); - /* Set socket backlog limit. */ - sk->sk_backlog.limit = sysctl_sctp_rmem[1]; - local_bh_disable(); sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1); local_bh_enable(); diff --git a/trunk/net/sunrpc/xprtrdma/transport.c b/trunk/net/sunrpc/xprtrdma/transport.c index f96c2fe6137b..7018eef1dcdd 100644 --- a/trunk/net/sunrpc/xprtrdma/transport.c +++ b/trunk/net/sunrpc/xprtrdma/transport.c @@ -160,15 +160,16 @@ xprt_rdma_format_addresses(struct rpc_xprt *xprt) (void)rpc_ntop(sap, buf, sizeof(buf)); xprt->address_strings[RPC_DISPLAY_ADDR] = kstrdup(buf, GFP_KERNEL); - snprintf(buf, sizeof(buf), "%u", rpc_get_port(sap)); + (void)snprintf(buf, sizeof(buf), "%u", rpc_get_port(sap)); xprt->address_strings[RPC_DISPLAY_PORT] = kstrdup(buf, GFP_KERNEL); xprt->address_strings[RPC_DISPLAY_PROTO] = "rdma"; - snprintf(buf, sizeof(buf), "%08x", ntohl(sin->sin_addr.s_addr)); + (void)snprintf(buf, sizeof(buf), "%02x%02x%02x%02x", + NIPQUAD(sin->sin_addr.s_addr)); xprt->address_strings[RPC_DISPLAY_HEX_ADDR] = kstrdup(buf, GFP_KERNEL); - snprintf(buf, sizeof(buf), "%4hx", rpc_get_port(sap)); + (void)snprintf(buf, sizeof(buf), "%4hx", rpc_get_port(sap)); xprt->address_strings[RPC_DISPLAY_HEX_PORT] = kstrdup(buf, GFP_KERNEL); /* netid */ diff --git a/trunk/net/sunrpc/xprtsock.c b/trunk/net/sunrpc/xprtsock.c index e4839c07c913..712412982cee 100644 --- a/trunk/net/sunrpc/xprtsock.c +++ b/trunk/net/sunrpc/xprtsock.c @@ -297,11 +297,12 @@ static void xs_format_common_peer_addresses(struct rpc_xprt *xprt) switch (sap->sa_family) { case AF_INET: sin = xs_addr_in(xprt); - snprintf(buf, sizeof(buf), "%08x", ntohl(sin->sin_addr.s_addr)); + (void)snprintf(buf, sizeof(buf), "%02x%02x%02x%02x", + NIPQUAD(sin->sin_addr.s_addr)); break; case AF_INET6: sin6 = xs_addr_in6(xprt); - snprintf(buf, sizeof(buf), "%pi6", &sin6->sin6_addr); + (void)snprintf(buf, sizeof(buf), "%pi6", &sin6->sin6_addr); break; default: BUG(); @@ -314,10 +315,10 @@ static void xs_format_common_peer_ports(struct rpc_xprt *xprt) struct sockaddr *sap = xs_addr(xprt); char buf[128]; - snprintf(buf, sizeof(buf), "%u", rpc_get_port(sap)); + (void)snprintf(buf, sizeof(buf), "%u", rpc_get_port(sap)); xprt->address_strings[RPC_DISPLAY_PORT] = kstrdup(buf, GFP_KERNEL); - snprintf(buf, sizeof(buf), "%4hx", rpc_get_port(sap)); + (void)snprintf(buf, sizeof(buf), "%4hx", rpc_get_port(sap)); xprt->address_strings[RPC_DISPLAY_HEX_PORT] = kstrdup(buf, GFP_KERNEL); } @@ -548,6 +549,8 @@ static int xs_udp_send_request(struct rpc_task *task) /* Still some bytes left; set up for a retry later. */ status = -EAGAIN; } + if (!transport->sock) + goto out; switch (status) { case -ENOTSOCK: @@ -567,7 +570,7 @@ static int xs_udp_send_request(struct rpc_task *task) * prompts ECONNREFUSED. */ clear_bit(SOCK_ASYNC_NOSPACE, &transport->sock->flags); } - +out: return status; } @@ -649,6 +652,8 @@ static int xs_tcp_send_request(struct rpc_task *task) status = -EAGAIN; break; } + if (!transport->sock) + goto out; switch (status) { case -ENOTSOCK: @@ -668,7 +673,7 @@ static int xs_tcp_send_request(struct rpc_task *task) case -ENOTCONN: clear_bit(SOCK_ASYNC_NOSPACE, &transport->sock->flags); } - +out: return status; } diff --git a/trunk/net/tipc/bearer.c b/trunk/net/tipc/bearer.c index 78091375ca12..327011fcc407 100644 --- a/trunk/net/tipc/bearer.c +++ b/trunk/net/tipc/bearer.c @@ -45,10 +45,10 @@ #define MAX_ADDR_STR 32 -static struct media media_list[MAX_MEDIA]; +static struct media *media_list = NULL; static u32 media_count = 0; -struct bearer tipc_bearers[MAX_BEARERS]; +struct bearer *tipc_bearers = NULL; /** * media_name_valid - validate media name @@ -108,11 +108,9 @@ int tipc_register_media(u32 media_type, int res = -EINVAL; write_lock_bh(&tipc_net_lock); - - if (tipc_mode != TIPC_NET_MODE) { - warn("Media <%s> rejected, not in networked mode yet\n", name); + if (!media_list) goto exit; - } + if (!media_name_valid(name)) { warn("Media <%s> rejected, illegal name\n", name); goto exit; @@ -662,10 +660,33 @@ int tipc_disable_bearer(const char *name) +int tipc_bearer_init(void) +{ + int res; + + write_lock_bh(&tipc_net_lock); + tipc_bearers = kcalloc(MAX_BEARERS, sizeof(struct bearer), GFP_ATOMIC); + media_list = kcalloc(MAX_MEDIA, sizeof(struct media), GFP_ATOMIC); + if (tipc_bearers && media_list) { + res = 0; + } else { + kfree(tipc_bearers); + kfree(media_list); + tipc_bearers = NULL; + media_list = NULL; + res = -ENOMEM; + } + write_unlock_bh(&tipc_net_lock); + return res; +} + void tipc_bearer_stop(void) { u32 i; + if (!tipc_bearers) + return; + for (i = 0; i < MAX_BEARERS; i++) { if (tipc_bearers[i].active) tipc_bearers[i].publ.blocked = 1; @@ -674,6 +695,10 @@ void tipc_bearer_stop(void) if (tipc_bearers[i].active) bearer_disable(tipc_bearers[i].publ.name); } + kfree(tipc_bearers); + kfree(media_list); + tipc_bearers = NULL; + media_list = NULL; media_count = 0; } diff --git a/trunk/net/tipc/bearer.h b/trunk/net/tipc/bearer.h index 000228e93f9e..ca5734892713 100644 --- a/trunk/net/tipc/bearer.h +++ b/trunk/net/tipc/bearer.h @@ -114,7 +114,7 @@ struct bearer_name { struct link; -extern struct bearer tipc_bearers[]; +extern struct bearer *tipc_bearers; void tipc_media_addr_printf(struct print_buf *pb, struct tipc_media_addr *a); struct sk_buff *tipc_media_get_names(void); diff --git a/trunk/net/tipc/link.c b/trunk/net/tipc/link.c index 1a7e4665af80..6f50f6423f63 100644 --- a/trunk/net/tipc/link.c +++ b/trunk/net/tipc/link.c @@ -1882,15 +1882,6 @@ void tipc_recv_msg(struct sk_buff *head, struct tipc_bearer *tb_ptr) (msg_destnode(msg) != tipc_own_addr))) goto cont; - /* Discard non-routeable messages destined for another node */ - - if (unlikely(!msg_isdata(msg) && - (msg_destnode(msg) != tipc_own_addr))) { - if ((msg_user(msg) != CONN_MANAGER) && - (msg_user(msg) != MSG_FRAGMENTER)) - goto cont; - } - /* Locate unicast link endpoint that should handle message */ n_ptr = tipc_node_find(msg_prevnode(msg)); diff --git a/trunk/net/tipc/net.c b/trunk/net/tipc/net.c index f25b1cdb64eb..7906608bf510 100644 --- a/trunk/net/tipc/net.c +++ b/trunk/net/tipc/net.c @@ -116,8 +116,7 @@ */ DEFINE_RWLOCK(tipc_net_lock); -struct _zone *tipc_zones[256] = { NULL, }; -struct network tipc_net = { tipc_zones }; +struct network tipc_net = { NULL }; struct tipc_node *tipc_net_select_remote_node(u32 addr, u32 ref) { @@ -159,12 +158,28 @@ void tipc_net_send_external_routes(u32 dest) } } +static int net_init(void) +{ + memset(&tipc_net, 0, sizeof(tipc_net)); + tipc_net.zones = kcalloc(tipc_max_zones + 1, sizeof(struct _zone *), GFP_ATOMIC); + if (!tipc_net.zones) { + return -ENOMEM; + } + return 0; +} + static void net_stop(void) { u32 z_num; - for (z_num = 1; z_num <= tipc_max_zones; z_num++) + if (!tipc_net.zones) + return; + + for (z_num = 1; z_num <= tipc_max_zones; z_num++) { tipc_zone_delete(tipc_net.zones[z_num]); + } + kfree(tipc_net.zones); + tipc_net.zones = NULL; } static void net_route_named_msg(struct sk_buff *buf) @@ -267,7 +282,9 @@ int tipc_net_start(u32 addr) tipc_named_reinit(); tipc_port_reinit(); - if ((res = tipc_cltr_init()) || + if ((res = tipc_bearer_init()) || + (res = net_init()) || + (res = tipc_cltr_init()) || (res = tipc_bclink_init())) { return res; } diff --git a/trunk/net/tipc/ref.c b/trunk/net/tipc/ref.c index 8dea66500cf5..414fc34b8bea 100644 --- a/trunk/net/tipc/ref.c +++ b/trunk/net/tipc/ref.c @@ -153,11 +153,11 @@ void tipc_ref_table_stop(void) u32 tipc_ref_acquire(void *object, spinlock_t **lock) { + struct reference *entry; u32 index; u32 index_mask; u32 next_plus_upper; u32 ref; - struct reference *entry = NULL; if (!object) { err("Attempt to acquire reference to non-existent object\n"); @@ -175,36 +175,30 @@ u32 tipc_ref_acquire(void *object, spinlock_t **lock) index = tipc_ref_table.first_free; entry = &(tipc_ref_table.entries[index]); index_mask = tipc_ref_table.index_mask; + /* take lock in case a previous user of entry still holds it */ + spin_lock_bh(&entry->lock); next_plus_upper = entry->ref; tipc_ref_table.first_free = next_plus_upper & index_mask; ref = (next_plus_upper & ~index_mask) + index; + entry->ref = ref; + entry->object = object; + *lock = &entry->lock; } else if (tipc_ref_table.init_point < tipc_ref_table.capacity) { index = tipc_ref_table.init_point++; entry = &(tipc_ref_table.entries[index]); spin_lock_init(&entry->lock); + spin_lock_bh(&entry->lock); ref = tipc_ref_table.start_mask + index; + entry->ref = ref; + entry->object = object; + *lock = &entry->lock; } else { ref = 0; } write_unlock_bh(&ref_table_lock); - /* - * Grab the lock so no one else can modify this entry - * While we assign its ref value & object pointer - */ - if (entry) { - spin_lock_bh(&entry->lock); - entry->ref = ref; - entry->object = object; - *lock = &entry->lock; - /* - * keep it locked, the caller is responsible - * for unlocking this when they're done with it - */ - } - return ref; } diff --git a/trunk/net/tipc/socket.c b/trunk/net/tipc/socket.c index 4b235fc1c70f..1ea64f09cc45 100644 --- a/trunk/net/tipc/socket.c +++ b/trunk/net/tipc/socket.c @@ -1322,10 +1322,8 @@ static u32 dispatch(struct tipc_port *tport, struct sk_buff *buf) if (!sock_owned_by_user(sk)) { res = filter_rcv(sk, buf); } else { - if (sk_add_backlog(sk, buf)) - res = TIPC_ERR_OVERLOAD; - else - res = TIPC_OK; + sk_add_backlog(sk, buf); + res = TIPC_OK; } bh_unlock_sock(sk); diff --git a/trunk/net/tipc/subscr.c b/trunk/net/tipc/subscr.c index ff123e56114a..ac91f0dfa144 100644 --- a/trunk/net/tipc/subscr.c +++ b/trunk/net/tipc/subscr.c @@ -75,6 +75,19 @@ struct top_srv { static struct top_srv topsrv = { 0 }; +/** + * htohl - convert value to endianness used by destination + * @in: value to convert + * @swap: non-zero if endianness must be reversed + * + * Returns converted value + */ + +static u32 htohl(u32 in, int swap) +{ + return swap ? swab32(in) : in; +} + /** * subscr_send_event - send a message containing a tipc_event to the subscriber * @@ -94,11 +107,11 @@ static void subscr_send_event(struct subscription *sub, msg_sect.iov_base = (void *)&sub->evt; msg_sect.iov_len = sizeof(struct tipc_event); - sub->evt.event = htonl(event); - sub->evt.found_lower = htonl(found_lower); - sub->evt.found_upper = htonl(found_upper); - sub->evt.port.ref = htonl(port_ref); - sub->evt.port.node = htonl(node); + sub->evt.event = htohl(event, sub->swap); + sub->evt.found_lower = htohl(found_lower, sub->swap); + sub->evt.found_upper = htohl(found_upper, sub->swap); + sub->evt.port.ref = htohl(port_ref, sub->swap); + sub->evt.port.node = htohl(node, sub->swap); tipc_send(sub->server_ref, 1, &msg_sect); } @@ -274,23 +287,16 @@ static void subscr_cancel(struct tipc_subscr *s, { struct subscription *sub; struct subscription *sub_temp; - __u32 type, lower, upper; int found = 0; /* Find first matching subscription, exit if not found */ - type = ntohl(s->seq.type); - lower = ntohl(s->seq.lower); - upper = ntohl(s->seq.upper); - list_for_each_entry_safe(sub, sub_temp, &subscriber->subscription_list, subscription_list) { - if ((type == sub->seq.type) && - (lower == sub->seq.lower) && - (upper == sub->seq.upper)) { - found = 1; - break; - } + if (!memcmp(s, &sub->evt.s, sizeof(struct tipc_subscr))) { + found = 1; + break; + } } if (!found) return; @@ -319,10 +325,16 @@ static struct subscription *subscr_subscribe(struct tipc_subscr *s, struct subscriber *subscriber) { struct subscription *sub; + int swap; + + /* Determine subscriber's endianness */ + + swap = !(s->filter & (TIPC_SUB_PORTS | TIPC_SUB_SERVICE)); /* Detect & process a subscription cancellation request */ - if (ntohl(s->filter) & TIPC_SUB_CANCEL) { + if (s->filter & htohl(TIPC_SUB_CANCEL, swap)) { + s->filter &= ~htohl(TIPC_SUB_CANCEL, swap); subscr_cancel(s, subscriber); return NULL; } @@ -347,11 +359,11 @@ static struct subscription *subscr_subscribe(struct tipc_subscr *s, /* Initialize subscription object */ - sub->seq.type = ntohl(s->seq.type); - sub->seq.lower = ntohl(s->seq.lower); - sub->seq.upper = ntohl(s->seq.upper); - sub->timeout = ntohl(s->timeout); - sub->filter = ntohl(s->filter); + sub->seq.type = htohl(s->seq.type, swap); + sub->seq.lower = htohl(s->seq.lower, swap); + sub->seq.upper = htohl(s->seq.upper, swap); + sub->timeout = htohl(s->timeout, swap); + sub->filter = htohl(s->filter, swap); if ((!(sub->filter & TIPC_SUB_PORTS) == !(sub->filter & TIPC_SUB_SERVICE)) || (sub->seq.lower > sub->seq.upper)) { @@ -364,6 +376,7 @@ static struct subscription *subscr_subscribe(struct tipc_subscr *s, INIT_LIST_HEAD(&sub->nameseq_list); list_add(&sub->subscription_list, &subscriber->subscription_list); sub->server_ref = subscriber->port_ref; + sub->swap = swap; memcpy(&sub->evt.s, s, sizeof(struct tipc_subscr)); atomic_inc(&topsrv.subscription_count); if (sub->timeout != TIPC_WAIT_FOREVER) { diff --git a/trunk/net/tipc/subscr.h b/trunk/net/tipc/subscr.h index c20f496d95b2..45d89bf4d202 100644 --- a/trunk/net/tipc/subscr.h +++ b/trunk/net/tipc/subscr.h @@ -53,6 +53,7 @@ typedef void (*tipc_subscr_event) (struct subscription *sub, * @nameseq_list: adjacent subscriptions in name sequence's subscription list * @subscription_list: adjacent subscriptions in subscriber's subscription list * @server_ref: object reference of server port associated with subscription + * @swap: indicates if subscriber uses opposite endianness in its messages * @evt: template for events generated by subscription */ @@ -65,6 +66,7 @@ struct subscription { struct list_head nameseq_list; struct list_head subscription_list; u32 server_ref; + int swap; struct tipc_event evt; }; diff --git a/trunk/net/x25/x25_dev.c b/trunk/net/x25/x25_dev.c index 52e304212241..3e1efe534645 100644 --- a/trunk/net/x25/x25_dev.c +++ b/trunk/net/x25/x25_dev.c @@ -53,7 +53,7 @@ static int x25_receive_data(struct sk_buff *skb, struct x25_neigh *nb) if (!sock_owned_by_user(sk)) { queued = x25_process_rx_frame(sk, skb); } else { - queued = !sk_add_backlog(sk, skb); + sk_add_backlog(sk, skb); } bh_unlock_sock(sk); sock_put(sk); diff --git a/trunk/net/xfrm/xfrm_policy.c b/trunk/net/xfrm/xfrm_policy.c index 843e066649cb..34a5ef8316e7 100644 --- a/trunk/net/xfrm/xfrm_policy.c +++ b/trunk/net/xfrm/xfrm_policy.c @@ -1372,8 +1372,7 @@ static inline int xfrm_init_path(struct xfrm_dst *path, struct dst_entry *dst, return err; } -static inline int xfrm_fill_dst(struct xfrm_dst *xdst, struct net_device *dev, - struct flowi *fl) +static inline int xfrm_fill_dst(struct xfrm_dst *xdst, struct net_device *dev) { struct xfrm_policy_afinfo *afinfo = xfrm_policy_get_afinfo(xdst->u.dst.ops->family); @@ -1382,7 +1381,7 @@ static inline int xfrm_fill_dst(struct xfrm_dst *xdst, struct net_device *dev, if (!afinfo) return -EINVAL; - err = afinfo->fill_dst(xdst, dev, fl); + err = afinfo->fill_dst(xdst, dev); xfrm_policy_put_afinfo(afinfo); @@ -1487,7 +1486,7 @@ static struct dst_entry *xfrm_bundle_create(struct xfrm_policy *policy, for (dst_prev = dst0; dst_prev != dst; dst_prev = dst_prev->child) { struct xfrm_dst *xdst = (struct xfrm_dst *)dst_prev; - err = xfrm_fill_dst(xdst, dev, fl); + err = xfrm_fill_dst(xdst, dev); if (err) goto free_dst; diff --git a/trunk/samples/hw_breakpoint/data_breakpoint.c b/trunk/samples/hw_breakpoint/data_breakpoint.c index bd0f337afcab..c69cbe9b2426 100644 --- a/trunk/samples/hw_breakpoint/data_breakpoint.c +++ b/trunk/samples/hw_breakpoint/data_breakpoint.c @@ -34,7 +34,7 @@ #include #include -struct perf_event * __percpu *sample_hbp; +struct perf_event **sample_hbp; static char ksym_name[KSYM_NAME_LEN] = "pid_max"; module_param_string(ksym, ksym_name, KSYM_NAME_LEN, S_IRUGO); @@ -61,8 +61,8 @@ static int __init hw_break_module_init(void) attr.bp_type = HW_BREAKPOINT_W | HW_BREAKPOINT_R; sample_hbp = register_wide_hw_breakpoint(&attr, sample_hbp_handler); - if (IS_ERR((void __force *)sample_hbp)) { - ret = PTR_ERR((void __force *)sample_hbp); + if (IS_ERR(sample_hbp)) { + ret = PTR_ERR(sample_hbp); goto fail; } diff --git a/trunk/security/tomoyo/common.c b/trunk/security/tomoyo/common.c index ef89947a774b..ff51f1026b57 100644 --- a/trunk/security/tomoyo/common.c +++ b/trunk/security/tomoyo/common.c @@ -886,7 +886,6 @@ static struct tomoyo_profile *tomoyo_find_or_assign_new_profile(const unsigned ptr = kmalloc(sizeof(*ptr), GFP_KERNEL); if (!tomoyo_memory_ok(ptr)) { kfree(ptr); - ptr = NULL; goto ok; } for (i = 0; i < TOMOYO_MAX_CONTROL_INDEX; i++) diff --git a/trunk/sound/isa/opti9xx/opti92x-ad1848.c b/trunk/sound/isa/opti9xx/opti92x-ad1848.c index 4d2d0405bdc7..becd90d7536d 100644 --- a/trunk/sound/isa/opti9xx/opti92x-ad1848.c +++ b/trunk/sound/isa/opti9xx/opti92x-ad1848.c @@ -217,9 +217,8 @@ static int __devinit snd_opti9xx_init(struct snd_opti9xx *chip, if (isapnp && chip->mc_base) /* PnP resource gives the least 10 bits */ chip->mc_base |= 0xc00; - else #endif /* CONFIG_PNP */ - { + else { chip->mc_base = 0xf8c; chip->mc_base_size = opti9xx_mc_size[hardware]; } diff --git a/trunk/sound/oss/sequencer.c b/trunk/sound/oss/sequencer.c index e85789e53816..c79874696bec 100644 --- a/trunk/sound/oss/sequencer.c +++ b/trunk/sound/oss/sequencer.c @@ -1631,6 +1631,8 @@ unsigned long compute_finetune(unsigned long base_freq, int bend, int range, } semitones = bend / 100; + if (semitones > 99) + semitones = 99; cents = bend % 100; amount = (int) (semitone_tuning[semitones] * multiplier * cent_tuning[cents]) / 10000; diff --git a/trunk/sound/pci/hda/hda_codec.c b/trunk/sound/pci/hda/hda_codec.c index 0e76ac2b2ace..5bd7cf45f3a5 100644 --- a/trunk/sound/pci/hda/hda_codec.c +++ b/trunk/sound/pci/hda/hda_codec.c @@ -1806,8 +1806,6 @@ int snd_hda_add_nid(struct hda_codec *codec, struct snd_kcontrol *kctl, item->nid = nid; return 0; } - printk(KERN_ERR "hda-codec: no NID for mapping control %s:%d:%d\n", - kctl->id.name, kctl->id.index, index); return -EINVAL; } EXPORT_SYMBOL_HDA(snd_hda_add_nid); @@ -2886,7 +2884,7 @@ int /*__devinit*/ snd_hda_build_controls(struct hda_bus *bus) list_for_each_entry(codec, &bus->codec_list, list) { int err = snd_hda_codec_build_controls(codec); if (err < 0) { - printk(KERN_ERR "hda_codec: cannot build controls " + printk(KERN_ERR "hda_codec: cannot build controls" "for #%d (error %d)\n", codec->addr, err); err = snd_hda_codec_reset(codec); if (err < 0) { diff --git a/trunk/sound/pci/hda/hda_intel.c b/trunk/sound/pci/hda/hda_intel.c index 8b2915631cc3..43b7cfb7cffd 100644 --- a/trunk/sound/pci/hda/hda_intel.c +++ b/trunk/sound/pci/hda/hda_intel.c @@ -2271,7 +2271,6 @@ static struct snd_pci_quirk position_fix_list[] __devinitdata = { SND_PCI_QUIRK(0x1043, 0x813d, "ASUS P5AD2", POS_FIX_LPIB), SND_PCI_QUIRK(0x1462, 0x1002, "MSI Wind U115", POS_FIX_LPIB), SND_PCI_QUIRK(0x1565, 0x820f, "Biostar Microtech", POS_FIX_LPIB), - SND_PCI_QUIRK(0x8086, 0xd601, "eMachines T5212", POS_FIX_LPIB), {} }; @@ -2359,7 +2358,6 @@ static void __devinit check_probe_mask(struct azx *chip, int dev) static struct snd_pci_quirk msi_black_list[] __devinitdata = { SND_PCI_QUIRK(0x1043, 0x81f2, "ASUS", 0), /* Athlon64 X2 + nvidia */ SND_PCI_QUIRK(0x1043, 0x81f6, "ASUS", 0), /* nvidia */ - SND_PCI_QUIRK(0x1043, 0x822d, "ASUS", 0), /* Athlon64 X2 + nvidia MCP55 */ SND_PCI_QUIRK(0x1849, 0x0888, "ASRock", 0), /* Athlon64 X2 + nvidia */ {} }; @@ -2379,13 +2377,6 @@ static void __devinit check_msi(struct azx *chip) "hda_intel: msi for device %04x:%04x set to %d\n", q->subvendor, q->subdevice, q->value); chip->msi = q->value; - return; - } - - /* NVidia chipsets seem to cause troubles with MSI */ - if (chip->driver_type == AZX_DRIVER_NVIDIA) { - printk(KERN_INFO "hda_intel: Disable MSI for Nvidia chipset\n"); - chip->msi = 0; } } @@ -2714,7 +2705,6 @@ static DEFINE_PCI_DEVICE_TABLE(azx_ids) = { { PCI_DEVICE(0x8086, 0x3a6e), .driver_data = AZX_DRIVER_ICH }, /* PCH */ { PCI_DEVICE(0x8086, 0x3b56), .driver_data = AZX_DRIVER_ICH }, - { PCI_DEVICE(0x8086, 0x3b57), .driver_data = AZX_DRIVER_ICH }, /* CPT */ { PCI_DEVICE(0x8086, 0x1c20), .driver_data = AZX_DRIVER_PCH }, /* SCH */ diff --git a/trunk/sound/pci/hda/patch_realtek.c b/trunk/sound/pci/hda/patch_realtek.c index 4ec57633af88..5d2fbb87b871 100644 --- a/trunk/sound/pci/hda/patch_realtek.c +++ b/trunk/sound/pci/hda/patch_realtek.c @@ -411,8 +411,6 @@ static int alc_mux_enum_info(struct snd_kcontrol *kcontrol, unsigned int mux_idx = snd_ctl_get_ioffidx(kcontrol, &uinfo->id); if (mux_idx >= spec->num_mux_defs) mux_idx = 0; - if (!spec->input_mux[mux_idx].num_items && mux_idx > 0) - mux_idx = 0; return snd_hda_input_mux_info(&spec->input_mux[mux_idx], uinfo); } @@ -441,8 +439,6 @@ static int alc_mux_enum_put(struct snd_kcontrol *kcontrol, mux_idx = adc_idx >= spec->num_mux_defs ? 0 : adc_idx; imux = &spec->input_mux[mux_idx]; - if (!imux->num_items && mux_idx > 0) - imux = &spec->input_mux[0]; type = get_wcaps_type(get_wcaps(codec, nid)); if (type == AC_WID_AUD_MIX) { @@ -6477,7 +6473,7 @@ static struct alc_config_preset alc260_presets[] = { .num_dacs = ARRAY_SIZE(alc260_dac_nids), .dac_nids = alc260_dac_nids, .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids), - .adc_nids = alc260_dual_adc_nids, + .adc_nids = alc260_adc_nids, .num_channel_mode = ARRAY_SIZE(alc260_modes), .channel_mode = alc260_modes, .input_mux = &alc260_capture_source, @@ -9195,7 +9191,6 @@ static struct snd_pci_quirk alc882_cfg_tbl[] = { SND_PCI_QUIRK(0x1462, 0x4314, "MSI", ALC883_TARGA_DIG), SND_PCI_QUIRK(0x1462, 0x4319, "MSI", ALC883_TARGA_DIG), SND_PCI_QUIRK(0x1462, 0x4324, "MSI", ALC883_TARGA_DIG), - SND_PCI_QUIRK(0x1462, 0x4570, "MSI Wind Top AE2220", ALC883_TARGA_DIG), SND_PCI_QUIRK(0x1462, 0x6510, "MSI GX620", ALC883_TARGA_8ch_DIG), SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC883_6ST_DIG), SND_PCI_QUIRK(0x1462, 0x7187, "MSI", ALC883_6ST_DIG), @@ -9205,7 +9200,6 @@ static struct snd_pci_quirk alc882_cfg_tbl[] = { SND_PCI_QUIRK(0x1462, 0x7280, "MSI", ALC883_6ST_DIG), SND_PCI_QUIRK(0x1462, 0x7327, "MSI", ALC883_6ST_DIG), SND_PCI_QUIRK(0x1462, 0x7350, "MSI", ALC883_6ST_DIG), - SND_PCI_QUIRK(0x1462, 0x7437, "MSI NetOn AP1900", ALC883_TARGA_DIG), SND_PCI_QUIRK(0x1462, 0xa422, "MSI", ALC883_TARGA_2ch_DIG), SND_PCI_QUIRK(0x1462, 0xaa08, "MSI", ALC883_TARGA_2ch_DIG), @@ -9237,7 +9231,7 @@ static struct snd_pci_quirk alc882_cfg_tbl[] = { SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC889_INTEL), SND_PCI_QUIRK(0x8086, 0x0021, "Intel IbexPeak", ALC889A_INTEL), SND_PCI_QUIRK(0x8086, 0x3b56, "Intel IbexPeak", ALC889A_INTEL), - SND_PCI_QUIRK(0x8086, 0xd601, "D102GGC", ALC882_6ST_DIG), + SND_PCI_QUIRK(0x8086, 0xd601, "D102GGC", ALC883_3ST_6ch), {} }; @@ -10111,8 +10105,6 @@ static void alc882_auto_init_input_src(struct hda_codec *codec) continue; mux_idx = c >= spec->num_mux_defs ? 0 : c; imux = &spec->input_mux[mux_idx]; - if (!imux->num_items && mux_idx > 0) - imux = &spec->input_mux[0]; for (idx = 0; idx < conns; idx++) { /* if the current connection is the selected one, * unmute it as default - otherwise mute it @@ -13209,7 +13201,7 @@ static int patch_alc268(struct hda_codec *codec) if (board_config < 0 || board_config >= ALC268_MODEL_LAST) board_config = snd_hda_check_board_codec_sid_config(codec, - ALC268_MODEL_LAST, alc268_models, alc268_ssid_cfg_tbl); + ALC882_MODEL_LAST, alc268_models, alc268_ssid_cfg_tbl); if (board_config < 0 || board_config >= ALC268_MODEL_LAST) { printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n", diff --git a/trunk/tools/perf/Documentation/Makefile b/trunk/tools/perf/Documentation/Makefile index bd498d496952..bdd3b7ecad0a 100644 --- a/trunk/tools/perf/Documentation/Makefile +++ b/trunk/tools/perf/Documentation/Makefile @@ -24,10 +24,7 @@ DOC_MAN1=$(patsubst %.txt,%.1,$(MAN1_TXT)) DOC_MAN5=$(patsubst %.txt,%.5,$(MAN5_TXT)) DOC_MAN7=$(patsubst %.txt,%.7,$(MAN7_TXT)) -# Make the path relative to DESTDIR, not prefix -ifndef DESTDIR prefix?=$(HOME) -endif bindir?=$(prefix)/bin htmldir?=$(prefix)/share/doc/perf-doc pdfdir?=$(prefix)/share/doc/perf-doc @@ -35,6 +32,7 @@ mandir?=$(prefix)/share/man man1dir=$(mandir)/man1 man5dir=$(mandir)/man5 man7dir=$(mandir)/man7 +# DESTDIR= ASCIIDOC=asciidoc ASCIIDOC_EXTRA = --unsafe diff --git a/trunk/tools/perf/Documentation/perf-lock.txt b/trunk/tools/perf/Documentation/perf-lock.txt deleted file mode 100644 index b317102138c8..000000000000 --- a/trunk/tools/perf/Documentation/perf-lock.txt +++ /dev/null @@ -1,29 +0,0 @@ -perf-lock(1) -============ - -NAME ----- -perf-lock - Analyze lock events - -SYNOPSIS --------- -[verse] -'perf lock' {record|report|trace} - -DESCRIPTION ------------ -You can analyze various lock behaviours -and statistics with this 'perf lock' command. - - 'perf lock record ' records lock events - between start and end . And this command - produces the file "perf.data" which contains tracing - results of lock events. - - 'perf lock trace' shows raw lock events. - - 'perf lock report' reports statistical data. - -SEE ALSO --------- -linkperf:perf[1] diff --git a/trunk/tools/perf/Makefile b/trunk/tools/perf/Makefile index 8a8f52db7e38..2d537382c686 100644 --- a/trunk/tools/perf/Makefile +++ b/trunk/tools/perf/Makefile @@ -216,10 +216,7 @@ STRIP ?= strip # runtime figures out where they are based on the path to the executable. # This can help installing the suite in a relocatable way. -# Make the path relative to DESTDIR, not to prefix -ifndef DESTDIR prefix = $(HOME) -endif bindir_relative = bin bindir = $(prefix)/$(bindir_relative) mandir = share/man @@ -236,6 +233,7 @@ sysconfdir = $(prefix)/etc ETC_PERFCONFIG = etc/perfconfig endif lib = lib +# DESTDIR= export prefix bindir sharedir sysconfdir @@ -389,7 +387,6 @@ LIB_H += util/thread.h LIB_H += util/trace-event.h LIB_H += util/probe-finder.h LIB_H += util/probe-event.h -LIB_H += util/cpumap.h LIB_OBJS += util/abspath.o LIB_OBJS += util/alias.o @@ -436,7 +433,6 @@ LIB_OBJS += util/sort.o LIB_OBJS += util/hist.o LIB_OBJS += util/probe-event.o LIB_OBJS += util/util.o -LIB_OBJS += util/cpumap.o BUILTIN_OBJS += builtin-annotate.o diff --git a/trunk/tools/perf/builtin-annotate.c b/trunk/tools/perf/builtin-annotate.c index 6ad7148451c5..5ec5de995872 100644 --- a/trunk/tools/perf/builtin-annotate.c +++ b/trunk/tools/perf/builtin-annotate.c @@ -116,7 +116,7 @@ static int perf_session__add_hist_entry(struct perf_session *self, return 0; } - he = __perf_session__add_hist_entry(&self->hists, al, NULL, count, &hit); + he = __perf_session__add_hist_entry(self, al, NULL, count, &hit); if (he == NULL) return -ENOMEM; @@ -564,8 +564,8 @@ static int __cmd_annotate(void) if (verbose > 2) dsos__fprintf(stdout); - perf_session__collapse_resort(&session->hists); - perf_session__output_resort(&session->hists, session->event_total[0]); + perf_session__collapse_resort(session); + perf_session__output_resort(session, session->event_total[0]); perf_session__find_annotations(session); out_delete: perf_session__delete(session); diff --git a/trunk/tools/perf/builtin-diff.c b/trunk/tools/perf/builtin-diff.c index 1ea15d8aeed1..18b3f505f9db 100644 --- a/trunk/tools/perf/builtin-diff.c +++ b/trunk/tools/perf/builtin-diff.c @@ -26,8 +26,7 @@ static int perf_session__add_hist_entry(struct perf_session *self, struct addr_location *al, u64 count) { bool hit; - struct hist_entry *he = __perf_session__add_hist_entry(&self->hists, - al, NULL, + struct hist_entry *he = __perf_session__add_hist_entry(self, al, NULL, count, &hit); if (he == NULL) return -ENOMEM; @@ -115,7 +114,7 @@ static void perf_session__resort_hist_entries(struct perf_session *self) static void perf_session__set_hist_entries_positions(struct perf_session *self) { - perf_session__output_resort(&self->hists, self->events_stats.total); + perf_session__output_resort(self, self->events_stats.total); perf_session__resort_hist_entries(self); } @@ -167,15 +166,13 @@ static int __cmd_diff(void) goto out_delete; } - perf_session__output_resort(&session[1]->hists, - session[1]->events_stats.total); + perf_session__output_resort(session[1], session[1]->events_stats.total); if (show_displacement) perf_session__set_hist_entries_positions(session[0]); perf_session__match_hists(session[0], session[1]); - perf_session__fprintf_hists(&session[1]->hists, session[0], - show_displacement, stdout, - session[1]->events_stats.total); + perf_session__fprintf_hists(session[1], session[0], + show_displacement, stdout); out_delete: for (i = 0; i < 2; ++i) perf_session__delete(session[i]); diff --git a/trunk/tools/perf/builtin-lock.c b/trunk/tools/perf/builtin-lock.c index e12c844df1e2..fb9ab2ad3f92 100644 --- a/trunk/tools/perf/builtin-lock.c +++ b/trunk/tools/perf/builtin-lock.c @@ -460,150 +460,6 @@ process_raw_event(void *data, int cpu, process_lock_release_event(data, event, cpu, timestamp, thread); } -struct raw_event_queue { - u64 timestamp; - int cpu; - void *data; - struct thread *thread; - struct list_head list; -}; - -static LIST_HEAD(raw_event_head); - -#define FLUSH_PERIOD (5 * NSEC_PER_SEC) - -static u64 flush_limit = ULLONG_MAX; -static u64 last_flush = 0; -struct raw_event_queue *last_inserted; - -static void flush_raw_event_queue(u64 limit) -{ - struct raw_event_queue *tmp, *iter; - - list_for_each_entry_safe(iter, tmp, &raw_event_head, list) { - if (iter->timestamp > limit) - return; - - if (iter == last_inserted) - last_inserted = NULL; - - process_raw_event(iter->data, iter->cpu, iter->timestamp, - iter->thread); - - last_flush = iter->timestamp; - list_del(&iter->list); - free(iter->data); - free(iter); - } -} - -static void __queue_raw_event_end(struct raw_event_queue *new) -{ - struct raw_event_queue *iter; - - list_for_each_entry_reverse(iter, &raw_event_head, list) { - if (iter->timestamp < new->timestamp) { - list_add(&new->list, &iter->list); - return; - } - } - - list_add(&new->list, &raw_event_head); -} - -static void __queue_raw_event_before(struct raw_event_queue *new, - struct raw_event_queue *iter) -{ - list_for_each_entry_continue_reverse(iter, &raw_event_head, list) { - if (iter->timestamp < new->timestamp) { - list_add(&new->list, &iter->list); - return; - } - } - - list_add(&new->list, &raw_event_head); -} - -static void __queue_raw_event_after(struct raw_event_queue *new, - struct raw_event_queue *iter) -{ - list_for_each_entry_continue(iter, &raw_event_head, list) { - if (iter->timestamp > new->timestamp) { - list_add_tail(&new->list, &iter->list); - return; - } - } - list_add_tail(&new->list, &raw_event_head); -} - -/* The queue is ordered by time */ -static void __queue_raw_event(struct raw_event_queue *new) -{ - if (!last_inserted) { - __queue_raw_event_end(new); - return; - } - - /* - * Most of the time the current event has a timestamp - * very close to the last event inserted, unless we just switched - * to another event buffer. Having a sorting based on a list and - * on the last inserted event that is close to the current one is - * probably more efficient than an rbtree based sorting. - */ - if (last_inserted->timestamp >= new->timestamp) - __queue_raw_event_before(new, last_inserted); - else - __queue_raw_event_after(new, last_inserted); -} - -static void queue_raw_event(void *data, int raw_size, int cpu, - u64 timestamp, struct thread *thread) -{ - struct raw_event_queue *new; - - if (flush_limit == ULLONG_MAX) - flush_limit = timestamp + FLUSH_PERIOD; - - if (timestamp < last_flush) { - printf("Warning: Timestamp below last timeslice flush\n"); - return; - } - - new = malloc(sizeof(*new)); - if (!new) - die("Not enough memory\n"); - - new->timestamp = timestamp; - new->cpu = cpu; - new->thread = thread; - - new->data = malloc(raw_size); - if (!new->data) - die("Not enough memory\n"); - - memcpy(new->data, data, raw_size); - - __queue_raw_event(new); - last_inserted = new; - - /* - * We want to have a slice of events covering 2 * FLUSH_PERIOD - * If FLUSH_PERIOD is big enough, it ensures every events that occured - * in the first half of the timeslice have all been buffered and there - * are none remaining (we need that because of the weakly ordered - * event recording we have). Then once we reach the 2 * FLUSH_PERIOD - * timeslice, we flush the first half to be gentle with the memory - * (the second half can still get new events in the middle, so wait - * another period to flush it) - */ - if (new->timestamp > flush_limit && - new->timestamp - flush_limit > FLUSH_PERIOD) { - flush_limit += FLUSH_PERIOD; - flush_raw_event_queue(flush_limit); - } -} - static int process_sample_event(event_t *event, struct perf_session *session) { struct thread *thread; @@ -624,7 +480,7 @@ static int process_sample_event(event_t *event, struct perf_session *session) if (profile_cpu != -1 && profile_cpu != (int) data.cpu) return 0; - queue_raw_event(data.raw_data, data.raw_size, data.cpu, data.time, thread); + process_raw_event(data.raw_data, data.cpu, data.time, thread); return 0; } @@ -720,7 +576,6 @@ static void __cmd_report(void) setup_pager(); select_key(); read_events(); - flush_raw_event_queue(ULLONG_MAX); sort_result(); print_result(); } @@ -753,6 +608,7 @@ static const char *record_args[] = { "record", "-a", "-R", + "-M", "-f", "-m", "1024", "-c", "1", diff --git a/trunk/tools/perf/builtin-record.c b/trunk/tools/perf/builtin-record.c index 3b8b6387c47c..771533ced6a8 100644 --- a/trunk/tools/perf/builtin-record.c +++ b/trunk/tools/perf/builtin-record.c @@ -22,7 +22,6 @@ #include "util/debug.h" #include "util/session.h" #include "util/symbol.h" -#include "util/cpumap.h" #include #include @@ -245,9 +244,6 @@ static void create_counter(int counter, int cpu, pid_t pid) attr->sample_type |= PERF_SAMPLE_IP | PERF_SAMPLE_TID; - if (nr_counters > 1) - attr->sample_type |= PERF_SAMPLE_ID; - if (freq) { attr->sample_type |= PERF_SAMPLE_PERIOD; attr->freq = 1; @@ -395,9 +391,6 @@ static int process_buildids(void) { u64 size = lseek(output, 0, SEEK_CUR); - if (size == 0) - return 0; - session->fd = output; return __perf_session__process_events(session, post_processing_offset, size - post_processing_offset, @@ -425,6 +418,9 @@ static int __cmd_record(int argc, const char **argv) char buf; page_size = sysconf(_SC_PAGE_SIZE); + nr_cpus = sysconf(_SC_NPROCESSORS_ONLN); + assert(nr_cpus <= MAX_NR_CPUS); + assert(nr_cpus >= 0); atexit(sig_atexit); signal(SIGCHLD, sig_handler); @@ -548,9 +544,8 @@ static int __cmd_record(int argc, const char **argv) if ((!system_wide && !inherit) || profile_cpu != -1) { open_counters(profile_cpu, target_pid); } else { - nr_cpus = read_cpu_map(); for (i = 0; i < nr_cpus; i++) - open_counters(cpumap[i], target_pid); + open_counters(i, target_pid); } if (file_new) { diff --git a/trunk/tools/perf/builtin-report.c b/trunk/tools/perf/builtin-report.c index f815de25d0fc..cfc655d40bb7 100644 --- a/trunk/tools/perf/builtin-report.c +++ b/trunk/tools/perf/builtin-report.c @@ -45,71 +45,28 @@ static char *pretty_printing_style = default_pretty_printing_style; static char callchain_default_opt[] = "fractal,0.5"; -static struct event_stat_id *get_stats(struct perf_session *self, - u64 event_stream, u32 type, u64 config) -{ - struct rb_node **p = &self->stats_by_id.rb_node; - struct rb_node *parent = NULL; - struct event_stat_id *iter, *new; - - while (*p != NULL) { - parent = *p; - iter = rb_entry(parent, struct event_stat_id, rb_node); - if (iter->config == config) - return iter; - - - if (config > iter->config) - p = &(*p)->rb_right; - else - p = &(*p)->rb_left; - } - - new = malloc(sizeof(struct event_stat_id)); - if (new == NULL) - return NULL; - memset(new, 0, sizeof(struct event_stat_id)); - new->event_stream = event_stream; - new->config = config; - new->type = type; - rb_link_node(&new->rb_node, parent, p); - rb_insert_color(&new->rb_node, &self->stats_by_id); - return new; -} - static int perf_session__add_hist_entry(struct perf_session *self, struct addr_location *al, - struct sample_data *data) + struct ip_callchain *chain, u64 count) { struct symbol **syms = NULL, *parent = NULL; bool hit; struct hist_entry *he; - struct event_stat_id *stats; - struct perf_event_attr *attr; - if ((sort__has_parent || symbol_conf.use_callchain) && data->callchain) + if ((sort__has_parent || symbol_conf.use_callchain) && chain) syms = perf_session__resolve_callchain(self, al->thread, - data->callchain, &parent); - - attr = perf_header__find_attr(data->id, &self->header); - if (attr) - stats = get_stats(self, data->id, attr->type, attr->config); - else - stats = get_stats(self, data->id, 0, 0); - if (stats == NULL) - return -ENOMEM; - he = __perf_session__add_hist_entry(&stats->hists, al, parent, - data->period, &hit); + chain, &parent); + he = __perf_session__add_hist_entry(self, al, parent, count, &hit); if (he == NULL) return -ENOMEM; if (hit) - he->count += data->period; + he->count += count; if (symbol_conf.use_callchain) { if (!hit) callchain_init(&he->callchain); - append_chain(&he->callchain, data->callchain, syms); + append_chain(&he->callchain, chain, syms); free(syms); } @@ -129,30 +86,10 @@ static int validate_chain(struct ip_callchain *chain, event_t *event) return 0; } -static int add_event_total(struct perf_session *session, - struct sample_data *data, - struct perf_event_attr *attr) -{ - struct event_stat_id *stats; - - if (attr) - stats = get_stats(session, data->id, attr->type, attr->config); - else - stats = get_stats(session, data->id, 0, 0); - - if (!stats) - return -ENOMEM; - - stats->stats.total += data->period; - session->events_stats.total += data->period; - return 0; -} - static int process_sample_event(event_t *event, struct perf_session *session) { struct sample_data data = { .period = 1, }; struct addr_location al; - struct perf_event_attr *attr; event__parse_sample(event, session->sample_type, &data); @@ -186,18 +123,12 @@ static int process_sample_event(event_t *event, struct perf_session *session) if (al.filtered || (hide_unresolved && al.sym == NULL)) return 0; - if (perf_session__add_hist_entry(session, &al, &data)) { + if (perf_session__add_hist_entry(session, &al, data.callchain, data.period)) { pr_debug("problem incrementing symbol count, skipping event\n"); return -1; } - attr = perf_header__find_attr(data.id, &session->header); - - if (add_event_total(session, &data, attr)) { - pr_debug("problem adding event count\n"); - return -1; - } - + session->events_stats.total += data.period; return 0; } @@ -266,7 +197,6 @@ static int __cmd_report(void) { int ret = -EINVAL; struct perf_session *session; - struct rb_node *next; session = perf_session__new(input_name, O_RDONLY, force); if (session == NULL) @@ -294,28 +224,10 @@ static int __cmd_report(void) if (verbose > 2) dsos__fprintf(stdout); - next = rb_first(&session->stats_by_id); - while (next) { - struct event_stat_id *stats; - - stats = rb_entry(next, struct event_stat_id, rb_node); - perf_session__collapse_resort(&stats->hists); - perf_session__output_resort(&stats->hists, stats->stats.total); - if (rb_first(&session->stats_by_id) == - rb_last(&session->stats_by_id)) - fprintf(stdout, "# Samples: %Ld\n#\n", - stats->stats.total); - else - fprintf(stdout, "# Samples: %Ld %s\n#\n", - stats->stats.total, - __event_name(stats->type, stats->config)); - - perf_session__fprintf_hists(&stats->hists, NULL, false, stdout, - stats->stats.total); - fprintf(stdout, "\n\n"); - next = rb_next(&stats->rb_node); - } - + perf_session__collapse_resort(session); + perf_session__output_resort(session, session->events_stats.total); + fprintf(stdout, "# Samples: %Ld\n#\n", session->events_stats.total); + perf_session__fprintf_hists(session, NULL, false, stdout); if (sort_order == default_sort_order && parent_pattern == default_parent_pattern) fprintf(stdout, "#\n# (For a higher level overview, try: perf report --sort comm,dso)\n#\n"); diff --git a/trunk/tools/perf/builtin-stat.c b/trunk/tools/perf/builtin-stat.c index 95db31cff6fd..e8c85d5aec41 100644 --- a/trunk/tools/perf/builtin-stat.c +++ b/trunk/tools/perf/builtin-stat.c @@ -45,7 +45,6 @@ #include "util/event.h" #include "util/debug.h" #include "util/header.h" -#include "util/cpumap.h" #include #include @@ -152,7 +151,7 @@ static void create_perf_stat_counter(int counter, int pid) unsigned int cpu; for (cpu = 0; cpu < nr_cpus; cpu++) { - fd[cpu][counter] = sys_perf_event_open(attr, -1, cpumap[cpu], -1, 0); + fd[cpu][counter] = sys_perf_event_open(attr, -1, cpu, -1, 0); if (fd[cpu][counter] < 0 && verbose) fprintf(stderr, ERR_PERF_OPEN, counter, fd[cpu][counter], strerror(errno)); @@ -520,10 +519,9 @@ int cmd_stat(int argc, const char **argv, const char *prefix __used) nr_counters = ARRAY_SIZE(default_attrs); } - if (system_wide) - nr_cpus = read_cpu_map(); - else - nr_cpus = 1; + nr_cpus = sysconf(_SC_NPROCESSORS_ONLN); + assert(nr_cpus <= MAX_NR_CPUS); + assert((int)nr_cpus >= 0); /* * We dont want to block the signals - that would cause diff --git a/trunk/tools/perf/builtin-top.c b/trunk/tools/perf/builtin-top.c index 0b719e3dde05..31f2e597800c 100644 --- a/trunk/tools/perf/builtin-top.c +++ b/trunk/tools/perf/builtin-top.c @@ -28,7 +28,6 @@ #include #include "util/parse-options.h" #include "util/parse-events.h" -#include "util/cpumap.h" #include "util/debug.h" @@ -1124,7 +1123,7 @@ static void start_counter(int i, int counter) cpu = profile_cpu; if (target_pid == -1 && profile_cpu == -1) - cpu = cpumap[i]; + cpu = i; attr = attrs + counter; @@ -1348,10 +1347,12 @@ int cmd_top(int argc, const char **argv, const char *prefix __used) attrs[counter].sample_period = default_interval; } + nr_cpus = sysconf(_SC_NPROCESSORS_ONLN); + assert(nr_cpus <= MAX_NR_CPUS); + assert(nr_cpus >= 0); + if (target_pid != -1 || profile_cpu != -1) nr_cpus = 1; - else - nr_cpus = read_cpu_map(); get_term_dimensions(&winsize); if (print_entries == 0) { diff --git a/trunk/tools/perf/builtin-trace.c b/trunk/tools/perf/builtin-trace.c index 407041d20de0..5db687fc13de 100644 --- a/trunk/tools/perf/builtin-trace.c +++ b/trunk/tools/perf/builtin-trace.c @@ -573,8 +573,7 @@ int cmd_trace(int argc, const char **argv, const char *prefix __used) if (symbol__init() < 0) return -1; - if (!script_name) - setup_pager(); + setup_pager(); session = perf_session__new(input_name, O_RDONLY, 0); if (session == NULL) @@ -609,6 +608,7 @@ int cmd_trace(int argc, const char **argv, const char *prefix __used) return -1; } + perf_header__read(&session->header, input); err = scripting_ops->generate_script("perf-trace"); goto out; } diff --git a/trunk/tools/perf/command-list.txt b/trunk/tools/perf/command-list.txt index db6ee94d4a8e..9afcff2e3ae5 100644 --- a/trunk/tools/perf/command-list.txt +++ b/trunk/tools/perf/command-list.txt @@ -18,4 +18,3 @@ perf-top mainporcelain common perf-trace mainporcelain common perf-probe mainporcelain common perf-kmem mainporcelain common -perf-lock mainporcelain common diff --git a/trunk/tools/perf/perf-archive.sh b/trunk/tools/perf/perf-archive.sh index 910468e6e01c..45fbe2f07b15 100644 --- a/trunk/tools/perf/perf-archive.sh +++ b/trunk/tools/perf/perf-archive.sh @@ -9,9 +9,8 @@ fi DEBUGDIR=~/.debug/ BUILDIDS=$(mktemp /tmp/perf-archive-buildids.XXXXXX) -NOBUILDID=0000000000000000000000000000000000000000 -perf buildid-list -i $PERF_DATA --with-hits | grep -v "^$NOBUILDID " > $BUILDIDS +perf buildid-list -i $PERF_DATA --with-hits > $BUILDIDS if [ ! -s $BUILDIDS ] ; then echo "perf archive: no build-ids found" rm -f $BUILDIDS diff --git a/trunk/tools/perf/perf.h b/trunk/tools/perf/perf.h index 6fb379bc1d1f..75f941bfba9e 100644 --- a/trunk/tools/perf/perf.h +++ b/trunk/tools/perf/perf.h @@ -65,7 +65,9 @@ * Use the __kuser_memory_barrier helper in the CPU helper page. See * arch/arm/kernel/entry-armv.S in the kernel source for details. */ -#define rmb() ((void(*)(void))0xffff0fa0)() +#define rmb() asm volatile("mov r0, #0xffff0fff; mov lr, pc;" \ + "sub pc, r0, #95" ::: "r0", "lr", "cc", \ + "memory") #define cpu_relax() asm volatile("":::"memory") #endif diff --git a/trunk/tools/perf/util/cpumap.c b/trunk/tools/perf/util/cpumap.c deleted file mode 100644 index 4e01490e51e5..000000000000 --- a/trunk/tools/perf/util/cpumap.c +++ /dev/null @@ -1,59 +0,0 @@ -#include "util.h" -#include "../perf.h" -#include "cpumap.h" -#include -#include - -int cpumap[MAX_NR_CPUS]; - -static int default_cpu_map(void) -{ - int nr_cpus, i; - - nr_cpus = sysconf(_SC_NPROCESSORS_ONLN); - assert(nr_cpus <= MAX_NR_CPUS); - assert((int)nr_cpus >= 0); - - for (i = 0; i < nr_cpus; ++i) - cpumap[i] = i; - - return nr_cpus; -} - -int read_cpu_map(void) -{ - FILE *onlnf; - int nr_cpus = 0; - int n, cpu, prev; - char sep; - - onlnf = fopen("/sys/devices/system/cpu/online", "r"); - if (!onlnf) - return default_cpu_map(); - - sep = 0; - prev = -1; - for (;;) { - n = fscanf(onlnf, "%u%c", &cpu, &sep); - if (n <= 0) - break; - if (prev >= 0) { - assert(nr_cpus + cpu - prev - 1 < MAX_NR_CPUS); - while (++prev < cpu) - cpumap[nr_cpus++] = prev; - } - assert (nr_cpus < MAX_NR_CPUS); - cpumap[nr_cpus++] = cpu; - if (n == 2 && sep == '-') - prev = cpu; - else - prev = -1; - if (n == 1 || sep == '\n') - break; - } - fclose(onlnf); - if (nr_cpus > 0) - return nr_cpus; - - return default_cpu_map(); -} diff --git a/trunk/tools/perf/util/cpumap.h b/trunk/tools/perf/util/cpumap.h deleted file mode 100644 index 86c78bb33098..000000000000 --- a/trunk/tools/perf/util/cpumap.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef __PERF_CPUMAP_H -#define __PERF_CPUMAP_H - -extern int read_cpu_map(void); -extern int cpumap[]; - -#endif /* __PERF_CPUMAP_H */ diff --git a/trunk/tools/perf/util/event.h b/trunk/tools/perf/util/event.h index a33b94952e34..50a7132887f5 100644 --- a/trunk/tools/perf/util/event.h +++ b/trunk/tools/perf/util/event.h @@ -99,15 +99,6 @@ struct events_stats { u64 lost; }; -struct event_stat_id { - struct rb_node rb_node; - struct rb_root hists; - struct events_stats stats; - u64 config; - u64 event_stream; - u32 type; -}; - void event__print_totals(void); struct perf_session; diff --git a/trunk/tools/perf/util/hist.c b/trunk/tools/perf/util/hist.c index 2be33c7dbf03..44408c2621cf 100644 --- a/trunk/tools/perf/util/hist.c +++ b/trunk/tools/perf/util/hist.c @@ -12,12 +12,12 @@ struct callchain_param callchain_param = { * histogram, sorted on item, collects counts */ -struct hist_entry *__perf_session__add_hist_entry(struct rb_root *hists, +struct hist_entry *__perf_session__add_hist_entry(struct perf_session *self, struct addr_location *al, struct symbol *sym_parent, u64 count, bool *hit) { - struct rb_node **p = &hists->rb_node; + struct rb_node **p = &self->hists.rb_node; struct rb_node *parent = NULL; struct hist_entry *he; struct hist_entry entry = { @@ -53,7 +53,7 @@ struct hist_entry *__perf_session__add_hist_entry(struct rb_root *hists, return NULL; *he = entry; rb_link_node(&he->rb_node, parent, p); - rb_insert_color(&he->rb_node, hists); + rb_insert_color(&he->rb_node, &self->hists); *hit = false; return he; } @@ -130,7 +130,7 @@ static void collapse__insert_entry(struct rb_root *root, struct hist_entry *he) rb_insert_color(&he->rb_node, root); } -void perf_session__collapse_resort(struct rb_root *hists) +void perf_session__collapse_resort(struct perf_session *self) { struct rb_root tmp; struct rb_node *next; @@ -140,17 +140,17 @@ void perf_session__collapse_resort(struct rb_root *hists) return; tmp = RB_ROOT; - next = rb_first(hists); + next = rb_first(&self->hists); while (next) { n = rb_entry(next, struct hist_entry, rb_node); next = rb_next(&n->rb_node); - rb_erase(&n->rb_node, hists); + rb_erase(&n->rb_node, &self->hists); collapse__insert_entry(&tmp, n); } - *hists = tmp; + self->hists = tmp; } /* @@ -183,7 +183,7 @@ static void perf_session__insert_output_hist_entry(struct rb_root *root, rb_insert_color(&he->rb_node, root); } -void perf_session__output_resort(struct rb_root *hists, u64 total_samples) +void perf_session__output_resort(struct perf_session *self, u64 total_samples) { struct rb_root tmp; struct rb_node *next; @@ -194,18 +194,18 @@ void perf_session__output_resort(struct rb_root *hists, u64 total_samples) total_samples * (callchain_param.min_percent / 100); tmp = RB_ROOT; - next = rb_first(hists); + next = rb_first(&self->hists); while (next) { n = rb_entry(next, struct hist_entry, rb_node); next = rb_next(&n->rb_node); - rb_erase(&n->rb_node, hists); + rb_erase(&n->rb_node, &self->hists); perf_session__insert_output_hist_entry(&tmp, n, min_callchain_hits); } - *hists = tmp; + self->hists = tmp; } static size_t callchain__fprintf_left_margin(FILE *fp, int left_margin) @@ -456,10 +456,10 @@ static size_t hist_entry_callchain__fprintf(FILE *fp, struct hist_entry *self, } static size_t hist_entry__fprintf(struct hist_entry *self, + struct perf_session *session, struct perf_session *pair_session, bool show_displacement, - long displacement, FILE *fp, - u64 session_total) + long displacement, FILE *fp) { struct sort_entry *se; u64 count, total; @@ -474,7 +474,7 @@ static size_t hist_entry__fprintf(struct hist_entry *self, total = pair_session->events_stats.total; } else { count = self->count; - total = session_total; + total = session->events_stats.total; } if (total) @@ -496,8 +496,8 @@ static size_t hist_entry__fprintf(struct hist_entry *self, if (total > 0) old_percent = (count * 100.0) / total; - if (session_total > 0) - new_percent = (self->count * 100.0) / session_total; + if (session->events_stats.total > 0) + new_percent = (self->count * 100.0) / session->events_stats.total; diff = new_percent - old_percent; @@ -544,17 +544,16 @@ static size_t hist_entry__fprintf(struct hist_entry *self, left_margin -= thread__comm_len(self->thread); } - hist_entry_callchain__fprintf(fp, self, session_total, + hist_entry_callchain__fprintf(fp, self, session->events_stats.total, left_margin); } return ret; } -size_t perf_session__fprintf_hists(struct rb_root *hists, +size_t perf_session__fprintf_hists(struct perf_session *self, struct perf_session *pair, - bool show_displacement, FILE *fp, - u64 session_total) + bool show_displacement, FILE *fp) { struct sort_entry *se; struct rb_node *nd; @@ -642,7 +641,7 @@ size_t perf_session__fprintf_hists(struct rb_root *hists, fprintf(fp, "\n#\n"); print_entries: - for (nd = rb_first(hists); nd; nd = rb_next(nd)) { + for (nd = rb_first(&self->hists); nd; nd = rb_next(nd)) { struct hist_entry *h = rb_entry(nd, struct hist_entry, rb_node); if (show_displacement) { @@ -653,13 +652,8 @@ size_t perf_session__fprintf_hists(struct rb_root *hists, displacement = 0; ++position; } - ret += hist_entry__fprintf(h, pair, show_displacement, - displacement, fp, session_total); - if (h->map == NULL && verbose > 1) { - __map_groups__fprintf_maps(&h->thread->mg, - MAP__FUNCTION, fp); - fprintf(fp, "%.10s end\n", graph_dotted_line); - } + ret += hist_entry__fprintf(h, self, pair, show_displacement, + displacement, fp); } free(rem_sq_bracket); diff --git a/trunk/tools/perf/util/hist.h b/trunk/tools/perf/util/hist.h index 16f360cce5bf..e5f99b24048b 100644 --- a/trunk/tools/perf/util/hist.h +++ b/trunk/tools/perf/util/hist.h @@ -10,9 +10,8 @@ struct perf_session; struct hist_entry; struct addr_location; struct symbol; -struct rb_root; -struct hist_entry *__perf_session__add_hist_entry(struct rb_root *hists, +struct hist_entry *__perf_session__add_hist_entry(struct perf_session *self, struct addr_location *al, struct symbol *parent, u64 count, bool *hit); @@ -20,10 +19,9 @@ extern int64_t hist_entry__cmp(struct hist_entry *, struct hist_entry *); extern int64_t hist_entry__collapse(struct hist_entry *, struct hist_entry *); void hist_entry__free(struct hist_entry *); -void perf_session__output_resort(struct rb_root *hists, u64 total_samples); -void perf_session__collapse_resort(struct rb_root *hists); -size_t perf_session__fprintf_hists(struct rb_root *hists, +void perf_session__output_resort(struct perf_session *self, u64 total_samples); +void perf_session__collapse_resort(struct perf_session *self); +size_t perf_session__fprintf_hists(struct perf_session *self, struct perf_session *pair, - bool show_displacement, FILE *fp, - u64 session_total); + bool show_displacement, FILE *fp); #endif /* __PERF_HIST_H */ diff --git a/trunk/tools/perf/util/probe-event.c b/trunk/tools/perf/util/probe-event.c index 53181dbfe4a8..c971e81e9cbf 100644 --- a/trunk/tools/perf/util/probe-event.c +++ b/trunk/tools/perf/util/probe-event.c @@ -508,8 +508,8 @@ void show_perf_probe_events(void) struct str_node *ent; setup_pager(); - memset(&pp, 0, sizeof(pp)); + memset(&pp, 0, sizeof(pp)); fd = open_kprobe_events(O_RDONLY, 0); rawlist = get_trace_kprobe_event_rawlist(fd); close(fd); diff --git a/trunk/tools/perf/util/probe-finder.c b/trunk/tools/perf/util/probe-finder.c index 1e6c65ebbd80..e77dc886760e 100644 --- a/trunk/tools/perf/util/probe-finder.c +++ b/trunk/tools/perf/util/probe-finder.c @@ -169,7 +169,7 @@ static const char *cu_find_realpath(Dwarf_Die *cu_die, const char *fname) { Dwarf_Files *files; size_t nfiles, i; - const char *src = NULL; + const char *src; int ret; if (!fname) diff --git a/trunk/tools/perf/util/session.c b/trunk/tools/perf/util/session.c index eed1cb889008..0de7258e70a5 100644 --- a/trunk/tools/perf/util/session.c +++ b/trunk/tools/perf/util/session.c @@ -70,7 +70,6 @@ struct perf_session *perf_session__new(const char *filename, int mode, bool forc memcpy(self->filename, filename, len); self->threads = RB_ROOT; - self->stats_by_id = RB_ROOT; self->last_match = NULL; self->mmap_window = 32; self->cwd = NULL; diff --git a/trunk/tools/perf/util/session.h b/trunk/tools/perf/util/session.h index 5c33417eebb3..31950fcd8a4d 100644 --- a/trunk/tools/perf/util/session.h +++ b/trunk/tools/perf/util/session.h @@ -20,7 +20,6 @@ struct perf_session { struct thread *last_match; struct map *vmlinux_maps[MAP__NR_TYPES]; struct events_stats events_stats; - struct rb_root stats_by_id; unsigned long event_total[PERF_RECORD_MAX]; unsigned long unknown_events; struct rb_root hists; diff --git a/trunk/tools/perf/util/thread.c b/trunk/tools/perf/util/thread.c index fa968312ee7d..21b92162282b 100644 --- a/trunk/tools/perf/util/thread.c +++ b/trunk/tools/perf/util/thread.c @@ -79,8 +79,8 @@ int thread__comm_len(struct thread *self) return self->comm_len; } -size_t __map_groups__fprintf_maps(struct map_groups *self, - enum map_type type, FILE *fp) +static size_t __map_groups__fprintf_maps(struct map_groups *self, + enum map_type type, FILE *fp) { size_t printed = fprintf(fp, "%s:\n", map_type__name[type]); struct rb_node *nd; @@ -89,7 +89,7 @@ size_t __map_groups__fprintf_maps(struct map_groups *self, struct map *pos = rb_entry(nd, struct map, rb_node); printed += fprintf(fp, "Map:"); printed += map__fprintf(pos, fp); - if (verbose > 2) { + if (verbose > 1) { printed += dso__fprintf(pos->dso, type, fp); printed += fprintf(fp, "--\n"); } @@ -183,8 +183,8 @@ struct thread *perf_session__findnew(struct perf_session *self, pid_t pid) return th; } -static int map_groups__fixup_overlappings(struct map_groups *self, - struct map *map) +static void map_groups__remove_overlappings(struct map_groups *self, + struct map *map) { struct rb_root *root = &self->maps[map->type]; struct rb_node *next = rb_first(root); @@ -209,36 +209,7 @@ static int map_groups__fixup_overlappings(struct map_groups *self, * list. */ list_add_tail(&pos->node, &self->removed_maps[map->type]); - /* - * Now check if we need to create new maps for areas not - * overlapped by the new map: - */ - if (map->start > pos->start) { - struct map *before = map__clone(pos); - - if (before == NULL) - return -ENOMEM; - - before->end = map->start - 1; - map_groups__insert(self, before); - if (verbose >= 2) - map__fprintf(before, stderr); - } - - if (map->end < pos->end) { - struct map *after = map__clone(pos); - - if (after == NULL) - return -ENOMEM; - - after->start = map->end + 1; - map_groups__insert(self, after); - if (verbose >= 2) - map__fprintf(after, stderr); - } } - - return 0; } void maps__insert(struct rb_root *maps, struct map *map) @@ -283,7 +254,7 @@ struct map *maps__find(struct rb_root *maps, u64 ip) void thread__insert_map(struct thread *self, struct map *map) { - map_groups__fixup_overlappings(&self->mg, map); + map_groups__remove_overlappings(&self->mg, map); map_groups__insert(&self->mg, map); } diff --git a/trunk/tools/perf/util/thread.h b/trunk/tools/perf/util/thread.h index dcf70303e58e..0a28f39de545 100644 --- a/trunk/tools/perf/util/thread.h +++ b/trunk/tools/perf/util/thread.h @@ -10,9 +10,6 @@ struct map_groups { struct list_head removed_maps[MAP__NR_TYPES]; }; -size_t __map_groups__fprintf_maps(struct map_groups *self, - enum map_type type, FILE *fp); - struct thread { struct rb_node rb_node; struct map_groups mg;