## Automatically generated incremental diff ## From: linux-2.5.70-bk8 ## To: linux-2.5.70-bk9 ## Robot: $Id: make-incremental-diff,v 1.11 2002/02/20 02:59:33 hpa Exp $ diff -urN linux-2.5.70-bk8/Documentation/kobject.txt linux-2.5.70-bk9/Documentation/kobject.txt --- linux-2.5.70-bk8/Documentation/kobject.txt 2003-05-26 18:00:26.000000000 -0700 +++ linux-2.5.70-bk9/Documentation/kobject.txt 2003-06-04 04:37:23.000000000 -0700 @@ -2,7 +2,18 @@ Patrick Mochel -7 January 2003 +Updated: 3 June 2003 + + +Copyright (c) Patrick Mochel +Copyright (c) Open Source Development Labs +Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.2 +or any later version published by the Free Software Foundation; +with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. +A copy of the license is included in the section entitled "GNU +Free Documentation License". + 0. Introduction @@ -102,6 +113,28 @@ This allows any memory allocated for the object to be freed. +NOTE!!! + +It is _imperative_ that you supply a desctructor for dynamically +allocated kobjects to free them if you are using kobject reference +counts. The reference count controls the duration of the lifetime of +the object. If it goes to 0, then it is assumed that the object will +be freed and cannot be used. + +More importantly, you must free the object there, and not immediately +after an unregister call. If someone else is referencing the object +(e.g. through a sysfs file), they will obtain a reference to the +object, assume it's valid and operate on it. If the object is +unregistered and freed in the meantime, the operation will then +reference freed memory and go boom. + +This can be prevented, in the simplest case, by defining a release +method and freeing the object from there only. Note that this will not +secure reference count/object management models that use a dual +reference count or do other wacky things with the reference count +(like the networking layer). + + 1.4 sysfs Each kobject receives a directory in sysfs. This directory is created diff -urN linux-2.5.70-bk8/Makefile linux-2.5.70-bk9/Makefile --- linux-2.5.70-bk8/Makefile 2003-06-04 04:37:16.000000000 -0700 +++ linux-2.5.70-bk9/Makefile 2003-06-04 04:37:23.000000000 -0700 @@ -1,7 +1,7 @@ VERSION = 2 PATCHLEVEL = 5 SUBLEVEL = 70 -EXTRAVERSION = -bk8 +EXTRAVERSION = -bk9 # *DOCUMENTATION* # To see a list of typical targets execute "make help" diff -urN linux-2.5.70-bk8/arch/i386/kernel/smp.c linux-2.5.70-bk9/arch/i386/kernel/smp.c --- linux-2.5.70-bk8/arch/i386/kernel/smp.c 2003-05-26 18:00:22.000000000 -0700 +++ linux-2.5.70-bk9/arch/i386/kernel/smp.c 2003-06-04 04:37:23.000000000 -0700 @@ -461,17 +461,6 @@ } /* - * this function sends a reschedule IPI to all (other) CPUs. - * This should only be used if some 'global' task became runnable, - * such as a RT task, that must be handled now. The first CPU - * that manages to grab the task will run it. - */ -void smp_send_reschedule_all(void) -{ - send_IPI_allbutself(RESCHEDULE_VECTOR); -} - -/* * Structure and data for smp_call_function(). This is designed to minimise * static memory requirements. It also looks cleaner. */ diff -urN linux-2.5.70-bk8/arch/ia64/kernel/smp.c linux-2.5.70-bk9/arch/ia64/kernel/smp.c --- linux-2.5.70-bk8/arch/ia64/kernel/smp.c 2003-05-26 18:01:00.000000000 -0700 +++ linux-2.5.70-bk9/arch/ia64/kernel/smp.c 2003-06-04 04:37:23.000000000 -0700 @@ -205,24 +205,6 @@ platform_send_ipi(cpu, IA64_IPI_RESCHEDULE, IA64_IPI_DM_INT, 0); } -/* - * This function sends a reschedule IPI to all (other) CPUs. This should only be used if - * some 'global' task became runnable, such as a RT task, that must be handled now. The - * first CPU that manages to grab the task will run it. - */ -void -smp_send_reschedule_all (void) -{ - int i; - int cpu = get_cpu(); /* disable preemption */ - - for (i = 0; i < NR_CPUS; i++) - if (cpu_online(i) && i != cpu) - smp_send_reschedule(i); - put_cpu(); -} - - void smp_flush_tlb_all (void) { diff -urN linux-2.5.70-bk8/arch/ppc64/Kconfig linux-2.5.70-bk9/arch/ppc64/Kconfig --- linux-2.5.70-bk8/arch/ppc64/Kconfig 2003-05-26 18:00:40.000000000 -0700 +++ linux-2.5.70-bk9/arch/ppc64/Kconfig 2003-06-04 04:37:23.000000000 -0700 @@ -37,6 +37,13 @@ bool default y +# We optimistically allocate largepages from the VM, so make the limit +# large enough (16MB). This badly named config option is actually +# max order + 1 +config FORCE_MAX_ZONEORDER + int + default "13" + source "init/Kconfig" diff -urN linux-2.5.70-bk8/arch/ppc64/boot/Makefile linux-2.5.70-bk9/arch/ppc64/boot/Makefile --- linux-2.5.70-bk8/arch/ppc64/boot/Makefile 2003-05-26 18:00:56.000000000 -0700 +++ linux-2.5.70-bk9/arch/ppc64/boot/Makefile 2003-06-04 04:37:23.000000000 -0700 @@ -98,7 +98,7 @@ $(obj)/kernel-initrd.gz: $(obj)/ramdisk.image.gz cp -f $(obj)/ramdisk.image.gz $@ -$(call src-sec, $(required) $(initrd)): $(obj)/kernel-%.c: $(obj)/kernel-%.gz +$(call src-sec, $(required) $(initrd)): $(obj)/kernel-%.c: $(obj)/kernel-%.gz FORCE touch $@ $(call obj-sec, $(required) $(initrd)): $(obj)/kernel-%.o: $(obj)/kernel-%.c FORCE diff -urN linux-2.5.70-bk8/arch/ppc64/boot/main.c linux-2.5.70-bk9/arch/ppc64/boot/main.c --- linux-2.5.70-bk8/arch/ppc64/boot/main.c 2003-05-26 18:01:03.000000000 -0700 +++ linux-2.5.70-bk9/arch/ppc64/boot/main.c 2003-06-04 04:37:23.000000000 -0700 @@ -8,7 +8,6 @@ * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. */ -#define __KERNEL__ #include "ppc32-types.h" #include "zlib.h" #include @@ -28,6 +27,10 @@ void pause(void); extern void exit(void); +unsigned long strlen(const char *s); +void *memmove(void *dest, const void *src, unsigned long n); +void *memcpy(void *dest, const void *src, unsigned long n); + static struct bi_record *make_bi_recs(unsigned long); #define RAM_START 0x00000000 diff -urN linux-2.5.70-bk8/arch/ppc64/defconfig linux-2.5.70-bk9/arch/ppc64/defconfig --- linux-2.5.70-bk8/arch/ppc64/defconfig 2003-05-26 18:00:27.000000000 -0700 +++ linux-2.5.70-bk9/arch/ppc64/defconfig 2003-06-04 04:37:23.000000000 -0700 @@ -2,7 +2,6 @@ # Automatically generated make config: don't edit # CONFIG_MMU=y -CONFIG_SWAP=y CONFIG_RWSEM_XCHGADD_ALGORITHM=y CONFIG_GENERIC_ISA_DMA=y CONFIG_HAVE_DEC_LOCK=y @@ -18,10 +17,14 @@ # # General setup # +CONFIG_SWAP=y CONFIG_SYSVIPC=y # CONFIG_BSD_PROCESS_ACCT is not set CONFIG_SYSCTL=y CONFIG_LOG_BUF_SHIFT=15 +# CONFIG_EMBEDDED is not set +CONFIG_FUTEX=y +CONFIG_EPOLL=y # # Loadable module support @@ -155,6 +158,7 @@ # CONFIG_SCSI_QLOGIC_ISP is not set # CONFIG_SCSI_QLOGIC_FC is not set # CONFIG_SCSI_QLOGIC_1280 is not set +# CONFIG_SCSI_DC395x is not set # CONFIG_SCSI_DC390T is not set # CONFIG_SCSI_U14_34F is not set # CONFIG_SCSI_NSP32 is not set @@ -199,7 +203,6 @@ # CONFIG_PACKET_MMAP is not set # CONFIG_NETLINK_DEV is not set # CONFIG_NETFILTER is not set -CONFIG_FILTER=y CONFIG_UNIX=y # CONFIG_NET_KEY is not set CONFIG_INET=y @@ -214,8 +217,9 @@ CONFIG_SYN_COOKIES=y # CONFIG_INET_AH is not set # CONFIG_INET_ESP is not set +# CONFIG_INET_IPCOMP is not set +# CONFIG_IPV6 is not set # CONFIG_XFRM_USER is not set -CONFIG_IPV6=y # # SCTP Configuration (EXPERIMENTAL) @@ -306,6 +310,11 @@ # CONFIG_R8169 is not set # CONFIG_SK98LIN is not set # CONFIG_TIGON3 is not set + +# +# Ethernet (10000 Mbit) +# +# CONFIG_IXGB is not set # CONFIG_FDDI is not set # CONFIG_HIPPI is not set # CONFIG_PPP is not set @@ -428,6 +437,7 @@ # # I2C Hardware Sensors Chip support # +# CONFIG_I2C_SENSOR is not set # # Mice @@ -466,61 +476,81 @@ # CONFIG_VIDEO_DEV is not set # +# Digital Video Broadcasting Devices +# +# CONFIG_DVB is not set + +# # File systems # -# CONFIG_QUOTA is not set -CONFIG_AUTOFS_FS=y -# CONFIG_AUTOFS4_FS is not set -CONFIG_REISERFS_FS=y -# CONFIG_REISERFS_CHECK is not set -# CONFIG_REISERFS_PROC_INFO is not set -# CONFIG_ADFS_FS is not set -# CONFIG_AFFS_FS is not set -# CONFIG_HFS_FS is not set -# CONFIG_BEFS_FS is not set -# CONFIG_BFS_FS is not set +CONFIG_EXT2_FS=y +# CONFIG_EXT2_FS_XATTR is not set CONFIG_EXT3_FS=y # CONFIG_EXT3_FS_XATTR is not set CONFIG_JBD=y # CONFIG_JBD_DEBUG is not set -CONFIG_FAT_FS=y -CONFIG_MSDOS_FS=y -CONFIG_VFAT_FS=y -# CONFIG_EFS_FS is not set -# CONFIG_CRAMFS is not set -# CONFIG_TMPFS is not set -CONFIG_RAMFS=y -CONFIG_ISO9660_FS=y -# CONFIG_JOLIET is not set -# CONFIG_ZISOFS is not set +CONFIG_REISERFS_FS=y +# CONFIG_REISERFS_CHECK is not set +# CONFIG_REISERFS_PROC_INFO is not set CONFIG_JFS_FS=y # CONFIG_JFS_POSIX_ACL is not set # CONFIG_JFS_DEBUG is not set # CONFIG_JFS_STATISTICS is not set +CONFIG_XFS_FS=y +# CONFIG_XFS_RT is not set +# CONFIG_XFS_QUOTA is not set +# CONFIG_XFS_POSIX_ACL is not set # CONFIG_MINIX_FS is not set -# CONFIG_VXFS_FS is not set +# CONFIG_ROMFS_FS is not set +# CONFIG_QUOTA is not set +CONFIG_AUTOFS_FS=y +# CONFIG_AUTOFS4_FS is not set + +# +# CD-ROM/DVD Filesystems +# +CONFIG_ISO9660_FS=y +# CONFIG_JOLIET is not set +# CONFIG_ZISOFS is not set +# CONFIG_UDF_FS is not set + +# +# DOS/FAT/NT Filesystems +# +CONFIG_FAT_FS=y +CONFIG_MSDOS_FS=y +CONFIG_VFAT_FS=y # CONFIG_NTFS_FS is not set -# CONFIG_HPFS_FS is not set + +# +# Pseudo filesystems +# CONFIG_PROC_FS=y # CONFIG_DEVFS_FS is not set CONFIG_DEVPTS_FS=y +# CONFIG_DEVPTS_FS_XATTR is not set +# CONFIG_TMPFS is not set +CONFIG_RAMFS=y + +# +# Miscellaneous filesystems +# +# CONFIG_ADFS_FS is not set +# CONFIG_AFFS_FS is not set +# CONFIG_HFS_FS is not set +# CONFIG_BEFS_FS is not set +# CONFIG_BFS_FS is not set +# CONFIG_EFS_FS is not set +# CONFIG_CRAMFS is not set +# CONFIG_VXFS_FS is not set +# CONFIG_HPFS_FS is not set # CONFIG_QNX4FS_FS is not set -# CONFIG_ROMFS_FS is not set -CONFIG_EXT2_FS=y -# CONFIG_EXT2_FS_XATTR is not set # CONFIG_SYSV_FS is not set -# CONFIG_UDF_FS is not set # CONFIG_UFS_FS is not set -CONFIG_XFS_FS=y -# CONFIG_XFS_RT is not set -# CONFIG_XFS_QUOTA is not set -# CONFIG_XFS_POSIX_ACL is not set # # Network File Systems # -# CONFIG_CODA_FS is not set -# CONFIG_INTERMEZZO_FS is not set CONFIG_NFS_FS=y CONFIG_NFS_V3=y CONFIG_NFS_V4=y @@ -528,14 +558,16 @@ CONFIG_NFSD_V3=y # CONFIG_NFSD_V4 is not set CONFIG_NFSD_TCP=y -CONFIG_SUNRPC=y -# CONFIG_SUNRPC_GSS is not set CONFIG_LOCKD=y CONFIG_LOCKD_V4=y CONFIG_EXPORTFS=y -CONFIG_CIFS=y +CONFIG_SUNRPC=y +# CONFIG_SUNRPC_GSS is not set # CONFIG_SMB_FS is not set +CONFIG_CIFS=y # CONFIG_NCP_FS is not set +# CONFIG_CODA_FS is not set +# CONFIG_INTERMEZZO_FS is not set # CONFIG_AFS_FS is not set # @@ -591,7 +623,7 @@ # Graphics support # CONFIG_FB=y -# CONFIG_FB_CLGEN is not set +# CONFIG_FB_CIRRUS is not set # CONFIG_FB_PM2 is not set # CONFIG_FB_CYBER2000 is not set CONFIG_FB_OF=y @@ -600,7 +632,12 @@ # CONFIG_FB_S3TRIO is not set # CONFIG_FB_VGA16 is not set # CONFIG_FB_RIVA is not set -# CONFIG_FB_MATROX is not set +CONFIG_FB_MATROX=y +CONFIG_FB_MATROX_MILLENIUM=y +CONFIG_FB_MATROX_MYSTIQUE=y +CONFIG_FB_MATROX_G450=y +CONFIG_FB_MATROX_G100=y +CONFIG_FB_MATROX_MULTIHEAD=y # CONFIG_FB_RADEON is not set # CONFIG_FB_ATY128 is not set # CONFIG_FB_ATY is not set @@ -618,7 +655,19 @@ # CONFIG_VGA_CONSOLE is not set # CONFIG_MDA_CONSOLE is not set CONFIG_DUMMY_CONSOLE=y -# CONFIG_FRAMEBUFFER_CONSOLE is not set +CONFIG_FRAMEBUFFER_CONSOLE=y +CONFIG_PCI_CONSOLE=y +# CONFIG_FONTS is not set +CONFIG_FONT_8x8=y +CONFIG_FONT_8x16=y + +# +# Logo configuration +# +CONFIG_LOGO=y +CONFIG_LOGO_LINUX_MONO=y +CONFIG_LOGO_LINUX_VGA16=y +CONFIG_LOGO_LINUX_CLUT224=y # # Sound @@ -629,6 +678,7 @@ # USB support # # CONFIG_USB is not set +# CONFIG_USB_GADGET is not set # # Bluetooth support diff -urN linux-2.5.70-bk8/arch/ppc64/kernel/Makefile linux-2.5.70-bk9/arch/ppc64/kernel/Makefile --- linux-2.5.70-bk8/arch/ppc64/kernel/Makefile 2003-05-26 18:01:00.000000000 -0700 +++ linux-2.5.70-bk9/arch/ppc64/kernel/Makefile 2003-06-04 04:37:23.000000000 -0700 @@ -7,7 +7,7 @@ obj-y := setup.o entry.o traps.o irq.o idle.o \ time.o process.o signal.o syscalls.o misc.o ptrace.o \ align.o semaphore.o bitops.o stab.o htab.o pacaData.o \ - udbg.o binfmt_elf32.o sys_ppc32.o sys32.o ioctl32.o \ + udbg.o binfmt_elf32.o sys_ppc32.o ioctl32.o \ ptrace32.o signal32.o pmc.o rtc.o init_task.o \ lmb.o pci.o pci_dn.o pci_dma.o diff -urN linux-2.5.70-bk8/arch/ppc64/kernel/head.S linux-2.5.70-bk9/arch/ppc64/kernel/head.S --- linux-2.5.70-bk8/arch/ppc64/kernel/head.S 2003-05-26 18:00:40.000000000 -0700 +++ linux-2.5.70-bk9/arch/ppc64/kernel/head.S 2003-06-04 04:37:23.000000000 -0700 @@ -596,7 +596,7 @@ cmpi 0,r22,0xc /* Segment fault on a bolted segment. Go off and map that segment. */ - beq .do_stab_bolted + beq- .do_stab_bolted stab_bolted_user_return: EXCEPTION_PROLOG_COMMON ld r3,_DSISR(r1) @@ -606,7 +606,7 @@ rlwinm r4,r3,32-23,29,29 /* DSISR_STORE -> _PAGE_RW */ ld r3,_DAR(r1) /* into the hash table */ - beq 2f /* If so handle it */ + beq+ 2f /* If so handle it */ li r4,0x300 /* Trap number */ bl .do_stab_SI b 1f @@ -658,7 +658,7 @@ EXCEPTION_PROLOG_COMMON andis. r0,r23,0x0020 /* no ste found? */ - beq 2f + beq+ 2f mr r3,r22 /* SRR0 at interrupt */ li r4,0x400 /* Trap number */ bl .do_stab_SI @@ -688,7 +688,7 @@ li r4,0x480 /* Exception vector */ bl .ste_allocate or. r3,r3,r3 /* Check return code */ - beq fast_exception_return /* Return if we succeeded */ + beq+ fast_exception_return /* Return if we succeeded */ addi r3,r1,STACK_FRAME_OVERHEAD #ifdef DO_SOFT_DISABLE @@ -897,18 +897,8 @@ mfspr r22,DSISR andis. r22,r22,0x0020 - bne+ 2f - ld r22,8(r21) /* get SRR1 */ - andi. r22,r22,MSR_PR /* check if from user */ - bne+ stab_bolted_user_return /* from user, send the error on up */ -#if 0 - li r3,0 -#ifdef CONFIG_XMON - bl .xmon -#endif -1: b 1b -#endif -2: + beq- stab_bolted_user_return + /* (((ea >> 28) & 0x1fff) << 15) | (ea >> 60) */ mfspr r21,DAR rldicl r20,r21,36,32 /* Permits a full 32b of ESID */ @@ -1106,9 +1096,11 @@ oris r21,r23,2048 /* valid bit */ rldimi r21,r22,0,52 /* Insert entry */ - isync + /* + * No need for an isync before or after this slbmte. The exception + * we enter with and the rfid we exit with are context synchronizing . + */ slbmte r20,r21 - isync /* All done -- return from exception. */ mfsprg r20,3 /* Load the PACA pointer */ @@ -1861,9 +1853,9 @@ li r5,0 std r0,PACAKSAVE(r13) - /* ptr to hardware interrupt stack for processor 0 */ + /* ptr to hardware interrupt stack for boot processor */ LOADADDR(r3, hardware_int_paca0) - li r5,0x1000 + li r5,PAGE_SIZE sldi r5,r5,3 subi r5,r5,STACK_FRAME_OVERHEAD @@ -1991,7 +1983,7 @@ .globl hardware_int_paca0 hardware_int_paca0: - .space 8*4096 + .space 8*PAGE_SIZE /* 1 page segment table per cpu (max 48, cpu0 allocated at STAB0_PHYS_ADDR) */ .globl stab_array diff -urN linux-2.5.70-bk8/arch/ppc64/kernel/iSeries_setup.c linux-2.5.70-bk9/arch/ppc64/kernel/iSeries_setup.c --- linux-2.5.70-bk8/arch/ppc64/kernel/iSeries_setup.c 2003-05-26 18:00:45.000000000 -0700 +++ linux-2.5.70-bk9/arch/ppc64/kernel/iSeries_setup.c 2003-06-04 04:37:23.000000000 -0700 @@ -864,7 +864,7 @@ { if ( dprof_buffer ) { unsigned i; - for (i=0; iflags & SA_INTERRUPT)) local_irq_enable(); do { status |= action->flags; - action->handler(irq, action->dev_id, regs); + retval |= action->handler(irq, action->dev_id, regs); action = action->next; } while (action); if (status & SA_SAMPLE_RANDOM) add_interrupt_randomness(irq); local_irq_disable(); + if (retval != 1) { + static int count = 100; + char name_buf[256]; + if (count) { + count--; + if (retval) { + printk("irq event %d: bogus retval mask %x\n", + irq, retval); + } else { + printk("irq %d: nobody cared!\n", irq); + } + dump_stack(); + printk("handlers:\n"); + action = first_action; + do { + printk("[<%p>]", action->handler); + printk(" (%s)\n", + ppc_find_proc_name((unsigned *)action->handler, name_buf, 256)); + action = action->next; + } while (action); + } + } } /* @@ -676,7 +702,7 @@ #ifdef CONFIG_PPC_ISERIES { unsigned i; - for (i=0; i 32 PACAINITDATA(32, 0, 0, 0, 0), PACAINITDATA(33, 0, 0, 0, 0), PACAINITDATA(34, 0, 0, 0, 0), @@ -116,5 +117,22 @@ PACAINITDATA(44, 0, 0, 0, 0), PACAINITDATA(45, 0, 0, 0, 0), PACAINITDATA(46, 0, 0, 0, 0), - PACAINITDATA(47, 0, 0, 0, 0) + PACAINITDATA(47, 0, 0, 0, 0), + PACAINITDATA(48, 0, 0, 0, 0), + PACAINITDATA(49, 0, 0, 0, 0), + PACAINITDATA(50, 0, 0, 0, 0), + PACAINITDATA(51, 0, 0, 0, 0), + PACAINITDATA(52, 0, 0, 0, 0), + PACAINITDATA(53, 0, 0, 0, 0), + PACAINITDATA(54, 0, 0, 0, 0), + PACAINITDATA(55, 0, 0, 0, 0), + PACAINITDATA(56, 0, 0, 0, 0), + PACAINITDATA(57, 0, 0, 0, 0), + PACAINITDATA(58, 0, 0, 0, 0), + PACAINITDATA(59, 0, 0, 0, 0), + PACAINITDATA(60, 0, 0, 0, 0), + PACAINITDATA(61, 0, 0, 0, 0), + PACAINITDATA(62, 0, 0, 0, 0), + PACAINITDATA(63, 0, 0, 0, 0), +#endif }; diff -urN linux-2.5.70-bk8/arch/ppc64/kernel/pci.c linux-2.5.70-bk9/arch/ppc64/kernel/pci.c --- linux-2.5.70-bk8/arch/ppc64/kernel/pci.c 2003-05-26 18:00:56.000000000 -0700 +++ linux-2.5.70-bk9/arch/ppc64/kernel/pci.c 2003-06-04 04:37:23.000000000 -0700 @@ -124,7 +124,7 @@ ioaddr = (addr > isa_io_base) ? addr - isa_io_base : 0; pci_for_each_dev(dev) { - if ((dev->class >> 8) == PCI_BASE_CLASS_BRIDGE) + if ((dev->class >> 16) == PCI_BASE_CLASS_BRIDGE) continue; for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { unsigned long start = pci_resource_start(dev,i); diff -urN linux-2.5.70-bk8/arch/ppc64/kernel/pci_dma.c linux-2.5.70-bk9/arch/ppc64/kernel/pci_dma.c --- linux-2.5.70-bk8/arch/ppc64/kernel/pci_dma.c 2003-05-26 18:00:41.000000000 -0700 +++ linux-2.5.70-bk9/arch/ppc64/kernel/pci_dma.c 2003-06-04 04:37:23.000000000 -0700 @@ -710,12 +710,6 @@ for (ln=bus_list->next; ln != bus_list; ln=ln->next) { bus = pci_bus_b(ln); busdn = PCI_GET_DN(bus); - /* NOTE: there should never be a window declared on a bus when - * child devices also have a window. If this should ever be - * architected, we probably want children to have priority. - * In reality, the PHB containing ISA has the property, but otherwise - * it is the pci-bridges that have the property. - */ dma_window = (u32 *)get_property(busdn, "ibm,dma-window", 0); if (dma_window) { /* Bussubno hasn't been copied yet. @@ -724,6 +718,7 @@ busdn->bussubno = bus->number; create_pci_bus_tce_table((unsigned long)busdn); } + /* look for a window on a bridge even if the PHB had one */ create_tce_tables_for_busesLP(&bus->children); } } diff -urN linux-2.5.70-bk8/arch/ppc64/kernel/process.c linux-2.5.70-bk9/arch/ppc64/kernel/process.c --- linux-2.5.70-bk8/arch/ppc64/kernel/process.c 2003-05-26 18:00:41.000000000 -0700 +++ linux-2.5.70-bk9/arch/ppc64/kernel/process.c 2003-06-04 04:37:23.000000000 -0700 @@ -67,18 +67,34 @@ #endif /* CONFIG_SMP */ } -int -dump_fpu(struct pt_regs *regs, elf_fpregset_t *fpregs) +#ifdef CONFIG_SMP +static void smp_unlazy_onefpu(void *arg) { - /* - * XXX temporary workaround until threaded coredumps for ppc64 - * are implemented - Anton - */ + struct pt_regs *regs = current->thread.regs; + if (!regs) - return 0; + return; if (regs->msr & MSR_FP) giveup_fpu(current); - memcpy(fpregs, ¤t->thread.fpr[0], sizeof(*fpregs)); +} + +void dump_smp_unlazy_fpu(void) +{ + smp_call_function(smp_unlazy_onefpu, NULL, 1, 1); +} +#endif + +int dump_task_fpu(struct task_struct *tsk, elf_fpregset_t *fpregs) +{ + struct pt_regs *regs = tsk->thread.regs; + + if (!regs) + return 0; + if (tsk == current && (regs->msr & MSR_FP)) + giveup_fpu(current); + + memcpy(fpregs, &tsk->thread.fpr[0], sizeof(*fpregs)); + return 1; } @@ -113,7 +129,7 @@ } static void show_tsk_stack(struct task_struct *p, unsigned long sp); -static char *ppc_find_proc_name(unsigned *p, char *buf, unsigned buflen); +char *ppc_find_proc_name(unsigned *p, char *buf, unsigned buflen); void show_regs(struct pt_regs * regs) { @@ -410,7 +426,7 @@ extern char _stext[], _etext[], __init_begin[], __init_end[]; -static char *ppc_find_proc_name(unsigned *p, char *buf, unsigned buflen) +char *ppc_find_proc_name(unsigned *p, char *buf, unsigned buflen) { unsigned long tb_flags; unsigned short name_len; diff -urN linux-2.5.70-bk8/arch/ppc64/kernel/prom.c linux-2.5.70-bk9/arch/ppc64/kernel/prom.c --- linux-2.5.70-bk8/arch/ppc64/kernel/prom.c 2003-05-26 18:00:44.000000000 -0700 +++ linux-2.5.70-bk9/arch/ppc64/kernel/prom.c 2003-06-04 04:37:23.000000000 -0700 @@ -1134,7 +1134,7 @@ _prom->cpu = (int)(unsigned long)getprop_rval; _xPaca[_prom->cpu].active = 1; #ifdef CONFIG_SMP - RELOC(cpu_online_map) = 1 << _prom->cpu; + RELOC(cpu_online_map) = 1UL << _prom->cpu; #endif RELOC(boot_cpuid) = _prom->cpu; diff -urN linux-2.5.70-bk8/arch/ppc64/kernel/setup.c linux-2.5.70-bk9/arch/ppc64/kernel/setup.c --- linux-2.5.70-bk8/arch/ppc64/kernel/setup.c 2003-05-26 18:00:39.000000000 -0700 +++ linux-2.5.70-bk9/arch/ppc64/kernel/setup.c 2003-06-04 04:37:23.000000000 -0700 @@ -194,7 +194,7 @@ printk("naca->pftSize = 0x%lx\n", naca->pftSize); printk("naca->debug_switch = 0x%lx\n", naca->debug_switch); printk("naca->interrupt_controller = 0x%ld\n", naca->interrupt_controller); - printk("systemcf = 0x%p\n", systemcfg); + printk("systemcfg = 0x%p\n", systemcfg); printk("systemcfg->processorCount = 0x%lx\n", systemcfg->processorCount); printk("systemcfg->physicalMemorySize = 0x%lx\n", systemcfg->physicalMemorySize); printk("systemcfg->dCacheL1LineSize = 0x%x\n", systemcfg->dCacheL1LineSize); @@ -256,7 +256,7 @@ return 0; } - if (!(cpu_online_map & (1< 0 ) && ( val <= MAX_PACAS ) ) { + if ( ( val > 0 ) && ( val <= NR_CPUS ) ) { for ( i=1; ixDynProcStatus < 2 ) { ++np; @@ -128,7 +128,7 @@ unsigned np = 0; struct ItLpPaca *lpPaca; - for (i=0; i < MAX_PACAS; ++i) { + for (i=0; i < NR_CPUS; ++i) { lpPaca = paca[i].xLpPacaPtr; if (lpPaca->xDynProcStatus < 2) { paca[i].active = 1; @@ -144,7 +144,7 @@ struct ItLpPaca * lpPaca; /* Verify we have a Paca for processor nr */ if ( ( nr <= 0 ) || - ( nr >= MAX_PACAS ) ) + ( nr >= NR_CPUS ) ) return; /* Verify that our partition has a processor nr */ lpPaca = paca[nr].xLpPacaPtr; @@ -228,7 +228,7 @@ { /* Verify we have a Paca for processor nr */ if ( ( nr <= 0 ) || - ( nr >= MAX_PACAS ) ) + ( nr >= NR_CPUS ) ) return; /* The information for processor bringup must @@ -392,17 +392,6 @@ smp_message_pass(cpu, PPC_MSG_RESCHEDULE, 0, 0); } -/* - * this function sends a reschedule IPI to all (other) CPUs. - * This should only be used if some 'global' task became runnable, - * such as a RT task, that must be handled now. The first CPU - * that manages to grab the task will run it. - */ -void smp_send_reschedule_all(void) -{ - smp_message_pass(MSG_ALL_BUT_SELF, PPC_MSG_RESCHEDULE, 0, 0); -} - #ifdef CONFIG_XMON void smp_send_xmon_break(int cpu) { diff -urN linux-2.5.70-bk8/arch/ppc64/kernel/stab.c linux-2.5.70-bk9/arch/ppc64/kernel/stab.c --- linux-2.5.70-bk8/arch/ppc64/kernel/stab.c 2003-05-26 18:00:45.000000000 -0700 +++ linux-2.5.70-bk9/arch/ppc64/kernel/stab.c 2003-06-04 04:37:23.000000000 -0700 @@ -23,7 +23,8 @@ #include int make_ste(unsigned long stab, unsigned long esid, unsigned long vsid); -void make_slbe(unsigned long esid, unsigned long vsid, int large); +void make_slbe(unsigned long esid, unsigned long vsid, int large, + int kernel_segment); /* * Build an entry for the base kernel segment and put it into @@ -45,7 +46,8 @@ asm volatile("isync":::"memory"); asm volatile("slbmte %0,%0"::"r" (0) : "memory"); asm volatile("isync; slbia; isync":::"memory"); - make_slbe(esid, vsid, 0); + make_slbe(esid, vsid, 0, 1); + asm volatile("isync":::"memory"); #endif } else { asm volatile("isync; slbia; isync":::"memory"); @@ -139,10 +141,13 @@ /* * Create a segment buffer entry for the given esid/vsid pair. + * + * NOTE: A context syncronising instruction is required before and after + * this, in the common case we use exception entry and rfid. */ -void make_slbe(unsigned long esid, unsigned long vsid, int large) +void make_slbe(unsigned long esid, unsigned long vsid, int large, + int kernel_segment) { - int kernel_segment = 0; unsigned long entry, castout_entry; union { unsigned long word0; @@ -153,42 +158,15 @@ slb_dword1 data; } vsid_data; - if (REGION_ID(esid << SID_SHIFT) >= KERNEL_REGION_ID) - kernel_segment = 1; - /* - * Find an empty entry, if one exists. + * Find an empty entry, if one exists. Must start at 0 because + * we use this code to load SLB entry 0 at boot. */ for (entry = 0; entry < naca->slb_size; entry++) { asm volatile("slbmfee %0,%1" : "=r" (esid_data) : "r" (entry)); - if (!esid_data.data.v) { - /* - * Write the new SLB entry. - */ - vsid_data.word0 = 0; - vsid_data.data.vsid = vsid; - vsid_data.data.kp = 1; - if (large) - vsid_data.data.l = 1; - if (kernel_segment) - vsid_data.data.c = 1; - - esid_data.word0 = 0; - esid_data.data.esid = esid; - esid_data.data.v = 1; - esid_data.data.index = entry; - - /* slbie not needed as no previous mapping existed. */ - /* Order update */ - asm volatile("isync" : : : "memory"); - asm volatile("slbmte %0,%1" - : : "r" (vsid_data), - "r" (esid_data)); - /* Order update */ - asm volatile("isync" : : : "memory"); - return; - } + if (!esid_data.data.v) + goto write_entry; } /* @@ -211,13 +189,13 @@ if (castout_entry >= naca->slb_size) castout_entry = 1; asm volatile("slbmfee %0,%1" : "=r" (esid_data) : "r" (entry)); - } while (esid_data.data.esid == GET_ESID((unsigned long)_get_SP()) && - esid_data.data.v); + } while (esid_data.data.esid == GET_ESID((unsigned long)_get_SP())); get_paca()->xStab_data.next_round_robin = castout_entry; /* slbie not needed as the previous mapping is still valid. */ - + +write_entry: /* * Write the new SLB entry. */ @@ -234,10 +212,11 @@ esid_data.data.v = 1; esid_data.data.index = entry; - asm volatile("isync" : : : "memory"); /* Order update */ - asm volatile("slbmte %0,%1" - : : "r" (vsid_data), "r" (esid_data)); - asm volatile("isync" : : : "memory" ); /* Order update */ + /* + * No need for an isync before or after this slbmte. The exception + * we enter with and the rfid we exit with are context synchronizing. + */ + asm volatile("slbmte %0,%1" : : "r" (vsid_data), "r" (esid_data)); } static inline void __ste_allocate(unsigned long esid, unsigned long vsid, @@ -246,10 +225,10 @@ if (cpu_has_slb()) { #ifndef CONFIG_PPC_ISERIES if (REGION_ID(esid << SID_SHIFT) == KERNEL_REGION_ID) - make_slbe(esid, vsid, 1); + make_slbe(esid, vsid, 1, kernel_segment); else #endif - make_slbe(esid, vsid, 0); + make_slbe(esid, vsid, 0, kernel_segment); } else { unsigned char top_entry, stab_entry, *segments; diff -urN linux-2.5.70-bk8/arch/ppc64/kernel/sys32.S linux-2.5.70-bk9/arch/ppc64/kernel/sys32.S --- linux-2.5.70-bk8/arch/ppc64/kernel/sys32.S 2003-05-26 18:00:56.000000000 -0700 +++ linux-2.5.70-bk9/arch/ppc64/kernel/sys32.S 1969-12-31 16:00:00.000000000 -0800 @@ -1,27 +0,0 @@ -/* - * sys32.S: I-cache tricks for 32-bit compatibility layer simple - * conversions. - * - * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu) - * Copyright (C) 1998 Jakub Jelinek (jj@ultra.linux.cz) - * Copyright (C) 2000 Ken Aaker (kdaaker@rchland.vnet.ibm.com) - * For PPC ABI convention is parms in Regs 3-10. - * The router in entry.S clears the high 32 bits in the first - * 4 arguments (R3-R6). - * - * 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 - - .text - -_GLOBAL(ppc32_lseek) - extsw r4,r4 /* sign extend off_t offset parm */ - b .sys_lseek - diff -urN linux-2.5.70-bk8/arch/ppc64/kernel/sys_ppc32.c linux-2.5.70-bk9/arch/ppc64/kernel/sys_ppc32.c --- linux-2.5.70-bk8/arch/ppc64/kernel/sys_ppc32.c 2003-05-26 18:00:44.000000000 -0700 +++ linux-2.5.70-bk9/arch/ppc64/kernel/sys_ppc32.c 2003-06-04 04:37:23.000000000 -0700 @@ -2318,6 +2318,14 @@ return sys_nice((int)increment); } +extern off_t sys_lseek(unsigned int fd, off_t offset, unsigned int origin); + +off_t ppc32_lseek(unsigned int fd, u32 offset, unsigned int origin) +{ + /* sign extend n */ + return sys_lseek(fd, (int)offset, origin); +} + /* * This is just a version for 32-bit applications which does * not force O_LARGEFILE on. diff -urN linux-2.5.70-bk8/arch/ppc64/kernel/syscalls.c linux-2.5.70-bk9/arch/ppc64/kernel/syscalls.c --- linux-2.5.70-bk8/arch/ppc64/kernel/syscalls.c 2003-05-26 18:00:43.000000000 -0700 +++ linux-2.5.70-bk9/arch/ppc64/kernel/syscalls.c 2003-06-04 04:37:23.000000000 -0700 @@ -50,11 +50,6 @@ { } -int sys_ioperm(unsigned long from, unsigned long num, int on) -{ - return -EIO; -} - /* * sys_ipc() is the de-multiplexer for the SysV IPC calls.. * diff -urN linux-2.5.70-bk8/arch/ppc64/kernel/traps.c linux-2.5.70-bk9/arch/ppc64/kernel/traps.c --- linux-2.5.70-bk8/arch/ppc64/kernel/traps.c 2003-05-26 18:00:40.000000000 -0700 +++ linux-2.5.70-bk9/arch/ppc64/kernel/traps.c 2003-06-04 04:37:23.000000000 -0700 @@ -349,9 +349,8 @@ void KernelFPUnavailableException(struct pt_regs *regs) { - printk("Illegal floating point used in kernel " - "(task=0x%p, pc=0x%016lx, trap=0x%08lx)\n", - current, regs->nip, regs->trap); + printk("Illegal floating point used in kernel (task=0x%p, " + "pc=0x%016lx, trap=0x%lx)\n", current, regs->nip, regs->trap); panic("Unrecoverable FP Unavailable Exception in Kernel"); } diff -urN linux-2.5.70-bk8/arch/ppc64/lib/copyuser.S linux-2.5.70-bk9/arch/ppc64/lib/copyuser.S --- linux-2.5.70-bk8/arch/ppc64/lib/copyuser.S 2003-05-26 18:01:00.000000000 -0700 +++ linux-2.5.70-bk9/arch/ppc64/lib/copyuser.S 2003-06-04 04:37:23.000000000 -0700 @@ -483,8 +483,20 @@ * on an exception, reset to the beginning and jump back into the * standard __copy_tofrom_user */ -100: ld r3,-24(r1) - ld r4,-24(r1) +100: ld r20,-120(1) + ld r21,-112(1) + ld r22,-104(1) + ld r23,-96(1) + ld r24,-88(1) + ld r25,-80(1) + ld r26,-72(1) + ld r27,-64(1) + ld r28,-56(1) + ld r29,-48(1) + ld r30,-40(1) + ld r31,-32(1) + ld r3,-24(r1) + ld r4,-16(r1) li r5,4096 b .Ldst_aligned diff -urN linux-2.5.70-bk8/arch/ppc64/mm/init.c linux-2.5.70-bk9/arch/ppc64/mm/init.c --- linux-2.5.70-bk8/arch/ppc64/mm/init.c 2003-05-26 18:00:41.000000000 -0700 +++ linux-2.5.70-bk9/arch/ppc64/mm/init.c 2003-06-04 04:37:23.000000000 -0700 @@ -36,6 +36,7 @@ #include #include #include +#include #ifdef CONFIG_BLK_DEV_INITRD #include /* for initrd_* */ #endif @@ -509,6 +510,34 @@ } #endif +static struct kcore_list kcore_vmem; + +static void setup_kcore(void) +{ + int i; + + for (i=0; i < lmb.memory.cnt; i++) { + unsigned long physbase, size; + unsigned long type = lmb.memory.region[i].type; + struct kcore_list *kcore_mem; + + if (type != LMB_MEMORY_AREA) + continue; + + physbase = lmb.memory.region[i].physbase; + size = lmb.memory.region[i].size; + + /* GFP_ATOMIC to avoid might_sleep warnings during boot */ + kcore_mem = kmalloc(sizeof(struct kcore_list), GFP_ATOMIC); + if (!kcore_mem) + panic("mem_init: kmalloc failed\n"); + + kclist_add(kcore_mem, __va(physbase), size); + } + + kclist_add(&kcore_vmem, (void *)VMALLOC_START, VMALLOC_END-VMALLOC_START); +} + void initialize_paca_hardware_interrupt_stack(void); void __init mem_init(void) @@ -577,6 +606,8 @@ #endif mem_init_done = 1; + setup_kcore(); + /* set the last page of each hardware interrupt stack to be protected */ initialize_paca_hardware_interrupt_stack(); diff -urN linux-2.5.70-bk8/arch/um/drivers/daemon_kern.c linux-2.5.70-bk9/arch/um/drivers/daemon_kern.c --- linux-2.5.70-bk8/arch/um/drivers/daemon_kern.c 2003-05-26 18:00:20.000000000 -0700 +++ linux-2.5.70-bk9/arch/um/drivers/daemon_kern.c 2003-06-04 04:37:23.000000000 -0700 @@ -24,18 +24,13 @@ struct daemon_data *dpri; struct daemon_init *init = data; - init_etherdev(dev, 0); pri = dev->priv; dpri = (struct daemon_data *) pri->user; - *dpri = ((struct daemon_data) - { .sock_type = init->sock_type, - .ctl_sock = init->ctl_sock, - .ctl_addr = NULL, - .data_addr = NULL, - .local_addr = NULL, - .fd = -1, - .control = -1, - .dev = dev }); + dpri->sock_type = init->sock_type; + dpri->ctl_sock = init->ctl_sock; + dpri->fd = -1; + dpri->control = -1; + dpri->dev = dev; printk("daemon backend (uml_switch version %d) - %s:%s", SWITCH_VERSION, dpri->sock_type, dpri->ctl_sock); diff -urN linux-2.5.70-bk8/arch/um/drivers/mcast_kern.c linux-2.5.70-bk9/arch/um/drivers/mcast_kern.c --- linux-2.5.70-bk8/arch/um/drivers/mcast_kern.c 2003-05-26 18:00:20.000000000 -0700 +++ linux-2.5.70-bk9/arch/um/drivers/mcast_kern.c 2003-06-04 04:37:23.000000000 -0700 @@ -32,15 +32,13 @@ struct mcast_data *dpri; struct mcast_init *init = data; - init_etherdev(dev, 0); pri = dev->priv; dpri = (struct mcast_data *) pri->user; - *dpri = ((struct mcast_data) - { .addr = init->addr, - .port = init->port, - .ttl = init->ttl, - .mcast_addr = NULL, - .dev = dev }); + dpri->addr = init->addr; + dpri->port = init->port; + dpri->ttl = init->ttl; + dpri->dev = dev; + printk("mcast backend "); printk("multicast adddress: %s:%u, TTL:%u ", dpri->addr, dpri->port, dpri->ttl); diff -urN linux-2.5.70-bk8/arch/um/drivers/net_kern.c linux-2.5.70-bk9/arch/um/drivers/net_kern.c --- linux-2.5.70-bk8/arch/um/drivers/net_kern.c 2003-05-26 18:00:39.000000000 -0700 +++ linux-2.5.70-bk9/arch/um/drivers/net_kern.c 2003-06-04 04:37:23.000000000 -0700 @@ -292,45 +292,46 @@ struct uml_net *device; struct net_device *dev; struct uml_net_private *lp; - int save, err, size; + int err, size; size = transport->private_size + sizeof(struct uml_net_private) + sizeof(((struct uml_net_private *) 0)->user); device = kmalloc(sizeof(*device), GFP_KERNEL); - if(device == NULL){ + if (device == NULL) { printk(KERN_ERR "eth_configure failed to allocate uml_net\n"); return(1); } - *device = ((struct uml_net) { .list = LIST_HEAD_INIT(device->list), - .dev = NULL, - .index = n, - .mac = { [ 0 ... 5 ] = 0 }, - .have_mac = 0 }); + memset(device, 0, sizeof(*device)); + device->list = INIT_LIST_HEAD(device->list); + device->index = n; spin_lock(&devices_lock); list_add(&device->list, &devices); spin_unlock(&devices_lock); - if(setup_etheraddr(mac, device->mac)) + if (setup_etheraddr(mac, device->mac)) device->have_mac = 1; printk(KERN_INFO "Netdevice %d ", n); - if(device->have_mac) printk("(%02x:%02x:%02x:%02x:%02x:%02x) ", - device->mac[0], device->mac[1], - device->mac[2], device->mac[3], - device->mac[4], device->mac[5]); + if (device->have_mac) + printk("(%02x:%02x:%02x:%02x:%02x:%02x) ", + device->mac[0], device->mac[1], + device->mac[2], device->mac[3], + device->mac[4], device->mac[5]); printk(": "); - dev = kmalloc(sizeof(*dev) + size, GFP_KERNEL); - if(dev == NULL){ + dev = alloc_etherdev(size); + if (dev == NULL) { printk(KERN_ERR "eth_configure: failed to allocate device\n"); - return(1); + return 1; } - memset(dev, 0, sizeof(*dev) + size); + /* If this name ends up conflicting with an existing registered + * netdevice, that is OK, register_netdev{,ice}() will notice this + * and fail. + */ snprintf(dev->name, sizeof(dev->name), "eth%d", n); - dev->priv = (void *) &dev[1]; device->dev = dev; dev->hard_header = uml_net_hard_header; @@ -357,42 +358,35 @@ rtnl_lock(); err = register_netdevice(dev); rtnl_unlock(); - if(err) - return(1); + if (err) + return 1; lp = dev->priv; - /* lp.user is the first four bytes of the transport data, which - * has already been initialized. This structure assignment will - * overwrite that, so we make sure that .user gets overwritten with - * what it already has. - */ - save = lp->user[0]; - *lp = ((struct uml_net_private) - { .list = LIST_HEAD_INIT(lp->list), - .lock = SPIN_LOCK_UNLOCKED, - .dev = dev, - .fd = -1, - .mac = { 0xfe, 0xfd, 0x0, 0x0, 0x0, 0x0}, - .have_mac = device->have_mac, - .protocol = transport->kern->protocol, - .open = transport->user->open, - .close = transport->user->close, - .remove = transport->user->remove, - .read = transport->kern->read, - .write = transport->kern->write, - .add_address = transport->user->add_address, - .delete_address = transport->user->delete_address, - .set_mtu = transport->user->set_mtu, - .user = { save } }); + lp->list = INIT_LIST_HEAD(lp->list); + spin_lock_init(&lp->lock); + lp->dev = dev; + lp->fd = -1; + lp->mac = { 0xfe, 0xfd, 0x0, 0x0, 0x0, 0x0 }; + lp->have_mac = device->have_mac; + lp->protocol = transport->kern->protocol; + lp->open = transport->user->open; + lp->close = transport->user->close; + lp->remove = transport->user->remove; + lp->read = transport->kern->read; + lp->write = transport->kern->write; + lp->add_address = transport->user->add_address; + lp->delete_address = transport->user->delete_address; + lp->set_mtu = transport->user->set_mtu; + init_timer(&lp->tl); lp->tl.function = uml_net_user_timer_expire; - memset(&lp->stats, 0, sizeof(lp->stats)); - if(lp->have_mac) memcpy(lp->mac, device->mac, sizeof(lp->mac)); + if (lp->have_mac) + memcpy(lp->mac, device->mac, sizeof(lp->mac)); - if(transport->user->init) + if (transport->user->init) (*transport->user->init)(&lp->user, dev); - if(device->have_mac) + if (device->have_mac) set_ether_mac(dev, device->mac); return(0); } @@ -538,13 +532,15 @@ if(err) return(1); new = alloc_bootmem(sizeof(new)); - if(new == NULL){ + if (new == NULL){ printk("eth_init : alloc_bootmem failed\n"); return(1); } - *new = ((struct eth_init) { .list = LIST_HEAD_INIT(new->list), - .index = n, - .init = str }); + + new->list = INIT_LIST_HEAD(new->list); + new->index = n; + new->init = str; + list_add_tail(&new->list, ð_cmd_line); return(1); } diff -urN linux-2.5.70-bk8/arch/um/drivers/pcap_kern.c linux-2.5.70-bk9/arch/um/drivers/pcap_kern.c --- linux-2.5.70-bk8/arch/um/drivers/pcap_kern.c 2003-05-26 18:00:59.000000000 -0700 +++ linux-2.5.70-bk9/arch/um/drivers/pcap_kern.c 2003-06-04 04:37:23.000000000 -0700 @@ -23,16 +23,12 @@ struct pcap_data *ppri; struct pcap_init *init = data; - init_etherdev(dev, 0); pri = dev->priv; ppri = (struct pcap_data *) pri->user; - *ppri = ((struct pcap_data) - { .host_if = init->host_if, - .promisc = init->promisc, - .optimize = init->optimize, - .filter = init->filter, - .compiled = NULL, - .pcap = NULL }); + ppri->host_if = init->host_if; + ppri->promisc = init->promisc; + ppri->optimize = init->optimize; + ppri->filter = init->filter; } static int pcap_read(int fd, struct sk_buff **skb, diff -urN linux-2.5.70-bk8/arch/um/os-Linux/drivers/ethertap_kern.c linux-2.5.70-bk9/arch/um/os-Linux/drivers/ethertap_kern.c --- linux-2.5.70-bk8/arch/um/os-Linux/drivers/ethertap_kern.c 2003-05-26 18:00:21.000000000 -0700 +++ linux-2.5.70-bk9/arch/um/os-Linux/drivers/ethertap_kern.c 2003-06-04 04:37:23.000000000 -0700 @@ -24,18 +24,16 @@ struct ethertap_data *epri; struct ethertap_init *init = data; - init_etherdev(dev, 0); pri = dev->priv; epri = (struct ethertap_data *) pri->user; - *epri = ((struct ethertap_data) - { .dev_name = init->dev_name, - .gate_addr = init->gate_addr, - .data_fd = -1, - .control_fd = -1, - .dev = dev }); + epri->dev_name = init->dev_name; + epri->gate_addr = init->gate_addr; + epri->data_fd = -1; + epri->control_fd = -1; + epri->dev = dev; printk("ethertap backend - %s", epri->dev_name); - if(epri->gate_addr != NULL) + if (epri->gate_addr != NULL) printk(", IP = %s", epri->gate_addr); printk("\n"); } diff -urN linux-2.5.70-bk8/arch/um/os-Linux/drivers/tuntap_kern.c linux-2.5.70-bk9/arch/um/os-Linux/drivers/tuntap_kern.c --- linux-2.5.70-bk8/arch/um/os-Linux/drivers/tuntap_kern.c 2003-05-26 18:00:41.000000000 -0700 +++ linux-2.5.70-bk9/arch/um/os-Linux/drivers/tuntap_kern.c 2003-06-04 04:37:23.000000000 -0700 @@ -24,17 +24,16 @@ struct tuntap_data *tpri; struct tuntap_init *init = data; - init_etherdev(dev, 0); pri = dev->priv; tpri = (struct tuntap_data *) pri->user; - *tpri = ((struct tuntap_data) - { .dev_name = init->dev_name, - .fixed_config = (init->dev_name != NULL), - .gate_addr = init->gate_addr, - .fd = -1, - .dev = dev }); + tpri->dev_name = init->dev_name; + tpri->fixed_config = (init->dev_name != NULL); + tpri->gate_addr = init->gate_addr; + tpri->fd = -1; + tpri->dev = dev; + printk("TUN/TAP backend - "); - if(tpri->gate_addr != NULL) + if (tpri->gate_addr != NULL) printk("IP = %s", tpri->gate_addr); printk("\n"); } diff -urN linux-2.5.70-bk8/drivers/base/base.h linux-2.5.70-bk9/drivers/base/base.h --- linux-2.5.70-bk8/drivers/base/base.h 2003-05-26 18:00:38.000000000 -0700 +++ linux-2.5.70-bk9/drivers/base/base.h 2003-06-04 04:37:23.000000000 -0700 @@ -4,3 +4,12 @@ extern int bus_add_driver(struct device_driver *); extern void bus_remove_driver(struct device_driver *); +static inline struct class_device *to_class_dev(struct kobject *obj) +{ + return container_of(obj,struct class_device,kobj); +} +static inline +struct class_device_attribute *to_class_dev_attr(struct attribute *_attr) +{ + return container_of(_attr,struct class_device_attribute,attr); +} diff -urN linux-2.5.70-bk8/drivers/base/bus.c linux-2.5.70-bk9/drivers/base/bus.c --- linux-2.5.70-bk8/drivers/base/bus.c 2003-05-26 18:00:26.000000000 -0700 +++ linux-2.5.70-bk9/drivers/base/bus.c 2003-06-04 04:37:23.000000000 -0700 @@ -1,10 +1,11 @@ /* * bus.c - bus driver management + * + * Copyright (c) 2002-3 Patrick Mochel + * Copyright (c) 2002-3 Open Source Development Labs * - * Copyright (c) 2002 Patrick Mochel - * 2002 Open Source Development Lab - * - * + * This file is released under the GPLv2 + * */ #undef DEBUG diff -urN linux-2.5.70-bk8/drivers/base/class.c linux-2.5.70-bk9/drivers/base/class.c --- linux-2.5.70-bk8/drivers/base/class.c 2003-05-26 18:01:00.000000000 -0700 +++ linux-2.5.70-bk9/drivers/base/class.c 2003-06-04 04:37:23.000000000 -0700 @@ -1,7 +1,11 @@ /* * class.c - basic device class management + * + * Copyright (c) 2002-3 Patrick Mochel + * Copyright (c) 2002-3 Open Source Development Labs * - * Copyright (c) 2001-2003 Patrick Mochel + * This file is released under the GPLv2 + * */ #undef DEBUG @@ -148,9 +152,6 @@ } -#define to_class_dev(obj) container_of(obj,struct class_device,kobj) -#define to_class_dev_attr(_attr) container_of(_attr,struct class_device_attribute,attr) - static ssize_t class_device_attr_show(struct kobject * kobj, struct attribute * attr, char * buf) @@ -182,8 +183,20 @@ .store = class_device_attr_store, }; +static void class_dev_release(struct kobject * kobj) +{ + struct class_device *cd = to_class_dev(kobj); + struct class * cls = cd->class; + + pr_debug("device class '%s': release.\n",cd->class_id); + + if (cls->release) + cd->release(cd); +} + static struct kobj_type ktype_class_device = { .sysfs_ops = &class_dev_sysfs_ops, + .release = class_dev_release, }; static int class_hotplug_filter(struct kset *kset, struct kobject *kobj) @@ -311,11 +324,8 @@ up_write(&parent->subsys.rwsem); } - if (class_dev->dev) { - class_device_dev_unlink(class_dev); - class_device_driver_unlink(class_dev); - put_device(class_dev->dev); - } + class_device_dev_unlink(class_dev); + class_device_driver_unlink(class_dev); kobject_del(&class_dev->kobj); diff -urN linux-2.5.70-bk8/drivers/base/core.c linux-2.5.70-bk9/drivers/base/core.c --- linux-2.5.70-bk8/drivers/base/core.c 2003-05-26 18:00:21.000000000 -0700 +++ linux-2.5.70-bk9/drivers/base/core.c 2003-06-04 04:37:23.000000000 -0700 @@ -1,8 +1,11 @@ /* * drivers/base/core.c - core driver model code (device registration, etc) + * + * Copyright (c) 2002-3 Patrick Mochel + * Copyright (c) 2002-3 Open Source Development Labs * - * Copyright (c) 2002 Patrick Mochel - * 2002 Open Source Development Lab + * This file is released under the GPLv2 + * */ #undef DEBUG diff -urN linux-2.5.70-bk8/drivers/base/cpu.c linux-2.5.70-bk9/drivers/base/cpu.c --- linux-2.5.70-bk8/drivers/base/cpu.c 2003-05-26 18:00:28.000000000 -0700 +++ linux-2.5.70-bk9/drivers/base/cpu.c 2003-06-04 04:37:23.000000000 -0700 @@ -46,7 +46,7 @@ snprintf(cpu->sysdev.class_dev.class_id, BUS_ID_SIZE, "cpu%d", num); retval = class_device_register(&cpu->sysdev.class_dev); if (retval) { - // FIXME cleanup sys_device_register + sys_device_unregister(&cpu->sysdev); return retval; } return 0; @@ -58,10 +58,12 @@ int error; error = class_register(&cpu_class); - if (!error) { - error = driver_register(&cpu_driver); - if (error) - class_unregister(&cpu_class); - } + if (error) + goto out; + + error = driver_register(&cpu_driver); + if (error) + class_unregister(&cpu_class); +out: return error; } diff -urN linux-2.5.70-bk8/drivers/base/driver.c linux-2.5.70-bk9/drivers/base/driver.c --- linux-2.5.70-bk8/drivers/base/driver.c 2003-05-26 18:00:56.000000000 -0700 +++ linux-2.5.70-bk9/drivers/base/driver.c 2003-06-04 04:37:23.000000000 -0700 @@ -1,6 +1,11 @@ /* * driver.c - centralized device driver management * + * Copyright (c) 2002-3 Patrick Mochel + * Copyright (c) 2002-3 Open Source Development Labs + * + * This file is released under the GPLv2 + * */ #undef DEBUG diff -urN linux-2.5.70-bk8/drivers/base/firmware.c linux-2.5.70-bk9/drivers/base/firmware.c --- linux-2.5.70-bk8/drivers/base/firmware.c 2003-05-26 18:00:40.000000000 -0700 +++ linux-2.5.70-bk9/drivers/base/firmware.c 2003-06-04 04:37:23.000000000 -0700 @@ -1,5 +1,11 @@ /* * firmware.c - firmware subsystem hoohaw. + * + * Copyright (c) 2002-3 Patrick Mochel + * Copyright (c) 2002-3 Open Source Development Labs + * + * This file is released under the GPLv2 + * */ #include diff -urN linux-2.5.70-bk8/drivers/base/init.c linux-2.5.70-bk9/drivers/base/init.c --- linux-2.5.70-bk8/drivers/base/init.c 2003-05-26 18:00:22.000000000 -0700 +++ linux-2.5.70-bk9/drivers/base/init.c 2003-06-04 04:37:23.000000000 -0700 @@ -1,3 +1,11 @@ +/* + * + * Copyright (c) 2002-3 Patrick Mochel + * Copyright (c) 2002-3 Open Source Development Labs + * + * This file is released under the GPLv2 + * + */ #include #include diff -urN linux-2.5.70-bk8/drivers/base/interface.c linux-2.5.70-bk9/drivers/base/interface.c --- linux-2.5.70-bk8/drivers/base/interface.c 2003-05-26 18:00:22.000000000 -0700 +++ linux-2.5.70-bk9/drivers/base/interface.c 2003-06-04 04:37:23.000000000 -0700 @@ -1,8 +1,12 @@ /* * drivers/base/interface.c - common driverfs interface that's exported to * the world for all devices. - * Copyright (c) 2002 Patrick Mochel - * 2002 Open Source Development Lab + * + * Copyright (c) 2002-3 Patrick Mochel + * Copyright (c) 2002-3 Open Source Development Labs + * + * This file is released under the GPLv2 + * */ #include diff -urN linux-2.5.70-bk8/drivers/base/platform.c linux-2.5.70-bk9/drivers/base/platform.c --- linux-2.5.70-bk8/drivers/base/platform.c 2003-05-26 18:00:23.000000000 -0700 +++ linux-2.5.70-bk9/drivers/base/platform.c 2003-06-04 04:37:23.000000000 -0700 @@ -1,6 +1,11 @@ /* * platform.c - platform 'psuedo' bus for legacy devices * + * Copyright (c) 2002-3 Patrick Mochel + * Copyright (c) 2002-3 Open Source Development Labs + * + * This file is released under the GPLv2 + * * Please see Documentation/driver-model/platform.txt for more * information. */ diff -urN linux-2.5.70-bk8/drivers/base/power.c linux-2.5.70-bk9/drivers/base/power.c --- linux-2.5.70-bk8/drivers/base/power.c 2003-05-26 18:00:42.000000000 -0700 +++ linux-2.5.70-bk9/drivers/base/power.c 2003-06-04 04:37:23.000000000 -0700 @@ -1,14 +1,16 @@ /* * power.c - power management functions for the device tree. * - * Copyright (c) 2002 Patrick Mochel - * 2002 Open Source Development Lab + * Copyright (c) 2002-3 Patrick Mochel + * 2002-3 Open Source Development Lab + * + * This file is released under the GPLv2 * * Kai Germaschewski contributed to the list walking routines. * */ -#undef DEBUG +#define DEBUG #include #include @@ -88,10 +90,12 @@ down_write(&devices_subsys.rwsem); list_for_each(entry,&devices_subsys.kset.list) { struct device * dev = to_dev(entry); + pr_debug("shutting down %s: ",dev->name); if (dev->driver && dev->driver->shutdown) { - pr_debug("shutting down %s\n",dev->name); + pr_debug("Ok\n"); dev->driver->shutdown(dev); - } + } else + pr_debug("Ignored.\n"); } up_write(&devices_subsys.rwsem); } diff -urN linux-2.5.70-bk8/drivers/base/sys.c linux-2.5.70-bk9/drivers/base/sys.c --- linux-2.5.70-bk8/drivers/base/sys.c 2003-05-26 18:00:19.000000000 -0700 +++ linux-2.5.70-bk9/drivers/base/sys.c 2003-06-04 04:37:23.000000000 -0700 @@ -1,8 +1,10 @@ /* * sys.c - pseudo-bus for system 'devices' (cpus, PICs, timers, etc) * - * Copyright (c) 2002 Patrick Mochel - * 2002 Open Source Development Lab + * Copyright (c) 2002-3 Patrick Mochel + * 2002-3 Open Source Development Lab + * + * This file is released under the GPLv2 * * This exports a 'system' bus type. * By default, a 'sys' bus gets added to the root of the system. There will diff -urN linux-2.5.70-bk8/drivers/ide/ide-proc.c linux-2.5.70-bk9/drivers/ide/ide-proc.c --- linux-2.5.70-bk8/drivers/ide/ide-proc.c 2003-05-26 18:00:40.000000000 -0700 +++ linux-2.5.70-bk9/drivers/ide/ide-proc.c 2003-06-04 04:37:25.000000000 -0700 @@ -712,7 +712,6 @@ for (d = 0; d < MAX_DRIVES; d++) { ide_drive_t *drive = &hwif->drives[d]; - ide_driver_t *driver = drive->driver; if (!drive->present) continue; @@ -720,13 +719,8 @@ continue; drive->proc = proc_mkdir(drive->name, parent); - if (drive->proc) { + if (drive->proc) ide_add_proc_entries(drive->proc, generic_drive_entries, drive); - if (driver) { - ide_add_proc_entries(drive->proc, generic_subdriver_entries, drive); - ide_add_proc_entries(drive->proc, driver->proc, drive); - } - } sprintf(name,"ide%d/%s", (drive->name[2]-'a')/2, drive->name); ent = proc_symlink(drive->name, proc_ide_root, name); if (!ent) return; @@ -735,34 +729,6 @@ EXPORT_SYMBOL(create_proc_ide_drives); -void recreate_proc_ide_device(ide_hwif_t *hwif, ide_drive_t *drive) -{ - struct proc_dir_entry *ent; - struct proc_dir_entry *parent = hwif->proc; - char name[64]; - - if (drive->present && !drive->proc) { - drive->proc = proc_mkdir(drive->name, parent); - if (drive->proc) - ide_add_proc_entries(drive->proc, generic_drive_entries, drive); - -/* - * assume that we have these already, however, should test FIXME! - * if (driver) { - * ide_add_proc_entries(drive->proc, generic_subdriver_entries, drive); - * ide_add_proc_entries(drive->proc, driver->proc, drive); - * } - * - */ - sprintf(name,"ide%d/%s", (drive->name[2]-'a')/2, drive->name); - ent = proc_symlink(drive->name, proc_ide_root, name); - if (!ent) - return; - } -} - -EXPORT_SYMBOL(recreate_proc_ide_device); - void destroy_proc_ide_device(ide_hwif_t *hwif, ide_drive_t *drive) { ide_driver_t *driver = drive->driver; @@ -909,16 +875,11 @@ void proc_ide_destroy(void) { #ifdef CONFIG_BLK_DEV_IDEPCI - ide_pci_host_proc_t *p = ide_pci_host_proc_list; - char name[32]; + ide_pci_host_proc_t *p; - while ((p->name != NULL) && (p->set) && (p->get_info != NULL)) { - name[0] = '\0'; - sprintf(name, "ide/%s", p->name); + for (p = ide_pci_host_proc_list; p; p = p->next) { if (p->set == 2) remove_proc_entry(p->name, p->parent); - if (p->next == NULL) break; - p = p->next; } #endif /* CONFIG_BLK_DEV_IDEPCI */ remove_proc_entry("ide/drivers", proc_ide_root); diff -urN linux-2.5.70-bk8/drivers/ide/ide.c linux-2.5.70-bk9/drivers/ide/ide.c --- linux-2.5.70-bk8/drivers/ide/ide.c 2003-06-04 04:37:17.000000000 -0700 +++ linux-2.5.70-bk9/drivers/ide/ide.c 2003-06-04 04:37:25.000000000 -0700 @@ -2349,8 +2349,10 @@ } drive->suspend_reset = 0; #ifdef CONFIG_PROC_FS - ide_add_proc_entries(drive->proc, generic_subdriver_entries, drive); - ide_add_proc_entries(drive->proc, driver->proc, drive); + if (drive->driver != &idedefault_driver) { + ide_add_proc_entries(drive->proc, generic_subdriver_entries, drive); + ide_add_proc_entries(drive->proc, driver->proc, drive); + } #endif return 0; } diff -urN linux-2.5.70-bk8/drivers/message/fusion/mptlan.c linux-2.5.70-bk9/drivers/message/fusion/mptlan.c --- linux-2.5.70-bk8/drivers/message/fusion/mptlan.c 2003-05-26 18:00:40.000000000 -0700 +++ linux-2.5.70-bk9/drivers/message/fusion/mptlan.c 2003-06-04 04:37:25.000000000 -0700 @@ -1356,16 +1356,16 @@ } /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ -struct net_device * +static struct net_device * mpt_register_lan_device (MPT_ADAPTER *mpt_dev, int pnum) { - struct net_device *dev = NULL; + struct net_device *dev = alloc_fcdev(sizeof(struct mpt_lan_priv)); struct mpt_lan_priv *priv = NULL; u8 HWaddr[FC_ALEN], *a; - dev = init_fcdev(NULL, sizeof(struct mpt_lan_priv)); if (!dev) - return (NULL); + return NULL; + dev->mtu = MPT_LAN_MTU; priv = (struct mpt_lan_priv *) dev->priv; @@ -1435,15 +1435,18 @@ SET_MODULE_OWNER(dev); + if (register_netdev(dev) != 0) { + kfree(dev); + dev = NULL; + } return dev; } /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ -int __init -mpt_lan_init (void) +static int __init mpt_lan_init (void) { struct net_device *dev; - MPT_ADAPTER *curadapter; + MPT_ADAPTER *p; int i, j; show_mptmod_ver(LANAME, LANVER); @@ -1477,51 +1480,49 @@ mpt_landev[j] = NULL; } - curadapter = mpt_adapter_find_first(); - while (curadapter != NULL) { - for (i = 0; i < curadapter->facts.NumberOfPorts; i++) { + for (p = mpt_adapter_find_first(); p; p = mpt_adapter_find_next(p)) { + for (i = 0; i < p->facts.NumberOfPorts; i++) { printk (KERN_INFO MYNAM ": %s: PortNum=%x, ProtocolFlags=%02Xh (%c%c%c%c)\n", - curadapter->name, - curadapter->pfacts[i].PortNumber, - curadapter->pfacts[i].ProtocolFlags, - MPT_PROTOCOL_FLAGS_c_c_c_c(curadapter->pfacts[i].ProtocolFlags)); - - if (curadapter->pfacts[i].ProtocolFlags & MPI_PORTFACTS_PROTOCOL_LAN) { - dev = mpt_register_lan_device (curadapter, i); - if (dev != NULL) { - printk (KERN_INFO MYNAM ": %s: Fusion MPT LAN device registered as '%s'\n", - curadapter->name, dev->name); - printk (KERN_INFO MYNAM ": %s/%s: LanAddr = %02X:%02X:%02X:%02X:%02X:%02X\n", - IOC_AND_NETDEV_NAMES_s_s(dev), - dev->dev_addr[0], dev->dev_addr[1], - dev->dev_addr[2], dev->dev_addr[3], - dev->dev_addr[4], dev->dev_addr[5]); + p->name, + p->pfacts[i].PortNumber, + p->pfacts[i].ProtocolFlags, + MPT_PROTOCOL_FLAGS_c_c_c_c(p->pfacts[i].ProtocolFlags)); + + if (!(p->pfacts[i].ProtocolFlags & MPI_PORTFACTS_PROTOCOL_LAN)) { + printk (KERN_INFO MYNAM ": %s: Hmmm... LAN protocol seems to be disabled on this adapter port!\n", + p->name); + continue; + } + + dev = mpt_register_lan_device (p, i); + if (!dev) { + printk (KERN_ERR MYNAM ": %s: Unable to register port%d as a LAN device\n", + p->name, + p->pfacts[i].PortNumber); + } + printk (KERN_INFO MYNAM ": %s: Fusion MPT LAN device registered as '%s'\n", + p->name, dev->name); + printk (KERN_INFO MYNAM ": %s/%s: LanAddr = %02X:%02X:%02X:%02X:%02X:%02X\n", + IOC_AND_NETDEV_NAMES_s_s(dev), + dev->dev_addr[0], dev->dev_addr[1], + dev->dev_addr[2], dev->dev_addr[3], + dev->dev_addr[4], dev->dev_addr[5]); // printk (KERN_INFO MYNAM ": %s/%s: Max_TX_outstanding = %d\n", // IOC_AND_NETDEV_NAMES_s_s(dev), // NETDEV_TO_LANPRIV_PTR(dev)->tx_max_out); - j = curadapter->id; - mpt_landev[j] = dev; - dlprintk((KERN_INFO MYNAM "/init: dev_addr=%p, mpt_landev[%d]=%p\n", - dev, j, mpt_landev[j])); - - } else { - printk (KERN_ERR MYNAM ": %s: Unable to register port%d as a LAN device\n", - curadapter->name, - curadapter->pfacts[i].PortNumber); - } - } else { - printk (KERN_INFO MYNAM ": %s: Hmmm... LAN protocol seems to be disabled on this adapter port!\n", - curadapter->name); - } + j = p->id; + mpt_landev[j] = dev; + dlprintk((KERN_INFO MYNAM "/init: dev_addr=%p, mpt_landev[%d]=%p\n", + dev, j, mpt_landev[j])); + } - curadapter = mpt_adapter_find_next(curadapter); } return 0; } /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ -static void mpt_lan_exit(void) +static void __exit mpt_lan_exit(void) { int i; @@ -1532,7 +1533,7 @@ printk (KERN_INFO ": %s/%s: Fusion MPT LAN device unregistered\n", IOC_AND_NETDEV_NAMES_s_s(dev)); - unregister_fcdev(dev); + unregister_netdev(dev); //mpt_landev[i] = (struct net_device *) 0xdeadbeef; /* Debug */ mpt_landev[i] = NULL; } diff -urN linux-2.5.70-bk8/drivers/net/defxx.c linux-2.5.70-bk9/drivers/net/defxx.c --- linux-2.5.70-bk8/drivers/net/defxx.c 2003-05-26 18:00:19.000000000 -0700 +++ linux-2.5.70-bk9/drivers/net/defxx.c 2003-06-04 04:37:25.000000000 -0700 @@ -425,11 +425,7 @@ } #endif - /* - * init_fddidev() allocates a device structure with private data, clears the device structure and private data, - * and calls fddi_setup() and register_netdev(). Not much left to do for us here. - */ - dev = init_fddidev(NULL, sizeof(*bp)); + dev = alloc_fddidev(sizeof(*bp)); if (!dev) { printk (KERN_ERR "defxx: unable to allocate fddidev, aborting\n"); return -ENOMEM; @@ -483,12 +479,17 @@ goto err_out_region; } + err = register_netdev(dev); + if (err) + goto err_out_kfree; + return 0; +err_out_kfree: + if (bp->kmalloced) kfree(bp->kmalloced); err_out_region: release_region(ioaddr, pdev ? PFI_K_CSR_IO_LEN : PI_ESIC_K_CSR_IO_LEN); err_out: - unregister_netdev(dev); kfree(dev); return err; } diff -urN linux-2.5.70-bk8/drivers/net/fc/iph5526.c linux-2.5.70-bk9/drivers/net/fc/iph5526.c --- linux-2.5.70-bk8/drivers/net/fc/iph5526.c 2003-05-26 18:00:26.000000000 -0700 +++ linux-2.5.70-bk9/drivers/net/fc/iph5526.c 2003-06-04 04:37:25.000000000 -0700 @@ -234,7 +234,7 @@ { if (pci_present() && (iph5526_probe_pci(dev) == 0)) return 0; - return -ENODEV; + return -ENODEV; } static int __init iph5526_probe_pci(struct net_device *dev) @@ -242,37 +242,30 @@ #ifdef MODULE struct fc_info *fi = (struct fc_info *)dev->priv; #else - struct fc_info *fi; + struct fc_info *fi = fc[count]; static int count; + int err; - if(fc[count] != NULL) { - if (dev == NULL) { - dev = init_fcdev(NULL, 0); - if (dev == NULL) - return -ENOMEM; - } - fi = fc[count]; -#endif - fi->dev = dev; - dev->base_addr = fi->base_addr; - dev->irq = fi->irq; - if (dev->priv == NULL) - dev->priv = fi; - fcdev_init(dev); - /* Assign ur MAC address. - */ - dev->dev_addr[0] = (fi->g.my_port_name_high & 0x0000FF00) >> 8; - dev->dev_addr[1] = fi->g.my_port_name_high; - dev->dev_addr[2] = (fi->g.my_port_name_low & 0xFF000000) >> 24; - dev->dev_addr[3] = (fi->g.my_port_name_low & 0x00FF0000) >> 16; - dev->dev_addr[4] = (fi->g.my_port_name_low & 0x0000FF00) >> 8; - dev->dev_addr[5] = fi->g.my_port_name_low; -#ifndef MODULE - count++; - } - else + if (!fi) return -ENODEV; + + fc_setup(dev); + count++; #endif + fi->dev = dev; + dev->base_addr = fi->base_addr; + dev->irq = fi->irq; + if (dev->priv == NULL) + dev->priv = fi; + fcdev_init(dev); + /* Assign ur MAC address. + */ + dev->dev_addr[0] = (fi->g.my_port_name_high & 0x0000FF00) >> 8; + dev->dev_addr[1] = fi->g.my_port_name_high; + dev->dev_addr[2] = (fi->g.my_port_name_low & 0xFF000000) >> 24; + dev->dev_addr[3] = (fi->g.my_port_name_low & 0x00FF0000) >> 16; + dev->dev_addr[4] = (fi->g.my_port_name_low & 0x0000FF00) >> 8; + dev->dev_addr[5] = fi->g.my_port_name_low; display_cache(fi); return 0; } @@ -287,9 +280,6 @@ dev->change_mtu = iph5526_change_mtu; dev->tx_timeout = iph5526_timeout; dev->watchdog_timeo = 5*HZ; -#ifndef MODULE - fc_setup(dev); -#endif return 0; } @@ -4507,7 +4497,7 @@ int init_module(void) { -int i = 0; + int i = 0; driver_template.module = THIS_MODULE; scsi_register_host(&driver_template); @@ -4520,43 +4510,39 @@ } while(fc[i] != NULL) { - dev_fc[i] = NULL; - dev_fc[i] = init_fcdev(dev_fc[i], 0); - if (dev_fc[i] == NULL) { + struct net_device *dev = alloc_fcdev(0); + int err; + + if (!dev) { printk("iph5526.c: init_fcdev failed for card #%d\n", i+1); break; } - dev_fc[i]->irq = irq; - dev_fc[i]->mem_end = bad; - dev_fc[i]->base_addr = io; - dev_fc[i]->init = iph5526_probe; - dev_fc[i]->priv = fc[i]; - fc[i]->dev = dev_fc[i]; - if (register_fcdev(dev_fc[i]) != 0) { - kfree(dev_fc[i]); - dev_fc[i] = NULL; - if (i == 0) { - printk("iph5526.c: IP registeration failed!!!\n"); - return -ENODEV; - } + dev->priv = fc[i]; + iph5526_probe_pci(dev); + err = register_netdev(dev); + if (err < 0) { + kfree(dev); + printk("iph5526.c: init_fcdev failed for card #%d\n", i+1); + break; } + dev_fc[i] = dev; i++; } if (i == 0) return -ENODEV; - + return 0; } void cleanup_module(void) { -int i = 0; + int i = 0; while(fc[i] != NULL) { - struct net_device *dev = fc[i]->dev; - void *priv = dev->priv; + struct net_device *dev = fc[i]->dev; + void *priv = dev->priv; fc[i]->g.dont_init = TRUE; take_tachyon_offline(fc[i]); - unregister_fcdev(dev); + unregister_netdev(dev); clean_up_memory(fc[i]); if (dev->priv) kfree(priv); diff -urN linux-2.5.70-bk8/drivers/net/net_init.c linux-2.5.70-bk9/drivers/net/net_init.c --- linux-2.5.70-bk8/drivers/net/net_init.c 2003-05-26 18:00:21.000000000 -0700 +++ linux-2.5.70-bk9/drivers/net/net_init.c 2003-06-04 04:37:25.000000000 -0700 @@ -178,17 +178,6 @@ return dev; } -#if defined(CONFIG_HIPPI) || defined(CONFIG_TR) || defined(CONFIG_NET_FC) -static int __register_netdev(struct net_device *dev) -{ - if (dev->init && dev->init(dev) != 0) { - unregister_netdev(dev); - return -EIO; - } - return 0; -} -#endif - /** * init_etherdev - Register ethernet device * @dev: An ethernet device structure to be filled in, or %NULL if a new @@ -252,28 +241,6 @@ #ifdef CONFIG_FDDI /** - * init_fddidev - Register FDDI device - * @dev: A FDDI device structure to be filled in, or %NULL if a new - * struct should be allocated. - * @sizeof_priv: Size of additional driver-private structure to be allocated - * for this ethernet device - * - * Fill in the fields of the device structure with FDDI-generic values. - * - * If no device structure is passed, a new one is constructed, complete with - * a private data area of size @sizeof_priv. A 32-byte (not bit) - * alignment is enforced for this private data area. - * - * If an empty string area is passed as dev->name, or a new structure is made, - * a new name string is constructed. - */ - -struct net_device *init_fddidev(struct net_device *dev, int sizeof_priv) -{ - return init_netdev(dev, sizeof_priv, "fddi%d", fddi_setup); -} - -/** * alloc_fddidev - Register FDDI device * @sizeof_priv: Size of additional driver-private structure to be allocated * for this FDDI device @@ -290,7 +257,6 @@ return alloc_netdev(sizeof_priv, "fddi%d", fddi_setup); } -EXPORT_SYMBOL(init_fddidev); EXPORT_SYMBOL(alloc_fddidev); static int fddi_change_mtu(struct net_device *dev, int new_mtu) @@ -330,27 +296,50 @@ return 0; } +static int hippi_neigh_setup_dev(struct net_device *dev, struct neigh_parms *p) +{ + /* Never send broadcast/multicast ARP messages */ + p->mcast_probes = 0; + + /* In IPv6 unicast probes are valid even on NBMA, + * because they are encapsulated in normal IPv6 protocol. + * Should be a generic flag. + */ + if (p->tbl->family != AF_INET6) + p->ucast_probes = 0; + return 0; +} -/** - * init_hippi_dev - Register HIPPI device - * @dev: A HIPPI device structure to be filled in, or %NULL if a new - * struct should be allocated. - * @sizeof_priv: Size of additional driver-private structure to be allocated - * for this ethernet device - * - * Fill in the fields of the device structure with HIPPI-generic values. - * - * If no device structure is passed, a new one is constructed, complete with - * a private data area of size @sizeof_priv. A 32-byte (not bit) - * alignment is enforced for this private data area. - * - * If an empty string area is passed as dev->name, or a new structure is made, - * a new name string is constructed. - */ - -struct net_device *init_hippi_dev(struct net_device *dev, int sizeof_priv) +static void hippi_setup(struct net_device *dev) { - return init_netdev(dev, sizeof_priv, "hip%d", hippi_setup); + dev->set_multicast_list = NULL; + dev->change_mtu = hippi_change_mtu; + dev->hard_header = hippi_header; + dev->rebuild_header = hippi_rebuild_header; + dev->set_mac_address = hippi_mac_addr; + dev->hard_header_parse = NULL; + dev->hard_header_cache = NULL; + dev->header_cache_update = NULL; + dev->neigh_setup = hippi_neigh_setup_dev; + + /* + * We don't support HIPPI `ARP' for the time being, and probably + * never will unless someone else implements it. However we + * still need a fake ARPHRD to make ifconfig and friends play ball. + */ + dev->type = ARPHRD_HIPPI; + dev->hard_header_len = HIPPI_HLEN; + dev->mtu = 65280; + dev->addr_len = HIPPI_ALEN; + dev->tx_queue_len = 25 /* 5 */; + memset(dev->broadcast, 0xFF, HIPPI_ALEN); + + + /* + * HIPPI doesn't support broadcast+multicast and we only use + * static ARP tables. ARP is disabled by hippi_neigh_setup_dev. + */ + dev->flags = 0; } /** @@ -370,34 +359,7 @@ return alloc_netdev(sizeof_priv, "hip%d", hippi_setup); } -int register_hipdev(struct net_device *dev) -{ - return __register_netdev(dev); -} - -void unregister_hipdev(struct net_device *dev) -{ - unregister_netdev(dev); -} - -EXPORT_SYMBOL(init_hippi_dev); EXPORT_SYMBOL(alloc_hippi_dev); -EXPORT_SYMBOL(register_hipdev); -EXPORT_SYMBOL(unregister_hipdev); - -static int hippi_neigh_setup_dev(struct net_device *dev, struct neigh_parms *p) -{ - /* Never send broadcast/multicast ARP messages */ - p->mcast_probes = 0; - - /* In IPv6 unicast probes are valid even on NBMA, - * because they are encapsulated in normal IPv6 protocol. - * Should be a generic flag. - */ - if (p->tbl->family != AF_INET6) - p->ucast_probes = 0; - return 0; -} #endif /* CONFIG_HIPPI */ @@ -455,41 +417,6 @@ #endif /* CONFIG_FDDI */ -#ifdef CONFIG_HIPPI -void hippi_setup(struct net_device *dev) -{ - dev->set_multicast_list = NULL; - dev->change_mtu = hippi_change_mtu; - dev->hard_header = hippi_header; - dev->rebuild_header = hippi_rebuild_header; - dev->set_mac_address = hippi_mac_addr; - dev->hard_header_parse = NULL; - dev->hard_header_cache = NULL; - dev->header_cache_update = NULL; - dev->neigh_setup = hippi_neigh_setup_dev; - - /* - * We don't support HIPPI `ARP' for the time being, and probably - * never will unless someone else implements it. However we - * still need a fake ARPHRD to make ifconfig and friends play ball. - */ - dev->type = ARPHRD_HIPPI; - dev->hard_header_len = HIPPI_HLEN; - dev->mtu = 65280; - dev->addr_len = HIPPI_ALEN; - dev->tx_queue_len = 25 /* 5 */; - memset(dev->broadcast, 0xFF, HIPPI_ALEN); - - - /* - * HIPPI doesn't support broadcast+multicast and we only use - * static ARP tables. ARP is disabled by hippi_neigh_setup_dev. - */ - dev->flags = 0; -} -EXPORT_SYMBOL(hippi_setup); -#endif /* CONFIG_HIPPI */ - #if defined(CONFIG_ATALK) || defined(CONFIG_ATALK_MODULE) static int ltalk_change_mtu(struct net_device *dev, int mtu) @@ -598,28 +525,6 @@ } /** - * init_trdev - Register token ring device - * @dev: A token ring device structure to be filled in, or %NULL if a new - * struct should be allocated. - * @sizeof_priv: Size of additional driver-private structure to be allocated - * for this ethernet device - * - * Fill in the fields of the device structure with token ring-generic values. - * - * If no device structure is passed, a new one is constructed, complete with - * a private data area of size @sizeof_priv. A 32-byte (not bit) - * alignment is enforced for this private data area. - * - * If an empty string area is passed as dev->name, or a new structure is made, - * a new name string is constructed. - */ - -struct net_device *init_trdev(struct net_device *dev, int sizeof_priv) -{ - return init_netdev(dev, sizeof_priv, "tr%d", tr_setup); -} - -/** * alloc_trdev - Register token ring device * @sizeof_priv: Size of additional driver-private structure to be allocated * for this token ring device @@ -636,25 +541,11 @@ return alloc_netdev(sizeof_priv, "tr%d", tr_setup); } -int register_trdev(struct net_device *dev) -{ - return __register_netdev(dev); -} - -void unregister_trdev(struct net_device *dev) -{ - unregister_netdev(dev); -} - EXPORT_SYMBOL(tr_setup); -EXPORT_SYMBOL(init_trdev); EXPORT_SYMBOL(alloc_trdev); -EXPORT_SYMBOL(register_trdev); -EXPORT_SYMBOL(unregister_trdev); #endif /* CONFIG_TR */ - #ifdef CONFIG_NET_FC void fc_setup(struct net_device *dev) @@ -675,28 +566,6 @@ } /** - * init_fcdev - Register fibre channel device - * @dev: A fibre channel device structure to be filled in, or %NULL if a new - * struct should be allocated. - * @sizeof_priv: Size of additional driver-private structure to be allocated - * for this ethernet device - * - * Fill in the fields of the device structure with fibre channel-generic values. - * - * If no device structure is passed, a new one is constructed, complete with - * a private data area of size @sizeof_priv. A 32-byte (not bit) - * alignment is enforced for this private data area. - * - * If an empty string area is passed as dev->name, or a new structure is made, - * a new name string is constructed. - */ - -struct net_device *init_fcdev(struct net_device *dev, int sizeof_priv) -{ - return init_netdev(dev, sizeof_priv, "fc%d", fc_setup); -} - -/** * alloc_fcdev - Register fibre channel device * @sizeof_priv: Size of additional driver-private structure to be allocated * for this fibre channel device @@ -713,21 +582,8 @@ return alloc_netdev(sizeof_priv, "fc%d", fc_setup); } -int register_fcdev(struct net_device *dev) -{ - return __register_netdev(dev); -} - -void unregister_fcdev(struct net_device *dev) -{ - unregister_netdev(dev); -} - EXPORT_SYMBOL(fc_setup); -EXPORT_SYMBOL(init_fcdev); EXPORT_SYMBOL(alloc_fcdev); -EXPORT_SYMBOL(register_fcdev); -EXPORT_SYMBOL(unregister_fcdev); #endif /* CONFIG_NET_FC */ diff -urN linux-2.5.70-bk8/drivers/net/pcmcia/ibmtr_cs.c linux-2.5.70-bk9/drivers/net/pcmcia/ibmtr_cs.c --- linux-2.5.70-bk8/drivers/net/pcmcia/ibmtr_cs.c 2003-05-26 18:00:40.000000000 -0700 +++ linux-2.5.70-bk9/drivers/net/pcmcia/ibmtr_cs.c 2003-06-04 04:37:26.000000000 -0700 @@ -208,10 +208,13 @@ flush_stale_links(); /* Create new token-ring device */ - info = kmalloc(sizeof(*info), GFP_KERNEL); - if (!info) return NULL; - memset(info, 0, sizeof(*info)); - link = &info->link; link->priv = info; + dev = alloc_trdev(sizeof(*info)); + if (!dev) + return NULL; + info = dev->priv; + + link = &info->link; + link->priv = info; init_timer(&link->release); link->release.function = &ibmtr_release; @@ -232,12 +235,6 @@ link->conf.IntType = INT_MEMORY_AND_IO; link->conf.Present = PRESENT_OPTION; - dev = init_trdev(NULL,0); - if (dev == NULL) { - ibmtr_detach(link); - return NULL; - } - dev->priv = &info->ti; link->irq.Instance = info->dev = dev; dev->init = &ibmtr_probe; @@ -258,11 +255,16 @@ ret = CardServices(RegisterClient, &link->handle, &client_reg); if (ret != 0) { cs_error(link->handle, RegisterClient, ret); - ibmtr_detach(link); - return NULL; + goto out_detach; } +out: return link; + +out_detach: + ibmtr_detach(link); + link = NULL; + goto out; } /* ibmtr_attach */ /*====================================================================== @@ -307,12 +309,8 @@ /* Unlink device structure, free bits */ *linkp = link->next; - if (info->dev) { - unregister_trdev(info->dev); - kfree(info->dev); - } - kfree(info); - + unregister_netdev(dev); + kfree(dev); } /* ibmtr_detach */ /*====================================================================== @@ -413,10 +411,10 @@ Adapters Technical Reference" SC30-3585 for this info. */ ibmtr_hw_setup(dev, mmiobase); - i = register_trdev(dev); + i = register_netdev(dev); if (i != 0) { - printk(KERN_NOTICE "ibmtr_cs: register_trdev() failed\n"); + printk(KERN_NOTICE "ibmtr_cs: register_netdev() failed\n"); goto failed; } diff -urN linux-2.5.70-bk8/drivers/net/ptifddi.c linux-2.5.70-bk9/drivers/net/ptifddi.c --- linux-2.5.70-bk8/drivers/net/ptifddi.c 2003-05-26 18:00:20.000000000 -0700 +++ linux-2.5.70-bk9/drivers/net/ptifddi.c 1969-12-31 16:00:00.000000000 -0800 @@ -1,259 +0,0 @@ -/* $Id: ptifddi.c,v 1.14 2001/04/14 01:12:04 davem Exp $ - * ptifddi.c: Network driver for Performance Technologies single-attach - * and dual-attach FDDI sbus cards. - * - * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu) - */ - -static char *version = - "ptifddi.c:v1.0 10/Dec/96 David S. Miller (davem@caipfs.rutgers.edu)\n"; - -#include -#include - -#include "ptifddi.h" - -#include "ptifddi_asm.h" - -#ifdef MODULE -static struct ptifddi *root_pti_dev; -#endif - -static inline void pti_reset(struct ptifddi *pp) -{ - pp->reset = 1; -} - -static inline void pti_unreset(struct ptifddi *pp) -{ - pp->unreset = 1; -} - -static inline void pti_load_code_base(struct dfddi_ram *rp, unsigned short addr) -{ - rp->loader_addr = ((addr << 8) & 0xff00) | ((addr >> 8) & 0x00ff); -} - -static inline void pti_clear_dpram(struct ptifddi *pp) -{ - memset(pp->dpram, 0, DPRAM_SIZE); -} - -#define CARD_TEST_TIMEOUT 100000 - -static inline int pti_card_test(struct ptifddi *pp) -{ - struct dfddi_ram *rp = pp->dpram; - unsigned char *code = &rp->loader; - unsigned char *status = (unsigned char *) rp; - int clicks = CARD_TEST_TIMEOUT; - - /* Clear it out. */ - pti_clear_dpram(pp); - - /* Load test data. */ - for(i = 0; i < test_firmware_size; i++) - code[i] = test_firmware[i]; - - /* Tell card where to execute the code. */ - pti_load_code_base(pp, test_firmware_dev_addr); - - /* Clear test run status in dpram. */ - *status = 0; - - /* Reset single attach state machine before the test. */ - rp->reset = 1; - - /* Unreset, to get the test code running. */ - pti_unreset(pp); - - /* Wait for dpram status to become 5, else fail if we time out. */ - while(--clicks) { - if(*status == 5) { - pti_reset(pp); - return 0; - } - udelay(20); - } - return 1; -} - -static inline void pti_init_firmware_loader(struct ptifddi *pp) -{ - struct dfddi_ram *rp = pp->dpram; - int i; - - for(i = 0; i < firmware_loader_size; i++) - rp->loader.loader_firmware[i] = firmware_loader[i]; -} - -static inline void pti_load_main_firmware(struct ptifddi *pp) -{ - struct dfddi_ram *rp = pp->dpram; - struct dpram_loader *lp = &rp.loader; - int i; - - -} - -static void pti_init_rings(struct ptifddi *pp, int from_irq) -{ -} - -static int pti_init(struct ptifddi *pp, int from_irq) -{ -} - -static void pti_is_not_so_happy(struct ptifddi *pp) -{ -} - -static inline void pti_tx(struct ptifddi *pp, struct net_device *dev) -{ -} - -static inline void myri_rx(struct ptifddi *pp, struct net_device *dev) -{ -} - -static void pti_interrupt(int irq, void *dev_id, struct pt_regs *regs) -{ - struct net_device *dev = (struct net_device *) dev_id; - struct ptifddi *pp = (struct ptifddi *) dev->priv; - -} - -static int pti_open(struct net_device *dev) -{ - struct ptifddi *pp = (struct ptifddi *) dev->priv; - - return pti_init(pp, in_interrupt()); -} - -static int pti_close(struct net_device *dev) -{ - struct ptifddi *pp = (struct ptifddi *) dev->priv; - - return 0; -} - -static int pti_start_xmit(struct sk_buff *skb, struct net_device *dev) -{ - struct ptifddi *pp = (struct ptifddi *) dev->priv; -} - -static struct net_device_stats *pti_get_stats(struct net_device *dev) -{ return &(((struct ptifddi *)dev->priv)->enet_stats); } - -static void pti_set_multicast(struct net_device *dev) -{ -} - -static inline int pti_fddi_init(struct net_device *dev, struct sbus_dev *sdev, int num) -{ - static unsigned version_printed; - struct ptifddi *pp; - int i; - - dev = init_fddidev(0, sizeof(struct ptifddi)); - - if(version_printed++ == 0) - printk(version); - - /* Register 0 mapping contains DPRAM. */ - pp->dpram = (struct dfddi_ram *) sbus_ioremap( - &sdep->resource[0], 0, sizeof(sturct dfddi_ram), "PTI FDDI DPRAM"); - if(!pp->dpram) { - printk("ptiFDDI: Cannot map DPRAM I/O area.\n"); - return -ENODEV; - } - - /* Next, register 1 contains reset byte. */ - pp->reset = (unsigned char *) sbus_ioremap( - &sdep->resource[1], 0, 1, "PTI FDDI RESET Byte"); - if(!pp->reset) { - printk("ptiFDDI: Cannot map RESET byte.\n"); - return -ENODEV; - } - - /* Register 2 contains unreset byte. */ - pp->unreset = (unsigned char *) sbus_ioremap( - &sdep->resource[2], 0, 1, "PTI FDDI UNRESET Byte"); - if(!pp->unreset) { - printk("ptiFDDI: Cannot map UNRESET byte.\n"); - return -ENODEV; - } - - /* Reset the card. */ - pti_reset(pp); - - /* Run boot-up card tests. */ - i = pti_card_test(pp); - if(i) { - printk("ptiFDDI: Bootup card test fails.\n"); - return -ENODEV; - } - - /* Clear DPRAM, start afresh. */ - pti_clear_dpram(pp); - - /* Init the firmware loader. */ - pti_init_firmware_loader(pp); - - /* Now load main card FDDI firmware, using the loader. */ - pti_load_main_firmware(pp); -} - -int __init ptifddi_sbus_probe(struct net_device *dev) -{ - struct sbus_bus *bus; - struct sbus_dev *sdev = 0; - static int called; - int cards = 0, v; - - if(called) - return -ENODEV; - called++; - - for_each_sbus(bus) { - for_each_sbusdev(sdev, bus) { - if(cards) dev = NULL; - if(!strcmp(sdev->prom_name, "PTI,sbs600") || - !strcmp(sdev->prom_name, "DPV,fddid")) { - cards++; - DET(("Found PTI FDDI as %s\n", sdev->prom_name)); - if((v = pti_fddi_init(dev, sdev, (cards - 1)))) - return v; - } - } - } - if(!cards) - return -ENODEV; - return 0; -} - - -#ifdef MODULE - -int -init_module(void) -{ - root_pti_dev = NULL; - return ptifddi_sbus_probe(NULL); -} - -void -cleanup_module(void) -{ - struct ptifddi *pp; - - while (root_pti_dev) { - pp = root_pti_dev->next_module; - - unregister_netdev(root_pti_dev->dev); - kfree(root_pti_dev->dev); - root_pti_dev = mp; - } -} - -#endif /* MODULE */ diff -urN linux-2.5.70-bk8/drivers/net/ptifddi.h linux-2.5.70-bk9/drivers/net/ptifddi.h --- linux-2.5.70-bk8/drivers/net/ptifddi.h 2003-05-26 18:00:39.000000000 -0700 +++ linux-2.5.70-bk9/drivers/net/ptifddi.h 1969-12-31 16:00:00.000000000 -0800 @@ -1,77 +0,0 @@ -/* $Id: ptifddi.h,v 1.3 1999/08/20 00:31:08 davem Exp $ - * ptifddi.c: Defines for Performance Technologies FDDI sbus cards. - * - * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu) - */ - -#ifndef _PTIFDDI_H -#define _PTIFDDI_H - -struct dpram_loader { - volatile unsigned char dpram_stat; - volatile unsigned char _unused; - volatile unsigned char addr_low; - volatile unsigned char addr_hi; - volatile unsigned char num_bytes; - volatile unsigned char data[0x3b]; - - volatile unsigned char loader_firmware[0xc0]; -}; - -struct dfddi_ram { -/*0x000*/ unsigned char _unused0[0x100]; -/*0x100*/ struct dpram_loader loader; -/*0x200*/ unsigned char instructions[0x400]; -/*0x600*/ unsigned char msg_in[0x20]; -/*0x620*/ unsigned char msg_out[0x20]; -/*0x640*/ unsigned char _unused2[0x50]; -/*0x690*/ unsigned char smsg_in[0x20]; -/*0x6b0*/ unsigned char _unused3[0x30]; -/*0x6e0*/ unsigned char beacom_frame[0x20]; -/*0x700*/ unsigned char re_sync; -/*0x701*/ unsigned char _unused4; -/*0x702*/ unsigned short tswitch; -/*0x704*/ unsigned char evq_lost; -/*0x705*/ unsigned char _unused6; -/*0x706*/ unsigned char signal_lost; -/*0x707*/ unsigned char _unused7; -/*0x708*/ unsigned char lerror; -/*0x709*/ unsigned char _unused8; -/*0x70a*/ unsigned char rstate; -/*0x70b*/ unsigned char _unused9[0x13]; -/*0x716*/ unsigned short dswitch; -/*0x718*/ unsigned char _unused10[0x48]; -/*0x750*/ unsigned char cbusy; -/*0x751*/ unsigned char hbusy; -/*0x752*/ unsigned short istat; -/*0x754*/ unsigned char _unused11[]; -/*0x756*/ unsigned char disable; -/*0x757*/ unsigned char _unused12[]; -/*0x78e*/ unsigned char ucvalid; -/*0x78f*/ unsigned char _unused13; -/*0x790*/ unsigned int u0addr; -/*0x794*/ unsigned char _unused14[]; -/*0x7a8*/ unsigned int P_player; -/*0x7ac*/ unsigned int Q_player; -/*0x7b0*/ unsigned int macsi; -/*0x7b4*/ unsigned char _unused15[]; -/*0x7be*/ unsigned short reset; -/*0x7c0*/ unsigned char _unused16[]; -/*0x7fc*/ unsigned short iack; -/*0x7fe*/ unsigned short loader_addr; -}; - -#define DPRAM_SIZE 0x800 - -#define DPRAM_STAT_VALID 0x80 -#define DPRAM_STAT_EMPTY 0x00 - -struct ptifddi { - struct dfddi_ram *dpram; - unsigned char *reset; - unsigned char *unreset; - struct net_device *dev; - struct ptifddi *next_module; -}; - -#endif /* !(_PTIFDDI_H) */ diff -urN linux-2.5.70-bk8/drivers/net/ptifddi_asm.h linux-2.5.70-bk9/drivers/net/ptifddi_asm.h --- linux-2.5.70-bk8/drivers/net/ptifddi_asm.h 2003-05-26 18:00:39.000000000 -0700 +++ linux-2.5.70-bk9/drivers/net/ptifddi_asm.h 1969-12-31 16:00:00.000000000 -0800 @@ -1,2543 +0,0 @@ -/* $Id: ptifddi_asm.h,v 1.3 1997/04/16 10:27:28 jj Exp $ */ -#ifndef _PTIFDDI_ASM_H -#define _PTIFDDI_ASM_H - -/* This is the code for the DPRAM firmware loader. */ -const unsigned short firmware_loader_code_addr = 0x140; /* Offset from dpram base. */ -const unsigned short firmware_loader_dev_addr = 0xf940; /* Offset as seen by device. */ -const unsigned short firmware_loader_size = 0x6f; /* Size of fware loader code.*/ - -static unsigned char firmware_loader[] __initdata = { - 0xb7, 0x01, 0xc0, 0xc4, 0x97, 0x14, 0xc0, 0xb7, 0xf9, 0x02, 0x12, 0x03, 0x30, - 0x2c, 0x8b, 0x0d, 0x30, 0x28, 0x8b, 0x0c, 0x30, 0x24, 0x8b, 0x11, 0x82, 0x00, - 0x11, 0xdc, 0x56, 0x30, 0x1b, 0x86, 0xff, 0xfc, 0x0c, 0xfc, 0x49, 0x86, 0xff, - 0xfd, 0x0c, 0xfc, 0x43, 0xad, 0x0c, 0x8b, 0xa9, 0x0c, 0x8a, 0x11, 0x75, 0x83, - 0x00, 0xf9, 0x00, 0xab, 0x95, 0x31, 0x03, 0x40, 0xb6, 0xf9, 0x00, 0xa8, 0x96, - 0xc8, 0x17, 0x41, 0x68, 0xad, 0x12, 0x88, 0xa9, 0x12, 0x86, 0xf9, 0x16, 0x12, - 0xfc, 0x47, 0x86, 0xf9, 0x16, 0x12, 0xfd, 0x41, 0x3c, 0x83, 0x00, 0xf9, 0x00, - 0xab, 0xb7, 0xf9, 0x02, 0x12, 0x3c, 0x83, 0x00, 0xf9, 0x00, 0xab, 0xb7, 0xf9, - 0x02, 0x12, 0x03, 0x95, 0x2f -}; - -/* This is test code which we run at boot time to go and verify the proper - * functioning of the PTI fddi card. - */ -const unsigned short test_firmware_code_addr = 0x100; /* Offset from dpram base. */ -const unsigned short test_firmware_dev_addr = 0xfa00; /* Offset as seen by device. */ -const unsigned short test_firmware_size = 0x414; /* Size of card test code. */ - -static unsigned char test_firmware[] __initdata = { - 0x97, 0x00, 0xd0, 0x90, 0x01, 0x8b, 0xd4, 0x8b, 0xf4, 0x97, 0x1f, 0xe2, 0x97, - 0x1f, 0xf2, 0x97, 0x14, 0xc0, 0xb7, 0x01, 0xc0, 0xc4, 0x00, 0x8b, 0x0b, 0x00, - 0x8b, 0x03, 0x8b, 0x0a, 0xab, 0x08, 0x90, 0x00, 0x8b, 0x04, 0x90, 0x40, 0x8b, - 0x05, 0x90, 0xff, 0x8b, 0x06, 0x90, 0xf7, 0x8b, 0x07, 0x90, 0x00, 0x8b, 0x0c, - 0x33, 0x8d, 0x82, 0x00, 0x0a, 0xdd, 0x94, 0x57, 0x89, 0x0c, 0x89, 0x0b, 0x33, - 0x81, 0x82, 0x00, 0x0a, 0xdd, 0x94, 0x4b, 0x89, 0x0c, 0x33, 0x77, 0x82, 0x00, - 0x0a, 0xdd, 0x94, 0x41, 0x91, 0x01, 0x30, 0xc4, 0x00, 0x30, 0xd2, 0x9c, 0x00, - 0x91, 0x02, 0x9d, 0x00, 0x91, 0x42, 0x30, 0xb7, 0xb6, 0x01, 0x04, 0x88, 0x96, - 0xc8, 0x10, 0x41, 0x4e, 0x90, 0x01, 0x30, 0xbb, 0x9c, 0x00, 0x91, 0x03, 0x9d, - 0x00, 0x91, 0x43, 0x30, 0xa0, 0x31, 0x97, 0x9c, 0x00, 0x91, 0x04, 0x9d, 0x00, - 0x91, 0x44, 0x30, 0x94, 0x32, 0x6b, 0x9c, 0x00, 0x91, 0x05, 0x9d, 0x00, 0x91, - 0x45, 0x30, 0x88, 0x60, 0x91, 0x41, 0x95, 0x41, 0xab, 0xce, 0xe1, 0x41, 0x3c, - 0x82, 0x02, 0x0c, 0xdc, 0x49, 0xa8, 0xce, 0x03, 0xf7, 0x07, 0xb8, 0x00, 0x01, - 0x72, 0xa8, 0xcc, 0x75, 0xab, 0xce, 0xc1, 0x41, 0x3c, 0x82, 0x02, 0x0c, 0xdc, - 0x4b, 0xa8, 0xce, 0x03, 0xf7, 0x96, 0xc9, 0x10, 0xb8, 0x00, 0x01, 0x74, 0xa8, - 0xcc, 0x77, 0xab, 0xce, 0xe0, 0x41, 0x3c, 0x96, 0xce, 0xfc, 0x42, 0x30, 0x46, - 0x82, 0x02, 0x0c, 0xdc, 0x4b, 0xae, 0xce, 0x03, 0xf7, 0x07, 0xb8, 0x00, 0x01, - 0xae, 0xce, 0x78, 0xac, 0xcc, 0xce, 0x7c, 0xab, 0xce, 0xc0, 0x41, 0x3c, 0xaf, - 0xc8, 0x96, 0xce, 0xfb, 0x99, 0xff, 0x9c, 0x00, 0x45, 0x3f, 0xc8, 0x30, 0x1b, - 0x42, 0x3f, 0xc8, 0x82, 0x02, 0x0c, 0xdc, 0x4e, 0xae, 0xce, 0x03, 0xf7, 0x96, - 0xc9, 0x10, 0xb8, 0x00, 0x01, 0xae, 0xce, 0x95, 0x25, 0xac, 0xcc, 0xce, 0x95, - 0x2a, 0x97, 0x01, 0x0a, 0x3c, 0x97, 0x01, 0x0a, 0x3c, 0x82, 0x05, 0xca, 0xfd, - 0x46, 0xa1, 0xca, 0xf8, 0x00, 0x8b, 0x3c, 0xa1, 0xca, 0xf8, 0x00, 0x8b, 0x60, - 0xb7, 0x20, 0x00, 0x10, 0x9d, 0x00, 0xb7, 0x28, 0x00, 0x10, 0xac, 0x10, 0xcc, - 0x97, 0x37, 0x12, 0x30, 0x64, 0xac, 0x10, 0xcc, 0x97, 0x37, 0x12, 0x30, 0x87, - 0x30, 0x0a, 0x82, 0x00, 0x0a, 0xdd, 0x42, 0x00, 0x3c, 0x90, 0x01, 0x3c, 0xac, - 0x10, 0xcc, 0x97, 0x00, 0x12, 0x97, 0x01, 0x03, 0x44, 0xeb, 0x58, 0x24, 0x3c, - 0xb7, 0xfb, 0x5b, 0x14, 0x91, 0x01, 0xad, 0x14, 0x88, 0x96, 0xca, 0xf9, 0xae, - 0xca, 0x03, 0xf7, 0xae, 0xca, 0x9d, 0x00, 0x30, 0x15, 0xa9, 0xcc, 0xa9, 0xcc, - 0x86, 0x01, 0x00, 0xca, 0xfc, 0x41, 0x7a, 0xa9, 0x14, 0x86, 0xfb, 0x5f, 0x14, - 0xfc, 0x3c, 0x95, 0x25, 0xc4, 0x88, 0x12, 0xc6, 0xc4, 0x96, 0x12, 0xdc, 0x3c, - 0x80, 0x12, 0xce, 0xab, 0xa9, 0xcc, 0x34, 0x87, 0xae, 0xcc, 0x05, 0xae, 0xcc, - 0x3c, 0xb7, 0xfb, 0x5b, 0x14, 0x91, 0x01, 0xad, 0x14, 0x88, 0x96, 0xca, 0xf9, - 0xae, 0xca, 0x03, 0xf7, 0xae, 0xca, 0x9d, 0x00, 0x30, 0x40, 0xa9, 0xcc, 0xa9, - 0xcc, 0x86, 0x01, 0x00, 0xca, 0xfc, 0x41, 0x7a, 0xa9, 0x14, 0x86, 0xfb, 0x5f, - 0x14, 0xfc, 0x3c, 0x95, 0x25, 0xb7, 0xfb, 0x5b, 0x14, 0x91, 0x01, 0xad, 0x14, - 0x88, 0x96, 0xca, 0xf9, 0xae, 0xca, 0x03, 0xf7, 0xae, 0xca, 0x9d, 0x00, 0x30, - 0x1c, 0xa9, 0xcc, 0xa9, 0xcc, 0x86, 0x01, 0x00, 0xca, 0xfc, 0x41, 0x7a, 0xa9, - 0x14, 0x86, 0xfb, 0x5f, 0x14, 0xfc, 0x3c, 0x95, 0x25, 0xc4, 0x88, 0x12, 0xc6, - 0x89, 0x12, 0x3c, 0xc4, 0x96, 0x12, 0xdc, 0x4d, 0x80, 0x12, 0xce, 0xab, 0xa9, - 0xcc, 0x34, 0xf7, 0xae, 0xcc, 0x05, 0xae, 0xcc, 0x89, 0x12, 0x3c, 0xb2, 0x10, - 0x00, 0x00, 0xc6, 0xb2, 0x10, 0x00, 0x97, 0x55, 0x12, 0x30, 0x61, 0xb2, 0x10, - 0x00, 0x97, 0x55, 0x12, 0x30, 0x84, 0x82, 0x00, 0x0a, 0xdd, 0x44, 0x30, 0x05, - 0x00, 0x3c, 0x90, 0x01, 0x3c, 0xb2, 0x10, 0x00, 0x97, 0x00, 0x12, 0x97, 0x01, - 0x03, 0x58, 0x02, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x5e, 0xef, - 0x01, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xb7, 0xfc, 0x3e, 0x14, 0x91, 0x01, 0xad, 0x14, 0x88, 0x96, 0xca, 0xf9, 0xae, - 0xca, 0x03, 0xf7, 0xae, 0xca, 0x9d, 0x00, 0x34, 0xe0, 0xa9, 0xcc, 0xa9, 0xcc, - 0x86, 0x01, 0x00, 0xca, 0xfc, 0x41, 0x7a, 0xa9, 0x14, 0x86, 0xfc, 0x56, 0x14, - 0xfc, 0x3c, 0x95, 0x25, 0xb7, 0xfc, 0x3e, 0x14, 0x91, 0x01, 0xad, 0x14, 0x88, - 0x96, 0xca, 0xf9, 0xae, 0xca, 0x03, 0xf7, 0xae, 0xca, 0x9d, 0x00, 0x30, 0x40, - 0xa9, 0xcc, 0xa9, 0xcc, 0x86, 0x01, 0x00, 0xca, 0xfc, 0x41, 0x7a, 0xa9, 0x14, - 0x86, 0xfc, 0x56, 0x14, 0xfc, 0x3c, 0x95, 0x25, 0xb7, 0xfc, 0x3e, 0x14, 0x91, - 0x01, 0xad, 0x14, 0x88, 0x96, 0xca, 0xf9, 0xae, 0xca, 0x03, 0xf7, 0xae, 0xca, - 0x9d, 0x00, 0x30, 0x1c, 0xa9, 0xcc, 0xa9, 0xcc, 0x86, 0x01, 0x00, 0xca, 0xfc, - 0x41, 0x7a, 0xa9, 0x14, 0x86, 0xfc, 0x56, 0x14, 0xfc, 0x3c, 0x95, 0x25, 0xc4, - 0x88, 0x12, 0xc6, 0x89, 0x12, 0x3c, 0xc4, 0x96, 0x12, 0xdc, 0x4d, 0x80, 0x12, - 0xce, 0xab, 0xa9, 0xcc, 0x35, 0xd7, 0xae, 0xcc, 0x05, 0xae, 0xcc, 0x89, 0x12, - 0x3c, 0xb2, 0x12, 0x00, 0x00, 0xc6, 0xb2, 0x12, 0x00, 0x97, 0x55, 0x12, 0x30, - 0x51, 0xb2, 0x12, 0x00, 0x97, 0x55, 0x12, 0x30, 0x74, 0x82, 0x00, 0x0a, 0xdd, - 0x48, 0x30, 0x09, 0x82, 0x00, 0x0a, 0xdc, 0x00, 0x3c, 0x90, 0x01, 0x3c, 0xb2, - 0x12, 0x00, 0x97, 0x00, 0x12, 0x97, 0x01, 0x03, 0x44, 0x02, 0xa8, 0x0f, 0x80, - 0xb7, 0xfd, 0x22, 0x14, 0x91, 0x01, 0xad, 0x14, 0x88, 0x96, 0xca, 0xf9, 0xae, - 0xca, 0x03, 0xf7, 0xae, 0xca, 0x9d, 0x00, 0x35, 0xb0, 0xa9, 0xcc, 0xa9, 0xcc, - 0x86, 0x01, 0x00, 0xca, 0xfc, 0x41, 0x7a, 0xa9, 0x14, 0x86, 0xfd, 0x26, 0x14, - 0xfc, 0x3c, 0x95, 0x25, 0xb7, 0xfd, 0x22, 0x14, 0x91, 0x01, 0xad, 0x14, 0x88, - 0x96, 0xca, 0xf9, 0xae, 0xca, 0x03, 0xf7, 0xae, 0xca, 0x9d, 0x00, 0x30, 0x40, - 0xa9, 0xcc, 0xa9, 0xcc, 0x86, 0x01, 0x00, 0xca, 0xfc, 0x41, 0x7a, 0xa9, 0x14, - 0x86, 0xfd, 0x26, 0x14, 0xfc, 0x3c, 0x95, 0x25, 0xb7, 0xfd, 0x22, 0x14, 0x91, - 0x01, 0xad, 0x14, 0x88, 0x96, 0xca, 0xf9, 0xae, 0xca, 0x03, 0xf7, 0xae, 0xca, - 0x9d, 0x00, 0x30, 0x1c, 0xa9, 0xcc, 0xa9, 0xcc, 0x86, 0x01, 0x00, 0xca, 0xfc, - 0x41, 0x7a, 0xa9, 0x14, 0x86, 0xfd, 0x26, 0x14, 0xfc, 0x3c, 0x95, 0x25, 0xc4, - 0x88, 0x12, 0xc6, 0x89, 0x12, 0x3c, 0xc4, 0x96, 0x12, 0xdc, 0x4d, 0x80, 0x12, - 0xce, 0xab, 0xa9, 0xcc, 0x36, 0xa7, 0xae, 0xcc, 0x05, 0xae, 0xcc, 0x89, 0x12, - 0x3c, 0xac, 0x04, 0xcc, 0xac, 0x06, 0xca, 0xb0, 0xff, 0x7f, 0x82, 0x00, 0x0c, - 0xdc, 0xb0, 0x04, 0x01, 0x82, 0x02, 0x0c, 0xdc, 0x90, 0x05, 0x82, 0x00, 0x0b, - 0xdc, 0x37, 0x30, 0x82, 0x00, 0x0b, 0xdd, 0x37, 0x4c, 0x00, 0xaa, 0xc8, 0x62, - 0xaa, 0xc8, 0x62, 0xaa, 0xc8, 0x62, 0xac, 0x04, 0xcc, 0xac, 0x06, 0xca, 0xb0, - 0xff, 0x7f, 0x82, 0x00, 0x0c, 0xdc, 0xb0, 0x04, 0x01, 0x82, 0x02, 0x0c, 0xdc, - 0x90, 0x05, 0x82, 0x00, 0x0b, 0xdc, 0x37, 0x25, 0x82, 0x00, 0x0b, 0xdd, 0x37, - 0x4a,0x3c -}; - -/* This is the main firmware which implements the FDDI PHY transactions and talks - * to the MAC chipsets. - */ -const unsigned short main_firmware_dev_addr = 0xf000; /* Offset as seen by device. */ -const unsigned short main_firmware_size = 0x1000; /* Size of main firmware. */ - -static unsigned char main_firmware[] __initdata = { - 0x00, 0xaa, 0xc8, 0x62, 0xab, 0x00, 0xab, 0xbe, 0x8b, 0xba, 0x97, 0x3c, 0xd0, - 0x90, 0x01, 0x8b, 0xd4, 0x8b, 0xf4, 0xb7, 0x02, 0x03, 0xe2, 0xb7, 0x02, 0x03, - 0xf2, 0x97, 0x14, 0xc0, 0xb2, 0x20, 0x3c, 0xb3, 0x01, 0x52, 0x00, 0xf3, 0xa7, - 0x01, 0x92, 0x01, 0x82, 0x90, 0x0c, 0xe3, 0xb0, 0xcc, 0xcc, 0xf6, 0xe6, 0xb6, - 0x01, 0x5c, 0x08, 0xf1, 0xb0, 0x88, 0xcc, 0xe3, 0xb0, 0x21, 0x52, 0xe3, 0x00, - 0x05, 0xe3, 0x63, 0x8f, 0x08, 0x8d, 0x00, 0x07, 0xe4, 0x04, 0xe6, 0xb3, 0xff, - 0x80, 0xf1, 0x00, 0xaa, 0xca, 0x64, 0xb7, 0x3e, 0x80, 0xb6, 0x91, 0x16, 0xf1, - 0xa8, 0xb6, 0x82, 0x80, 0xb7, 0xdb, 0xaa, 0xca, 0x69, 0xb0, 0x3f, 0xff, 0xf1, - 0xf0, 0xb2, 0x20, 0x3c, 0xb7, 0x01, 0xc0, 0xc4, 0xb6, 0xff, 0xfe, 0xa8, 0x27, - 0x90, 0xf7, 0x92, 0xba, 0x17, 0x20, 0x1f, 0x00, 0x8b, 0xd2, 0xab, 0xaa, 0x05, - 0xf3, 0x9c, 0x00, 0x55, 0xb6, 0x01, 0x04, 0x10, 0x9a, 0x04, 0xab, 0xbe, 0x83, - 0x01, 0xff, 0x16, 0xab, 0x96, 0xc8, 0x12, 0x83, 0x02, 0xff, 0x16, 0xab, 0x90, - 0x01, 0xb6, 0x01, 0x04, 0x11, 0x04, 0xb6, 0xff, 0x02, 0xab, 0x92, 0xce, 0xb3, - 0x20, 0x30, 0x30, 0x26, 0xb3, 0x28, 0x30, 0x96, 0xbe, 0x12, 0x30, 0x1e, 0xb2, - 0x20, 0x2e, 0x30, 0x06, 0xb6, 0xff, 0x00, 0x89, 0x94, 0x2b, 0x00, 0xc6, 0xc4, - 0x99, 0x01, 0x9d, 0x00, 0x4a, 0x90, 0x40, 0xc6, 0xa8, 0xe2, 0xb9, 0xfd, 0xff, - 0xab, 0xe2, 0x3c, 0xd4, 0x9d, 0x11, 0x3c, 0xc7, 0x0e, 0x90, 0x01, 0x06, 0xd6, - 0x0b, 0x09, 0x8f, 0x0e, 0x3c, 0xb6, 0xff, 0x8e, 0xae, 0xb6, 0xff, 0x8c, 0xab, - 0x0e, 0x96, 0xd0, 0x18, 0xb6, 0x01, 0x20, 0x11, 0x26, 0x92, 0xaa, 0x18, 0x13, - 0x25, 0xb6, 0xff, 0x8e, 0xa8, 0xda, 0x8b, 0xab, 0xdb, 0xe7, 0xe7, 0xb8, 0xff, - 0x90, 0xab, 0xb4, 0xab, 0xce, 0xf0, 0xab, 0xac, 0x8f, 0xfb, 0x05, 0xbd, 0x7f, - 0xfe, 0x94, 0x40, 0xa8, 0xac, 0xbd, 0x3f, 0xff, 0xb4, 0x01, 0x8a, 0x04, 0xab, - 0xb2, 0x05, 0xe7, 0xe7, 0xab, 0xce, 0xf0, 0xab, 0xae, 0xf4, 0xab, 0xb0, 0xb3, - 0xff, 0x82, 0xf0, 0xe7, 0x07, 0x28, 0x92, 0xba, 0x16, 0x24, 0x92, 0xaa, 0xa8, - 0xb0, 0xbd, 0x7f, 0xff, 0xb4, 0x01, 0x9d, 0xbd, 0x07, 0xff, 0xb4, 0x01, 0xf0, - 0x9d, 0x08, 0xb4, 0x02, 0xbf, 0xb4, 0x01, 0x06, 0xa8, 0xb2, 0xad, 0xb4, 0xab, - 0x92, 0xaa, 0x90, 0x08, 0xdd, 0x96, 0xd0, 0x08, 0x95, 0x6f, 0x90, 0x08, 0x2d, - 0x97, 0xfb, 0xd2, 0xb3, 0x10, 0x5e, 0xb2, 0x12, 0x0a, 0x00, 0xd5, 0x8b, 0xb6, - 0x00, 0xc5, 0x96, 0xbe, 0x10, 0x5a, 0x8b, 0xb7, 0xb3, 0x18, 0x5e, 0xb2, 0x1a, - 0x0a, 0x00, 0xd5, 0x8b, 0xb8, 0x00, 0xc5, 0xc5, 0x88, 0xb8, 0xd5, 0xb2, 0x12, - 0x0a, 0xb3, 0x10, 0x5e, 0x88, 0xb7, 0xc5, 0x88, 0xb6, 0xd5, 0x92, 0xaa, 0x57, - 0x90, 0x06, 0x2d, 0xb3, 0x20, 0x06, 0x00, 0xd5, 0xd5, 0x4d, 0x90, 0x07, 0x2d, - 0xb3, 0x28, 0x06, 0x6a, 0x90, 0x05, 0x42, 0x90, 0x09, 0x2d, 0x1e, 0xa5, 0xff, - 0x8c, 0xff, 0x8e, 0xab, 0x3c, 0xab, 0xca, 0xb9, 0x07, 0xff, 0xbd, 0x03, 0xff, - 0x41, 0x5a, 0x92, 0xcb, 0x97, 0x7c, 0xc9, 0xe7, 0x11, 0x43, 0x10, 0x46, 0x3c, - 0x10, 0x47, 0xad, 0xc8, 0xa9, 0xad, 0xc8, 0xa8, 0x50, 0xab, 0xcc, 0xe4, 0x05, - 0xe6, 0x04, 0x49, 0x1e, 0x17, 0x42, 0x94, 0x59, 0x1f, 0x16, 0x67, 0x57, 0x92, - 0xc9, 0xbd, 0x03, 0xff, 0x6d, 0xbd, 0x02, 0xdf, 0x94, 0x29, 0xe7, 0x12, 0x51, - 0x11, 0x48, 0xe7, 0x11, 0x0b, 0x10, 0x0c, 0x0e, 0xc7, 0x53, 0xbd, 0x03, 0xbe, - 0x53, 0xb8, 0xfa, 0x00, 0xb8, 0x14, 0x00, 0x10, 0x41, 0x46, 0x96, 0xc8, 0x17, - 0xb8, 0x00, 0x80, 0x96, 0xaa, 0x08, 0x3c, 0xc7, 0xb8, 0x2e, 0x40, 0x68, 0x10, - 0x55, 0x96, 0xc8, 0x14, 0x4d, 0xbd, 0x02, 0xe0, 0xb0, 0x34, 0x00, 0xbc, 0x02, - 0xe0, 0xb0, 0x30, 0x00, 0x7b, 0xb8, 0xfd, 0xc9, 0x4a, 0x96, 0xc8, 0x17, 0x43, - 0x99, 0x7f, 0x6b, 0xb8, 0x1c, 0x80, 0xe7, 0x3c, 0xa8, 0xae, 0x96, 0xc9, 0x17, - 0x41, 0x3c, 0x2b, 0xab, 0xcc, 0xc4, 0x96, 0xaa, 0x10, 0x41, 0xe4, 0xae, 0xca, - 0x88, 0xc9, 0xe7, 0x3b, 0x99, 0x0f, 0x96, 0xca, 0xf8, 0x3c, 0xcc, 0x09, 0x1c, - 0x0d, 0x16, 0x38, 0x37, 0x4d, 0x63, 0x6e, 0xa1, 0xae, 0xff, 0xbe, 0xab, 0x2f, - 0x17, 0x4a, 0x0f, 0xa5, 0xff, 0x8e, 0xff, 0x8a, 0xab, 0x44, 0x17, 0x41, 0x5d, - 0x1f, 0x2a, 0xab, 0xcc, 0x99, 0x0f, 0x9d, 0x0b, 0x4a, 0x9c, 0x0b, 0xb6, 0xff, - 0x8a, 0xa8, 0xb6, 0xff, 0x8e, 0xab, 0xa8, 0xcc, 0x82, 0x02, 0xb0, 0xdc, 0xb6, - 0xff, 0xfc, 0xab, 0xb4, 0xfe, 0xbd, 0x2a, 0xae, 0xb2, 0x92, 0xaa, 0x15, 0x96, - 0xc9, 0x0e, 0x96, 0xb0, 0x10, 0x0d, 0xaf, 0xc8, 0x96, 0xb3, 0x16, 0x41, 0x76, - 0xa8, 0xb2, 0x2c, 0x3f, 0xc8, 0x92, 0xc9, 0x17, 0x4c, 0x16, 0x43, 0x96, 0xaa, - 0x1d, 0x1e, 0xab, 0xb2, 0x95, 0x28, 0xe7, 0xe7, 0x92, 0xaa, 0xaf, 0xc8, 0x3c, - 0x2a, 0x92, 0xc9, 0x1f, 0x16, 0x0f, 0xa0, 0xc8, 0xb2, 0xf8, 0x95, 0x3b, 0x88, - 0xaf, 0x97, 0x7c, 0xc9, 0xe7, 0xad, 0xc8, 0xaa, 0xad, 0xc8, 0xa8, 0x9c, 0x00, - 0x95, 0x4b, 0x94, 0x4a, 0x96, 0xb1, 0x16, 0x08, 0x2b, 0x92, 0xaa, 0xab, 0xce, - 0x10, 0x41, 0xf4, 0xd4, 0x93, 0xb6, 0xf6, 0x88, 0xaf, 0x96, 0xb1, 0x16, 0x4a, - 0x97, 0x7c, 0xc9, 0xe7, 0xad, 0xc8, 0xa8, 0x10, 0x99, 0xff, 0x8d, 0xb8, 0x00, - 0xe6, 0x88, 0xb1, 0x3b, 0x99, 0x03, 0xcc, 0x04, 0x07, 0x0a, 0x0d, 0xf4, 0xfc, - 0x4e, 0x50, 0xf4, 0xfd, 0x4a, 0x4c, 0xf4, 0xfd, 0x46, 0x6a, 0xf4, 0xf9, 0x9d, - 0x00, 0x43, 0x96, 0xca, 0x0b, 0x88, 0xb1, 0x96, 0xca, 0xf9, 0x9c, 0x00, 0x4c, - 0x88, 0xae, 0x96, 0xc8, 0x17, 0xba, 0xff, 0x00, 0xa0, 0xc8, 0xb2, 0xf8, 0xb4, - 0xfe, 0x18, 0x2b, 0xab, 0xce, 0xab, 0xb6, 0x88, 0xb1, 0x9d, 0x77, 0x46, 0x92, - 0xb8, 0xac, 0xae, 0xb8, 0x4f, 0x96, 0xaf, 0x17, 0x76, 0xa8, 0xae, 0xbd, 0x77, - 0xff, 0x6f, 0x2b, 0xab, 0xcc, 0x88, 0xaf, 0xe7, 0x3b, 0x99, 0x0f, 0x96, 0xaa, - 0x10, 0x96, 0xc8, 0x0c, 0x02, 0xcc, 0x4f, 0x1f, 0x20, 0x22, 0x24, 0x28, 0x2a, - 0x2d, 0x2f, 0x31, 0x33, 0x36, 0x3a, 0x3c, 0x3e, 0x40, 0x77, 0x47, 0x48, 0x4a, - 0x4c, 0x4e, 0x50, 0x53, 0x55, 0x59, 0x5b, 0x5e, 0x62, 0x64, 0x66, 0x68, 0xe4, - 0x4d, 0xf4, 0xe5, 0x4a, 0xf4, 0xf8, 0x47, 0xf4, 0xf8, 0x00, 0xf7, 0x42, 0xf4, - 0xeb, 0x58, 0xe4, 0x8f, 0xeb, 0x54, 0xf4, 0xfe, 0x5b, 0xf4, 0xfe, 0x49, 0xf4, - 0xff, 0x55, 0xe4, 0x8f, 0xff, 0x51, 0xf4, 0xff, 0xa8, 0xce, 0x4c, 0xf4, 0xf9, - 0x4c, 0xf4, 0xfa, 0x49, 0xf4, 0xfb, 0x46, 0xf4, 0x23, 0x43, 0xac, 0xb6, 0xce, - 0xf6, 0x94, 0x36, 0xc4, 0x4b, 0xd4, 0xc5, 0x48, 0xd4, 0xd8, 0x45, 0xd4, 0xd8, - 0x4c, 0xd4, 0xcb, 0x5a, 0xc4, 0x8f, 0xcb, 0x56, 0xd4, 0xde, 0x5d, 0xd4, 0xde, - 0x88, 0xc9, 0x58, 0xd4, 0xdf, 0x55, 0xc4, 0x8f, 0xdf, 0x51, 0xd4, 0xdf, 0xa8, - 0xce, 0x4c, 0xd4, 0xd9, 0x4c, 0xd4, 0xda, 0x49, 0xd4, 0xdb, 0x46, 0xd4, 0x23, - 0x43, 0xac, 0xb6, 0xce, 0xd6, 0xb4, 0xfd, 0x5c, 0xae, 0xca, 0xc4, 0x99, 0x0f, - 0xae, 0xca, 0x82, 0x00, 0xca, 0xfc, 0x3c, 0x14, 0x45, 0xe7, 0xaa, 0xca, 0x63, - 0x3c, 0xc7, 0xaa, 0xca, 0x63, 0x3c, 0xbd, 0x03, 0xff, 0x5e, 0x92, 0xc9, 0xb3, - 0x12, 0x10, 0x10, 0xb3, 0x1a, 0x10, 0x96, 0xc8, 0x17, 0x94, 0x72, 0xa8, 0xae, - 0x17, 0x4c, 0x16, 0x94, 0x5e, 0x15, 0x94, 0x3f, 0x9c, 0x80, 0x94, 0x1f, 0x9d, - 0x00, 0xb4, 0xfd, 0x1f, 0xa8, 0xce, 0xb8, 0xff, 0x2e, 0xab, 0xcc, 0x9a, 0x28, - 0xab, 0xca, 0xb8, 0xfe, 0xf2, 0xab, 0xce, 0x00, 0xe1, 0x62, 0x00, 0xd6, 0x97, - 0x38, 0xce, 0xd6, 0x7c, 0xa8, 0xce, 0xb8, 0xfe, 0x80, 0xab, 0xcc, 0x9a, 0x0c, - 0xab, 0xca, 0x22, 0x97, 0xb0, 0xcc, 0x97, 0xfe, 0xca, 0x22, 0x74, 0x00, 0x96, - 0xcc, 0x14, 0x05, 0xe1, 0x66, 0x3c, 0x04, 0x97, 0x7c, 0xc9, 0xe7, 0xab, 0xcc, - 0x91, 0x04, 0xe2, 0xab, 0xb8, 0xe4, 0xab, 0xb6, 0x97, 0x04, 0xce, 0x00, 0xf1, - 0x92, 0xb9, 0xc2, 0xd6, 0xaa, 0xca, 0x64, 0x4b, 0xac, 0xce, 0xcc, 0x97, 0x04, - 0xce, 0x99, 0x1f, 0xd6, 0x18, 0x10, 0x5c, 0x62, 0x3b, 0x99, 0xf0, 0x8b, 0xb6, - 0x2a, 0x96, 0xc9, 0x10, 0x96, 0xb6, 0x08, 0xac, 0xce, 0xcc, 0x97, 0x1a, 0xce, - 0x11, 0x41, 0x62, 0xd6, 0xf3, 0x88, 0xb6, 0xd6, 0x19, 0xb4, 0xfc, 0xa2, 0x8d, - 0xab, 0xb2, 0xc0, 0x3b, 0x3c, 0xe7, 0x07, 0x45, 0x82, 0x06, 0xb0, 0xfd, 0x3c, - 0xe7, 0xf4, 0x07, 0x2c, 0xb6, 0xff, 0x86, 0xa8, 0xb9, 0x03, 0xff, 0xe7, 0xe7, - 0xe7, 0xba, 0x60, 0x00, 0xab, 0xce, 0x29, 0x3b, 0x3b, 0x97, 0x80, 0xc8, 0xf1, - 0xe0, 0x62, 0xb6, 0xff, 0x86, 0xa9, 0x3c, 0x20, 0x21, 0x27, 0x9c, 0xf6, 0x65, - 0x92, 0xba, 0x9d, 0xef, 0x4f, 0x93, 0xbd, 0x9d, 0x2f, 0x9d, 0x3f, 0x42, 0x9a, - 0xf0, 0xd3, 0x20, 0x21, 0xd5, 0x94, 0x69, 0xac, 0xbc, 0xce, 0x99, 0x0f, 0xcc, - 0x44, 0x2a, 0x38, 0x33, 0x2e, 0x1c, 0x3e, 0x09, 0x12, 0x0f, 0x10, 0x0d, 0x30, - 0x37, 0x36, 0x35, 0x0f, 0x1c, 0xa1, 0xce, 0xff, 0xbe, 0xab, 0x2f, 0x0d, 0x41, - 0x1d, 0x0e, 0x96, 0xc8, 0x11, 0x41, 0x3c, 0x90, 0xf0, 0x96, 0xaa, 0x14, 0x4a, - 0x96, 0xaa, 0x0b, 0x3c, 0x90, 0xf1, 0x20, 0x21, 0x8e, 0xbb, 0x55, 0x88, 0xbb, - 0xd5, 0x51, 0x88, 0xbb, 0xd6, 0x4d, 0xd4, 0x4b, 0x1e, 0x14, 0x3f, 0xc8, 0x1c, - 0x90, 0xfc, 0x43, 0x29, 0x92, 0xba, 0x5b, 0x1b, 0x0c, 0x90, 0x0a, 0xb6, 0xff, - 0x8e, 0xae, 0xb6, 0xff, 0x88, 0xab, 0xa1, 0xbc, 0xff, 0xb8, 0xab, 0x2e, 0x1c, - 0xa5, 0xff, 0x88, 0xff, 0x8e, 0xab, 0x90, 0xf5, 0xb6, 0x01, 0x20, 0x10, 0x41, - 0x65, 0xb6, 0x01, 0x26, 0x8b, 0x3c, 0xb6, 0x01, 0x20, 0x11, 0x41, 0x65, 0xb6, - 0x01, 0x24, 0x88, 0x3c, 0x15, 0x45, 0x82, 0x06, 0xb0, 0xfd, 0x3c, 0x0c, 0x90, - 0x80, 0x20, 0x21, 0x9c, 0xff, 0x42, 0x26, 0x69, 0x1c, 0x29, 0x20, 0x21, 0xc0, - 0x63, 0x3c, 0x40, 0x40, 0x40, 0x40, 0x3c, 0x40, 0x40, 0x40, 0x40, 0x3c, 0x3c, - 0x3c, 0x91, 0x00, 0xb6, 0x12, 0x08, 0x88, 0x96, 0xc8, 0x13, 0x30, 0x55, 0x96, - 0xc8, 0x14, 0x30, 0x41, 0x96, 0xc8, 0x16, 0x94, 0x2b, 0x96, 0xc8, 0x17, 0x5c, - 0xa8, 0xca, 0x96, 0xc8, 0x13, 0x30, 0x2b, 0x00, 0xb6, 0x12, 0x08, 0x8b, 0xb6, - 0x10, 0x5c, 0x88, 0x96, 0xc8, 0x10, 0x30, 0x5d, 0x82, 0x00, 0xca, 0xfc, 0x3c, - 0x94, 0x77, 0x00, 0xb6, 0x12, 0x0e, 0x8b, 0x82, 0x08, 0xca, 0xfa, 0x95, 0x25, - 0x00, 0xb6, 0x12, 0x16, 0x8b, 0x82, 0x08, 0xca, 0xfa, 0x95, 0x30, 0x00, 0xb6, - 0x12, 0x0a, 0x8b, 0x3c, 0xae, 0xce, 0xb6, 0x12, 0x1c, 0x88, 0x99, 0x55, 0xb6, - 0x12, 0x1c, 0x8b, 0xae, 0xce, 0x3c, 0xae, 0xce, 0xb6, 0x12, 0x28, 0x88, 0x96, - 0xc8, 0x10, 0x54, 0x96, 0xc8, 0x14, 0x50, 0x96, 0xc8, 0x12, 0x4c, 0x83, 0x00, - 0x12, 0x2a, 0x8b, 0x82, 0x08, 0xca, 0xfa, 0xae, 0xce, 0x3c, 0x99, 0xea, 0xb6, - 0x12, 0x28, 0x8b, 0x82, 0x02, 0xca, 0xfa, 0xae, 0xce, 0x3c, 0xb6, 0x10, 0x1c, - 0x88, 0xb6, 0xff, 0x0a, 0x8b, 0xb6, 0x10, 0x20, 0x88, 0x99, 0xfc, 0xb6, 0x10, - 0x20, 0x8b, 0xb6, 0x10, 0x5c, 0x88, 0x99, 0xfe, 0xb6, 0x10, 0x5c, 0x8b, 0x82, - 0x04, 0xca, 0xfa, 0x3c, 0xb3, 0xff, 0x50, 0xa2, 0x01, 0xce, 0x88, 0x9d, 0x00, - 0x66, 0x90, 0x01, 0xd6, 0xa2, 0x01, 0xce, 0x88, 0x9d, 0x00, 0x5b, 0xb6, 0xff, - 0x52, 0xa8, 0x96, 0xca, 0xfa, 0xb6, 0xff, 0x52, 0xab, 0xb6, 0xff, 0xfc, 0xa8, - 0x83, 0x00, 0xff, 0x56, 0xfd, 0xb6, 0xff, 0xfc, 0xab, 0x00, 0xd6, 0x3c, 0x00, - 0xd6, 0x95, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, 0xfe, - 0x93, 0x40, 0xb4, 0xfe, 0x8e, 0x40, 0xb4, 0xfe, 0x8c, 0x40, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, 0xf9, 0x01, - 0x12, 0x30, 0x1f, 0x8b, 0x11, 0x30, 0x1b, 0x8b, 0x0d, 0x30, 0x17, 0x8b, 0x0c, - 0x82, 0x00, 0x11, 0xdc, 0x4a, 0x30, 0x0e, 0xad, 0x0c, 0x8b, 0xa9, 0x0c, 0x8a, - 0x11, 0x69, 0x83, 0x00, 0xf9, 0x00, 0xab, 0x3c, 0xb6, 0xf9, 0x00, 0xa8, 0x96, - 0xc8, 0x17, 0x41, 0x68, 0xad, 0x12, 0x88, 0xa9, 0x12, 0x3c, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, 0xf5, 0x68, 0xf5, 0x5c, 0xf4, 0xf1, 0xf3, - 0x73, 0xf5, 0x42, 0xf5, 0xdc, 0xf4, 0x6e, 0xf5, 0xb1, 0xf4, 0xab, 0xf4, 0x37, - 0xf2, 0xb2, 0xf1, 0xb7, 0xf2, 0xe2, 0xf0, 0xeb, 0xf0, 0x0a, 0xf0, 0x0a, 0xf0, - 0xa7, 0xf1, 0xa4, 0xf1, 0x9d, 0xf1, 0x93, 0xf1, 0x5c, 0xf1, 0x00, 0x00, 0x00, - 0xf0 -}; - -/* This is the FDDI station management firmware. */ -const unsigned short smt_firmware_dev_addr = 0x4000; /* Offset as seen by device. */ -const unsigned short smt_firmware_size = 0x72b0; /* Size of SMT firmware. */ - -static unsigned char smt_firmware[] __initdata = { - 0x94, 0xaa, 0x00, 0x00, 0x94, 0x5d, 0x00, 0x00, 0x5d, 0x00, 0x00, 0x00, 0x94, 0x2c, - 0x00, 0x00, 0xb4, 0x5d, 0xfa, 0x00, 0x94, 0xc4, 0x00, 0x00, 0x94, 0xc8, 0x00, 0x00, - 0x94, 0xcc, 0x00, 0x00, 0xb4, 0x01, 0xbc, 0x00, 0x00, 0x00, 0xb2, 0xfe, 0x20, 0xc4, - 0x96, 0xc8, 0x17, 0x41, 0x3c, 0xb5, 0x56, 0xa7, 0xb2, 0xfe, 0x20, 0x00, 0xe6, 0xb4, - 0x04, 0x1a, 0x83, 0x00, 0xfe, 0x94, 0xab, 0xb2, 0xfe, 0x20, 0xe4, 0x96, 0xc8, 0x17, - 0x41, 0x45, 0x99, 0x3f, 0x9c, 0x03, 0x46, 0x83, 0x00, 0xfe, 0x20, 0xab, 0x3c, 0x82, - 0x02, 0xcc, 0xf8, 0xb3, 0xfe, 0x90, 0xb5, 0x3b, 0x12, 0x83, 0xe0, 0xfe, 0x94, 0xab, - 0x75, 0xac, 0x74, 0xce, 0x92, 0x00, 0xb5, 0x35, 0xdf, 0x92, 0x0e, 0xb6, 0x10, 0x00, - 0x88, 0x99, 0xfe, 0xb6, 0x10, 0x00, 0x8b, 0xb5, 0x35, 0xc3, 0x90, 0x01, 0xb5, 0x35, - 0xd8, 0xb5, 0x35, 0x1e, 0xb6, 0x10, 0x00, 0x88, 0x9a, 0x01, 0xb6, 0x10, 0x00, 0x8b, - 0x89, 0x7d, 0xac, 0x6e, 0x02, 0xac, 0x70, 0x04, 0xb7, 0x04, 0x00, 0x06, 0xac, 0x74, - 0xcc, 0x82, 0x34, 0xcc, 0xf8, 0x00, 0xb5, 0x2c, 0xf0, 0x90, 0x01, 0xb5, 0x34, 0x80, - 0xb5, 0x34, 0xf5, 0x3c, 0xa7, 0xb8, 0x00, 0xda, 0xda, 0x00, 0xe1, 0x62, 0x8d, 0x02, - 0x80, 0x00, 0xe1, 0x62, 0xa8, 0xbe, 0x99, 0x0c, 0xc7, 0xc7, 0x04, 0x8b, 0x7e, 0xb7, - 0xb8, 0x0c, 0x72, 0xb7, 0xb8, 0x44, 0x74, 0xb7, 0xb8, 0xa4, 0x76, 0xb7, 0xba, 0x8a, - 0x78, 0xb5, 0x02, 0xf4, 0xb4, 0x03, 0x1b, 0x3c, 0xb5, 0x2e, 0xf4, 0xb4, 0x03, 0x74, - 0x40, 0x40, 0xb7, 0x00, 0x00, 0x08, 0xb2, 0x20, 0x00, 0x4c, 0x82, 0x01, 0x7e, 0xdc, - 0x3c, 0xb7, 0x00, 0x01, 0x08, 0xb2, 0x28, 0x00, 0xa2, 0x04, 0xcc, 0x88, 0xa2, 0x06, - 0xcc, 0xd9, 0x8b, 0x0a, 0x99, 0x60, 0x9c, 0x00, 0x94, 0x56, 0xa8, 0x08, 0xb5, 0x33, - 0x33, 0xab, 0xca, 0x99, 0x20, 0x9c, 0x00, 0x57, 0xb7, 0x02, 0x0a, 0x02, 0xac, 0xca, - 0x04, 0xb7, 0x00, 0x00, 0x06, 0xa8, 0x08, 0xb5, 0x04, 0x98, 0x90, 0x20, 0x01, 0xa0, - 0xc8, 0xca, 0xf9, 0xa8, 0xca, 0x99, 0x02, 0x9c, 0x00, 0x57, 0xa8, 0x08, 0xb5, 0x02, - 0xed, 0xa2, 0x4e, 0x76, 0xa8, 0x9c, 0x03, 0x4b, 0xaf, 0xca, 0xa8, 0x08, 0x91, 0x02, - 0xb5, 0x33, 0x86, 0x3f, 0xca, 0x82, 0x00, 0xca, 0xfc, 0x50, 0xb7, 0x02, 0x09, 0x02, - 0xac, 0xca, 0x04, 0xb7, 0x00, 0x00, 0x06, 0xa8, 0x08, 0xb5, 0x04, 0x5e, 0x88, 0x0a, - 0x99, 0x10, 0x9c, 0x00, 0x55, 0xa8, 0x08, 0x32, 0x11, 0xb7, 0x05, 0x05, 0x02, 0xb7, - 0x00, 0x00, 0x04, 0xb7, 0x00, 0x00, 0x06, 0xa8, 0x08, 0xb5, 0x04, 0x42, 0x90, 0x80, - 0xa2, 0x04, 0xcc, 0x8e, 0xb4, 0x02, 0xd3, 0x00, 0xb6, 0xff, 0x44, 0xa9, 0xb6, 0x12, - 0x0e, 0x8b, 0x82, 0x08, 0xca, 0xfa, 0x94, 0x6d, 0x00, 0xb6, 0xff, 0x42, 0xa9, 0xb6, - 0x12, 0x16, 0x8b, 0x82, 0x08, 0xca, 0xfa, 0x94, 0x5e, 0x00, 0xb6, 0x12, 0x0a, 0x8b, - 0x3c, 0xae, 0xce, 0xb6, 0x12, 0x1c, 0x88, 0x99, 0x55, 0xb6, 0x12, 0x1c, 0x8b, 0xae, - 0xce, 0x3c, 0xae, 0xce, 0xb6, 0x12, 0x28, 0x88, 0x96, 0xc8, 0x10, 0x54, 0x96, 0xc8, - 0x14, 0x50, 0x96, 0xc8, 0x12, 0x4c, 0x83, 0x00, 0x12, 0x2a, 0x8b, 0x82, 0x08, 0xca, - 0xfa, 0xae, 0xce, 0x3c, 0x99, 0xea, 0xb6, 0x12, 0x28, 0x8b, 0x82, 0x02, 0xca, 0xfa, - 0xae, 0xce, 0x3c, 0xb7, 0x00, 0x00, 0x0c, 0x91, 0x00, 0xb6, 0x12, 0x08, 0x88, 0x96, - 0xc8, 0x13, 0x34, 0x38, 0x96, 0xc8, 0x14, 0x34, 0x4c, 0x96, 0xc8, 0x16, 0x95, 0x66, - 0x96, 0xc8, 0x17, 0x95, 0x7a, 0xa8, 0xca, 0x96, 0xc8, 0x13, 0x34, 0x63, 0x00, 0xb6, - 0x12, 0x08, 0x8b, 0xac, 0xca, 0x0c, 0x97, 0x00, 0x09, 0xb6, 0x10, 0x5c, 0x88, 0xb6, - 0x10, 0x5e, 0xd9, 0x8b, 0x0a, 0x99, 0x01, 0x9c, 0x00, 0x94, 0x7f, 0xb6, 0x10, 0x24, - 0x88, 0x99, 0x23, 0x9c, 0x00, 0x94, 0x3f, 0xab, 0xca, 0x99, 0x20, 0x9c, 0x00, 0x46, - 0x97, 0x01, 0x09, 0x97, 0x20, 0x08, 0xa8, 0xca, 0x99, 0x02, 0x9c, 0x00, 0x47, 0x82, - 0x02, 0x09, 0xda, 0x97, 0x02, 0x08, 0xa8, 0xca, 0x99, 0x01, 0x9c, 0x00, 0x48, 0x82, - 0x04, 0x09, 0xda, 0x82, 0x01, 0x08, 0xda, 0xa8, 0xca, 0x01, 0xab, 0xca, 0xb6, 0x10, - 0x26, 0x88, 0x96, 0xca, 0xf9, 0xb6, 0x10, 0x26, 0x8b, 0x00, 0xb6, 0x10, 0x24, 0x8b, - 0xb6, 0x10, 0x20, 0x88, 0x99, 0x03, 0x9c, 0x00, 0x94, 0x2c, 0xb6, 0x10, 0x1c, 0x88, - 0x99, 0x80, 0x9c, 0x00, 0x48, 0x90, 0x40, 0xb5, 0x5b, 0x18, 0x90, 0x80, 0x41, 0x00, - 0xb6, 0xff, 0x0a, 0x8b, 0x82, 0x04, 0x0c, 0xfa, 0xb7, 0x04, 0x03, 0x02, 0xab, 0x04, - 0xb7, 0x00, 0x00, 0x06, 0x00, 0xb6, 0x10, 0x20, 0x8b, 0xb5, 0x03, 0x1c, 0x88, 0x0a, - 0x99, 0x02, 0x9c, 0x00, 0x94, 0x3f, 0xb6, 0x10, 0x28, 0x88, 0x99, 0x10, 0x9c, 0x00, - 0x5a, 0x82, 0x08, 0x09, 0xda, 0x90, 0x10, 0x01, 0xab, 0xca, 0xb6, 0x10, 0x2a, 0x88, - 0x96, 0xca, 0xf9, 0xb6, 0x10, 0x2a, 0x8b, 0x00, 0xb6, 0x10, 0x28, 0x8b, 0x40, 0xb6, - 0x10, 0x28, 0x88, 0x99, 0x40, 0x9c, 0x00, 0x53, 0xb5, 0x33, 0x96, 0x90, 0x40, 0x01, - 0xab, 0xca, 0xb6, 0x10, 0x2a, 0x88, 0x96, 0xca, 0xf9, 0xb6, 0x10, 0x2a, 0x8b, 0x88, - 0x0a, 0x99, 0x08, 0x9c, 0x00, 0x47, 0x30, 0x40, 0x00, 0xb6, 0x10, 0x38, 0x8b, 0x00, - 0xb6, 0x10, 0x5c, 0x8e, 0x82, 0x00, 0x09, 0xdc, 0x50, 0xb7, 0x04, 0x04, 0x02, 0x80, - 0x09, 0x04, 0xab, 0xb7, 0x00, 0x00, 0x06, 0x00, 0xb5, 0x02, 0xad, 0x82, 0x00, 0x0c, - 0xfc, 0xb4, 0x01, 0x40, 0xac, 0x0c, 0xca, 0xb5, 0xb3, 0x29, 0xb4, 0x01, 0x37, 0x88, - 0x09, 0x9a, 0x20, 0x8b, 0x09, 0xb6, 0x10, 0x20, 0x88, 0x99, 0xbf, 0xb6, 0x10, 0x20, - 0x8b, 0x3c, 0xb2, 0x10, 0x38, 0x00, 0xc5, 0xab, 0xca, 0x93, 0x5a, 0x96, 0xca, 0x10, - 0x30, 0x36, 0x82, 0x02, 0xce, 0xf8, 0x96, 0xca, 0x11, 0x30, 0x2d, 0x82, 0x02, 0xce, - 0xf8, 0x96, 0xca, 0x12, 0x30, 0x24, 0x82, 0x02, 0xce, 0xf8, 0x96, 0xca, 0x13, 0x30, - 0x1b, 0x82, 0x02, 0xce, 0xf8, 0x96, 0xca, 0x14, 0x30, 0x12, 0x82, 0x02, 0xce, 0xf8, - 0x96, 0xca, 0x15, 0x30, 0x09, 0x82, 0x02, 0xce, 0xf8, 0x96, 0xca, 0x16, 0x30, 0x00, - 0xf4, 0xb8, 0x00, 0x10, 0xf6, 0x3c, 0xb2, 0x28, 0x00, 0x9c, 0x00, 0xb2, 0x20, 0x00, - 0xe7, 0x99, 0x02, 0x93, 0x54, 0xa0, 0xc8, 0xce, 0xf8, 0xf4, 0x9c, 0x00, 0x4f, 0x9d, - 0xff, 0x90, 0xff, 0x02, 0xf5, 0x8f, 0xeb, 0xf5, 0xa2, 0x2a, 0xcc, 0x8e, 0x00, 0x3c, - 0x90, 0x64, 0xa2, 0x2a, 0xcc, 0x8e, 0x90, 0x01, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x80, - 0x01, 0x43, 0x00, 0x80, 0x00, 0x80, 0x01, 0x43, 0x00, 0x80, 0x08, 0x80, 0x01, 0x43, - 0x00, 0x80, 0x0c, 0x00, 0xb5, 0x00, 0x7d, 0xb5, 0x00, 0x80, 0xb7, 0x00, 0x01, 0x02, - 0x82, 0x00, 0x02, 0xfc, 0x4b, 0xa8, 0x02, 0xb5, 0x28, 0x06, 0xae, 0x02, 0x05, 0xae, - 0x02, 0x6f, 0xb5, 0x5a, 0x0d, 0xb5, 0x01, 0x16, 0xb5, 0x29, 0x45, 0x3c, 0x90, 0x00, - 0xb6, 0xb8, 0x00, 0xab, 0xb5, 0x01, 0x33, 0xb5, 0x59, 0xfa, 0xb5, 0x00, 0x53, 0xb5, - 0x29, 0x51, 0xb5, 0x27, 0xe1, 0xb5, 0x59, 0x84, 0x30, 0x04, 0xb5, 0xfc, 0xce, 0x3c, - 0x3c, 0x40, 0x96, 0x7a, 0xdc, 0x3c, 0x8b, 0x7a, 0xb7, 0xb8, 0x44, 0x74, 0x04, 0xaa, - 0xc8, 0x41, 0x3c, 0x82, 0x60, 0x74, 0xf8, 0x68, 0x96, 0x7b, 0xdc, 0x3c, 0x8b, 0x7b, - 0xb7, 0xb8, 0xa4, 0x76, 0x04, 0xaa, 0xc8, 0x41, 0x3c, 0x82, 0xa2, 0x76, 0xf8, 0x68, - 0x96, 0x7c, 0xdc, 0x3c, 0x8b, 0x7c, 0xb7, 0xba, 0x8a, 0x78, 0x04, 0xaa, 0xc8, 0x41, - 0x3c, 0x82, 0x16, 0x78, 0xf8, 0x68, 0xb7, 0xb8, 0x0c, 0x72, 0x3c, 0x00, 0x97, 0x00, - 0x43, 0x3c, 0x82, 0x00, 0x43, 0xdd, 0x3c, 0xa2, 0x0e, 0x72, 0x88, 0x9c, 0x00, 0x94, - 0x4f, 0x97, 0x01, 0x43, 0x56, 0x88, 0xd2, 0x96, 0xc8, 0x12, 0x94, 0x4c, 0x96, 0xc8, - 0x15, 0x94, 0x65, 0x96, 0xc8, 0x13, 0x94, 0x68, 0x96, 0xc8, 0x14, 0x94, 0x74, 0xb5, - 0x00, 0xe4, 0xbc, 0x03, 0x01, 0x94, 0x29, 0xb0, 0x44, 0x65, 0xaf, 0xc8, 0xa8, 0x44, - 0xb9, 0xff, 0x00, 0xbc, 0x01, 0x00, 0xb4, 0x0d, 0x5a, 0xbc, 0x02, 0x00, 0xb4, 0x60, - 0xbb, 0xbc, 0x04, 0x00, 0xb4, 0x3d, 0x1a, 0xbc, 0x03, 0x00, 0xb4, 0x23, 0xc1, 0xbc, - 0x05, 0x00, 0xb4, 0x06, 0x02, 0x3c, 0x97, 0x00, 0x43, 0x3c, 0xb5, 0x00, 0xaf, 0xbc, - 0x03, 0x01, 0x6a, 0x67, 0xb5, 0xfb, 0x65, 0x97, 0xfb, 0xd2, 0x00, 0xb6, 0x12, 0x0a, - 0x8e, 0xab, 0xca, 0x00, 0xb6, 0x10, 0x5e, 0x8e, 0xb6, 0x10, 0x5e, 0x8e, 0xae, 0xca, - 0xb6, 0x12, 0x0a, 0x8e, 0x95, 0x6f, 0x97, 0xdf, 0xd2, 0xb5, 0xfb, 0x38, 0x95, 0x77, - 0xb5, 0xfb, 0x37, 0x97, 0xf7, 0xd2, 0x00, 0xb6, 0x20, 0x06, 0x8e, 0xb6, 0x20, 0x06, - 0x8e, 0x95, 0x72, 0xb5, 0xfb, 0x2a, 0x97, 0xef, 0xd2, 0x00, 0xb6, 0x28, 0x06, 0x8e, - 0xb6, 0x28, 0x06, 0x8e, 0x95, 0x83, 0x00, 0xab, 0x4e, 0xab, 0x50, 0xb1, 0x01, 0xf4, - 0xb2, 0xba, 0xb6, 0x00, 0xe6, 0xa2, 0x02, 0xcc, 0xab, 0xa2, 0x04, 0xcc, 0xab, 0xa2, - 0x06, 0xcc, 0xab, 0xa2, 0x08, 0xcc, 0xab, 0xae, 0xca, 0xaa, 0xc8, 0x41, 0x3c, 0xae, - 0xca, 0x82, 0x0a, 0xcc, 0xf8, 0x7d, 0xb1, 0x01, 0xf4, 0xb2, 0xba, 0xb6, 0x00, 0xa1, - 0x08, 0xb8, 0x00, 0xfc, 0x41, 0x51, 0xe6, 0xa2, 0x02, 0xcc, 0xab, 0xa2, 0x04, 0xcc, - 0xab, 0xa2, 0x06, 0xcc, 0xab, 0xa2, 0x08, 0xcc, 0xab, 0xae, 0xca, 0xaa, 0xc8, 0x41, - 0x3c, 0xae, 0xca, 0x82, 0x0a, 0xcc, 0xf8, 0x95, 0x24, 0xa8, 0x4e, 0x96, 0x50, 0xfc, - 0x42, 0x00, 0x3c, 0x90, 0x01, 0x63, 0x34, 0x0b, 0x9c, 0x00, 0x44, 0xb0, 0x03, 0x01, - 0x3c, 0xa8, 0xc4, 0xb6, 0xff, 0x38, 0xab, 0xb2, 0xba, 0xb6, 0xa0, 0x4e, 0xcc, 0xf8, - 0xe4, 0xab, 0x44, 0xb6, 0xff, 0x32, 0xab, 0xa2, 0x02, 0xcc, 0xa8, 0xab, 0x46, 0xb6, - 0xff, 0x34, 0xab, 0xa2, 0x04, 0xcc, 0xa8, 0xab, 0x48, 0xb6, 0xff, 0x36, 0xab, 0xa2, - 0x06, 0xcc, 0xa8, 0xab, 0x4a, 0xa2, 0x08, 0xcc, 0xa8, 0xab, 0x4c, 0xa8, 0x4e, 0xb6, - 0xff, 0x30, 0xab, 0xbc, 0x13, 0x7e, 0x47, 0xb8, 0x00, 0x0a, 0xab, 0x4e, 0x00, 0x3c, - 0xb7, 0x00, 0x00, 0x4e, 0x66, 0x83, 0x00, 0xb8, 0x00, 0xab, 0xac, 0xcc, 0x28, 0xac, - 0xca, 0x2a, 0xab, 0xca, 0xa8, 0x50, 0xb8, 0x00, 0x0a, 0x96, 0x4e, 0xfc, 0x94, 0x2e, - 0xb2, 0xba, 0xb6, 0xa0, 0x50, 0xcc, 0xf8, 0xa8, 0x02, 0xe6, 0xa8, 0xca, 0xa2, 0x02, - 0xcc, 0xab, 0xa8, 0x04, 0xa2, 0x04, 0xcc, 0xab, 0xa8, 0x06, 0xa2, 0x06, 0xcc, 0xab, - 0xa8, 0x50, 0xb8, 0x00, 0x0a, 0xbc, 0x13, 0x7e, 0x00, 0xab, 0x50, 0xac, 0x28, 0xcc, - 0xac, 0x2a, 0xca, 0x3c, 0xb6, 0xff, 0x06, 0xa9, 0x6b, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x5c, 0xc5, 0x2f, 0x14, 0x2b, 0x02, 0x45, 0x00, 0x0e, 0x00, - 0x06, 0x00, 0x06, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x50, 0x00, - 0x00, 0x00, 0x20, 0x03, 0x00, 0x00, 0x40, 0x1f, 0x00, 0x00, 0x80, 0x38, 0x01, 0x00, - 0x00, 0x35, 0x0c, 0x00, 0x00, 0x12, 0x7a, 0x00, 0x00, 0xb4, 0xc4, 0x04, 0x00, 0x08, - 0xaf, 0x2f, 0x0a, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0xe8, 0x03, 0x00, 0x00, - 0x10, 0x27, 0x00, 0x00, 0xa0, 0x86, 0x01, 0x00, 0x40, 0x42, 0x0f, 0x00, 0x80, 0x96, - 0x98, 0x00, 0x00, 0xe1, 0xf5, 0x05, 0x00, 0xca, 0x9a, 0x3b, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xaf, 0x02, 0xb7, 0x00, 0x00, 0x02, 0x82, 0x0b, 0x02, 0xfc, - 0x94, 0x20, 0xae, 0xca, 0xa2, 0x02, 0xcc, 0xfc, 0x53, 0xa2, 0x02, 0xcc, 0xfd, 0x41, - 0x53, 0xae, 0xca, 0xa9, 0x02, 0xa9, 0xcc, 0xa9, 0xcc, 0xa9, 0xcc, 0xa9, 0xcc, 0x7f, - 0xae, 0xca, 0xfc, 0x6e, 0xfd, 0x70, 0xa8, 0x02, 0x3f, 0x02, 0x3c, 0x90, 0x00, 0xa2, - 0x76, 0xce, 0xab, 0x90, 0x00, 0xb5, 0x32, 0x51, 0xb7, 0x00, 0x00, 0x02, 0xb7, 0x00, - 0x00, 0x04, 0xb7, 0x00, 0x00, 0x06, 0x00, 0xac, 0xce, 0xcc, 0x82, 0x70, 0xcc, 0xf8, - 0xb4, 0x26, 0xc8, 0xb7, 0x00, 0x00, 0x02, 0xac, 0xce, 0xcc, 0x82, 0x7a, 0xcc, 0xf8, - 0x82, 0x05, 0x02, 0xfc, 0x55, 0x00, 0xe6, 0xa2, 0x02, 0xcc, 0xab, 0xa2, 0x04, 0xcc, - 0xab, 0xa2, 0x06, 0xcc, 0xab, 0xa9, 0x02, 0x82, 0x08, 0xcc, 0xf8, 0x79, 0x00, 0xa2, - 0x78, 0xce, 0x8b, 0x90, 0x01, 0xa2, 0x76, 0xce, 0xab, 0xa2, 0x10, 0xce, 0x88, 0xe7, - 0xb8, 0x46, 0x00, 0xad, 0xc8, 0xa8, 0xa2, 0x72, 0xce, 0xab, 0xb5, 0x31, 0x9c, 0x90, - 0x01, 0xb5, 0x31, 0xf3, 0xb7, 0x5e, 0x10, 0x02, 0xb7, 0x00, 0x5f, 0x04, 0xb7, 0x05, - 0x00, 0x06, 0xac, 0xce, 0xcc, 0x82, 0x70, 0xcc, 0xf8, 0xa2, 0x22, 0xce, 0x88, 0xb4, - 0x26, 0x67, 0xb5, 0x31, 0xb1, 0xab, 0x02, 0xb7, 0x00, 0x00, 0x04, 0xa2, 0x72, 0xce, - 0xa8, 0x02, 0x96, 0x02, 0xeb, 0xab, 0x02, 0x90, 0x00, 0x96, 0x04, 0xeb, 0xab, 0x04, - 0xa2, 0x10, 0xce, 0x88, 0xe7, 0xb8, 0x46, 0x00, 0xad, 0xc8, 0xa8, 0xa2, 0x72, 0xce, - 0xab, 0xb5, 0x31, 0x51, 0xaf, 0x02, 0xaf, 0x04, 0xb7, 0x5e, 0x10, 0x02, 0xb7, 0x00, - 0x5f, 0x04, 0xb7, 0x05, 0x00, 0x06, 0xac, 0xce, 0xcc, 0x82, 0x70, 0xcc, 0xf8, 0xa2, - 0x22, 0xce, 0x88, 0xb5, 0x26, 0x1d, 0x3f, 0x04, 0x3f, 0x02, 0xac, 0x76, 0xce, 0xb7, - 0x00, 0x00, 0x06, 0xb7, 0x00, 0x00, 0x08, 0xb7, 0x00, 0x00, 0x0a, 0xb7, 0x00, 0x00, - 0x0c, 0xb7, 0x00, 0x00, 0x0e, 0xac, 0xce, 0xcc, 0x82, 0x7a, 0xcc, 0xf8, 0x82, 0x05, - 0x0e, 0xfc, 0x94, 0x2b, 0xe4, 0x03, 0x96, 0x06, 0xf8, 0xab, 0x06, 0xa2, 0x02, 0xcc, - 0xa8, 0x96, 0x08, 0xe8, 0xab, 0x08, 0xa2, 0x04, 0xcc, 0xa8, 0x03, 0x96, 0x0a, 0xf8, - 0xab, 0x0a, 0xa2, 0x06, 0xcc, 0xa8, 0x96, 0x0c, 0xe8, 0xab, 0x0c, 0xa9, 0x0e, 0x82, - 0x08, 0xcc, 0xf8, 0x95, 0x2f, 0xa2, 0x78, 0xce, 0x88, 0xac, 0xce, 0xcc, 0x9e, 0x08, - 0xac, 0xcc, 0xce, 0xa0, 0xc8, 0xcc, 0xf8, 0x82, 0x7a, 0xcc, 0xf8, 0xe4, 0xa2, 0x02, - 0xcc, 0xf8, 0x9d, 0x00, 0x94, 0x88, 0xa2, 0x06, 0xcc, 0xa8, 0x9d, 0x1e, 0x94, 0x53, - 0x9c, 0x1e, 0x94, 0x41, 0xe4, 0xa2, 0x02, 0xcc, 0xfa, 0x9d, 0x00, 0x94, 0x73, 0xa8, - 0x02, 0x96, 0x04, 0xfa, 0x9c, 0x00, 0x94, 0x6a, 0x96, 0xc9, 0x17, 0x94, 0x65, 0xa2, - 0x06, 0xcc, 0xa8, 0x9d, 0x00, 0x94, 0x30, 0x9c, 0x00, 0x41, 0x4c, 0xa2, 0x04, 0xcc, - 0xa8, 0x9c, 0x40, 0x94, 0x24, 0x9d, 0x40, 0x94, 0x20, 0xa8, 0x0c, 0x9d, 0x00, 0x5b, - 0x9c, 0x00, 0x42, 0x94, 0x43, 0xa8, 0x0a, 0xbd, 0x02, 0x00, 0x50, 0x94, 0x3b, 0xa2, - 0x04, 0xcc, 0xa8, 0xbc, 0x84, 0x80, 0x46, 0xbd, 0x84, 0x80, 0x42, 0x95, 0x4d, 0xa2, - 0x78, 0xce, 0x88, 0x04, 0x9c, 0x05, 0x00, 0x9d, 0x05, 0x00, 0xa2, 0x78, 0xce, 0x8b, - 0xac, 0xce, 0xcc, 0x9e, 0x08, 0xac, 0xcc, 0xce, 0xa0, 0xc8, 0xcc, 0xf8, 0x82, 0x7a, - 0xcc, 0xf8, 0x00, 0xa2, 0x04, 0xcc, 0xab, 0xa2, 0x06, 0xcc, 0xab, 0xe6, 0xa2, 0x02, - 0xcc, 0xab, 0xe4, 0x03, 0x96, 0x02, 0xf8, 0xe6, 0xa2, 0x02, 0xcc, 0xa8, 0x96, 0x04, - 0xe8, 0xa2, 0x02, 0xcc, 0xab, 0xa2, 0x04, 0xcc, 0xa8, 0x03, 0xb8, 0x00, 0x04, 0xa2, - 0x04, 0xcc, 0xab, 0xa2, 0x06, 0xcc, 0xa8, 0x82, 0x00, 0xc8, 0xe8, 0xa2, 0x06, 0xcc, - 0xab, 0xa8, 0x06, 0x03, 0x96, 0x02, 0xf8, 0xab, 0x06, 0xa8, 0x08, 0x96, 0x04, 0xe8, - 0xab, 0x08, 0xa8, 0x0a, 0x03, 0xb8, 0x00, 0x04, 0xab, 0x0a, 0xa8, 0x0c, 0x82, 0x00, - 0xc8, 0xe8, 0xab, 0x0c, 0xa2, 0x74, 0xce, 0x88, 0xab, 0x0e, 0xa8, 0x06, 0xac, 0x08, - 0xca, 0xb2, 0x46, 0x4c, 0x36, 0x4c, 0xab, 0x10, 0xa8, 0x0a, 0xac, 0x0c, 0xca, 0xb2, - 0x46, 0x20, 0x36, 0x58, 0xab, 0x12, 0x02, 0x96, 0x10, 0xeb, 0xb8, 0x00, 0x06, 0xa2, - 0x74, 0xce, 0x8b, 0xa2, 0x11, 0xce, 0x88, 0xa2, 0x74, 0xce, 0xdd, 0x94, 0xe9, 0xa2, - 0x74, 0xce, 0xdc, 0x94, 0xe3, 0xa8, 0x02, 0x96, 0x04, 0xfa, 0x9c, 0x00, 0x94, 0x23, - 0xa2, 0x6c, 0xce, 0xa8, 0x03, 0x96, 0x02, 0xf8, 0xa2, 0x6c, 0xce, 0xab, 0xa2, 0x6e, - 0xce, 0xa8, 0x96, 0x04, 0xe8, 0xa2, 0x6e, 0xce, 0xab, 0xa2, 0x22, 0xce, 0x88, 0xab, - 0x18, 0xb0, 0x40, 0x35, 0xb5, 0x40, 0x59, 0xa8, 0x0e, 0xa2, 0x74, 0xce, 0xdc, 0x4c, - 0xa2, 0x22, 0xce, 0x88, 0xab, 0x18, 0xb0, 0x40, 0x33, 0xb5, 0x40, 0x46, 0xa2, 0x10, - 0xce, 0x88, 0xa2, 0x74, 0xce, 0xdd, 0x94, 0x46, 0xa2, 0x74, 0xce, 0xdc, 0x94, 0x40, - 0xa2, 0x11, 0xce, 0x88, 0xa2, 0x74, 0xce, 0xdd, 0x5e, 0xa2, 0x74, 0xce, 0xdc, 0x59, - 0xa2, 0x12, 0xce, 0x88, 0x9c, 0x00, 0x3c, 0x90, 0x00, 0xa2, 0x12, 0xce, 0x8b, 0xa2, - 0x22, 0xce, 0x88, 0xab, 0x18, 0xb0, 0x40, 0x40, 0xb4, 0x40, 0x0f, 0xa2, 0x12, 0xce, - 0x88, 0x9d, 0x00, 0x7f, 0x90, 0x01, 0xa2, 0x12, 0xce, 0x8b, 0xa2, 0x22, 0xce, 0x88, - 0xab, 0x18, 0xb0, 0x40, 0x40, 0xb4, 0x3f, 0xf6, 0x90, 0x01, 0xa2, 0x40, 0xce, 0x8b, - 0xb6, 0xff, 0x08, 0xa9, 0xa2, 0x68, 0xce, 0xa8, 0x03, 0xb8, 0x00, 0x01, 0xa2, 0x68, - 0xce, 0xab, 0xa2, 0x6a, 0xce, 0xa8, 0x82, 0x00, 0xc8, 0xe8, 0xa2, 0x6a, 0xce, 0xab, - 0xb7, 0x05, 0x02, 0x02, 0xb7, 0x00, 0x00, 0x04, 0xb7, 0x00, 0x00, 0x06, 0xa2, 0x22, - 0xce, 0x88, 0xb5, 0xfc, 0x07, 0xb7, 0x02, 0x11, 0x02, 0xb7, 0x00, 0x00, 0x04, 0xb7, - 0x00, 0x00, 0x06, 0xa2, 0x22, 0xce, 0x88, 0xb5, 0xfb, 0xf4, 0xa2, 0x22, 0xce, 0x88, - 0xab, 0x18, 0xb0, 0x40, 0x34, 0xb4, 0x3f, 0xa2, 0x90, 0x00, 0x96, 0x08, 0xfd, 0x4e, - 0x96, 0x08, 0xfc, 0x42, 0x95, 0xed, 0x90, 0x05, 0x96, 0x06, 0xfd, 0x42, 0x95, 0xf5, - 0x90, 0x0f, 0xa2, 0x11, 0xce, 0xdd, 0x47, 0xa2, 0x74, 0xce, 0x8b, 0xb4, 0xfe, 0xfb, - 0xa2, 0x11, 0xce, 0x88, 0x04, 0x6c, 0xa2, 0x6c, 0x76, 0xa8, 0x03, 0xa2, 0x72, 0x76, - 0xf8, 0xa2, 0x6c, 0x76, 0xab, 0xa2, 0x6e, 0x76, 0xa8, 0x82, 0x00, 0xc8, 0xe8, 0xa2, - 0x6e, 0x76, 0xab, 0xa2, 0x10, 0x76, 0x88, 0xa2, 0x74, 0x76, 0x8b, 0xa2, 0x22, 0x76, - 0x88, 0xab, 0x18, 0xb0, 0x40, 0x35, 0xb5, 0x3f, 0x4d, 0xa2, 0x22, 0x76, 0x88, 0xab, - 0x18, 0xb0, 0x40, 0x33, 0xb5, 0x3f, 0x41, 0x90, 0x01, 0xa2, 0x40, 0x76, 0x8b, 0xa2, - 0x68, 0x76, 0xa8, 0x03, 0xb8, 0x00, 0x01, 0xa2, 0x68, 0x76, 0xab, 0xa2, 0x6a, 0x76, - 0xa8, 0x82, 0x00, 0xc8, 0xe8, 0xa2, 0x6a, 0x76, 0xab, 0xb7, 0x05, 0x02, 0x02, 0xb7, - 0x00, 0x00, 0x04, 0xb7, 0x00, 0x00, 0x06, 0xa2, 0x22, 0x76, 0x88, 0xb5, 0xfb, 0x56, - 0xb7, 0x02, 0x11, 0x02, 0xb7, 0x00, 0x00, 0x04, 0xb7, 0x00, 0x00, 0x06, 0xa2, 0x22, - 0x76, 0x88, 0xb5, 0xfb, 0x43, 0xa2, 0x22, 0x76, 0x88, 0xab, 0x18, 0xb0, 0x40, 0x34, - 0xb4, 0x3e, 0xf1, 0x90, 0x03, 0xb5, 0x2e, 0x21, 0x90, 0x01, 0xb5, 0x2e, 0x78, 0xa2, - 0x0c, 0x76, 0x88, 0x99, 0x01, 0x9c, 0x00, 0x4a, 0xa2, 0x0f, 0x72, 0x88, 0x9c, 0x00, - 0x43, 0xb5, 0x2e, 0xab, 0x90, 0x02, 0xa2, 0x76, 0x76, 0xab, 0x90, 0x01, 0xa2, 0x42, - 0x76, 0x8b, 0x3c, 0xa8, 0x46, 0xb5, 0xf9, 0x70, 0xa8, 0x44, 0xbc, 0x05, 0xff, 0x53, - 0xac, 0x76, 0xce, 0xa2, 0x76, 0x76, 0xa8, 0x9c, 0x00, 0x59, 0x9c, 0x01, 0x94, 0x23, - 0x9c, 0x02, 0x94, 0x33, 0x3c, 0xa2, 0x70, 0x76, 0xa8, 0x96, 0x48, 0xfc, 0x41, 0x3c, - 0x00, 0xa2, 0x70, 0x76, 0xab, 0x95, 0x21, 0xa8, 0x44, 0xbc, 0x05, 0x01, 0xb4, 0xfb, - 0xe8, 0xbc, 0x05, 0x03, 0x95, 0x63, 0x3c, 0xa8, 0x44, 0xbc, 0x05, 0x02, 0xb4, 0xfb, - 0xb8, 0xbc, 0x05, 0x05, 0x95, 0xfa, 0xbc, 0x05, 0xff, 0xb4, 0xfc, 0x30, 0x3c, 0xa8, - 0x44, 0xbc, 0x05, 0x05, 0x49, 0xbc, 0x05, 0x02, 0x50, 0xbc, 0x05, 0x04, 0x4c, 0x3c, - 0x90, 0x00, 0xa2, 0x42, 0x76, 0x8b, 0x90, 0x00, 0xb4, 0x2d, 0xee, 0xb5, 0xfb, 0x8f, - 0xa2, 0x0c, 0x76, 0x88, 0x99, 0x01, 0x9c, 0x00, 0x4a, 0xa2, 0x0f, 0x72, 0x88, 0x9c, - 0x00, 0x43, 0xb5, 0x2e, 0x1f, 0xa8, 0x44, 0xbc, 0x05, 0x04, 0x41, 0x3c, 0xa2, 0x42, - 0x76, 0x88, 0x9c, 0x00, 0x4e, 0x00, 0xa2, 0x40, 0x76, 0x8b, 0xa2, 0x30, 0x76, 0xab, - 0xa2, 0x32, 0x76, 0xab, 0x3c, 0xa2, 0x30, 0x76, 0xa8, 0x03, 0xb8, 0x00, 0x01, 0xa2, - 0x30, 0x76, 0xab, 0xa2, 0x32, 0x76, 0xa8, 0x82, 0x00, 0xc8, 0xe8, 0xa2, 0x32, 0x76, - 0xab, 0xa2, 0x22, 0x76, 0x88, 0xab, 0x18, 0xb0, 0x40, 0x2a, 0xb4, 0x3e, 0x07, 0x00, - 0xab, 0xca, 0xa2, 0x15, 0x72, 0x88, 0x9c, 0x00, 0x3c, 0xa8, 0xca, 0xa2, 0x14, 0x72, - 0x8b, 0xb7, 0x00, 0x00, 0x18, 0xb0, 0x10, 0x2b, 0xb5, 0x3d, 0xed, 0xb7, 0x02, 0x12, - 0x02, 0xb7, 0x00, 0x00, 0x04, 0xb7, 0x00, 0x00, 0x06, 0xa2, 0x10, 0x72, 0x88, 0xb5, - 0xfa, 0x20, 0xb7, 0x02, 0x12, 0x02, 0xb7, 0x00, 0x00, 0x04, 0xb7, 0x00, 0x00, 0x06, - 0xa2, 0x11, 0x72, 0x88, 0xb5, 0xfa, 0x0d, 0xb7, 0x00, 0x00, 0x08, 0x82, 0x01, 0x08, - 0xfc, 0x3c, 0xa8, 0x08, 0xb5, 0xf8, 0x53, 0xa2, 0x00, 0x74, 0xa8, 0x9c, 0x00, 0x51, - 0xb7, 0x04, 0x0c, 0x02, 0xb7, 0x00, 0x00, 0x04, 0xb7, 0x00, 0x00, 0x06, 0xa8, 0x08, - 0xb5, 0xf9, 0xe7, 0xa9, 0x08, 0x95, 0x24, 0xac, 0x02, 0x0a, 0xac, 0x04, 0x0c, 0xb7, - 0x00, 0x00, 0x10, 0xa8, 0x02, 0xb5, 0xf8, 0x28, 0xa8, 0x04, 0x9c, 0x02, 0x94, 0x40, - 0xa8, 0x0a, 0xb5, 0xf8, 0x31, 0xa2, 0x66, 0x76, 0xa8, 0x9c, 0x00, 0x52, 0x9c, 0x04, - 0x55, 0x9c, 0x02, 0x5a, 0x9c, 0x01, 0x5d, 0x9c, 0x05, 0x94, 0x1f, 0x9c, 0x03, 0x5c, - 0x94, 0x49, 0xb7, 0x00, 0x01, 0x10, 0x94, 0x43, 0xa2, 0x0a, 0x76, 0xa8, 0xab, 0x0e, - 0x94, 0x3b, 0xb7, 0x00, 0x02, 0x0e, 0x94, 0x35, 0xb7, 0x00, 0x01, 0x0e, 0x94, 0x2f, - 0xa2, 0x06, 0x76, 0xa8, 0x9c, 0x00, 0x72, 0x6d, 0xa2, 0x56, 0x74, 0xa8, 0x9c, 0x00, - 0x5b, 0x9c, 0x04, 0x51, 0x9c, 0x02, 0x49, 0x9c, 0x01, 0x41, 0x56, 0xb7, 0x00, 0x01, - 0x0e, 0x51, 0xb7, 0x00, 0x02, 0x0e, 0x4c, 0xa2, 0x06, 0x74, 0xa8, 0xab, 0x0e, 0x45, - 0xb7, 0x00, 0x01, 0x10, 0x40, 0x82, 0x00, 0x10, 0xfd, 0x94, 0xf1, 0xa8, 0x0e, 0x05, - 0xab, 0x12, 0x82, 0x02, 0x0c, 0xfc, 0x5c, 0xa8, 0x12, 0x9e, 0x04, 0xac, 0x76, 0xcc, - 0x82, 0x1a, 0xcc, 0xf8, 0xa0, 0xc8, 0xcc, 0xf8, 0xa2, 0x02, 0xcc, 0x88, 0xab, 0x0a, - 0xa2, 0x03, 0xcc, 0x88, 0xab, 0x0c, 0x5b, 0xa8, 0x12, 0x9e, 0x04, 0xac, 0x74, 0xcc, - 0x82, 0x58, 0xcc, 0xf8, 0xa0, 0xc8, 0xcc, 0xf8, 0xa2, 0x02, 0xcc, 0x88, 0xab, 0x0a, - 0xa2, 0x03, 0xcc, 0x88, 0xab, 0x0c, 0x82, 0x02, 0x0c, 0xfc, 0x94, 0x71, 0xa8, 0x0a, - 0xb5, 0xf7, 0x7d, 0xa2, 0x66, 0x76, 0xa8, 0x9c, 0x00, 0x5a, 0x9c, 0x04, 0x51, 0x9c, - 0x02, 0x5a, 0x9c, 0x01, 0x94, 0x20, 0x9c, 0x05, 0x94, 0x26, 0x9c, 0x03, 0x94, 0x45, - 0x95, 0x6b, 0xa8, 0x0e, 0xa2, 0x0a, 0x76, 0xfc, 0xb7, 0x00, 0x01, 0x10, 0x95, 0x77, - 0x82, 0x02, 0x0e, 0xfc, 0xb7, 0x00, 0x01, 0x10, 0x95, 0x81, 0x82, 0x01, 0x0e, 0xfc, - 0xb7, 0x00, 0x01, 0x10, 0x95, 0x8b, 0xa2, 0x06, 0x76, 0xa8, 0x9c, 0x00, 0x4b, 0x82, - 0x02, 0x0e, 0xfc, 0x51, 0xb7, 0x00, 0x02, 0x0e, 0x95, 0x9d, 0x82, 0x01, 0x0e, 0xfc, - 0x46, 0xb7, 0x00, 0x01, 0x0e, 0x95, 0xa8, 0xb7, 0x00, 0x01, 0x10, 0x95, 0xae, 0x90, - 0x03, 0x02, 0x96, 0x0e, 0xeb, 0x9d, 0x00, 0xb7, 0x00, 0x01, 0x10, 0x95, 0xbc, 0xa8, - 0x0a, 0xb5, 0xf6, 0xf8, 0xa2, 0x56, 0x74, 0xa8, 0x9c, 0x00, 0x95, 0xc9, 0x9c, 0x04, - 0x48, 0x9c, 0x02, 0x52, 0x9c, 0x01, 0x59, 0x95, 0xd4, 0xa2, 0x06, 0x74, 0xa8, 0x96, - 0x0e, 0xfc, 0xb7, 0x00, 0x01, 0x10, 0x95, 0xe1, 0x82, 0x02, 0x0e, 0xfc, 0xb7, 0x00, - 0x01, 0x10, 0x95, 0xeb, 0x82, 0x01, 0x0e, 0xfc, 0xb7, 0x00, 0x01, 0x10, 0x95, 0xf5, - 0xac, 0x0a, 0x06, 0xac, 0x0c, 0x08, 0x3c, 0xab, 0x22, 0xb5, 0xf6, 0xcc, 0xa2, 0x54, - 0x76, 0x88, 0x9c, 0x00, 0x5e, 0xa2, 0x32, 0x72, 0xa8, 0x05, 0xa2, 0x32, 0x72, 0xab, - 0x90, 0x00, 0xa2, 0x54, 0x76, 0x8b, 0xb7, 0x00, 0x00, 0x06, 0xac, 0x76, 0xcc, 0x82, - 0x52, 0xcc, 0xf8, 0x00, 0xb5, 0x20, 0x10, 0xa2, 0x30, 0x72, 0xa8, 0x02, 0xa2, 0x32, - 0x72, 0xeb, 0x9c, 0x00, 0x3c, 0x96, 0xc9, 0x17, 0x3c, 0xab, 0x0a, 0xa8, 0x22, 0x96, - 0x7e, 0xdd, 0xb0, 0xff, 0xff, 0x04, 0xab, 0x0c, 0xb7, 0x00, 0x00, 0x0e, 0x80, 0x7e, - 0x0e, 0xfc, 0x3c, 0x82, 0x00, 0x0a, 0xfc, 0x3c, 0xa8, 0x0c, 0xb5, 0xf6, 0x77, 0xa2, - 0x0e, 0x76, 0xa8, 0x9c, 0x00, 0x94, 0x2c, 0xa2, 0x55, 0x76, 0x88, 0x9c, 0x00, 0x94, - 0x24, 0xa2, 0x06, 0x76, 0xa8, 0x9c, 0x03, 0x41, 0x5c, 0x90, 0x00, 0xa2, 0x55, 0x76, - 0x8b, 0xb7, 0x02, 0x14, 0x02, 0xb7, 0x00, 0x00, 0x04, 0xb7, 0x00, 0x00, 0x06, 0xa8, - 0x0c, 0xb5, 0xf7, 0xe0, 0xa8, 0x0a, 0x05, 0xab, 0x0a, 0xa8, 0x0c, 0x96, 0x7e, 0xdd, - 0xb0, 0xff, 0xff, 0x04, 0xab, 0x0c, 0x95, 0x4e, 0xa2, 0x1e, 0x72, 0x88, 0x9c, 0x02, - 0x94, 0x44, 0xa2, 0x20, 0x72, 0xa8, 0x9c, 0x04, 0x94, 0x3c, 0xb5, 0x23, 0x0b, 0x9c, - 0x00, 0x94, 0x2f, 0x90, 0x02, 0xa2, 0x1e, 0x72, 0x8b, 0x00, 0x96, 0x7e, 0xdc, 0x94, - 0x29, 0xab, 0x0a, 0xb5, 0xf6, 0x22, 0xa2, 0x12, 0x78, 0xa8, 0x9c, 0x00, 0x52, 0x90, - 0x00, 0xa2, 0x12, 0x78, 0xab, 0xb0, 0x32, 0x0e, 0xa2, 0x10, 0x78, 0x88, 0xab, 0x18, - 0xb5, 0x3b, 0x47, 0xa8, 0x0a, 0x04, 0x95, 0x26, 0x90, 0x03, 0xa2, 0x1e, 0x72, 0x8b, - 0x90, 0x00, 0xa2, 0x20, 0x72, 0xab, 0xb0, 0x10, 0x29, 0xb7, 0x00, 0x00, 0x18, 0xb4, - 0x3b, 0x2c, 0x90, 0x01, 0xa2, 0x20, 0x72, 0xab, 0xb0, 0x10, 0x29, 0xb7, 0x00, 0x00, - 0x18, 0xb5, 0x3b, 0x1c, 0x90, 0x01, 0x36, 0xec, 0xb7, 0x00, 0x00, 0x0a, 0x82, 0x01, - 0x0a, 0xfc, 0x94, 0x2b, 0xa8, 0x0a, 0xb5, 0xf5, 0xa3, 0xa2, 0x00, 0x74, 0xa8, 0x9c, - 0x00, 0x5b, 0xb7, 0x04, 0x0e, 0x02, 0xb7, 0x00, 0x01, 0x04, 0xb7, 0x00, 0x00, 0x06, - 0xa8, 0x0a, 0xb5, 0xf7, 0x37, 0xaf, 0x0a, 0xac, 0x74, 0xce, 0xb5, 0x18, 0xa3, 0x3f, - 0x0a, 0xa9, 0x0a, 0x95, 0x2f, 0xb7, 0x00, 0x00, 0x0a, 0x80, 0x7e, 0x0a, 0xfc, 0x3c, - 0xa8, 0x0a, 0xb5, 0xf5, 0x83, 0xa2, 0x0e, 0x76, 0xa8, 0x9c, 0x00, 0x51, 0xb7, 0x02, - 0x01, 0x02, 0xb7, 0x00, 0x00, 0x04, 0xb7, 0x00, 0x00, 0x06, 0xa8, 0x0a, 0xb5, 0xf7, - 0x03, 0xa9, 0x0a, 0x95, 0x24, 0x90, 0x02, 0xa2, 0x20, 0x72, 0xab, 0xb0, 0x10, 0x29, - 0xb7, 0x00, 0x00, 0x18, 0xb5, 0x3a, 0xa9, 0xa2, 0x02, 0x72, 0xa8, 0xab, 0x02, 0xa2, - 0x04, 0x72, 0xa8, 0xab, 0x04, 0xb7, 0x01, 0x00, 0x06, 0xac, 0x72, 0xcc, 0x82, 0x18, - 0xcc, 0xf8, 0x00, 0xb4, 0x1e, 0xad, 0x90, 0x03, 0xa2, 0x20, 0x72, 0xab, 0xb0, 0x10, - 0x29, 0xb7, 0x00, 0x00, 0x18, 0xb5, 0x3a, 0x7e, 0xb7, 0x00, 0x00, 0x0a, 0x80, 0x7e, - 0x0a, 0xfc, 0x94, 0x21, 0xa8, 0x0a, 0xb5, 0xf5, 0x1d, 0xa2, 0x0e, 0x76, 0xa8, 0x9c, - 0x00, 0x51, 0xb7, 0x02, 0x04, 0x02, 0xb7, 0x00, 0x00, 0x04, 0xb7, 0x00, 0x00, 0x06, - 0xa8, 0x0a, 0xb5, 0xf6, 0x9d, 0xa9, 0x0a, 0x95, 0x25, 0xb7, 0x00, 0x00, 0x0a, 0x82, - 0x01, 0x0a, 0xfc, 0x94, 0x21, 0xa8, 0x0a, 0xb5, 0xf4, 0xde, 0xa2, 0x00, 0x74, 0xa8, - 0x9c, 0x00, 0x51, 0xb7, 0x04, 0x0e, 0x02, 0xb7, 0x00, 0x00, 0x04, 0xb7, 0x00, 0x00, - 0x06, 0xa8, 0x0a, 0xb5, 0xf6, 0x72, 0xa9, 0x0a, 0x95, 0x25, 0xb7, 0x1e, 0x84, 0x02, - 0xb7, 0x00, 0x00, 0x04, 0xb7, 0x01, 0x00, 0x06, 0xac, 0x72, 0xcc, 0x82, 0x18, 0xcc, - 0xf8, 0x00, 0xb4, 0x1e, 0x30, 0x90, 0x04, 0xa2, 0x20, 0x72, 0xab, 0xb0, 0x10, 0x29, - 0xb7, 0x00, 0x00, 0x18, 0xb5, 0x3a, 0x01, 0x90, 0x01, 0xa2, 0x1e, 0x72, 0x8b, 0xb5, - 0x21, 0x8e, 0x9c, 0x00, 0x94, 0x3b, 0xb7, 0x01, 0x04, 0x02, 0xb7, 0x00, 0x02, 0x04, - 0xb7, 0x00, 0x00, 0x06, 0x00, 0xb5, 0xf6, 0x2a, 0xb7, 0x00, 0x00, 0x0a, 0x80, 0x7e, - 0x0a, 0xfc, 0x3c, 0xa8, 0x0a, 0xb5, 0xf4, 0x98, 0xa2, 0x12, 0x78, 0xa8, 0x9c, 0x00, - 0x52, 0x90, 0x00, 0xa2, 0x12, 0x78, 0xab, 0xb0, 0x32, 0x0e, 0xa2, 0x10, 0x78, 0x88, - 0xab, 0x18, 0xb5, 0x39, 0xbd, 0xa9, 0x0a, 0x95, 0x25, 0xb7, 0x01, 0x04, 0x02, 0xb7, - 0x00, 0x03, 0x04, 0xb7, 0x00, 0x00, 0x06, 0x00, 0xb4, 0xf5, 0xef, 0x90, 0x05, 0xa2, - 0x20, 0x72, 0xab, 0xb0, 0x10, 0x29, 0xb7, 0x00, 0x00, 0x18, 0xb5, 0x39, 0x99, 0x90, - 0x00, 0xb5, 0x22, 0xc4, 0xb7, 0xf4, 0x24, 0x02, 0xb7, 0x00, 0x00, 0x04, 0xb7, 0x01, - 0x00, 0x06, 0xac, 0x72, 0xcc, 0x82, 0x18, 0xcc, 0xf8, 0x00, 0xb4, 0x1d, 0x9c, 0xa2, - 0x1e, 0x72, 0x88, 0x9c, 0x02, 0x42, 0x95, 0x9b, 0xa2, 0x0a, 0x72, 0x88, 0x9c, 0x02, - 0x49, 0x90, 0x00, 0xa2, 0x16, 0x72, 0x8b, 0xb4, 0xfe, 0x38, 0x90, 0x06, 0xa2, 0x2e, - 0xce, 0xf9, 0x9d, 0x00, 0x94, 0x33, 0xa2, 0x16, 0x72, 0x88, 0x9c, 0x00, 0x3c, 0x90, - 0x41, 0xa2, 0x2e, 0xce, 0xf9, 0x9c, 0x00, 0x50, 0x90, 0x02, 0xa2, 0x2e, 0xcc, 0xf9, - 0x9c, 0x00, 0x47, 0x90, 0x01, 0xa2, 0x16, 0x72, 0x8b, 0x3c, 0x90, 0x02, 0xa2, 0x2e, - 0xce, 0xf9, 0x9c, 0x00, 0x3c, 0x90, 0x41, 0xa2, 0x2e, 0xcc, 0xf9, 0x9c, 0x00, 0x3c, - 0x79, 0x90, 0x06, 0xa2, 0x2e, 0xcc, 0xf9, 0x9c, 0x00, 0x95, 0x3b, 0x90, 0x00, 0xa2, - 0x16, 0x72, 0x8b, 0xb4, 0xfd, 0xe8, 0xa2, 0x20, 0x72, 0xa8, 0x9c, 0x06, 0x50, 0x90, - 0x06, 0xa2, 0x20, 0x72, 0xab, 0xb0, 0x10, 0x29, 0xb7, 0x00, 0x00, 0x18, 0xb5, 0x38, - 0xfd, 0xa2, 0x10, 0x72, 0x88, 0xb5, 0xf3, 0xa4, 0xac, 0x76, 0x24, 0xa2, 0x11, 0x72, - 0x88, 0xb5, 0xf3, 0x9a, 0xac, 0x76, 0x26, 0xa2, 0x0e, 0x24, 0xa8, 0x9c, 0x00, 0x57, - 0xa2, 0x22, 0x24, 0x88, 0xb5, 0x23, 0xa5, 0xa2, 0x2e, 0x24, 0xab, 0xa2, 0x22, 0x24, - 0x88, 0xb5, 0x23, 0x9a, 0xa2, 0x2e, 0x24, 0xab, 0x46, 0x90, 0x02, 0xa2, 0x2e, 0x24, - 0xab, 0xa2, 0x0e, 0x26, 0xa8, 0x9c, 0x00, 0x56, 0xa2, 0x22, 0x26, 0x88, 0xb5, 0x23, - 0x81, 0xa2, 0x2e, 0x26, 0xab, 0xa2, 0x22, 0x26, 0x88, 0xb5, 0x23, 0x76, 0xa2, 0x2e, - 0x26, 0xab, 0x90, 0x02, 0xa2, 0x2e, 0x26, 0xab, 0xac, 0x24, 0xce, 0xac, 0x26, 0xcc, - 0x34, 0xe1, 0xa2, 0x16, 0x72, 0x88, 0x9c, 0x00, 0x3c, 0xb7, 0xc4, 0xb4, 0x02, 0xb7, - 0x00, 0x04, 0x04, 0xb7, 0x01, 0x00, 0x06, 0xac, 0x72, 0xcc, 0x82, 0x18, 0xcc, 0xf8, - 0x00, 0xb4, 0x1c, 0x9b, 0x90, 0x07, 0xa2, 0x20, 0x72, 0xab, 0xb0, 0x10, 0x29, 0xb7, - 0x00, 0x00, 0x18, 0xb5, 0x38, 0x6c, 0x90, 0x01, 0xb5, 0x21, 0x97, 0xb7, 0x98, 0x96, - 0x02, 0xb7, 0x00, 0x00, 0x04, 0xb7, 0x01, 0x00, 0x06, 0xac, 0x72, 0xcc, 0x82, 0x18, - 0xcc, 0xf8, 0x00, 0xb4, 0x1c, 0x6f, 0x82, 0x02, 0x04, 0xfc, 0x42, 0x94, 0x22, 0xa8, - 0x02, 0xb5, 0xf2, 0xde, 0xa2, 0x54, 0x74, 0xa8, 0xaf, 0xc8, 0xb5, 0xf2, 0xfd, 0xa2, - 0x12, 0x78, 0xa8, 0x9a, 0x01, 0xa2, 0x12, 0x78, 0xab, 0x3f, 0xc8, 0xab, 0x18, 0xb0, - 0x32, 0x0e, 0xb5, 0x38, 0x27, 0xb5, 0xfa, 0x87, 0x82, 0x02, 0x08, 0xfc, 0x94, 0x32, - 0xa8, 0x06, 0xb5, 0xf2, 0xc7, 0xa2, 0x64, 0x76, 0xa8, 0xaf, 0xc8, 0xb5, 0xf2, 0xd2, - 0xa2, 0x12, 0x78, 0xa8, 0x9a, 0x02, 0xa2, 0x12, 0x78, 0xab, 0x3f, 0xc8, 0xab, 0x18, - 0xb0, 0x32, 0x0e, 0xb5, 0x37, 0xfc, 0xb7, 0x02, 0x03, 0x02, 0xac, 0x08, 0x04, 0xa8, - 0x06, 0xb7, 0x00, 0x00, 0x06, 0xb4, 0xf4, 0x32, 0xa8, 0x06, 0xb5, 0xf2, 0x81, 0xa2, - 0x54, 0x74, 0xa8, 0xaf, 0xc8, 0xb5, 0xf2, 0xa0, 0xa2, 0x12, 0x78, 0xa8, 0x9a, 0x04, - 0xa2, 0x12, 0x78, 0xab, 0x3f, 0xc8, 0xab, 0x18, 0xb0, 0x32, 0x0e, 0xb5, 0x37, 0xca, - 0xb7, 0x01, 0x04, 0x02, 0xb7, 0x00, 0x04, 0x04, 0xb7, 0x00, 0x00, 0x06, 0x00, 0xb4, - 0xf4, 0x00, 0x36, 0xd4, 0xb7, 0x00, 0x00, 0x0a, 0x80, 0x7e, 0x0a, 0xfc, 0x3c, 0xa8, - 0x0a, 0xb5, 0xf2, 0x6c, 0x90, 0x03, 0xa2, 0x12, 0x78, 0xf9, 0x9d, 0x00, 0x43, 0xa9, - 0x0a, 0x75, 0xa2, 0x12, 0x78, 0xa8, 0x9a, 0x08, 0xa2, 0x12, 0x78, 0xab, 0xa2, 0x10, - 0x78, 0x88, 0xab, 0x18, 0xb0, 0x32, 0x0e, 0xb5, 0x37, 0x88, 0x79, 0xa8, 0x44, 0xbc, - 0x01, 0x04, 0xb4, 0x01, 0xd8, 0xa8, 0x44, 0xbc, 0x01, 0xff, 0xb4, 0x01, 0xc0, 0xa2, - 0x20, 0x72, 0xa8, 0x9c, 0x00, 0xb4, 0x01, 0x8e, 0x9c, 0x01, 0xb4, 0x01, 0x0a, 0x9c, - 0x02, 0x94, 0xc3, 0x9c, 0x03, 0x51, 0x9c, 0x04, 0x94, 0x98, 0x9c, 0x05, 0x94, 0x6e, - 0x9c, 0x06, 0x94, 0x43, 0x9c, 0x07, 0x94, 0x75, 0x3c, 0xa8, 0x44, 0xbc, 0x01, 0xff, - 0x4a, 0xbc, 0x01, 0x01, 0x5b, 0xbc, 0x01, 0x02, 0x94, 0x20, 0x3c, 0xa2, 0x1e, 0x72, - 0x88, 0x9c, 0x04, 0xb4, 0xfd, 0x27, 0xa2, 0x00, 0x72, 0x88, 0x9c, 0x00, 0xb4, 0xfb, - 0xa7, 0xb4, 0xfe, 0xb0, 0xa2, 0x1e, 0x72, 0x88, 0x9c, 0x02, 0xb4, 0xfb, 0xf7, 0x3c, - 0xa2, 0x1e, 0x72, 0x88, 0x9c, 0x04, 0x41, 0x3c, 0x90, 0x05, 0xa2, 0x1e, 0x72, 0x8b, - 0x3c, 0xa8, 0x44, 0xbc, 0x01, 0xff, 0xb4, 0xfd, 0xf7, 0xbc, 0x01, 0x02, 0xb4, 0xfe, - 0x89, 0x3c, 0xa2, 0x10, 0x72, 0x88, 0xb5, 0xf1, 0xab, 0xaf, 0x76, 0xa2, 0x11, 0x72, - 0x88, 0xb5, 0xf1, 0xa2, 0xac, 0x76, 0xcc, 0x3f, 0xce, 0xb4, 0xfd, 0x6f, 0xa8, 0x44, - 0xbc, 0x01, 0xff, 0xb4, 0xfd, 0xd0, 0xbc, 0x01, 0x02, 0xb4, 0xfe, 0x62, 0x3c, 0xa8, - 0x44, 0xbc, 0x01, 0xff, 0xb4, 0xfb, 0x4d, 0xbc, 0x01, 0x01, 0x41, 0x3c, 0xa2, 0x1e, - 0x72, 0x88, 0x9c, 0x02, 0xb4, 0xfd, 0x1e, 0x3c, 0xa8, 0x44, 0xbc, 0x01, 0x04, 0x45, - 0xbc, 0x01, 0x02, 0x4e, 0x3c, 0xa2, 0x1e, 0x72, 0x88, 0x9c, 0x03, 0x46, 0x9c, 0x02, - 0xb4, 0xfb, 0x83, 0x3c, 0xa2, 0x00, 0x72, 0x88, 0x9d, 0x00, 0xb4, 0xfe, 0x29, 0xb4, - 0xfb, 0x1a, 0xa8, 0x44, 0xbc, 0x01, 0x03, 0x53, 0xbc, 0x01, 0x02, 0x58, 0xbc, 0x01, - 0x04, 0x5d, 0xbc, 0x01, 0xff, 0x94, 0x22, 0xbc, 0x01, 0x07, 0x94, 0x26, 0x3c, 0xac, - 0x46, 0x02, 0xac, 0x48, 0x04, 0xb4, 0xfe, 0x30, 0x90, 0x05, 0xa2, 0x1e, 0x72, 0x8b, - 0xb4, 0xfb, 0xe9, 0xa2, 0x1e, 0x72, 0x88, 0x9c, 0x04, 0xb4, 0xfb, 0xe0, 0x3c, 0x90, - 0x04, 0xa2, 0x1e, 0x72, 0x8b, 0xb4, 0xfe, 0xaa, 0xa8, 0x46, 0xb4, 0xfa, 0x3c, 0xa8, - 0x44, 0xbc, 0x01, 0x06, 0x94, 0x26, 0xbc, 0x01, 0x03, 0x57, 0xbc, 0x01, 0x02, 0x50, - 0xbc, 0x01, 0x07, 0x47, 0xbc, 0x01, 0x04, 0xb4, 0xfb, 0xb8, 0x3c, 0xa8, 0x46, 0xb4, - 0xfa, 0x1d, 0xb4, 0xfb, 0xaf, 0xac, 0x46, 0x02, 0xac, 0x48, 0x04, 0x36, 0x19, 0xb4, - 0xfb, 0x79, 0xa2, 0x14, 0x72, 0x88, 0x9c, 0x00, 0x5d, 0xa2, 0x15, 0x72, 0x88, 0x9c, - 0x00, 0x56, 0xa2, 0x1a, 0x72, 0x88, 0x9d, 0x00, 0x4f, 0xa2, 0x1c, 0x72, 0x88, 0x9d, - 0x00, 0x48, 0xa2, 0x22, 0x72, 0xa8, 0x9c, 0x0c, 0x94, 0x29, 0xa2, 0x14, 0x72, 0x88, - 0x9d, 0x00, 0x3c, 0xa2, 0x15, 0x72, 0x88, 0x9c, 0x00, 0x4e, 0xa2, 0x1a, 0x72, 0x88, - 0x9c, 0x00, 0x4c, 0xa2, 0x1c, 0x72, 0x88, 0x9c, 0x00, 0x45, 0x90, 0x01, 0xb4, 0xf7, - 0xe7, 0xa2, 0x22, 0x72, 0xa8, 0x9c, 0x0c, 0x3c, 0x6c, 0x90, 0x00, 0xb4, 0xf7, 0xda, - 0xa8, 0x44, 0xbc, 0x01, 0x01, 0x4f, 0xbc, 0x01, 0x04, 0x41, 0x3c, 0xa2, 0x1e, 0x72, - 0x88, 0x9c, 0x04, 0xb4, 0xfa, 0x44, 0x3c, 0xa2, 0x1e, 0x72, 0x88, 0x9c, 0x02, 0x41, - 0x3c, 0xa2, 0x00, 0x72, 0x88, 0x9c, 0x00, 0xb4, 0xfa, 0x8e, 0xb4, 0xfc, 0x0e, 0xa8, - 0x48, 0xa2, 0x18, 0x72, 0xfc, 0x41, 0x3c, 0x00, 0xa2, 0x18, 0x72, 0xab, 0xb4, 0xfe, - 0x30, 0xa8, 0x48, 0xa2, 0x1e, 0x72, 0x8b, 0xb4, 0xfe, 0x1f, 0xaf, 0xce, 0xac, 0x74, - 0xce, 0xb6, 0xb8, 0x02, 0x88, 0x99, 0x05, 0x9c, 0x00, 0x5a, 0xa2, 0x52, 0xce, 0xa8, - 0x9c, 0x03, 0x41, 0x52, 0xa2, 0x22, 0xce, 0x88, 0xb5, 0x21, 0xbd, 0x90, 0x05, 0x01, - 0xb6, 0xb8, 0x02, 0xd9, 0xb6, 0xb8, 0x02, 0x8b, 0xb6, 0xb8, 0x02, 0x88, 0x99, 0x06, - 0x9c, 0x00, 0x5a, 0xa2, 0x52, 0xce, 0xa8, 0x9c, 0x02, 0x41, 0x52, 0xa2, 0x22, 0xce, - 0x88, 0xb5, 0x21, 0x9a, 0x90, 0x06, 0x01, 0xb6, 0xb8, 0x02, 0xd9, 0xb6, 0xb8, 0x02, - 0x8b, 0xb6, 0xb8, 0x02, 0x88, 0x99, 0x08, 0x9c, 0x00, 0x94, 0x1f, 0xa2, 0x52, 0xce, - 0xa8, 0x9c, 0x01, 0x41, 0x57, 0xa2, 0x22, 0xce, 0x88, 0xb5, 0x21, 0x76, 0x90, 0x08, - 0x01, 0xb6, 0xb8, 0x02, 0xd9, 0xb6, 0xb8, 0x02, 0x8b, 0x00, 0xb6, 0xb8, 0x04, 0xab, - 0x3f, 0xce, 0x3c, 0x00, 0x00, 0x08, 0x00, 0x00, 0x04, 0x0b, 0x00, 0x00, 0x05, 0x00, - 0x01, 0x09, 0x06, 0x00, 0x07, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x02, 0x00, 0x05, 0x00, 0x03, 0x09, 0x0a, 0x00, - 0x00, 0x00, 0x0a, 0x00, 0xb7, 0x00, 0x00, 0x0a, 0x80, 0x7e, 0x0a, 0xfc, 0x3c, 0xa8, - 0x0a, 0xb5, 0xef, 0xb0, 0xa2, 0x14, 0x78, 0x88, 0x9c, 0x00, 0x4b, 0x90, 0x00, 0xa2, - 0x14, 0x78, 0x8b, 0xa8, 0x0a, 0xb5, 0x24, 0xb5, 0xa9, 0x0a, 0x7e, 0x90, 0x00, 0xa2, - 0x66, 0xce, 0xab, 0x90, 0x00, 0xa2, 0x62, 0xce, 0xab, 0xa2, 0x22, 0xce, 0x88, 0xab, - 0x18, 0xb0, 0x40, 0x10, 0xb5, 0x34, 0xc1, 0x90, 0x04, 0xa2, 0x28, 0xce, 0x8b, 0xa2, - 0x22, 0xce, 0x88, 0xab, 0x18, 0xb0, 0x40, 0x0d, 0xb4, 0x34, 0xaf, 0x90, 0x01, 0xa2, - 0x66, 0xce, 0xab, 0x90, 0x03, 0xa2, 0x62, 0xce, 0xab, 0x90, 0x00, 0xa2, 0x64, 0xce, - 0xab, 0xa2, 0x22, 0xce, 0x88, 0xab, 0x18, 0xb0, 0x40, 0x10, 0xb5, 0x34, 0x91, 0xa2, - 0x06, 0xce, 0xa8, 0x9c, 0x03, 0x41, 0x3c, 0xa2, 0x28, 0x72, 0xa8, 0xa2, 0x28, 0x72, - 0xa9, 0x9c, 0x01, 0xb4, 0x13, 0x33, 0x3c, 0x90, 0x02, 0xa2, 0x66, 0xce, 0xab, 0x90, - 0x02, 0xa2, 0x62, 0xce, 0xab, 0x90, 0x01, 0xa2, 0x64, 0xce, 0xab, 0xa2, 0x22, 0xce, - 0x88, 0xab, 0x18, 0xb0, 0x40, 0x10, 0xb5, 0x34, 0x5d, 0xa2, 0x06, 0xce, 0xa8, 0x9c, - 0x03, 0x41, 0x3c, 0xa2, 0x2a, 0x72, 0xa8, 0xa2, 0x2a, 0x72, 0xa9, 0x9c, 0x01, 0xb4, - 0x12, 0xff, 0x3c, 0x90, 0x03, 0xa2, 0x66, 0xce, 0xab, 0x90, 0x05, 0xa2, 0x62, 0xce, - 0xab, 0xa2, 0x06, 0xce, 0xa8, 0x9c, 0x00, 0x52, 0x90, 0x00, 0xa2, 0x64, 0xce, 0xab, - 0xa2, 0x22, 0xce, 0x88, 0xab, 0x18, 0xb0, 0x40, 0x10, 0xb4, 0x34, 0x22, 0x90, 0x01, - 0x72, 0x90, 0x04, 0xa2, 0x66, 0xce, 0xab, 0x90, 0x01, 0xa2, 0x62, 0xce, 0xab, 0xa2, - 0x0a, 0xce, 0xa8, 0x05, 0xa2, 0x64, 0xce, 0xab, 0xa2, 0x22, 0xce, 0x88, 0xab, 0x18, - 0xb0, 0x40, 0x10, 0xb4, 0x33, 0xfe, 0x90, 0x05, 0xa2, 0x66, 0xce, 0xab, 0x90, 0x04, - 0xa2, 0x62, 0xce, 0xab, 0xa2, 0x06, 0xce, 0xa8, 0x9c, 0x00, 0x52, 0x90, 0x00, 0xa2, - 0x64, 0xce, 0xab, 0xa2, 0x22, 0xce, 0x88, 0xab, 0x18, 0xb0, 0x40, 0x10, 0xb4, 0x33, - 0xd9, 0x90, 0x01, 0x72, 0xa2, 0x54, 0xce, 0xa8, 0xb5, 0xee, 0x91, 0xa2, 0x0c, 0x78, - 0xa8, 0xa2, 0x42, 0x74, 0xab, 0xa2, 0x0e, 0x78, 0xa8, 0xa2, 0x44, 0x74, 0xab, 0xa2, - 0x08, 0x78, 0xa8, 0xa2, 0x3e, 0x74, 0xab, 0xa2, 0x0a, 0x78, 0xa8, 0xa2, 0x40, 0x74, - 0xab, 0xa2, 0x04, 0x78, 0xa8, 0xa2, 0x46, 0x74, 0xab, 0xa2, 0x06, 0x78, 0xa8, 0xa2, - 0x48, 0x74, 0xab, 0xa2, 0x10, 0xce, 0xa8, 0xa2, 0x44, 0xce, 0xfd, 0x94, 0x52, 0xa2, - 0x44, 0xce, 0xfc, 0x94, 0x2f, 0xa2, 0x0c, 0xce, 0xa8, 0xa2, 0x40, 0xce, 0xfd, 0x94, - 0x3b, 0xa2, 0x40, 0xce, 0xfc, 0x94, 0x2a, 0xa2, 0x24, 0xce, 0xa8, 0xab, 0xca, 0x90, - 0x00, 0xa2, 0x24, 0xce, 0xab, 0x96, 0xca, 0xfc, 0x94, 0x31, 0xa2, 0x22, 0xce, 0x88, - 0xab, 0x18, 0xb0, 0x2f, 0x07, 0xb5, 0x33, 0x62, 0x94, 0x23, 0xa2, 0x0e, 0xce, 0xa8, - 0xa2, 0x42, 0xce, 0xfd, 0x54, 0x95, 0x38, 0xa2, 0x0a, 0xce, 0xa8, 0xa2, 0x3e, 0xce, - 0xfd, 0x42, 0x95, 0x33, 0x90, 0x02, 0xa2, 0x24, 0xce, 0xab, 0x46, 0x90, 0x01, 0xa2, - 0x24, 0xce, 0xab, 0xa2, 0x24, 0xce, 0xa8, 0x9c, 0x00, 0x3c, 0xb7, 0x04, 0x02, 0x02, - 0xb7, 0x00, 0x00, 0x04, 0xb7, 0x00, 0x00, 0x06, 0xa2, 0x22, 0xce, 0x88, 0xb5, 0xef, - 0x69, 0xb7, 0x04, 0x01, 0x02, 0xb7, 0x00, 0x00, 0x04, 0xb7, 0x00, 0x00, 0x06, 0xa2, - 0x22, 0xce, 0x88, 0xb5, 0xef, 0x56, 0x90, 0x00, 0xa2, 0x56, 0xce, 0xab, 0x90, 0x00, - 0xa2, 0x52, 0xce, 0xab, 0xa2, 0x22, 0xce, 0x88, 0xab, 0x18, 0xb0, 0x2f, 0x07, 0xb4, - 0x32, 0xf8, 0xb7, 0x04, 0x02, 0x02, 0xb7, 0x00, 0x00, 0x04, 0xb7, 0x00, 0x00, 0x06, - 0xa2, 0x22, 0xce, 0x88, 0xb5, 0xef, 0x2b, 0xb7, 0x04, 0x01, 0x02, 0xb7, 0x00, 0x00, - 0x04, 0xb7, 0x00, 0x00, 0x06, 0xa2, 0x22, 0xce, 0x88, 0xb5, 0xef, 0x18, 0x90, 0x00, - 0xa2, 0x56, 0xce, 0xab, 0x90, 0x00, 0xa2, 0x52, 0xce, 0xab, 0xa2, 0x24, 0xce, 0xa8, - 0x9c, 0x00, 0x52, 0x90, 0x00, 0xa2, 0x24, 0xce, 0xab, 0xa2, 0x22, 0xce, 0x88, 0xab, - 0x18, 0xb0, 0x2f, 0x07, 0xb5, 0x32, 0xad, 0xa2, 0x22, 0xce, 0x88, 0xab, 0x18, 0xb0, - 0x20, 0x17, 0xb4, 0x32, 0xa1, 0x90, 0x01, 0xa2, 0x56, 0xce, 0xab, 0x90, 0x03, 0xa2, - 0x52, 0xce, 0xab, 0x90, 0x00, 0xa2, 0x54, 0xce, 0xab, 0x35, 0x47, 0xa2, 0x22, 0xce, - 0x88, 0xab, 0x18, 0xb0, 0x20, 0x17, 0xb5, 0x32, 0x81, 0xa2, 0x52, 0xce, 0xa8, 0x9c, - 0x03, 0x41, 0x3c, 0xb7, 0x04, 0x02, 0x02, 0xb7, 0x00, 0x01, 0x04, 0xb7, 0x00, 0x00, - 0x06, 0xa2, 0x22, 0xce, 0x88, 0xb5, 0xee, 0xac, 0xa2, 0x2c, 0x72, 0xa8, 0xa2, 0x2c, - 0x72, 0xa9, 0x9c, 0x01, 0xb4, 0x11, 0x10, 0x3c, 0x90, 0x02, 0xa2, 0x56, 0xce, 0xab, - 0x90, 0x02, 0xa2, 0x52, 0xce, 0xab, 0x90, 0x01, 0xa2, 0x54, 0xce, 0xab, 0x35, 0x90, - 0xa2, 0x22, 0xce, 0x88, 0xab, 0x18, 0xb0, 0x20, 0x17, 0xb5, 0x32, 0x38, 0xa2, 0x52, - 0xce, 0xa8, 0x9c, 0x02, 0x41, 0x3c, 0xb7, 0x04, 0x02, 0x02, 0xb7, 0x00, 0x01, 0x04, - 0xb7, 0x00, 0x00, 0x06, 0xa2, 0x22, 0xce, 0x88, 0xb5, 0xee, 0x63, 0xa2, 0x2e, 0x72, - 0xa8, 0xa2, 0x2e, 0x72, 0xa9, 0x9c, 0x01, 0xb4, 0x10, 0xc7, 0x3c, 0x90, 0x04, 0xa2, - 0x56, 0xce, 0xab, 0x90, 0x01, 0xa2, 0x52, 0xce, 0xab, 0xa2, 0x06, 0xce, 0xa8, 0x05, - 0xa2, 0x54, 0xce, 0xab, 0x35, 0xdc, 0xa2, 0x22, 0xce, 0x88, 0xab, 0x18, 0xb0, 0x20, - 0x17, 0xb5, 0x31, 0xec, 0xa2, 0x52, 0xce, 0xa8, 0x9c, 0x01, 0x41, 0x3c, 0xb7, 0x04, - 0x01, 0x02, 0xb7, 0x00, 0x01, 0x04, 0xb7, 0x00, 0x00, 0x06, 0xa2, 0x22, 0xce, 0x88, - 0xb4, 0xee, 0x17, 0xa2, 0x66, 0xcc, 0xa8, 0xaf, 0xce, 0x9e, 0x06, 0x3f, 0xce, 0xab, - 0xca, 0xa2, 0x66, 0xce, 0xa8, 0x96, 0xca, 0xf8, 0xb8, 0x54, 0x54, 0xad, 0xc8, 0x88, - 0xab, 0x0c, 0xa2, 0x22, 0x72, 0xab, 0xb7, 0x00, 0x00, 0x18, 0xb0, 0x10, 0x2a, 0xb5, - 0x31, 0xa8, 0xb7, 0x00, 0x00, 0x0a, 0xa2, 0x29, 0xce, 0x88, 0x9c, 0x02, 0x42, 0x94, - 0x25, 0x82, 0x05, 0x0c, 0xfc, 0x4b, 0x82, 0x09, 0x0c, 0xfc, 0x46, 0x82, 0x07, 0x0c, - 0xfc, 0x41, 0x55, 0xb7, 0x00, 0x01, 0x0a, 0x57, 0x82, 0x06, 0x0c, 0xfc, 0x69, 0x82, - 0x0a, 0x0c, 0xfc, 0x6e, 0x82, 0x07, 0x0c, 0xfc, 0x73, 0x47, 0xa2, 0x29, 0xcc, 0x88, - 0x9c, 0x02, 0x76, 0xa2, 0x27, 0x72, 0x88, 0xa0, 0xc8, 0x0a, 0xfc, 0x50, 0xa8, 0x0a, - 0xa2, 0x27, 0x72, 0x8b, 0xb7, 0x00, 0x00, 0x18, 0xb0, 0x10, 0x2e, 0xb5, 0x31, 0x56, - 0xa2, 0x15, 0x72, 0x88, 0x9c, 0x00, 0x3c, 0xb7, 0x01, 0x06, 0x02, 0xb7, 0x00, 0x00, - 0x04, 0xb7, 0x00, 0x00, 0x06, 0x00, 0xb4, 0xed, 0x85, 0xa2, 0x66, 0xce, 0xa8, 0xb8, - 0x54, 0x4e, 0xad, 0xc8, 0x88, 0xa2, 0x22, 0x72, 0xab, 0xab, 0x0a, 0xb7, 0x00, 0x00, - 0x18, 0xb0, 0x10, 0x2a, 0xb5, 0x31, 0x25, 0xb7, 0x00, 0x00, 0x0c, 0xa2, 0x29, 0xce, - 0x88, 0x9c, 0x02, 0x57, 0xa2, 0x27, 0x72, 0x88, 0x9c, 0x0c, 0x3c, 0xa8, 0x0c, 0xa2, - 0x27, 0x72, 0x8b, 0xb7, 0x00, 0x00, 0x18, 0xb0, 0x10, 0x2e, 0xb4, 0x31, 0x03, 0xa2, - 0x28, 0xce, 0x88, 0x9c, 0x02, 0x7d, 0x82, 0x08, 0x0a, 0xfc, 0x47, 0x82, 0x0b, 0x0a, - 0xfc, 0x42, 0x95, 0x28, 0xb7, 0x00, 0x01, 0x0c, 0x95, 0x2e, 0xa2, 0x66, 0xce, 0xa8, - 0x9c, 0x00, 0x56, 0x9c, 0x02, 0x94, 0xaa, 0x9c, 0x03, 0xb4, 0x01, 0x0c, 0x9c, 0x04, - 0xb4, 0x01, 0x66, 0x9c, 0x05, 0xb4, 0x01, 0x8d, 0xb4, 0x01, 0xf4, 0xa2, 0x3a, 0xce, - 0x88, 0x9c, 0x00, 0x56, 0xa2, 0x57, 0xce, 0x88, 0x9c, 0x00, 0x4f, 0x37, 0xbc, 0xb6, - 0xb8, 0x02, 0x88, 0x9a, 0x02, 0xb6, 0xb8, 0x02, 0x8b, 0xb4, 0x01, 0xd7, 0xa2, 0x3a, - 0xce, 0x88, 0x9c, 0x00, 0x5d, 0xa2, 0x56, 0xce, 0x88, 0x9c, 0x00, 0x56, 0xa2, 0x3a, - 0xcc, 0x88, 0x9c, 0x00, 0x4f, 0x37, 0xac, 0xb6, 0xb8, 0x02, 0x88, 0x9a, 0x02, 0xb6, - 0xb8, 0x02, 0x8b, 0xb4, 0x01, 0xb3, 0xa2, 0x39, 0xce, 0x88, 0x9c, 0x00, 0x5e, 0xa2, - 0x5e, 0xce, 0x88, 0x9c, 0x00, 0x57, 0x37, 0xa1, 0xb6, 0xb8, 0x02, 0x88, 0x9a, 0x08, - 0xb6, 0xb8, 0x02, 0x8b, 0xa2, 0x0a, 0xce, 0xa8, 0xb6, 0xb8, 0x04, 0xab, 0xb4, 0x01, - 0x8e, 0xa2, 0x3a, 0xce, 0x88, 0x9c, 0x00, 0xb4, 0x01, 0x85, 0xa2, 0x58, 0xce, 0x88, - 0x9c, 0x00, 0xb4, 0x01, 0x7c, 0x37, 0xa9, 0xb6, 0xb8, 0x02, 0x88, 0x9a, 0x04, 0xb6, - 0xb8, 0x02, 0x8b, 0xb4, 0x01, 0x6d, 0x90, 0x01, 0xb5, 0xeb, 0x03, 0x90, 0x01, 0xa2, - 0x14, 0x78, 0x8b, 0xb5, 0xfb, 0x5f, 0xb4, 0x01, 0x5c, 0xa2, 0x3a, 0xce, 0x88, 0x9c, - 0x00, 0x77, 0xa2, 0x3c, 0xce, 0x88, 0x9d, 0x00, 0x7e, 0xa2, 0x3a, 0xce, 0x88, 0x9c, - 0x00, 0x94, 0x1f, 0xa2, 0x56, 0xce, 0x88, 0x9c, 0x00, 0x58, 0xa2, 0x3a, 0xcc, 0x88, - 0x9c, 0x00, 0x51, 0x90, 0x01, 0xb5, 0xea, 0xce, 0x90, 0x01, 0xa2, 0x14, 0x78, 0x8b, - 0xb5, 0xfb, 0xbc, 0xb4, 0x01, 0x27, 0xa2, 0x3a, 0xce, 0x88, 0x9c, 0x00, 0xb4, 0x01, - 0x1e, 0xa2, 0x58, 0xce, 0x88, 0x9c, 0x00, 0xb4, 0x01, 0x15, 0xb5, 0xfb, 0xed, 0xb6, - 0xb8, 0x02, 0x88, 0x9a, 0x04, 0xb6, 0xb8, 0x02, 0x8b, 0xb4, 0x01, 0x05, 0x90, 0x01, - 0xb5, 0xea, 0x9b, 0x90, 0x01, 0xa2, 0x14, 0x78, 0x8b, 0xb5, 0xfa, 0xf7, 0x94, 0xf5, - 0xa2, 0x3a, 0xce, 0x88, 0x9c, 0x00, 0x76, 0xa2, 0x3c, 0xce, 0x88, 0x9d, 0x00, 0x7d, - 0xa2, 0x3a, 0xce, 0x88, 0x9c, 0x00, 0x57, 0xa2, 0x57, 0xce, 0x88, 0x9c, 0x00, 0x50, - 0x90, 0x01, 0xb5, 0xea, 0x6f, 0x90, 0x01, 0xa2, 0x14, 0x78, 0x8b, 0xb5, 0xfb, 0x29, - 0x94, 0xc9, 0xa2, 0x3a, 0xce, 0x88, 0x9c, 0x00, 0x94, 0xc1, 0xa2, 0x58, 0xce, 0x88, - 0x9c, 0x00, 0x94, 0xb9, 0x90, 0x01, 0xb5, 0xea, 0x4f, 0x90, 0x01, 0xa2, 0x14, 0x78, - 0x8b, 0xb5, 0xfb, 0x86, 0x94, 0xa9, 0xa2, 0x0a, 0xce, 0xa8, 0x05, 0xb5, 0xea, 0x3c, - 0x90, 0x01, 0xa2, 0x14, 0x78, 0x8b, 0xb5, 0xfa, 0x98, 0x94, 0x96, 0xa2, 0x39, 0xce, - 0x88, 0x9c, 0x00, 0x79, 0xa2, 0x5e, 0xce, 0x88, 0x9c, 0x00, 0x95, 0x20, 0x94, 0x85, - 0x90, 0x00, 0xb5, 0xea, 0x1b, 0x90, 0x01, 0xa2, 0x14, 0x78, 0x8b, 0x90, 0x01, 0xb5, - 0xea, 0x10, 0x90, 0x01, 0xa2, 0x14, 0x78, 0x8b, 0xb5, 0xfa, 0x6c, 0x94, 0x6a, 0xa2, - 0x3a, 0xce, 0x88, 0x9c, 0x00, 0x95, 0x21, 0xa2, 0x3c, 0xce, 0x88, 0x9d, 0x00, 0x95, - 0x29, 0xa2, 0x3a, 0xce, 0x88, 0x9c, 0x00, 0x94, 0x22, 0xa2, 0x57, 0xce, 0x88, 0x9c, - 0x00, 0x5b, 0x90, 0x00, 0xb5, 0xe9, 0xe1, 0x90, 0x01, 0xa2, 0x14, 0x78, 0x8b, 0x90, - 0x01, 0xb5, 0xe9, 0xd6, 0x90, 0x01, 0xa2, 0x14, 0x78, 0x8b, 0xb5, 0xfa, 0x90, 0x94, - 0x30, 0xa2, 0x3a, 0xce, 0x88, 0x9c, 0x00, 0x94, 0x28, 0xa2, 0x56, 0xce, 0x88, 0x9c, - 0x00, 0x94, 0x20, 0xa2, 0x3a, 0xcc, 0x88, 0x9c, 0x00, 0x59, 0x90, 0x00, 0xb5, 0xe9, - 0xaf, 0x90, 0x01, 0xa2, 0x14, 0x78, 0x8b, 0x90, 0x01, 0xb5, 0xe9, 0xa4, 0x90, 0x01, - 0xa2, 0x14, 0x78, 0x8b, 0xb5, 0xfa, 0x92, 0xa2, 0x66, 0xcc, 0xa8, 0x9c, 0x00, 0x54, - 0x9c, 0x01, 0x94, 0xae, 0x9c, 0x03, 0xb4, 0x01, 0x0e, 0x9c, 0x04, 0xb4, 0x01, 0x69, - 0x9c, 0x05, 0xb4, 0x01, 0x90, 0x3c, 0xa2, 0x3a, 0xcc, 0x88, 0x9c, 0x00, 0x58, 0xa2, - 0x57, 0xcc, 0x88, 0x9c, 0x00, 0x51, 0xac, 0xcc, 0xce, 0xb5, 0xf9, 0xfb, 0xb6, 0xb8, - 0x02, 0x88, 0x9a, 0x01, 0xb6, 0xb8, 0x02, 0x8b, 0x3c, 0xa2, 0x3a, 0xcc, 0x88, 0x9c, - 0x00, 0x94, 0x1f, 0xa2, 0x56, 0xcc, 0x88, 0x9c, 0x00, 0x58, 0xa2, 0x3a, 0xce, 0x88, - 0x9c, 0x00, 0x51, 0xac, 0xcc, 0xce, 0xb5, 0xfa, 0x3c, 0xb6, 0xb8, 0x02, 0x88, 0x9a, - 0x01, 0xb6, 0xb8, 0x02, 0x8b, 0x3c, 0xa2, 0x39, 0xcc, 0x88, 0x9c, 0x00, 0x94, 0x20, - 0xa2, 0x5e, 0xcc, 0x88, 0x9c, 0x00, 0x59, 0xac, 0xcc, 0xce, 0xb5, 0xfa, 0x44, 0xb6, - 0xb8, 0x02, 0x88, 0x9a, 0x08, 0xb6, 0xb8, 0x02, 0x8b, 0xa2, 0x0a, 0xcc, 0xa8, 0xb6, - 0xb8, 0x04, 0xab, 0x3c, 0xa2, 0x3a, 0xcc, 0x88, 0x9c, 0x00, 0x3c, 0xa2, 0x58, 0xcc, - 0x88, 0x9c, 0x00, 0x3c, 0xac, 0xcc, 0xce, 0xb5, 0xfa, 0x3e, 0xb6, 0xb8, 0x02, 0x88, - 0x9a, 0x04, 0xb6, 0xb8, 0x02, 0x8b, 0x3c, 0x90, 0x00, 0xb5, 0xe8, 0xee, 0x90, 0x01, - 0xa2, 0x14, 0x78, 0x8b, 0xac, 0xcc, 0xce, 0xb4, 0xf9, 0x47, 0xa2, 0x3a, 0xcc, 0x88, - 0x9c, 0x00, 0x77, 0xa2, 0x3c, 0xcc, 0x88, 0x9d, 0x00, 0x7e, 0xa2, 0x3a, 0xcc, 0x88, - 0x9c, 0x00, 0x94, 0x1f, 0xa2, 0x56, 0xcc, 0x88, 0x9c, 0x00, 0x58, 0xa2, 0x3a, 0xce, - 0x88, 0x9c, 0x00, 0x51, 0x90, 0x00, 0xb5, 0xe8, 0xb9, 0x90, 0x01, 0xa2, 0x14, 0x78, - 0x8b, 0xac, 0xcc, 0xce, 0xb4, 0xf9, 0xa4, 0xa2, 0x3a, 0xcc, 0x88, 0x9c, 0x00, 0x3c, - 0xa2, 0x58, 0xcc, 0x88, 0x9c, 0x00, 0x3c, 0xac, 0xcc, 0xce, 0xb5, 0xf9, 0xd9, 0xb6, - 0xb8, 0x02, 0x88, 0x9a, 0x04, 0xb6, 0xb8, 0x02, 0x8b, 0x3c, 0x90, 0x00, 0xb5, 0xe8, - 0x89, 0x90, 0x01, 0xa2, 0x14, 0x78, 0x8b, 0xac, 0xcc, 0xce, 0xb4, 0xf8, 0xe2, 0xa2, - 0x3a, 0xcc, 0x88, 0x9c, 0x00, 0x77, 0xa2, 0x3c, 0xcc, 0x88, 0x9d, 0x00, 0x7e, 0xa2, - 0x3a, 0xcc, 0x88, 0x9c, 0x00, 0x58, 0xa2, 0x57, 0xcc, 0x88, 0x9c, 0x00, 0x51, 0x90, - 0x00, 0xb5, 0xe8, 0x5c, 0x90, 0x01, 0xa2, 0x14, 0x78, 0x8b, 0xac, 0xcc, 0xce, 0xb4, - 0xf8, 0xdf, 0xa2, 0x3a, 0xcc, 0x88, 0x9c, 0x00, 0x3c, 0xa2, 0x58, 0xcc, 0x88, 0x9c, - 0x00, 0x3c, 0x90, 0x00, 0xb5, 0xe8, 0x3d, 0x90, 0x01, 0xa2, 0x14, 0x78, 0x8b, 0xac, - 0xcc, 0xce, 0xb4, 0xf9, 0x71, 0xa2, 0x0a, 0xcc, 0xa8, 0x05, 0xb5, 0xe8, 0x29, 0x90, - 0x01, 0xa2, 0x14, 0x78, 0x8b, 0xac, 0xcc, 0xce, 0xb4, 0xf8, 0x82, 0xa2, 0x39, 0xcc, - 0x88, 0x9c, 0x00, 0x7a, 0xa2, 0x5e, 0xcc, 0x88, 0x9c, 0x00, 0x95, 0x21, 0x3c, 0x90, - 0x00, 0xb5, 0xe8, 0x08, 0x90, 0x01, 0xa2, 0x14, 0x78, 0x8b, 0x90, 0x01, 0xb5, 0xe7, - 0xfd, 0x90, 0x01, 0xa2, 0x14, 0x78, 0x8b, 0xac, 0xcc, 0xce, 0xb4, 0xf8, 0x56, 0xa2, - 0x3a, 0xcc, 0x88, 0x9c, 0x00, 0x95, 0x22, 0xa2, 0x3c, 0xcc, 0x88, 0x9d, 0x00, 0x95, - 0x2a, 0xa2, 0x3a, 0xcc, 0x88, 0x9c, 0x00, 0x94, 0x23, 0xa2, 0x57, 0xcc, 0x88, 0x9c, - 0x00, 0x5c, 0x90, 0x00, 0xb5, 0xe7, 0xcd, 0x90, 0x01, 0xa2, 0x14, 0x78, 0x8b, 0x90, - 0x01, 0xb5, 0xe7, 0xc2, 0x90, 0x01, 0xa2, 0x14, 0x78, 0x8b, 0xac, 0xcc, 0xce, 0xb4, - 0xf8, 0x45, 0xa2, 0x3a, 0xcc, 0x88, 0x9c, 0x00, 0x3c, 0xa2, 0x56, 0xcc, 0x88, 0x9c, - 0x00, 0x3c, 0xa2, 0x3a, 0xce, 0x88, 0x9c, 0x00, 0x3c, 0x90, 0x00, 0xb5, 0xe7, 0x9c, - 0x90, 0x01, 0xa2, 0x14, 0x78, 0x8b, 0x90, 0x01, 0xb5, 0xe7, 0x91, 0x90, 0x01, 0xa2, - 0x14, 0x78, 0x8b, 0xac, 0xcc, 0xce, 0xb4, 0xf8, 0x7c, 0xa2, 0x66, 0xce, 0xa8, 0x9c, - 0x00, 0x4e, 0x9c, 0x01, 0x94, 0x84, 0x9c, 0x02, 0x94, 0xd9, 0x9c, 0x04, 0xb4, 0x01, - 0x1a, 0x3c, 0xa2, 0x3a, 0xce, 0x88, 0x9c, 0x00, 0x55, 0xa2, 0x59, 0xce, 0x88, 0x9c, - 0x00, 0x4e, 0xb5, 0xf7, 0xee, 0xb6, 0xb8, 0x02, 0x88, 0x9a, 0x01, 0xb6, 0xb8, 0x02, - 0x8b, 0x3c, 0xa2, 0x3a, 0xce, 0x88, 0x9c, 0x00, 0x55, 0xa2, 0x5a, 0xce, 0x88, 0x9c, - 0x00, 0x4e, 0xb5, 0xf8, 0x06, 0xb6, 0xb8, 0x02, 0x88, 0x9a, 0x02, 0xb6, 0xb8, 0x02, - 0x8b, 0x3c, 0xa2, 0x39, 0xce, 0x88, 0x9c, 0x00, 0x3c, 0xa2, 0x5e, 0xce, 0x88, 0x9c, - 0x00, 0x3c, 0xb5, 0xf8, 0x46, 0xb6, 0xb8, 0x02, 0x88, 0x9a, 0x08, 0xb6, 0xb8, 0x02, - 0x8b, 0xa2, 0x0a, 0xce, 0xa8, 0xb6, 0xb8, 0x04, 0xab, 0x3c, 0x90, 0x00, 0xb5, 0xe7, - 0x0f, 0x90, 0x01, 0xa2, 0x14, 0x78, 0x8b, 0xb5, 0xf7, 0x6b, 0xa2, 0x28, 0x72, 0xa8, - 0x05, 0xa2, 0x28, 0x72, 0xab, 0x04, 0x9c, 0x00, 0xb4, 0x0a, 0xec, 0x3c, 0xa2, 0x3a, - 0xce, 0x88, 0x9c, 0x00, 0x95, 0x24, 0xa2, 0x3c, 0xce, 0x88, 0x9d, 0x00, 0x95, 0x2c, - 0xa2, 0x3a, 0xce, 0x88, 0x9c, 0x00, 0x3c, 0xa2, 0x5a, 0xce, 0x88, 0x9c, 0x00, 0x3c, - 0xb5, 0xf7, 0x98, 0xb6, 0xb8, 0x02, 0x88, 0x9a, 0x02, 0xb6, 0xb8, 0x02, 0x8b, 0xa2, - 0x28, 0x72, 0xa8, 0x05, 0xa2, 0x28, 0x72, 0xab, 0x04, 0x9c, 0x00, 0xb4, 0x0a, 0xb1, - 0x3c, 0x90, 0x01, 0xb5, 0xe6, 0xb6, 0x90, 0x01, 0xa2, 0x14, 0x78, 0x8b, 0xb5, 0xf7, - 0x12, 0xa2, 0x2a, 0x72, 0xa8, 0x05, 0xa2, 0x2a, 0x72, 0xab, 0x04, 0x9c, 0x00, 0xb4, - 0x0a, 0x93, 0x3c, 0xa2, 0x3a, 0xce, 0x88, 0x9c, 0x00, 0x95, 0x24, 0xa2, 0x3c, 0xce, - 0x88, 0x9d, 0x00, 0x95, 0x2c, 0xa2, 0x3a, 0xce, 0x88, 0x9c, 0x00, 0x3c, 0xa2, 0x59, - 0xce, 0x88, 0x9c, 0x00, 0x3c, 0x90, 0x01, 0xb5, 0xe6, 0x7a, 0x90, 0x01, 0xa2, 0x14, - 0x78, 0x8b, 0xb5, 0xf7, 0x00, 0xb6, 0xb8, 0x02, 0x88, 0x9a, 0x01, 0xb6, 0xb8, 0x02, - 0x8b, 0xa2, 0x2a, 0x72, 0xa8, 0x05, 0xa2, 0x2a, 0x72, 0xab, 0x04, 0x9c, 0x00, 0xb4, - 0x0a, 0x4d, 0x3c, 0xa2, 0x39, 0xce, 0x88, 0x9c, 0x00, 0x48, 0xa2, 0x5e, 0xce, 0x88, - 0x9c, 0x00, 0x41, 0x3c, 0xa2, 0x0a, 0xce, 0xa8, 0x05, 0xb5, 0xe6, 0x40, 0x90, 0x01, - 0xa2, 0x14, 0x78, 0x8b, 0xb4, 0xf6, 0x9c, 0xa2, 0x66, 0xce, 0xa8, 0x9c, 0x00, 0x4d, - 0x9c, 0x01, 0x94, 0x73, 0x9c, 0x04, 0x94, 0x99, 0x9c, 0x05, 0x94, 0xce, 0x3c, 0xa2, - 0x3a, 0xce, 0x88, 0x9c, 0x00, 0x55, 0xa2, 0x57, 0xce, 0x88, 0x9c, 0x00, 0x4e, 0xb5, - 0xf6, 0xa1, 0xb6, 0xb8, 0x02, 0x88, 0x9a, 0x01, 0xb6, 0xb8, 0x02, 0x8b, 0x3c, 0xa2, - 0x39, 0xce, 0x88, 0x9c, 0x00, 0x5d, 0xa2, 0x5e, 0xce, 0x88, 0x9c, 0x00, 0x56, 0xb5, - 0xf7, 0x15, 0xb6, 0xb8, 0x02, 0x88, 0x9a, 0x08, 0xb6, 0xb8, 0x02, 0x8b, 0xa2, 0x0a, - 0xce, 0xa8, 0xb6, 0xb8, 0x04, 0xab, 0x3c, 0xa2, 0x3a, 0xce, 0x88, 0x9c, 0x00, 0x3c, - 0xa2, 0x58, 0xce, 0x88, 0x9c, 0x00, 0x3c, 0xb5, 0xf7, 0x12, 0xb6, 0xb8, 0x02, 0x88, - 0x9a, 0x04, 0xb6, 0xb8, 0x02, 0x8b, 0x3c, 0x90, 0x00, 0xb5, 0xe5, 0xc2, 0x90, 0x01, - 0xa2, 0x14, 0x78, 0x8b, 0xb4, 0xf6, 0x1e, 0xa2, 0x3a, 0xce, 0x88, 0x9c, 0x00, 0x74, - 0xa2, 0x3c, 0xce, 0x88, 0x9d, 0x00, 0x7b, 0xa2, 0x3a, 0xce, 0x88, 0x9c, 0x00, 0x3c, - 0xa2, 0x58, 0xce, 0x88, 0x9c, 0x00, 0x3c, 0xb5, 0xf6, 0xda, 0xb6, 0xb8, 0x02, 0x88, - 0x9a, 0x01, 0xb6, 0xb8, 0x02, 0x8b, 0x3c, 0xa2, 0x39, 0xce, 0x88, 0x9c, 0x00, 0x48, - 0xa2, 0x5e, 0xce, 0x88, 0x9c, 0x00, 0x41, 0x3c, 0xa2, 0x0a, 0xce, 0xa8, 0x05, 0xb5, - 0xe5, 0x78, 0x90, 0x01, 0xa2, 0x14, 0x78, 0x8b, 0xb4, 0xf5, 0xd4, 0x90, 0x00, 0xb5, - 0xe5, 0x6a, 0x90, 0x01, 0xa2, 0x14, 0x78, 0x8b, 0x90, 0x01, 0xb5, 0xe5, 0x5f, 0x90, - 0x01, 0xa2, 0x14, 0x78, 0x8b, 0xb4, 0xf5, 0xbb, 0xa2, 0x3a, 0xce, 0x88, 0x9c, 0x00, - 0x7f, 0xa2, 0x3c, 0xce, 0x88, 0x9d, 0x00, 0x95, 0x26, 0xa2, 0x3a, 0xce, 0x88, 0x9c, - 0x00, 0x3c, 0xa2, 0x57, 0xce, 0x88, 0x9c, 0x00, 0x3c, 0x90, 0x00, 0xb5, 0xe5, 0x34, - 0x90, 0x01, 0xa2, 0x14, 0x78, 0x8b, 0x90, 0x01, 0xb5, 0xe5, 0x29, 0x90, 0x01, 0xa2, - 0x14, 0x78, 0x8b, 0xb4, 0xf5, 0xaf, 0xa2, 0x56, 0xce, 0xa8, 0x9c, 0x00, 0x4e, 0x9c, - 0x01, 0x94, 0x28, 0x9c, 0x02, 0xb4, 0x01, 0x19, 0x9c, 0x04, 0x94, 0x9a, 0x3c, 0xa2, - 0x4a, 0xce, 0x88, 0x9c, 0x00, 0x43, 0xb4, 0xf7, 0x9e, 0xa2, 0x4b, 0xce, 0x88, 0x9c, - 0x00, 0x43, 0xb4, 0xf7, 0xdd, 0xa2, 0x4c, 0xce, 0x88, 0x9c, 0x00, 0x3c, 0xb4, 0xf8, - 0x1c, 0xa2, 0x4a, 0xce, 0x88, 0xa2, 0x4b, 0xce, 0xda, 0x9c, 0x00, 0x94, 0x51, 0xa2, - 0x4b, 0xce, 0x88, 0x9c, 0x00, 0x3c, 0xb7, 0x04, 0x02, 0x02, 0xb7, 0x00, 0x00, 0x04, - 0xb7, 0x00, 0x00, 0x06, 0xa2, 0x22, 0xce, 0x88, 0xb5, 0xe6, 0x4b, 0x90, 0x00, 0xb5, - 0xe4, 0xc2, 0x90, 0x01, 0xa2, 0x14, 0x78, 0x8b, 0xb5, 0xf7, 0x9f, 0xa2, 0x2c, 0x72, - 0xa8, 0x05, 0xa2, 0x2c, 0x72, 0xab, 0x04, 0x9c, 0x00, 0xb5, 0x08, 0x9f, 0xa2, 0x2f, - 0xce, 0x88, 0x9c, 0x00, 0x3c, 0xa2, 0x1a, 0x72, 0xa8, 0x05, 0xa2, 0x1a, 0x72, 0xab, - 0xa2, 0x1c, 0x72, 0xa8, 0x04, 0xa2, 0x1c, 0x72, 0xab, 0x3c, 0x90, 0x00, 0xb5, 0xe4, - 0x8b, 0x90, 0x01, 0xa2, 0x14, 0x78, 0x8b, 0xb5, 0xf6, 0xc8, 0xa2, 0x2c, 0x72, 0xa8, - 0x05, 0xa2, 0x2c, 0x72, 0xab, 0x04, 0x9c, 0x00, 0xb4, 0x08, 0x68, 0x3c, 0xa2, 0x4a, - 0xce, 0x88, 0xa2, 0x4b, 0xce, 0xda, 0x9c, 0x00, 0x94, 0x51, 0xa2, 0x4a, 0xce, 0x88, - 0x9c, 0x00, 0x3c, 0xb7, 0x04, 0x02, 0x02, 0xb7, 0x00, 0x00, 0x04, 0xb7, 0x00, 0x00, - 0x06, 0xa2, 0x22, 0xce, 0x88, 0xb5, 0xe5, 0xd0, 0x90, 0x01, 0xb5, 0xe4, 0x47, 0x90, - 0x01, 0xa2, 0x14, 0x78, 0x8b, 0xb5, 0xf6, 0xdb, 0xa2, 0x2e, 0x72, 0xa8, 0x05, 0xa2, - 0x2e, 0x72, 0xab, 0x04, 0x9c, 0x00, 0xb5, 0x08, 0x24, 0xa2, 0x2f, 0xce, 0x88, 0x9c, - 0x00, 0x3c, 0xa2, 0x1a, 0x72, 0xa8, 0x04, 0xa2, 0x1a, 0x72, 0xab, 0xa2, 0x1c, 0x72, - 0xa8, 0x05, 0xa2, 0x1c, 0x72, 0xab, 0x3c, 0x90, 0x01, 0xb5, 0xe4, 0x10, 0x90, 0x01, - 0xa2, 0x14, 0x78, 0x8b, 0xb5, 0xf6, 0xed, 0xa2, 0x2e, 0x72, 0xa8, 0x05, 0xa2, 0x2e, - 0x72, 0xab, 0x04, 0x9c, 0x00, 0xb4, 0x07, 0xed, 0x3c, 0xa2, 0x4c, 0xce, 0x88, 0x9d, - 0x00, 0x3c, 0xa2, 0x06, 0xce, 0xa8, 0x05, 0xb5, 0xe3, 0xe8, 0x90, 0x01, 0xa2, 0x14, - 0x78, 0x8b, 0xb4, 0xf6, 0x25, 0x00, 0xb6, 0xb8, 0x02, 0x8b, 0xb6, 0xb8, 0x04, 0xab, - 0xa2, 0x06, 0xce, 0xa8, 0x9c, 0x00, 0xb4, 0x05, 0x1e, 0x9c, 0x01, 0xb4, 0x05, 0x19, - 0x9c, 0x02, 0xb4, 0x03, 0x4d, 0x9c, 0x03, 0xb4, 0x06, 0x18, 0xa2, 0x06, 0xce, 0xa8, - 0x9c, 0x00, 0x4e, 0x9c, 0x01, 0x4b, 0x9c, 0x02, 0xb4, 0x02, 0x1a, 0x9c, 0x03, 0xb4, - 0x02, 0xa1, 0x3c, 0xa2, 0x26, 0x72, 0x88, 0x9c, 0x00, 0x59, 0xa2, 0x3a, 0x0c, 0x88, - 0x9c, 0x00, 0x52, 0x90, 0x01, 0xa2, 0x56, 0x0a, 0x8b, 0x90, 0x00, 0xa2, 0x58, 0x0a, - 0x8b, 0xa2, 0x57, 0x0a, 0x8b, 0x94, 0xa2, 0xa2, 0x5b, 0x0c, 0x88, 0x9c, 0x00, 0x5b, - 0xa2, 0x3a, 0x0c, 0x88, 0x9c, 0x00, 0x54, 0x94, 0x2f, 0x90, 0x00, 0xa2, 0x56, 0x0a, - 0x8b, 0xa2, 0x57, 0x0a, 0x8b, 0x90, 0x01, 0xa2, 0x58, 0x0a, 0x8b, 0x94, 0x80, 0xa2, - 0x5b, 0x0a, 0x88, 0x9d, 0x00, 0x78, 0xa2, 0x5f, 0x0a, 0x88, 0x9c, 0x00, 0x4f, 0xa2, - 0x5f, 0x0c, 0x88, 0x9c, 0x00, 0x94, 0x20, 0xa2, 0x3a, 0x0c, 0x88, 0x9c, 0x00, 0x59, - 0xa2, 0x5b, 0x0c, 0x88, 0x9c, 0x00, 0x48, 0xa2, 0x3a, 0x0c, 0x88, 0x9c, 0x00, 0x41, - 0x5c, 0xa2, 0x5d, 0x0a, 0x88, 0x9d, 0x00, 0x94, 0x3b, 0x94, 0x22, 0xa2, 0x5c, 0x0c, - 0x88, 0x9c, 0x00, 0x95, 0x4e, 0xa2, 0x3a, 0x0c, 0x88, 0x9c, 0x00, 0x95, 0x56, 0x95, - 0x29, 0x90, 0x00, 0xa2, 0x56, 0x0a, 0x8b, 0xa2, 0x58, 0x0a, 0x8b, 0xa2, 0x57, 0x0a, - 0x8b, 0x94, 0x28, 0xa2, 0x61, 0x0a, 0x88, 0x9c, 0x00, 0x76, 0xa2, 0x5f, 0x0c, 0x88, - 0x9c, 0x00, 0x49, 0xa2, 0x3a, 0x0c, 0x88, 0x9c, 0x00, 0x42, 0x95, 0x25, 0x90, 0x00, - 0xa2, 0x56, 0x0a, 0x8b, 0xa2, 0x58, 0x0a, 0x8b, 0x90, 0x01, 0xa2, 0x57, 0x0a, 0x8b, - 0x40, 0xa2, 0x3c, 0x0a, 0x88, 0xab, 0x0e, 0xa2, 0x56, 0x0a, 0x88, 0xa2, 0x57, 0x0a, - 0xda, 0xa2, 0x58, 0x0a, 0xda, 0x9c, 0x00, 0x94, 0x3b, 0x90, 0x00, 0xa2, 0x3c, 0x0a, - 0x8b, 0x96, 0x0e, 0xfc, 0x51, 0xb7, 0x02, 0x13, 0x02, 0xab, 0x04, 0xb7, 0x00, 0x00, - 0x06, 0xa2, 0x22, 0x0a, 0x88, 0xb5, 0xe4, 0x3a, 0xa2, 0x26, 0x72, 0x88, 0x9c, 0x00, - 0x5d, 0xa2, 0x3a, 0x0a, 0x88, 0x9c, 0x00, 0x56, 0x90, 0x01, 0xa2, 0x56, 0x0c, 0x8b, - 0x90, 0x00, 0xa2, 0x58, 0x0c, 0x8b, 0xa2, 0x57, 0x0c, 0x8b, 0x94, 0x90, 0x90, 0x01, - 0x95, 0x3b, 0xa2, 0x5b, 0x0c, 0x88, 0x9d, 0x00, 0x58, 0xa2, 0x5f, 0x0c, 0x88, 0x9c, - 0x00, 0x94, 0x30, 0xa2, 0x5b, 0x0a, 0x88, 0x9c, 0x00, 0x5b, 0xa2, 0x3a, 0x0a, 0x88, - 0x9c, 0x00, 0x54, 0x94, 0x20, 0x90, 0x00, 0xa2, 0x56, 0x0c, 0x8b, 0xa2, 0x57, 0x0c, - 0x8b, 0x90, 0x01, 0xa2, 0x58, 0x0c, 0x8b, 0x94, 0x5b, 0xa2, 0x5d, 0x0a, 0x88, 0x9c, - 0x00, 0x78, 0xa2, 0x3a, 0x0a, 0x88, 0x9c, 0x00, 0x7f, 0xa2, 0x3a, 0x0a, 0x88, 0x9c, - 0x00, 0x48, 0xa2, 0x5b, 0x0a, 0x88, 0x9c, 0x00, 0x41, 0x5e, 0xa2, 0x5c, 0x0c, 0x88, - 0x9d, 0x00, 0x94, 0x25, 0xa2, 0x60, 0x0c, 0x88, 0x9c, 0x00, 0x4f, 0xa2, 0x5f, 0x0a, - 0x88, 0x9c, 0x00, 0x57, 0xa2, 0x3a, 0x0a, 0x88, 0x9c, 0x00, 0x50, 0x40, 0x90, 0x00, - 0xa2, 0x56, 0x0c, 0x8b, 0xa2, 0x58, 0x0c, 0x8b, 0xa2, 0x57, 0x0c, 0x8b, 0x51, 0x90, - 0x00, 0xa2, 0x56, 0x0c, 0x8b, 0xa2, 0x58, 0x0c, 0x8b, 0x90, 0x01, 0xa2, 0x57, 0x0c, - 0x8b, 0x40, 0xa2, 0x3c, 0x0c, 0x88, 0xab, 0x0e, 0xa2, 0x56, 0x0c, 0x88, 0xa2, 0x57, - 0x0c, 0xda, 0xa2, 0x58, 0x0c, 0xda, 0x9c, 0x00, 0x94, 0x57, 0x90, 0x00, 0xa2, 0x3c, - 0x0c, 0x8b, 0x96, 0x0e, 0xfc, 0x51, 0xb7, 0x02, 0x13, 0x02, 0xab, 0x04, 0xb7, 0x00, - 0x00, 0x06, 0xa2, 0x22, 0x0c, 0x88, 0xb5, 0xe3, 0x59, 0xa2, 0x66, 0x0a, 0xa8, 0xaf, - 0xc8, 0xa2, 0x66, 0x0c, 0xa8, 0xaf, 0xc8, 0xac, 0x0a, 0xce, 0xac, 0x0c, 0xcc, 0xb5, - 0xf6, 0x14, 0x3f, 0xc8, 0xa2, 0x66, 0x0c, 0xfc, 0x58, 0x3f, 0xc8, 0xac, 0x0a, 0xce, - 0xac, 0x0c, 0xcc, 0xb5, 0xf5, 0x1b, 0xb5, 0xf1, 0xed, 0xa2, 0x22, 0x72, 0xa8, 0xb5, - 0x10, 0x93, 0xb4, 0xf1, 0x41, 0x3f, 0xc8, 0xa2, 0x66, 0x0a, 0xfc, 0x3c, 0x7d, 0x90, - 0x01, 0x95, 0x57, 0xa2, 0x5b, 0xce, 0x88, 0xa2, 0x5f, 0xce, 0xda, 0x9c, 0x00, 0x4e, - 0x90, 0x01, 0xa2, 0x58, 0xce, 0x8b, 0x90, 0x00, 0xa2, 0x57, 0xce, 0x8b, 0x94, 0x22, - 0xa2, 0x5c, 0xce, 0x88, 0xa2, 0x60, 0xce, 0xda, 0x9c, 0x00, 0x4d, 0x90, 0x00, 0xa2, - 0x58, 0xce, 0x8b, 0x90, 0x01, 0xa2, 0x57, 0xce, 0x8b, 0x4a, 0x90, 0x00, 0xa2, 0x58, - 0xce, 0x8b, 0xa2, 0x57, 0xce, 0x8b, 0xa2, 0x3c, 0xce, 0x88, 0xab, 0x0e, 0xa2, 0x57, - 0xce, 0x88, 0xa2, 0x58, 0xce, 0xda, 0x9c, 0x00, 0x94, 0x3b, 0x90, 0x00, 0xa2, 0x3c, - 0xce, 0x8b, 0x96, 0x0e, 0xfc, 0x51, 0xb7, 0x02, 0x13, 0x02, 0xab, 0x04, 0xb7, 0x00, - 0x00, 0x06, 0xa2, 0x22, 0xce, 0x88, 0xb5, 0xe2, 0xb1, 0xa2, 0x66, 0xce, 0xa8, 0xaf, - 0xc8, 0xb5, 0xfa, 0xed, 0x3f, 0xc8, 0xa2, 0x66, 0xce, 0xfc, 0x3c, 0xb5, 0xf5, 0x19, - 0xb5, 0xf1, 0x59, 0xa2, 0x22, 0x72, 0xa8, 0xb5, 0x0f, 0xff, 0xb4, 0xf0, 0xad, 0x90, - 0x01, 0x95, 0x3b, 0xa2, 0x5c, 0xce, 0x88, 0x9d, 0x00, 0x4e, 0xa2, 0x60, 0xce, 0x88, - 0x9c, 0x00, 0x55, 0xa2, 0x5d, 0xce, 0x88, 0x9d, 0x00, 0x4e, 0x90, 0x01, 0xa2, 0x59, - 0xce, 0x8b, 0x90, 0x00, 0xa2, 0x5a, 0xce, 0x8b, 0x94, 0x22, 0xa2, 0x5d, 0xce, 0x88, - 0xa2, 0x61, 0xce, 0xda, 0x9c, 0x00, 0x4d, 0x90, 0x00, 0xa2, 0x59, 0xce, 0x8b, 0x90, - 0x01, 0xa2, 0x5a, 0xce, 0x8b, 0x4a, 0x90, 0x00, 0xa2, 0x59, 0xce, 0x8b, 0xa2, 0x5a, - 0xce, 0x8b, 0xa2, 0x3c, 0xce, 0x88, 0xab, 0x0e, 0xa2, 0x59, 0xce, 0x88, 0xa2, 0x5a, - 0xce, 0xda, 0x9c, 0x00, 0x94, 0x38, 0x90, 0x00, 0xa2, 0x3c, 0xce, 0x8b, 0x96, 0x0e, - 0xfc, 0x51, 0xb7, 0x02, 0x13, 0x02, 0xab, 0x04, 0xb7, 0x00, 0x00, 0x06, 0xa2, 0x22, - 0xce, 0x88, 0xb5, 0xe2, 0x1b, 0xa2, 0x66, 0xce, 0xa8, 0xaf, 0xc8, 0xb5, 0xf9, 0x09, - 0x3f, 0xc8, 0xa2, 0x66, 0xce, 0xfc, 0x3c, 0xb5, 0xf0, 0xc6, 0xa2, 0x22, 0xce, 0x88, - 0xb5, 0x05, 0x95, 0xb4, 0xf0, 0x1a, 0x90, 0x01, 0x95, 0x38, 0x90, 0x00, 0xa2, 0x26, - 0x72, 0x8b, 0xa2, 0x2c, 0x72, 0xa8, 0x9c, 0x00, 0xb4, 0x01, 0x9c, 0x90, 0x00, 0xa2, - 0x24, 0x72, 0x8b, 0xa2, 0x2e, 0x72, 0xa8, 0x9c, 0x00, 0xb4, 0x01, 0x9b, 0x90, 0x00, - 0xa2, 0x25, 0x72, 0x8b, 0xa1, 0xce, 0xb8, 0x0a, 0xab, 0x30, 0x0b, 0x30, 0x4f, 0x30, - 0x93, 0x30, 0xc5, 0x31, 0x5f, 0xb4, 0xfc, 0x82, 0xaf, 0xce, 0xa4, 0xb8, 0x0a, 0xce, - 0xab, 0xa2, 0x17, 0xce, 0x88, 0x99, 0x01, 0x9c, 0x00, 0x94, 0x32, 0xa2, 0x17, 0xce, - 0x88, 0x99, 0x02, 0x9c, 0x00, 0x94, 0x28, 0xa8, 0xce, 0xb8, 0x00, 0x13, 0xa2, 0x29, - 0xce, 0xd8, 0xad, 0xc8, 0x88, 0x99, 0x40, 0x9c, 0x00, 0x57, 0xa2, 0x24, 0x72, 0x88, - 0x9c, 0x00, 0x47, 0xa2, 0x25, 0x72, 0x88, 0x9d, 0x00, 0x49, 0x90, 0x01, 0xa2, 0x5b, - 0xce, 0x8b, 0x3f, 0xce, 0x3c, 0x90, 0x00, 0x69, 0xaf, 0xce, 0xa4, 0xb8, 0x0a, 0xce, - 0xab, 0xa2, 0x17, 0xce, 0x88, 0x99, 0x01, 0x9c, 0x00, 0x94, 0x32, 0xa2, 0x17, 0xce, - 0x88, 0x99, 0x02, 0x9c, 0x00, 0x94, 0x28, 0xa8, 0xce, 0xb8, 0x00, 0x13, 0xa2, 0x29, - 0xce, 0xd8, 0xad, 0xc8, 0x88, 0x99, 0x08, 0x9c, 0x00, 0x57, 0xa2, 0x24, 0x72, 0x88, - 0x9c, 0x00, 0x47, 0xa2, 0x25, 0x72, 0x88, 0x9d, 0x00, 0x49, 0x90, 0x01, 0xa2, 0x5f, - 0xce, 0x8b, 0x3f, 0xce, 0x3c, 0x90, 0x00, 0x69, 0xaf, 0xce, 0xa4, 0xb8, 0x0a, 0xce, - 0xab, 0xa2, 0x17, 0xce, 0x88, 0x99, 0x01, 0x9c, 0x00, 0x5b, 0xa8, 0xce, 0xb8, 0x00, - 0x13, 0xa2, 0x29, 0xce, 0xd8, 0xad, 0xc8, 0x88, 0x99, 0x20, 0x9c, 0x00, 0x4a, 0xa2, - 0x24, 0x72, 0x88, 0x9d, 0x00, 0x43, 0x90, 0x01, 0x42, 0x90, 0x00, 0xa2, 0x5c, 0xce, - 0x8b, 0x3f, 0xce, 0x3c, 0xaf, 0xce, 0xa4, 0xb8, 0x0a, 0xce, 0xab, 0xa2, 0x17, 0xce, - 0x88, 0x99, 0x01, 0x9c, 0x00, 0x5b, 0xa8, 0xce, 0xb8, 0x00, 0x13, 0xa2, 0x29, 0xce, - 0xd8, 0xad, 0xc8, 0x88, 0x99, 0x04, 0x9c, 0x00, 0x4a, 0xa2, 0x24, 0x72, 0x88, 0x9d, - 0x00, 0x43, 0x90, 0x01, 0x42, 0x90, 0x00, 0xa2, 0x60, 0xce, 0x8b, 0x3f, 0xce, 0x3c, - 0xaf, 0xce, 0xa4, 0xb8, 0x0a, 0xce, 0xab, 0xa2, 0x17, 0xce, 0x88, 0x99, 0x02, 0x9c, - 0x00, 0x5b, 0xa8, 0xce, 0xb8, 0x00, 0x13, 0xa2, 0x29, 0xce, 0xd8, 0xad, 0xc8, 0x88, - 0x99, 0x10, 0x9c, 0x00, 0x4a, 0xa2, 0x25, 0x72, 0x88, 0x9d, 0x00, 0x43, 0x90, 0x01, - 0x42, 0x90, 0x00, 0xa2, 0x5d, 0xce, 0x8b, 0x3f, 0xce, 0x3c, 0xaf, 0xce, 0xa4, 0xb8, - 0x0a, 0xce, 0xab, 0xa2, 0x17, 0xce, 0x88, 0x99, 0x02, 0x9c, 0x00, 0x5b, 0xa8, 0xce, - 0xb8, 0x00, 0x13, 0xa2, 0x29, 0xce, 0xd8, 0xad, 0xc8, 0x88, 0x99, 0x02, 0x9c, 0x00, - 0x4a, 0xa2, 0x25, 0x72, 0x88, 0x9d, 0x00, 0x43, 0x90, 0x01, 0x42, 0x90, 0x00, 0xa2, - 0x61, 0xce, 0x8b, 0x3f, 0xce, 0x3c, 0xaf, 0xce, 0xa4, 0xb8, 0x0a, 0xce, 0xab, 0xa2, - 0x17, 0xce, 0x88, 0x99, 0x04, 0x9c, 0x00, 0x42, 0x90, 0x01, 0xa2, 0x5e, 0xce, 0x8b, - 0x3f, 0xce, 0x3c, 0xa2, 0x28, 0x72, 0xa8, 0x9d, 0x00, 0xb4, 0xfe, 0x5b, 0x90, 0x01, - 0xb4, 0xfe, 0x58, 0xa2, 0x2a, 0x72, 0xa8, 0x9d, 0x00, 0xb4, 0xfe, 0x5c, 0x90, 0x01, - 0xb4, 0xfe, 0x59, 0x9c, 0x00, 0x4e, 0xac, 0xce, 0x0c, 0xa2, 0x10, 0x72, 0x88, 0xb5, - 0xde, 0x8e, 0xac, 0x76, 0x0a, 0x4d, 0xac, 0xce, 0x0a, 0xa2, 0x11, 0x72, 0x88, 0xb5, - 0xde, 0x80, 0xac, 0x76, 0x0c, 0xa2, 0x10, 0x72, 0x88, 0xb5, 0xde, 0x76, 0xa8, 0x76, - 0xb6, 0xb8, 0x06, 0xab, 0xa2, 0x11, 0x72, 0x88, 0xb5, 0xde, 0x69, 0xa8, 0x76, 0xb6, - 0xb8, 0x08, 0xab, 0xa2, 0x17, 0x0a, 0x88, 0x99, 0x01, 0x9c, 0x00, 0x94, 0x53, 0xa2, - 0x17, 0x0c, 0x88, 0x99, 0x01, 0x9c, 0x00, 0x94, 0x49, 0xa2, 0x17, 0x0a, 0x88, 0x99, - 0x02, 0x9c, 0x00, 0x94, 0x3f, 0xa2, 0x17, 0x0c, 0x88, 0x99, 0x02, 0x9c, 0x00, 0x94, - 0x35, 0xa2, 0x29, 0x0a, 0x88, 0x9c, 0x02, 0x42, 0x94, 0x2c, 0xa2, 0x29, 0x0c, 0x88, - 0x9c, 0x02, 0x42, 0x94, 0x23, 0xa8, 0x0a, 0xb8, 0x00, 0x13, 0xb8, 0x00, 0x02, 0xad, - 0xc8, 0x88, 0x99, 0x80, 0x9c, 0x00, 0x53, 0xa8, 0x0c, 0xb8, 0x00, 0x13, 0xb8, 0x00, - 0x02, 0xad, 0xc8, 0x88, 0x99, 0x80, 0x9c, 0x00, 0x43, 0x90, 0x01, 0x42, 0x90, 0x00, - 0xa2, 0x26, 0x72, 0x8b, 0x40, 0xa2, 0x2c, 0x72, 0xa8, 0x9c, 0x00, 0x43, 0x90, 0x00, - 0x51, 0xa2, 0x28, 0x72, 0xa8, 0x9c, 0x00, 0x41, 0x6a, 0xa2, 0x26, 0x72, 0x88, 0x9d, - 0x00, 0x71, 0x90, 0x01, 0xa2, 0x24, 0x72, 0x8b, 0xa2, 0x2e, 0x72, 0xa8, 0x9c, 0x00, - 0x43, 0x90, 0x00, 0x51, 0xa2, 0x2a, 0x72, 0xa8, 0x9c, 0x00, 0x41, 0x6a, 0xa2, 0x26, - 0x72, 0x88, 0x9d, 0x00, 0x71, 0x90, 0x01, 0xa2, 0x25, 0x72, 0x8b, 0xb6, 0xb8, 0x06, - 0xa8, 0xb6, 0xb8, 0x0a, 0xab, 0x36, 0x73, 0x36, 0x2f, 0x35, 0xeb, 0x35, 0xb9, 0x35, - 0x87, 0x35, 0x55, 0x35, 0x23, 0xb6, 0xb8, 0x08, 0xa8, 0xb6, 0xb8, 0x0a, 0xab, 0x36, - 0x89, 0x36, 0x45, 0x36, 0x01, 0x35, 0xcf, 0x35, 0x9d, 0x35, 0x6b, 0x35, 0x39, 0xb4, - 0xf9, 0xe8, 0xa2, 0x17, 0xce, 0x88, 0x99, 0x01, 0x9c, 0x00, 0x54, 0xa8, 0xce, 0xb8, - 0x00, 0x13, 0xa2, 0x29, 0xce, 0xd8, 0xad, 0xc8, 0x88, 0x99, 0x20, 0x9c, 0x00, 0x43, - 0x90, 0x01, 0x42, 0x90, 0x00, 0xa2, 0x5c, 0xce, 0x8b, 0xa2, 0x17, 0xce, 0x88, 0x99, - 0x01, 0x9c, 0x00, 0x54, 0xa8, 0xce, 0xb8, 0x00, 0x13, 0xa2, 0x29, 0xce, 0xd8, 0xad, - 0xc8, 0x88, 0x99, 0x04, 0x9c, 0x00, 0x43, 0x90, 0x01, 0x42, 0x90, 0x00, 0xa2, 0x60, - 0xce, 0x8b, 0xa2, 0x17, 0xce, 0x88, 0x99, 0x02, 0x9c, 0x00, 0x54, 0xa8, 0xce, 0xb8, - 0x00, 0x13, 0xa2, 0x29, 0xce, 0xd8, 0xad, 0xc8, 0x88, 0x99, 0x10, 0x9c, 0x00, 0x43, - 0x90, 0x01, 0x42, 0x90, 0x00, 0xa2, 0x5d, 0xce, 0x8b, 0xa2, 0x17, 0xce, 0x88, 0x99, - 0x02, 0x9c, 0x00, 0x54, 0xa8, 0xce, 0xb8, 0x00, 0x13, 0xa2, 0x29, 0xce, 0xd8, 0xad, - 0xc8, 0x88, 0x99, 0x02, 0x9c, 0x00, 0x43, 0x90, 0x01, 0x42, 0x90, 0x00, 0xa2, 0x61, - 0xce, 0x8b, 0xa2, 0x17, 0xce, 0x88, 0x99, 0x04, 0x9c, 0x00, 0x42, 0x90, 0x01, 0xa2, - 0x5e, 0xce, 0x8b, 0xb4, 0xf9, 0x4a, 0xa2, 0x1e, 0xce, 0x88, 0x99, 0x01, 0x9c, 0x00, - 0x4b, 0xa2, 0x08, 0xce, 0x88, 0x99, 0x20, 0x9c, 0x00, 0x42, 0x90, 0x01, 0xa2, 0x4d, - 0xce, 0x8b, 0xa2, 0x1e, 0xce, 0x88, 0x99, 0x01, 0x9c, 0x00, 0x4b, 0xa2, 0x08, 0xce, - 0x88, 0x99, 0x04, 0x9c, 0x00, 0x42, 0x90, 0x01, 0xa2, 0x50, 0xce, 0x8b, 0xa2, 0x1e, - 0xce, 0x88, 0x99, 0x02, 0x9c, 0x00, 0x4b, 0xa2, 0x08, 0xce, 0x88, 0x99, 0x10, 0x9c, - 0x00, 0x42, 0x90, 0x01, 0xa2, 0x4e, 0xce, 0x8b, 0xa2, 0x1e, 0xce, 0x88, 0x99, 0x02, - 0x9c, 0x00, 0x4b, 0xa2, 0x08, 0xce, 0x88, 0x99, 0x02, 0x9c, 0x00, 0x42, 0x90, 0x01, - 0xa2, 0x51, 0xce, 0x8b, 0xa2, 0x1e, 0xce, 0x88, 0x99, 0x04, 0x9c, 0x00, 0x4b, 0xa2, - 0x08, 0xce, 0x88, 0x99, 0x01, 0x9c, 0x00, 0x42, 0x90, 0x01, 0xa2, 0x4f, 0xce, 0x8b, - 0xa2, 0x28, 0xce, 0x88, 0x9c, 0x00, 0x57, 0xa2, 0x4d, 0xce, 0x88, 0x9d, 0x00, 0x94, - 0x62, 0xa2, 0x50, 0xce, 0x88, 0x9c, 0x00, 0x48, 0xa2, 0x4e, 0xce, 0x88, 0x9c, 0x00, - 0x94, 0x53, 0xa2, 0x28, 0xce, 0x88, 0x9c, 0x00, 0x5d, 0xa2, 0x4e, 0xce, 0x88, 0xa2, - 0x51, 0xce, 0xda, 0x9c, 0x00, 0x52, 0x90, 0x01, 0xa2, 0x4b, 0xce, 0x8b, 0x90, 0x00, - 0xa2, 0x4a, 0xce, 0x8b, 0xa2, 0x4c, 0xce, 0x8b, 0x94, 0x40, 0xa2, 0x28, 0xce, 0x88, - 0x9c, 0x00, 0x59, 0xa2, 0x4f, 0xce, 0x88, 0x9c, 0x00, 0x52, 0x90, 0x00, 0xa2, 0x4a, - 0xce, 0x8b, 0xa2, 0x4b, 0xce, 0x8b, 0x90, 0x01, 0xa2, 0x4c, 0xce, 0x8b, 0x94, 0x20, - 0x90, 0x00, 0xa2, 0x4a, 0xce, 0x8b, 0xa2, 0x4b, 0xce, 0x8b, 0xa2, 0x4c, 0xce, 0x8b, - 0x51, 0x90, 0x01, 0xa2, 0x4a, 0xce, 0x8b, 0x90, 0x00, 0xa2, 0x4b, 0xce, 0x8b, 0xa2, - 0x4c, 0xce, 0x8b, 0x40, 0xb4, 0xf6, 0xeb, 0xa2, 0x0a, 0x72, 0x88, 0x9c, 0x01, 0x44, - 0x9c, 0x02, 0x51, 0x3c, 0xa2, 0x12, 0x72, 0x88, 0x9c, 0x02, 0x3c, 0xb5, 0xdb, 0xe2, - 0xac, 0x76, 0xce, 0xb4, 0xf8, 0x11, 0xa2, 0x10, 0x72, 0x88, 0x9c, 0x02, 0x49, 0xb5, - 0xdb, 0xd2, 0xac, 0x76, 0xce, 0xb4, 0xf8, 0x01, 0xa2, 0x11, 0x72, 0x88, 0x9c, 0x02, - 0x3c, 0xb5, 0xdb, 0xc2, 0xac, 0x76, 0xce, 0xb4, 0xf7, 0xf1, 0x00, 0xb6, 0xb8, 0x02, - 0x8b, 0xb6, 0xb8, 0x04, 0xab, 0xa8, 0x46, 0xb5, 0xdb, 0xae, 0xa8, 0x44, 0xbc, 0x03, - 0x02, 0x58, 0xbc, 0x03, 0x01, 0x5b, 0xa2, 0x06, 0x76, 0xa8, 0x9c, 0x03, 0x5c, 0x9c, - 0x02, 0x94, 0x38, 0x9c, 0x00, 0x94, 0x57, 0x9c, 0x01, 0x94, 0x53, 0x3c, 0xa8, 0x48, - 0xa2, 0x3a, 0x76, 0x8b, 0x7a, 0xa8, 0x48, 0xa2, 0x39, 0x76, 0x8b, 0x95, 0x21, 0xac, - 0x76, 0xce, 0xa2, 0x66, 0xce, 0xa8, 0xaf, 0xc8, 0xb5, 0xf4, 0x04, 0x3f, 0xc8, 0xa2, - 0x66, 0xce, 0xfc, 0x3c, 0xb5, 0xeb, 0xc1, 0xac, 0x76, 0xce, 0xa8, 0x46, 0x30, 0x90, - 0xb4, 0xeb, 0x15, 0xac, 0x76, 0xce, 0xa2, 0x66, 0xce, 0xa8, 0xaf, 0xc8, 0xb5, 0xf5, - 0x32, 0x3f, 0xc8, 0xa2, 0x66, 0xce, 0xfc, 0x3c, 0xb5, 0xef, 0x5e, 0xb5, 0xeb, 0x9e, - 0xa2, 0x22, 0x72, 0xa8, 0xb5, 0x0a, 0x44, 0xb4, 0xea, 0xf2, 0xa8, 0x44, 0xbc, 0x03, - 0x02, 0x94, 0x51, 0xa2, 0x06, 0x76, 0xa8, 0x9c, 0x00, 0x94, 0x4f, 0xac, 0x76, 0xcc, - 0xa2, 0x10, 0x72, 0x88, 0xb5, 0xdb, 0x25, 0xac, 0x76, 0xce, 0x43, 0xac, 0x76, 0xcc, - 0xa2, 0x66, 0xce, 0xa8, 0xaf, 0xc8, 0xa2, 0x66, 0xcc, 0xa8, 0xaf, 0xc8, 0xaf, 0xce, - 0xaf, 0xcc, 0xb5, 0xef, 0x73, 0x3f, 0xcc, 0x3f, 0xce, 0x3f, 0xc8, 0xa2, 0x66, 0xce, - 0xfc, 0x52, 0x3f, 0xc8, 0xb5, 0xee, 0x7c, 0xb5, 0xeb, 0x4e, 0xa2, 0x22, 0x72, 0xa8, - 0xb5, 0x09, 0xf4, 0xb4, 0xea, 0xa2, 0x3f, 0xc8, 0xa2, 0x66, 0xcc, 0xfc, 0x3c, 0x77, - 0xac, 0x76, 0xce, 0xb4, 0xf7, 0x15, 0xac, 0x76, 0xce, 0xa2, 0x11, 0x72, 0x88, 0xb5, - 0xda, 0xd6, 0x95, 0x4b, 0xaf, 0xc8, 0xa2, 0x66, 0xce, 0xa8, 0xb5, 0x09, 0x9c, 0xa2, - 0x30, 0x72, 0x88, 0x3f, 0xca, 0x9c, 0x00, 0x3c, 0xb7, 0x01, 0x07, 0x02, 0xb7, 0x00, - 0x00, 0x04, 0xb7, 0x00, 0x00, 0x06, 0xa8, 0xca, 0xb4, 0xdc, 0x49, 0x00, 0x90, 0x00, - 0xf6, 0x90, 0x00, 0xa2, 0x02, 0xce, 0x8b, 0xa2, 0x04, 0xce, 0xab, 0x90, 0x03, 0xa2, - 0x06, 0xce, 0xab, 0x90, 0x00, 0xa2, 0x08, 0xce, 0x8b, 0x90, 0x04, 0xa2, 0x20, 0xce, - 0xab, 0xb7, 0x00, 0x00, 0x0a, 0xac, 0xce, 0xcc, 0x82, 0x58, 0xcc, 0xf8, 0xa8, 0x0a, - 0x96, 0x7e, 0xdc, 0x5a, 0xa2, 0x22, 0xce, 0x88, 0xc6, 0xa2, 0x02, 0xcc, 0x8b, 0x90, - 0x02, 0xa2, 0x01, 0xcc, 0x8b, 0xa2, 0x03, 0xcc, 0x8b, 0x82, 0x04, 0xcc, 0xf8, 0xa9, - 0x0a, 0x7f, 0x00, 0xa2, 0x26, 0xce, 0x8b, 0xa2, 0x27, 0xce, 0x8b, 0xa2, 0x28, 0xce, - 0x8b, 0x90, 0x00, 0xa2, 0x3a, 0xce, 0xab, 0x90, 0x00, 0xa2, 0x24, 0xce, 0xab, 0x3c, - 0x00, 0xa2, 0x0a, 0xce, 0xab, 0xa2, 0x0c, 0xce, 0xab, 0xa2, 0x0e, 0xce, 0xab, 0xa2, - 0x10, 0xce, 0xab, 0xac, 0xce, 0xcc, 0x82, 0x12, 0xcc, 0xf8, 0xb1, 0x43, 0xb1, 0x33, - 0x11, 0xac, 0xce, 0xcc, 0x82, 0x18, 0xcc, 0xf8, 0xb1, 0x43, 0xb1, 0x33, 0x05, 0x90, - 0x00, 0xa2, 0x1e, 0xce, 0x8b, 0x00, 0xa2, 0x29, 0xce, 0x8b, 0xa2, 0x2a, 0xce, 0x8b, - 0xa2, 0x2b, 0xce, 0x8b, 0xa2, 0x2c, 0xce, 0x8b, 0xa2, 0x2d, 0xce, 0x8b, 0xa2, 0x2e, - 0xce, 0x8b, 0xa2, 0x30, 0xce, 0x8b, 0xa2, 0x31, 0xce, 0x8b, 0xa2, 0x32, 0xce, 0x8b, - 0xa2, 0x33, 0xce, 0x8b, 0xa2, 0x34, 0xce, 0xab, 0xa2, 0x36, 0xce, 0xab, 0xa2, 0x38, - 0xce, 0xab, 0x90, 0x01, 0xa2, 0x2f, 0xce, 0x8b, 0x00, 0xa2, 0x4a, 0xce, 0x8b, 0xa2, - 0x4b, 0xce, 0x8b, 0xa2, 0x4c, 0xce, 0x8b, 0xa2, 0x4d, 0xce, 0x8b, 0xa2, 0x4e, 0xce, - 0x8b, 0xa2, 0x4f, 0xce, 0x8b, 0xa2, 0x50, 0xce, 0x8b, 0xa2, 0x51, 0xce, 0x8b, 0xa2, - 0x54, 0xce, 0xab, 0x90, 0x00, 0xa2, 0x52, 0xce, 0xab, 0x90, 0x00, 0xa2, 0x56, 0xce, - 0xab, 0x3c, 0x00, 0xf6, 0xa2, 0x02, 0xce, 0xab, 0x90, 0x02, 0xa2, 0x04, 0xce, 0xab, - 0x90, 0x04, 0xa2, 0x06, 0xce, 0xab, 0x00, 0xa2, 0x08, 0xce, 0xab, 0x90, 0x03, 0xa2, - 0x0a, 0xce, 0xab, 0x90, 0x00, 0xa2, 0x0c, 0xce, 0x8b, 0x90, 0x00, 0xa2, 0x0e, 0xce, - 0xab, 0x90, 0x07, 0xa2, 0x10, 0xce, 0x8b, 0x90, 0x08, 0xa2, 0x11, 0xce, 0x8b, 0xac, - 0xce, 0xcc, 0x82, 0x13, 0xcc, 0xf8, 0x90, 0x00, 0xc6, 0xa2, 0x01, 0xcc, 0x8b, 0xa2, - 0x02, 0xcc, 0x8b, 0xb7, 0x00, 0x00, 0x0a, 0xac, 0xce, 0xcc, 0x82, 0x1a, 0xcc, 0xf8, - 0xa8, 0x0a, 0x96, 0x7e, 0xdc, 0x3c, 0xa2, 0x22, 0xce, 0x88, 0xc6, 0xa2, 0x02, 0xcc, - 0x8b, 0x90, 0x04, 0xa2, 0x01, 0xcc, 0x8b, 0xa2, 0x03, 0xcc, 0x8b, 0x82, 0x04, 0xcc, - 0xf8, 0xa9, 0x0a, 0x7f, 0x90, 0x00, 0xa2, 0x17, 0xce, 0x8b, 0x90, 0x00, 0xa2, 0x18, - 0xce, 0x8b, 0x00, 0xa2, 0x24, 0xce, 0xab, 0xa2, 0x26, 0xce, 0xab, 0x90, 0x04, 0xa2, - 0x28, 0xce, 0x8b, 0x90, 0x00, 0xa2, 0x29, 0xce, 0x8b, 0x90, 0x00, 0xa2, 0x2a, 0xce, - 0x8b, 0x90, 0x00, 0xa2, 0x2c, 0xce, 0xab, 0x00, 0xa2, 0x2e, 0xce, 0xab, 0xa2, 0x30, - 0xce, 0xab, 0xa2, 0x32, 0xce, 0xab, 0xa2, 0x34, 0xce, 0x8b, 0xa2, 0x35, 0xce, 0x8b, - 0xa2, 0x36, 0xce, 0x8b, 0xa2, 0x37, 0xce, 0x8b, 0xa2, 0x38, 0xce, 0x8b, 0xa2, 0x39, - 0xce, 0x8b, 0xa2, 0x3a, 0xce, 0x8b, 0xa2, 0x3b, 0xce, 0x8b, 0xa2, 0x3c, 0xce, 0x8b, - 0xa2, 0x3d, 0xce, 0x8b, 0xa2, 0x3e, 0xce, 0x8b, 0xa2, 0x3f, 0xce, 0x8b, 0xa2, 0x40, - 0xce, 0x8b, 0xa2, 0x41, 0xce, 0x8b, 0xa2, 0x42, 0xce, 0x8b, 0xa2, 0x44, 0xce, 0xab, - 0xa2, 0x46, 0xce, 0xab, 0xa2, 0x48, 0xce, 0xab, 0xa2, 0x4a, 0xce, 0xab, 0xa2, 0x4c, - 0xce, 0xab, 0x90, 0x00, 0xa2, 0x4e, 0xce, 0xab, 0x90, 0x00, 0xa2, 0x50, 0xce, 0xab, - 0x90, 0x00, 0xa2, 0x54, 0xce, 0x8b, 0xa2, 0x55, 0xce, 0x8b, 0xa2, 0x57, 0xce, 0x8b, - 0xa2, 0x58, 0xce, 0x8b, 0xa2, 0x59, 0xce, 0x8b, 0xa2, 0x5a, 0xce, 0x8b, 0xa2, 0x5b, - 0xce, 0x8b, 0xa2, 0x5c, 0xce, 0x8b, 0xa2, 0x5d, 0xce, 0x8b, 0xa2, 0x5e, 0xce, 0x8b, - 0xa2, 0x5f, 0xce, 0x8b, 0xa2, 0x60, 0xce, 0x8b, 0xa2, 0x61, 0xce, 0x8b, 0xa2, 0x64, - 0xce, 0xab, 0x90, 0x00, 0xa2, 0x62, 0xce, 0xab, 0x90, 0x04, 0xa2, 0x66, 0xce, 0xab, - 0x00, 0xa2, 0x68, 0xce, 0xab, 0xa2, 0x6a, 0xce, 0xab, 0xa2, 0x6c, 0xce, 0xab, 0xa2, - 0x6e, 0xce, 0xab, 0xa2, 0x70, 0xce, 0xab, 0xa2, 0x72, 0xce, 0xab, 0xa2, 0x74, 0xce, - 0x8b, 0x90, 0x00, 0xa2, 0x76, 0xce, 0xab, 0x3c, 0xb0, 0xe4, 0x9c, 0xa2, 0x02, 0x72, - 0xab, 0x90, 0xa6, 0xa2, 0x04, 0x72, 0xab, 0x90, 0x00, 0xa2, 0x06, 0x72, 0xab, 0xb0, - 0xff, 0xff, 0xa2, 0x08, 0x72, 0xab, 0xb0, 0xff, 0xff, 0xa2, 0x36, 0x72, 0xab, 0x00, - 0xa2, 0x0a, 0x72, 0x8b, 0xa2, 0x0b, 0x72, 0x8b, 0xa2, 0x0c, 0x72, 0x8b, 0x90, 0x00, - 0xa2, 0x0d, 0x72, 0x8b, 0x00, 0xa2, 0x0e, 0x72, 0x8b, 0xa2, 0x0f, 0x72, 0x8b, 0x90, - 0x02, 0xa2, 0x10, 0x72, 0x8b, 0xa2, 0x11, 0x72, 0x8b, 0xa2, 0x12, 0x72, 0x8b, 0x90, - 0x01, 0xa2, 0x14, 0x72, 0x8b, 0x90, 0x00, 0xa2, 0x00, 0x72, 0x8b, 0xa2, 0x15, 0x72, - 0x8b, 0xa2, 0x16, 0x72, 0x8b, 0xa2, 0x18, 0x72, 0x8b, 0xa2, 0x1a, 0x72, 0x8b, 0xa2, - 0x1c, 0x72, 0x8b, 0x90, 0x02, 0xa2, 0x1e, 0x72, 0x8b, 0x90, 0x00, 0xa2, 0x20, 0x72, - 0xab, 0x90, 0x00, 0xa2, 0x22, 0x72, 0xab, 0x90, 0x01, 0xa2, 0x24, 0x72, 0x8b, 0xa2, - 0x25, 0x72, 0x8b, 0x90, 0x00, 0xa2, 0x26, 0x72, 0x8b, 0xa2, 0x27, 0x72, 0x8b, 0xa2, - 0x28, 0x72, 0xab, 0xa2, 0x2a, 0x72, 0xab, 0xa2, 0x2c, 0x72, 0xab, 0xa2, 0x2e, 0x72, - 0xab, 0xb7, 0x00, 0x00, 0x0c, 0xa8, 0x0c, 0x9c, 0x01, 0x56, 0xb5, 0xd7, 0x7d, 0xa8, - 0x0c, 0xa2, 0x22, 0x74, 0x8b, 0xac, 0x74, 0xce, 0x37, 0x28, 0xac, 0x74, 0xce, 0x36, - 0xc9, 0xa9, 0x0c, 0x7a, 0xb7, 0x00, 0x00, 0x0c, 0xa8, 0x0c, 0x96, 0x7e, 0xdc, 0x94, - 0x34, 0xb5, 0xd7, 0x84, 0xa8, 0x0c, 0xa2, 0x10, 0x78, 0xab, 0x00, 0xa2, 0x00, 0x78, - 0xab, 0xa2, 0x02, 0x78, 0xab, 0xa2, 0x04, 0x78, 0xab, 0xa2, 0x06, 0x78, 0xab, 0xa2, - 0x08, 0x78, 0xab, 0xa2, 0x0a, 0x78, 0xab, 0xa2, 0x0c, 0x78, 0xab, 0xa2, 0x0e, 0x78, - 0xab, 0x90, 0x00, 0xa2, 0x12, 0x78, 0xab, 0xa9, 0x0c, 0x95, 0x39, 0xb7, 0x00, 0x00, - 0x0c, 0xa8, 0x0c, 0x9c, 0x03, 0x56, 0xb5, 0xd7, 0x33, 0xa8, 0x0c, 0xa2, 0x22, 0x76, - 0x8b, 0xac, 0x76, 0xce, 0x36, 0x86, 0xac, 0x76, 0xce, 0x36, 0x19, 0xa9, 0x0c, 0x7a, - 0x00, 0x3c, 0xad, 0xca, 0x88, 0xc6, 0xa9, 0xca, 0xa9, 0xcc, 0xad, 0xca, 0x88, 0xc6, - 0xa9, 0xca, 0xa9, 0xcc, 0xad, 0xca, 0x88, 0xc6, 0xa9, 0xca, 0xa9, 0xcc, 0xad, 0xca, - 0x88, 0xc6, 0xa9, 0xca, 0xa9, 0xcc, 0xad, 0xca, 0x88, 0xc6, 0xa9, 0xca, 0xa9, 0xcc, - 0xad, 0xca, 0x88, 0xc6, 0x3c, 0x00, 0xb7, 0x00, 0x00, 0x2e, 0xb7, 0x00, 0x00, 0x30, - 0xb7, 0x00, 0x00, 0x2c, 0x91, 0x00, 0xb2, 0xce, 0x3e, 0x00, 0xe6, 0x82, 0x0e, 0xcc, - 0xf8, 0xa9, 0xca, 0x82, 0x10, 0xca, 0xfc, 0x6b, 0x3c, 0x91, 0x00, 0xb2, 0xce, 0x3e, - 0x00, 0xfc, 0xb6, 0xb8, 0x00, 0xa8, 0xa2, 0x0c, 0xcc, 0xfc, 0x4c, 0x82, 0x0e, 0xcc, - 0xf8, 0xa9, 0xca, 0x82, 0x10, 0xca, 0xfc, 0x75, 0x3c, 0xa0, 0x30, 0xca, 0xfc, 0x4c, - 0x00, 0xe6, 0xa2, 0x0c, 0xcc, 0xab, 0xa8, 0x2e, 0x05, 0xab, 0x2e, 0x7c, 0x00, 0xa2, - 0x06, 0xcc, 0xab, 0x95, 0x22, 0x83, 0x00, 0xb8, 0x00, 0xab, 0x48, 0xb7, 0x00, 0x00, - 0x02, 0xb7, 0x00, 0x00, 0x04, 0xab, 0x3c, 0xac, 0xce, 0x3e, 0xa8, 0xcc, 0xae, 0xce, - 0xb7, 0xff, 0xff, 0x38, 0xb7, 0xff, 0xff, 0x3a, 0x82, 0x00, 0x2e, 0xfd, 0x5e, 0x32, - 0x0f, 0x00, 0xab, 0x34, 0xab, 0x36, 0xb2, 0xce, 0x3e, 0xa0, 0x30, 0xcc, 0xf8, 0x94, - 0x52, 0xa2, 0x02, 0xcc, 0xa8, 0xab, 0x34, 0xa2, 0x04, 0xcc, 0xa8, 0xab, 0x36, 0x94, - 0x44, 0x31, 0xfe, 0xab, 0x34, 0xac, 0xcc, 0x36, 0x31, 0xea, 0xb2, 0xce, 0x3e, 0xa0, - 0x30, 0xcc, 0xf8, 0xa8, 0x36, 0xa2, 0x04, 0xcc, 0xfd, 0x95, 0x24, 0xa2, 0x04, 0xcc, - 0xfc, 0x41, 0x4e, 0xa8, 0x34, 0xa2, 0x02, 0xcc, 0xfd, 0x95, 0x32, 0xa2, 0x02, 0xcc, - 0xfc, 0x95, 0x38, 0xa2, 0x02, 0xcc, 0xa8, 0x02, 0x96, 0x34, 0xeb, 0xab, 0x34, 0xa2, - 0x04, 0xcc, 0xa8, 0x96, 0x36, 0xeb, 0xab, 0x36, 0x96, 0x37, 0x17, 0x95, 0x50, 0x97, - 0x00, 0x42, 0xa8, 0x02, 0x96, 0x04, 0xfa, 0x9d, 0x00, 0x97, 0x01, 0x42, 0xa8, 0xcc, - 0xae, 0xce, 0xab, 0xcc, 0x00, 0xe5, 0xab, 0x32, 0x82, 0x00, 0x42, 0xdd, 0x5d, 0xa8, - 0xcc, 0xae, 0xce, 0xab, 0xcc, 0x91, 0x00, 0xb2, 0xce, 0x3e, 0xb7, 0x00, 0x00, 0x40, - 0xa8, 0x32, 0x9c, 0x00, 0x94, 0x50, 0xa2, 0x0a, 0xcc, 0xfc, 0x94, 0x39, 0x94, 0x48, - 0xa8, 0x04, 0x9d, 0x00, 0x95, 0x21, 0x9c, 0x00, 0x41, 0x46, 0xa8, 0x02, 0x9d, 0x00, - 0x95, 0x2b, 0x90, 0x00, 0xaa, 0xc8, 0x62, 0xa8, 0x2c, 0x04, 0xbd, 0x7f, 0xff, 0x90, - 0x01, 0xab, 0x2c, 0xab, 0x04, 0xe6, 0xac, 0x06, 0x02, 0x82, 0xff, 0x02, 0xfa, 0xa8, - 0x3c, 0xb7, 0x00, 0x00, 0x06, 0xb5, 0xd7, 0x44, 0x97, 0x00, 0x42, 0x95, 0x52, 0xc4, - 0x9c, 0x00, 0x4d, 0x00, 0xc6, 0xa2, 0x06, 0xcc, 0x8b, 0xab, 0x32, 0xa8, 0x2e, 0x05, - 0xab, 0x2e, 0xc4, 0x9c, 0x00, 0x94, 0x9d, 0x02, 0xa2, 0x02, 0xcc, 0xa8, 0x96, 0x34, - 0xeb, 0xa2, 0x02, 0xcc, 0xab, 0xa2, 0x04, 0xcc, 0xa8, 0x96, 0x36, 0xeb, 0xa2, 0x04, - 0xcc, 0xab, 0xa2, 0x05, 0xcc, 0x17, 0x94, 0x38, 0xa2, 0x04, 0xcc, 0xa8, 0x9d, 0x00, - 0x4e, 0x9c, 0x00, 0x42, 0x94, 0x2c, 0xa2, 0x02, 0xcc, 0xa8, 0x9d, 0x00, 0x42, 0x94, - 0x23, 0x00, 0xdc, 0x4e, 0xa8, 0x3a, 0xa2, 0x04, 0xcc, 0xfd, 0x94, 0x4f, 0xa2, 0x04, - 0xcc, 0xfc, 0x94, 0x40, 0xa9, 0xca, 0x82, 0x10, 0xca, 0xfc, 0x94, 0x95, 0x82, 0x0e, - 0x40, 0xf8, 0x82, 0x0e, 0xcc, 0xf8, 0x95, 0xae, 0xa2, 0x0a, 0xcc, 0xa8, 0xaf, 0x04, - 0xab, 0x04, 0xa2, 0x06, 0xcc, 0xa8, 0xaf, 0x02, 0x9a, 0xff, 0xab, 0x02, 0xaf, 0x06, - 0xb7, 0x00, 0x00, 0x06, 0xa2, 0x08, 0xcc, 0xa8, 0xb5, 0xd6, 0xb5, 0x3f, 0x06, 0x3f, - 0x02, 0x3f, 0x04, 0x00, 0xc6, 0xa8, 0x2e, 0x05, 0xab, 0x2e, 0x95, 0x4f, 0xa8, 0x38, - 0xa2, 0x02, 0xcc, 0xfd, 0x42, 0x95, 0x47, 0xac, 0x40, 0x30, 0xa2, 0x02, 0xcc, 0xa8, - 0xab, 0x38, 0xa2, 0x04, 0xcc, 0xa8, 0xab, 0x3a, 0x95, 0x58, 0x96, 0x42, 0xdc, 0x95, - 0x6e, 0xa8, 0x02, 0xa2, 0x02, 0xcc, 0xab, 0xa8, 0x04, 0xa2, 0x04, 0xcc, 0xab, 0x90, - 0x01, 0xc6, 0xa8, 0x06, 0xa2, 0x06, 0xcc, 0xab, 0xa8, 0x3c, 0xa2, 0x08, 0xcc, 0xab, - 0xa8, 0x2c, 0x04, 0xbd, 0x7f, 0xff, 0x90, 0x01, 0xab, 0x2c, 0xa2, 0x0a, 0xcc, 0xab, - 0xae, 0xce, 0xae, 0xcc, 0xae, 0xce, 0xe6, 0xae, 0xce, 0xab, 0xcc, 0xa8, 0x2e, 0x04, - 0xab, 0x2e, 0x00, 0x8b, 0x42, 0x95, 0xac, 0xa8, 0x2e, 0x9c, 0x00, 0x4e, 0xa8, 0x38, - 0x96, 0x3a, 0xfa, 0x9c, 0x00, 0x46, 0x30, 0x1c, 0xac, 0x3e, 0xce, 0x3c, 0xac, 0x3e, - 0xce, 0x3c, 0x83, 0x44, 0x01, 0x91, 0x8b, 0x40, 0x40, 0x83, 0xcc, 0x01, 0x91, 0x8b, - 0x40, 0x40, 0x83, 0x44, 0x01, 0x91, 0x8b, 0x3c, 0x34, 0x14, 0xa1, 0x38, 0x01, 0x8c, - 0xab, 0xa1, 0x3a, 0x01, 0x88, 0xab, 0x87, 0xff, 0xff, 0x01, 0x8a, 0xab, 0x87, 0xff, - 0xff, 0x01, 0x86, 0xab, 0x83, 0x01, 0x01, 0x91, 0x8b, 0x3c, 0x34, 0x32, 0x83, 0x00, - 0x01, 0x88, 0xab, 0x83, 0x00, 0x01, 0x8c, 0xab, 0x3c, 0xb6, 0x01, 0x8c, 0xa8, 0xa4, - 0x01, 0x88, 0xcc, 0xab, 0x3c, 0x82, 0x00, 0x2e, 0xfc, 0x94, 0xdc, 0xb2, 0xce, 0x3e, - 0xa0, 0x30, 0xcc, 0xf8, 0xa2, 0x02, 0xcc, 0xa8, 0xab, 0x34, 0xa2, 0x04, 0xcc, 0xa8, - 0xab, 0x36, 0xb7, 0xff, 0xff, 0x38, 0xb7, 0xff, 0xff, 0x3a, 0xb2, 0xce, 0x3e, 0x91, - 0x00, 0xb7, 0x00, 0x00, 0x40, 0x00, 0xdc, 0x94, 0x93, 0xa8, 0x36, 0xa2, 0x04, 0xcc, - 0xfd, 0x48, 0xa2, 0x04, 0xcc, 0xfc, 0x94, 0x37, 0x94, 0x43, 0xa2, 0x06, 0xcc, 0xa8, - 0x9c, 0x00, 0x94, 0x23, 0xac, 0x02, 0x3c, 0xac, 0x04, 0x3e, 0xa8, 0x50, 0xa2, 0x06, - 0xcc, 0xa8, 0x9a, 0xff, 0xab, 0x02, 0xa2, 0x0a, 0xcc, 0xa8, 0xab, 0x04, 0xa2, 0x08, - 0xcc, 0xa8, 0xb5, 0xd5, 0x87, 0xac, 0x3c, 0x02, 0xac, 0x3e, 0x04, 0x90, 0x00, 0xc6, - 0xa8, 0x2e, 0x05, 0xab, 0x2e, 0x94, 0x4f, 0xa8, 0x34, 0xa2, 0x02, 0xcc, 0xfd, 0x95, - 0x3b, 0xa2, 0x02, 0xcc, 0xfc, 0x95, 0x41, 0x02, 0xa2, 0x02, 0xcc, 0xa8, 0x96, 0x34, - 0xeb, 0xa2, 0x02, 0xcc, 0xab, 0xa2, 0x04, 0xcc, 0xa8, 0x96, 0x36, 0xeb, 0xa2, 0x04, - 0xcc, 0xab, 0xa2, 0x05, 0xcc, 0x17, 0x95, 0x5e, 0xa8, 0x3a, 0xa2, 0x04, 0xcc, 0xfd, - 0x4e, 0xa2, 0x04, 0xcc, 0xfc, 0x41, 0x57, 0xa8, 0x38, 0xa2, 0x02, 0xcc, 0xfd, 0x41, - 0x4f, 0xac, 0x40, 0x30, 0xa2, 0x02, 0xcc, 0xa8, 0xab, 0x38, 0xa2, 0x04, 0xcc, 0xa8, - 0xab, 0x3a, 0xa9, 0xca, 0x82, 0x10, 0xca, 0xfc, 0x4a, 0x82, 0x0e, 0x40, 0xf8, 0x82, - 0x0e, 0xcc, 0xf8, 0x95, 0xa6, 0xa8, 0x2e, 0x9c, 0x00, 0x4b, 0xa8, 0x3a, 0x96, 0x38, - 0xfa, 0x9c, 0x00, 0x43, 0x35, 0x14, 0x3c, 0x35, 0x2b, 0x3c, 0xb6, 0xf9, 0xfa, 0xa8, - 0xb6, 0xf9, 0xfc, 0xfc, 0x5d, 0xb6, 0xf9, 0xfa, 0xa9, 0xb3, 0x01, 0x84, 0xf2, 0xf6, - 0xb3, 0x01, 0x90, 0x90, 0x40, 0xd6, 0x40, 0x40, 0x90, 0xc8, 0xd6, 0x40, 0x40, 0x97, - 0xdf, 0xd2, 0x90, 0x98, 0xd6, 0x3c, 0xb6, 0xf9, 0xfe, 0x88, 0x96, 0xc8, 0x10, 0x47, - 0x30, 0x0a, 0x91, 0x01, 0xb4, 0x85, 0x58, 0x99, 0xfe, 0x9c, 0xa4, 0x51, 0xb3, 0x01, - 0x90, 0x90, 0x40, 0xd6, 0x40, 0x40, 0x90, 0xc8, 0xd6, 0x40, 0x40, 0x97, 0xdf, 0xd2, - 0x3c, 0x00, 0xb6, 0xf9, 0xfa, 0xab, 0x34, 0x43, 0x95, 0x22, 0xb6, 0xff, 0x20, 0xa9, - 0x90, 0x01, 0xb6, 0x10, 0x00, 0x8e, 0x8b, 0x03, 0xaf, 0xcc, 0xaf, 0xce, 0xa2, 0x0a, - 0x72, 0x88, 0x9d, 0x01, 0x53, 0xa2, 0x12, 0x72, 0x88, 0xb5, 0xd2, 0xfa, 0xac, 0x76, - 0xce, 0xa2, 0x22, 0xce, 0x88, 0xb2, 0x20, 0x00, 0x94, 0x30, 0xa2, 0x10, 0x72, 0x88, - 0xb5, 0xd2, 0xe7, 0xac, 0x76, 0xce, 0xa2, 0x22, 0xce, 0x88, 0xb2, 0x28, 0x00, 0x9c, - 0x00, 0xb2, 0x20, 0x00, 0xaf, 0xcc, 0xa2, 0x11, 0x72, 0x88, 0xb5, 0xd2, 0xcf, 0xac, - 0x76, 0xce, 0xa2, 0x22, 0xce, 0x88, 0xb3, 0x28, 0x00, 0x9c, 0x00, 0xb3, 0x20, 0x00, - 0x3f, 0xcc, 0x90, 0x52, 0xa2, 0x02, 0xcc, 0x8e, 0x8b, 0x02, 0xa2, 0x0a, 0x72, 0x88, - 0x9c, 0x01, 0x48, 0x90, 0x10, 0xa2, 0x02, 0xce, 0x8e, 0xab, 0x04, 0xc4, 0x9a, 0x04, - 0xc6, 0x90, 0x00, 0xa2, 0x08, 0xcc, 0x8e, 0xab, 0x06, 0x31, 0x03, 0x9c, 0x00, 0x94, - 0xa4, 0xa2, 0x0a, 0x72, 0x88, 0x9c, 0x01, 0x52, 0x90, 0xdb, 0xa2, 0x02, 0xcc, 0x8e, - 0x90, 0x52, 0xa2, 0x02, 0xce, 0x8e, 0x30, 0xea, 0x9c, 0x00, 0x94, 0xac, 0x33, 0xf8, - 0x90, 0x10, 0xb6, 0x10, 0x04, 0x8b, 0x91, 0x00, 0xb6, 0x10, 0x20, 0x88, 0x99, 0x08, - 0x9c, 0x00, 0x94, 0x60, 0x91, 0x00, 0xb6, 0x10, 0x24, 0x88, 0x99, 0x20, 0x9c, 0x00, - 0x94, 0x5a, 0x90, 0x08, 0xb6, 0x10, 0x04, 0x8b, 0x91, 0x00, 0xb6, 0x10, 0x20, 0x88, - 0x99, 0x04, 0x9c, 0x00, 0x94, 0x3c, 0x91, 0x00, 0xb6, 0x10, 0x24, 0x88, 0x99, 0x02, - 0x9c, 0x00, 0x94, 0x2a, 0xc4, 0x99, 0xfb, 0xc6, 0xa8, 0x06, 0xa2, 0x08, 0xcc, 0x8e, - 0xa2, 0x0a, 0x72, 0x88, 0x9c, 0x01, 0x46, 0xa8, 0x04, 0xa2, 0x02, 0xce, 0x8e, 0x88, - 0x02, 0xa2, 0x02, 0xcc, 0x8e, 0x88, 0x03, 0xb6, 0x10, 0x00, 0x8b, 0x90, 0x01, 0x3f, - 0xce, 0x3f, 0xcc, 0x3c, 0x30, 0x16, 0x94, 0x4c, 0x95, 0x38, 0x30, 0x10, 0x94, 0x46, - 0x95, 0x4a, 0x30, 0x0a, 0x94, 0x40, 0x95, 0x6e, 0x30, 0x04, 0x94, 0x3a, 0x95, 0x68, - 0xae, 0xca, 0x05, 0xae, 0xca, 0x82, 0x00, 0xca, 0xfc, 0x3c, 0x3d, 0xa2, 0x0a, 0x72, - 0x88, 0x9c, 0x01, 0x4d, 0xa2, 0x10, 0x72, 0x88, 0xb5, 0xd1, 0xe3, 0x00, 0xa2, 0x0e, - 0x76, 0xab, 0x5e, 0xa2, 0x12, 0x72, 0x88, 0xb5, 0xd1, 0xd6, 0x00, 0xa2, 0x0e, 0x76, - 0xab, 0x51, 0xa2, 0x11, 0x72, 0x88, 0xb5, 0xd1, 0xc9, 0x00, 0xa2, 0x0e, 0x76, 0xab, - 0x00, 0xa2, 0x00, 0x74, 0xab, 0xc4, 0x99, 0xfb, 0xc6, 0xa8, 0x06, 0xa2, 0x08, 0xcc, - 0x8e, 0xa2, 0x0a, 0x72, 0x88, 0x9c, 0x01, 0x46, 0xa8, 0x04, 0xa2, 0x02, 0xce, 0x8e, - 0x88, 0x02, 0xa2, 0x02, 0xcc, 0x8e, 0x88, 0x03, 0xb6, 0x10, 0x00, 0x8b, 0x00, 0x3f, - 0xce, 0x3f, 0xcc, 0x3c, 0x33, 0x12, 0x91, 0x00, 0xae, 0xca, 0xaa, 0xc8, 0x41, 0x3c, - 0xae, 0xca, 0xb6, 0x10, 0x1c, 0x88, 0x96, 0xc8, 0x17, 0x41, 0x70, 0x9a, 0x01, 0x3c, - 0xaf, 0xcc, 0x9c, 0x00, 0x94, 0x21, 0xb2, 0x20, 0x2e, 0x30, 0x0f, 0xa2, 0x0a, 0x72, - 0x88, 0x9c, 0x01, 0x45, 0xb2, 0x28, 0x2e, 0x30, 0x03, 0x3f, 0xcc, 0x3c, 0x90, 0x40, - 0x01, 0xd9, 0xc6, 0xa8, 0xe2, 0xba, 0x02, 0x00, 0xab, 0xe2, 0x3c, 0xb2, 0x20, 0x2e, - 0x30, 0x0f, 0xa2, 0x0a, 0x72, 0x88, 0x9c, 0x01, 0x7b, 0xb2, 0x28, 0x2e, 0x30, 0x03, - 0x3f, 0xcc, 0x3c, 0x90, 0x40, 0xda, 0xc6, 0xa8, 0xe2, 0xb9, 0xfd, 0xff, 0xab, 0xe2, - 0x3c, 0xb2, 0x20, 0x2e, 0xc4, 0x01, 0x99, 0x01, 0x3c, 0xaf, 0xcc, 0xab, 0xca, 0xa2, - 0x22, 0xce, 0x88, 0xb2, 0x28, 0x00, 0x9c, 0x00, 0xb2, 0x20, 0x00, 0x82, 0x02, 0xcc, - 0xf8, 0x82, 0x00, 0xca, 0xfc, 0x50, 0x82, 0x01, 0xca, 0xfc, 0x4e, 0x82, 0x02, 0xca, - 0xfc, 0x4c, 0x90, 0x00, 0xc5, 0x3f, 0xcc, 0x3c, 0x90, 0x53, 0x66, 0x90, 0x71, 0x69, - 0x90, 0x71, 0x6c, 0xaf, 0xcc, 0xab, 0xca, 0xa2, 0x22, 0xce, 0x88, 0xb2, 0x28, 0x00, - 0x9c, 0x00, 0xb2, 0x20, 0x00, 0x82, 0x02, 0xcc, 0xf8, 0xa2, 0x0a, 0x72, 0x88, 0x9d, - 0x01, 0x55, 0x82, 0x00, 0xca, 0xfc, 0x4a, 0x82, 0x08, 0xca, 0xfc, 0x48, 0x41, 0xc5, - 0x3f, 0xcc, 0x3c, 0x90, 0x5e, 0x66, 0x90, 0x61, 0x69, 0x82, 0x00, 0xca, 0xfc, 0x94, - 0x26, 0x82, 0x05, 0xca, 0xfc, 0x94, 0x25, 0x82, 0x09, 0xca, 0xfc, 0x94, 0x24, 0x82, - 0x06, 0xca, 0xfc, 0x94, 0x23, 0x82, 0x0a, 0xca, 0xfc, 0x5e, 0x82, 0x07, 0xca, 0xfc, - 0x94, 0x22, 0x82, 0x0c, 0xca, 0xfc, 0x94, 0x21, 0x3f, 0xcc, 0x3c, 0x91, 0x52, 0x90, - 0xdb, 0x5d, 0x90, 0x61, 0x91, 0x10, 0x58, 0x90, 0xf9, 0x91, 0x52, 0x53, 0x90, 0xdb, - 0x91, 0x61, 0x4e, 0x90, 0xdb, 0x91, 0xed, 0x49, 0x90, 0xdb, 0x91, 0x61, 0x44, 0x90, - 0xf9, 0x91, 0x61, 0xb2, 0x20, 0x02, 0xc5, 0xb2, 0x28, 0x02, 0xa8, 0xca, 0xc5, 0x3f, - 0xcc, 0x3c, 0xab, 0xca, 0xaf, 0xcc, 0xa2, 0x22, 0xce, 0x88, 0xb2, 0x28, 0x00, 0x9c, - 0x00, 0xb2, 0x20, 0x00, 0x82, 0x00, 0xcc, 0xf8, 0x82, 0x00, 0xca, 0xfc, 0x47, 0xc4, - 0x9a, 0x20, 0xc6, 0x3f, 0xcc, 0x3c, 0x90, 0x20, 0x01, 0xd9, 0xc6, 0x3f, 0xcc, 0x3c, - 0xab, 0xca, 0xaf, 0xcc, 0xa2, 0x22, 0xce, 0x88, 0xb2, 0x28, 0x00, 0x9c, 0x00, 0xb2, - 0x20, 0x00, 0xa8, 0xca, 0x99, 0x08, 0x9c, 0x00, 0x4b, 0xa2, 0x18, 0xcc, 0x88, 0x9a, - 0x40, 0xa2, 0x18, 0xcc, 0x8b, 0x4b, 0x90, 0x40, 0x01, 0xa2, 0x18, 0xcc, 0xd9, 0xa2, - 0x18, 0xcc, 0x8b, 0x94, 0x30, 0xae, 0xca, 0x91, 0x00, 0xaf, 0xc8, 0x99, 0x01, 0x9d, - 0x00, 0x82, 0x02, 0xca, 0xfa, 0x3f, 0xc8, 0xaf, 0xc8, 0x99, 0x02, 0x9d, 0x00, 0x82, - 0x04, 0xca, 0xfa, 0x3f, 0xc8, 0xaf, 0xc8, 0x99, 0x04, 0x9d, 0x00, 0x82, 0x08, 0xca, - 0xfa, 0x3f, 0xc8, 0x99, 0x10, 0x9d, 0x00, 0x82, 0x20, 0xca, 0xfa, 0xa2, 0x16, 0xcc, - 0x88, 0x3f, 0xcc, 0x3c, 0xaf, 0xcc, 0xe7, 0xab, 0xca, 0x82, 0x68, 0xca, 0xf8, 0xb2, - 0x28, 0x00, 0x9c, 0x00, 0xb2, 0x20, 0x00, 0x00, 0xa2, 0x12, 0xcc, 0x8e, 0x8b, 0x10, - 0x00, 0xa2, 0x14, 0xcc, 0x8e, 0x8b, 0x11, 0x96, 0x10, 0x11, 0x96, 0x10, 0x0a, 0x82, - 0x2e, 0x10, 0xd9, 0x82, 0x40, 0x11, 0xd9, 0x88, 0x10, 0x96, 0x11, 0xda, 0xad, 0xca, - 0xfa, 0xab, 0x12, 0xa2, 0x10, 0xcc, 0x88, 0x99, 0x07, 0x9c, 0x01, 0xa2, 0x10, 0xcc, - 0x88, 0x99, 0x07, 0x9c, 0x01, 0x4e, 0x9c, 0x02, 0x51, 0x9c, 0x06, 0x4e, 0x9c, 0x04, - 0x48, 0x9c, 0x05, 0x4b, 0x00, 0x4f, 0x90, 0x40, 0x49, 0x90, 0x08, 0x46, 0x90, 0x02, - 0x43, 0x90, 0x04, 0x40, 0xad, 0xca, 0xab, 0xa0, 0xc8, 0x12, 0xfa, 0xad, 0xca, 0xa8, - 0x99, 0x02, 0x9c, 0x00, 0x55, 0x90, 0x03, 0x01, 0xab, 0xca, 0xa2, 0x16, 0xcc, 0x88, - 0x96, 0xca, 0xf9, 0xa2, 0x16, 0xcc, 0x8b, 0x3f, 0xcc, 0xa8, 0x12, 0x3c, 0xa2, 0x16, - 0xcc, 0x88, 0x9a, 0x03, 0x6f, 0xaf, 0xcc, 0xb2, 0x28, 0x00, 0x9c, 0x00, 0xb2, 0x20, - 0x00, 0x82, 0x02, 0xca, 0xfc, 0x58, 0x82, 0x04, 0xca, 0xfc, 0x56, 0x82, 0x01, 0xca, - 0xfc, 0x54, 0x82, 0x08, 0xca, 0xfc, 0x52, 0x86, 0x01, 0x00, 0xca, 0xfc, 0x4f, 0x3f, - 0xcc, 0x3c, 0x90, 0x06, 0x4b, 0x90, 0x05, 0x48, 0x90, 0x01, 0x45, 0x90, 0x04, 0x42, - 0x90, 0x00, 0xab, 0xca, 0x9c, 0x06, 0x30, 0x17, 0x90, 0x07, 0x01, 0xa2, 0x08, 0xcc, - 0xd9, 0x96, 0xca, 0xfa, 0xa2, 0x08, 0xcc, 0x8b, 0x82, 0x06, 0xca, 0xfc, 0x30, 0x08, - 0x3f, 0xcc, 0x3c, 0xc4, 0x9a, 0x40, 0xc6, 0x3c, 0x90, 0x40, 0x01, 0xd9, 0xc6, 0x3c, - 0xaf, 0xcc, 0xb2, 0x10, 0x00, 0xab, 0xca, 0xa2, 0x22, 0xcc, 0x88, 0x8b, 0x12, 0xa2, - 0x26, 0xcc, 0x88, 0x8b, 0x10, 0xa2, 0x2a, 0xcc, 0x88, 0x8b, 0x11, 0x82, 0x03, 0x12, - 0xda, 0x90, 0x20, 0x01, 0xa0, 0xc8, 0x10, 0xd9, 0x82, 0x00, 0xca, 0xfd, 0x82, 0x20, - 0x10, 0xda, 0x90, 0x02, 0x01, 0xa0, 0xc8, 0x10, 0xd9, 0x82, 0x00, 0xca, 0xfd, 0x82, - 0x02, 0x10, 0xda, 0x90, 0x01, 0x01, 0xa0, 0xc8, 0x10, 0xd9, 0x82, 0x00, 0xca, 0xfd, - 0x82, 0x01, 0x10, 0xda, 0x90, 0x10, 0x01, 0xa0, 0xc8, 0x11, 0xd9, 0x82, 0x00, 0xca, - 0xfd, 0x82, 0x10, 0x11, 0xda, 0x00, 0xa2, 0x24, 0xcc, 0x8e, 0x00, 0xa2, 0x28, 0xcc, - 0x8e, 0x88, 0x12, 0xa2, 0x22, 0xcc, 0x8b, 0x88, 0x10, 0xa2, 0x26, 0xcc, 0x8b, 0x88, - 0x11, 0xa2, 0x2a, 0xcc, 0x8b, 0x3f, 0xcc, 0x3c, 0xaf, 0xcc, 0x90, 0x04, 0xb2, 0x10, - 0x04, 0xc6, 0xc4, 0x96, 0xc8, 0x12, 0x64, 0x3f, 0xcc, 0x3c, 0xaf, 0xcc, 0x90, 0x04, - 0xb2, 0x10, 0x04, 0xc6, 0xc4, 0x96, 0xc8, 0x12, 0x64, 0xb6, 0x10, 0x00, 0x88, 0x9a, - 0x01, 0xb6, 0x10, 0x00, 0x8b, 0x90, 0x10, 0xc6, 0x3f, 0xcc, 0x3c, 0xc4, 0xa2, 0x01, - 0xcc, 0xda, 0xa2, 0x02, 0xcc, 0xda, 0xa2, 0x03, 0xcc, 0xda, 0xa2, 0x04, 0xcc, 0xda, - 0xa2, 0x05, 0xcc, 0xda, 0x9c, 0x00, 0x94, 0x85, 0xc4, 0xb6, 0xfe, 0xe0, 0x8b, 0xa2, - 0x01, 0xcc, 0x88, 0xb6, 0xfe, 0xe1, 0x8b, 0xa2, 0x02, 0xcc, 0x88, 0xb6, 0xfe, 0xe2, - 0x8b, 0xa2, 0x03, 0xcc, 0x88, 0xb6, 0xfe, 0xe3, 0x8b, 0xa2, 0x04, 0xcc, 0x88, 0xb6, - 0xfe, 0xe4, 0x8b, 0xa2, 0x05, 0xcc, 0x88, 0xb6, 0xfe, 0xe5, 0x8b, 0xa8, 0x02, 0xb6, - 0xfe, 0xe6, 0x8b, 0xa8, 0x0a, 0xb6, 0xfe, 0xe7, 0x8b, 0xa8, 0x04, 0xb6, 0xfe, 0xe8, - 0xab, 0xa8, 0x06, 0xb6, 0xfe, 0xea, 0xab, 0xa8, 0x08, 0xb6, 0xfe, 0xec, 0xab, 0x3c, - 0xab, 0x6e, 0xae, 0xca, 0xab, 0x70, 0x91, 0x10, 0xb4, 0x80, 0x06, 0xb6, 0x11, 0x26, - 0x88, 0x8b, 0x6c, 0xa8, 0xcc, 0xb6, 0x11, 0x26, 0x8b, 0x3c, 0xb6, 0x10, 0x3a, 0x88, - 0x8b, 0x6d, 0xa8, 0xcc, 0xb6, 0x10, 0x3a, 0x8b, 0x3c, 0xab, 0xca, 0x90, 0x08, 0x01, - 0xb6, 0x10, 0x02, 0xd9, 0x82, 0x00, 0xca, 0xfd, 0x9a, 0x08, 0xb6, 0x10, 0x02, 0x8b, - 0x3c, 0x82, 0x00, 0x7d, 0xdc, 0x3c, 0x00, 0x8b, 0x7d, 0x34, 0xd3, 0xb6, 0x10, 0x00, - 0x88, 0x99, 0xfe, 0xb6, 0x10, 0x00, 0x8b, 0x00, 0x80, 0x6c, 0xcc, 0xab, 0x34, 0x47, - 0x80, 0x6d, 0xcc, 0xab, 0x34, 0x40, 0x00, 0x34, 0x36, 0xb6, 0x10, 0x00, 0x88, 0x9a, - 0x01, 0xb6, 0x10, 0x00, 0x8b, 0x34, 0xf9, 0xb7, 0x00, 0x00, 0x02, 0xb7, 0x00, 0x00, - 0x04, 0xb7, 0x00, 0x00, 0x06, 0xac, 0x74, 0xcc, 0x82, 0x34, 0xcc, 0xf8, 0x00, 0xb5, - 0xf6, 0xe1, 0x91, 0x20, 0xb4, 0x7f, 0x8c, 0x90, 0x04, 0x3c, 0xb6, 0x10, 0x00, 0x88, - 0xb7, 0x00, 0x00, 0x12, 0x96, 0xc8, 0x10, 0x30, 0x40, 0xb1, 0x10, 0x80, 0xc4, 0xad, - 0xca, 0x8b, 0xa2, 0x01, 0xcc, 0x88, 0xa2, 0x02, 0xca, 0x8b, 0xa2, 0x02, 0xcc, 0x88, - 0xa2, 0x04, 0xca, 0x8b, 0xa2, 0x03, 0xcc, 0x88, 0xa2, 0x06, 0xca, 0x8b, 0xa2, 0x04, - 0xcc, 0x88, 0xa2, 0x08, 0xca, 0x8b, 0xa2, 0x05, 0xcc, 0x88, 0xa2, 0x0a, 0xca, 0x8b, - 0x82, 0x00, 0x12, 0xfc, 0x4a, 0xb6, 0x10, 0x00, 0x88, 0x9a, 0x01, 0xb6, 0x10, 0x00, - 0x8b, 0x00, 0x3c, 0xb6, 0x10, 0x00, 0x88, 0x99, 0xfe, 0xb6, 0x10, 0x00, 0x8b, 0xb7, - 0x00, 0x01, 0x12, 0x3c, 0x3c, 0xaf, 0xcc, 0xb2, 0x10, 0x00, 0xc4, 0xab, 0xca, 0x82, - 0x01, 0x02, 0xfc, 0x94, 0x25, 0x82, 0x00, 0x7d, 0xdd, 0x46, 0xa8, 0xca, 0xc6, 0x3f, - 0xcc, 0x3c, 0xaf, 0xca, 0x34, 0xc7, 0x3f, 0xca, 0x90, 0x40, 0x01, 0xb6, 0x10, 0x2a, - 0xd9, 0xb6, 0x10, 0x2a, 0x8b, 0x90, 0x01, 0x01, 0x96, 0xca, 0xf9, 0xab, 0xca, 0x7f, - 0x00, 0xc5, 0x40, 0xad, 0x0a, 0xa8, 0xb6, 0xda, 0xd6, 0xab, 0xa2, 0xa6, 0xcc, 0x8b, - 0x8c, 0xc9, 0xc8, 0xa2, 0xa4, 0xcc, 0x8b, 0xa2, 0x02, 0x0a, 0xa8, 0xb6, 0xda, 0xd8, - 0xab, 0xa2, 0xa2, 0xcc, 0x8b, 0x8c, 0xc9, 0xc8, 0xa2, 0xa0, 0xcc, 0x8b, 0xb7, 0x02, - 0x00, 0x02, 0xb7, 0x00, 0x00, 0x04, 0xa6, 0x01, 0x2e, 0xcc, 0x88, 0x9c, 0x00, 0x4e, - 0xae, 0x02, 0x03, 0xe7, 0xae, 0x02, 0xae, 0x04, 0xf7, 0xae, 0x04, 0xaa, 0xc8, 0x6d, - 0xa8, 0x02, 0x01, 0x03, 0xb8, 0x00, 0x01, 0xab, 0x02, 0xa8, 0x04, 0x01, 0x82, 0x00, - 0xc8, 0xe8, 0xab, 0x04, 0xa2, 0x02, 0x06, 0xfd, 0x94, 0x61, 0xa2, 0x02, 0x06, 0xfc, - 0x94, 0x53, 0xad, 0x06, 0xa8, 0x01, 0x03, 0xb8, 0x00, 0x01, 0xab, 0x02, 0xa2, 0x02, - 0x06, 0xa8, 0x01, 0x82, 0x00, 0xc8, 0xe8, 0xab, 0x04, 0xb7, 0x00, 0x00, 0x06, 0x82, - 0x0f, 0x06, 0xfc, 0x94, 0x2c, 0xb7, 0x02, 0x00, 0x10, 0xb7, 0x00, 0x00, 0x12, 0xa8, - 0x06, 0xae, 0x10, 0x03, 0xe7, 0xae, 0x10, 0xae, 0x12, 0xf7, 0xae, 0x12, 0xaa, 0xc8, - 0x6d, 0xa0, 0x04, 0x12, 0xfd, 0x4f, 0xa0, 0x04, 0x12, 0xfc, 0x44, 0xa9, 0x06, 0x95, - 0x2a, 0xa0, 0x02, 0x10, 0xfd, 0x41, 0x69, 0xa8, 0x06, 0xa6, 0x01, 0x2e, 0xcc, 0x8b, - 0x48, 0xa8, 0x02, 0xad, 0x06, 0xfd, 0x42, 0x95, 0x59, 0xb7, 0x02, 0x00, 0x10, 0xb7, - 0x00, 0x00, 0x12, 0xa6, 0x01, 0x26, 0xcc, 0x88, 0x9c, 0x00, 0x4e, 0xae, 0x10, 0x03, - 0xe7, 0xae, 0x10, 0xae, 0x12, 0xf7, 0xae, 0x12, 0xaa, 0xc8, 0x6d, 0xa8, 0x10, 0x03, - 0x01, 0xb8, 0x00, 0x01, 0xab, 0x10, 0xa8, 0x12, 0x01, 0x82, 0x00, 0xc8, 0xe8, 0xab, - 0x12, 0xa2, 0x02, 0x08, 0xfd, 0x94, 0x58, 0xa2, 0x02, 0x08, 0xfc, 0x94, 0x59, 0xad, - 0x08, 0xa8, 0x03, 0x01, 0xb8, 0x00, 0x01, 0xab, 0x02, 0xa2, 0x02, 0x08, 0xa8, 0x01, - 0x82, 0x00, 0xc8, 0xe8, 0xab, 0x04, 0xb7, 0x00, 0x00, 0x0a, 0x82, 0x0f, 0x0a, 0xfc, - 0x94, 0x2c, 0xb7, 0x02, 0x00, 0x06, 0xb7, 0x00, 0x00, 0x08, 0xa8, 0x0a, 0xae, 0x06, - 0x03, 0xe7, 0xae, 0x06, 0xae, 0x08, 0xf7, 0xae, 0x08, 0xaa, 0xc8, 0x6d, 0xa0, 0x04, - 0x08, 0xfd, 0x4f, 0xa0, 0x04, 0x08, 0xfc, 0x44, 0xa9, 0x0a, 0x95, 0x2a, 0xa0, 0x02, - 0x06, 0xfd, 0x41, 0x69, 0xa8, 0x0a, 0xa6, 0x01, 0x26, 0xcc, 0x8b, 0x82, 0x01, 0xca, - 0xfa, 0xb4, 0xfe, 0x8c, 0xa8, 0x10, 0xad, 0x08, 0xfd, 0x6c, 0x95, 0x5f, 0x90, 0x00, - 0x3c, 0xaf, 0xcc, 0xab, 0xca, 0xa2, 0x22, 0xce, 0x88, 0xe7, 0xb8, 0x00, 0x54, 0xae, - 0xca, 0xad, 0xca, 0xab, 0xa2, 0x22, 0xce, 0x88, 0xb2, 0x28, 0x00, 0x9c, 0x00, 0xb2, - 0x20, 0x00, 0xad, 0xca, 0xa8, 0x9d, 0xff, 0x90, 0xff, 0xa2, 0x2a, 0xcc, 0x8b, 0xab, - 0xcc, 0xad, 0xca, 0xa8, 0x02, 0x96, 0xcc, 0xeb, 0xad, 0xca, 0xab, 0x3f, 0xcc, 0x3c, - 0xaf, 0xcc, 0xa2, 0x22, 0xce, 0x88, 0xb2, 0x28, 0x00, 0x9c, 0x00, 0xb2, 0x20, 0x00, - 0xa2, 0x2c, 0xcc, 0x88, 0xab, 0xca, 0xa2, 0x22, 0xce, 0x88, 0xe7, 0xb8, 0x00, 0x54, - 0xad, 0xc8, 0xa8, 0x96, 0xca, 0xf8, 0x3f, 0xcc, 0x3c, 0xaf, 0xcc, 0xab, 0xca, 0xa2, - 0x22, 0xce, 0x88, 0xb2, 0x28, 0x00, 0x9c, 0x00, 0xb2, 0x20, 0x00, 0x82, 0x01, 0xca, - 0xfc, 0x5c, 0x90, 0x10, 0x82, 0x00, 0xca, 0xfc, 0x4b, 0xa2, 0x06, 0xcc, 0xda, 0xa2, - 0x06, 0xcc, 0x8b, 0x3f, 0xcc, 0x3c, 0x01, 0xa2, 0x06, 0xcc, 0xd9, 0xa2, 0x06, 0xcc, - 0x8b, 0x6c, 0xa2, 0x2a, 0xcc, 0x88, 0xa2, 0x2a, 0xcc, 0x8b, 0x90, 0x10, 0x01, 0xa2, - 0x04, 0xcc, 0xd9, 0xa2, 0x04, 0xcc, 0x8b, 0x95, 0x2f, 0x3c, 0x3c, 0xaf, 0xcc, 0xab, - 0xca, 0xb7, 0x00, 0x00, 0x10, 0xb7, 0x00, 0x00, 0x12, 0x80, 0x7e, 0x12, 0xfc, 0x94, - 0x4f, 0xa8, 0x12, 0xb5, 0xca, 0xbe, 0xa2, 0x4e, 0x76, 0xa8, 0x9c, 0x08, 0x43, 0xa9, - 0x12, 0x74, 0xa2, 0x64, 0x76, 0xa8, 0x96, 0xca, 0xfc, 0x4f, 0x90, 0x02, 0x96, 0xca, - 0xfd, 0x41, 0x71, 0xa2, 0x62, 0x76, 0xa8, 0x9c, 0x04, 0x41, 0x79, 0x91, 0x01, 0xa2, - 0x22, 0x76, 0x88, 0xb5, 0xfb, 0x3d, 0xb7, 0x15, 0x5c, 0x02, 0xb7, 0x00, 0x00, 0x04, - 0xb7, 0x02, 0x00, 0x06, 0xac, 0x76, 0xcc, 0x82, 0x4c, 0xcc, 0xf8, 0xa2, 0x22, 0x76, - 0x88, 0xb5, 0xf3, 0xeb, 0xb7, 0x00, 0x01, 0x10, 0x95, 0x41, 0x82, 0x00, 0x10, 0xfd, - 0x4c, 0x00, 0xb5, 0xca, 0x57, 0xa2, 0x54, 0x74, 0xa8, 0x96, 0xca, 0xfc, 0x43, 0x3f, - 0xcc, 0x3c, 0xb5, 0xfb, 0xeb, 0x66, 0x97, 0x00, 0xd0, 0x83, 0x44, 0x01, 0x91, 0x8b, - 0x40, 0x40, 0x83, 0xcc, 0x01, 0x91, 0x8b, 0x83, 0x00, 0x01, 0x86, 0xab, 0x83, 0x00, - 0x01, 0x8a, 0xab, 0x83, 0x00, 0x01, 0x88, 0xab, 0x83, 0x00, 0x01, 0x8c, 0xab, 0x83, - 0x44, 0x01, 0x91, 0x8b, 0x96, 0xd0, 0x0d, 0xa8, 0xbe, 0x99, 0x03, 0x9c, 0x00, 0x94, - 0x4c, 0xb2, 0x10, 0x00, 0x00, 0xc5, 0xb2, 0x10, 0x04, 0x90, 0x04, 0xc6, 0xc4, 0x96, - 0xc8, 0x12, 0x64, 0xb2, 0x10, 0x5e, 0x90, 0x0b, 0xc5, 0xb2, 0x10, 0x22, 0x90, 0x03, - 0xc5, 0xb2, 0x10, 0x26, 0x90, 0x23, 0xc5, 0xb2, 0x10, 0x2a, 0x90, 0x10, 0xc5, 0xb2, - 0x10, 0x3a, 0x90, 0x3f, 0xc5, 0xb2, 0x10, 0x32, 0x90, 0x20, 0xc5, 0x91, 0x20, 0xb2, - 0x11, 0x7e, 0x00, 0xc5, 0x02, 0x82, 0x02, 0xcc, 0xeb, 0xaa, 0xca, 0x69, 0xb2, 0x10, - 0x00, 0x90, 0x01, 0xc6, 0x96, 0xd0, 0x0a, 0xb0, 0x07, 0xef, 0x9e, 0x32, 0x03, 0xae, - 0xce, 0xd7, 0xae, 0xce, 0xd7, 0x03, 0xae, 0xce, 0xd7, 0xae, 0xce, 0xd7, 0xab, 0x58, - 0xa8, 0xbe, 0x99, 0x0c, 0xc7, 0xc7, 0x99, 0x03, 0x04, 0xab, 0xca, 0xb2, 0x20, 0x00, - 0x96, 0xd0, 0x1b, 0x96, 0xd0, 0x1c, 0x97, 0xe7, 0xd2, 0xb7, 0x00, 0x00, 0x02, 0xac, - 0xca, 0x04, 0xa8, 0xcc, 0x30, 0x51, 0xa9, 0x02, 0xb2, 0x28, 0x00, 0xac, 0x04, 0xca, - 0xaa, 0xca, 0x71, 0x96, 0xd0, 0x0b, 0xa8, 0xbe, 0x99, 0x0c, 0x9d, 0x00, 0x96, 0xd0, - 0x0c, 0xb0, 0x50, 0x06, 0xb6, 0xff, 0xa6, 0xab, 0x05, 0xb6, 0xff, 0xa4, 0xab, 0xb0, - 0x50, 0x07, 0xb6, 0xff, 0xaa, 0xab, 0x05, 0xb6, 0xff, 0xa8, 0xab, 0xb0, 0x50, 0x08, - 0xb6, 0xff, 0xae, 0xab, 0x05, 0xb6, 0xff, 0xac, 0xab, 0xb0, 0x50, 0x09, 0xb6, 0xff, - 0xb2, 0xab, 0x05, 0xb6, 0xff, 0xb0, 0xab, 0x3c, 0xae, 0xca, 0x05, 0x9c, 0x00, 0x59, - 0xae, 0xca, 0x4e, 0xab, 0xca, 0x00, 0xc5, 0xaf, 0xca, 0x91, 0xff, 0x90, 0x01, 0xa2, - 0x3c, 0xcc, 0x8e, 0xa2, 0x3c, 0xcc, 0x88, 0x96, 0xc8, 0x10, 0x7e, 0x3f, 0xca, 0xac, - 0xcc, 0xce, 0x82, 0x30, 0xce, 0xf8, 0x92, 0xce, 0xd4, 0x9d, 0x11, 0x4a, 0xc7, 0x0e, - 0x90, 0x01, 0x06, 0xd6, 0x0b, 0x09, 0x8f, 0x0e, 0xac, 0xca, 0xcc, 0xb6, 0xff, 0x02, - 0xa8, 0x9c, 0x02, 0x54, 0xa2, 0x78, 0xcc, 0x88, 0x9a, 0x08, 0xa2, 0x78, 0xcc, 0x8b, - 0xa2, 0x76, 0xcc, 0x88, 0x9a, 0x08, 0xa2, 0x76, 0xcc, 0x8b, 0x00, 0xa2, 0x4c, 0xcc, - 0x8b, 0x88, 0x59, 0x99, 0x7f, 0xa2, 0x1a, 0xcc, 0x8e, 0x90, 0xff, 0xa2, 0x1c, 0xcc, - 0x8e, 0x88, 0x59, 0xa2, 0x22, 0xcc, 0x8e, 0x90, 0xff, 0xa2, 0x24, 0xcc, 0x8e, 0xa8, - 0x02, 0xb5, 0xf9, 0x00, 0x90, 0x2f, 0xa2, 0x16, 0xcc, 0x8e, 0x00, 0xa2, 0x18, 0xcc, - 0x8e, 0x00, 0xa2, 0x12, 0xcc, 0x8e, 0x00, 0xa2, 0x14, 0xcc, 0x8e, 0x00, 0xa2, 0x04, - 0xcc, 0x8e, 0x90, 0x60, 0xa2, 0x06, 0xcc, 0x8e, 0x90, 0xa6, 0xa2, 0x08, 0xcc, 0x8e, - 0x90, 0x98, 0xa2, 0x02, 0xcc, 0x8e, 0xc4, 0x9a, 0x21, 0xc5, 0x3c, 0xa2, 0x06, 0xcc, - 0xa8, 0xb2, 0x10, 0x00, 0x91, 0x5a, 0xbc, 0x20, 0x33, 0xb4, 0x01, 0x28, 0xbc, 0x20, - 0x35, 0xb4, 0x01, 0x30, 0xbc, 0x20, 0x48, 0x94, 0x69, 0xbc, 0x20, 0x47, 0x94, 0x47, - 0xbc, 0x20, 0x34, 0x94, 0x20, 0xbc, 0x20, 0x36, 0xb4, 0x01, 0x22, 0xbc, 0x20, 0x49, - 0x94, 0x72, 0xbc, 0x20, 0x4a, 0x94, 0x8b, 0xbc, 0x20, 0x51, 0x94, 0xa4, 0xbc, 0x20, - 0x52, 0x94, 0xbd, 0xbc, 0x20, 0x54, 0x94, 0xd6, 0x3c, 0xa6, 0x01, 0x36, 0xcc, 0x88, - 0xd6, 0xa6, 0x01, 0x34, 0xcc, 0x88, 0xa2, 0x01, 0xce, 0x8b, 0xa6, 0x01, 0x32, 0xcc, - 0x88, 0xa2, 0x02, 0xce, 0x8b, 0xa6, 0x01, 0x30, 0xcc, 0x88, 0xa2, 0x03, 0xce, 0x8b, - 0x3c, 0xa6, 0x01, 0x46, 0xcc, 0x88, 0xab, 0x02, 0xa6, 0x01, 0x44, 0xcc, 0x88, 0x8b, - 0x03, 0xa8, 0x02, 0xf1, 0xa6, 0x01, 0x42, 0xcc, 0x88, 0x99, 0x0f, 0xad, 0xca, 0xfa, - 0xf1, 0x3c, 0xa6, 0x01, 0x5e, 0xcc, 0x88, 0xab, 0x02, 0xa6, 0x01, 0x5c, 0xcc, 0x88, - 0x8b, 0x03, 0xa8, 0x02, 0xf1, 0xa6, 0x01, 0x5a, 0xcc, 0x88, 0x99, 0x0f, 0xa2, 0x06, - 0xca, 0xfa, 0xf1, 0x3c, 0xa6, 0x01, 0x6e, 0xcc, 0x88, 0xab, 0x02, 0xa6, 0x01, 0x6c, - 0xcc, 0x88, 0x8b, 0x03, 0xa8, 0x02, 0xf1, 0xa6, 0x01, 0x6a, 0xcc, 0x88, 0x99, 0x0f, - 0xa2, 0x0a, 0xca, 0xfa, 0xf1, 0x3c, 0xa6, 0x01, 0x76, 0xcc, 0x88, 0xab, 0x02, 0xa6, - 0x01, 0x74, 0xcc, 0x88, 0x8b, 0x03, 0xa8, 0x02, 0xf1, 0xa6, 0x01, 0x72, 0xcc, 0x88, - 0x99, 0x0f, 0xa2, 0x0c, 0xca, 0xfa, 0xf1, 0x3c, 0xa6, 0x01, 0x4e, 0xcc, 0x88, 0xab, - 0x02, 0xa6, 0x01, 0x4c, 0xcc, 0x88, 0x8b, 0x03, 0xa8, 0x02, 0xf1, 0xa6, 0x01, 0x4a, - 0xcc, 0x88, 0x99, 0x0f, 0xa2, 0x02, 0xca, 0xfa, 0xf1, 0x3c, 0xa6, 0x01, 0x56, 0xcc, - 0x88, 0xab, 0x02, 0xa6, 0x01, 0x54, 0xcc, 0x88, 0x8b, 0x03, 0xa8, 0x02, 0xf1, 0xa6, - 0x01, 0x52, 0xcc, 0x88, 0x99, 0x0f, 0xa2, 0x04, 0xca, 0xfa, 0xf1, 0x3c, 0xa6, 0x01, - 0x66, 0xcc, 0x88, 0xab, 0x02, 0xa6, 0x01, 0x64, 0xcc, 0x88, 0x8b, 0x03, 0xa8, 0x02, - 0xf1, 0xa6, 0x01, 0x62, 0xcc, 0x88, 0x99, 0x0f, 0xa2, 0x08, 0xca, 0xfa, 0xf1, 0x3c, - 0xb6, 0xda, 0xd6, 0xa8, 0xb9, 0xff, 0x00, 0xf1, 0xb6, 0xda, 0xd8, 0xa8, 0xf1, 0x3c, - 0xa6, 0x01, 0x26, 0xcc, 0x88, 0xf1, 0x3c, 0xa6, 0x01, 0x2e, 0xcc, 0x88, 0xf1, 0x3c, - 0xb7, 0x02, 0x00, 0x02, 0xb7, 0x00, 0x00, 0x04, 0x9c, 0x00, 0x4e, 0xae, 0x02, 0x03, - 0xe7, 0xae, 0x02, 0xae, 0x04, 0xf7, 0xae, 0x04, 0xaa, 0xc8, 0x6d, 0xa8, 0x02, 0x01, - 0x03, 0xb8, 0x00, 0x01, 0xab, 0x02, 0xa8, 0x04, 0x01, 0x82, 0x00, 0xc8, 0xe8, 0xab, - 0x04, 0x3c, 0xa2, 0x2f, 0xce, 0xdc, 0x3c, 0xa2, 0x2f, 0xce, 0x8b, 0xab, 0xca, 0xa2, - 0x54, 0xce, 0xa8, 0x9c, 0x00, 0x94, 0x26, 0x9c, 0x01, 0x41, 0x3c, 0xa2, 0x1c, 0x72, - 0xa8, 0x82, 0x00, 0xca, 0xfd, 0x04, 0x82, 0x00, 0xca, 0xfc, 0x05, 0xa2, 0x1c, 0x72, - 0xab, 0xb7, 0x01, 0x06, 0x02, 0xb7, 0x00, 0x00, 0x04, 0xb7, 0x00, 0x00, 0x06, 0x00, - 0xb4, 0xc8, 0x93, 0xa2, 0x1a, 0x72, 0xa8, 0x82, 0x00, 0xca, 0xfd, 0x04, 0x82, 0x00, - 0xca, 0xfc, 0x05, 0xa2, 0x1a, 0x72, 0xab, 0xb7, 0x01, 0x06, 0x02, 0xb7, 0x00, 0x00, - 0x04, 0xb7, 0x00, 0x00, 0x06, 0x00, 0xb4, 0xc8, 0x71, 0xa2, 0x15, 0x72, 0x88, 0x9c, - 0x00, 0x4d, 0xa2, 0x2f, 0xce, 0x88, 0x9d, 0x00, 0x46, 0x90, 0x01, 0xb5, 0xf7, 0xcc, - 0x45, 0x90, 0x00, 0xb5, 0xf7, 0xc6, 0xb7, 0x62, 0x5a, 0x02, 0xb7, 0x00, 0x02, 0x04, - 0xb7, 0x04, 0x00, 0x06, 0xac, 0xce, 0xcc, 0x82, 0x34, 0xcc, 0xf8, 0xa2, 0x22, 0xce, - 0x88, 0xb4, 0xf0, 0x17, 0xa2, 0x32, 0xce, 0x88, 0x9c, 0x00, 0x94, 0x25, 0xa2, 0x54, - 0xce, 0xa8, 0xb5, 0xc6, 0xab, 0xa2, 0x00, 0x78, 0xa8, 0xab, 0x02, 0xa2, 0x02, 0x78, - 0xa8, 0xab, 0x04, 0xb7, 0x04, 0x00, 0x06, 0xac, 0xce, 0xcc, 0x82, 0x34, 0xcc, 0xf8, - 0xa2, 0x22, 0xce, 0x88, 0xb4, 0xef, 0xea, 0xb7, 0x00, 0x00, 0x02, 0xb7, 0x00, 0x00, - 0x04, 0xb7, 0x04, 0x00, 0x06, 0xac, 0xce, 0xcc, 0x82, 0x34, 0xcc, 0xf8, 0xa2, 0x22, - 0xce, 0x88, 0xb4, 0xef, 0xd0, 0xa2, 0x2d, 0xce, 0x88, 0x9c, 0x00, 0x94, 0x1f, 0xb7, - 0xbc, 0x20, 0x02, 0xb7, 0x00, 0xbe, 0x04, 0xb7, 0x04, 0x00, 0x06, 0xac, 0xce, 0xcc, - 0x82, 0x34, 0xcc, 0xf8, 0xa2, 0x22, 0xce, 0x88, 0xb5, 0xef, 0xae, 0x90, 0x01, 0xb4, - 0xf7, 0x3e, 0xb7, 0x00, 0x00, 0x02, 0xb7, 0x00, 0x00, 0x04, 0xb7, 0x04, 0x00, 0x06, - 0xac, 0xce, 0xcc, 0x82, 0x34, 0xcc, 0xf8, 0xa2, 0x22, 0xce, 0x88, 0xb5, 0xef, 0x8f, - 0x7f, 0xa2, 0x2d, 0xce, 0x88, 0x9c, 0x00, 0x94, 0x1f, 0xb7, 0xbc, 0x20, 0x02, 0xb7, - 0x00, 0xbe, 0x04, 0xb7, 0x04, 0x00, 0x06, 0xac, 0xce, 0xcc, 0x82, 0x34, 0xcc, 0xf8, - 0xa2, 0x22, 0xce, 0x88, 0xb5, 0xef, 0x6c, 0x90, 0x01, 0xb4, 0xf6, 0xfc, 0xb7, 0x9a, - 0xca, 0x02, 0xb7, 0x00, 0x3b, 0x04, 0xb7, 0x04, 0x00, 0x06, 0xac, 0xce, 0xcc, 0x82, - 0x34, 0xcc, 0xf8, 0xa2, 0x22, 0xce, 0x88, 0xb5, 0xef, 0x4d, 0x7f, 0x90, 0x00, 0xb5, - 0xf8, 0xca, 0xb7, 0x00, 0x00, 0x02, 0xac, 0xce, 0xcc, 0x82, 0x12, 0xcc, 0xf8, 0xb7, - 0x00, 0x00, 0x04, 0xb7, 0x00, 0x00, 0x06, 0xb7, 0x00, 0x00, 0x08, 0xb7, 0x00, 0x00, - 0x0a, 0xa2, 0x22, 0xce, 0x88, 0xb5, 0xf7, 0x5f, 0x90, 0x29, 0xa2, 0x3a, 0xce, 0xab, - 0xb0, 0xd2, 0x4d, 0x91, 0x08, 0xb5, 0xf7, 0xb6, 0x3c, 0xb7, 0x00, 0x00, 0x02, 0xac, - 0xce, 0xcc, 0x82, 0x12, 0xcc, 0xf8, 0xb7, 0x00, 0x00, 0x04, 0xb7, 0x00, 0x00, 0x06, - 0xb7, 0x00, 0x00, 0x08, 0xb7, 0x00, 0x00, 0x0a, 0xa2, 0x22, 0xce, 0x88, 0xb5, 0xf7, - 0x2e, 0x90, 0x2a, 0xa2, 0x3a, 0xce, 0xab, 0xb0, 0xf4, 0x7d, 0x91, 0x01, 0xb5, 0xf7, - 0x85, 0x3c, 0xaf, 0xc8, 0xb7, 0x00, 0x01, 0x02, 0xa2, 0x54, 0xce, 0xa8, 0xab, 0x04, - 0xac, 0xce, 0x06, 0x82, 0x42, 0x06, 0xf8, 0xac, 0xce, 0x08, 0x82, 0x3e, 0x08, 0xf8, - 0xac, 0xce, 0x0a, 0x82, 0x3e, 0x0a, 0xf8, 0xa2, 0x22, 0xce, 0x88, 0xb5, 0xf8, 0x41, - 0x90, 0x01, 0xa2, 0x2b, 0xce, 0x8b, 0x3f, 0xc8, 0x9c, 0x02, 0x95, 0x99, 0x95, 0x65, - 0xb7, 0x01, 0x02, 0x02, 0xb7, 0x00, 0x00, 0x04, 0xb7, 0x00, 0x00, 0x06, 0x00, 0xb4, - 0xc6, 0xc6, 0xac, 0xce, 0xcc, 0x82, 0x12, 0xcc, 0xf8, 0xb5, 0xf7, 0xb9, 0x9d, 0x00, - 0x94, 0x2c, 0xa2, 0x54, 0xce, 0xa8, 0xb5, 0xfa, 0x44, 0xa2, 0x2c, 0xce, 0x88, 0x9c, - 0x00, 0x52, 0x90, 0x00, 0xa2, 0x2c, 0xce, 0x8b, 0xa2, 0x22, 0xce, 0x88, 0xab, 0x18, - 0xb0, 0x20, 0x70, 0xb5, 0x0a, 0x52, 0xa2, 0x22, 0xce, 0x88, 0xab, 0x18, 0xb0, 0x20, - 0x29, 0xb4, 0x0a, 0x46, 0x9c, 0x02, 0x95, 0x82, 0x9c, 0x03, 0x95, 0x86, 0x95, 0x52, - 0xb7, 0x00, 0x00, 0x02, 0xb7, 0x00, 0x00, 0x04, 0xac, 0xce, 0x06, 0x82, 0x0e, 0x06, - 0xf8, 0xac, 0xce, 0x08, 0x82, 0x0a, 0x08, 0xf8, 0xac, 0xce, 0x0a, 0x82, 0x0a, 0x0a, - 0xf8, 0xa2, 0x22, 0xce, 0x88, 0xb5, 0xf7, 0xbb, 0x90, 0x00, 0xa2, 0x27, 0xce, 0x8b, - 0xa2, 0x22, 0xce, 0x88, 0xab, 0x18, 0xb0, 0x20, 0x74, 0xb5, 0x0a, 0x06, 0x90, 0x00, - 0xa2, 0x26, 0xce, 0x8b, 0xa2, 0x2c, 0xce, 0x8b, 0xa2, 0x33, 0xce, 0x8b, 0xa2, 0x22, - 0xce, 0x88, 0xab, 0x18, 0xb0, 0x2f, 0x05, 0xb5, 0x09, 0xec, 0x90, 0x01, 0x36, 0x9c, - 0x90, 0x00, 0xa2, 0x3a, 0xce, 0xab, 0xa2, 0x22, 0xce, 0x88, 0xab, 0x18, 0xb0, 0x20, - 0x6f, 0xb5, 0x09, 0xd6, 0x90, 0x00, 0xb4, 0xf5, 0x85, 0xb7, 0x00, 0x01, 0x02, 0xa2, - 0x54, 0xce, 0xa8, 0xab, 0x04, 0xac, 0xce, 0x06, 0x82, 0x42, 0x06, 0xf8, 0xac, 0xce, - 0x08, 0x82, 0x3e, 0x08, 0xf8, 0xac, 0xce, 0x0a, 0x82, 0x46, 0x0a, 0xf8, 0xa2, 0x22, - 0xce, 0x88, 0xb5, 0xf7, 0x4e, 0xa2, 0x22, 0xce, 0x88, 0xb5, 0xf5, 0xd0, 0xb4, 0xf5, - 0xdd, 0x90, 0x00, 0xa2, 0x27, 0xce, 0x8b, 0xa2, 0x26, 0xce, 0x8b, 0xa2, 0x33, 0xce, - 0x8b, 0xa2, 0x22, 0xce, 0x88, 0xab, 0x18, 0xb0, 0x20, 0x74, 0xb5, 0x09, 0x87, 0xa2, - 0x22, 0xce, 0x88, 0xab, 0x18, 0xb0, 0x2f, 0x05, 0xb5, 0x09, 0x7b, 0x90, 0x01, 0xa2, - 0x3a, 0xce, 0xab, 0xa2, 0x22, 0xce, 0x88, 0xab, 0x18, 0xb0, 0x20, 0x6f, 0xb5, 0x09, - 0x69, 0xa2, 0x2e, 0xce, 0x88, 0x9c, 0x00, 0xb4, 0xfd, 0x35, 0x40, 0x90, 0x00, 0x37, - 0x29, 0xa2, 0x29, 0xce, 0x88, 0x9c, 0x00, 0x46, 0x90, 0x01, 0xa2, 0x26, 0xce, 0x8b, - 0xa2, 0x2a, 0xce, 0x88, 0x9c, 0x00, 0x94, 0x26, 0x90, 0x01, 0xa2, 0x33, 0xce, 0x8b, - 0xa2, 0x22, 0xce, 0x88, 0xab, 0x18, 0xb0, 0x2f, 0x05, 0xb5, 0x09, 0x34, 0xa2, 0x02, - 0xce, 0x88, 0xa2, 0x27, 0xce, 0x8b, 0xa2, 0x22, 0xce, 0x88, 0xab, 0x18, 0xb0, 0x20, - 0x74, 0xb5, 0x09, 0x20, 0x90, 0x02, 0xa2, 0x3a, 0xce, 0xab, 0xa2, 0x22, 0xce, 0x88, - 0xab, 0x18, 0xb0, 0x20, 0x6f, 0xb5, 0x09, 0x0e, 0x90, 0x00, 0xb5, 0xf4, 0xbd, 0xa2, - 0x22, 0xce, 0x88, 0xb5, 0xf8, 0x34, 0xa2, 0x32, 0xce, 0x8b, 0xb4, 0xfd, 0x03, 0x90, - 0x03, 0xa2, 0x3a, 0xce, 0xab, 0xa2, 0x22, 0xce, 0x88, 0xab, 0x18, 0xb0, 0x20, 0x6f, - 0xb5, 0x08, 0xe9, 0xa2, 0x2e, 0xce, 0x88, 0x9c, 0x00, 0xb4, 0xfd, 0x2f, 0x95, 0x7f, - 0xa2, 0x2c, 0xce, 0x88, 0x9d, 0x00, 0x52, 0x90, 0x01, 0xa2, 0x2c, 0xce, 0x8b, 0xa2, - 0x22, 0xce, 0x88, 0xab, 0x18, 0xb0, 0x20, 0x70, 0xb5, 0x08, 0xc5, 0x90, 0x00, 0xa2, - 0x2d, 0xce, 0x8b, 0xa2, 0x2b, 0xce, 0x8b, 0xa2, 0x20, 0xce, 0xa8, 0x9c, 0x01, 0xb4, - 0xfe, 0x32, 0x9c, 0x04, 0xb4, 0xfe, 0x1d, 0xb4, 0xfd, 0xe4, 0xa2, 0x2b, 0xce, 0x88, - 0x9c, 0x00, 0x4c, 0xa2, 0x20, 0xce, 0xa8, 0x9c, 0x02, 0xb4, 0xfd, 0x6d, 0xb4, 0xfd, - 0xa0, 0x90, 0x01, 0x37, 0xf1, 0xa2, 0x20, 0xce, 0xa8, 0x9c, 0x01, 0xb4, 0xfe, 0x0a, - 0x9c, 0x04, 0xb4, 0xfd, 0xf5, 0xb4, 0xfd, 0xbc, 0x90, 0x04, 0xa2, 0x3a, 0xce, 0xab, - 0xa2, 0x22, 0xce, 0x88, 0xab, 0x18, 0xb0, 0x20, 0x6f, 0xb5, 0x08, 0x70, 0xa2, 0x2e, - 0xce, 0x88, 0x9d, 0x00, 0x95, 0xf5, 0xb4, 0xfc, 0xf6, 0x90, 0x05, 0xa2, 0x3a, 0xce, - 0xab, 0xa2, 0x22, 0xce, 0x88, 0xab, 0x18, 0xb0, 0x20, 0x6f, 0xb5, 0x08, 0x53, 0x90, - 0x00, 0xb5, 0xf4, 0x02, 0xb5, 0xf7, 0x7d, 0xa2, 0x32, 0xce, 0x8b, 0xb4, 0xfc, 0x4c, - 0xb7, 0x00, 0x01, 0x02, 0xb2, 0x43, 0xb7, 0xa2, 0x18, 0xce, 0xa8, 0xab, 0x04, 0xa2, - 0x1a, 0xce, 0xa8, 0xab, 0x06, 0xa2, 0x1c, 0xce, 0xa8, 0xab, 0x08, 0xb7, 0x00, 0x06, - 0x0a, 0xa2, 0x22, 0xce, 0x88, 0xb5, 0xf4, 0x79, 0x90, 0x06, 0xa2, 0x3a, 0xce, 0xab, - 0xa2, 0x22, 0xce, 0x88, 0xab, 0x18, 0xb0, 0x20, 0x6f, 0xb5, 0x08, 0x0e, 0xb0, 0xd2, - 0x4d, 0x91, 0x08, 0xb5, 0xf4, 0xc4, 0x3c, 0xb7, 0x00, 0x00, 0x02, 0xb7, 0x00, 0x00, - 0x04, 0xb7, 0x04, 0x00, 0x06, 0xac, 0xce, 0xcc, 0x82, 0x34, 0xcc, 0xf8, 0xa2, 0x22, - 0xce, 0x88, 0xb5, 0xec, 0x0a, 0x90, 0x07, 0xa2, 0x3a, 0xce, 0xab, 0xa2, 0x22, 0xce, - 0x88, 0xab, 0x18, 0xb0, 0x20, 0x6f, 0xb5, 0x07, 0xd9, 0x90, 0x00, 0xb5, 0xf3, 0x88, - 0xb7, 0x01, 0x03, 0x02, 0xb7, 0x00, 0x02, 0x04, 0xb7, 0x00, 0x00, 0x06, 0xa2, 0x22, - 0xce, 0x88, 0xb4, 0xc4, 0x07, 0xb5, 0xf3, 0xea, 0xb4, 0xf3, 0xf7, 0xa8, 0x46, 0xb5, - 0xc2, 0x50, 0xa2, 0x00, 0x74, 0xa8, 0x9c, 0x00, 0x3c, 0xa8, 0x44, 0xbc, 0x04, 0x01, - 0x94, 0xbf, 0xbc, 0x04, 0x02, 0x94, 0xc2, 0xbc, 0x04, 0x0e, 0x94, 0xc5, 0xa2, 0x3a, - 0x74, 0xa8, 0x9c, 0x00, 0x54, 0xa2, 0x29, 0x74, 0x88, 0x9d, 0x00, 0x4d, 0xa2, 0x2a, - 0x74, 0x88, 0x9d, 0x00, 0x46, 0xac, 0x74, 0xce, 0xb4, 0xfd, 0x47, 0xa8, 0x44, 0xbc, - 0x04, 0x03, 0x94, 0xaf, 0xbc, 0x04, 0xff, 0x94, 0x3a, 0xa2, 0x3a, 0x74, 0xa8, 0x9c, - 0x00, 0x94, 0xae, 0x9c, 0x01, 0x94, 0xcb, 0x9c, 0x02, 0xb4, 0x01, 0x67, 0x9c, 0x03, - 0xb4, 0x02, 0x1a, 0x9c, 0x04, 0xb4, 0x02, 0xec, 0x9c, 0x05, 0xb4, 0x03, 0x96, 0x9c, - 0x06, 0xb4, 0x04, 0x40, 0x9c, 0x07, 0xb4, 0x04, 0x8f, 0x9c, 0x29, 0xb4, 0x04, 0x8b, - 0x9c, 0x2a, 0xb4, 0x04, 0xa0, 0x9c, 0x2b, 0xb4, 0x04, 0xd6, 0x3c, 0xa2, 0x3a, 0x74, - 0xa8, 0x9c, 0x03, 0x50, 0xa2, 0x34, 0x74, 0xa8, 0x96, 0x48, 0xfc, 0x41, 0x3c, 0x00, - 0xa2, 0x34, 0x74, 0xab, 0x95, 0x4f, 0xa2, 0x36, 0x74, 0xa8, 0x96, 0x48, 0xfc, 0x94, - 0x23, 0xa2, 0x38, 0x74, 0xa8, 0x96, 0x48, 0xfc, 0x42, 0x95, 0x21, 0xa2, 0x2d, 0x74, - 0x88, 0x9d, 0x00, 0x95, 0x6a, 0x90, 0x01, 0xa2, 0x31, 0x74, 0x8b, 0x00, 0xa2, 0x38, - 0x74, 0xab, 0xac, 0x74, 0xce, 0xb4, 0xfb, 0x49, 0x90, 0x01, 0xa2, 0x30, 0x74, 0x8b, - 0x00, 0xa2, 0x36, 0x74, 0x8b, 0xac, 0x74, 0xce, 0xb4, 0xfb, 0x38, 0xa8, 0x48, 0xa2, - 0x29, 0x74, 0x8b, 0x95, 0xbb, 0xa8, 0x48, 0xa2, 0x2a, 0x74, 0x8b, 0x95, 0xc3, 0xa8, - 0x48, 0xa2, 0x28, 0x74, 0x8b, 0xac, 0x74, 0xce, 0xb4, 0xe4, 0x87, 0xa8, 0x48, 0x9d, - 0x00, 0x90, 0x01, 0xa2, 0x2e, 0x74, 0x8b, 0x95, 0xb4, 0xa8, 0x44, 0xbc, 0x04, 0x01, - 0x45, 0xbc, 0x04, 0x02, 0x41, 0x3c, 0xa2, 0x29, 0x74, 0x88, 0x9d, 0x00, 0x47, 0xa2, - 0x2a, 0x74, 0x88, 0x9c, 0x00, 0x3c, 0xac, 0x74, 0xce, 0x37, 0x2c, 0xb4, 0xfc, 0xff, - 0xa8, 0x44, 0xbc, 0x04, 0x03, 0x4a, 0xbc, 0x04, 0xff, 0x53, 0xbc, 0x04, 0x04, 0x94, - 0x79, 0x3c, 0xa2, 0x2e, 0x74, 0x88, 0x9c, 0x00, 0x3c, 0xac, 0x74, 0xce, 0x36, 0xd9, - 0x3c, 0x90, 0x00, 0xa2, 0x27, 0x74, 0x8b, 0xa2, 0x26, 0x74, 0x8b, 0xa2, 0x33, 0x74, - 0x8b, 0xa2, 0x2d, 0x74, 0x8b, 0xa2, 0x30, 0x74, 0x8b, 0xa2, 0x31, 0x74, 0x8b, 0xa2, - 0x22, 0x74, 0x88, 0xab, 0x18, 0xb0, 0x20, 0x74, 0xb5, 0x06, 0x5d, 0xa2, 0x22, 0x74, - 0x88, 0xab, 0x18, 0xb0, 0x2f, 0x05, 0xb5, 0x06, 0x51, 0xb7, 0x00, 0x00, 0x02, 0xb7, - 0x00, 0x00, 0x04, 0xb7, 0x00, 0x00, 0x06, 0xac, 0x74, 0xcc, 0x82, 0x36, 0xcc, 0xf8, - 0x00, 0xb5, 0xea, 0x59, 0xb7, 0x00, 0x00, 0x02, 0xb7, 0x00, 0x00, 0x04, 0xb7, 0x00, - 0x00, 0x06, 0xac, 0x74, 0xcc, 0x82, 0x38, 0xcc, 0xf8, 0x00, 0xb5, 0xea, 0x42, 0x90, - 0x01, 0xac, 0x74, 0xce, 0xb5, 0xf9, 0x95, 0xb4, 0xfd, 0x1d, 0xa2, 0x2f, 0x74, 0x88, - 0x9d, 0x00, 0x3c, 0xa8, 0x48, 0x99, 0x0e, 0x9c, 0x00, 0x3c, 0x90, 0x01, 0xac, 0x74, - 0xce, 0xb5, 0xf9, 0x7c, 0xb4, 0xf9, 0xd4, 0xa8, 0x44, 0xbc, 0x04, 0x03, 0x54, 0xbc, - 0x04, 0x06, 0x5e, 0xbc, 0x04, 0x04, 0x94, 0x54, 0xbc, 0x04, 0xff, 0x94, 0x82, 0xbc, - 0x04, 0x0d, 0x94, 0x93, 0x3c, 0xa2, 0x2e, 0x74, 0x88, 0x9d, 0x00, 0x46, 0xac, 0x74, - 0xce, 0xb4, 0xfc, 0x37, 0x3c, 0xa8, 0x48, 0x9c, 0x02, 0x41, 0x3c, 0x90, 0x00, 0xa2, - 0x27, 0x74, 0x8b, 0xa2, 0x26, 0x74, 0x8b, 0xa2, 0x22, 0x74, 0x88, 0xab, 0x18, 0xb0, - 0x20, 0x74, 0xb5, 0x05, 0xbb, 0xa2, 0x2c, 0x74, 0x88, 0x9d, 0x00, 0x52, 0x90, 0x01, - 0xa2, 0x2c, 0x74, 0x8b, 0xa2, 0x22, 0x74, 0x88, 0xab, 0x18, 0xb0, 0x20, 0x70, 0xb5, - 0x05, 0xa2, 0xac, 0x74, 0xce, 0xb4, 0xfd, 0x37, 0xa8, 0x48, 0x99, 0x10, 0x9c, 0x00, - 0x3c, 0xa2, 0x54, 0x74, 0xa8, 0xb5, 0xc0, 0x50, 0xa2, 0x00, 0x78, 0xa8, 0xa2, 0x02, - 0x78, 0xfa, 0x9c, 0x00, 0x4c, 0x90, 0x01, 0xa2, 0x32, 0x74, 0x8b, 0xac, 0x74, 0xce, - 0xb4, 0xf9, 0x7f, 0x90, 0x00, 0xa2, 0x32, 0x74, 0x8b, 0xac, 0x74, 0xce, 0x36, 0x53, - 0xb4, 0xfb, 0xc8, 0x90, 0x00, 0xa2, 0x32, 0x74, 0x8b, 0xa8, 0x46, 0xb5, 0xf4, 0x90, - 0x9c, 0x00, 0x3c, 0xac, 0x74, 0xce, 0x36, 0x69, 0xb4, 0xfb, 0xb2, 0xa8, 0x48, 0xa2, - 0x02, 0x74, 0x8b, 0xac, 0x74, 0xce, 0xb4, 0xfb, 0xe8, 0xa8, 0x44, 0xbc, 0x04, 0x03, - 0x4a, 0xbc, 0x04, 0x04, 0x54, 0xbc, 0x04, 0xff, 0x94, 0xb4, 0x3c, 0xa2, 0x2e, 0x74, - 0x88, 0x9c, 0x00, 0x3c, 0xac, 0x74, 0xce, 0xb5, 0xfb, 0xcb, 0x3c, 0xa8, 0x48, 0x99, - 0x01, 0x9c, 0x00, 0x48, 0xa2, 0x30, 0x74, 0x88, 0x9d, 0x00, 0x94, 0x4b, 0xa8, 0x48, - 0x99, 0x02, 0x9c, 0x00, 0x48, 0xa2, 0x31, 0x74, 0x88, 0x9d, 0x00, 0x94, 0x3c, 0xa8, - 0x48, 0x99, 0x20, 0x9d, 0x00, 0x94, 0x34, 0xa8, 0x48, 0x99, 0x03, 0x9c, 0x00, 0x94, - 0x35, 0xa2, 0x2d, 0x74, 0x88, 0x9c, 0x00, 0x94, 0x2d, 0x90, 0x00, 0xa2, 0x2d, 0x74, - 0x8b, 0xb7, 0x15, 0xa4, 0x02, 0xb7, 0x00, 0x00, 0x04, 0xb7, 0x04, 0x00, 0x06, 0xac, - 0x74, 0xcc, 0x82, 0x38, 0xcc, 0xf8, 0xa8, 0x46, 0xb5, 0xe8, 0xf4, 0xac, 0x74, 0xce, - 0xb4, 0xf9, 0x1e, 0xac, 0x74, 0xce, 0xb5, 0xfb, 0xeb, 0xb4, 0xfc, 0x44, 0xa8, 0x48, - 0x99, 0x08, 0x9c, 0x00, 0x94, 0x32, 0xa2, 0x2d, 0x74, 0x88, 0x9d, 0x00, 0x94, 0x2a, - 0xb7, 0x15, 0xa4, 0x02, 0xb7, 0x00, 0x00, 0x04, 0xb7, 0x04, 0x00, 0x06, 0xac, 0x74, - 0xcc, 0x82, 0x36, 0xcc, 0xf8, 0xa8, 0x46, 0xb5, 0xe8, 0xbd, 0x90, 0x01, 0xa2, 0x2d, - 0x74, 0x8b, 0x90, 0x00, 0xa2, 0x31, 0x74, 0x8b, 0xac, 0x74, 0xce, 0xb4, 0xf8, 0xdb, - 0x90, 0x00, 0xac, 0x74, 0xce, 0xb4, 0xf0, 0x38, 0xa2, 0x2a, 0x74, 0x88, 0x9c, 0x00, - 0x3c, 0xa2, 0x2d, 0x74, 0x88, 0x9c, 0x00, 0x3c, 0xac, 0x74, 0xce, 0xb4, 0xfc, 0x2c, - 0xa8, 0x44, 0xbc, 0x04, 0x0b, 0x50, 0xbc, 0x04, 0x04, 0x94, 0x2f, 0xbc, 0x04, 0x03, - 0x94, 0x5e, 0xbc, 0x04, 0xff, 0x94, 0x7d, 0x3c, 0xa8, 0x48, 0xa2, 0x2c, 0x74, 0xdc, - 0x50, 0xa2, 0x2c, 0x74, 0x8b, 0xa2, 0x22, 0x74, 0x88, 0xab, 0x18, 0xb0, 0x20, 0x70, - 0xb5, 0x04, 0x43, 0xa2, 0x2c, 0x74, 0x88, 0x9d, 0x00, 0x3c, 0xac, 0x74, 0xce, 0xb4, - 0xfa, 0x95, 0xa8, 0x48, 0x99, 0x06, 0x9c, 0x00, 0x53, 0xa2, 0x2d, 0x74, 0x88, 0x9c, - 0x00, 0x4c, 0x90, 0x00, 0xa2, 0x2d, 0x74, 0x8b, 0xac, 0x74, 0xce, 0xb4, 0xf8, 0xad, - 0xa8, 0x48, 0x99, 0x08, 0x9c, 0x00, 0x3c, 0xa2, 0x2d, 0x74, 0x88, 0x9d, 0x00, 0x3c, - 0x90, 0x01, 0xa2, 0x2d, 0x74, 0x8b, 0xac, 0x74, 0xce, 0xb4, 0xf8, 0x93, 0xa2, 0x2e, - 0x74, 0x88, 0x9c, 0x00, 0x3c, 0x90, 0x00, 0xac, 0x74, 0xce, 0xb5, 0xf7, 0x6d, 0x90, - 0x01, 0xa2, 0x33, 0x74, 0x8b, 0xa2, 0x22, 0x74, 0x88, 0xab, 0x18, 0xb0, 0x2f, 0x05, - 0xb5, 0x03, 0xe1, 0xb4, 0xfb, 0x79, 0xa2, 0x2d, 0x74, 0x88, 0x9d, 0x00, 0x49, 0xac, - 0x74, 0xce, 0xb5, 0xfb, 0x27, 0xb4, 0xf8, 0x5f, 0xa2, 0x2a, 0x74, 0x88, 0x9c, 0x00, - 0x3c, 0xac, 0x74, 0xce, 0xb4, 0xfb, 0x7d, 0xa8, 0x44, 0xbc, 0x04, 0x06, 0x50, 0xbc, - 0x04, 0x03, 0x94, 0x32, 0xbc, 0x04, 0x04, 0x94, 0x54, 0xbc, 0x04, 0xff, 0x94, 0x83, - 0x3c, 0xa8, 0x48, 0x9c, 0x01, 0x41, 0x3c, 0xac, 0x74, 0xce, 0xa2, 0x2c, 0x74, 0x88, - 0x9d, 0x00, 0x30, 0x04, 0xb5, 0xfa, 0x38, 0x3c, 0x90, 0x00, 0xa2, 0x2c, 0x74, 0x8b, - 0xa2, 0x22, 0x74, 0x88, 0xab, 0x18, 0xb0, 0x20, 0x70, 0xb4, 0x03, 0x84, 0xa2, 0x2e, - 0x74, 0x88, 0x9d, 0x00, 0x3c, 0x90, 0x00, 0xa2, 0x2b, 0x74, 0x8b, 0xa2, 0x2d, 0x74, - 0x8b, 0xa2, 0x33, 0x74, 0x8b, 0xa2, 0x22, 0x74, 0x88, 0xab, 0x18, 0xb0, 0x2f, 0x05, - 0xb5, 0x03, 0x63, 0xac, 0x74, 0xce, 0xb4, 0xfa, 0xdb, 0xa8, 0x48, 0x99, 0x10, 0x9c, - 0x00, 0x3c, 0xa2, 0x54, 0x74, 0xa8, 0xb5, 0xbe, 0x11, 0xa2, 0x00, 0x74, 0xa8, 0xa2, - 0x00, 0x74, 0xfa, 0x9c, 0x00, 0x4c, 0x90, 0x01, 0xa2, 0x32, 0x74, 0x8b, 0xac, 0x74, - 0xce, 0xb4, 0xf7, 0x40, 0x90, 0x00, 0xa2, 0x32, 0x74, 0x8b, 0xac, 0x74, 0xce, 0xb5, - 0xfb, 0x6b, 0xb4, 0xfa, 0xa7, 0x90, 0x00, 0xa2, 0x32, 0x74, 0x8b, 0xa8, 0x46, 0xb5, - 0xf2, 0x50, 0x9c, 0x00, 0x3c, 0xac, 0x74, 0xce, 0xb5, 0xfb, 0x54, 0xb4, 0xfa, 0x90, - 0xa8, 0x44, 0xbc, 0x04, 0x04, 0x4b, 0xbc, 0x04, 0x0c, 0x94, 0x32, 0xbc, 0x04, 0xff, - 0x94, 0x2d, 0x3c, 0xa8, 0x48, 0x99, 0x06, 0x9c, 0x00, 0x3c, 0xa2, 0x2c, 0x74, 0x88, - 0x9d, 0x00, 0x4f, 0xb5, 0xef, 0xe7, 0x90, 0x00, 0xa2, 0x2d, 0x74, 0x8b, 0xac, 0x74, - 0xce, 0xb4, 0xf9, 0xe9, 0xb5, 0xef, 0xd8, 0x90, 0x00, 0xa2, 0x2d, 0x74, 0x8b, 0xac, - 0x74, 0xce, 0xb4, 0xfa, 0x53, 0xb5, 0xef, 0xc9, 0xa2, 0x14, 0x72, 0x88, 0x9c, 0x00, - 0x3c, 0xa2, 0x34, 0x74, 0xa8, 0x9d, 0x00, 0x3c, 0xac, 0x74, 0xce, 0xb4, 0xfa, 0xb9, - 0x3c, 0xa8, 0x44, 0xbc, 0x04, 0xff, 0x41, 0x3c, 0x90, 0x01, 0xac, 0x74, 0xce, 0xb5, - 0xf0, 0x50, 0xb5, 0xef, 0xa2, 0xa8, 0x46, 0xb5, 0xee, 0xd2, 0xb4, 0xfa, 0x21, 0xa8, - 0x44, 0xbc, 0x04, 0xff, 0x41, 0x3c, 0xb5, 0xef, 0x90, 0xb7, 0x00, 0x00, 0x02, 0xac, - 0xce, 0xcc, 0x82, 0x12, 0xcc, 0xf8, 0xb7, 0x00, 0x00, 0x04, 0xb7, 0x00, 0x00, 0x06, - 0xb7, 0x00, 0x00, 0x08, 0xb7, 0x00, 0x00, 0x0a, 0xa2, 0x22, 0xce, 0x88, 0xb5, 0xee, - 0xd0, 0xb0, 0xd2, 0x4d, 0x91, 0x08, 0xb5, 0xef, 0x2d, 0x90, 0x2b, 0xa2, 0x3a, 0x74, - 0xab, 0x3c, 0xa8, 0x44, 0xbc, 0x04, 0xff, 0x41, 0x3c, 0xb5, 0xef, 0x55, 0xac, 0x74, - 0xce, 0xb4, 0xf9, 0xd6, 0xa2, 0x28, 0xce, 0x88, 0xab, 0xca, 0x90, 0x01, 0x82, 0x00, - 0xca, 0xfc, 0x44, 0xe7, 0xaa, 0xca, 0x63, 0xab, 0x02, 0xa2, 0x06, 0xce, 0xa8, 0xe7, - 0xe7, 0xab, 0xca, 0xa8, 0x02, 0x82, 0x00, 0xca, 0xfc, 0x44, 0xe7, 0xaa, 0xca, 0x63, - 0xab, 0x02, 0xa2, 0x08, 0x72, 0xa8, 0x96, 0x02, 0xf9, 0x9c, 0x00, 0x42, 0x00, 0x3c, - 0x90, 0x01, 0x3c, 0xab, 0xca, 0x9c, 0x03, 0xb4, 0x01, 0x80, 0x05, 0xab, 0x02, 0xb7, - 0x00, 0x04, 0x04, 0x92, 0x00, 0xb7, 0x00, 0x00, 0x06, 0x82, 0x00, 0x06, 0xfd, 0xb4, - 0x01, 0x69, 0x82, 0x04, 0x04, 0xfc, 0xb4, 0x01, 0x46, 0xaf, 0xcc, 0xa8, 0x02, 0xe7, - 0xe7, 0xa0, 0xc8, 0xcc, 0xf8, 0x82, 0x58, 0xcc, 0xf8, 0xa2, 0x01, 0xcc, 0x88, 0xab, - 0x04, 0xc4, 0xab, 0x08, 0x3f, 0xcc, 0x82, 0x04, 0x04, 0xfc, 0x94, 0x41, 0xa8, 0x08, - 0xb5, 0xbc, 0x75, 0xac, 0x74, 0xcc, 0x82, 0x01, 0xca, 0xfc, 0x4c, 0x82, 0x02, 0xca, - 0xfc, 0x54, 0x82, 0x03, 0xca, 0xfc, 0x57, 0x95, 0x44, 0xa2, 0x4a, 0xcc, 0x88, 0x9c, - 0x00, 0x72, 0xb7, 0x00, 0x02, 0x06, 0x95, 0x51, 0xa2, 0x4b, 0xcc, 0x88, 0x9c, 0x00, - 0x7a, 0x6d, 0xa2, 0x4c, 0xcc, 0x88, 0x9c, 0x00, 0x95, 0x61, 0xa2, 0x06, 0xcc, 0xa8, - 0x05, 0x96, 0x02, 0xfc, 0x7e, 0x95, 0x6c, 0xa8, 0x08, 0xb5, 0xbc, 0x48, 0xac, 0x76, - 0xce, 0x82, 0x01, 0xca, 0xfc, 0x4e, 0x82, 0x02, 0xca, 0xfc, 0x94, 0x5d, 0x82, 0x03, - 0xca, 0xfc, 0x94, 0x76, 0x95, 0x87, 0xa2, 0x06, 0xce, 0xa8, 0x9c, 0x00, 0x4d, 0x9c, - 0x01, 0x58, 0x9c, 0x02, 0x94, 0x2b, 0x9c, 0x03, 0x94, 0x39, 0x95, 0x9b, 0xa2, 0x56, - 0xce, 0x88, 0x9c, 0x00, 0x95, 0xa3, 0xb7, 0x00, 0x04, 0x06, 0x95, 0xa9, 0xa2, 0x57, - 0xce, 0x88, 0x9d, 0x00, 0x6c, 0xa2, 0x58, 0xce, 0x88, 0x9d, 0x00, 0x73, 0xa2, 0x56, - 0xce, 0x88, 0x9d, 0x00, 0x7a, 0x95, 0xc0, 0xa2, 0x57, 0xce, 0x88, 0x9d, 0x00, 0x95, - 0x23, 0xa2, 0x58, 0xce, 0x88, 0x9d, 0x00, 0x95, 0x2b, 0x95, 0xd2, 0xa2, 0x59, 0xce, - 0x88, 0x9c, 0x00, 0x95, 0xda, 0x95, 0x37, 0xa2, 0x06, 0xce, 0xa8, 0x9c, 0x00, 0x95, - 0x39, 0x9c, 0x01, 0x95, 0x2f, 0x9c, 0x02, 0x95, 0x22, 0x9c, 0x03, 0x42, 0x95, 0xf1, - 0xa2, 0x5a, 0xce, 0x88, 0x9c, 0x00, 0x95, 0xf9, 0x95, 0x56, 0xa2, 0x0a, 0xce, 0xa8, - 0x05, 0x96, 0x02, 0xfc, 0x43, 0xb4, 0xfe, 0xf7, 0xa2, 0x06, 0xce, 0xa8, 0x9c, 0x03, - 0x94, 0x26, 0xa2, 0x5e, 0xce, 0x88, 0x9c, 0x00, 0xb4, 0xfe, 0xe6, 0xa2, 0x56, 0xce, - 0x88, 0x9d, 0x00, 0xb4, 0xfe, 0xdd, 0xa2, 0x57, 0xce, 0x88, 0x9d, 0x00, 0xb4, 0xfe, - 0xd4, 0xa2, 0x58, 0xce, 0x88, 0x9d, 0x00, 0xb4, 0xfe, 0xcb, 0x95, 0x90, 0xa2, 0x5e, - 0xce, 0x88, 0x9c, 0x00, 0xb4, 0xfe, 0xc0, 0xa2, 0x59, 0xce, 0x88, 0x9d, 0x00, 0xb4, - 0xfe, 0xb7, 0xa2, 0x5a, 0xce, 0x88, 0x9d, 0x00, 0xb4, 0xfe, 0xae, 0x95, 0xad, 0xaf, - 0xce, 0xa8, 0x02, 0xe7, 0xe7, 0xa0, 0xc8, 0xce, 0xf8, 0x82, 0x1a, 0xce, 0xf8, 0xa2, - 0x01, 0xce, 0x88, 0xab, 0x04, 0xd4, 0xab, 0x08, 0x3f, 0xce, 0xb4, 0xfe, 0xb7, 0xa8, - 0x06, 0x3c, 0xa2, 0x0a, 0xce, 0xa8, 0x05, 0xab, 0x02, 0xb4, 0xfe, 0x79, 0xb7, 0x00, - 0x01, 0x02, 0xb7, 0x00, 0x00, 0x04, 0xa2, 0x06, 0xce, 0xa8, 0x9c, 0x00, 0x94, 0x24, - 0x9c, 0x01, 0x94, 0x47, 0x9c, 0x02, 0x94, 0x43, 0x9c, 0x03, 0x94, 0x59, 0x82, 0x00, - 0x04, 0xfc, 0x50, 0xaf, 0xce, 0xa8, 0x04, 0x35, 0xb6, 0x3f, 0xce, 0x9c, 0x02, 0x42, - 0x00, 0x3c, 0x90, 0x01, 0x3c, 0xa8, 0x02, 0x3c, 0xa2, 0x5b, 0xce, 0x88, 0xa2, 0x5f, - 0xce, 0xda, 0xa2, 0x5d, 0xce, 0xda, 0xa2, 0x61, 0xce, 0xda, 0x9c, 0x00, 0x46, 0xb7, - 0x00, 0x02, 0x04, 0x95, 0x2f, 0xa2, 0x5e, 0xce, 0x88, 0x9c, 0x00, 0x95, 0x37, 0xb7, - 0x00, 0x03, 0x04, 0x95, 0x3d, 0xa2, 0x5b, 0xce, 0x88, 0xa2, 0x5f, 0xce, 0xda, 0xa2, - 0x5c, 0xce, 0xda, 0xa2, 0x60, 0xce, 0xda, 0x9c, 0x00, 0x95, 0x20, 0xb7, 0x00, 0x01, - 0x04, 0x95, 0x57, 0xa2, 0x59, 0xce, 0x88, 0x9c, 0x00, 0x46, 0xb7, 0x00, 0x01, 0x04, - 0x95, 0x64, 0xa2, 0x5a, 0xce, 0x88, 0x9c, 0x00, 0x95, 0x3b, 0xb7, 0x00, 0x02, 0x04, - 0x95, 0x72, 0xab, 0x1a, 0xbc, 0x10, 0x29, 0x94, 0x80, 0xbc, 0x10, 0x2a, 0x94, 0x86, - 0xbc, 0x10, 0x2b, 0x94, 0x86, 0xbc, 0x10, 0x2e, 0x94, 0xad, 0xbc, 0x20, 0x17, 0x94, - 0xae, 0xbc, 0x20, 0x6f, 0x94, 0xb4, 0xbc, 0x20, 0x70, 0x94, 0xba, 0xbc, 0x20, 0x74, - 0x94, 0xc5, 0xbc, 0x20, 0x29, 0x94, 0xca, 0xbc, 0x2f, 0x07, 0x94, 0xe3, 0xbc, 0x2f, - 0x05, 0x94, 0xe9, 0xbc, 0x32, 0x0e, 0x94, 0xef, 0xbc, 0x40, 0x0d, 0xb4, 0x01, 0x00, - 0xbc, 0x40, 0x0f, 0xb4, 0x01, 0x11, 0xbc, 0x40, 0x10, 0xb4, 0x01, 0x4f, 0xbc, 0x40, - 0x21, 0xb4, 0x01, 0x61, 0xbc, 0x40, 0x2a, 0xb4, 0x01, 0x72, 0xbc, 0x40, 0x33, 0xb4, - 0x01, 0x8d, 0xbc, 0x40, 0x40, 0xb4, 0x01, 0x9f, 0xbc, 0x40, 0x34, 0xb4, 0x01, 0xb1, - 0xbc, 0x40, 0x35, 0xb4, 0x01, 0xcc, 0xbc, 0x40, 0x3d, 0xb4, 0x01, 0xe7, 0xbc, 0x40, - 0x3e, 0xb4, 0x01, 0xf9, 0xbc, 0x40, 0x3f, 0xb4, 0x02, 0x0b, 0x3c, 0xa2, 0x20, 0x72, - 0xa8, 0xab, 0x1c, 0x90, 0x02, 0xb4, 0x02, 0x17, 0xa2, 0x22, 0x72, 0xa8, 0x6b, 0xa2, - 0x14, 0x72, 0x88, 0x9c, 0x00, 0x43, 0x90, 0x00, 0x75, 0xb7, 0x00, 0x00, 0x1c, 0xa2, - 0x1a, 0x72, 0xa8, 0x9c, 0x00, 0x46, 0x90, 0x01, 0xa0, 0xc8, 0x1c, 0xfa, 0xa2, 0x1c, - 0x72, 0xa8, 0x9c, 0x00, 0x46, 0x90, 0x02, 0xa0, 0xc8, 0x1c, 0xfa, 0xa8, 0x1c, 0x95, - 0x36, 0xa2, 0x27, 0x72, 0x88, 0x94, 0x1f, 0xa8, 0x18, 0xb5, 0xb9, 0xcc, 0xa2, 0x52, - 0x74, 0xa8, 0x95, 0x47, 0xa8, 0x18, 0xb5, 0xb9, 0xc1, 0xa2, 0x3a, 0x74, 0xa8, 0x95, - 0x52, 0xa8, 0x18, 0xb5, 0xb9, 0xb6, 0xa2, 0x2c, 0x74, 0x88, 0xab, 0x1c, 0x90, 0x01, - 0xb4, 0x01, 0xba, 0xa8, 0x18, 0xb5, 0xb9, 0xa6, 0xa2, 0x27, 0x74, 0x88, 0x70, 0xa8, - 0x18, 0xb5, 0xb9, 0x9c, 0xaf, 0xcc, 0xaf, 0xca, 0xac, 0x74, 0xca, 0x82, 0x12, 0xca, - 0xf8, 0x92, 0x1c, 0xb5, 0xe2, 0x82, 0x3f, 0xca, 0x3f, 0xcc, 0x90, 0x06, 0xb4, 0x01, - 0x92, 0xa8, 0x18, 0xb5, 0xb9, 0x7e, 0xa2, 0x24, 0x74, 0xa8, 0x95, 0x95, 0xa8, 0x18, - 0xb5, 0xb9, 0x73, 0xa2, 0x33, 0x74, 0x88, 0x95, 0x43, 0x8c, 0x7c, 0x3c, 0xac, 0x78, - 0x3e, 0xa8, 0x18, 0xb5, 0xb9, 0x8a, 0xa2, 0x12, 0x78, 0xa8, 0x8c, 0x3c, 0x7c, 0xac, - 0x3e, 0x78, 0x95, 0xb7, 0x8c, 0x7b, 0x3c, 0xac, 0x76, 0x3e, 0xa8, 0x18, 0xb5, 0xb9, - 0x5f, 0xa2, 0x28, 0x76, 0x88, 0x8c, 0x3c, 0x7b, 0xac, 0x3e, 0x76, 0x95, 0xce, 0x8c, - 0x7b, 0x3c, 0xac, 0x76, 0x3e, 0xa8, 0x18, 0xb5, 0xb9, 0x48, 0xaf, 0xcc, 0xaf, 0xce, - 0xac, 0x76, 0xcc, 0x82, 0x46, 0xcc, 0xf8, 0x90, 0x09, 0xb5, 0x21, 0xe6, 0x94, 0x20, - 0x00, 0xab, 0x1c, 0xac, 0x76, 0xcc, 0x82, 0x44, 0xcc, 0xf8, 0x90, 0x09, 0xb5, 0x21, - 0xd5, 0x54, 0x00, 0x96, 0x1c, 0xfa, 0x3f, 0xce, 0x3f, 0xcc, 0x8c, 0x3c, 0x7b, 0xac, - 0x3e, 0x76, 0x95, 0xae, 0x90, 0x02, 0x95, 0x21, 0x90, 0x01, 0x75, 0x8c, 0x7b, 0x3c, - 0xac, 0x76, 0x3e, 0xa8, 0x18, 0xb5, 0xb9, 0x04, 0xa2, 0x62, 0x76, 0xa8, 0x8c, 0x3c, - 0x7b, 0xac, 0x3e, 0x76, 0xb4, 0xfe, 0xd4, 0x8c, 0x7b, 0x3c, 0xac, 0x76, 0x3e, 0xa8, - 0x18, 0xb5, 0xb8, 0xec, 0xa2, 0x3f, 0x76, 0x88, 0x8c, 0x3c, 0x7b, 0xac, 0x3e, 0x76, - 0x95, 0xe4, 0x8c, 0x7b, 0x3c, 0xac, 0x76, 0x3e, 0xa8, 0x18, 0xb5, 0xb8, 0xd5, 0xa2, - 0x30, 0x76, 0xa8, 0xab, 0x1c, 0xa2, 0x32, 0x76, 0xa8, 0xab, 0x1e, 0x8c, 0x3c, 0x7b, - 0xac, 0x3e, 0x76, 0x90, 0x04, 0x94, 0xba, 0x8c, 0x7b, 0x3c, 0xac, 0x76, 0x3e, 0xa8, - 0x18, 0xb5, 0xb8, 0xb4, 0xa2, 0x74, 0x76, 0x88, 0x8c, 0x3c, 0x7b, 0xac, 0x3e, 0x76, - 0xb4, 0xfe, 0xe1, 0x8c, 0x7b, 0x3c, 0xac, 0x76, 0x3e, 0xa8, 0x18, 0xb5, 0xb8, 0x9c, - 0xa2, 0x12, 0x76, 0x88, 0x8c, 0x3c, 0x7b, 0xac, 0x3e, 0x76, 0xb4, 0xfe, 0xc9, 0x8c, - 0x7b, 0x3c, 0xac, 0x76, 0x3e, 0xa8, 0x18, 0xb5, 0xb8, 0x84, 0xa2, 0x68, 0x76, 0xa8, - 0xab, 0x1c, 0xa2, 0x6a, 0x76, 0xa8, 0xab, 0x1e, 0x8c, 0x3c, 0x7b, 0xac, 0x3e, 0x76, - 0x90, 0x04, 0x94, 0x69, 0x8c, 0x7b, 0x3c, 0xac, 0x76, 0x3e, 0xa8, 0x18, 0xb5, 0xb8, - 0x63, 0xa2, 0x6c, 0x76, 0xa8, 0xab, 0x1c, 0xa2, 0x6e, 0x76, 0xa8, 0xab, 0x1e, 0x8c, - 0x3c, 0x7b, 0xac, 0x3e, 0x76, 0x90, 0x04, 0x94, 0x48, 0x8c, 0x7b, 0x3c, 0xac, 0x76, - 0x3e, 0xa8, 0x18, 0xb5, 0xb8, 0x42, 0xa2, 0x2c, 0x76, 0xa8, 0x8c, 0x3c, 0x7b, 0xac, - 0x3e, 0x76, 0xb4, 0xfe, 0x12, 0x8c, 0x7b, 0x3c, 0xac, 0x76, 0x3e, 0xa8, 0x18, 0xb5, - 0xb8, 0x2a, 0xa2, 0x4e, 0x76, 0xa8, 0x8c, 0x3c, 0x7b, 0xac, 0x3e, 0x76, 0xb4, 0xfd, - 0xfa, 0x8c, 0x7b, 0x3c, 0xac, 0x76, 0x3e, 0xa8, 0x18, 0xb5, 0xb8, 0x12, 0xa2, 0x2a, - 0x76, 0x88, 0x8c, 0x3c, 0x7b, 0xac, 0x3e, 0x76, 0xb4, 0xfd, 0xe2, 0x9a, 0x20, 0xb4, - 0x11, 0x76, 0xa2, 0x06, 0xcc, 0xa8, 0xbc, 0x10, 0x1a, 0x94, 0x8b, 0xbc, 0x10, 0x1b, - 0x94, 0xa9, 0xbc, 0x10, 0x1f, 0x94, 0xed, 0xbc, 0x1f, 0x07, 0xb4, 0x00, 0xff, 0xbc, - 0x1f, 0x08, 0xb4, 0x01, 0x02, 0xbc, 0x20, 0x20, 0xb4, 0x01, 0x05, 0xbc, 0x20, 0x76, - 0xb4, 0x01, 0x47, 0xbc, 0x20, 0x18, 0xb4, 0x01, 0x56, 0xbc, 0x20, 0x1d, 0xb4, 0x01, - 0x6d, 0xbc, 0x2f, 0x01, 0xb4, 0x01, 0x7c, 0xbc, 0x2f, 0x03, 0xb4, 0x01, 0x86, 0xbc, - 0x32, 0x15, 0xb4, 0x01, 0xba, 0xbc, 0x32, 0x16, 0xb4, 0x01, 0xb4, 0xbc, 0x32, 0x17, - 0xb4, 0x01, 0xae, 0xbc, 0x32, 0x13, 0xb4, 0x02, 0x21, 0xbc, 0x40, 0x0e, 0xb4, 0x02, - 0x3a, 0xbc, 0x40, 0x11, 0xb4, 0x02, 0x44, 0xbc, 0x40, 0x3a, 0xb4, 0x02, 0x69, 0xbc, - 0x40, 0x3b, 0xb4, 0x02, 0x73, 0xbc, 0x40, 0x15, 0xb4, 0x02, 0x7d, 0xbc, 0x40, 0x1f, - 0xb4, 0x02, 0x96, 0xbc, 0x4f, 0x02, 0xb4, 0x02, 0xca, 0xbc, 0x60, 0x00, 0x41, 0x3c, - 0xb5, 0xed, 0x17, 0x90, 0x01, 0xa2, 0x0e, 0x72, 0x8b, 0x3c, 0xa2, 0x0e, 0xcc, 0xa8, - 0x99, 0x01, 0xa2, 0x15, 0x72, 0x8b, 0xb7, 0x01, 0x06, 0x02, 0xb7, 0x00, 0x00, 0x04, - 0xb7, 0x00, 0x00, 0x06, 0x00, 0xb5, 0xb8, 0xea, 0xa2, 0x0e, 0xcc, 0xa8, 0xa2, 0x06, - 0x72, 0xab, 0x3c, 0xa2, 0x0e, 0xcc, 0xa8, 0xa2, 0x08, 0x72, 0xab, 0xb7, 0x00, 0x00, - 0x0a, 0x80, 0x7e, 0x0a, 0xfc, 0x3c, 0xa8, 0x0a, 0xb5, 0xb7, 0x33, 0xa2, 0x4e, 0x76, - 0xa8, 0x9c, 0x00, 0x4d, 0x9c, 0x01, 0x4a, 0x9c, 0x02, 0x47, 0x9c, 0x03, 0x44, 0x9c, - 0x09, 0x41, 0x44, 0xa9, 0x0a, 0x95, 0x20, 0xac, 0x76, 0xce, 0xb5, 0xfa, 0x0f, 0x9d, - 0x00, 0x6c, 0xb7, 0x02, 0x01, 0x02, 0xb7, 0x00, 0x00, 0x04, 0xb7, 0x00, 0x00, 0x06, - 0xa8, 0x0a, 0xb5, 0xb8, 0x99, 0x7e, 0xa2, 0x10, 0xcc, 0xa8, 0xab, 0xca, 0xa2, 0x0e, - 0xcc, 0xa8, 0xb5, 0x10, 0x45, 0xa2, 0x02, 0x72, 0xab, 0xa8, 0xca, 0xa2, 0x04, 0x72, - 0xab, 0x3c, 0xa2, 0x0e, 0xcc, 0xa8, 0xa2, 0x34, 0x72, 0xab, 0x3c, 0xa2, 0x0e, 0xcc, - 0x88, 0xa2, 0x30, 0x72, 0xab, 0x3c, 0xa2, 0x0a, 0xcc, 0xa8, 0xb5, 0xb6, 0xbb, 0xa2, - 0x0e, 0xcc, 0x88, 0xa2, 0x08, 0x74, 0x8b, 0xac, 0x74, 0xce, 0xb5, 0xd9, 0xcd, 0xa2, - 0x12, 0x72, 0x88, 0x9c, 0x02, 0x4a, 0xb5, 0xb6, 0xb7, 0xac, 0x76, 0xce, 0xb5, 0xd2, - 0xe6, 0x3c, 0xa2, 0x10, 0x72, 0x88, 0x9c, 0x02, 0x4a, 0xb5, 0xb6, 0xa6, 0xac, 0x76, - 0xce, 0xb5, 0xd2, 0xd5, 0x3c, 0xa2, 0x11, 0x72, 0x88, 0x9c, 0x02, 0x3c, 0xb5, 0xb6, - 0x95, 0xac, 0x76, 0xce, 0xb5, 0xd2, 0xc4, 0x3c, 0xb7, 0x04, 0x0d, 0x02, 0xa2, 0x0e, - 0xcc, 0x88, 0xab, 0x04, 0xb7, 0x00, 0x00, 0x06, 0xa2, 0x0a, 0xcc, 0xa8, 0xb4, 0xb8, - 0x11, 0xa2, 0x0a, 0xcc, 0xa8, 0xb5, 0xb6, 0x5e, 0xac, 0xcc, 0xca, 0xaf, 0xcc, 0xac, - 0x74, 0xcc, 0x82, 0x18, 0xcc, 0xf8, 0x82, 0x0e, 0xca, 0xf8, 0xb5, 0xdf, 0x41, 0x3f, - 0xcc, 0x3c, 0xb7, 0x04, 0x06, 0x02, 0xa2, 0x0e, 0xcc, 0xa8, 0xab, 0x04, 0xb7, 0x00, - 0x00, 0x06, 0xa2, 0x0a, 0xcc, 0xa8, 0xb4, 0xb7, 0xdf, 0xa2, 0x0a, 0xcc, 0xa8, 0xb5, - 0xb6, 0x2c, 0xa2, 0x0e, 0xcc, 0xa8, 0xa2, 0x20, 0x74, 0xab, 0x3c, 0xa2, 0x0a, 0xcc, - 0xa8, 0xb5, 0xb6, 0x1c, 0xa2, 0x06, 0x74, 0xa8, 0xa2, 0x0e, 0xcc, 0xfc, 0x3c, 0xa2, - 0x06, 0x74, 0xab, 0xa2, 0x52, 0x74, 0xa8, 0x9c, 0x03, 0x44, 0x9d, 0x03, 0x41, 0x3c, - 0xa2, 0x1e, 0x74, 0xa8, 0xaf, 0xc8, 0x90, 0x00, 0xa2, 0x1e, 0x74, 0xab, 0xac, 0x74, - 0xce, 0xb5, 0xd9, 0x12, 0x3f, 0xc8, 0xa2, 0x1e, 0x74, 0xab, 0xb4, 0xd9, 0x09, 0xa2, - 0x0a, 0xcc, 0xa8, 0xb5, 0xb6, 0x0a, 0xb7, 0x00, 0x00, 0x0c, 0x82, 0x01, 0x0c, 0xfc, - 0x3c, 0xa8, 0x0c, 0xb5, 0xb5, 0xd4, 0xa2, 0x54, 0x74, 0xa8, 0xa2, 0x0a, 0xcc, 0xfc, - 0x43, 0xa9, 0x0c, 0x75, 0xa2, 0x0c, 0x78, 0xa8, 0xa2, 0x42, 0x74, 0xab, 0xa2, 0x0e, - 0x78, 0xa8, 0xa2, 0x44, 0x74, 0xab, 0xa2, 0x08, 0x78, 0xa8, 0xa2, 0x3e, 0x74, 0xab, - 0xa2, 0x0a, 0x78, 0xa8, 0xa2, 0x40, 0x74, 0xab, 0xa2, 0x04, 0x78, 0xa8, 0xa2, 0x46, - 0x74, 0xab, 0xa2, 0x04, 0x78, 0xa8, 0xa2, 0x46, 0x74, 0xab, 0x90, 0x01, 0xab, 0x02, - 0xa2, 0x54, 0x74, 0xa8, 0xab, 0x04, 0xac, 0x74, 0x06, 0x82, 0x42, 0x06, 0xf8, 0xac, - 0x74, 0x08, 0x82, 0x3e, 0x08, 0xf8, 0xac, 0x74, 0x0a, 0x82, 0x46, 0x0a, 0xf8, 0xa2, - 0x22, 0x74, 0x88, 0xb5, 0xe8, 0x7b, 0x95, 0x59, 0xa2, 0x0a, 0xcc, 0xa8, 0xb5, 0xb5, - 0x91, 0xa2, 0x10, 0xcc, 0xa8, 0xab, 0xca, 0xa2, 0x0e, 0xcc, 0xa8, 0xb5, 0x0e, 0xc2, - 0xa2, 0x00, 0x78, 0xab, 0xa8, 0xca, 0xa2, 0x02, 0x78, 0xab, 0x3c, 0xa2, 0x0a, 0xcc, - 0xa8, 0xb5, 0xb5, 0x5e, 0xa2, 0x0e, 0xcc, 0x88, 0xa2, 0x0c, 0x76, 0xab, 0x3c, 0xa2, - 0x0a, 0xcc, 0xa8, 0xb5, 0xb5, 0x4e, 0xac, 0xcc, 0xce, 0x82, 0x0e, 0xce, 0xf8, 0xa9, - 0xce, 0xd4, 0xa2, 0x13, 0x76, 0x8b, 0xa2, 0x01, 0xce, 0x88, 0xa2, 0x14, 0x76, 0x8b, - 0xa2, 0x02, 0xce, 0x88, 0xa2, 0x15, 0x76, 0x8b, 0xac, 0x76, 0xce, 0xb4, 0xd1, 0x5f, - 0xa2, 0x0a, 0xcc, 0xa8, 0xb5, 0xb5, 0x23, 0xa2, 0x0e, 0xcc, 0x88, 0xa2, 0x10, 0x76, - 0x8b, 0x3c, 0xa2, 0x0a, 0xcc, 0xa8, 0xb5, 0xb5, 0x13, 0xa2, 0x0e, 0xcc, 0x88, 0xa2, - 0x11, 0x76, 0x8b, 0x3c, 0xa2, 0x0a, 0xcc, 0xa8, 0xb5, 0xb5, 0x03, 0xa2, 0x10, 0xcc, - 0xa8, 0xab, 0xca, 0xa2, 0x0e, 0xcc, 0xa8, 0xb5, 0x0e, 0x48, 0xa2, 0x00, 0x76, 0xab, - 0xa8, 0xca, 0xa2, 0x02, 0x76, 0xab, 0x3c, 0xa2, 0x0a, 0xcc, 0xa8, 0xb5, 0xb4, 0xe4, - 0xa2, 0x0e, 0xcc, 0x88, 0x91, 0x00, 0x9c, 0x00, 0x91, 0x02, 0x9c, 0x01, 0x91, 0x01, - 0x9c, 0x02, 0x91, 0x08, 0x9c, 0x03, 0x91, 0x04, 0x9c, 0x04, 0xb1, 0x01, 0x00, 0xa8, - 0xca, 0xa2, 0x04, 0x76, 0xab, 0xb7, 0x02, 0x02, 0x02, 0xac, 0xca, 0x04, 0xb7, 0x00, - 0x00, 0x06, 0xa2, 0x0a, 0xcc, 0xa8, 0xb4, 0xb6, 0x49, 0xa2, 0x0a, 0xcc, 0xa8, 0xb5, - 0xb4, 0xaa, 0xa2, 0x0a, 0x76, 0xa8, 0xa2, 0x0e, 0xcc, 0xfc, 0x3c, 0xa2, 0x0e, 0xcc, - 0xa8, 0xa2, 0x0a, 0x76, 0xab, 0xa2, 0x62, 0x76, 0xa8, 0x9d, 0x03, 0x44, 0x9c, 0x03, - 0x41, 0x3c, 0xa2, 0x17, 0x76, 0xa8, 0xaf, 0xc8, 0x90, 0x00, 0xa2, 0x17, 0x76, 0xab, - 0xac, 0x76, 0xce, 0xb5, 0xd0, 0xb1, 0x3f, 0xc8, 0xa2, 0x17, 0x76, 0xab, 0xb4, 0xd0, - 0xa8, 0xa2, 0x0c, 0xcc, 0xa8, 0xb6, 0xb8, 0x00, 0xab, 0xa2, 0x0a, 0xcc, 0xa8, 0xb5, - 0xb4, 0x50, 0xa2, 0x04, 0xcc, 0xa8, 0xbc, 0x13, 0x13, 0x53, 0xbc, 0x13, 0x14, 0xb4, - 0x01, 0x5c, 0xbc, 0x13, 0x15, 0xb4, 0x01, 0xc3, 0xbc, 0x13, 0x16, 0xb4, 0x02, 0xf5, - 0x3c, 0xac, 0xcc, 0xce, 0x82, 0x16, 0xce, 0xf8, 0xa2, 0x04, 0x74, 0xa8, 0x9d, 0x00, - 0x3c, 0xd4, 0xa2, 0x08, 0x74, 0x8b, 0xa2, 0x02, 0xce, 0x88, 0xab, 0xca, 0xa2, 0x01, - 0xce, 0x88, 0x8c, 0xca, 0xc9, 0xa2, 0x04, 0x74, 0xab, 0xa2, 0x03, 0xce, 0x88, 0xa2, - 0x02, 0x74, 0x8b, 0xa2, 0x04, 0xce, 0xa8, 0xa2, 0x20, 0x74, 0xab, 0xa2, 0x06, 0xce, - 0xa8, 0xa2, 0x06, 0x74, 0xab, 0xb7, 0x00, 0x00, 0x02, 0xaf, 0xcc, 0xaf, 0xce, 0xac, - 0x74, 0xcc, 0x82, 0x58, 0xcc, 0xf8, 0x82, 0x08, 0xce, 0xf8, 0x80, 0x7e, 0x02, 0xfc, - 0x94, 0xf1, 0xd4, 0xc6, 0xa2, 0x01, 0xce, 0x88, 0xa2, 0x01, 0xcc, 0x8b, 0xa2, 0x02, - 0xce, 0x88, 0xa2, 0x02, 0xcc, 0x8b, 0xa2, 0x03, 0xce, 0x88, 0xa2, 0x03, 0xcc, 0x8b, - 0xa2, 0x01, 0xcc, 0x88, 0xa2, 0x22, 0x74, 0xdc, 0x94, 0x74, 0xa2, 0x01, 0xcc, 0x88, - 0x9c, 0x02, 0x94, 0xa0, 0xaf, 0x76, 0x88, 0x7b, 0xaf, 0xc8, 0xc4, 0xb5, 0xb3, 0xbe, - 0xac, 0x76, 0xca, 0x82, 0x1a, 0xca, 0xf8, 0xa8, 0x02, 0x9c, 0x00, 0x47, 0x82, 0x04, - 0xca, 0xf8, 0xaa, 0xc8, 0x66, 0x3f, 0xc8, 0x8b, 0x7b, 0x3f, 0x76, 0xa2, 0x22, 0x74, - 0x88, 0xa2, 0x02, 0xca, 0x8b, 0x90, 0x02, 0xa2, 0x03, 0xca, 0x8b, 0xa2, 0x03, 0xcc, - 0x88, 0x9c, 0x02, 0x94, 0x3f, 0xaf, 0x76, 0x88, 0x7b, 0xaf, 0xc8, 0xa2, 0x02, 0xcc, - 0x88, 0xb5, 0xb3, 0x82, 0xac, 0x76, 0xca, 0x82, 0x1a, 0xca, 0xf8, 0xa8, 0x02, 0x9c, - 0x00, 0x47, 0x82, 0x04, 0xca, 0xf8, 0xaa, 0xc8, 0x66, 0x3f, 0xc8, 0x8b, 0x7b, 0x3f, - 0x76, 0xa2, 0x22, 0x74, 0x88, 0xad, 0xca, 0x8b, 0x90, 0x02, 0xa2, 0x01, 0xca, 0x8b, - 0xa9, 0x02, 0x82, 0x04, 0xcc, 0xf8, 0x82, 0x04, 0xce, 0xf8, 0x95, 0xa8, 0xaf, 0x74, - 0x88, 0x7a, 0xaf, 0xc8, 0xa2, 0x02, 0xcc, 0x88, 0xb5, 0xb3, 0x2f, 0xac, 0x74, 0xca, - 0x82, 0x58, 0xca, 0xf8, 0xa8, 0x02, 0x9c, 0x00, 0x47, 0x82, 0x04, 0xca, 0xf8, 0xaa, - 0xc8, 0x66, 0x3f, 0xc8, 0x8b, 0x7a, 0x3f, 0x74, 0x95, 0x3f, 0xaf, 0x74, 0x88, 0x7a, - 0xaf, 0xc8, 0xc4, 0xb5, 0xb3, 0x0a, 0xac, 0x74, 0xca, 0x82, 0x58, 0xca, 0xf8, 0xa8, - 0x02, 0x9c, 0x00, 0x47, 0x82, 0x04, 0xca, 0xf8, 0xaa, 0xc8, 0x66, 0x3f, 0xc8, 0x8b, - 0x7a, 0x3f, 0x74, 0x95, 0xa0, 0x3f, 0xce, 0x3f, 0xcc, 0xa2, 0x0c, 0x72, 0x89, 0x3c, - 0xac, 0xcc, 0xce, 0x82, 0x16, 0xce, 0xf8, 0xa2, 0x04, 0x74, 0xa8, 0x9c, 0x00, 0x3c, - 0x90, 0x01, 0xa2, 0x00, 0x74, 0x8b, 0xf4, 0xa2, 0x0a, 0x74, 0xab, 0xa2, 0x02, 0xce, - 0xa8, 0xa2, 0x0c, 0x74, 0xab, 0xa2, 0x04, 0xce, 0xa8, 0xa2, 0x0e, 0x74, 0xab, 0xa2, - 0x06, 0xce, 0xa8, 0xa2, 0x10, 0x74, 0xab, 0xa2, 0x08, 0xce, 0x88, 0xa2, 0x1e, 0x74, - 0x8b, 0xac, 0xce, 0xca, 0x82, 0x09, 0xca, 0xf8, 0xaf, 0xcc, 0xac, 0x74, 0xcc, 0x82, - 0x12, 0xcc, 0xf8, 0xb5, 0xdb, 0x90, 0xa2, 0x20, 0x72, 0xa8, 0x9c, 0x01, 0x41, 0x3c, - 0xb7, 0x04, 0x0e, 0x02, 0xb7, 0x00, 0x01, 0x04, 0xb7, 0x00, 0x00, 0x06, 0xa2, 0x22, - 0x74, 0x88, 0xb5, 0xb4, 0x2b, 0xac, 0x74, 0xce, 0xb4, 0xd5, 0x99, 0x90, 0x01, 0xa2, - 0x00, 0x74, 0xab, 0xa2, 0x52, 0x74, 0xa8, 0x9c, 0x03, 0xb4, 0x00, 0xff, 0x9c, 0x02, - 0xb4, 0x01, 0x0f, 0xb7, 0x00, 0x00, 0x02, 0xaf, 0xcc, 0xac, 0xcc, 0xce, 0x82, 0x16, - 0xcc, 0xf8, 0xac, 0x74, 0xcc, 0x82, 0x58, 0xcc, 0xf8, 0x82, 0x08, 0xce, 0xf8, 0x80, - 0x7e, 0x02, 0xfc, 0x94, 0xd4, 0xa2, 0x01, 0xcc, 0x88, 0xa2, 0x22, 0x74, 0xdc, 0x94, - 0x71, 0x9c, 0x02, 0x94, 0xa1, 0xaf, 0x76, 0x88, 0x7b, 0xaf, 0xc8, 0xc4, 0xb5, 0xb2, - 0x43, 0xac, 0x76, 0xca, 0x82, 0x1a, 0xca, 0xf8, 0xa8, 0x02, 0x9c, 0x00, 0x47, 0x82, - 0x04, 0xca, 0xf8, 0xaa, 0xc8, 0x66, 0x3f, 0xc8, 0x8b, 0x7b, 0x3f, 0x76, 0xa2, 0x02, - 0xcc, 0x88, 0xa2, 0x02, 0xca, 0x8b, 0xa2, 0x03, 0xcc, 0x88, 0xa2, 0x03, 0xca, 0x8b, - 0xa2, 0x03, 0xcc, 0x88, 0x9c, 0x02, 0x94, 0x3e, 0xaf, 0x76, 0x88, 0x7b, 0xaf, 0xc8, - 0xa2, 0x02, 0xcc, 0x88, 0xb5, 0xb2, 0x05, 0xac, 0x76, 0xca, 0x82, 0x1a, 0xca, 0xf8, - 0xa8, 0x02, 0x9c, 0x00, 0x47, 0x82, 0x04, 0xca, 0xf8, 0xaa, 0xc8, 0x66, 0x3f, 0xc8, - 0x8b, 0x7b, 0x3f, 0x76, 0xc4, 0xad, 0xca, 0x8b, 0xa2, 0x01, 0xcc, 0x88, 0xa2, 0x01, - 0xca, 0x8b, 0xa9, 0x02, 0x82, 0x04, 0xcc, 0xf8, 0x82, 0x04, 0xce, 0xf8, 0x95, 0x8b, - 0xaf, 0x74, 0x88, 0x7a, 0xaf, 0xc8, 0xa2, 0x02, 0xcc, 0x88, 0xb5, 0xb1, 0xb3, 0xac, - 0x74, 0xca, 0x82, 0x58, 0xca, 0xf8, 0xa8, 0x02, 0x9c, 0x00, 0x47, 0x82, 0x04, 0xca, - 0xf8, 0xaa, 0xc8, 0x66, 0x3f, 0xc8, 0x8b, 0x7a, 0x3f, 0x74, 0x95, 0x3e, 0xaf, 0x74, - 0x88, 0x7a, 0xaf, 0xc8, 0xc4, 0xb5, 0xb1, 0x8e, 0xac, 0x74, 0xca, 0x82, 0x58, 0xca, - 0xf8, 0xa8, 0x02, 0x9c, 0x00, 0x47, 0x82, 0x04, 0xca, 0xf8, 0xaa, 0xc8, 0x66, 0x3f, - 0xc8, 0x8b, 0x7a, 0x3f, 0x74, 0x95, 0xa1, 0x3f, 0xcc, 0xac, 0x74, 0xce, 0xb4, 0xd7, - 0x33, 0xa2, 0x2c, 0x72, 0xa8, 0x05, 0xa2, 0x2c, 0x72, 0xab, 0x04, 0x9d, 0x00, 0xb4, - 0xfe, 0xf7, 0xb5, 0xd5, 0x76, 0xb4, 0xfe, 0xf1, 0xa2, 0x2e, 0x72, 0xa8, 0x05, 0xa2, - 0x2e, 0x72, 0xab, 0x04, 0x9d, 0x00, 0xb4, 0xfe, 0xe2, 0xb5, 0xd5, 0x61, 0xb4, 0xfe, - 0xdc, 0xac, 0x74, 0xce, 0xb5, 0xd6, 0x9f, 0xa2, 0x0c, 0x72, 0x88, 0x05, 0xa2, 0x0c, - 0x72, 0x8b, 0x3c, 0xa2, 0x0c, 0xcc, 0xa8, 0xb6, 0xb8, 0x00, 0xab, 0xa2, 0x0a, 0xcc, - 0xa8, 0xb5, 0xb1, 0x36, 0xa2, 0x04, 0xcc, 0xa8, 0xbc, 0x13, 0x17, 0x53, 0xbc, 0x13, - 0x18, 0xb4, 0x02, 0x2c, 0xbc, 0x13, 0x19, 0xb4, 0x02, 0x48, 0xbc, 0x13, 0x1a, 0xb4, - 0x02, 0x85, 0x3c, 0xac, 0xcc, 0xce, 0x82, 0x16, 0xce, 0xf8, 0xa2, 0x08, 0x76, 0xa8, - 0x9d, 0x00, 0x3c, 0xf4, 0xa2, 0x06, 0x76, 0xab, 0x9c, 0x00, 0x4e, 0x9c, 0x01, 0x94, - 0x3c, 0x9c, 0x02, 0x94, 0x6a, 0x9c, 0x03, 0x94, 0x98, 0x94, 0xb6, 0xaf, 0xcc, 0xac, - 0x76, 0xcc, 0xa2, 0x03, 0xce, 0x88, 0x99, 0x01, 0xa2, 0x13, 0xcc, 0x8b, 0xa2, 0x04, - 0xce, 0x88, 0x99, 0x5b, 0xa2, 0x14, 0xcc, 0x8b, 0xa2, 0x05, 0xce, 0x88, 0x99, 0xdb, - 0xa2, 0x15, 0xcc, 0x8b, 0xa2, 0x0a, 0x72, 0x89, 0xa2, 0x22, 0x76, 0x88, 0xa2, 0x10, - 0x72, 0x8b, 0x3f, 0xcc, 0x3c, 0xaf, 0xcc, 0xac, 0x76, 0xcc, 0xa2, 0x03, 0xce, 0x88, - 0x99, 0x01, 0xa2, 0x13, 0xcc, 0x8b, 0xa2, 0x04, 0xce, 0x88, 0x99, 0x6d, 0xa2, 0x14, - 0xcc, 0x8b, 0xa2, 0x05, 0xce, 0x88, 0x99, 0xed, 0xa2, 0x15, 0xcc, 0x8b, 0xa2, 0x0a, - 0x72, 0x89, 0xa2, 0x22, 0x76, 0x88, 0xa2, 0x11, 0x72, 0x8b, 0x3f, 0xcc, 0x3c, 0xaf, - 0xcc, 0xac, 0x76, 0xcc, 0xa2, 0x03, 0xce, 0x88, 0x99, 0x01, 0xa2, 0x13, 0xcc, 0x8b, - 0xa2, 0x04, 0xce, 0x88, 0x99, 0x6d, 0xa2, 0x14, 0xcc, 0x8b, 0xa2, 0x05, 0xce, 0x88, - 0x99, 0x6d, 0xa2, 0x15, 0xcc, 0x8b, 0xa2, 0x0a, 0x72, 0x89, 0xa2, 0x22, 0x76, 0x88, - 0xa2, 0x12, 0x72, 0x8b, 0x3f, 0xcc, 0x3c, 0xaf, 0xcc, 0xac, 0x76, 0xcc, 0xa2, 0x03, - 0xce, 0x88, 0x99, 0x01, 0xa2, 0x13, 0xcc, 0x8b, 0xa2, 0x04, 0xce, 0x88, 0x99, 0x37, - 0xa2, 0x14, 0xcc, 0x8b, 0xa2, 0x0b, 0x72, 0x89, 0x3f, 0xcc, 0x3c, 0xa2, 0x06, 0xce, - 0xa8, 0xa2, 0x08, 0x76, 0xab, 0xa2, 0x08, 0xce, 0x88, 0xa2, 0x10, 0x76, 0x8b, 0xa2, - 0x09, 0xce, 0x88, 0xa2, 0x11, 0x76, 0x8b, 0xa2, 0x0a, 0xce, 0xa8, 0xa2, 0x0a, 0x76, - 0xab, 0xb7, 0x00, 0x00, 0x02, 0xaf, 0xcc, 0xaf, 0xce, 0xac, 0x76, 0xcc, 0x82, 0x1a, - 0xcc, 0xf8, 0x82, 0x0c, 0xce, 0xf8, 0x80, 0x7e, 0x02, 0xfc, 0x94, 0xef, 0xd4, 0xc6, - 0xa2, 0x01, 0xce, 0x88, 0xa2, 0x01, 0xcc, 0x8b, 0xa2, 0x02, 0xce, 0x88, 0xa2, 0x02, - 0xcc, 0x8b, 0xa2, 0x03, 0xce, 0x88, 0xa2, 0x03, 0xcc, 0x8b, 0xa2, 0x01, 0xcc, 0x88, - 0xa2, 0x22, 0x76, 0xdc, 0x94, 0xbf, 0x9c, 0x02, 0x94, 0x96, 0xaf, 0x76, 0x88, 0x7b, - 0xaf, 0xc8, 0xc4, 0xb5, 0xaf, 0xd6, 0xac, 0x76, 0xca, 0x82, 0x1a, 0xca, 0xf8, 0xa8, - 0x02, 0x9c, 0x00, 0x47, 0x82, 0x04, 0xca, 0xf8, 0xaa, 0xc8, 0x66, 0x3f, 0xc8, 0x8b, - 0x7b, 0x3f, 0x76, 0xa2, 0x22, 0x76, 0x88, 0xa2, 0x02, 0xca, 0x8b, 0x90, 0x04, 0xa2, - 0x03, 0xca, 0x8b, 0xa2, 0x03, 0xcc, 0x88, 0x9c, 0x02, 0x94, 0x35, 0xaf, 0x76, 0x88, - 0x7b, 0xaf, 0xc8, 0xa2, 0x02, 0xcc, 0x88, 0xb5, 0xaf, 0x9a, 0xac, 0x76, 0xca, 0x82, - 0x1a, 0xca, 0xf8, 0xa8, 0x02, 0x9c, 0x00, 0x47, 0x82, 0x04, 0xca, 0xf8, 0xaa, 0xc8, - 0x66, 0x3f, 0xc8, 0x8b, 0x7b, 0x3f, 0x76, 0xa2, 0x22, 0x76, 0x88, 0xad, 0xca, 0x8b, - 0x90, 0x04, 0xa2, 0x01, 0xca, 0x8b, 0x94, 0x4d, 0xaf, 0x74, 0x88, 0x7a, 0xaf, 0xc8, - 0xa2, 0x02, 0xcc, 0x88, 0xb5, 0xaf, 0x51, 0xac, 0x74, 0xca, 0x82, 0x58, 0xca, 0xf8, - 0xa8, 0x02, 0x9c, 0x00, 0x47, 0x82, 0x04, 0xca, 0xf8, 0xaa, 0xc8, 0x66, 0x3f, 0xc8, - 0x8b, 0x7a, 0x3f, 0x74, 0x95, 0x35, 0xaf, 0x74, 0x88, 0x7a, 0xaf, 0xc8, 0xc4, 0xb5, - 0xaf, 0x2c, 0xac, 0x74, 0xca, 0x82, 0x58, 0xca, 0xf8, 0xa8, 0x02, 0x9c, 0x00, 0x47, - 0x82, 0x04, 0xca, 0xf8, 0xaa, 0xc8, 0x66, 0x3f, 0xc8, 0x8b, 0x7a, 0x3f, 0x74, 0x95, - 0x96, 0xa9, 0x02, 0x82, 0x04, 0xcc, 0xf8, 0x82, 0x04, 0xce, 0xf8, 0x95, 0xf3, 0x3f, - 0xce, 0x3f, 0xcc, 0xa2, 0x14, 0xce, 0xa8, 0xa2, 0x00, 0x76, 0xab, 0xa2, 0x16, 0xce, - 0xa8, 0xa2, 0x02, 0x76, 0xab, 0xa2, 0x18, 0xce, 0xa8, 0xa2, 0x04, 0x76, 0xab, 0x3c, - 0xac, 0xcc, 0xce, 0x82, 0x16, 0xce, 0xf8, 0xa2, 0x08, 0x76, 0xa8, 0x9c, 0x00, 0x3c, - 0x90, 0x01, 0xa2, 0x0e, 0x76, 0xab, 0xd4, 0xa2, 0x17, 0x76, 0x8b, 0xa2, 0x01, 0xce, - 0x88, 0xa2, 0x18, 0x76, 0x8b, 0x3c, 0x90, 0x00, 0xa2, 0x0e, 0x76, 0xab, 0xa2, 0x06, - 0x76, 0xa8, 0x9c, 0x03, 0x46, 0xac, 0x76, 0xce, 0xb4, 0xd5, 0x89, 0xa2, 0x62, 0x76, - 0xa8, 0x9c, 0x03, 0x44, 0x9c, 0x02, 0x53, 0x70, 0xa2, 0x28, 0x72, 0xa8, 0x05, 0xa2, - 0x28, 0x72, 0xab, 0x04, 0x9d, 0x00, 0x7d, 0xb5, 0xd2, 0xb5, 0x95, 0x21, 0xa2, 0x2a, - 0x72, 0xa8, 0x05, 0xa2, 0x2a, 0x72, 0xab, 0x04, 0x9d, 0x00, 0x95, 0x2f, 0xb5, 0xd2, - 0xa2, 0x95, 0x34, 0xac, 0xcc, 0xce, 0x82, 0x16, 0xce, 0xf8, 0xa2, 0x06, 0x76, 0xa8, - 0x9c, 0x00, 0x4d, 0x9c, 0x01, 0x5b, 0x9c, 0x02, 0x94, 0x27, 0x9c, 0x03, 0x94, 0x33, - 0x94, 0x3a, 0x88, 0x7e, 0xa2, 0x10, 0x72, 0x8b, 0xa2, 0x0a, 0x72, 0x88, 0x05, 0xa2, - 0x0a, 0x72, 0x8b, 0x94, 0x29, 0x88, 0x7e, 0xa2, 0x11, 0x72, 0x8b, 0xa2, 0x0a, 0x72, - 0x88, 0x05, 0xa2, 0x0a, 0x72, 0x8b, 0x59, 0x88, 0x7e, 0xa2, 0x12, 0x72, 0x8b, 0xa2, - 0x0a, 0x72, 0x88, 0x05, 0xa2, 0x0a, 0x72, 0x8b, 0x49, 0xa2, 0x0b, 0x72, 0x88, 0x05, - 0xa2, 0x0b, 0x72, 0x8b, 0xb7, 0x00, 0x00, 0x02, 0xaf, 0xcc, 0xaf, 0xce, 0xac, 0x76, - 0xcc, 0x82, 0x1a, 0xcc, 0xf8, 0x82, 0x0c, 0xce, 0xf8, 0x80, 0x7e, 0x02, 0xfc, 0x94, - 0xd6, 0xa2, 0x01, 0xcc, 0x88, 0xa2, 0x22, 0x76, 0xdc, 0x94, 0xc0, 0x9c, 0x02, 0x94, - 0x97, 0xaf, 0x76, 0x88, 0x7b, 0xaf, 0xc8, 0xc4, 0xb5, 0xae, 0x11, 0xac, 0x76, 0xca, - 0x82, 0x1a, 0xca, 0xf8, 0xa8, 0x02, 0x9c, 0x00, 0x47, 0x82, 0x04, 0xca, 0xf8, 0xaa, - 0xc8, 0x66, 0x3f, 0xc8, 0x8b, 0x7b, 0x3f, 0x76, 0xa2, 0x02, 0xcc, 0x88, 0xa2, 0x02, - 0xca, 0x8b, 0xa2, 0x03, 0xcc, 0x88, 0xa2, 0x03, 0xca, 0x8b, 0xa2, 0x03, 0xcc, 0x88, - 0x9c, 0x02, 0x94, 0x34, 0xaf, 0x76, 0x88, 0x7b, 0xaf, 0xc8, 0xa2, 0x02, 0xcc, 0x88, - 0xb5, 0xad, 0xd3, 0xac, 0x76, 0xca, 0x82, 0x1a, 0xca, 0xf8, 0xa8, 0x02, 0x9c, 0x00, - 0x47, 0x82, 0x04, 0xca, 0xf8, 0xaa, 0xc8, 0x66, 0x3f, 0xc8, 0x8b, 0x7b, 0x3f, 0x76, - 0xc4, 0xad, 0xca, 0x8b, 0xa2, 0x01, 0xcc, 0x88, 0xa2, 0x01, 0xca, 0x8b, 0x94, 0x4d, - 0xaf, 0x74, 0x88, 0x7a, 0xaf, 0xc8, 0xa2, 0x02, 0xcc, 0x88, 0xb5, 0xad, 0x8b, 0xac, - 0x74, 0xca, 0x82, 0x58, 0xca, 0xf8, 0xa8, 0x02, 0x9c, 0x00, 0x47, 0x82, 0x04, 0xca, - 0xf8, 0xaa, 0xc8, 0x66, 0x3f, 0xc8, 0x8b, 0x7a, 0x3f, 0x74, 0x95, 0x34, 0xaf, 0x74, - 0x88, 0x7a, 0xaf, 0xc8, 0xc4, 0xb5, 0xad, 0x66, 0xac, 0x74, 0xca, 0x82, 0x58, 0xca, - 0xf8, 0xa8, 0x02, 0x9c, 0x00, 0x47, 0x82, 0x04, 0xca, 0xf8, 0xaa, 0xc8, 0x66, 0x3f, - 0xc8, 0x8b, 0x7a, 0x3f, 0x74, 0x95, 0x97, 0xa9, 0x02, 0x82, 0x04, 0xcc, 0xf8, 0x82, - 0x04, 0xce, 0xf8, 0x95, 0xda, 0x3f, 0xce, 0x3f, 0xcc, 0xac, 0x76, 0xce, 0xb4, 0xd3, - 0x99, 0xa2, 0x0c, 0xcc, 0xa8, 0xb6, 0xb8, 0x00, 0xab, 0x91, 0x00, 0xe4, 0x99, 0x3f, - 0x82, 0x02, 0xcc, 0xf8, 0x9c, 0x01, 0xb4, 0x01, 0xe0, 0xa2, 0x04, 0xcc, 0xa8, 0xbc, - 0x13, 0x11, 0x94, 0x35, 0xbc, 0x13, 0x13, 0x94, 0x33, 0xbc, 0x13, 0x14, 0x94, 0x2e, - 0xbc, 0x13, 0x15, 0x94, 0x29, 0xbc, 0x13, 0x16, 0x94, 0x24, 0xbc, 0x13, 0x17, 0x94, - 0x22, 0xbc, 0x13, 0x18, 0x5e, 0xbc, 0x13, 0x19, 0x5a, 0xbc, 0x13, 0x1a, 0x56, 0xbc, - 0x24, 0x11, 0x55, 0xbc, 0x24, 0x12, 0x3c, 0xbc, 0x24, 0x13, 0x94, 0xb6, 0xb4, 0x01, - 0xa1, 0xb4, 0xf4, 0xf2, 0xb4, 0xf8, 0x7c, 0xb4, 0xfb, 0xa7, 0xa2, 0x06, 0xcc, 0xa8, - 0x9c, 0x00, 0x55, 0x9c, 0x01, 0x94, 0x21, 0x9c, 0x02, 0x94, 0x2d, 0x9c, 0x04, 0x94, - 0x39, 0x9c, 0x05, 0x94, 0x57, 0x9c, 0x06, 0x94, 0x65, 0x3c, 0xb7, 0x01, 0x01, 0x02, - 0xb7, 0x00, 0x00, 0x04, 0xb7, 0x00, 0x00, 0x06, 0x00, 0xb4, 0xae, 0x58, 0xb7, 0x01, - 0x02, 0x02, 0xb7, 0x00, 0x00, 0x04, 0xb7, 0x00, 0x00, 0x06, 0x00, 0xb4, 0xae, 0x48, - 0xb7, 0x01, 0x04, 0x02, 0xb7, 0x00, 0x04, 0x04, 0xb7, 0x00, 0x00, 0x06, 0x00, 0xb4, - 0xae, 0x38, 0xa2, 0x10, 0x72, 0x88, 0xab, 0xca, 0xb5, 0xac, 0x97, 0xa2, 0x29, 0x76, - 0x88, 0x9c, 0x02, 0x41, 0x3c, 0xb7, 0x02, 0x10, 0x02, 0xb7, 0x00, 0x00, 0x04, 0xb7, - 0x00, 0x00, 0x06, 0xa8, 0xca, 0xb4, 0xae, 0x16, 0xa2, 0x11, 0x72, 0x88, 0xab, 0xca, - 0xb5, 0xac, 0x75, 0xa2, 0x29, 0x76, 0x88, 0x9c, 0x02, 0x95, 0x20, 0x3c, 0xb7, 0x00, - 0x00, 0x02, 0x80, 0x7e, 0x02, 0xfc, 0x3c, 0xa8, 0x02, 0xb5, 0xac, 0x5e, 0xa2, 0x06, - 0x76, 0xa8, 0x9c, 0x03, 0x43, 0xa9, 0x02, 0x73, 0xb7, 0x02, 0x10, 0x02, 0xb7, 0x00, - 0x00, 0x04, 0xb7, 0x00, 0x00, 0x06, 0xa8, 0x02, 0xb5, 0xad, 0xdb, 0x74, 0xa2, 0x06, - 0xcc, 0xa8, 0x9c, 0x00, 0x51, 0x9c, 0x01, 0x94, 0x7e, 0x9c, 0x02, 0x94, 0x8d, 0x9c, - 0x03, 0x94, 0x9c, 0x9c, 0x04, 0x94, 0xb3, 0x3c, 0xa2, 0x0e, 0xcc, 0x88, 0x9c, 0x00, - 0x51, 0x9c, 0x01, 0x5d, 0x9c, 0x02, 0x94, 0x28, 0x9c, 0x03, 0x94, 0x32, 0x9c, 0x04, - 0x94, 0x3c, 0x94, 0x48, 0xa2, 0x0a, 0xcc, 0xa8, 0xb5, 0xac, 0x0b, 0x90, 0x02, 0xa2, - 0x04, 0x76, 0xab, 0x94, 0x39, 0xa2, 0x0a, 0xcc, 0xa8, 0xb5, 0xab, 0xfc, 0x90, 0x01, - 0xa2, 0x04, 0x76, 0xab, 0x94, 0x2a, 0xa2, 0x0a, 0xcc, 0xa8, 0xb5, 0xab, 0xed, 0x90, - 0x08, 0xa2, 0x04, 0x76, 0xab, 0x5c, 0xa2, 0x0a, 0xcc, 0xa8, 0xb5, 0xab, 0xdf, 0x90, - 0x04, 0xa2, 0x04, 0x76, 0xab, 0x4e, 0xa2, 0x0a, 0xcc, 0xa8, 0xb5, 0xab, 0xd1, 0xb0, - 0x01, 0x00, 0xa2, 0x04, 0x76, 0xab, 0xab, 0x04, 0xb7, 0x00, 0x00, 0x06, 0xb7, 0x02, - 0x02, 0x02, 0xa2, 0x0a, 0xcc, 0xa8, 0xb4, 0xad, 0x51, 0xb7, 0x00, 0x00, 0x04, 0xb7, - 0x00, 0x00, 0x06, 0xb7, 0x02, 0x0f, 0x02, 0xa2, 0x0a, 0xcc, 0xa8, 0xb4, 0xad, 0x3e, - 0xb7, 0x00, 0x00, 0x04, 0xb7, 0x00, 0x00, 0x06, 0xb7, 0x02, 0x10, 0x02, 0xa2, 0x0a, - 0xcc, 0xa8, 0xb4, 0xad, 0x2b, 0xa2, 0x20, 0x72, 0xa8, 0x9c, 0x01, 0x41, 0x3c, 0xb7, - 0x00, 0x00, 0x04, 0xb7, 0x00, 0x00, 0x06, 0xb7, 0x02, 0x01, 0x02, 0xa2, 0x0a, 0xcc, - 0xa8, 0xb4, 0xad, 0x10, 0xa2, 0x20, 0x72, 0xa8, 0x9c, 0x01, 0x41, 0x3c, 0xb7, 0x00, - 0x00, 0x04, 0xb7, 0x00, 0x00, 0x06, 0xb7, 0x02, 0x04, 0x02, 0xa2, 0x0a, 0xcc, 0xa8, - 0xb4, 0xac, 0xf5, 0x90, 0x00, 0xa2, 0x0c, 0xcc, 0xab, 0xb4, 0xfe, 0x0b, 0x3c, 0xa2, - 0x02, 0xcc, 0xa8, 0xbc, 0x10, 0x15, 0xb4, 0x01, 0x40, 0xbc, 0x10, 0x16, 0xb4, 0x01, - 0x43, 0xbc, 0x10, 0x17, 0xb4, 0x01, 0x46, 0xbc, 0x10, 0x18, 0xb4, 0x01, 0x49, 0xbc, - 0x10, 0x1a, 0xb4, 0x01, 0x4c, 0xbc, 0x10, 0x1b, 0xb4, 0x01, 0x4f, 0xbc, 0x10, 0x22, - 0xb4, 0x01, 0x52, 0xbc, 0x10, 0x1f, 0xb4, 0x01, 0x5e, 0xbc, 0xf4, 0x07, 0xb4, 0x01, - 0x70, 0xbc, 0xf4, 0x08, 0xb4, 0x01, 0x73, 0xbc, 0x20, 0x20, 0xb4, 0x01, 0x7c, 0xbc, - 0x20, 0x22, 0xb4, 0x01, 0x88, 0xbc, 0x20, 0x75, 0xb4, 0x01, 0x92, 0xbc, 0x20, 0x76, - 0xb4, 0x01, 0x9c, 0xbc, 0xf4, 0x01, 0x94, 0x83, 0xbc, 0xf4, 0x04, 0xb4, 0x03, 0xd6, - 0xbc, 0x20, 0x0d, 0xb4, 0x01, 0x9b, 0xbc, 0x20, 0x0e, 0xb4, 0x01, 0xad, 0xbc, 0x20, - 0x16, 0xb4, 0x01, 0xbf, 0xbc, 0x20, 0x29, 0x94, 0x86, 0xbc, 0x32, 0x15, 0xb4, 0x01, - 0xe1, 0xbc, 0x32, 0x16, 0xb4, 0x01, 0xf3, 0xbc, 0x32, 0x17, 0xb4, 0x02, 0x05, 0xbc, - 0x32, 0x13, 0xb4, 0x02, 0x17, 0xbc, 0x40, 0x0c, 0xb4, 0x02, 0x29, 0xbc, 0x40, 0x0e, - 0xb4, 0x02, 0x33, 0xbc, 0x40, 0x11, 0xb4, 0x02, 0x3d, 0xbc, 0x40, 0x1d, 0xb4, 0x02, - 0xdc, 0xbc, 0x40, 0x3a, 0xb4, 0x02, 0xe6, 0xbc, 0x40, 0x3b, 0xb4, 0x02, 0xf0, 0xbc, - 0x40, 0x41, 0xb4, 0x02, 0xfa, 0xbc, 0x40, 0x15, 0xb4, 0x03, 0x04, 0xbc, 0xf4, 0x02, - 0x94, 0x29, 0xbc, 0x40, 0x1f, 0xb4, 0x03, 0x23, 0xbc, 0x40, 0x13, 0xb4, 0x03, 0x46, - 0xbc, 0x40, 0x17, 0xb4, 0x03, 0x50, 0xbc, 0xf4, 0x03, 0xb4, 0x03, 0x90, 0x3c, 0xa2, - 0x0a, 0xcc, 0xa8, 0xb5, 0xaa, 0x58, 0xa2, 0x0e, 0xcc, 0x88, 0xa2, 0x20, 0x74, 0x8b, - 0x3c, 0xa2, 0x0a, 0xcc, 0xa8, 0xb5, 0xaa, 0x5c, 0xa2, 0x0e, 0xcc, 0xa8, 0xa2, 0x0a, - 0x76, 0xab, 0x3c, 0xa2, 0x0a, 0xcc, 0xa8, 0xb5, 0xaa, 0x38, 0xaf, 0xcc, 0xac, 0xcc, - 0xca, 0x82, 0x0e, 0xca, 0xf8, 0xac, 0x74, 0xcc, 0x82, 0x12, 0xcc, 0xf8, 0xb5, 0xd3, - 0x1b, 0xac, 0x74, 0xcc, 0x82, 0x12, 0xcc, 0xf8, 0xac, 0x74, 0xce, 0xb5, 0xdc, 0xc4, - 0xb2, 0x12, 0x10, 0xa8, 0xcc, 0xb8, 0xfe, 0x80, 0xab, 0xcc, 0x9a, 0x0c, 0xab, 0xca, - 0x30, 0x0b, 0x97, 0xb0, 0xcc, 0x97, 0xfe, 0xca, 0x30, 0x03, 0x3f, 0xcc, 0x3c, 0x00, - 0x96, 0xcc, 0x14, 0x05, 0xe1, 0x66, 0x3c, 0xa2, 0x0e, 0xcc, 0x88, 0xa2, 0x0c, 0x72, - 0x8b, 0x3c, 0xa2, 0x0e, 0xcc, 0x88, 0xa2, 0x0a, 0x72, 0x8b, 0x3c, 0xa2, 0x0e, 0xcc, - 0x88, 0xa2, 0x0b, 0x72, 0x8b, 0x3c, 0xa2, 0x0e, 0xcc, 0x88, 0xa2, 0x0d, 0x72, 0x8b, - 0x3c, 0xa2, 0x0e, 0xcc, 0xa8, 0xa2, 0x06, 0x72, 0xab, 0x3c, 0xa2, 0x0e, 0xcc, 0xa8, - 0xa2, 0x08, 0x72, 0xab, 0x3c, 0xa2, 0x0e, 0xcc, 0x88, 0xa2, 0x00, 0x72, 0x8b, 0x9d, - 0x00, 0xb5, 0xd8, 0x8f, 0xa2, 0x00, 0x72, 0x8b, 0x3c, 0xa2, 0x10, 0xcc, 0xa8, 0xab, - 0xca, 0xa2, 0x0e, 0xcc, 0xa8, 0xb5, 0x03, 0x06, 0xa2, 0x02, 0x72, 0xab, 0xa8, 0xca, - 0xa2, 0x04, 0x72, 0xab, 0x3c, 0xa2, 0x0e, 0xcc, 0x88, 0xa2, 0x34, 0x72, 0x8b, 0x3c, - 0xa2, 0x0e, 0xcc, 0xa8, 0xa2, 0x30, 0x72, 0xab, 0x90, 0x00, 0xa2, 0x0f, 0x72, 0x8b, - 0x3c, 0xa2, 0x0a, 0xcc, 0xa8, 0xb5, 0xa9, 0x76, 0xa2, 0x0e, 0xcc, 0x88, 0x99, 0x37, - 0xa2, 0x08, 0x74, 0x8b, 0x3c, 0xa2, 0x0a, 0xcc, 0xa8, 0xb5, 0xa9, 0x64, 0xa2, 0x0e, - 0xcc, 0xa8, 0xa2, 0x04, 0x74, 0xab, 0x3c, 0xa2, 0x0a, 0xcc, 0xa8, 0xb5, 0xa9, 0x54, - 0xa2, 0x0e, 0xcc, 0xa8, 0xa2, 0x00, 0x74, 0xab, 0x3c, 0xa2, 0x0a, 0xcc, 0xa8, 0xb5, - 0xa9, 0x44, 0xa2, 0x0e, 0xcc, 0x88, 0xa2, 0x02, 0x74, 0x8b, 0x3c, 0xa2, 0x0a, 0xcc, - 0xa8, 0xb5, 0xa9, 0x34, 0xa2, 0x0e, 0xcc, 0xa8, 0xa2, 0x0a, 0x74, 0xab, 0xa2, 0x10, - 0xcc, 0xa8, 0xa2, 0x0c, 0x74, 0xab, 0x3c, 0xa2, 0x0a, 0xcc, 0xa8, 0xb5, 0xa9, 0x1c, - 0xa2, 0x0e, 0xcc, 0xa8, 0xa2, 0x0e, 0x74, 0xab, 0xa2, 0x10, 0xcc, 0xa8, 0xa2, 0x10, - 0x74, 0xab, 0x3c, 0xa2, 0x0a, 0xcc, 0xa8, 0xb5, 0xa9, 0x04, 0xa2, 0x0e, 0xcc, 0x88, - 0xa2, 0x1e, 0x74, 0x8b, 0x3c, 0xa2, 0x0a, 0xcc, 0xa8, 0xb5, 0xa8, 0xf4, 0xaf, 0xcc, - 0xac, 0xcc, 0xca, 0x82, 0x0e, 0xcc, 0xf8, 0xac, 0x74, 0xca, 0x82, 0x12, 0xca, 0xf8, - 0xb5, 0xd1, 0xd7, 0x3f, 0xcc, 0x3c, 0xa2, 0x0a, 0xcc, 0xa8, 0xb5, 0xa8, 0xff, 0xa2, - 0x0e, 0xcc, 0xa8, 0xa2, 0x0c, 0x78, 0xab, 0xa2, 0x10, 0xcc, 0xa8, 0xa2, 0x0e, 0x78, - 0xab, 0x3c, 0xa2, 0x0a, 0xcc, 0xa8, 0xb5, 0xa8, 0xe7, 0xa2, 0x0e, 0xcc, 0xa8, 0xa2, - 0x08, 0x78, 0xab, 0xa2, 0x10, 0xcc, 0xa8, 0xa2, 0x0a, 0x78, 0xab, 0x3c, 0xa2, 0x0a, - 0xcc, 0xa8, 0xb5, 0xa8, 0xcf, 0xa2, 0x0e, 0xcc, 0xa8, 0xa2, 0x04, 0x78, 0xab, 0xa2, - 0x10, 0xcc, 0xa8, 0xa2, 0x06, 0x78, 0xab, 0x3c, 0xa2, 0x0a, 0xcc, 0xa8, 0xb5, 0xa8, - 0xb7, 0xa2, 0x0e, 0xcc, 0xa8, 0xa2, 0x00, 0x78, 0xab, 0xa2, 0x10, 0xcc, 0xa8, 0xa2, - 0x02, 0x78, 0xab, 0x3c, 0xa2, 0x0a, 0xcc, 0xa8, 0xb5, 0xa8, 0x8b, 0xa2, 0x0e, 0xcc, - 0xa8, 0xa2, 0x06, 0x76, 0xab, 0x3c, 0xa2, 0x0a, 0xcc, 0xa8, 0xb5, 0xa8, 0x7b, 0xa2, - 0x0e, 0xcc, 0x88, 0xa2, 0x0c, 0x76, 0x8b, 0x3c, 0xa2, 0x0a, 0xcc, 0xa8, 0xb5, 0xa8, - 0x6b, 0xa2, 0x06, 0x76, 0xa8, 0x9c, 0x00, 0x4d, 0x9c, 0x01, 0x94, 0x30, 0x9c, 0x02, - 0x94, 0x53, 0x9c, 0x03, 0x94, 0x76, 0x3c, 0xa2, 0x0f, 0xcc, 0x88, 0x99, 0x01, 0xa2, - 0x13, 0x76, 0x8b, 0xa2, 0x10, 0xcc, 0x88, 0x99, 0x5b, 0xa2, 0x14, 0x76, 0x8b, 0xa2, - 0x11, 0xcc, 0x88, 0x99, 0xdb, 0xa2, 0x15, 0x76, 0x8b, 0xa2, 0x22, 0x76, 0x88, 0xa2, - 0x10, 0x72, 0x8b, 0x3c, 0xa2, 0x0f, 0xcc, 0x88, 0x99, 0x01, 0xa2, 0x13, 0x76, 0x8b, - 0xa2, 0x10, 0xcc, 0x88, 0x99, 0x6d, 0xa2, 0x14, 0x76, 0x8b, 0xa2, 0x11, 0xcc, 0x88, - 0x99, 0xed, 0xa2, 0x15, 0x76, 0x8b, 0xa2, 0x22, 0x76, 0x88, 0xa2, 0x11, 0x72, 0x8b, - 0x3c, 0xa2, 0x0f, 0xcc, 0x88, 0x99, 0x01, 0xa2, 0x13, 0x76, 0x8b, 0xa2, 0x10, 0xcc, - 0x88, 0x99, 0x6d, 0xa2, 0x14, 0x76, 0x8b, 0xa2, 0x11, 0xcc, 0x88, 0x99, 0x6d, 0xa2, - 0x15, 0x76, 0x8b, 0xa2, 0x22, 0x76, 0x88, 0xa2, 0x12, 0x72, 0x8b, 0x3c, 0xa2, 0x0f, - 0xcc, 0x88, 0x99, 0x01, 0xa2, 0x13, 0x76, 0x8b, 0xa2, 0x10, 0xcc, 0x88, 0x99, 0x37, - 0xa2, 0x14, 0x76, 0x8b, 0x3c, 0xa2, 0x0a, 0xcc, 0xa8, 0xb5, 0xa7, 0xc6, 0xa2, 0x0e, - 0xcc, 0xa8, 0xa2, 0x08, 0x76, 0xab, 0x3c, 0xa2, 0x0a, 0xcc, 0xa8, 0xb5, 0xa7, 0xb6, - 0xa2, 0x0e, 0xcc, 0x88, 0xa2, 0x10, 0x76, 0x8b, 0x3c, 0xa2, 0x0a, 0xcc, 0xa8, 0xb5, - 0xa7, 0xa6, 0xa2, 0x0e, 0xcc, 0x88, 0xa2, 0x11, 0x76, 0x8b, 0x3c, 0xa2, 0x0a, 0xcc, - 0xa8, 0xb5, 0xa7, 0x96, 0xa2, 0x0e, 0xcc, 0xa8, 0xa2, 0x0e, 0x76, 0xab, 0x3c, 0xa2, - 0x0a, 0xcc, 0xa8, 0xb5, 0xa7, 0x86, 0xa2, 0x0e, 0xcc, 0xa8, 0xa2, 0x00, 0x76, 0xab, - 0xa2, 0x10, 0xcc, 0xa8, 0xa2, 0x02, 0x76, 0xab, 0xa2, 0x0e, 0xcc, 0xfa, 0x9d, 0x00, - 0x3c, 0x90, 0x02, 0x01, 0xa2, 0x0c, 0x76, 0xd9, 0xa2, 0x0c, 0x76, 0x8b, 0x3c, 0xa2, - 0x0a, 0xcc, 0xa8, 0xb5, 0xa7, 0x5c, 0x91, 0x02, 0xa2, 0x0e, 0xcc, 0x88, 0x9c, 0x00, - 0x91, 0x02, 0x9c, 0x01, 0x91, 0x01, 0x9c, 0x02, 0x91, 0x08, 0x9c, 0x03, 0x91, 0x04, - 0x9c, 0x04, 0xb1, 0x01, 0x00, 0xa8, 0xca, 0xa2, 0x04, 0x76, 0xab, 0x3c, 0xa2, 0x0a, - 0xcc, 0xa8, 0xb5, 0xa7, 0x33, 0xa2, 0x0e, 0xcc, 0x88, 0xa2, 0x17, 0x76, 0x8b, 0x3c, - 0xa2, 0x0a, 0xcc, 0xa8, 0xb5, 0xa7, 0x23, 0xa2, 0x0e, 0xcc, 0x88, 0xa2, 0x18, 0x76, - 0x8b, 0x3c, 0xa2, 0x0a, 0xcc, 0xa8, 0xb5, 0xa6, 0xff, 0xac, 0x74, 0xce, 0x82, 0x58, - 0xce, 0xf8, 0xa2, 0x12, 0xcc, 0x88, 0xe7, 0xe7, 0xa0, 0xc8, 0xce, 0xf8, 0xa2, 0x0e, - 0xcc, 0x88, 0xd6, 0xa2, 0x0f, 0xcc, 0x88, 0xa2, 0x01, 0xce, 0x8b, 0xa2, 0x10, 0xcc, - 0x88, 0xa2, 0x02, 0xce, 0x8b, 0xa2, 0x11, 0xcc, 0x88, 0xa2, 0x03, 0xce, 0x8b, 0x3c, - 0xa2, 0x0a, 0xcc, 0xa8, 0xb5, 0xa6, 0xdd, 0xac, 0x76, 0xce, 0x82, 0x1a, 0xce, 0xf8, - 0xa2, 0x12, 0xcc, 0x88, 0xe7, 0xe7, 0xa0, 0xc8, 0xce, 0xf8, 0xa2, 0x0e, 0xcc, 0x88, - 0xd6, 0xa2, 0x0f, 0xcc, 0x88, 0xa2, 0x01, 0xce, 0x8b, 0xa2, 0x10, 0xcc, 0x88, 0xa2, - 0x02, 0xce, 0x8b, 0xa2, 0x11, 0xcc, 0x88, 0xa2, 0x03, 0xce, 0x8b, 0x3c, 0x03, 0xae, - 0xca, 0xd7, 0xae, 0xca, 0xd7, 0x03, 0xae, 0xca, 0xd7, 0xae, 0xca, 0xd7, 0x03, 0xae, - 0xca, 0xd7, 0xae, 0xca, 0xd7, 0x3c, 0x00, 0xb6, 0xfe, 0x20, 0xab, 0xb6, 0xfe, 0x00, - 0xab, 0xb6, 0xfe, 0x90, 0xab, 0x3c, 0xac, 0xcc, 0x28, 0xac, 0xce, 0x2a, 0xab, 0xce, - 0xa8, 0x16, 0xb8, 0x00, 0x0a, 0x96, 0x14, 0xfc, 0x94, 0x45, 0xb2, 0xcf, 0x1e, 0xa0, - 0x16, 0xcc, 0xf8, 0xa8, 0x1a, 0xa2, 0x02, 0xcc, 0xab, 0xa8, 0x18, 0xa2, 0x01, 0xcc, - 0x8b, 0xa8, 0xce, 0xc6, 0xa8, 0x1c, 0xa2, 0x04, 0xcc, 0xab, 0xa8, 0x1e, 0xa2, 0x06, - 0xcc, 0xab, 0xa8, 0x20, 0xa2, 0x08, 0xcc, 0xab, 0xa8, 0x16, 0xb8, 0x00, 0x0a, 0xbc, - 0x0b, 0xae, 0x00, 0xab, 0x16, 0xaf, 0xca, 0xb1, 0x04, 0x00, 0xb5, 0x58, 0x5e, 0x3f, - 0xca, 0x00, 0xac, 0x28, 0xcc, 0xac, 0x2a, 0xce, 0x3c, 0xb6, 0xff, 0x04, 0xa9, 0x76, - 0x00, 0xab, 0x14, 0xab, 0x16, 0xa7, 0xcf, 0x1e, 0xda, 0xd6, 0x00, 0xe1, 0x62, 0x3c, - 0xa8, 0x14, 0x96, 0x16, 0xfc, 0x42, 0x00, 0x3c, 0x90, 0x01, 0x63, 0x34, 0x0b, 0x9c, - 0x00, 0x44, 0xb0, 0xf0, 0x00, 0x3c, 0xb6, 0xfe, 0x00, 0x88, 0x96, 0xc8, 0x17, 0x94, - 0x35, 0xaf, 0xce, 0xaf, 0xcc, 0xa7, 0xfe, 0x00, 0xfe, 0x0e, 0xb3, 0xcf, 0x1e, 0xa0, - 0x14, 0xce, 0xf8, 0xf0, 0xb9, 0xff, 0x7f, 0xe1, 0xf0, 0xe1, 0xf0, 0xe1, 0xf0, 0xe1, - 0xf0, 0xe1, 0xa8, 0x14, 0xb8, 0x00, 0x0a, 0xbc, 0x0b, 0xae, 0x00, 0xab, 0x14, 0xb3, - 0xfe, 0x00, 0xd4, 0x9a, 0x80, 0xd6, 0x3f, 0xcc, 0x3f, 0xce, 0x00, 0x3c, 0xb0, 0xf0, - 0x01, 0x3c, 0xb7, 0x00, 0x00, 0x02, 0xb7, 0x00, 0x00, 0x04, 0xac, 0xce, 0xcc, 0x82, - 0x48, 0xcc, 0xf8, 0xb7, 0x00, 0x00, 0x06, 0x00, 0xb4, 0xcf, 0x24, 0xa2, 0x35, 0xce, - 0x88, 0x9c, 0x00, 0x94, 0x22, 0xa2, 0x3f, 0xce, 0x88, 0x9c, 0x00, 0x94, 0x23, 0xb7, - 0x00, 0x00, 0x02, 0xb7, 0x00, 0x00, 0x04, 0xac, 0xce, 0xcc, 0x82, 0x48, 0xcc, 0xf8, - 0xb7, 0x02, 0x00, 0x06, 0xa2, 0x22, 0xce, 0x88, 0xb4, 0xce, 0xfa, 0xb7, 0x1e, 0x84, - 0x02, 0xb7, 0x00, 0x00, 0x04, 0x7a, 0xb7, 0x31, 0x2d, 0x02, 0xb7, 0x00, 0x01, 0x04, - 0x95, 0x23, 0xa2, 0x35, 0xce, 0x88, 0x9c, 0x00, 0x3c, 0xb7, 0x09, 0xc4, 0x02, 0xb7, - 0x00, 0x00, 0x04, 0xac, 0xce, 0xcc, 0x82, 0x48, 0xcc, 0xf8, 0xb7, 0x02, 0x00, 0x06, - 0xa2, 0x22, 0xce, 0x88, 0xb4, 0xce, 0xc6, 0xb7, 0x62, 0x5a, 0x08, 0xb7, 0x00, 0x02, - 0x0a, 0xa2, 0x35, 0xce, 0x88, 0x9c, 0x00, 0x94, 0x35, 0xa2, 0x36, 0xce, 0x88, 0x9c, - 0x00, 0x94, 0x77, 0xa2, 0x38, 0xce, 0x88, 0x9c, 0x00, 0x94, 0x25, 0xa2, 0x37, 0xce, - 0x88, 0x9d, 0x00, 0x5e, 0xa2, 0x34, 0xce, 0x88, 0x9c, 0x07, 0x4a, 0xf4, 0xab, 0x08, - 0xa2, 0x02, 0xce, 0xa8, 0xab, 0x0a, 0x4d, 0xa2, 0x24, 0xce, 0xa8, 0xab, 0x08, 0xa2, - 0x26, 0xce, 0xa8, 0xab, 0x0a, 0x40, 0xa2, 0x54, 0xce, 0x88, 0x9c, 0x00, 0x47, 0xa2, - 0x34, 0xce, 0x88, 0x9c, 0x07, 0x58, 0xac, 0x08, 0x02, 0xac, 0x0a, 0x04, 0xac, 0xce, - 0xcc, 0x82, 0x48, 0xcc, 0xf8, 0xb7, 0x02, 0x00, 0x06, 0xa2, 0x22, 0xce, 0x88, 0xb4, - 0xce, 0x5b, 0x86, 0x12, 0x60, 0x08, 0xfc, 0x41, 0x7e, 0x86, 0x04, 0xa8, 0x0a, 0xfc, - 0x42, 0x95, 0x25, 0xb7, 0x01, 0x07, 0x02, 0xb7, 0x00, 0x00, 0x04, 0xb7, 0x00, 0x00, - 0x06, 0xa2, 0x22, 0xce, 0x88, 0xb5, 0xa6, 0x60, 0x95, 0x3a, 0xb7, 0x00, 0x4e, 0x08, - 0xb7, 0x00, 0x00, 0x0a, 0x95, 0x52, 0xa2, 0x35, 0xce, 0x88, 0x9c, 0x00, 0x5a, 0xb7, - 0x00, 0x4e, 0x02, 0xb7, 0x00, 0x00, 0x04, 0xac, 0xce, 0xcc, 0x82, 0x48, 0xcc, 0xf8, - 0xb7, 0x02, 0x00, 0x06, 0xa2, 0x22, 0xce, 0x88, 0xb4, 0xce, 0x0c, 0xb7, 0x62, 0x5a, - 0x02, 0xb7, 0x00, 0x02, 0x04, 0x7a, 0x95, 0x2a, 0x95, 0x2c, 0xa2, 0x35, 0xce, 0x88, - 0x9c, 0x00, 0x94, 0x21, 0xa2, 0x3a, 0xce, 0x88, 0x9d, 0x00, 0x5a, 0xb7, 0x00, 0x4e, - 0x02, 0xb7, 0x00, 0x00, 0x04, 0xac, 0xce, 0xcc, 0x82, 0x48, 0xcc, 0xf8, 0xb7, 0x02, - 0x00, 0x06, 0xa2, 0x22, 0xce, 0x88, 0xb4, 0xcd, 0xd6, 0xa2, 0x35, 0xce, 0x88, 0x9c, - 0x00, 0x4a, 0xb7, 0x00, 0x00, 0x02, 0xb7, 0x00, 0x00, 0x04, 0x95, 0x21, 0xb7, 0x62, - 0x5a, 0x02, 0xb7, 0x00, 0x02, 0x04, 0x95, 0x2b, 0x90, 0x00, 0xa2, 0x50, 0xce, 0xab, - 0xb5, 0xd3, 0xf7, 0x90, 0x00, 0xb5, 0xd3, 0xca, 0x91, 0x02, 0xa2, 0x22, 0xce, 0x88, - 0xb5, 0xd4, 0xdc, 0xb7, 0x03, 0x01, 0x02, 0xb7, 0x00, 0x00, 0x04, 0xb7, 0x00, 0x00, - 0x06, 0xa2, 0x22, 0xce, 0x88, 0xb5, 0xa5, 0xb8, 0xb7, 0x03, 0x02, 0x02, 0xb7, 0x00, - 0x00, 0x04, 0xb7, 0x00, 0x00, 0x06, 0xa2, 0x22, 0xce, 0x88, 0xb5, 0xa5, 0xa5, 0x90, - 0x00, 0xa2, 0x3f, 0xce, 0x8b, 0xa2, 0x22, 0xce, 0x88, 0xab, 0x18, 0xb0, 0x40, 0x21, - 0xb5, 0xe9, 0x4d, 0x90, 0x00, 0xa2, 0x2a, 0xce, 0x8b, 0xa2, 0x22, 0xce, 0x88, 0xab, - 0x18, 0xb0, 0x40, 0x3f, 0xb5, 0xe9, 0x3b, 0x90, 0x00, 0xa2, 0x2c, 0xce, 0xab, 0xa2, - 0x22, 0xce, 0x88, 0xab, 0x18, 0xb0, 0x40, 0x3d, 0xb5, 0xe9, 0x29, 0x90, 0x00, 0xa2, - 0x4e, 0xce, 0xab, 0xa2, 0x22, 0xce, 0x88, 0xab, 0x18, 0xb0, 0x40, 0x3e, 0xb5, 0xe9, - 0x17, 0xb7, 0x05, 0x02, 0x02, 0xb7, 0x00, 0x00, 0x04, 0xb7, 0x00, 0x00, 0x06, 0xa2, - 0x22, 0xce, 0x88, 0xb5, 0xa5, 0x4a, 0xb7, 0x00, 0x00, 0x02, 0xb7, 0x00, 0x00, 0x04, - 0xb7, 0x02, 0x00, 0x06, 0xa2, 0x22, 0xce, 0x88, 0xac, 0xce, 0xcc, 0x82, 0x4c, 0xcc, - 0xf8, 0xb5, 0xcd, 0x09, 0xb4, 0xfd, 0xcb, 0x90, 0x00, 0xb5, 0xd3, 0x1e, 0x91, 0x02, - 0xa2, 0x22, 0xce, 0x88, 0xb5, 0xd4, 0x30, 0x90, 0x07, 0xa2, 0x50, 0xce, 0xab, 0xb5, - 0xd3, 0x34, 0xb7, 0x03, 0x01, 0x02, 0xb7, 0x00, 0x00, 0x04, 0xb7, 0x00, 0x00, 0x06, - 0xa2, 0x22, 0xce, 0x88, 0xb5, 0xa5, 0x03, 0xb7, 0x03, 0x02, 0x02, 0xb7, 0x00, 0x00, - 0x04, 0xb7, 0x00, 0x00, 0x06, 0xa2, 0x22, 0xce, 0x88, 0xb5, 0xa4, 0xf0, 0x90, 0x00, - 0xa2, 0x3f, 0xce, 0x8b, 0xa2, 0x35, 0xce, 0x8b, 0xa2, 0x22, 0xce, 0x88, 0xab, 0x18, - 0xb0, 0x40, 0x21, 0xb5, 0xe8, 0x94, 0x90, 0x00, 0xa2, 0x29, 0xce, 0x8b, 0xa2, 0x54, - 0xce, 0x88, 0x9c, 0x00, 0x94, 0x1f, 0xa2, 0x34, 0x72, 0xa8, 0x9c, 0x01, 0x41, 0x44, - 0xa2, 0x22, 0xce, 0x88, 0xb7, 0x01, 0x07, 0x02, 0xb7, 0x00, 0x00, 0x04, 0xb7, 0x00, - 0x00, 0x06, 0xa2, 0x22, 0xce, 0x88, 0xb5, 0xa4, 0xad, 0xa2, 0x2a, 0xce, 0x88, 0x9c, - 0x00, 0x94, 0x42, 0x90, 0x01, 0xa2, 0x4e, 0xce, 0xab, 0xa2, 0x22, 0xce, 0x88, 0xab, - 0x18, 0xb0, 0x40, 0x3e, 0xb5, 0xe8, 0x4d, 0xb7, 0x05, 0x02, 0x02, 0xb7, 0x00, 0x00, - 0x04, 0xb7, 0x00, 0x00, 0x06, 0xa2, 0x22, 0xce, 0x88, 0xb5, 0xa4, 0x80, 0xb7, 0x00, - 0x00, 0x02, 0xb7, 0x00, 0x00, 0x04, 0xb7, 0x02, 0x00, 0x06, 0xa2, 0x22, 0xce, 0x88, - 0xac, 0xce, 0xcc, 0x82, 0x4c, 0xcc, 0xf8, 0xb5, 0xcc, 0x3f, 0xb4, 0xfd, 0x18, 0xa2, - 0x2c, 0xce, 0xa8, 0x9c, 0x01, 0x95, 0x48, 0x90, 0x01, 0xa2, 0x2c, 0xce, 0xab, 0xa2, - 0x22, 0xce, 0x88, 0xab, 0x18, 0xb0, 0x40, 0x3d, 0xb5, 0xe8, 0x03, 0x95, 0x5c, 0xa2, - 0x14, 0x72, 0x88, 0x9d, 0x00, 0x95, 0xec, 0x90, 0x01, 0xa2, 0x41, 0xce, 0x8b, 0x3c, - 0x90, 0x30, 0x01, 0xab, 0xca, 0xa2, 0x50, 0xce, 0xa8, 0x96, 0xca, 0xf9, 0xa2, 0x50, - 0xce, 0xab, 0xb5, 0xd2, 0x43, 0x00, 0xa2, 0x35, 0xce, 0x8b, 0x90, 0x02, 0xa2, 0x4e, - 0xce, 0xab, 0xa2, 0x22, 0xce, 0x88, 0xab, 0x18, 0xb0, 0x40, 0x3e, 0xb5, 0xe7, 0xc8, - 0xb7, 0x05, 0x02, 0x02, 0xb7, 0x00, 0x00, 0x04, 0xb7, 0x00, 0x00, 0x06, 0xa2, 0x22, - 0xce, 0x88, 0xb5, 0xa3, 0xfb, 0xb7, 0x00, 0x00, 0x02, 0xb7, 0x00, 0x00, 0x04, 0xb7, - 0x02, 0x00, 0x06, 0xa2, 0x22, 0xce, 0x88, 0xac, 0xce, 0xcc, 0x82, 0x4c, 0xcc, 0xf8, - 0xb5, 0xcb, 0xba, 0xa2, 0x22, 0xce, 0x88, 0xb5, 0xd2, 0x5e, 0xa2, 0x2e, 0xce, 0xab, - 0xab, 0xca, 0x99, 0x06, 0x9c, 0x00, 0x48, 0xa2, 0x1e, 0x72, 0x88, 0x9c, 0x02, 0x94, - 0x2c, 0x82, 0x08, 0xca, 0xf9, 0x82, 0x00, 0xca, 0xfc, 0x94, 0x32, 0xa2, 0x3b, 0xce, - 0x88, 0x9d, 0x00, 0x94, 0x2a, 0x90, 0x01, 0xa2, 0x35, 0xce, 0x8b, 0xb7, 0x01, 0x03, - 0x02, 0xb7, 0x00, 0x04, 0x04, 0xb7, 0x00, 0x00, 0x06, 0xa2, 0x22, 0xce, 0x88, 0xb5, - 0xa3, 0x9c, 0x50, 0xb7, 0x01, 0x04, 0x02, 0xb7, 0x00, 0x04, 0x04, 0xb7, 0x00, 0x00, - 0x06, 0x00, 0xb5, 0xa3, 0x8b, 0x91, 0x08, 0xa2, 0x22, 0xce, 0x88, 0xb5, 0xd2, 0x93, - 0x3c, 0x90, 0x00, 0xa2, 0x35, 0xce, 0x8b, 0xa2, 0x3f, 0xce, 0x8b, 0xa2, 0x22, 0xce, - 0x88, 0xab, 0x18, 0xb0, 0x40, 0x21, 0xb5, 0xe7, 0x25, 0x90, 0x08, 0xa2, 0x50, 0xce, - 0xfa, 0xa2, 0x50, 0xce, 0xab, 0xb5, 0xd1, 0x7c, 0x90, 0x03, 0xa2, 0x4e, 0xce, 0xab, - 0xa2, 0x22, 0xce, 0x88, 0xab, 0x18, 0xb0, 0x40, 0x3e, 0xb5, 0xe7, 0x06, 0xa2, 0x22, - 0xce, 0x88, 0xb5, 0xd1, 0xc9, 0xa2, 0x2e, 0xce, 0xab, 0xab, 0xca, 0x99, 0x04, 0x9d, - 0x00, 0x5c, 0x82, 0x40, 0xca, 0xf9, 0x82, 0x00, 0xca, 0xfd, 0xb4, 0xfe, 0x02, 0x90, - 0x01, 0xb5, 0xd1, 0x20, 0x91, 0x04, 0xa2, 0x22, 0xce, 0x88, 0xb5, 0xd2, 0x32, 0xb4, - 0xfc, 0x10, 0x90, 0x01, 0xa2, 0x35, 0xce, 0x8b, 0x77, 0x00, 0xa2, 0x35, 0xce, 0x8b, - 0xa2, 0x36, 0xce, 0x8b, 0xa2, 0x37, 0xce, 0x8b, 0xa2, 0x38, 0xce, 0x8b, 0x90, 0x04, - 0xa2, 0x4e, 0xce, 0xab, 0xa2, 0x22, 0xce, 0x88, 0xab, 0x18, 0xb0, 0x40, 0x3e, 0xb5, - 0xe6, 0xae, 0xa2, 0x22, 0xce, 0x88, 0xb5, 0xd1, 0x71, 0xa2, 0x2e, 0xce, 0xab, 0x99, - 0x40, 0x9c, 0x00, 0x54, 0x90, 0x08, 0x01, 0xa2, 0x50, 0xce, 0xf9, 0xa2, 0x50, 0xce, - 0xab, 0xb5, 0xd0, 0xf4, 0x90, 0x01, 0xa2, 0x35, 0xce, 0x8b, 0xa2, 0x22, 0xce, 0x88, - 0xb5, 0xd1, 0x4d, 0xa2, 0x2e, 0xce, 0xab, 0x99, 0x02, 0x9d, 0x00, 0xb4, 0xfd, 0x91, - 0xa2, 0x34, 0xce, 0x88, 0x9d, 0x04, 0x4c, 0x91, 0x01, 0xa2, 0x22, 0xce, 0x88, 0xb5, - 0xd1, 0xbf, 0xb4, 0xfb, 0xbe, 0xa2, 0x3c, 0xce, 0x88, 0x9d, 0x00, 0x72, 0xac, 0xce, - 0xcc, 0x82, 0x44, 0xcc, 0xf8, 0x90, 0x04, 0xb5, 0x09, 0xae, 0x42, 0x95, 0x20, 0x90, - 0x05, 0xb5, 0x09, 0xa6, 0x42, 0x95, 0x28, 0x90, 0x03, 0xb5, 0x09, 0x9e, 0xb4, 0xfd, - 0x58, 0x95, 0x32, 0x00, 0xa2, 0x35, 0xce, 0x8b, 0x90, 0x05, 0xa2, 0x4e, 0xce, 0xab, - 0xa2, 0x22, 0xce, 0x88, 0xab, 0x18, 0xb0, 0x40, 0x3e, 0xb5, 0xe6, 0x26, 0xa2, 0x22, - 0xce, 0x88, 0xb5, 0xd0, 0xe9, 0xa2, 0x2e, 0xce, 0xab, 0xab, 0xca, 0x99, 0x04, 0x9c, - 0x00, 0x94, 0x40, 0x90, 0x01, 0xa2, 0x35, 0xce, 0x8b, 0xac, 0xce, 0xcc, 0x82, 0x46, - 0xcc, 0xf8, 0xa2, 0x34, 0xce, 0x88, 0xb5, 0x09, 0x4b, 0xac, 0xce, 0xcc, 0x82, 0x44, - 0xcc, 0xf8, 0xa2, 0x34, 0xce, 0x88, 0xb5, 0x09, 0x4d, 0x5a, 0x91, 0x08, 0xa2, 0x22, - 0xce, 0x88, 0xb5, 0xd1, 0x3e, 0xb5, 0xfb, 0xd6, 0x90, 0x08, 0xa2, 0x50, 0xce, 0xfa, - 0xa2, 0x50, 0xce, 0xab, 0xb5, 0xd0, 0x3b, 0x3c, 0x91, 0x04, 0x7a, 0x82, 0x08, 0xca, - 0xf9, 0x82, 0x00, 0xca, 0xfc, 0x95, 0x34, 0x90, 0x01, 0xa2, 0x35, 0xce, 0x8b, 0xac, - 0xce, 0xcc, 0x82, 0x46, 0xcc, 0xf8, 0xa2, 0x34, 0xce, 0x88, 0xb5, 0x09, 0x09, 0x95, - 0x4a, 0xa2, 0x06, 0xce, 0xa8, 0x9c, 0x03, 0x42, 0x94, 0x3e, 0xa2, 0x30, 0x72, 0xa8, - 0x9c, 0x00, 0x94, 0x36, 0xa2, 0x54, 0xce, 0x88, 0x9d, 0x00, 0x94, 0x2e, 0xa2, 0x24, - 0xce, 0xa8, 0xbc, 0x12, 0x60, 0x42, 0x94, 0x24, 0xa2, 0x26, 0xce, 0xa8, 0xbc, 0x04, - 0xa8, 0x41, 0x5b, 0xa2, 0x30, 0x72, 0xa8, 0xa2, 0x32, 0x72, 0xfd, 0x43, 0xb4, 0xfc, - 0x94, 0xa2, 0x32, 0x72, 0xa8, 0x04, 0xa2, 0x32, 0x72, 0xab, 0x90, 0x01, 0xa2, 0x54, - 0xce, 0x8b, 0x90, 0x00, 0xa2, 0x35, 0xce, 0x8b, 0x90, 0x06, 0xa2, 0x4e, 0xce, 0xab, - 0xa2, 0x22, 0xce, 0x88, 0xab, 0x18, 0xb0, 0x40, 0x3e, 0xb5, 0xe5, 0x54, 0xa2, 0x22, - 0xce, 0x88, 0xb5, 0xd0, 0x17, 0xa2, 0x2e, 0xce, 0xab, 0x99, 0x04, 0x9d, 0x00, 0x59, - 0x90, 0x08, 0xa2, 0x50, 0xce, 0xfa, 0xa2, 0x50, 0xce, 0xab, 0xb5, 0xcf, 0x9b, 0x91, - 0x04, 0xa2, 0x22, 0xce, 0x88, 0xb5, 0xd0, 0x85, 0xb4, 0xfb, 0x47, 0x90, 0x01, 0xa2, - 0x35, 0xce, 0x8b, 0x7f, 0x00, 0xa2, 0x35, 0xce, 0x8b, 0x90, 0x07, 0xa2, 0x4e, 0xce, - 0xab, 0xa2, 0x22, 0xce, 0x88, 0xab, 0x18, 0xb0, 0x40, 0x3e, 0xb5, 0xe5, 0x0d, 0xa2, - 0x22, 0xce, 0x88, 0xb5, 0xcf, 0xd0, 0xa2, 0x2e, 0xce, 0xab, 0xab, 0xca, 0x99, 0x08, - 0x9d, 0x00, 0x4c, 0x82, 0x40, 0xca, 0xf9, 0x82, 0x00, 0xca, 0xfc, 0x4a, 0xb4, 0xfc, - 0x08, 0x90, 0x01, 0xa2, 0x35, 0xce, 0x8b, 0x40, 0x91, 0x08, 0xa2, 0x22, 0xce, 0x88, - 0xb5, 0xd0, 0x36, 0xb4, 0xfa, 0xfa, 0x00, 0xa2, 0x35, 0xce, 0x8b, 0xa2, 0x3b, 0xce, - 0x8b, 0x90, 0x03, 0xa2, 0x2c, 0xce, 0xab, 0xa2, 0x22, 0xce, 0x88, 0xab, 0x18, 0xb0, - 0x40, 0x3d, 0xb5, 0xe4, 0xc1, 0x00, 0xa2, 0x41, 0xce, 0x8b, 0xa2, 0x4c, 0xce, 0xab, - 0x90, 0x08, 0xa2, 0x4e, 0xce, 0xab, 0xa2, 0x22, 0xce, 0x88, 0xab, 0x18, 0xb0, 0x40, - 0x3e, 0xb5, 0xe4, 0xa6, 0xa2, 0x22, 0xce, 0x88, 0xb5, 0xcf, 0x69, 0xa2, 0x2e, 0xce, - 0xab, 0x99, 0x40, 0x9c, 0x00, 0x54, 0x90, 0x01, 0xa2, 0x35, 0xce, 0x8b, 0x90, 0x08, - 0x01, 0xa2, 0x50, 0xce, 0xf9, 0xa2, 0x50, 0xce, 0xab, 0xb5, 0xce, 0xe6, 0x91, 0x01, - 0xa2, 0x22, 0xce, 0x88, 0xb5, 0xcf, 0xd0, 0xb4, 0xfa, 0x96, 0x90, 0x00, 0xa2, 0x50, - 0xce, 0xab, 0xb5, 0xce, 0xd1, 0x90, 0x09, 0xa2, 0x4e, 0xce, 0xab, 0xa2, 0x22, 0xce, - 0x88, 0xab, 0x18, 0xb0, 0x40, 0x3e, 0xb5, 0xe4, 0x5b, 0xa2, 0x04, 0xce, 0xa8, 0x9c, - 0x02, 0x94, 0x2c, 0x90, 0x01, 0xb5, 0xce, 0x8a, 0xb7, 0x00, 0x00, 0x02, 0xb7, 0x00, - 0x00, 0x04, 0xb7, 0x02, 0x00, 0x06, 0xac, 0xce, 0xcc, 0x82, 0x4c, 0xcc, 0xf8, 0xa2, - 0x22, 0xce, 0x88, 0xb5, 0xc8, 0x53, 0xa2, 0x04, 0xce, 0xa8, 0xab, 0xca, 0xa2, 0x22, - 0xce, 0x88, 0xb4, 0xcf, 0x7e, 0x90, 0x00, 0xb5, 0xce, 0x5e, 0x95, 0x2c, 0xa8, 0x46, - 0xb5, 0x9e, 0xc9, 0xa2, 0x0e, 0x76, 0xa8, 0x9c, 0x00, 0x3c, 0xa8, 0x44, 0xbc, 0x02, - 0x09, 0x55, 0xbc, 0x02, 0xff, 0x59, 0xbc, 0x02, 0x01, 0x94, 0x46, 0xbc, 0x02, 0x04, - 0x94, 0x4e, 0xbc, 0x02, 0x10, 0x94, 0x79, 0x94, 0xb2, 0xa8, 0x48, 0xa2, 0x2e, 0x76, - 0xab, 0x94, 0xaa, 0xa8, 0x48, 0xa2, 0x48, 0x76, 0xfc, 0x94, 0x23, 0xa2, 0x4a, 0x76, - 0xfc, 0x46, 0xa2, 0x4c, 0x76, 0xfc, 0x4d, 0x3c, 0xb0, 0x02, 0x0b, 0xab, 0x44, 0x00, - 0xa2, 0x4a, 0x76, 0xab, 0x94, 0x8b, 0xb0, 0x02, 0x0d, 0xab, 0x44, 0x00, 0xa2, 0x4c, - 0x76, 0xab, 0x94, 0x7f, 0x00, 0xa2, 0x48, 0x76, 0xab, 0x94, 0x78, 0xa2, 0x4e, 0x76, - 0xa8, 0x9c, 0x09, 0x3c, 0xac, 0x76, 0xce, 0xb4, 0xfa, 0xcb, 0xa2, 0x4e, 0x76, 0xa8, - 0x9c, 0x09, 0x3c, 0xac, 0x76, 0xce, 0xb5, 0xfa, 0x09, 0xa2, 0x54, 0x76, 0x88, 0x9c, - 0x00, 0x3c, 0xa2, 0x34, 0x72, 0xa8, 0x9c, 0x01, 0x41, 0x43, 0xac, 0x76, 0xce, 0xb7, - 0x01, 0x07, 0x02, 0xb7, 0x00, 0x00, 0x04, 0xb7, 0x00, 0x00, 0x06, 0xa8, 0x46, 0xb4, - 0x9f, 0xc8, 0xac, 0x76, 0xce, 0xb5, 0xf9, 0xe0, 0xa2, 0x54, 0x76, 0x88, 0x9c, 0x00, - 0x5c, 0xa2, 0x34, 0x72, 0xa8, 0x9c, 0x01, 0x41, 0x43, 0xac, 0x76, 0xce, 0xb7, 0x01, - 0x07, 0x02, 0xb7, 0x00, 0x00, 0x04, 0xb7, 0x00, 0x00, 0x06, 0xa8, 0x46, 0xb5, 0x9f, - 0x9f, 0x90, 0x09, 0xa2, 0x4e, 0x76, 0xab, 0xa2, 0x22, 0x76, 0x88, 0xab, 0x18, 0xb0, - 0x40, 0x3e, 0xb4, 0xe3, 0x47, 0xa2, 0x4e, 0x76, 0xa8, 0x9c, 0x00, 0x94, 0x2b, 0x9c, - 0x01, 0x94, 0x3a, 0x9c, 0x02, 0x94, 0x93, 0x9c, 0x03, 0x94, 0xec, 0x9c, 0x04, 0xb4, - 0x01, 0x74, 0x9c, 0x05, 0xb4, 0x02, 0xad, 0x9c, 0x06, 0xb4, 0x03, 0x42, 0x9c, 0x07, - 0xb4, 0x03, 0xba, 0x9c, 0x08, 0xb4, 0x04, 0x1f, 0x9c, 0x09, 0xb4, 0x06, 0x44, 0x3c, - 0xa8, 0x44, 0xbc, 0x02, 0x02, 0x41, 0x3c, 0xa8, 0x48, 0xa2, 0x04, 0x76, 0xab, 0xac, - 0x76, 0xce, 0xb4, 0xfe, 0x8b, 0xa8, 0x44, 0xbc, 0x02, 0xff, 0x46, 0xbc, 0x02, 0x09, - 0x94, 0x35, 0x3c, 0xa2, 0x35, 0x76, 0x88, 0x9c, 0x00, 0x4f, 0x90, 0x01, 0xa2, 0x3f, - 0x76, 0x8b, 0xac, 0x46, 0x18, 0xb0, 0x40, 0x21, 0xb4, 0xe2, 0xdf, 0x90, 0x01, 0xa2, - 0x35, 0x76, 0x8b, 0xac, 0x76, 0xce, 0xa2, 0x22, 0xce, 0x88, 0xb5, 0xcd, 0x99, 0xa2, - 0x2e, 0x76, 0xab, 0x99, 0x06, 0x9c, 0x00, 0xb4, 0xf7, 0xbf, 0xb4, 0xfb, 0x86, 0xa2, - 0x35, 0x76, 0x88, 0x9c, 0x00, 0x3c, 0xac, 0x76, 0xce, 0xa2, 0x22, 0xce, 0x88, 0xb5, - 0xcd, 0x7a, 0xa2, 0x2e, 0x76, 0xab, 0x99, 0x06, 0x9c, 0x00, 0x3c, 0xb4, 0xfb, 0x69, - 0xa8, 0x44, 0xbc, 0x02, 0x09, 0x41, 0x3c, 0xa2, 0x2e, 0x76, 0xa8, 0x99, 0x06, 0x9c, - 0x00, 0x4f, 0xa2, 0x35, 0x76, 0x88, 0x9d, 0x00, 0x48, 0xa2, 0x1e, 0x72, 0x88, 0x9c, - 0x02, 0x94, 0x2e, 0xa2, 0x2e, 0x76, 0xa8, 0x99, 0x08, 0x9c, 0x00, 0x3c, 0xa2, 0x35, - 0x76, 0x88, 0x9d, 0x00, 0x3c, 0xa2, 0x3b, 0x76, 0x88, 0x9d, 0x00, 0x3c, 0x90, 0x01, - 0xa2, 0x35, 0x76, 0x8b, 0xb7, 0x01, 0x03, 0x02, 0xb7, 0x00, 0x04, 0x04, 0xb7, 0x00, - 0x00, 0x06, 0xa8, 0x46, 0xb4, 0x9e, 0x9d, 0xb7, 0x01, 0x04, 0x02, 0xb7, 0x00, 0x04, - 0x04, 0xb7, 0x00, 0x00, 0x06, 0x00, 0xb4, 0x9e, 0x8d, 0xa8, 0x44, 0xbc, 0x02, 0x09, - 0x4b, 0xbc, 0x02, 0x14, 0x94, 0x31, 0xbc, 0x02, 0xff, 0x94, 0x33, 0x3c, 0xa2, 0x35, - 0x76, 0x88, 0x9d, 0x00, 0x3c, 0xa2, 0x2e, 0x76, 0xa8, 0x99, 0x04, 0x9c, 0x00, 0x4c, - 0x90, 0x01, 0xa2, 0x35, 0x76, 0x8b, 0xac, 0x76, 0xce, 0xb4, 0xf7, 0x52, 0xa2, 0x2e, - 0x76, 0xa8, 0x99, 0x40, 0x9c, 0x00, 0x3c, 0xac, 0x76, 0xce, 0xb4, 0xf9, 0x24, 0xa2, - 0x48, 0x76, 0xa8, 0x9d, 0x00, 0x3c, 0xa2, 0x35, 0x76, 0x88, 0x9c, 0x00, 0x3c, 0xa2, - 0x06, 0x76, 0xa8, 0x9c, 0x03, 0x4b, 0x00, 0xa2, 0x34, 0x76, 0x8b, 0xac, 0x76, 0xce, - 0xb4, 0xfb, 0x1a, 0xa2, 0x30, 0x72, 0x88, 0x9c, 0x00, 0x71, 0xa2, 0x30, 0x72, 0xa8, - 0xa2, 0x32, 0x72, 0xfd, 0x47, 0x90, 0x01, 0xa2, 0x55, 0x76, 0x8b, 0x3c, 0xa2, 0x32, - 0x72, 0xa8, 0x04, 0xa2, 0x32, 0x72, 0xab, 0x90, 0x01, 0xa2, 0x55, 0x76, 0x8b, 0x00, - 0xa2, 0x34, 0x76, 0x8b, 0xac, 0x76, 0xce, 0xb4, 0xfa, 0xe9, 0xa8, 0x44, 0xbc, 0x02, - 0x09, 0x94, 0x3c, 0xbc, 0x02, 0xff, 0x94, 0x92, 0xbc, 0x02, 0x06, 0x4e, 0xbc, 0x02, - 0x05, 0x5a, 0xbc, 0x02, 0x07, 0x5c, 0xbc, 0x02, 0x13, 0x94, 0xf0, 0x3c, 0xb1, 0x01, - 0x00, 0xac, 0x76, 0xce, 0xa2, 0x22, 0xce, 0x88, 0xb5, 0xcc, 0xe6, 0xb4, 0xf6, 0xe5, - 0xac, 0x76, 0xce, 0xb4, 0xfb, 0x49, 0xac, 0x76, 0xce, 0xa2, 0x3c, 0x76, 0x88, 0x9d, - 0x00, 0xb4, 0xf8, 0x93, 0xb4, 0xfb, 0xc4, 0xac, 0x76, 0xce, 0xa2, 0x2e, 0x76, 0xa8, - 0x99, 0x02, 0x9d, 0x00, 0xb4, 0xf8, 0x82, 0xa2, 0x2e, 0x76, 0xa8, 0x99, 0x40, 0x9c, - 0x00, 0x5e, 0xa2, 0x35, 0x76, 0x88, 0x9d, 0x00, 0x57, 0x90, 0x08, 0x01, 0xa2, 0x50, - 0x76, 0xf9, 0xa2, 0x50, 0x76, 0xab, 0xb5, 0xcb, 0xaf, 0x90, 0x01, 0xa2, 0x35, 0x76, - 0x8b, 0xb4, 0xf6, 0x9b, 0xa2, 0x2e, 0x76, 0xa8, 0x99, 0x0c, 0x9c, 0x00, 0x3c, 0xa2, - 0x38, 0x76, 0x88, 0x9c, 0x00, 0x3c, 0xa2, 0x37, 0x76, 0x88, 0x9d, 0x00, 0x3c, 0x90, - 0x01, 0xa2, 0x37, 0x76, 0x8b, 0xac, 0x76, 0xce, 0xb5, 0x04, 0x87, 0xb4, 0xf6, 0x75, - 0xa2, 0x35, 0x76, 0x88, 0x9d, 0x00, 0x4d, 0xa2, 0x34, 0x76, 0x88, 0x9c, 0x00, 0x3c, - 0xac, 0x76, 0xce, 0xb4, 0xf8, 0x21, 0xac, 0x76, 0xce, 0xa2, 0x36, 0xce, 0x88, 0x9d, - 0x00, 0x94, 0x36, 0x90, 0x01, 0xa2, 0x36, 0xce, 0x8b, 0xb5, 0x07, 0x8e, 0xb5, 0xf6, - 0x4a, 0xa2, 0x22, 0xce, 0x88, 0xb5, 0xcb, 0xb4, 0xa2, 0x2e, 0xce, 0xab, 0x99, 0x0c, - 0x9c, 0x00, 0x3c, 0xa2, 0x38, 0xce, 0x88, 0x9c, 0x00, 0x3c, 0xa2, 0x37, 0xce, 0x88, - 0x9d, 0x00, 0x3c, 0x90, 0x01, 0xa2, 0x37, 0xce, 0x8b, 0xb5, 0x04, 0x32, 0xb4, 0xf6, - 0x20, 0xa2, 0x38, 0xce, 0x88, 0x9c, 0x00, 0x3c, 0xa2, 0x37, 0xce, 0x88, 0x9d, 0x00, - 0x3c, 0x90, 0x01, 0xa2, 0x37, 0xce, 0x8b, 0xb5, 0x04, 0x18, 0xb4, 0xf6, 0x06, 0xa2, - 0x34, 0x76, 0x88, 0x9d, 0x04, 0x41, 0x3c, 0xa2, 0x3c, 0x76, 0x88, 0x9d, 0x00, 0x3c, - 0xac, 0x76, 0xcc, 0x82, 0x44, 0xcc, 0xf8, 0x90, 0x04, 0xb5, 0x03, 0xee, 0x41, 0x3c, - 0x90, 0x05, 0xb5, 0x03, 0xe7, 0x41, 0x3c, 0x90, 0x03, 0xb5, 0x03, 0xe0, 0x41, 0x3c, - 0xac, 0x76, 0xce, 0xb4, 0xf7, 0x95, 0xa8, 0x44, 0xbc, 0x02, 0x09, 0x46, 0xbc, 0x02, - 0xff, 0x94, 0x77, 0x3c, 0xac, 0x76, 0xce, 0xa2, 0x2e, 0x76, 0xa8, 0x99, 0x02, 0x9d, - 0x00, 0xb4, 0xf7, 0x7b, 0xa2, 0x35, 0x76, 0x88, 0x9d, 0x00, 0x3c, 0xa2, 0x2e, 0x76, - 0xa8, 0x99, 0x04, 0x9c, 0x00, 0x94, 0x27, 0x90, 0x01, 0xa2, 0x35, 0x76, 0x8b, 0xa2, - 0x34, 0x76, 0x88, 0xac, 0x76, 0xcc, 0x82, 0x46, 0xcc, 0xf8, 0xb5, 0x03, 0x89, 0xa2, - 0x50, 0x76, 0xa8, 0x9a, 0x08, 0xa2, 0x50, 0x76, 0xab, 0xac, 0x76, 0xce, 0xb5, 0xca, - 0x91, 0xb5, 0xf6, 0x1c, 0xa2, 0x2e, 0x76, 0xa8, 0x99, 0x08, 0x9c, 0x00, 0x3c, 0x90, - 0x01, 0xa2, 0x35, 0x76, 0x8b, 0xa2, 0x34, 0x76, 0x88, 0xac, 0x76, 0xcc, 0x82, 0x46, - 0xcc, 0xf8, 0xb5, 0x03, 0x61, 0xa2, 0x50, 0x76, 0xa8, 0x9a, 0x08, 0xa2, 0x50, 0x76, - 0xab, 0xac, 0x76, 0xce, 0xb5, 0xca, 0x61, 0xb4, 0xf5, 0xec, 0xac, 0x76, 0xce, 0xa2, - 0x35, 0x76, 0x88, 0x9c, 0x00, 0xb4, 0xf7, 0x07, 0xa2, 0x34, 0x76, 0x88, 0x04, 0xa2, - 0x34, 0x76, 0x8b, 0xb4, 0xf9, 0x11, 0xa8, 0x44, 0xbc, 0x02, 0x09, 0x4b, 0xbc, 0x02, - 0xff, 0x94, 0x4d, 0xbc, 0x02, 0x13, 0x94, 0x60, 0x3c, 0xac, 0x76, 0xce, 0xa2, 0x2e, - 0x76, 0xa8, 0x99, 0x02, 0x9d, 0x00, 0xb4, 0xf6, 0xdc, 0xa2, 0x35, 0x76, 0x88, 0x9d, - 0x00, 0x55, 0xa2, 0x2e, 0x76, 0xa8, 0x99, 0x04, 0x9c, 0x00, 0x4c, 0x90, 0x01, 0xa2, - 0x35, 0x76, 0x8b, 0xac, 0x76, 0xce, 0xb4, 0xf5, 0xc3, 0xac, 0x76, 0xce, 0xa2, 0x22, - 0xce, 0x88, 0xb5, 0xca, 0x67, 0xa2, 0x2e, 0x76, 0xab, 0x99, 0x40, 0x9c, 0x00, 0x3c, - 0xa2, 0x35, 0x76, 0x88, 0x9c, 0x00, 0x3c, 0xb4, 0xf6, 0xa3, 0xac, 0x76, 0xce, 0xa2, - 0x35, 0x76, 0x88, 0x9c, 0x00, 0xb4, 0xf6, 0x97, 0xa2, 0x3c, 0x76, 0x88, 0x9c, 0x00, - 0xb4, 0xfa, 0x51, 0xb4, 0xf6, 0x8b, 0xa2, 0x3c, 0x76, 0x88, 0x9c, 0x00, 0x3c, 0xac, - 0x76, 0xce, 0xb4, 0xf6, 0x7e, 0xa8, 0x44, 0xbc, 0x02, 0x09, 0x4b, 0xbc, 0x02, 0xff, - 0x94, 0x3a, 0xbc, 0x02, 0x13, 0x94, 0x4d, 0x3c, 0xac, 0x76, 0xce, 0xa2, 0x2e, 0x76, - 0xa8, 0x99, 0x02, 0x9c, 0x00, 0x43, 0xb4, 0xf6, 0x5e, 0xa2, 0x35, 0x76, 0x88, 0x9d, - 0x00, 0x3c, 0xa2, 0x2e, 0x76, 0xa8, 0x99, 0x08, 0x9c, 0x00, 0x49, 0x90, 0x01, 0xa2, - 0x35, 0x76, 0x8b, 0xb4, 0xf5, 0x4a, 0xa2, 0x2e, 0x76, 0xa8, 0x99, 0x40, 0x9c, 0x00, - 0x3c, 0xb4, 0xf6, 0x39, 0xac, 0x76, 0xce, 0xa2, 0x35, 0x76, 0x88, 0x9c, 0x00, 0xb4, - 0xf6, 0x2d, 0xa2, 0x3c, 0x76, 0x88, 0x9d, 0x00, 0xb4, 0xf6, 0x24, 0xb4, 0xfa, 0x2c, - 0xa2, 0x3c, 0x76, 0x88, 0x9c, 0x00, 0x3c, 0xac, 0x76, 0xce, 0xb4, 0xf6, 0x14, 0xa8, - 0x44, 0xbc, 0x02, 0xff, 0x94, 0x36, 0xbc, 0x02, 0x09, 0x94, 0x98, 0xbc, 0x02, 0x03, - 0xb4, 0x01, 0x6e, 0xbc, 0x02, 0x0a, 0xb4, 0x01, 0x6e, 0xbc, 0x02, 0x0b, 0xb4, 0x01, - 0x75, 0xbc, 0x02, 0x06, 0xb4, 0x01, 0x93, 0xbc, 0x02, 0x13, 0xb4, 0x01, 0xc2, 0xbc, - 0x02, 0x0d, 0xb4, 0x01, 0xc9, 0xbc, 0x02, 0x11, 0xb4, 0x01, 0xda, 0xbc, 0x02, 0x12, - 0xb4, 0x01, 0xe1, 0x3c, 0xa2, 0x35, 0x76, 0x88, 0x9d, 0x00, 0x4d, 0xa2, 0x3b, 0x76, - 0x88, 0x9d, 0x00, 0x46, 0xac, 0x76, 0xce, 0xb4, 0xf6, 0xa9, 0xa2, 0x35, 0x76, 0x88, - 0x9c, 0x00, 0x3c, 0xa2, 0x3a, 0x76, 0x88, 0x9d, 0x00, 0x3c, 0xac, 0x76, 0xce, 0xa2, - 0x22, 0xce, 0x88, 0xb5, 0xc9, 0x5c, 0xa2, 0x2e, 0x76, 0xab, 0x99, 0x08, 0x9c, 0x00, - 0x4d, 0xa2, 0x3b, 0x76, 0x88, 0x9d, 0x00, 0x46, 0xb5, 0xf5, 0x98, 0xb4, 0xf4, 0x9c, - 0xb7, 0x03, 0x02, 0x02, 0xb7, 0x00, 0x01, 0x04, 0xb7, 0x00, 0x00, 0x06, 0xa8, 0x46, - 0xb5, 0x9a, 0xb1, 0xb7, 0x02, 0x06, 0x02, 0xb7, 0x00, 0x00, 0x04, 0xb7, 0x00, 0x00, - 0x06, 0xa8, 0x46, 0xb5, 0x9a, 0xa0, 0xb4, 0xf4, 0x77, 0xa2, 0x3b, 0x76, 0x88, 0x9d, - 0x00, 0x51, 0xa2, 0x2e, 0x76, 0xa8, 0x99, 0x04, 0x9c, 0x00, 0x48, 0xac, 0x76, 0xce, - 0xb5, 0xf5, 0x5a, 0x94, 0x50, 0xa2, 0x3b, 0x76, 0x88, 0x9d, 0x00, 0x51, 0xa2, 0x2e, - 0x76, 0xa8, 0x99, 0x02, 0x9c, 0x00, 0x48, 0xac, 0x76, 0xce, 0xb5, 0xf6, 0x28, 0x94, - 0x38, 0xa2, 0x3a, 0x76, 0x88, 0x9c, 0x00, 0x94, 0x58, 0xa2, 0x3b, 0x76, 0x88, 0x9d, - 0x00, 0x94, 0x50, 0xa2, 0x2e, 0x76, 0xa8, 0x99, 0x08, 0x9c, 0x00, 0x94, 0x46, 0x90, - 0x01, 0xa2, 0x3b, 0x76, 0x8b, 0xb7, 0x01, 0x03, 0x02, 0xb7, 0x00, 0x04, 0x04, 0xb7, - 0x00, 0x00, 0x06, 0xa8, 0x46, 0xb5, 0x9a, 0x3c, 0xac, 0x76, 0xce, 0xb5, 0xf4, 0x10, - 0x40, 0xa2, 0x2e, 0x76, 0xa8, 0x99, 0x20, 0x9c, 0x00, 0x3c, 0xa2, 0x4a, 0x76, 0xa8, - 0x9d, 0x00, 0x3c, 0xb7, 0x07, 0xef, 0x02, 0xb7, 0x00, 0x00, 0x04, 0xb7, 0x02, 0x00, - 0x06, 0xac, 0x76, 0xcc, 0x82, 0x4a, 0xcc, 0xf8, 0xa8, 0x46, 0xb4, 0xc1, 0xe6, 0xa2, - 0x2e, 0x76, 0xa8, 0x99, 0x40, 0x9c, 0x00, 0x95, 0x30, 0xa2, 0x4a, 0x76, 0xa8, 0x9c, - 0x00, 0x57, 0xb7, 0x00, 0x00, 0x02, 0xb7, 0x00, 0x00, 0x04, 0xb7, 0x00, 0x00, 0x06, - 0xac, 0x76, 0xcc, 0x82, 0x4a, 0xcc, 0xf8, 0x00, 0xb5, 0xc1, 0xbe, 0xa2, 0x35, 0x76, - 0x88, 0x9d, 0x00, 0x95, 0x56, 0x90, 0x01, 0xa2, 0x35, 0x76, 0x8b, 0x90, 0x08, 0x01, - 0xa2, 0x50, 0x76, 0xf9, 0xa2, 0x50, 0x76, 0xab, 0xac, 0x76, 0xce, 0xb5, 0xc7, 0xe4, - 0xb5, 0xf3, 0x9d, 0x95, 0x72, 0xac, 0x76, 0xce, 0xb4, 0xf5, 0x83, 0xa2, 0x3b, 0x76, - 0x88, 0x9d, 0x00, 0x3c, 0xac, 0x76, 0xce, 0xb4, 0xf5, 0x67, 0xac, 0x76, 0xce, 0xa2, - 0x22, 0xce, 0x88, 0xb5, 0xc8, 0x28, 0xa2, 0x2e, 0x76, 0xab, 0x99, 0x41, 0x9d, 0x00, - 0x3c, 0xb7, 0x02, 0x0a, 0x02, 0xb7, 0x00, 0x00, 0x04, 0xb7, 0x00, 0x00, 0x06, 0xa8, - 0x46, 0xb4, 0x99, 0x8a, 0xa2, 0x4c, 0x76, 0xa8, 0x9d, 0x00, 0x3c, 0xb1, 0x01, 0x00, - 0xac, 0x76, 0xce, 0xa2, 0x22, 0xce, 0x88, 0xb5, 0xc8, 0x87, 0x90, 0x30, 0xa2, 0x50, - 0x76, 0xfa, 0xa2, 0x50, 0x76, 0xab, 0xb5, 0xc7, 0x87, 0xb7, 0x05, 0x01, 0x02, 0xb7, - 0x00, 0x00, 0x04, 0xb7, 0x00, 0x00, 0x06, 0xa8, 0x46, 0xb5, 0x99, 0x58, 0xb4, 0xf3, - 0x2f, 0xa2, 0x3c, 0x76, 0x88, 0x9c, 0x00, 0x3c, 0xac, 0x76, 0xce, 0xb4, 0xf4, 0x1b, - 0xb7, 0x02, 0x06, 0x02, 0xb7, 0x00, 0x00, 0x04, 0xb7, 0x00, 0x00, 0x06, 0xa8, 0x46, - 0xb5, 0x99, 0x37, 0xac, 0x76, 0xce, 0xb4, 0xf3, 0x0b, 0xa2, 0x3b, 0x76, 0x88, 0x9d, - 0x00, 0x3c, 0xac, 0x76, 0xce, 0xb4, 0xf4, 0xdd, 0xa2, 0x41, 0x76, 0x88, 0x9c, 0x00, - 0x3c, 0xac, 0x76, 0xce, 0xb4, 0xf3, 0xea, 0xa8, 0x44, 0xbc, 0x02, 0x02, 0x45, 0xbc, - 0x02, 0x0f, 0x4d, 0x3c, 0xa8, 0x48, 0xa2, 0x04, 0x76, 0xab, 0xac, 0x76, 0xce, 0xb4, - 0xf8, 0x44, 0xac, 0x76, 0xce, 0xb4, 0xf3, 0x18, 0xaf, 0xce, 0xab, 0xce, 0x39, 0x3f, - 0xce, 0x3c, 0xaf, 0xce, 0xab, 0xce, 0x38, 0x3f, 0xce, 0x3c, 0xaf, 0xce, 0xab, 0xce, - 0x3a, 0x43, 0x3f, 0xce, 0x3d, 0x3f, 0xce, 0x3c, 0xa2, 0x34, 0xce, 0x88, 0x9c, 0x00, - 0x94, 0x2a, 0x9c, 0x01, 0x94, 0x42, 0x9c, 0x02, 0x94, 0x79, 0x9c, 0x03, 0x94, 0xb0, - 0x9c, 0x04, 0x94, 0xe2, 0x9c, 0x05, 0xb4, 0x01, 0x89, 0x9c, 0x06, 0xb4, 0x01, 0x97, - 0x9c, 0x07, 0xb4, 0x01, 0xd0, 0x9c, 0x08, 0xb4, 0x02, 0x45, 0x9c, 0x09, 0xb4, 0x02, - 0x81, 0x3c, 0xac, 0xce, 0xcc, 0x82, 0x44, 0xcc, 0xf8, 0x34, 0x4d, 0xb7, 0x02, 0x05, - 0x02, 0xb7, 0x00, 0x00, 0x04, 0xb7, 0x00, 0x00, 0x06, 0xa2, 0x22, 0xce, 0x88, 0xb4, - 0x98, 0x90, 0xa2, 0x06, 0xce, 0xa8, 0x9c, 0x02, 0x94, 0x24, 0x9c, 0x03, 0x94, 0x20, - 0xa2, 0x34, 0xce, 0x88, 0xac, 0xce, 0xcc, 0x82, 0x44, 0xcc, 0xf8, 0x34, 0x79, 0xb7, - 0x02, 0x05, 0x02, 0xb7, 0x00, 0x00, 0x04, 0xb7, 0x00, 0x00, 0x06, 0xa2, 0x22, 0xce, - 0x88, 0xb4, 0x98, 0x64, 0xa2, 0x34, 0xce, 0x88, 0xac, 0xce, 0xcc, 0x82, 0x44, 0xcc, - 0xf8, 0x34, 0xa1, 0x95, 0x20, 0xa2, 0x06, 0xce, 0xa8, 0x9c, 0x01, 0x94, 0x24, 0x9c, - 0x03, 0x94, 0x20, 0xa2, 0x34, 0xce, 0x88, 0xac, 0xce, 0xcc, 0x82, 0x44, 0xcc, 0xf8, - 0x34, 0xb4, 0xb7, 0x02, 0x05, 0x02, 0xb7, 0x00, 0x00, 0x04, 0xb7, 0x00, 0x00, 0x06, - 0xa2, 0x22, 0xce, 0x88, 0xb4, 0x98, 0x29, 0xa2, 0x34, 0xce, 0x88, 0xac, 0xce, 0xcc, - 0x82, 0x44, 0xcc, 0xf8, 0x34, 0xdc, 0x95, 0x20, 0xb5, 0xd9, 0x79, 0x9c, 0x00, 0x94, - 0x20, 0xa2, 0x34, 0xce, 0x88, 0xac, 0xce, 0xcc, 0x82, 0x44, 0xcc, 0xf8, 0x34, 0xf2, - 0xb7, 0x02, 0x05, 0x02, 0xb7, 0x00, 0x00, 0x04, 0xb7, 0x00, 0x00, 0x06, 0xa2, 0x22, - 0xce, 0x88, 0xb4, 0x97, 0xf3, 0xa2, 0x34, 0xce, 0x88, 0xac, 0xce, 0xcc, 0x82, 0x44, - 0xcc, 0xf8, 0x35, 0x0a, 0x95, 0x20, 0xa2, 0x2a, 0xce, 0x88, 0x9c, 0x00, 0x94, 0x44, - 0xa2, 0x2c, 0xce, 0xa8, 0x9c, 0x02, 0x94, 0x26, 0x53, 0xb7, 0x02, 0x05, 0x02, 0xb7, - 0x00, 0x00, 0x04, 0xb7, 0x00, 0x00, 0x06, 0xa2, 0x22, 0xce, 0x88, 0xb4, 0x97, 0xc0, - 0x90, 0x02, 0xa2, 0x2c, 0xce, 0xab, 0xa2, 0x22, 0xce, 0x88, 0xab, 0x18, 0xb0, 0x40, - 0x3d, 0xb5, 0xdb, 0x68, 0xac, 0xce, 0xcc, 0x82, 0x44, 0xcc, 0xf8, 0xa2, 0x34, 0xce, - 0x88, 0x35, 0x57, 0xa2, 0x34, 0xce, 0x88, 0x04, 0x35, 0x5e, 0x95, 0x39, 0xa2, 0x2c, - 0xce, 0xa8, 0x9c, 0x02, 0x52, 0x90, 0x01, 0xa2, 0x2c, 0xce, 0xab, 0xa2, 0x22, 0xce, - 0x88, 0xab, 0x18, 0xb0, 0x40, 0x3d, 0xb5, 0xdb, 0x39, 0xa2, 0x40, 0xce, 0x88, 0x9c, - 0x00, 0x56, 0xac, 0xce, 0xcc, 0x82, 0x44, 0xcc, 0xf8, 0xa2, 0x34, 0xce, 0x88, 0x35, - 0x8d, 0xa2, 0x34, 0xce, 0x88, 0x04, 0x35, 0x8c, 0x95, 0x6f, 0xac, 0xce, 0xcc, 0x82, - 0x44, 0xcc, 0xf8, 0xa2, 0x34, 0xce, 0x88, 0x35, 0x9b, 0xa2, 0x30, 0xce, 0xa8, 0xa2, - 0x32, 0xce, 0xfa, 0x9c, 0x00, 0x49, 0xa2, 0x34, 0xce, 0x88, 0x04, 0x35, 0xb5, 0x95, - 0x90, 0xa2, 0x34, 0xce, 0x88, 0x04, 0x35, 0xb6, 0x95, 0x99, 0xb7, 0x02, 0x05, 0x02, - 0xb7, 0x00, 0x00, 0x04, 0xb7, 0x00, 0x00, 0x06, 0xa2, 0x22, 0xce, 0x88, 0xb4, 0x97, - 0x25, 0xa2, 0x0c, 0xce, 0x88, 0x99, 0x01, 0x9c, 0x00, 0x55, 0xa2, 0x0f, 0x72, 0x88, - 0x9c, 0x00, 0x4e, 0xac, 0xce, 0xcc, 0x82, 0x44, 0xcc, 0xf8, 0xa2, 0x34, 0xce, 0x88, - 0x35, 0xf0, 0x4d, 0xac, 0xce, 0xcc, 0x82, 0x44, 0xcc, 0xf8, 0xa2, 0x34, 0xce, 0x88, - 0x35, 0xf6, 0xb7, 0x02, 0x05, 0x02, 0xb7, 0x00, 0x00, 0x04, 0xb7, 0x00, 0x00, 0x06, - 0xa2, 0x22, 0xce, 0x88, 0xb4, 0x96, 0xe7, 0xaf, 0xce, 0xb7, 0x05, 0x04, 0x44, 0xb7, - 0x00, 0x00, 0x48, 0xb7, 0x00, 0x00, 0x4a, 0xa2, 0x22, 0xce, 0x88, 0xab, 0x46, 0xb5, - 0x9b, 0xc3, 0x3f, 0xce, 0x90, 0x20, 0x01, 0xab, 0xca, 0xa2, 0x50, 0xce, 0xa8, 0x96, - 0xca, 0xf9, 0xa2, 0x50, 0xce, 0xab, 0xb5, 0xc4, 0xd9, 0xb7, 0x03, 0x01, 0x02, 0xb7, - 0x00, 0x00, 0x04, 0xb7, 0x00, 0x00, 0x06, 0xa2, 0x22, 0xce, 0x88, 0xb5, 0x96, 0xa8, - 0xa2, 0x30, 0xce, 0xa8, 0xa2, 0x32, 0xce, 0xfa, 0x9c, 0x00, 0x94, 0x20, 0xac, 0xce, - 0xcc, 0x82, 0x44, 0xcc, 0xf8, 0xa2, 0x34, 0xce, 0x88, 0x36, 0x69, 0xb7, 0x02, 0x05, - 0x02, 0xb7, 0x00, 0x00, 0x04, 0xb7, 0x00, 0x00, 0x06, 0xa2, 0x22, 0xce, 0x88, 0xb4, - 0x96, 0x7c, 0xac, 0xce, 0xcc, 0x82, 0x44, 0xcc, 0xf8, 0xa2, 0x34, 0xce, 0x88, 0x36, - 0x81, 0x95, 0x20, 0xa2, 0x0c, 0xce, 0x88, 0x99, 0x02, 0x9c, 0x00, 0x94, 0x28, 0xa2, - 0x0f, 0x72, 0x88, 0x9c, 0x00, 0x94, 0x20, 0xac, 0xce, 0xcc, 0x82, 0x44, 0xcc, 0xf8, - 0xa2, 0x34, 0xce, 0x88, 0x36, 0xaa, 0xb7, 0x02, 0x05, 0x02, 0xb7, 0x00, 0x00, 0x04, - 0xb7, 0x00, 0x00, 0x06, 0xa2, 0x22, 0xce, 0x88, 0xb4, 0x96, 0x3b, 0xac, 0xce, 0xcc, - 0x82, 0x44, 0xcc, 0xf8, 0xa2, 0x34, 0xce, 0x88, 0x36, 0xc2, 0x95, 0x20, 0xb7, 0x03, - 0x01, 0x02, 0xb7, 0x00, 0x00, 0x04, 0xb7, 0x00, 0x00, 0x06, 0xa2, 0x22, 0xce, 0x88, - 0xb5, 0x96, 0x19, 0x90, 0x20, 0x01, 0xab, 0xca, 0xa2, 0x50, 0xce, 0xa8, 0x96, 0xca, - 0xf9, 0xa2, 0x50, 0xce, 0xab, 0xb5, 0xc4, 0x24, 0xa2, 0x3c, 0xce, 0x88, 0x9d, 0x00, - 0x94, 0x30, 0xa2, 0x2a, 0xce, 0x88, 0x9c, 0x00, 0x42, 0x94, 0x27, 0xb5, 0xd9, 0x1c, - 0x9c, 0x00, 0x94, 0x33, 0xac, 0xce, 0xcc, 0x82, 0x44, 0xcc, 0xf8, 0xa2, 0x34, 0xce, - 0x88, 0x37, 0x17, 0xb7, 0x02, 0x05, 0x02, 0xb7, 0x00, 0x00, 0x04, 0xb7, 0x00, 0x00, - 0x06, 0xa2, 0x22, 0xce, 0x88, 0xb4, 0x95, 0xce, 0xb7, 0x02, 0x01, 0x02, 0xb7, 0x00, - 0x00, 0x04, 0xb7, 0x00, 0x00, 0x06, 0xa2, 0x22, 0xce, 0x88, 0xb4, 0x95, 0xbb, 0xac, - 0xce, 0xcc, 0x82, 0x44, 0xcc, 0xf8, 0xa2, 0x34, 0xce, 0x88, 0x37, 0x42, 0x95, 0x33, - 0xa2, 0x34, 0xce, 0x88, 0x9c, 0x00, 0x94, 0x2d, 0x9c, 0x01, 0x94, 0x2c, 0x9c, 0x02, - 0x94, 0x2b, 0x9c, 0x03, 0x94, 0x2a, 0x9c, 0x04, 0x94, 0x5b, 0x9c, 0x05, 0x94, 0xcb, - 0x9c, 0x06, 0x94, 0xca, 0x9c, 0x07, 0xb4, 0x01, 0x65, 0x9c, 0x08, 0xb4, 0x01, 0xc1, - 0x9c, 0x09, 0xb4, 0x01, 0xec, 0x9c, 0x0a, 0xb4, 0x02, 0x4d, 0x3c, 0xb4, 0xfc, 0x96, - 0xb4, 0xfc, 0x93, 0xb4, 0xfc, 0x90, 0xac, 0xce, 0xcc, 0x82, 0x46, 0xcc, 0xf8, 0x90, - 0x01, 0x37, 0x85, 0x4c, 0x90, 0x02, 0x37, 0x8a, 0x94, 0x20, 0x90, 0x00, 0x4a, 0x90, - 0x03, 0x47, 0x90, 0x02, 0x37, 0x96, 0x67, 0x90, 0x02, 0xa2, 0x28, 0xce, 0x8b, 0xa2, - 0x22, 0xce, 0x88, 0xab, 0x18, 0xb0, 0x40, 0x0d, 0xb5, 0xd8, 0xf9, 0xb4, 0xfc, 0x5e, - 0x90, 0x01, 0x75, 0xa2, 0x06, 0xce, 0xa8, 0x9c, 0x03, 0x5c, 0xac, 0xce, 0xcc, 0x82, - 0x44, 0xcc, 0xf8, 0x90, 0x03, 0x37, 0xc1, 0x94, 0x30, 0xac, 0xce, 0xcc, 0x82, 0x46, - 0xcc, 0xf8, 0x90, 0x03, 0x37, 0xce, 0x94, 0x23, 0x94, 0x4e, 0xa2, 0x28, 0xce, 0x88, - 0x9c, 0x03, 0x42, 0x95, 0x23, 0x90, 0x01, 0xa2, 0x2a, 0xce, 0x8b, 0xa2, 0x22, 0xce, - 0x88, 0xab, 0x18, 0xb0, 0x40, 0x3f, 0xb5, 0xd8, 0xb5, 0xb4, 0xfc, 0x1a, 0x90, 0x01, - 0x50, 0xa2, 0x06, 0xce, 0xa8, 0x9c, 0x03, 0x69, 0xa2, 0x28, 0xce, 0x88, 0x9c, 0x03, - 0x70, 0x90, 0x02, 0xa2, 0x29, 0xce, 0x8b, 0xaf, 0xce, 0xb5, 0xaf, 0x79, 0x3f, 0xce, - 0xa2, 0x3c, 0xce, 0x88, 0x9c, 0x00, 0x48, 0x90, 0x03, 0xa2, 0x2a, 0xce, 0x8b, 0x95, - 0x3a, 0x90, 0x00, 0x68, 0x90, 0x02, 0x6b, 0xb4, 0xfb, 0xe4, 0xac, 0xce, 0xcc, 0x82, - 0x44, 0xcc, 0xf8, 0x90, 0x04, 0xb5, 0xfb, 0xcc, 0x94, 0x48, 0xac, 0xce, 0xcc, 0x82, - 0x46, 0xcc, 0xf8, 0x90, 0x04, 0xb5, 0xfb, 0xbe, 0x94, 0x3a, 0xac, 0xce, 0xcc, 0x82, - 0x44, 0xcc, 0xf8, 0x90, 0x05, 0xb5, 0xfb, 0xb0, 0x5d, 0xac, 0xce, 0xcc, 0x82, 0x46, - 0xcc, 0xf8, 0x90, 0x05, 0xb5, 0xfb, 0xa3, 0x50, 0xb0, 0x2b, 0xc4, 0xa2, 0x24, 0xce, - 0xab, 0x90, 0x01, 0xa2, 0x26, 0xce, 0xab, 0xb4, 0xfb, 0x9e, 0xb0, 0xe6, 0x59, 0xa2, - 0x24, 0xce, 0xab, 0x90, 0x0b, 0xa2, 0x26, 0xce, 0xab, 0xb4, 0xfb, 0x8e, 0xac, 0xce, - 0xcc, 0x82, 0x44, 0xcc, 0xf8, 0x90, 0x04, 0xb5, 0xfb, 0x76, 0x94, 0x23, 0xac, 0xce, - 0xcc, 0x82, 0x46, 0xcc, 0xf8, 0x90, 0x04, 0xb5, 0xfb, 0x68, 0x90, 0x05, 0xb5, 0xfb, - 0x63, 0x59, 0x40, 0xb0, 0x35, 0x20, 0xa2, 0x24, 0xce, 0xab, 0x90, 0x77, 0xa2, 0x26, - 0xce, 0xab, 0xb4, 0xfb, 0x5d, 0x90, 0x05, 0xb5, 0xfb, 0x4c, 0x42, 0x95, 0x29, 0xb0, - 0x12, 0x60, 0xa2, 0x24, 0xce, 0xab, 0xb0, 0x04, 0xa8, 0xa2, 0x26, 0xce, 0xab, 0xb4, - 0xfb, 0x44, 0xb7, 0x02, 0x06, 0x02, 0xb7, 0x00, 0x00, 0x04, 0xb7, 0x00, 0x00, 0x06, - 0xa2, 0x22, 0xce, 0x88, 0xb5, 0x94, 0x0f, 0xac, 0xce, 0xcc, 0x82, 0x44, 0xcc, 0xf8, - 0x90, 0x06, 0xb5, 0xfb, 0x19, 0x41, 0x53, 0xb7, 0x03, 0x01, 0x02, 0xb7, 0x00, 0x01, - 0x04, 0xb7, 0x00, 0x00, 0x06, 0xa2, 0x22, 0xce, 0x88, 0xb5, 0x93, 0xee, 0xaf, 0xce, - 0xb7, 0x05, 0x03, 0x44, 0xb7, 0x00, 0x00, 0x48, 0xb7, 0x00, 0x00, 0x4a, 0xa2, 0x22, - 0xce, 0x88, 0xab, 0x46, 0xb5, 0x98, 0xca, 0x3f, 0xce, 0xa2, 0x50, 0xce, 0xa8, 0x9a, - 0x20, 0xa2, 0x50, 0xce, 0xab, 0xb5, 0xc1, 0xe6, 0x90, 0x01, 0xa2, 0x38, 0xce, 0x8b, - 0x3c, 0xac, 0xce, 0xcc, 0x82, 0x44, 0xcc, 0xf8, 0x90, 0x07, 0xb5, 0xfa, 0xcb, 0x50, - 0xac, 0xce, 0xcc, 0x82, 0x46, 0xcc, 0xf8, 0x90, 0x07, 0xb5, 0xfa, 0xbe, 0x43, 0xb4, - 0xfa, 0xc6, 0xb7, 0x02, 0x01, 0x02, 0xb7, 0x00, 0x00, 0x04, 0xb7, 0x00, 0x00, 0x06, - 0xa2, 0x22, 0xce, 0x88, 0xb4, 0x93, 0x91, 0xac, 0xce, 0xcc, 0x82, 0x44, 0xcc, 0xf8, - 0x90, 0x08, 0xb5, 0xfa, 0x9b, 0x50, 0xac, 0xce, 0xcc, 0x82, 0x46, 0xcc, 0xf8, 0x90, - 0x08, 0xb5, 0xfa, 0x8e, 0x43, 0xb4, 0xfa, 0x96, 0xb7, 0x02, 0x06, 0x02, 0xb7, 0x00, - 0x00, 0x04, 0xb7, 0x00, 0x00, 0x06, 0xa2, 0x22, 0xce, 0x88, 0xb5, 0x93, 0x61, 0xac, - 0xce, 0xcc, 0x82, 0x44, 0xcc, 0xf8, 0x90, 0x08, 0xb5, 0xfa, 0x6b, 0x54, 0xa2, 0x50, - 0xce, 0xa8, 0x9a, 0x20, 0xa2, 0x50, 0xce, 0xab, 0xb5, 0xc1, 0x65, 0x90, 0x01, 0xa2, - 0x38, 0xce, 0x8b, 0x3c, 0xb7, 0x03, 0x01, 0x02, 0xb7, 0x00, 0x01, 0x04, 0xb7, 0x00, - 0x00, 0x06, 0xa2, 0x22, 0xce, 0x88, 0xb5, 0x93, 0x2d, 0x95, 0x27, 0xa2, 0x22, 0xce, - 0x88, 0xab, 0x18, 0xb0, 0x40, 0x0f, 0xb5, 0xd6, 0xd9, 0xb7, 0x02, 0x07, 0x02, 0xb7, - 0x00, 0x00, 0x04, 0xb7, 0x00, 0x00, 0x06, 0xa2, 0x22, 0xce, 0x88, 0xb4, 0x93, 0x0c, - 0x00, 0x00 -}; - -#endif /* !(_PTIFDDI_ASM_H) */ diff -urN linux-2.5.70-bk8/drivers/net/rrunner.c linux-2.5.70-bk9/drivers/net/rrunner.c --- linux-2.5.70-bk8/drivers/net/rrunner.c 2003-05-26 18:00:26.000000000 -0700 +++ linux-2.5.70-bk9/drivers/net/rrunner.c 2003-06-04 04:37:26.000000000 -0700 @@ -97,13 +97,11 @@ struct rr_private *rrpriv; void *tmpptr; dma_addr_t ring_dma; - int ret; + int ret = -ENOMEM; - dev = init_hippi_dev(NULL, sizeof(struct rr_private)); - if (!dev) { - ret = -ENOMEM; - goto out2; - } + dev = alloc_hippi_dev(sizeof(struct rr_private)); + if (!dev) + goto out3; ret = pci_enable_device(pdev); if (ret) { @@ -210,6 +208,10 @@ rr_init(dev); dev->base_addr = 0; + + ret = register_netdev(dev); + if (ret) + goto out; return 0; out: @@ -225,12 +227,9 @@ pci_release_regions(pdev); pci_set_drvdata(pdev, NULL); } - out2: - if (dev) { - unregister_hipdev(dev); - kfree(dev); - } + kfree(dev); + out3: return ret; } @@ -252,7 +251,7 @@ rr->rx_ring_dma); pci_free_consistent(pdev, TX_TOTAL_SIZE, rr->tx_ring, rr->tx_ring_dma); - unregister_hipdev(dev); + unregister_netdev(dev); iounmap(rr->regs); kfree(dev); pci_release_regions(pdev); diff -urN linux-2.5.70-bk8/drivers/net/tokenring/3c359.c linux-2.5.70-bk9/drivers/net/tokenring/3c359.c --- linux-2.5.70-bk8/drivers/net/tokenring/3c359.c 2003-05-26 18:01:00.000000000 -0700 +++ linux-2.5.70-bk9/drivers/net/tokenring/3c359.c 2003-06-04 04:37:26.000000000 -0700 @@ -1129,7 +1129,7 @@ netif_stop_queue(dev) ; xl_freemem(dev) ; free_irq(dev->irq,dev); - unregister_trdev(dev) ; + unregister_netdev(dev) ; kfree(dev) ; xl_reset(dev) ; writel(ACK_INTERRUPT | LATCH_ACK, xl_mmio + MMIO_COMMAND) ; @@ -1783,7 +1783,7 @@ struct net_device *dev = pci_get_drvdata(pdev); struct xl_private *xl_priv=(struct xl_private *)dev->priv; - unregister_trdev(dev); + unregister_netdev(dev); iounmap(xl_priv->xl_mmio) ; pci_release_regions(pdev) ; pci_set_drvdata(pdev,NULL) ; diff -urN linux-2.5.70-bk8/drivers/net/tokenring/abyss.c linux-2.5.70-bk9/drivers/net/tokenring/abyss.c --- linux-2.5.70-bk8/drivers/net/tokenring/abyss.c 2003-05-26 18:00:26.000000000 -0700 +++ linux-2.5.70-bk9/drivers/net/tokenring/abyss.c 2003-06-04 04:37:26.000000000 -0700 @@ -112,9 +112,10 @@ /* At this point we have found a valid card. */ - dev = init_trdev(NULL, 0); + dev = alloc_trdev(0); if (!dev) return -ENOMEM; + SET_MODULE_OWNER(dev); if (!request_region(pci_ioaddr, ABYSS_IO_EXTENT, dev->name)) { @@ -165,21 +166,21 @@ dev->open = abyss_open; dev->stop = abyss_close; - ret = register_trdev(dev); + pci_set_drvdata(pdev, dev); + + ret = register_netdev(dev); if (ret) goto err_out_tmsdev; - - pci_set_drvdata(pdev, dev); return 0; err_out_tmsdev: + pci_set_drvdata(pdev, NULL); tmsdev_term(dev); err_out_irq: free_irq(pdev->irq, dev); err_out_region: release_region(pci_ioaddr, ABYSS_IO_EXTENT); err_out_trdev: - unregister_netdev(dev); kfree(dev); return ret; } diff -urN linux-2.5.70-bk8/drivers/net/tokenring/ibmtr.c linux-2.5.70-bk9/drivers/net/tokenring/ibmtr.c --- linux-2.5.70-bk8/drivers/net/tokenring/ibmtr.c 2003-05-26 18:00:41.000000000 -0700 +++ linux-2.5.70-bk9/drivers/net/tokenring/ibmtr.c 2003-06-04 04:37:27.000000000 -0700 @@ -110,7 +110,6 @@ #include #ifdef PCMCIA -#undef MODULE #undef ENABLE_PAGING #else #define ENABLE_PAGING 1 @@ -352,7 +351,7 @@ unsigned char segment, intr=0, irq=0, i, j, cardpresent=NOTOK, temp=0; void * t_mmio = 0; - struct tok_info *ti = 0; + struct tok_info *ti = dev->priv; void *cd_chanid; unsigned char *tchanid, ctemp; #ifndef PCMCIA @@ -361,14 +360,6 @@ static int version_printed; #endif -#ifndef MODULE -#ifndef PCMCIA - dev = init_trdev(dev, 0); - if (!dev) - return -ENOMEM; -#endif -#endif - /* Query the adapter PIO base port which will return * indication of where MMIO was placed. We also have a * coded interrupt number. @@ -404,7 +395,6 @@ */ #ifdef PCMCIA iounmap(t_mmio); - ti = dev->priv; /*BMS moved up here */ t_mmio = (void *)ti->mmio; /*BMS to get virtual address */ irq = ti->irq; /*BMS to display the irq! */ #endif @@ -454,30 +444,20 @@ DPRINTK("Expected for MCA: "); PrtChanID(mcchannelid, 1); } - /* Now, allocate some of the pl0 buffers for this driver.. */ + /* Now, setup some of the pl0 buffers for this driver.. */ /* If called from PCMCIA, it is already set up, so no need to waste the memory, just use the existing structure */ #ifndef PCMCIA - ti = (struct tok_info *) kmalloc(sizeof(struct tok_info), GFP_KERNEL); - if (ti == NULL) { - iounmap(t_mmio); - return -ENOMEM; - } - memset(ti, 0, sizeof(struct tok_info)); ti->mmio = t_mmio; - dev->priv = ti; /* this seems like the logical use of the - field ... let's try some empirical tests - using the token-info structure -- that - should fit with out future hope of multiple - adapter support as well /dwm */ - for(i=0; iturbo=1; - t_irq=turbo_irq[i]; + ti->turbo = 1; + t_irq = turbo_irq[i]; } #endif /* !PCMCIA */ ti->readlog_pending = 0; @@ -826,11 +806,6 @@ dev->set_multicast_list = tok_set_multicast_list; dev->change_mtu = ibmtr_change_mtu; -#ifndef MODULE -#ifndef PCMCIA - tr_setup(dev); -#endif -#endif return 0; } @@ -1948,21 +1923,21 @@ int count=0; find_turbo_adapters(io); + for (i = 0; io[i] && (i < IBMTR_MAX_ADAPTERS); i++) { irq[i] = 0; mem[i] = 0; - dev_ibmtr[i] = NULL; - dev_ibmtr[i] = init_trdev(dev_ibmtr[i], 0); + dev_ibmtr[i] = alloc_trdev(sizeof(struct tok_info)); if (dev_ibmtr[i] == NULL) { - if (i==0) + if (i == 0) return -ENOMEM; - break ; + break; } dev_ibmtr[i]->base_addr = io[i]; dev_ibmtr[i]->irq = irq[i]; dev_ibmtr[i]->mem_start = mem[i]; dev_ibmtr[i]->init = &ibmtr_probe; - if (register_trdev(dev_ibmtr[i]) != 0) { + if (register_netdev(dev_ibmtr[i]) != 0) { kfree(dev_ibmtr[i]); dev_ibmtr[i] = NULL; continue; @@ -1970,7 +1945,7 @@ count++; } if (count) return 0; - printk("ibmtr: register_trdev() returned non-zero.\n"); + printk("ibmtr: register_netdev() returned non-zero.\n"); return -EIO; } /*init_module */ @@ -1979,24 +1954,25 @@ int i,j; for (i = 0; i < IBMTR_MAX_ADAPTERS; i++){ - if(!dev_ibmtr[i]) continue; + if (!dev_ibmtr[i]) + continue; if (dev_ibmtr[i]->base_addr) { outb(0,dev_ibmtr[i]->base_addr+ADAPTRESET); for(j=jiffies+TR_RST_TIME; time_before_eq(jiffies,j);) ; outb(0,dev_ibmtr[i]->base_addr+ADAPTRESETREL); } - unregister_trdev(dev_ibmtr[i]); + unregister_netdev(dev_ibmtr[i]); free_irq(dev_ibmtr[i]->irq, dev_ibmtr[i]); release_region(dev_ibmtr[i]->base_addr, IBMTR_IO_EXTENT); #ifndef PCMCIA { - struct tok_info *ti = (struct tok_info *)dev_ibmtr[i]->priv ; - iounmap((u32 *)ti->mmio) ; - iounmap((u32 *)ti->sram_virt) ; + struct tok_info *ti = (struct tok_info *) + dev_ibmtr[i]->priv; + iounmap((u32 *)ti->mmio); + iounmap((u32 *)ti->sram_virt); } #endif - kfree(dev_ibmtr[i]->priv); kfree(dev_ibmtr[i]); dev_ibmtr[i] = NULL; } diff -urN linux-2.5.70-bk8/drivers/net/tokenring/lanstreamer.c linux-2.5.70-bk9/drivers/net/tokenring/lanstreamer.c --- linux-2.5.70-bk8/drivers/net/tokenring/lanstreamer.c 2003-05-26 18:00:59.000000000 -0700 +++ linux-2.5.70-bk9/drivers/net/tokenring/lanstreamer.c 2003-06-04 04:37:27.000000000 -0700 @@ -221,213 +221,220 @@ static int __devinit streamer_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) { - struct net_device *dev=NULL; + struct net_device *dev; struct streamer_private *streamer_priv; - __u32 pio_start, pio_end, pio_flags, pio_len; - __u32 mmio_start, mmio_end, mmio_flags, mmio_len; - int rc=0; - static int card_no=-1; - u16 pcr; - u8 cls = 0; + unsigned long pio_start, pio_end, pio_flags, pio_len; + unsigned long mmio_start, mmio_end, mmio_flags, mmio_len; + int rc = 0; + static int card_no=-1; + u16 pcr; + u8 cls = 0; #if STREAMER_DEBUG - printk("lanstreamer::streamer_init_one, entry pdev %p\n",pdev); + printk("lanstreamer::streamer_init_one, entry pdev %p\n",pdev); #endif - card_no++; - dev=init_trdev(dev, sizeof(*streamer_priv)); - if(dev==NULL) { - printk(KERN_ERR "lanstreamer: out of memory.\n"); - return -ENOMEM; - } - SET_MODULE_OWNER(dev); - streamer_priv=dev->priv; + card_no++; + dev = alloc_trdev(sizeof(*streamer_priv)); + if (dev==NULL) { + printk(KERN_ERR "lanstreamer: out of memory.\n"); + return -ENOMEM; + } + + SET_MODULE_OWNER(dev); + streamer_priv = dev->priv; #if STREAMER_NETWORK_MONITOR #ifdef CONFIG_PROC_FS - if (!dev_streamer) { - create_proc_read_entry("net/streamer_tr",0,0,streamer_proc_info,NULL); - } - streamer_priv->next=dev_streamer; - dev_streamer=streamer_priv; + if (!dev_streamer) + create_proc_read_entry("net/streamer_tr", 0, 0, + streamer_proc_info, NULL); + streamer_priv->next = dev_streamer; + dev_streamer = streamer_priv; #endif #endif - - if(pci_set_dma_mask(pdev, 0xFFFFFFFF)) { - printk(KERN_ERR "%s: No suitable PCI mapping available.\n", dev->name); - rc = -ENODEV; - goto err_out; - } - - if (pci_enable_device(pdev)) { - printk(KERN_ERR "lanstreamer: unable to enable pci device\n"); - rc=-EIO; - goto err_out; - } - - pci_set_master(pdev); - - pio_start = pci_resource_start(pdev, 0); - pio_end = pci_resource_end(pdev, 0); - pio_flags = pci_resource_flags(pdev, 0); - pio_len = pci_resource_len(pdev, 0); - - mmio_start = pci_resource_start(pdev, 1); - mmio_end = pci_resource_end(pdev, 1); - mmio_flags = pci_resource_flags(pdev, 1); - mmio_len = pci_resource_len(pdev, 1); - + + if (pci_set_dma_mask(pdev, 0xFFFFFFFF)) { + printk(KERN_ERR "%s: No suitable PCI mapping available.\n", + dev->name); + rc = -ENODEV; + goto err_out; + } + + if (pci_enable_device(pdev)) { + printk(KERN_ERR "lanstreamer: unable to enable pci device\n"); + rc=-EIO; + goto err_out; + } + + pci_set_master(pdev); + + pio_start = pci_resource_start(pdev, 0); + pio_end = pci_resource_end(pdev, 0); + pio_flags = pci_resource_flags(pdev, 0); + pio_len = pci_resource_len(pdev, 0); + + mmio_start = pci_resource_start(pdev, 1); + mmio_end = pci_resource_end(pdev, 1); + mmio_flags = pci_resource_flags(pdev, 1); + mmio_len = pci_resource_len(pdev, 1); + #if STREAMER_DEBUG - printk("lanstreamer: pio_start %x pio_end %x pio_len %x pio_flags %x\n", - pio_start, pio_end, pio_len, pio_flags); - printk("lanstreamer: mmio_start %x mmio_end %x mmio_len %x mmio_flags %x\n", - mmio_start, mmio_end, mmio_flags, mmio_len); -#endif - - if (!request_region(pio_start, pio_len, "lanstreamer")) { - printk(KERN_ERR "lanstreamer: unable to get pci io addr %x\n",pio_start); - rc= -EBUSY; - goto err_out; - } - - if (!request_mem_region(mmio_start, mmio_len, "lanstreamer")) { - printk(KERN_ERR "lanstreamer: unable to get pci mmio addr %x\n",mmio_start); - rc= -EBUSY; - goto err_out_free_pio; - } - - streamer_priv->streamer_mmio=ioremap(mmio_start, mmio_len); - if (streamer_priv->streamer_mmio == NULL) { - printk(KERN_ERR "lanstreamer: unable to remap MMIO %x\n",mmio_start); - rc= -EIO; - goto err_out_free_mmio; - } + printk("lanstreamer: pio_start %x pio_end %x pio_len %x pio_flags %x\n", + pio_start, pio_end, pio_len, pio_flags); + printk("lanstreamer: mmio_start %x mmio_end %x mmio_len %x mmio_flags %x\n", + mmio_start, mmio_end, mmio_flags, mmio_len); +#endif - init_waitqueue_head(&streamer_priv->srb_wait); - init_waitqueue_head(&streamer_priv->trb_wait); + if (!request_region(pio_start, pio_len, "lanstreamer")) { + printk(KERN_ERR "lanstreamer: unable to get pci io addr %lx\n", + pio_start); + rc= -EBUSY; + goto err_out; + } + + if (!request_mem_region(mmio_start, mmio_len, "lanstreamer")) { + printk(KERN_ERR "lanstreamer: unable to get pci mmio addr %lx\n", + mmio_start); + rc= -EBUSY; + goto err_out_free_pio; + } - dev->open = &streamer_open; - dev->hard_start_xmit = &streamer_xmit; - dev->change_mtu = &streamer_change_mtu; - dev->stop = &streamer_close; + streamer_priv->streamer_mmio=ioremap(mmio_start, mmio_len); + if (streamer_priv->streamer_mmio == NULL) { + printk(KERN_ERR "lanstreamer: unable to remap MMIO %lx\n", + mmio_start); + rc= -EIO; + goto err_out_free_mmio; + } + + init_waitqueue_head(&streamer_priv->srb_wait); + init_waitqueue_head(&streamer_priv->trb_wait); + + dev->open = &streamer_open; + dev->hard_start_xmit = &streamer_xmit; + dev->change_mtu = &streamer_change_mtu; + dev->stop = &streamer_close; #if STREAMER_IOCTL - dev->do_ioctl = &streamer_ioctl; + dev->do_ioctl = &streamer_ioctl; #else - dev->do_ioctl = NULL; + dev->do_ioctl = NULL; #endif - dev->set_multicast_list = &streamer_set_rx_mode; - dev->get_stats = &streamer_get_stats; - dev->set_mac_address = &streamer_set_mac_address; - dev->irq = pdev->irq; - dev->base_addr=pio_start; - - streamer_priv->streamer_card_name = (char *)pdev->resource[0].name; - streamer_priv->pci_dev=pdev; - - if ((pkt_buf_sz[card_no] < 100) || (pkt_buf_sz[card_no] > 18000)) - streamer_priv->pkt_buf_sz = PKT_BUF_SZ; - else - streamer_priv->pkt_buf_sz = pkt_buf_sz[card_no]; - - streamer_priv->streamer_ring_speed = ringspeed[card_no]; - streamer_priv->streamer_message_level = message_level[card_no]; + dev->set_multicast_list = &streamer_set_rx_mode; + dev->get_stats = &streamer_get_stats; + dev->set_mac_address = &streamer_set_mac_address; + dev->irq = pdev->irq; + dev->base_addr=pio_start; - pci_set_drvdata(pdev, dev); + streamer_priv->streamer_card_name = (char *)pdev->resource[0].name; + streamer_priv->pci_dev = pdev; - spin_lock_init(&streamer_priv->streamer_lock); - - pci_read_config_byte(pdev, PCI_CACHE_LINE_SIZE, &cls); - cls <<= 2; - if (cls != SMP_CACHE_BYTES) { - printk(KERN_INFO " PCI cache line size set incorrectly " - "(%i bytes) by BIOS/FW, ", cls); - if (cls > SMP_CACHE_BYTES) - printk("expecting %i\n", SMP_CACHE_BYTES); - else { - printk("correcting to %i\n", SMP_CACHE_BYTES); - pci_write_config_byte(pdev, PCI_CACHE_LINE_SIZE, - SMP_CACHE_BYTES >> 2); - } - } - - pci_read_config_word (pdev, PCI_COMMAND, &pcr); - - pcr |= (PCI_COMMAND_INVALIDATE | PCI_COMMAND_SERR); - - pci_write_config_word (pdev, PCI_COMMAND, pcr); - pci_read_config_word (pdev, PCI_COMMAND, &pcr); - - printk("%s \n", version); - printk("%s: %s. I/O at %hx, MMIO at %p, using irq %d\n",dev->name, - streamer_priv->streamer_card_name, - (unsigned int) dev->base_addr, - streamer_priv->streamer_mmio, - dev->irq); - - if (!streamer_reset(dev)) { - return 0; - } + if ((pkt_buf_sz[card_no] < 100) || (pkt_buf_sz[card_no] > 18000)) + streamer_priv->pkt_buf_sz = PKT_BUF_SZ; + else + streamer_priv->pkt_buf_sz = pkt_buf_sz[card_no]; + + streamer_priv->streamer_ring_speed = ringspeed[card_no]; + streamer_priv->streamer_message_level = message_level[card_no]; + + pci_set_drvdata(pdev, dev); + + spin_lock_init(&streamer_priv->streamer_lock); + + pci_read_config_byte(pdev, PCI_CACHE_LINE_SIZE, &cls); + cls <<= 2; + if (cls != SMP_CACHE_BYTES) { + printk(KERN_INFO " PCI cache line size set incorrectly " + "(%i bytes) by BIOS/FW, ", cls); + if (cls > SMP_CACHE_BYTES) + printk("expecting %i\n", SMP_CACHE_BYTES); + else { + printk("correcting to %i\n", SMP_CACHE_BYTES); + pci_write_config_byte(pdev, PCI_CACHE_LINE_SIZE, + SMP_CACHE_BYTES >> 2); + } + } + + pci_read_config_word (pdev, PCI_COMMAND, &pcr); + + pcr |= (PCI_COMMAND_INVALIDATE | PCI_COMMAND_SERR); + + pci_write_config_word (pdev, PCI_COMMAND, pcr); + pci_read_config_word (pdev, PCI_COMMAND, &pcr); - iounmap(streamer_priv->streamer_mmio); + printk("%s \n", version); + printk("%s: %s. I/O at %hx, MMIO at %p, using irq %d\n",dev->name, + streamer_priv->streamer_card_name, + (unsigned int) dev->base_addr, + streamer_priv->streamer_mmio, + dev->irq); + + if (streamer_reset(dev)) + goto err_out_unmap; + + rc = register_netdev(dev); + if (rc) + goto err_out_unmap; + return 0; + +err_out_unmap: + iounmap(streamer_priv->streamer_mmio); err_out_free_mmio: - release_mem_region(mmio_start, mmio_len); + release_mem_region(mmio_start, mmio_len); err_out_free_pio: - release_region(pio_start, pio_len); + release_region(pio_start, pio_len); err_out: - unregister_trdev(dev); - kfree(dev); + kfree(dev); #if STREAMER_DEBUG - printk("lanstreamer: Exit error %x\n",rc); + printk("lanstreamer: Exit error %x\n",rc); #endif - return rc; + return rc; } -static void __devexit streamer_remove_one(struct pci_dev *pdev) { - struct net_device *dev=pci_get_drvdata(pdev); - struct streamer_private *streamer_priv; +static void __devexit streamer_remove_one(struct pci_dev *pdev) +{ + struct net_device *dev=pci_get_drvdata(pdev); + struct streamer_private *streamer_priv; #if STREAMER_DEBUG - printk("lanstreamer::streamer_remove_one entry pdev %p\n",pdev); + printk("lanstreamer::streamer_remove_one entry pdev %p\n",pdev); #endif - if (dev == NULL) { - printk(KERN_ERR "lanstreamer::streamer_remove_one, ERROR dev is NULL\n"); - return; - } + if (dev == NULL) { + printk(KERN_ERR "lanstreamer::streamer_remove_one, ERROR dev is NULL\n"); + return; + } - streamer_priv=dev->priv; - if (streamer_priv == NULL) { - printk(KERN_ERR "lanstreamer::streamer_remove_one, ERROR dev->priv is NULL\n"); - return; + streamer_priv=dev->priv; + if (streamer_priv == NULL) { + printk(KERN_ERR "lanstreamer::streamer_remove_one, ERROR dev->priv is NULL\n"); + return; } #if STREAMER_NETWORK_MONITOR #ifdef CONFIG_PROC_FS - { - struct streamer_private *slast; - struct streamer_private *scurrent; - if (streamer_priv == dev_streamer) { - dev_streamer=dev_streamer->next; - } else { - for(slast=scurrent=dev_streamer; dev_streamer; slast=scurrent, scurrent=scurrent->next) { - if (scurrent == streamer_priv) { - slast->next=scurrent->next; - break; - } - } - } - if (!dev_streamer) { - remove_proc_entry("net/streamer_tr", NULL); - } - } + { + struct streamer_private **p, **next; + + for (p = &dev_streamer; *p; p = next) { + next = &(*p)->next; + if (*p == streamer_priv) { + *p = *next; + break; + } + } + if (!dev_streamer) + remove_proc_entry("net/streamer_tr", NULL); + } #endif #endif - unregister_trdev(dev); - release_region(pci_resource_start(pdev, 0), pci_resource_len(pdev,0)); - release_mem_region(pci_resource_start(pdev, 1), pci_resource_len(pdev,1)); - kfree(dev); - pci_set_drvdata(pdev, NULL); + unregister_netdev(dev); + /* shouldn't we do iounmap here? */ + release_region(pci_resource_start(pdev, 0), pci_resource_len(pdev,0)); + release_mem_region(pci_resource_start(pdev, 1), pci_resource_len(pdev,1)); + kfree(dev); + pci_set_drvdata(pdev, NULL); } diff -urN linux-2.5.70-bk8/drivers/net/tokenring/madgemc.c linux-2.5.70-bk9/drivers/net/tokenring/madgemc.c --- linux-2.5.70-bk8/drivers/net/tokenring/madgemc.c 2003-05-26 18:00:58.000000000 -0700 +++ linux-2.5.70-bk9/drivers/net/tokenring/madgemc.c 2003-06-04 04:37:27.000000000 -0700 @@ -177,12 +177,14 @@ if (versionprinted++ == 0) printk("%s", version); - if ((dev = init_trdev(NULL, 0))==NULL) { + dev = alloc_trdev(0); + if (dev == NULL) { printk("madgemc: unable to allocate dev space\n"); if (madgemc_card_list) return 0; return -1; } + SET_MODULE_OWNER(dev); dev->dma = 0; @@ -195,7 +197,7 @@ card = kmalloc(sizeof(struct madgemc_card), GFP_KERNEL); if (card==NULL) { printk("madgemc: unable to allocate card struct\n"); - kfree(dev); /* release_trdev? */ + kfree(dev); if (madgemc_card_list) return 0; return -1; @@ -331,7 +333,7 @@ */ outb(0, dev->base_addr + MC_CONTROL_REG0); /* sanity */ madgemc_setsifsel(dev, 1); - if(request_irq(dev->irq, madgemc_interrupt, SA_SHIRQ, + if (request_irq(dev->irq, madgemc_interrupt, SA_SHIRQ, "madgemc", dev)) goto getout; @@ -382,33 +384,22 @@ dev->open = madgemc_open; dev->stop = madgemc_close; - - if (register_trdev(dev) == 0) { + + if (register_netdev(dev) == 0) { /* Enlist in the card list */ card->next = madgemc_card_list; madgemc_card_list = card; - } else { - printk("madgemc: register_trdev() returned non-zero.\n"); - release_region(dev->base_addr-MADGEMC_SIF_OFFSET, - MADGEMC_IO_EXTENT); - - kfree(card); - tmsdev_term(dev); - kfree(dev); - if (madgemc_card_list) - return 0; - return -1; + slot++; + continue; /* successful, try to find another */ } - - slot++; - continue; /* successful, try to find another */ + free_irq(dev->irq, dev); getout: release_region(dev->base_addr-MADGEMC_SIF_OFFSET, MADGEMC_IO_EXTENT); getout1: kfree(card); - kfree(dev); /* release_trdev? */ + kfree(dev); slot++; } @@ -779,7 +770,7 @@ while (madgemc_card_list) { dev = madgemc_card_list->dev; - unregister_trdev(dev); + unregister_netdev(dev); release_region(dev->base_addr-MADGEMC_SIF_OFFSET, MADGEMC_IO_EXTENT); free_irq(dev->irq, dev); tmsdev_term(dev); diff -urN linux-2.5.70-bk8/drivers/net/tokenring/olympic.c linux-2.5.70-bk9/drivers/net/tokenring/olympic.c --- linux-2.5.70-bk8/drivers/net/tokenring/olympic.c 2003-05-26 18:00:46.000000000 -0700 +++ linux-2.5.70-bk9/drivers/net/tokenring/olympic.c 2003-06-04 04:37:27.000000000 -0700 @@ -1773,7 +1773,7 @@ strcat(proc_name,dev->name) ; remove_proc_entry(proc_name,NULL); } - unregister_trdev(dev) ; + unregister_netdev(dev) ; iounmap(olympic_priv->olympic_mmio) ; iounmap(olympic_priv->olympic_lap) ; pci_release_regions(pdev) ; diff -urN linux-2.5.70-bk8/drivers/net/tokenring/proteon.c linux-2.5.70-bk9/drivers/net/tokenring/proteon.c --- linux-2.5.70-bk8/drivers/net/tokenring/proteon.c 2003-05-26 18:00:59.000000000 -0700 +++ linux-2.5.70-bk9/drivers/net/tokenring/proteon.c 2003-06-04 04:37:27.000000000 -0700 @@ -121,6 +121,11 @@ int i,j; struct proteon_card *card; +#ifndef MODULE + netdev_boot_setup_check(dev); + tr_setup(dev); +#endif + SET_MODULE_OWNER(dev); if (!dev->base_addr) { @@ -158,20 +163,8 @@ if (versionprinted++ == 0) printk(KERN_DEBUG "%s", version); -#ifndef MODULE - dev = init_trdev(dev, 0); - if (!dev) - { - release_region(dev->base_addr, PROTEON_IO_EXTENT); - return -1; - } -#endif - if (tmsdev_init(dev, ISA_MAX_ADDRESS, NULL)) - { - release_region(dev->base_addr, PROTEON_IO_EXTENT); - return -1; - } + goto out4; dev->base_addr &= ~3; @@ -211,9 +204,7 @@ if(irqlist[j] == 0) { printk(KERN_INFO "%s: AutoSelect no IRQ available\n", dev->name); - release_region(dev->base_addr, PROTEON_IO_EXTENT); - tmsdev_term(dev); - return -1; + goto out3; } } else @@ -225,18 +216,14 @@ { printk(KERN_INFO "%s: Illegal IRQ %d specified\n", dev->name, dev->irq); - release_region(dev->base_addr, PROTEON_IO_EXTENT); - tmsdev_term(dev); - return -1; + goto out3; } if (request_irq(dev->irq, tms380tr_interrupt, 0, cardname, dev)) { printk(KERN_INFO "%s: Selected IRQ %d not available\n", dev->name, dev->irq); - release_region(dev->base_addr, PROTEON_IO_EXTENT); - tmsdev_term(dev); - return -1; + goto out3; } } @@ -252,10 +239,7 @@ if(dmalist[j] == 0) { printk(KERN_INFO "%s: AutoSelect no DMA available\n", dev->name); - release_region(dev->base_addr, PROTEON_IO_EXTENT); - free_irq(dev->irq, dev); - tmsdev_term(dev); - return -1; + goto out2; } } else @@ -267,52 +251,36 @@ { printk(KERN_INFO "%s: Illegal DMA %d specified\n", dev->name, dev->dma); - release_region(dev->base_addr, PROTEON_IO_EXTENT); - free_irq(dev->irq, dev); - tmsdev_term(dev); - return -1; + goto out2; } if (request_dma(dev->dma, cardname)) { printk(KERN_INFO "%s: Selected DMA %d not available\n", dev->name, dev->dma); - release_region(dev->base_addr, PROTEON_IO_EXTENT); - free_irq(dev->irq, dev); - tmsdev_term(dev); - return -1; + goto out2; } } printk(KERN_DEBUG "%s: IO: %#4lx IRQ: %d DMA: %d\n", dev->name, dev->base_addr, dev->irq, dev->dma); - if (register_trdev(dev) == 0) - { - /* Enlist in the card list */ - card = kmalloc(sizeof(struct proteon_card), GFP_KERNEL); - if (!card) { - unregister_trdev(dev); - release_region(dev->base_addr, PROTEON_IO_EXTENT); - free_irq(dev->irq, dev); - free_dma(dev->dma); - tmsdev_term(dev); - return -1; - } - card->next = proteon_card_list; - proteon_card_list = card; - card->dev = dev; - } - else - { - printk("KERN_INFO %s: register_trdev() returned non-zero.\n", dev->name); - release_region(dev->base_addr, PROTEON_IO_EXTENT); - free_irq(dev->irq, dev); - free_dma(dev->dma); - tmsdev_term(dev); - return -1; - } - + /* Enlist in the card list */ + card = kmalloc(sizeof(struct proteon_card), GFP_KERNEL); + if (!card) + goto out; + card->next = proteon_card_list; + proteon_card_list = card; + card->dev = dev; return 0; +out: + free_dma(dev->dma); +out2: + free_irq(dev->irq, dev); +out3: + tmsdev_term(dev); +out4: + release_region(dev->base_addr, PROTEON_IO_EXTENT); + return -1; } /* @@ -402,64 +370,51 @@ MODULE_PARM(irq, "1-" __MODULE_STRING(ISATR_MAX_ADAPTERS) "i"); MODULE_PARM(dma, "1-" __MODULE_STRING(ISATR_MAX_ADAPTERS) "i"); +static int __init setup_card(unsigned long io, unsigned irq, unsigned char dma) +{ + int res = -ENOMEM; + struct proteon_card *this_card; + struct net_device *dev = alloc_trdev(0); + + if (dev) { + dev->base_addr = io; + dev->irq = irq; + dev->dma = dma; + res = -ENODEV; + if (proteon_probe(dev) == 0) { + res = register_netdev(dev); + if (!res) + return 0; + release_region(dev->base_addr, PROTEON_IO_EXTENT); + free_irq(dev->irq, dev); + free_dma(dev->dma); + tmsdev_term(dev); + this_card = proteon_card_list; + proteon_card_list = this_card->next; + kfree(this_card); + } + kfree(dev); + } + return res; +} + int init_module(void) { int i, num; struct net_device *dev; num = 0; - if (io[0]) - { /* Only probe addresses from command line */ - dev = init_trdev(NULL, 0); - if (!dev) - return (-ENOMEM); - for (i = 0; i < ISATR_MAX_ADAPTERS; i++) - { - if (io[i] == 0) - continue; - - dev->base_addr = io[i]; - dev->irq = irq[i]; - dev->dma = dma[i]; - - if (!proteon_probe(dev)) - { + if (io[0]) { /* Only probe addresses from command line */ + for (i = 0; i < ISATR_MAX_ADAPTERS ; i++) { + if (io[i] && setup_card(io[i], irq[i], dma[i]) == 0) num++; - dev = init_trdev(NULL, 0); - if (!dev) - goto partial; - } } - unregister_netdev(dev); - kfree(dev); - } - else - { - dev = init_trdev(NULL, 0); - if (!dev) - return (-ENOMEM); - - for(i = 0; portlist[i]; i++) - { - if (num >= ISATR_MAX_ADAPTERS) - continue; - - dev->base_addr = portlist[i]; - dev->irq = irq[num]; - dev->dma = dma[num]; - - if (!proteon_probe(dev)) - { + } else { + for(i = 0; num < ISATR_MAX_ADAPTERS && portlist[i]; i++) { + if (setup_card(portlist[i], irq[i], dma[i])) num++; - dev = init_trdev(NULL, 0); - if (!dev) - goto partial; - } } - unregister_netdev(dev); - kfree(dev); } -partial: printk(KERN_NOTICE "proteon.c: %d cards found.\n", num); /* Probe for cards. */ if (num == 0) { diff -urN linux-2.5.70-bk8/drivers/net/tokenring/skisa.c linux-2.5.70-bk9/drivers/net/tokenring/skisa.c --- linux-2.5.70-bk8/drivers/net/tokenring/skisa.c 2003-05-26 18:00:23.000000000 -0700 +++ linux-2.5.70-bk9/drivers/net/tokenring/skisa.c 2003-06-04 04:37:27.000000000 -0700 @@ -141,6 +141,11 @@ int i,j; struct sk_isa_card *card; +#ifndef MODULE + netdev_boot_setup_check(dev); + tr_setup(dev); +#endif + SET_MODULE_OWNER(dev); if (!dev->base_addr) { @@ -178,20 +183,8 @@ if (versionprinted++ == 0) printk(KERN_DEBUG "%s", version); -#ifndef MODULE - dev = init_trdev(dev, 0); - if (!dev) - { - release_region(dev->base_addr, SK_ISA_IO_EXTENT); - return -1; - } -#endif - if (tmsdev_init(dev, ISA_MAX_ADDRESS, NULL)) - { - release_region(dev->base_addr, SK_ISA_IO_EXTENT); - return -1; - } + goto out4; dev->base_addr &= ~3; @@ -231,9 +224,7 @@ if(irqlist[j] == 0) { printk(KERN_INFO "%s: AutoSelect no IRQ available\n", dev->name); - release_region(dev->base_addr, SK_ISA_IO_EXTENT); - tmsdev_term(dev); - return -1; + goto out3; } } else @@ -245,18 +236,14 @@ { printk(KERN_INFO "%s: Illegal IRQ %d specified\n", dev->name, dev->irq); - release_region(dev->base_addr, SK_ISA_IO_EXTENT); - tmsdev_term(dev); - return -1; + goto out3; } if (request_irq(dev->irq, tms380tr_interrupt, 0, isa_cardname, dev)) { printk(KERN_INFO "%s: Selected IRQ %d not available\n", dev->name, dev->irq); - release_region(dev->base_addr, SK_ISA_IO_EXTENT); - tmsdev_term(dev); - return -1; + goto out3; } } @@ -272,10 +259,7 @@ if(dmalist[j] == 0) { printk(KERN_INFO "%s: AutoSelect no DMA available\n", dev->name); - release_region(dev->base_addr, SK_ISA_IO_EXTENT); - free_irq(dev->irq, dev); - tmsdev_term(dev); - return -1; + goto out2; } } else @@ -287,52 +271,36 @@ { printk(KERN_INFO "%s: Illegal DMA %d specified\n", dev->name, dev->dma); - release_region(dev->base_addr, SK_ISA_IO_EXTENT); - free_irq(dev->irq, dev); - tmsdev_term(dev); - return -1; + goto out2; } if (request_dma(dev->dma, isa_cardname)) { printk(KERN_INFO "%s: Selected DMA %d not available\n", dev->name, dev->dma); - release_region(dev->base_addr, SK_ISA_IO_EXTENT); - free_irq(dev->irq, dev); - tmsdev_term(dev); - return -1; + goto out2; } } printk(KERN_DEBUG "%s: IO: %#4lx IRQ: %d DMA: %d\n", dev->name, dev->base_addr, dev->irq, dev->dma); - if (register_trdev(dev) == 0) - { - /* Enlist in the card list */ - card = kmalloc(sizeof(struct sk_isa_card), GFP_KERNEL); - if (!card) { - unregister_trdev(dev); - release_region(dev->base_addr, SK_ISA_IO_EXTENT); - free_irq(dev->irq, dev); - free_dma(dev->dma); - tmsdev_term(dev); - return -1; - } - card->next = sk_isa_card_list; - sk_isa_card_list = card; - card->dev = dev; - } - else - { - printk("KERN_INFO %s: register_trdev() returned non-zero.\n", dev->name); - release_region(dev->base_addr, SK_ISA_IO_EXTENT); - free_irq(dev->irq, dev); - free_dma(dev->dma); - tmsdev_term(dev); - return -1; - } - + /* Enlist in the card list */ + card = kmalloc(sizeof(struct sk_isa_card), GFP_KERNEL); + if (!card) + goto out; + card->next = sk_isa_card_list; + sk_isa_card_list = card; + card->dev = dev; return 0; +out: + free_dma(dev->dma); +out2: + free_irq(dev->irq, dev); +out3: + tmsdev_term(dev); +out4: + release_region(dev->base_addr, SK_ISA_IO_EXTENT); + return -1; } /* @@ -415,64 +383,51 @@ MODULE_PARM(irq, "1-" __MODULE_STRING(ISATR_MAX_ADAPTERS) "i"); MODULE_PARM(dma, "1-" __MODULE_STRING(ISATR_MAX_ADAPTERS) "i"); +static int __init setup_card(unsigned long io, unsigned irq, unsigned char dma) +{ + int res = -ENOMEM; + struct sk_isa_card *this_card; + struct net_device *dev = alloc_trdev(0); + + if (dev) { + dev->base_addr = io; + dev->irq = irq; + dev->dma = dma; + res = -ENODEV; + if (sk_isa_probe(dev) == 0) { + res = register_netdev(dev); + if (!res) + return 0; + release_region(dev->base_addr, SK_ISA_IO_EXTENT); + free_irq(dev->irq, dev); + free_dma(dev->dma); + tmsdev_term(dev); + this_card = sk_isa_card_list; + sk_isa_card_list = this_card->next; + kfree(this_card); + } + kfree(dev); + } + return res; +} + int init_module(void) { int i, num; struct net_device *dev; num = 0; - if (io[0]) - { /* Only probe addresses from command line */ - dev = init_trdev(NULL, 0); - if (!dev) - return (-ENOMEM); - for (i = 0; i < ISATR_MAX_ADAPTERS; i++) - { - if (io[i] == 0) - continue; - - dev->base_addr = io[i]; - dev->irq = irq[i]; - dev->dma = dma[i]; - - if (!sk_isa_probe(dev)) - { + if (io[0]) { /* Only probe addresses from command line */ + for (i = 0; i < ISATR_MAX_ADAPTERS ; i++) { + if (io[i] && setup_card(io[i], irq[i], dma[i]) == 0) num++; - dev = init_trdev(NULL, 0); - if (!dev) - goto partial; - } } - unregister_netdev(dev); - kfree(dev); - } - else - { - dev = init_trdev(NULL, 0); - if (!dev) - return (-ENOMEM); - - for(i = 0; portlist[i]; i++) - { - if (num >= ISATR_MAX_ADAPTERS) - continue; - - dev->base_addr = portlist[i]; - dev->irq = irq[num]; - dev->dma = dma[num]; - - if (!sk_isa_probe(dev)) - { + } else { + for(i = 0; num < ISATR_MAX_ADAPTERS && portlist[i]; i++) { + if (setup_card(portlist[i], irq[i], dma[i])) num++; - dev = init_trdev(NULL, 0); - if (!dev) - goto partial; - } } - unregister_netdev(dev); - kfree(dev); } -partial: printk(KERN_NOTICE "skisa.c: %d cards found.\n", num); /* Probe for cards. */ if (num == 0) { diff -urN linux-2.5.70-bk8/drivers/net/tokenring/smctr.c linux-2.5.70-bk9/drivers/net/tokenring/smctr.c --- linux-2.5.70-bk8/drivers/net/tokenring/smctr.c 2003-05-26 18:00:40.000000000 -0700 +++ linux-2.5.70-bk9/drivers/net/tokenring/smctr.c 2003-06-04 04:37:27.000000000 -0700 @@ -143,7 +143,6 @@ /* I */ static int smctr_init_acbs(struct net_device *dev); static int smctr_init_adapter(struct net_device *dev); -static int __init smctr_init_card(struct net_device *dev); static int smctr_init_card_real(struct net_device *dev); static int smctr_init_rx_bdbs(struct net_device *dev); static int smctr_init_rx_fcbs(struct net_device *dev); @@ -541,25 +540,18 @@ dev->irq = 15; break; } - if(request_irq(dev->irq, smctr_interrupt, SA_SHIRQ, smctr_name, dev)) - return (-ENODEV); + if (request_irq(dev->irq, smctr_interrupt, SA_SHIRQ, smctr_name, dev)) { + release_region(dev->base_addr, SMCTR_IO_EXTENT); + return -ENODEV; + } /* Get RAM base */ r3 = mca_read_stored_pos(tp->slot_num, 3); - if(r3 & 0x8) - { - if(r3 & 0x80) - tp->ram_base = ((__u32)(r3 & 0x7) << 13) + 0xFD0000; - else - tp->ram_base = ((__u32)(r3 & 0x7) << 13) + 0x0D0000; - } - else - { - if(r3 & 0x80) - tp->ram_base = ((__u32)(r3 & 0x7) << 13) + 0xFC0000; - else - tp->ram_base = ((__u32)(r3 & 0x7) << 13) + 0x0C0000; - } + tp->ram_base = ((__u32)(r3 & 0x7) << 13) + 0x0C0000; + if (r3 & 0x8) + tp->ram_base += 0x010000; + if (r3 & 0x80) + tp->ram_base += 0xF00000; /* Get Ram Size */ r3 &= 0x30; @@ -570,26 +562,24 @@ tp->board_id |= TOKEN_MEDIA; r4 = mca_read_stored_pos(tp->slot_num, 4); - if(r4 & 0x8) - tp->rom_base = ((__u32)(r4 & 0x7) << 13) + 0xD0000; - else - tp->rom_base = ((__u32)(r4 & 0x7) << 13) + 0xC0000; + tp->rom_base = ((__u32)(r4 & 0x7) << 13) + 0x0C0000; + if (r4 & 0x8) + tp->rom_base += 0x010000; /* Get ROM size. */ r4 >>= 4; - if(r4 == 0) - tp->rom_size = CNFG_SIZE_8KB; - else - { - if(r4 == 1) + switch (r4) { + case 0: + tp->rom_size = CNFG_SIZE_8KB; + break; + case 1: tp->rom_size = CNFG_SIZE_16KB; - else - { - if(r4 == 2) - tp->rom_size = CNFG_SIZE_32KB; - else - tp->rom_size = ROM_DISABLE; - } + break; + case 2: + tp->rom_size = CNFG_SIZE_32KB; + break; + default: + tp->rom_size = ROM_DISABLE; } /* Get Media Type. */ @@ -953,12 +943,19 @@ __u8 r1, r2, b, chksum = 0; __u16 r; int i; + int err = -ENODEV; if(smctr_debug > 10) printk(KERN_DEBUG "%s: smctr_chk_isa %#4x\n", dev->name, ioaddr); if((ioaddr & 0x1F) != 0) - return (-ENODEV); + goto out; + + /* Grab the region so that no one else tries to probe our ioports. */ + if (!request_region(ioaddr, SMCTR_IO_EXTENT, smctr_name)) { + err = -EBUSY; + goto out; + } /* Checksum SMC node address */ for(i = 0; i < 8; i++) @@ -967,17 +964,14 @@ chksum += b; } - if(chksum != NODE_ADDR_CKSUM) - return (-ENODEV); /* Adapter Not Found */ - - /* Grab the region so that no one else tries to probe our ioports. */ - request_region(ioaddr, SMCTR_IO_EXTENT, smctr_name); + if (chksum != NODE_ADDR_CKSUM) + goto out2; b = inb(ioaddr + BDID); if(b != BRD_ID_8115T) { printk(KERN_ERR "%s: The adapter found is not supported\n", dev->name); - return (-1); + goto out2; } /* Check for 8115T Board ID */ @@ -990,7 +984,7 @@ /* value of RegF adds up the sum to 0xFF */ if((r2 != 0xFF) && (r2 != 0xEE)) - return (-1); + goto out2; /* Get adapter ID */ tp->board_id = smctr_get_boardid(dev, 0); @@ -1077,11 +1071,11 @@ default: printk(KERN_ERR "%s: No IRQ found aborting\n", dev->name); - return(-1); + goto out2; } - if(request_irq(dev->irq, smctr_interrupt, SA_SHIRQ, smctr_name, dev)) - return (-ENODEV); + if (request_irq(dev->irq, smctr_interrupt, SA_SHIRQ, smctr_name, dev)) + goto out2; /* Get 58x Rom Base */ r1 = inb(ioaddr + CNFG_BIO_583); @@ -1157,12 +1151,18 @@ if(smctr_read_584_chksum(ioaddr)) { printk(KERN_ERR "%s: EEPROM Checksum Failure\n", dev->name); - return(-1); + goto out3; } */ } return (0); +out3: + free_irq(dev->irq, dev); +out2: + release_region(ioaddr, SMCTR_IO_EXTENT); +out: + return err; } static int __init smctr_get_boardid(struct net_device *dev, int mca) @@ -1650,15 +1650,6 @@ return (0); } -/* Dummy function */ -static int __init smctr_init_card(struct net_device *dev) -{ - if(smctr_debug > 10) - printk(KERN_DEBUG "%s: smctr_init_card\n", dev->name); - - return (0); -} - static int smctr_init_card_real(struct net_device *dev) { struct net_local *tp = (struct net_local *)dev->priv; @@ -3608,8 +3599,14 @@ int __init smctr_probe (struct net_device *dev) { int i; - int base_addr = dev ? dev->base_addr : 0; + int base_addr; + +#ifndef MODULE + netdev_boot_setup_check(dev); + tr_setup(dev); +#endif + base_addr = dev->base_addr; if(base_addr > 0x1ff) /* Check a single specified location. */ return (smctr_probe1(dev, base_addr)); else if(base_addr != 0) /* Don't probe at all. */ @@ -3618,8 +3615,6 @@ for(i = 0; smctr_portlist[i]; i++) { int ioaddr = smctr_portlist[i]; - if(check_region(ioaddr, SMCTR_IO_EXTENT)) - continue; if (!smctr_probe1(dev, ioaddr)) return (0); } @@ -3627,6 +3622,20 @@ return (-ENODEV); } +static void cleanup_card(struct net_device *dev) +{ +#ifdef CONFIG_MCA + struct net_local *tp = (struct net_local *)dev->priv; + if (tp->slot_num) + mca_mark_as_unused(tp->slot_num); +#endif + release_region(dev->base_addr, SMCTR_IO_EXTENT); + if (dev->irq) + free_irq(dev->irq, dev); + if (dev->priv) + kfree(dev->priv); +} + static int __init smctr_probe1(struct net_device *dev, int ioaddr) { static unsigned version_printed; @@ -3637,12 +3646,6 @@ if(smctr_debug && version_printed++ == 0) printk(version); -#ifndef MODULE - dev = init_trdev(dev, 0); - if(dev == NULL) - return (-ENOMEM); -#endif - /* Setup this devices private information structure */ tp = (struct net_local *)kmalloc(sizeof(struct net_local), GFP_KERNEL); @@ -3677,8 +3680,9 @@ if(err != UCODE_PRESENT && err != SUCCESS) { printk(KERN_ERR "%s: Firmware load failed (%d)\n", dev->name, err); + cleanup_card(dev); err = -EIO; - goto out_tp; + goto out; } /* Allow user to specify ring speed on module insert. */ @@ -3692,8 +3696,6 @@ (unsigned int)dev->base_addr, dev->irq, tp->rom_base, tp->ram_base); - /* AKPM: there's no point in this */ - dev->init = smctr_init_card; dev->open = smctr_open; dev->stop = smctr_close; dev->hard_start_xmit = smctr_send_packet; @@ -5689,33 +5691,31 @@ { int i; - for(i = 0; i < SMCTR_MAX_ADAPTERS; i++) - { + for(i = 0; i < SMCTR_MAX_ADAPTERS; i++) { + struct net_device *dev = alloc_trdev(0); irq[i] = 0; mem[i] = 0; - dev_smctr[i] = NULL; - dev_smctr[i] = init_trdev(dev_smctr[i], 0); - if(dev_smctr[i] == NULL) - return (-ENOMEM); - - dev_smctr[i]->base_addr = io[i]; - dev_smctr[i]->irq = irq[i]; - dev_smctr[i]->mem_start = mem[i]; - dev_smctr[i]->init = &smctr_probe; - - if(register_trdev(dev_smctr[i]) != 0) - { - kfree(dev_smctr[i]); - dev_smctr[i] = NULL; - if(i == 0) - { - printk(KERN_ERR "%s: register_trdev() returned (<0).\n", + if (!dev) + return -ENOMEM; + dev->base_addr = io[i]; + dev->irq = irq[i]; + dev->mem_start = mem[i]; + + if (smctr_probe(dev) != 0) { + kfree(dev); + if (i == 0) { + printk(KERN_ERR "%s: smctr_probe failed.\n", cardname); - return (-EIO); + return -EIO; } - else - return (0); + return 0; } + if (register_netdev(dev) != 0) { + cleanup_card(dev); + kfree(dev); + continue; + } + dev_smctr[i] = dev; } return (0); @@ -5725,26 +5725,13 @@ { int i; - for(i = 0; i < SMCTR_MAX_ADAPTERS; i++) - { - if(dev_smctr[i]) - { -#ifdef CONFIG_MCA - struct net_local *tp - = (struct net_local *)dev_smctr[i]->priv; - if(tp->slot_num) - mca_mark_as_unused(tp->slot_num); -#endif - unregister_trdev(dev_smctr[i]); - release_region(dev_smctr[i]->base_addr, - SMCTR_IO_EXTENT); - if(dev_smctr[i]->irq) - free_irq(dev_smctr[i]->irq, dev_smctr[i]); - if(dev_smctr[i]->priv) - kfree(dev_smctr[i]->priv); - kfree(dev_smctr[i]); - dev_smctr[i] = NULL; - } + for(i = 0; i < SMCTR_MAX_ADAPTERS; i++) { + struct net_device *dev = dev_smctr[i]; + if (dev) { + unregister_netdev(dev); + cleanup_card(dev); + kfree(dev); + } } } #endif /* MODULE */ diff -urN linux-2.5.70-bk8/drivers/net/tokenring/tmspci.c linux-2.5.70-bk9/drivers/net/tokenring/tmspci.c --- linux-2.5.70-bk8/drivers/net/tokenring/tmspci.c 2003-05-26 18:00:56.000000000 -0700 +++ linux-2.5.70-bk9/drivers/net/tokenring/tmspci.c 2003-06-04 04:37:27.000000000 -0700 @@ -112,11 +112,11 @@ pci_ioaddr = pci_resource_start (pdev, 0); /* At this point we have found a valid card. */ - dev = init_trdev(NULL, 0); + dev = alloc_trdev(0); if (!dev) return -ENOMEM; SET_MODULE_OWNER(dev); - + if (!request_region(pci_ioaddr, TMS_PCI_IO_EXTENT, dev->name)) { ret = -EBUSY; goto err_out_trdev; @@ -163,22 +163,22 @@ dev->open = tms380tr_open; dev->stop = tms380tr_close; + pci_set_drvdata(pdev, dev); - ret = register_trdev(dev); + ret = register_netdev(dev); if (ret) goto err_out_tmsdev; - pci_set_drvdata(pdev, dev); return 0; err_out_tmsdev: + pci_set_drvdata(pdev, NULL); tmsdev_term(dev); err_out_irq: free_irq(pdev->irq, dev); err_out_region: release_region(pci_ioaddr, TMS_PCI_IO_EXTENT); err_out_trdev: - unregister_netdev(dev); kfree(dev); return ret; } diff -urN linux-2.5.70-bk8/drivers/s390/net/lcs.c linux-2.5.70-bk9/drivers/s390/net/lcs.c --- linux-2.5.70-bk8/drivers/s390/net/lcs.c 2003-05-26 18:00:24.000000000 -0700 +++ linux-2.5.70-bk9/drivers/s390/net/lcs.c 2003-06-04 04:37:28.000000000 -0700 @@ -1751,30 +1751,29 @@ #ifdef CONFIG_NET_ETHERNET case LCS_FRAME_TYPE_ENET: card->lan_type_trans = eth_type_trans; - dev = init_etherdev(NULL,0); + dev = alloc_etherdev(0); break; #endif #ifdef CONFIG_TR case LCS_FRAME_TYPE_TR: card->lan_type_trans = tr_type_trans; - dev = init_trdev(NULL,0); + dev = alloc_trdev(0); break; #endif #ifdef CONFIG_FDDI case LCS_FRAME_TYPE_FDDI: card->lan_type_trans = fddi_type_trans; - dev = init_fddidev(NULL,0); + dev = alloc_fddidev(0); break; #endif default: LCS_DBF_TEXT(3, setup, "errinit"); PRINT_ERR("LCS: Initialization failed\n"); PRINT_ERR("LCS: No device found!\n"); - lcs_cleanup_channel(&card->read); - lcs_cleanup_channel(&card->write); - lcs_free_card(card); - return -ENODEV; + goto out; } + if (!dev) + goto out; memcpy(dev->dev_addr, card->mac, LCS_MAC_LENGTH); card->dev = dev; dev->priv = card; @@ -1787,9 +1786,16 @@ #endif dev->get_stats = lcs_getstats; SET_MODULE_OWNER(&tun->dev); + if (register_netdev(dev) != 0) + goto out; netif_stop_queue(dev); lcs_stopcard(card); return 0; +out: + lcs_cleanup_channel(&card->read); + lcs_cleanup_channel(&card->write); + lcs_free_card(card); + return -ENODEV; } /** diff -urN linux-2.5.70-bk8/drivers/scsi/NCR_D700.c linux-2.5.70-bk9/drivers/scsi/NCR_D700.c --- linux-2.5.70-bk8/drivers/scsi/NCR_D700.c 2003-06-04 04:37:18.000000000 -0700 +++ linux-2.5.70-bk9/drivers/scsi/NCR_D700.c 2003-06-04 04:37:28.000000000 -0700 @@ -385,7 +385,7 @@ static void __exit NCR_D700_exit(void) { mca_unregister_driver(&NCR_D700_driver); - scsi_sysfs_release_attributes(); + scsi_sysfs_release_attributes(&NCR_D700_driver_template); } module_init(NCR_D700_init); diff -urN linux-2.5.70-bk8/drivers/scsi/arm/ecoscsi.c linux-2.5.70-bk9/drivers/scsi/arm/ecoscsi.c --- linux-2.5.70-bk8/drivers/scsi/arm/ecoscsi.c 2003-06-04 04:37:18.000000000 -0700 +++ linux-2.5.70-bk9/drivers/scsi/arm/ecoscsi.c 2003-06-04 04:37:29.000000000 -0700 @@ -21,26 +21,6 @@ * 1+ (800) 334-5454 */ -/* - * Options : - * - * PARITY - enable parity checking. Not supported. - * - * SCSI2 - enable support for SCSI-II tagged queueing. Untested. - * - * USLEEP - enable support for devices that don't disconnect. Untested. - */ - -/* - * $Log: ecoscsi.c,v $ - * Revision 1.2 1998/03/08 05:49:47 davem - * Merge to 2.1.89 - * - * Revision 1.1 1998/02/23 02:45:24 davem - * Merge to 2.1.88 - * - */ - #include #include #include @@ -94,71 +74,8 @@ * */ -void ecoscsi_setup(char *str, int *ints) { -} - -/* - * Function : int ecoscsi_detect(Scsi_Host_Template * tpnt) - * - * Purpose : initializes ecoscsi NCR5380 driver based on the - * command line / compile time port and irq definitions. - * - * Inputs : tpnt - template for this SCSI adapter. - * - * Returns : 1 if a host adapter was found, 0 if not. - * - */ - -int ecoscsi_detect(Scsi_Host_Template * tpnt) -{ - struct Scsi_Host *host; - - tpnt->proc_name = "ecoscsi"; - - host = scsi_register (tpnt, sizeof(struct NCR5380_hostdata)); - if (!host) - return 0; - - host->io_port = 0x80ce8000; - host->n_io_port = 144; - host->irq = IRQ_NONE; - - if ( !(request_region(host->io_port, host->n_io_port, "ecoscsi")) ) - goto unregister_scsi; - - ecoscsi_write (host, MODE_REG, 0x20); /* Is it really SCSI? */ - if (ecoscsi_read (host, MODE_REG) != 0x20) /* Write to a reg. */ - goto release_reg; - - ecoscsi_write( host, MODE_REG, 0x00 ); /* it back. */ - if (ecoscsi_read (host, MODE_REG) != 0x00) - goto release_reg; - - NCR5380_init(host, 0); - - printk("scsi%d: at port 0x%08lx irqs disabled", host->host_no, host->io_port); - printk(" options CAN_QUEUE=%d CMD_PER_LUN=%d release=%d", - host->can_queue, host->cmd_per_lun, ECOSCSI_PUBLIC_RELEASE); - printk("\nscsi%d:", host->host_no); - NCR5380_print_options(host); - printk("\n"); - - return 1; - -release_reg: - release_region(host->io_port, host->n_io_port); -unregister_scsi: - scsi_unregister(host); - return 0; -} - -int ecoscsi_release (struct Scsi_Host *shpnt) +void ecoscsi_setup(char *str, int *ints) { - if (shpnt->irq != IRQ_NONE) - free_irq (shpnt->irq, NULL); - if (shpnt->io_port) - release_region (shpnt->io_port, shpnt->n_io_port); - return 0; } const char * ecoscsi_info (struct Scsi_Host *spnt) @@ -241,8 +158,7 @@ static Scsi_Host_Template ecoscsi_template = { .module = THIS_MODULE, .name = "Serial Port EcoSCSI NCR5380", - .detect = ecoscsi_detect, - .release = ecoscsi_release, + .proc_name = "ecoscsi", .info = ecoscsi_info, .queuecommand = ecoscsi_queue_command, .eh_abort_handler = NCR5380_abort, @@ -256,19 +172,60 @@ .use_clustering = DISABLE_CLUSTERING }; +static struct Scsi_Host *host; + static int __init ecoscsi_init(void) { - scsi_register_host(&ecoscsi_template); - if (ecoscsi_template.present) + + host = scsi_register(tpnt, sizeof(struct NCR5380_hostdata)); + if (!host) return 0; - scsi_unregister_host(&ecoscsi_template); + host->io_port = 0x80ce8000; + host->n_io_port = 144; + host->irq = IRQ_NONE; + + if (!(request_region(host->io_port, host->n_io_port, "ecoscsi")) ) + goto unregister_scsi; + + ecoscsi_write(host, MODE_REG, 0x20); /* Is it really SCSI? */ + if (ecoscsi_read(host, MODE_REG) != 0x20) /* Write to a reg. */ + goto release_reg; + + ecoscsi_write(host, MODE_REG, 0x00 ); /* it back. */ + if (ecoscsi_read(host, MODE_REG) != 0x00) + goto release_reg; + + NCR5380_init(host, 0); + + printk("scsi%d: at port 0x%08lx irqs disabled", host->host_no, host->io_port); + printk(" options CAN_QUEUE=%d CMD_PER_LUN=%d release=%d", + host->can_queue, host->cmd_per_lun, ECOSCSI_PUBLIC_RELEASE); + printk("\nscsi%d:", host->host_no); + NCR5380_print_options(host); + printk("\n"); + + scsi_add_host(host, NULL); + return 0; + +release_reg: + release_region(host->io_port, host->n_io_port); +unregister_scsi: + scsi_unregister(host); return -ENODEV; } static void __exit ecoscsi_exit(void) { - scsi_unregister_host(&ecoscsi_template); + scsi_remove_host(host); + + if (shpnt->irq != IRQ_NONE) + free_irq(shpnt->irq, NULL); + if (shpnt->io_port) + release_region(shpnt->io_port, shpnt->n_io_port); + + scsi_unregister(host); + return 0; } module_init(ecoscsi_init); diff -urN linux-2.5.70-bk8/drivers/scsi/dc395x.c linux-2.5.70-bk9/drivers/scsi/dc395x.c --- linux-2.5.70-bk8/drivers/scsi/dc395x.c 2003-06-04 04:37:18.000000000 -0700 +++ linux-2.5.70-bk9/drivers/scsi/dc395x.c 2003-06-04 04:37:30.000000000 -0700 @@ -46,8 +46,8 @@ * ************************************************************************ */ - #include +#include #include #include #include @@ -60,109 +60,147 @@ #include #include -/* Debugging */ -/*#define DC395x_DEBUG_KG */ -/*#define DC395x_DEBUG0*/ -/*#define DC395x_DEBUG1*/ -/*#define DC395x_DEBUGDCB*/ -#define DC395x_DEBUGTRACE -/*#define DC395x_DEBUGTRACEALL*/ -/*#define DC395x_DEBUGPARSE*/ -/*#define DC395x_SGPARANOIA*/ -/*#define DC395x_DEBUGFIFO*/ -/*#define DC395x_DEBUGRECURSION*/ -/*#define DC395x_DEBUGPIO*/ -/*#define DC395x_DEBUGMALLOC*/ - -/* DISable features */ +/*--------------------------------------------------------------------------- + Features + ---------------------------------------------------------------------------*/ +/* + * Set to disable parts of the driver + */ /*#define DC395x_NO_DISCONNECT*/ /*#define DC395x_NO_TAGQ*/ /*#define DC395x_NO_SYNC*/ /*#define DC395x_NO_WIDE*/ -#ifdef DC395x_DEBUG0 -# define DEBUG0(x) x -#else -# define DEBUG0(x) -#endif +/*--------------------------------------------------------------------------- + Debugging + ---------------------------------------------------------------------------*/ +/* + * Types of debugging that can be enabled and disabled + */ +#define DBG_KG 0x0001 +#define DBG_0 0x0002 +#define DBG_1 0x0004 +#define DBG_DCB 0x0008 +#define DBG_PARSE 0x0010 /* debug command line parsing */ +#define DBG_SGPARANOIA 0x0020 +#define DBG_FIFO 0x0040 +#define DBG_PIO 0x0080 +#define DBG_RECURSION 0x0100 /* check for excessive recursion */ +#define DBG_MALLOC 0x0200 /* report on memory allocations */ +#define DBG_TRACE 0x0400 +#define DBG_TRACEALL 0x0800 -#ifdef DC395x_DEBUG1 -# define DEBUG1(x) x -#else -# define DEBUG1(x) -#endif -#ifdef DC395x_DEBUGDCB -# define DCBDEBUG(x) x -#else -# define DCBDEBUG(x) -#endif +/* + * Set set of things to output debugging for. + * Undefine to remove all debugging + */ +/*#define DEBUG_MASK (DBG_0|DBG_1|DBG_DCB|DBG_PARSE|DBG_SGPARANOIA|DBG_FIFO|DBG_PIO|DBG_TRACE|DBG_TRACEALL)*/ +/*#define DEBUG_MASK DBG_0*/ + + +/* + * Output a kernel mesage at the specified level and append the + * driver name and a ": " to the start of the message + */ +#define dprintkl(level, format, arg...) \ + printk(level DC395X_NAME ": " format , ## arg) + + +#ifdef DEBUG_MASK +/* + * print a debug message - this is formated with KERN_DEBUG, then the + * driver name followed by a ": " and then the message is output. + * This also checks that the specified debug level is enabled before + * outputing the message + */ +#define dprintkdbg(type, format, arg...) \ + do { \ + if ((type) & (DEBUG_MASK)) \ + dprintkl(KERN_DEBUG , format , ## arg); \ + } while (0) + +/* + * Check if the specified type of debugging is enabled + */ +#define debug_enabled(type) ((DEBUG_MASK) & (type)) -#ifdef DC395x_DEBUGPARSE -# define PARSEDEBUG(x) x #else -# define PARSEDEBUG(x) +/* + * No debugging. Do nothing + */ +#define dprintkdbg(type, format, arg...) \ + do {} while (0) +#define debug_enabled(type) (0) + #endif -#ifdef DC395x_DEBUGRECURSION -# define DEBUGRECURSION(x) x -#else -# define DEBUGRECURSION(x) + +/* + * The recursion debugging just counts entries into the driver and + * prints out a messge if it exceeds a certain limit. This variable + * hold the count. + */ +#if debug_enabled(DBG_RECURSION) +static int dbg_in_driver = 0; #endif -#ifdef DC395x_DEBUGPIO -# define DEBUGPIO(x) x + +/* + * Memory allocation debugging + * Just reports when memory is allocated and/or released. + */ +#if debug_enabled(DBG_MALLOC) +inline void *dc395x_kmalloc(size_t sz, int fl) +{ + void *ptr = kmalloc(sz, fl); + dprintkl(KERN_DEBUG, "Alloc %i bytes @ %p w/ fl %08x\n", sz, ptr, fl); + return ptr; +} +inline void dc395x_kfree(const void *adr) +{ + dprintkl(KERN_DEBUG, "Free mem @ %p\n", adr); + kfree(adr); +} #else -# define DEBUGPIO(x) +#define dc395x_kmalloc(sz, fl) kmalloc(sz, fl) +#define dc395x_kfree(adr) kfree(adr) #endif -/* Here comes the joker of all debugging facilities! */ -#ifdef DC395x_DEBUGTRACEALL -# ifndef DC395x_DEBUGTRACE -# define DC395x_DEBUGTRACE -# endif + +/* + * Debug/trace stuff + */ +#if debug_enabled(DBG_TRACEALL) # define TRACEOUTALL(x...) printk ( x) #else # define TRACEOUTALL(x...) do {} while (0) #endif -#ifdef DC395x_DEBUGTRACE + +#if debug_enabled(DBG_TRACE|DBG_TRACEALL) # define DEBUGTRACEBUFSZ 512 char DC395x_tracebuf[64]; char DC395x_traceoverflow[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; # define TRACEPRINTF(x...) \ -do { int ln = sprintf (DC395x_tracebuf, x); \ - if (pSRB->debugpos + ln >= DEBUGTRACEBUFSZ) \ - { pSRB->debugtrace[pSRB->debugpos] = 0; pSRB->debugpos = DEBUGTRACEBUFSZ/5; pSRB->debugtrace[pSRB->debugpos++] = '>'; }; \ - sprintf (pSRB->debugtrace + pSRB->debugpos, "%s", DC395x_tracebuf); \ - pSRB->debugpos += ln - 1; \ - } while (0) -# define TRACEOUT(x...) printk ( x) + do { \ + int ln = sprintf(DC395x_tracebuf, x); \ + if (pSRB->debugpos + ln >= DEBUGTRACEBUFSZ) { \ + pSRB->debugtrace[pSRB->debugpos] = 0; \ + pSRB->debugpos = DEBUGTRACEBUFSZ/5; \ + pSRB->debugtrace[pSRB->debugpos++] = '>'; \ + } \ + sprintf(pSRB->debugtrace + pSRB->debugpos, "%s", DC395x_tracebuf); \ + pSRB->debugpos += ln - 1; \ + } while (0) +# define TRACEOUT(x...) printk (x) #else # define TRACEPRINTF(x...) do {} while (0) # define TRACEOUT(x...) do {} while (0) #endif -#ifdef DC395x_DEBUGMALLOC -inline void *dc395x_kmalloc(size_t sz, int fl) -{ - void *ptr = kmalloc(sz, fl); - printk(KERN_DEBUG DC395X_NAME ": Alloc %i bytes @ %p w/ fl %08x\n", - sz, ptr, fl); - return ptr; -} -inline void dc395x_kfree(const void *adr) -{ - printk(KERN_DEBUG DC395X_NAME ": Free mem @ %p\n", adr); - kfree(adr); -} - -# define KMALLOC(sz,fl) dc395x_kmalloc(sz,fl) -# define KFREE(adr) dc395x_kfree(adr) -#else -# define KMALLOC(sz,fl) kmalloc(sz,fl) -# define KFREE(adr) kfree(adr) -#endif +/*--------------------------------------------------------------------------- + ---------------------------------------------------------------------------*/ #ifndef PCI_VENDOR_ID_TEKRAM @@ -172,16 +210,6 @@ #define PCI_DEVICE_ID_TEKRAM_TRMS1040 0x0391 /* Device ID */ #endif -static struct pci_device_id dc395x_pci_tbl[] __devinitdata = { - { - .vendor = PCI_VENDOR_ID_TEKRAM, - .device = PCI_DEVICE_ID_TEKRAM_TRMS1040, - .subvendor = PCI_ANY_ID, - .subdevice = PCI_ANY_ID, - }, - {} /* Terminating entry */ -}; -MODULE_DEVICE_TABLE(pci, dc395x_pci_tbl); #define DC395x_LOCK_IO(dev) spin_lock_irqsave(((struct Scsi_Host *)dev)->host_lock, flags) @@ -284,7 +312,7 @@ u8 padding; u16 debugpos; /* Offset 0x58/0x40 */ -#ifdef DC395x_DEBUGTRACE +#if debug_enabled(DBG_TRACE|DBG_TRACEALL) char *debugtrace; /* Offset 0x60/0x44 */ #endif @@ -509,7 +537,6 @@ struct DeviceCtlBlk *pDCB); void DC395x_initDCB(struct AdapterCtlBlk *pACB, struct DeviceCtlBlk **ppDCB, u8 target, u8 lun); -int DC395x_shutdown(struct Scsi_Host *host); static void DC395x_remove_dev(struct AdapterCtlBlk *pACB, struct DeviceCtlBlk *pDCB); @@ -519,8 +546,6 @@ static u16 DC395x_adapterCnt = 0; static u16 DC395x_CurrSyncOffset = 0; -DEBUGRECURSION(static char in_driver = 0; - ) static char DC395x_monitor_next_IRQ = 0; /* @@ -578,119 +603,203 @@ static u16 dc395x_clock_speed[] = { 200, 133, 100, 80, 67, 58, 50, 40 }; /* real period:48ns,72ns,100ns,124ns,148ns,172ns,200ns,248ns */ + + +/*--------------------------------------------------------------------------- + Configuration + ---------------------------------------------------------------------------*/ + /* - * Override defaults on cmdline: - * dc395x_trm = AdaptID, MaxSpeed (Index), DevMode (Bitmapped), AdaptMode (Bitmapped), Tags (log2-1), DelayReset + * Command line parameters are stored in a structure below. + * These are the index's into the strcuture for the various + * command line options. */ -int dc395x_trm[] = { -2, -2, -2, -2, -2, -2 }; +#define CFG_ADAPTER_ID 0 +#define CFG_MAX_SPEED 1 +#define CFG_DEV_MODE 2 +#define CFG_ADAPTER_MODE 3 +#define CFG_TAGS 4 +#define CFG_RESET_DELAY 5 + +#define CFG_NUM 6 /* number of configuration items */ -#if defined(MODULE) -MODULE_PARM(dc395x_trm, "1-6i"); -MODULE_PARM_DESC(dc395x_trm, - "Host SCSI ID, Speed (0=20MHz), Device Flags, Adapter Flags, Max Tags (log2(tags)-1), DelayReset (s)"); + +/* + * Value used to indicate that a command line override + * hasn't been used to modify the value. + */ +#define CFG_PARAM_UNSET -1 + + +/* + * Hold command line parameters. + */ +struct dc395x_config_data { + int value; /* value of this setting */ + int min; /* minimum value */ + int max; /* maximum value */ + int def; /* default value */ + int safe; /* safe value */ +}; +struct dc395x_config_data __initdata cfg_data[] = { + { /* adapter id */ + CFG_PARAM_UNSET, + 0, + 15, + 7, + 7 + }, + { /* max speed */ + CFG_PARAM_UNSET, + 0, + 7, + 1, /* 13.3Mhz */ + 4, /* 6.7Hmz */ + }, + { /* dev mode */ + CFG_PARAM_UNSET, + 0, + 0x3f, + NTC_DO_PARITY_CHK | NTC_DO_DISCONNECT | NTC_DO_SYNC_NEGO | + NTC_DO_WIDE_NEGO | NTC_DO_TAG_QUEUEING | + NTC_DO_SEND_START, + NTC_DO_PARITY_CHK | NTC_DO_SEND_START + }, + { /* adapter mode */ + CFG_PARAM_UNSET, + 0, + 0x2f, +#ifdef CONFIG_SCSI_MULTI_LUN + NAC_SCANLUN | #endif + NAC_GT2DRIVES | NAC_GREATER_1G | NAC_POWERON_SCSI_RESET + /*| NAC_ACTIVE_NEG*/, + NAC_GT2DRIVES | NAC_GREATER_1G | NAC_POWERON_SCSI_RESET | 0x08 + }, + { /* tags */ + CFG_PARAM_UNSET, + 0, + 5, + 3, /* 16 tags (??) */ + 2, + }, + { /* reset delay */ + CFG_PARAM_UNSET, + 0, + 180, + 1, /* 1 second */ + 10, /* 10 seconds */ + } +}; -MODULE_AUTHOR("C.L. Huang / Erich Chen / Kurt Garloff"); -MODULE_DESCRIPTION - ("SCSI host adapter driver for Tekram TRM-S1040 based adapters: Tekram DC395 and DC315 series"); -MODULE_SUPPORTED_DEVICE("sd,sr,sg,st"); -MODULE_LICENSE("GPL"); +/* + * Safe settings. If set to zero the the BIOS/default values with command line + * overrides will be used. If set to 1 then safe and slow settings will be used. + */ +static int dc395x_safe = 0; +module_param_named(safe, dc395x_safe, bool, 0); +MODULE_PARM_DESC(safe, "Use safe and slow settings only. Default: false"); -/* Delaying after a reset */ -static char __initdata DC395x_interpd[] = { 1, 3, 5, 10, 16, 30, 60, 120 }; -/* Convert EEprom value to seconds */ -static void __init DC395x_interpret_delay(struct NvRamType *eeprom) -{ - /*printk (DC395X_NAME ": Debug: Delay: %i\n", eeprom->NvramDelayTime); */ - eeprom->NvramDelayTime = DC395x_interpd[eeprom->NvramDelayTime]; -} +module_param_named(adapter_id, cfg_data[CFG_ADAPTER_ID].value, int, 0); +MODULE_PARM_DESC(adapter_id, "Adapter SCSI ID. Default 7 (0-15)"); + +module_param_named(max_speed, cfg_data[CFG_MAX_SPEED].value, int, 0); +MODULE_PARM_DESC(max_speed, "Maximum bus speed. Default 1 (0-7) Speeds: 0=20, 1=13.3, 2=10, 3=8, 4=6.7, 5=5.8, 6=5, 7=4 Mhz"); + +module_param_named(dev_mode, cfg_data[CFG_DEV_MODE].value, int, 0); +MODULE_PARM_DESC(dev_mode, "Device mode."); -/* seconds to EEProm value */ -static int __init DC395x_uninterpret_delay(int delay) +module_param_named(adapter_mode, cfg_data[CFG_ADAPTER_MODE].value, int, 0); +MODULE_PARM_DESC(adapter_mode, "Adapter mode."); + +module_param_named(tags, cfg_data[CFG_TAGS].value, int, 0); +MODULE_PARM_DESC(tags, "Number of tags (1< 15) { /* modules-2.0.0 passes -1 as string */ - dc395x_trm[0] = 7; - dc395x_trm[1] = 4; - dc395x_trm[2] = 0x09; - dc395x_trm[3] = 0x0f; - dc395x_trm[4] = 2; - dc395x_trm[5] = 10; - printk(KERN_INFO DC395X_NAME ": Using safe settings.\n"); + int i; + + dprintkdbg(DBG_PARSE, "setup %08x %08x %08x %08x %08x %08x\n", + cfg_data[CFG_ADAPTER_ID].value, + cfg_data[CFG_MAX_SPEED].value, + cfg_data[CFG_DEV_MODE].value, + cfg_data[CFG_ADAPTER_MODE].value, + cfg_data[CFG_TAGS].value, + cfg_data[CFG_RESET_DELAY].value); + for (i = 0; i < CFG_NUM; i++) + { + if (cfg_data[i].value < cfg_data[i].min || + cfg_data[i].value > cfg_data[i].max) + { + cfg_data[i].value = cfg_data[i].def; + } } } -/* Defaults, to be overriden by (a) BIOS and (b) Cmnd line (kernel/module) args */ -int __initdata dc395x_def[] = { 7, 1 /* 13.3MHz */ , - NTC_DO_PARITY_CHK | NTC_DO_DISCONNECT | NTC_DO_SYNC_NEGO | - NTC_DO_WIDE_NEGO | NTC_DO_TAG_QUEUEING | NTC_DO_SEND_START, - NAC_GT2DRIVES | NAC_GREATER_1G | NAC_POWERON_SCSI_RESET - /* | NAC_ACTIVE_NEG */ -#ifdef CONFIG_SCSI_MULTI_LUN - | NAC_SCANLUN -#endif - , 3 /* 16 Tags per LUN */ , 1 /* s delay after Reset */ -}; -/* Copy defaults over set values where missing */ -static void __init DC395x_fill_with_defaults(void) + +/* + * Mapping from the eeprom value (index into this array) to the + * the number of actual seconds that the delay should be for. + */ +static +char __initdata eeprom_index_to_delay_map[] = { 1, 3, 5, 10, 16, 30, 60, 120 }; + + +/** + * eeprom_index_to_delay - Take the eeprom delay setting and convert it + * into a number of seconds. + */ +static void __init eeprom_index_to_delay(struct NvRamType *eeprom) { - int i; - PARSEDEBUG(printk - (KERN_INFO DC395X_NAME - ": setup %08x %08x %08x %08x %08x %08x\n", - dc395x_trm[0], dc395x_trm[1], dc395x_trm[2], - dc395x_trm[3], dc395x_trm[4], dc395x_trm[5]); - ) - for (i = 0; i < 6; i++) { - if (dc395x_trm[i] < 0 || dc395x_trm[i] > 255) - dc395x_trm[i] = dc395x_def[i]; - } - /* Sanity checks */ - if (dc395x_trm[0] > 15) - dc395x_trm[0] = 7; - if (dc395x_trm[1] > 7) - dc395x_trm[1] = 4; - if (dc395x_trm[4] > 5) - dc395x_trm[4] = 4; - if (dc395x_trm[5] > 180) - dc395x_trm[5] = 180; + eeprom->NvramDelayTime = eeprom_index_to_delay_map[eeprom->NvramDelayTime]; } -/* Read the parameters from the command line */ -#if !defined(MODULE) -static int DC395x_trm_setup(char *str) +/** + * delay_to_eeprom_index - Take a delay in seconds and return the closest + * eeprom index which will delay for at least that amount of seconds. + */ +static int __init delay_to_eeprom_index(int delay) { - int i; - int im; - int ints[8]; - (void) get_options(str, ARRAY_SIZE(ints), ints); - im = ints[0]; - if (im > 6) { - printk(KERN_NOTICE DC395X_NAME ": ignore extra params!\n"); - im = 6; + u8 idx = 0; + while (idx < 7 && eeprom_index_to_delay_map[idx] < delay) { + idx++; } - for (i = 0; i < im; i++) - dc395x_trm[i] = ints[i + 1]; - - return 1; + return idx; } -__setup(DC395X_NAME "=", DC395x_trm_setup); - -#endif /* !MODULE */ /* Overrride BIOS values with the set ones */ static void __init DC395x_EEprom_Override(struct NvRamType *eeprom) @@ -698,21 +807,32 @@ u8 id; /* Adapter Settings */ - if (dc395x_trm[0] != -2) - eeprom->NvramScsiId = (u8) dc395x_trm[0]; /* Adapter ID */ - if (dc395x_trm[3] != -2) - eeprom->NvramChannelCfg = (u8) dc395x_trm[3]; - if (dc395x_trm[5] != -2) - eeprom->NvramDelayTime = DC395x_uninterpret_delay(dc395x_trm[5]); /* Reset delay */ - if (dc395x_trm[4] != -2) - eeprom->NvramMaxTag = (u8) dc395x_trm[4]; /* Tagged Cmds */ + if (cfg_data[CFG_ADAPTER_ID].value != CFG_PARAM_UNSET) { + eeprom->NvramScsiId = + (u8)cfg_data[CFG_ADAPTER_ID].value; + } + if (cfg_data[CFG_ADAPTER_MODE].value != CFG_PARAM_UNSET) { + eeprom->NvramChannelCfg = + (u8)cfg_data[CFG_ADAPTER_MODE].value; + } + if (cfg_data[CFG_RESET_DELAY].value != CFG_PARAM_UNSET) { + eeprom->NvramDelayTime = + delay_to_eeprom_index(cfg_data[CFG_RESET_DELAY].value); + } + if (cfg_data[CFG_TAGS].value != CFG_PARAM_UNSET) { + eeprom->NvramMaxTag = (u8)cfg_data[CFG_TAGS].value; + } /* Device Settings */ for (id = 0; id < DC395x_MAX_SCSI_ID; id++) { - if (dc395x_trm[2] != -2) - eeprom->NvramTarget[id].NvmTarCfg0 = (u8) dc395x_trm[2]; /* Cfg0 */ - if (dc395x_trm[1] != -2) - eeprom->NvramTarget[id].NvmTarPeriod = (u8) dc395x_trm[1]; /* Speed */ + if (cfg_data[CFG_DEV_MODE].value != CFG_PARAM_UNSET) { + eeprom->NvramTarget[id].NvmTarCfg0 = + (u8)cfg_data[CFG_DEV_MODE].value; + } + if (cfg_data[CFG_MAX_SPEED].value != CFG_PARAM_UNSET) { + eeprom->NvramTarget[id].NvmTarPeriod = + (u8)cfg_data[CFG_MAX_SPEED].value; + } } } @@ -763,10 +883,9 @@ static void DC395x_Query_append(Scsi_Cmnd * cmd, struct AdapterCtlBlk *pACB) { - DEBUG0(printk(DC395X_NAME ": Append cmd %li to Query\n", cmd->pid); - ) + dprintkdbg(DBG_0, "Append cmd %li to Query\n", cmd->pid); - cmd->host_scribble = NULL; + cmd->host_scribble = NULL; if (!pACB->QueryCnt) pACB->pQueryHead = cmd; @@ -787,9 +906,8 @@ pcmd = pACB->pQueryHead; if (!pcmd) return pcmd; - DEBUG0(printk(DC395X_NAME ": Get cmd %li from Query\n", pcmd->pid); - ) - pACB->pQueryHead = (void *) pcmd->host_scribble; + dprintkdbg(DBG_0, "Get cmd %li from Query\n", pcmd->pid); + pACB->pQueryHead = (void *) pcmd->host_scribble; pcmd->host_scribble = NULL; if (!pACB->pQueryHead) pACB->pQueryTail = NULL; @@ -807,7 +925,7 @@ /*DC395x_Free_integrity (pACB); */ pSRB = pACB->pFreeSRB; if (!pSRB) - printk(DC395X_NAME ": Out of Free SRBs :-(\n"); + dprintkl(KERN_ERR, "Out of Free SRBs :-(\n"); if (pSRB) { pACB->pFreeSRB = pSRB->pNextSRB; pSRB->pNextSRB = NULL; @@ -821,9 +939,8 @@ static __inline__ void DC395x_Free_insert(struct AdapterCtlBlk *pACB, struct ScsiReqBlk *pSRB) { - DEBUG0(printk(DC395X_NAME ": Free SRB %p\n", pSRB); - ) - pSRB->pNextSRB = pACB->pFreeSRB; + dprintkdbg(DBG_0, "Free SRB %p\n", pSRB); + pSRB->pNextSRB = pACB->pFreeSRB; pACB->pFreeSRB = pSRB; } @@ -832,11 +949,8 @@ static __inline__ void DC395x_Waiting_insert(struct DeviceCtlBlk *pDCB, struct ScsiReqBlk *pSRB) { - DEBUG0(printk - (DC395X_NAME ": Insert pSRB %p cmd %li to Waiting\n", pSRB, - pSRB->pcmd->pid); - ) - pSRB->pNextSRB = pDCB->pWaitingSRB; + dprintkdbg(DBG_0, "Insert pSRB %p cmd %li to Waiting\n", pSRB, pSRB->pcmd->pid); + pSRB->pNextSRB = pDCB->pWaitingSRB; if (!pDCB->pWaitingSRB) pDCB->pWaitLast = pSRB; pDCB->pWaitingSRB = pSRB; @@ -848,11 +962,8 @@ static __inline__ void DC395x_Waiting_append(struct DeviceCtlBlk *pDCB, struct ScsiReqBlk *pSRB) { - DEBUG0(printk - (DC395X_NAME ": Append pSRB %p cmd %li to Waiting\n", pSRB, - pSRB->pcmd->pid); - ) - if (pDCB->pWaitingSRB) + dprintkdbg(DBG_0, "Append pSRB %p cmd %li to Waiting\n", pSRB, pSRB->pcmd->pid); + if (pDCB->pWaitingSRB) pDCB->pWaitLast->pNextSRB = pSRB; else pDCB->pWaitingSRB = pSRB; @@ -868,10 +979,9 @@ static __inline__ void DC395x_Going_append(struct DeviceCtlBlk *pDCB, struct ScsiReqBlk *pSRB) { - DEBUG0(printk(DC395X_NAME ": Append SRB %p to Going\n", pSRB); - ) - /* Append to the list of Going commands */ - if (pDCB->pGoingSRB) + dprintkdbg(DBG_0, "Append SRB %p to Going\n", pSRB); + /* Append to the list of Going commands */ + if (pDCB->pGoingSRB) pDCB->pGoingLast->pNextSRB = pSRB; else pDCB->pGoingSRB = pSRB; @@ -908,8 +1018,7 @@ if (pre->pNextSRB != pSRB) pre = DC395x_find_SRBpre(pSRB, pre); if (!pre) { - printk(DC395X_NAME - ": Internal ERROR: SRB to rmv not found in Q!\n"); + dprintkl(KERN_ERR, "Internal ERROR: SRB to rmv not found in Q!\n"); return 0; } pre->pNextSRB = pSRB->pNextSRB; @@ -924,10 +1033,9 @@ struct ScsiReqBlk *hint) { struct ScsiReqBlk *pre = 0; - DEBUG0(printk(DC395X_NAME ": Remove SRB %p from Going\n", pSRB); - ) - if (!pSRB) - printk(DC395X_NAME ": Going_remove %p!\n", pSRB); + dprintkdbg(DBG_0, "Remove SRB %p from Going\n", pSRB); + if (!pSRB) + dprintkl(KERN_ERR, "Going_remove %p!\n", pSRB); if (pSRB == pDCB->pGoingSRB) pDCB->pGoingSRB = pSRB->pNextSRB; else if (hint && hint->pNextSRB == pSRB) @@ -946,10 +1054,9 @@ struct ScsiReqBlk *hint) { struct ScsiReqBlk *pre = 0; - DEBUG0(printk(DC395X_NAME ": Remove SRB %p from Waiting\n", pSRB); - ) - if (!pSRB) - printk(DC395X_NAME ": Waiting_remove %p!\n", pSRB); + dprintkdbg(DBG_0, "Remove SRB %p from Waiting\n", pSRB); + if (!pSRB) + dprintkl(KERN_ERR, "Waiting_remove %p!\n", pSRB); if (pSRB == pDCB->pWaitingSRB) pDCB->pWaitingSRB = pSRB->pNextSRB; else if (hint && hint->pNextSRB == pSRB) @@ -966,13 +1073,9 @@ static void DC395x_Going_to_Waiting(struct DeviceCtlBlk *pDCB, struct ScsiReqBlk *pSRB) { - DEBUG0(printk - (KERN_INFO DC395X_NAME - ": Going_to_Waiting (SRB %p) pid = %li\n", pSRB, - pSRB->pcmd->pid); - ) - /* Remove SRB from Going */ - DC395x_Going_remove(pDCB, pSRB, 0); + dprintkdbg(DBG_0, "Going_to_Waiting (SRB %p) pid = %li\n", pSRB, pSRB->pcmd->pid); + /* Remove SRB from Going */ + DC395x_Going_remove(pDCB, pSRB, 0); TRACEPRINTF("GtW *"); /* Insert on top of Waiting */ DC395x_Waiting_insert(pDCB, pSRB); @@ -985,11 +1088,8 @@ DC395x_Waiting_to_Going(struct DeviceCtlBlk *pDCB, struct ScsiReqBlk *pSRB) { /* Remove from waiting list */ - DEBUG0(printk - (DC395X_NAME ": Remove SRB %p from head of Waiting\n", - pSRB); - ) - DC395x_Waiting_remove(pDCB, pSRB, 0); + dprintkdbg(DBG_0, "Remove SRB %p from head of Waiting\n", pSRB); + DC395x_Waiting_remove(pDCB, pSRB, 0); TRACEPRINTF("WtG *"); DC395x_Going_append(pDCB, pSRB); } @@ -1059,9 +1159,7 @@ { unsigned long flags; struct AdapterCtlBlk *pACB = (struct AdapterCtlBlk *) ptr; -#ifdef DC395x_DEBUG_KG - printk(DC395X_NAME ": Debug: Waiting queue woken up by timer.\n"); -#endif + dprintkdbg(DBG_KG, "Debug: Waiting queue woken up by timer.\n"); DC395x_LOCK_IO(pACB->pScsiHost); DC395x_Waiting_process(pACB); DC395x_UNLOCK_IO(pACB->pScsiHost); @@ -1138,9 +1236,7 @@ u32 request_size; int dir; -#ifdef DC395x_DEBUG0 - printk(KERN_INFO DC395X_NAME ": DC395x_BuildSRB..............\n "); -#endif + dprintkdbg(DBG_0, "DC395x_BuildSRB..............\n"); /*memset (pSRB, 0, sizeof (struct ScsiReqBlk)); */ pSRB->pSRBDCB = pDCB; pSRB->pcmd = pcmd; @@ -1157,15 +1253,13 @@ pcmd->use_sg, dir); sgp = pSRB->SegmentX; request_size = pcmd->request_bufflen; -#ifdef DC395x_SGPARANOIA - printk(KERN_INFO DC395X_NAME - ": BuildSRB: Bufflen = %d, buffer = %p, use_sg = %d\n", + dprintkdbg(DBG_SGPARANOIA, + "BuildSRB: Bufflen = %d, buffer = %p, use_sg = %d\n", pcmd->request_bufflen, pcmd->request_buffer, pcmd->use_sg); - printk(KERN_INFO DC395X_NAME - ": Mapped %i Segments to %i\n", pcmd->use_sg, + dprintkdbg(DBG_SGPARANOIA, + "Mapped %i Segments to %i\n", pcmd->use_sg, pSRB->SRBSGCount); -#endif sl = (struct scatterlist *) pcmd->request_buffer; pSRB->virt_addr = page_address(sl->page); @@ -1175,18 +1269,16 @@ sgp[i].address = busaddr; sgp[i].length = seglen; len += seglen; -#ifdef DC395x_SGPARANOIA - printk(KERN_INFO DC395X_NAME - ": Setting up sgp %d, address = 0x%08x, length = %d, tot len = %d\n", + dprintkdbg(DBG_SGPARANOIA, + "Setting up sgp %d, address = 0x%08x, length = %d, tot len = %d\n", i, busaddr, seglen, len); -#endif } sgp += max - 1; /* Fixup for last buffer too big as it is allocated on even page boundaries */ if (len > request_size) { -#if defined(DC395x_DEBUG_KG) || defined (DC395x_SGPARANOIA) - printk(KERN_INFO DC395X_NAME - ": Fixup SG total length: %d->%d, last seg %d->%d\n", +#if debug_enabled(DBG_KG) || debug_enabled(DBG_SGPARANOIA) + dprintkdbg(DBG_KG|DBG_SGPARANOIA, + "Fixup SG total length: %d->%d, last seg %d->%d\n", len, request_size, sgp->length, sgp->length - (len - request_size)); #endif @@ -1205,13 +1297,11 @@ sizeof(struct SGentry) * DC395x_MAX_SG_LISTENTRY, PCI_DMA_TODEVICE); -#ifdef DC395x_SGPARANOIA - printk(DC395X_NAME - ": Map SG descriptor list %p (%05x) to %08x\n", + dprintkdbg(DBG_SGPARANOIA, + "Map SG descriptor list %p (%05x) to %08x\n", pSRB->SegmentX, sizeof(struct SGentry) * DC395x_MAX_SG_LISTENTRY, pSRB->SRBSGBusAddr); -#endif } else { if (pcmd->request_buffer && dir != PCI_DMA_NONE) { u32 len = pcmd->request_bufflen; /* Actual request size */ @@ -1226,23 +1316,19 @@ pSRB->SRBTotalXferLength = len; pSRB->virt_addr = pcmd->request_buffer; pSRB->SRBSGBusAddr = 0; -#ifdef DC395x_SGPARANOIA - printk(KERN_INFO DC395X_NAME - ": BuildSRB: len = %d, buffer = %p, use_sg = %d, map %08x\n", + dprintkdbg(DBG_SGPARANOIA, + "BuildSRB: len = %d, buffer = %p, use_sg = %d, map %08x\n", len, pcmd->request_buffer, pcmd->use_sg, pSRB->SegmentX[0].address); -#endif } else { pSRB->SRBSGCount = 0; pSRB->SRBTotalXferLength = 0; pSRB->SRBSGBusAddr = 0; pSRB->virt_addr = 0; -#ifdef DC395x_SGPARANOIA - printk(KERN_INFO DC395X_NAME - ": BuildSRB: buflen = %d, buffer = %p, use_sg = %d, NOMAP %08x\n", + dprintkdbg(DBG_SGPARANOIA, + "BuildSRB: buflen = %d, buffer = %p, use_sg = %d, NOMAP %08x\n", pcmd->bufflen, pcmd->request_buffer, pcmd->use_sg, pSRB->SegmentX[0].address); -#endif } } @@ -1255,16 +1341,15 @@ pSRB->SRBState = 0; pSRB->RetryCnt = 0; -#if DC395x_SGPARANOIA - if ((unsigned long) pSRB->debugtrace & (DEBUGTRACEBUFSZ - 1)) { - printk(DC395X_NAME - ": SRB %i (%p): debugtrace %p corrupt!\n", - (pSRB - - pDCB->pDCBACB->SRB_array) / +#if debug_enabled(DBG_TRACE|DBG_TRACEALL) && debug_enabled(DBG_SGPARANOIA) + if ((unsigned long)pSRB->debugtrace & (DEBUGTRACEBUFSZ - 1)) { + dprintkdbg(DBG_SGPARANOIA, + "SRB %i (%p): debugtrace %p corrupt!\n", + (pSRB - pDCB->pDCBACB->SRB_array) / sizeof(struct ScsiReqBlk), pSRB, pSRB->debugtrace); } #endif -#ifdef DC395x_TRACEDEBUG +#if debug_enabled(DBG_TRACE|DBG_TRACEALL) pSRB->debugpos = 0; pSRB->debugtrace = 0; #endif @@ -1303,8 +1388,7 @@ pcmd->device->lun); if (!pDCB) { DC395x_Free_insert(pACB, pSRB); - printk(KERN_ERR DC395X_NAME - ": Command in queue to non-existing device!\n"); + dprintkl(KERN_ERR, "Command in queue to non-existing device!\n"); pcmd->result = MK_RES(DRIVER_ERROR, DID_ERROR, 0, 0); /*DC395x_UNLOCK_ACB_NI; */ @@ -1343,55 +1427,55 @@ (struct AdapterCtlBlk *) cmd->device->host->hostdata; - DEBUG0( /* if(pACB->scan_devices) */ - printk(KERN_INFO DC395X_NAME - ": Queue Cmd=%02x,Tgt=%d,LUN=%d (pid=%li)\n", - cmd->cmnd[0], cmd->device->id, - cmd->device->lun, cmd->pid); - ) - - DEBUGRECURSION(if (in_driver++ > NORM_REC_LVL) - printk(DC395X_NAME - ": %i queue_command () recursion? (pid=%li)\n", - in_driver, cmd->pid);) + dprintkdbg(DBG_0, "Queue Cmd=%02x,Tgt=%d,LUN=%d (pid=%li)\n", + cmd->cmnd[0], cmd->device->id, + cmd->device->lun, cmd->pid); + +#if debug_enabled(DBG_RECURSION) + if (dbg_in_driver++ > NORM_REC_LVL) { + dprintkl(KERN_DEBUG, + "%i queue_command () recursion? (pid=%li)\n", + dbg_in_driver, cmd->pid); + } +#endif - /* Assume BAD_TARGET; will be cleared later */ - cmd->result = DID_BAD_TARGET << 16; + /* Assume BAD_TARGET; will be cleared later */ + cmd->result = DID_BAD_TARGET << 16; if ((cmd->device->id >= pACB->pScsiHost->max_id) || (cmd->device->lun >= pACB->pScsiHost->max_lun) || (cmd->device->lun >31)) { - /* printk (KERN_INFO DC395X_NAME "Ignore target %d lun %d\n", + /* dprintkl(KERN_INFO, "Ignore target %d lun %d\n", cmd->device->id, cmd->device->lun); */ - DEBUGRECURSION(in_driver--; - ) - /*return 1; */ - done(cmd); +#if debug_enabled(DBG_RECURSION) + dbg_in_driver-- +#endif + /*return 1; */ + done(cmd); return 0; } if (!(pACB->DCBmap[cmd->device->id] & (1 << cmd->device->lun))) { - printk(KERN_INFO DC395X_NAME - ": Ignore target %02x lun %02x\n", cmd->device->id, + dprintkl(KERN_INFO, "Ignore target %02x lun %02x\n", cmd->device->id, cmd->device->lun); /*return 1; */ - DEBUGRECURSION(in_driver--; - ) - done(cmd); +#if debug_enabled(DBG_RECURSION) + dbg_in_driver-- +#endif + done(cmd); return 0; } else { pDCB = DC395x_findDCB(pACB, cmd->device->id, cmd->device->lun); if (!pDCB) { /* should never happen */ - printk(KERN_ERR DC395X_NAME - ": no DCB failed, target %02x lun %02x\n", + dprintkl(KERN_ERR, "no DCB failed, target %02x lun %02x\n", cmd->device->id, cmd->device->lun); - printk(DC395X_NAME - ": No DCB in queuecommand (2)!\n"); - DEBUGRECURSION(in_driver--; - ) - return 1; + dprintkl(KERN_ERR, "No DCB in queuecommand (2)!\n"); +#if debug_enabled(DBG_RECURSION) + dbg_in_driver-- +#endif + return 1; } } @@ -1403,52 +1487,49 @@ if (pACB->QueryCnt) { /* Unsent commands ? */ - DEBUG0(printk(DC395X_NAME ": QueryCnt != 0\n"); - ) - DC395x_Query_append(cmd, pACB); + dprintkdbg(DBG_0, "QueryCnt != 0\n"); + DC395x_Query_append(cmd, pACB); DC395x_Waiting_process(pACB); } else { if (pDCB->pWaitingSRB) { pSRB = DC395x_Free_get(pACB); - DEBUG0(if (!pSRB) - printk(DC395X_NAME - ": No free SRB but Waiting\n"); - else - printk(DC395X_NAME - ": Free SRB w/ Waiting\n");) - if (!pSRB) { - DC395x_Query_append(cmd, pACB); - } else { - DC395x_BuildSRB(cmd, pDCB, pSRB); - DC395x_Waiting_append(pDCB, pSRB); - } + if (debug_enabled(DBG_0)) { + if (!pSRB) + dprintkdbg(DBG_0, "No free SRB but Waiting\n"); + else + dprintkdbg(DBG_0, "Free SRB w/ Waiting\n"); + } + if (!pSRB) { + DC395x_Query_append(cmd, pACB); + } else { + DC395x_BuildSRB(cmd, pDCB, pSRB); + DC395x_Waiting_append(pDCB, pSRB); + } DC395x_Waiting_process(pACB); } else { pSRB = DC395x_Free_get(pACB); - DEBUG0(if (!pSRB) - printk(DC395X_NAME - ": No free SRB w/o Waiting\n"); - else - printk(DC395X_NAME - ": Free SRB w/o Waiting\n");) - if (!pSRB) { - DC395x_Query_append(cmd, pACB); - DC395x_Waiting_process(pACB); - } else { - DC395x_BuildSRB(cmd, pDCB, pSRB); - DC395x_SendSRB(pACB, pSRB); - } + if (debug_enabled(DBG_0)) { + if (!pSRB) + dprintkdbg(DBG_0, "No free SRB w/o Waiting\n"); + else + dprintkdbg(DBG_0, "Free SRB w/o Waiting\n"); + } + if (!pSRB) { + DC395x_Query_append(cmd, pACB); + DC395x_Waiting_process(pACB); + } else { + DC395x_BuildSRB(cmd, pDCB, pSRB); + DC395x_SendSRB(pACB, pSRB); + } } } /*DC395x_ACB_LOCK(pACB,acb_flags); */ - DEBUG1(printk - (KERN_DEBUG " ... command (pid %li) queued successfully.\n", - cmd->pid); - ) - DEBUGRECURSION(in_driver--; - ) - return 0; + dprintkdbg(DBG_1, "... command (pid %li) queued successfully.\n", cmd->pid); +#if debug_enabled(DBG_RECURSION) + dbg_in_driver-- +#endif + return 0; } @@ -1546,10 +1627,7 @@ struct AdapterCtlBlk *pACB; int size = capacity; -#ifdef DC395x_DEBUG0 - printk(KERN_INFO DC395X_NAME - ":DC395x_bios_param..............\n "); -#endif + dprintkdbg(DBG_0, "DC395x_bios_param..............\n"); pACB = (struct AdapterCtlBlk *) sdev->host->hostdata; heads = 64; sectors = 32; @@ -1586,12 +1664,10 @@ pSRB = pDCB->pActiveSRB; if (pSRB) { if (!(pSRB->pcmd)) - printk(DC395X_NAME - ": dump: SRB %p: cmd %p OOOPS!\n", pSRB, + dprintkl(KERN_INFO, "dump: SRB %p: cmd %p OOOPS!\n", pSRB, pSRB->pcmd); else - printk(DC395X_NAME - ": dump: SRB %p: cmd %p pid %li: %02x (%02i-%i)\n", + dprintkl(KERN_INFO, "dump: SRB %p: cmd %p pid %li: %02x (%02i-%i)\n", pSRB, pSRB->pcmd, pSRB->pcmd->pid, pSRB->pcmd->cmnd[0], pSRB->pcmd->device->id, pSRB->pcmd->device->lun); @@ -1604,7 +1680,7 @@ (pACB->pActiveDCB) ? "" : "not"); TRACEOUT(" %s\n", pSRB->debugtrace); } - printk(DC395X_NAME ": dump: SCSI block\n"); + dprintkl(KERN_INFO, "dump: SCSI block\n"); printk (" Status %04x FIFOCnt %02x Signals %02x IRQStat %02x\n", DC395x_read16(TRM_S1040_SCSI_STATUS), @@ -1624,7 +1700,7 @@ DC395x_read8(TRM_S1040_SCSI_CONFIG2), DC395x_read8(TRM_S1040_SCSI_COMMAND), DC395x_read8(TRM_S1040_SCSI_TIMEOUT)); - printk(DC395X_NAME ": dump: DMA block\n"); + dprintkl(KERN_INFO, "dump: DMA block\n"); printk (" Cmd %04x FIFOCnt %02x FStat %02x IRQStat %02x IRQEn %02x Cfg %04x\n", DC395x_read16(TRM_S1040_DMA_COMMAND), @@ -1638,12 +1714,11 @@ DC395x_read32(TRM_S1040_DMA_CXCNT), DC395x_read32(TRM_S1040_DMA_XHIGHADDR), DC395x_read32(TRM_S1040_DMA_XLOWADDR)); - printk(DC395X_NAME - ": dump: Misc: GCtrl %02x GStat %02x GTmr %02x\n", + dprintkl(KERN_INFO, "dump: Misc: GCtrl %02x GStat %02x GTmr %02x\n", DC395x_read8(TRM_S1040_GEN_CONTROL), DC395x_read8(TRM_S1040_GEN_STATUS), DC395x_read8(TRM_S1040_GEN_TIMER)); - printk(DC395X_NAME ": dump: PCI Status %04x\n", pstat); + dprintkl(KERN_INFO, "dump: PCI Status %04x\n", pstat); } @@ -1651,18 +1726,20 @@ static inline void DC395x_clrfifo(struct AdapterCtlBlk *pACB, char *txt) { -#ifdef DC395x_DEBUGFIFO +#if debug_enabled(DBG_FIFO) u8 lines = DC395x_read8(TRM_S1040_SCSI_SIGNAL); u8 fifocnt = DC395x_read8(TRM_S1040_SCSI_FIFOCNT); if (!(fifocnt & 0x40)) - printk(DC395X_NAME - ": Clr FIFO (%i bytes) on phase %02x in %s\n", - fifocnt & 0x3f, lines, txt); + dprintkdbg(DBG_FIFO, + "Clr FIFO (%i bytes) on phase %02x in %s\n", + fifocnt & 0x3f, lines, txt); #endif +#if debug_enabled(DBG_TRACE) if (pACB->pActiveDCB && pACB->pActiveDCB->pActiveSRB) { struct ScsiReqBlk *pSRB = pACB->pActiveDCB->pActiveSRB; TRACEPRINTF("#*"); } +#endif DC395x_write16(TRM_S1040_SCSI_CONTROL, DO_CLRFIFO); } @@ -1682,10 +1759,7 @@ u8 PeriodIndex; u16 index; -#ifdef DC395x_DEBUG0 - printk(KERN_INFO DC395X_NAME - ": DC395x_ResetDevParam..............\n "); -#endif + dprintkdbg(DBG_0, "DC395x_ResetDevParam..............\n"); pDCB = pACB->pLinkDCB; if (pDCB == NULL) return; @@ -1728,7 +1802,7 @@ struct AdapterCtlBlk *pACB; /*u32 acb_flags=0; */ - printk(KERN_INFO DC395X_NAME ": reset requested!\n"); + dprintkl(KERN_INFO, "reset requested!\n"); pACB = (struct AdapterCtlBlk *) cmd->device->host->hostdata; /* mid level guarantees no recursion */ /*DC395x_ACB_LOCK(pACB,acb_flags); */ @@ -1797,7 +1871,7 @@ int cnt = pACB->QueryCnt; Scsi_Cmnd *pcmd; Scsi_Cmnd *last = 0; - printk(DC395X_NAME ": DC395x_eh_abort: cmd %p (pid %li, %02i-%i) ", + dprintkl(KERN_INFO, "eh abort: cmd %p (pid %li, %02i-%i) ", cmd, cmd->pid, cmd->device->id, cmd->device->lun); for (pcmd = pACB->pQueryHead; cnt--; last = pcmd, pcmd = (Scsi_Cmnd *) pcmd->host_scribble) { @@ -1821,7 +1895,7 @@ } pDCB = DC395x_findDCB(pACB, cmd->device->id, cmd->device->lun); if (!pDCB) { - printk("no DCB !\n"); + printk("no DCB!\n"); return FAILED; } @@ -1863,8 +1937,8 @@ { u8 *ptr = pSRB->MsgOutBuf + pSRB->MsgCnt; if (pSRB->MsgCnt > 1) { - printk(DC395X_NAME - ": Build_SDTR: MsgOutBuf BUSY (%i: %02x %02x)\n", + dprintkl(KERN_INFO, + "Build_SDTR: MsgOutBuf BUSY (%i: %02x %02x)\n", pSRB->MsgCnt, pSRB->MsgOutBuf[0], pSRB->MsgOutBuf[1]); return; @@ -1897,8 +1971,8 @@ ? 1 : 0; u8 *ptr = pSRB->MsgOutBuf + pSRB->MsgCnt; if (pSRB->MsgCnt > 1) { - printk(DC395X_NAME - ": Build_WDTR: MsgOutBuf BUSY (%i: %02x %02x)\n", + dprintkl(KERN_INFO, + "Build_WDTR: MsgOutBuf BUSY (%i: %02x %02x)\n", pSRB->MsgCnt, pSRB->MsgOutBuf[0], pSRB->MsgOutBuf[1]); return; @@ -1940,9 +2014,9 @@ unsigned long flags; struct AdapterCtlBlk *pACB = (struct AdapterCtlBlk *) ptr; struct ScsiReqBlk *pSRB; - printk(DC395X_NAME ": Debug: Chip forgot to produce SelTO IRQ!\n"); + dprintkl(KERN_DEBUG, "Chip forgot to produce SelTO IRQ!\n"); if (!pACB->pActiveDCB || !pACB->pActiveDCB->pActiveSRB) { - printk(DC395X_NAME ": ... but no cmd pending? Oops!\n"); + dprintkl(KERN_DEBUG, "... but no cmd pending? Oops!\n"); return; } DC395x_LOCK_IO(pACB->pScsiHost); @@ -1967,10 +2041,7 @@ u8 s_stat, scsicommand, i, identify_message; u8 *ptr; -#ifdef DC395x_DEBUG0 - printk(KERN_INFO DC395X_NAME - ": DC395x_StartSCSI..............\n "); -#endif + dprintkdbg(DBG_0, "DC395x_StartSCSI..............\n"); pSRB->TagNumber = TAG_NONE; /* pACB->TagMaxNum: had error read in eeprom */ s_stat = DC395x_read8(TRM_S1040_SCSI_SIGNAL); @@ -1979,12 +2050,10 @@ TRACEPRINTF("Start %02x *", s_stat); #if 1 if (s_stat & 0x20 /* s_stat2 & 0x02000 */ ) { -#ifdef DC395x_DEBUG_KG - printk(DC395X_NAME - ": Debug: StartSCSI: pid %li(%02i-%i): BUSY %02x %04x\n", + dprintkdbg(DBG_KG, + "StartSCSI: pid %li(%02i-%i): BUSY %02x %04x\n", pSRB->pcmd->pid, pDCB->TargetID, pDCB->TargetLUN, s_stat, s_stat2); -#endif /* * Try anyway? * @@ -2002,11 +2071,9 @@ } #endif if (pACB->pActiveDCB) { - printk(DC395X_NAME - ": We try to start a SCSI command (%li)!\n", + dprintkl(KERN_DEBUG, "We try to start a SCSI command (%li)!\n", pSRB->pcmd->pid); - printk(DC395X_NAME - ": While another one (%li) is active!!\n", + dprintkl(KERN_DEBUG, "While another one (%li) is active!!\n", (pACB->pActiveDCB->pActiveSRB ? pACB->pActiveDCB-> pActiveSRB->pcmd->pid : 0)); TRACEOUT(" %s\n", pSRB->debugtrace); @@ -2016,21 +2083,17 @@ return 1; } if (DC395x_read16(TRM_S1040_SCSI_STATUS) & SCSIINTERRUPT) { -#ifdef DC395x_DEBUG_KG - printk(DC395X_NAME - ": Debug: StartSCSI failed (busy) for pid %li(%02i-%i)\n", + dprintkdbg(DBG_KG, + "StartSCSI failed (busy) for pid %li(%02i-%i)\n", pSRB->pcmd->pid, pDCB->TargetID, pDCB->TargetLUN); -#endif TRACEPRINTF("°*"); return 1; } /* Allow starting of SCSI commands half a second before we allow the mid-level * to queue them again after a reset */ if (time_before(jiffies, pACB->pScsiHost->last_reset - HZ / 2)) { -#ifdef DC395x_DEBUG_KG - printk(DC395X_NAME - ": We were just reset and don't accept commands yet!\n"); -#endif + dprintkdbg(DBG_KG, + "We were just reset and don't accept commands yet!\n"); return 1; } @@ -2098,8 +2161,8 @@ tag_number++; } if (tag_number >= pDCB->MaxCommand) { - printk(KERN_WARNING DC395X_NAME - ": Start_SCSI: Out of tags for pid %li (%i-%i)\n", + dprintkl(KERN_WARNING, + "Start_SCSI: Out of tags for pid %li (%i-%i)\n", pSRB->pcmd->pid, pSRB->pcmd->device->id, pSRB->pcmd->device->lun); pSRB->SRBState = SRB_READY; @@ -2124,13 +2187,11 @@ /* * Send CDB ..command block ......... */ -#ifdef DC395x_DEBUG_KG - printk(KERN_INFO DC395X_NAME - ": StartSCSI (pid %li) %02x (%i-%i): Tag %i\n", + dprintkdbg(DBG_KG, + "StartSCSI (pid %li) %02x (%i-%i): Tag %i\n", pSRB->pcmd->pid, pSRB->pcmd->cmnd[0], pSRB->pcmd->device->id, pSRB->pcmd->device->lun, pSRB->TagNumber); -#endif if (pSRB->SRBFlag & AUTO_REQSENSE) { DC395x_write8(TRM_S1040_SCSI_FIFO, REQUEST_SENSE); DC395x_write8(TRM_S1040_SCSI_FIFO, (pDCB->TargetLUN << 5)); @@ -2153,14 +2214,11 @@ * we caught an interrupt (must be reset or reselection ... ) * : Let's process it first! */ - DEBUG0(printk - (DC395X_NAME - ": Debug: StartSCSI failed (busy) for pid %li(%02i-%i)!\n", + dprintkdbg(DBG_0, "Debug: StartSCSI failed (busy) for pid %li(%02i-%i)!\n", pSRB->pcmd->pid, pDCB->TargetID, pDCB->TargetLUN); - ) - /*DC395x_clrfifo (pACB, "Start2"); */ - /*DC395x_write16 (TRM_S1040_SCSI_CONTROL, DO_HWRESELECT | DO_DATALATCH); */ - pSRB->SRBState = SRB_READY; + /*DC395x_clrfifo (pACB, "Start2"); */ + /*DC395x_write16 (TRM_S1040_SCSI_CONTROL, DO_HWRESELECT | DO_DATALATCH); */ + pSRB->SRBState = SRB_READY; DC395x_freetag(pDCB, pSRB); pSRB->MsgCnt = 0; return_code = 1; @@ -2216,22 +2274,22 @@ /* This acknowledges the IRQ */ scsi_intstatus = DC395x_read8(TRM_S1040_SCSI_INTSTATUS); if ((scsi_status & 0x2007) == 0x2002) - printk(DC395X_NAME ": COP after COP completed? %04x\n", + dprintkl(KERN_DEBUG, "COP after COP completed? %04x\n", scsi_status); -#if 1 /*def DC395x_DEBUG0 */ +#if 1 /*def DBG_0 */ if (DC395x_monitor_next_IRQ) { - printk(KERN_INFO DC395X_NAME - ": status=%04x intstatus=%02x\n", scsi_status, + dprintkl(KERN_INFO, + "status=%04x intstatus=%02x\n", scsi_status, scsi_intstatus); DC395x_monitor_next_IRQ--; } #endif /*DC395x_ACB_LOCK(pACB,acb_flags); */ -#ifdef DC395x_DEBUG_KG - if (scsi_intstatus & INT_SELTIMEOUT) - printk(KERN_INFO DC395X_NAME ": Sel Timeout IRQ\n"); -#endif - /*printk (DC395X_NAME ": DC395x_IRQ: intstatus = %02x ", scsi_intstatus); */ + if (debug_enabled(DBG_KG)) { + if (scsi_intstatus & INT_SELTIMEOUT) + dprintkdbg(DBG_KG, "Sel Timeout IRQ\n"); + } + /*dprintkl(KERN_DEBUG, "DC395x_IRQ: intstatus = %02x ", scsi_intstatus); */ if (timer_pending(&pACB->SelTO_Timer)) del_timer(&pACB->SelTO_Timer); @@ -2245,8 +2303,7 @@ goto out_unlock; } if (scsi_intstatus & INT_SELECT) { - printk(KERN_INFO DC395X_NAME - ": Host does not support target mode!\n"); + dprintkl(KERN_INFO, "Host does not support target mode!\n"); goto out_unlock; } if (scsi_intstatus & INT_SCSIRESET) { @@ -2256,16 +2313,14 @@ if (scsi_intstatus & (INT_BUSSERVICE | INT_CMDDONE)) { pDCB = pACB->pActiveDCB; if (!pDCB) { - printk(DC395X_NAME - ": Oops: BusService (%04x %02x) w/o ActiveDCB!\n", + dprintkl(KERN_DEBUG, + "Oops: BusService (%04x %02x) w/o ActiveDCB!\n", scsi_status, scsi_intstatus); goto out_unlock; } pSRB = pDCB->pActiveSRB; if (pDCB->DCBFlag & ABORT_DEV_) { -#ifdef DC395x_DEBUG0 - printk(KERN_INFO "MsgOut Abort Device..... "); -#endif + dprintkdbg(DBG_0, "MsgOut Abort Device.....\n"); DC395x_EnableMsgOut_Abort(pACB, pSRB); } /* @@ -2320,7 +2375,6 @@ return; } -/*inline */ irqreturn_t DC395x_Interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct AdapterCtlBlk *pACB = DC395x_pACB_start; @@ -2328,12 +2382,12 @@ u8 dma_status; irqreturn_t handled = IRQ_NONE; -#ifdef DC395x_DEBUG0 - printk(KERN_INFO DC395X_NAME ": DC395x_Interrupt..............\n "); + dprintkdbg(DBG_0, "DC395x_Interrupt..............\n"); +#if debug_enabled(DBG_RECURSION) + if (dbg_in_driver++ > NORM_REC_LVL) { + dprintkl(KERN_DEBUG, "%i interrupt recursion?\n", dbg_in_driver); + } #endif - DEBUGRECURSION(if (in_driver++ > NORM_REC_LVL) - printk(DC395X_NAME ": %i interrupt recursion?\n", - in_driver);) /* * Find which card generated the interrupt. Note that it may have @@ -2362,10 +2416,10 @@ } else if (dma_status & 0x20) { /* Error from the DMA engine */ - printk(DC395X_NAME ": Interrupt from DMA engine: %02x!\n", + dprintkl(KERN_INFO, "Interrupt from DMA engine: %02x!\n", dma_status); #if 0 - printk(DC395X_NAME ": This means DMA error! Try to handle ...\n"); + dprintkl(KERN_INFO, "This means DMA error! Try to handle ...\n"); if (pACB->pActiveDCB) { pACB->pActiveDCB-> DCBFlag |= ABORT_DEV_; if (pACB->pActiveDCB->pActiveSRB) @@ -2373,14 +2427,16 @@ } DC395x_write8(TRM_S1040_DMA_CONTROL, ABORTXFER | CLRXFIFO); #else - printk(DC395X_NAME ": Ignoring DMA error (probably a bad thing) ...\n"); + dprintkl(KERN_INFO, "Ignoring DMA error (probably a bad thing) ...\n"); pACB = (struct AdapterCtlBlk *)NULL; #endif handled = IRQ_HANDLED; } } - DEBUGRECURSION(in_driver--;) +#if debug_enabled(DBG_RECURSION) + dbg_in_driver-- +#endif return handled; } @@ -2397,9 +2453,7 @@ DC395x_MsgOutPhase0(struct AdapterCtlBlk *pACB, struct ScsiReqBlk *pSRB, u16 * pscsi_status) { -#ifdef DC395x_DEBUG0 - printk(KERN_INFO DC395X_NAME ": DC395x_MsgOutPhase0..... "); -#endif + dprintkdbg(DBG_0, "DC395x_MsgOutPhase0.....\n"); if (pSRB->SRBState & (SRB_UNEXPECT_RESEL + SRB_ABORT_SENT)) { *pscsi_status = PH_BUS_FREE; /*.. initial phase */ } @@ -2425,24 +2479,18 @@ u8 *ptr; struct DeviceCtlBlk *pDCB; -#ifdef DC395x_DEBUG0 - printk(KERN_INFO DC395X_NAME - ": DC395x_MsgOutPhase1..............\n "); -#endif + dprintkdbg(DBG_0, "DC395x_MsgOutPhase1..............\n"); TRACEPRINTF("MOP1*"); pDCB = pACB->pActiveDCB; DC395x_clrfifo(pACB, "MOP1"); if (!(pSRB->SRBState & SRB_MSGOUT)) { pSRB->SRBState |= SRB_MSGOUT; - printk(DC395X_NAME ": Debug: pid %li: MsgOut Phase unexpected.\n", pSRB->pcmd->pid); /* So what ? */ + dprintkl(KERN_DEBUG, "Debug: pid %li: MsgOut Phase unexpected.\n", pSRB->pcmd->pid); /* So what ? */ } if (!pSRB->MsgCnt) { - DEBUG0(printk - (DC395X_NAME - ": Debug: pid %li: NOP Msg (no output message there).\n", + dprintkdbg(DBG_0, "Debug: pid %li: NOP Msg (no output message there).\n", pSRB->pcmd->pid); - ) - DC395x_write8(TRM_S1040_SCSI_FIFO, MSG_NOP); + DC395x_write8(TRM_S1040_SCSI_FIFO, MSG_NOP); DC395x_write16(TRM_S1040_SCSI_CONTROL, DO_DATALATCH); /* it's important for atn stop */ DC395x_write8(TRM_S1040_SCSI_COMMAND, SCMD_FIFO_OUT); TRACEPRINTF("\\*"); @@ -2451,15 +2499,15 @@ } ptr = (u8 *) pSRB->MsgOutBuf; TRACEPRINTF("(*"); - /*printk (DC395X_NAME ": Send msg: "); DC395x_printMsg (ptr, pSRB->MsgCnt); */ - /*printk (DC395X_NAME ": MsgOut: "); */ + /*dprintkl(KERN_DEBUG, "Send msg: "); DC395x_printMsg (ptr, pSRB->MsgCnt); */ + /*dprintkl(KERN_DEBUG, "MsgOut: "); */ for (i = 0; i < pSRB->MsgCnt; i++) { TRACEPRINTF("%02x *", *ptr); DC395x_write8(TRM_S1040_SCSI_FIFO, *ptr++); } TRACEPRINTF(")*"); pSRB->MsgCnt = 0; - /*printk ("\n"); */ + /*printk("\n"); */ if ( /*(pDCB->DCBFlag & ABORT_DEV_) && */ (pSRB->MsgOutBuf[0] == MSG_ABORT)) pSRB->SRBState = SRB_ABORT_SENT; @@ -2509,10 +2557,7 @@ u8 *ptr; u16 i; -#ifdef DC395x_DEBUG0 - printk(KERN_INFO DC395X_NAME - ": DC395x_CommandPhase1..............\n "); -#endif + dprintkdbg(DBG_0, "DC395x_CommandPhase1..............\n"); TRACEPRINTF("COP1*"); DC395x_clrfifo(pACB, "COP1"); DC395x_write16(TRM_S1040_SCSI_CONTROL, DO_CLRATN); @@ -2543,24 +2588,20 @@ /* Do sanity checks for S/G list */ -#ifdef DC395x_SGPARANOIA static inline void DC395x_check_SG(struct ScsiReqBlk *pSRB) { - unsigned Length = 0; - unsigned Idx = pSRB->SRBSGIndex; - struct SGentry *psge = pSRB->SegmentX + Idx; - for (; Idx < pSRB->SRBSGCount; psge++, Idx++) - Length += psge->length; - if (Length != pSRB->SRBTotalXferLength) - printk(DC395X_NAME - ": Inconsistent SRB S/G lengths (Tot=%i, Count=%i) !!\n", - pSRB->SRBTotalXferLength, Length); + if (debug_enabled(DBG_SGPARANOIA)) { + unsigned Length = 0; + unsigned Idx = pSRB->SRBSGIndex; + struct SGentry *psge = pSRB->SegmentX + Idx; + for (; Idx < pSRB->SRBSGCount; psge++, Idx++) + Length += psge->length; + if (Length != pSRB->SRBTotalXferLength) + dprintkdbg(DBG_SGPARANOIA, + "Inconsistent SRB S/G lengths (Tot=%i, Count=%i) !!\n", + pSRB->SRBTotalXferLength, Length); + } } -#else -static inline void DC395x_check_SG(struct ScsiReqBlk *pSRB) -{ -} -#endif /* @@ -2576,10 +2617,8 @@ struct scatterlist *sg; int segment = pcmd->use_sg; -#ifdef DC395x_DEBUG_KG - printk(DC395X_NAME ": Update SG: Total %i, Left %i\n", + dprintkdbg(DBG_KG, "Update SG: Total %i, Left %i\n", pSRB->SRBTotalXferLength, Left); -#endif DC395x_check_SG(pSRB); psge = pSRB->SegmentX + pSRB->SRBSGIndex; /* data that has already been transferred */ @@ -2612,28 +2651,28 @@ DC395x_check_SG(pSRB); } /* We need the corresponding virtual address sg_to_virt */ - /*printk (DC395X_NAME ": sg_to_virt: bus %08x -> virt ", psge->address); */ + /*dprintkl(KERN_DEBUG, "sg_to_virt: bus %08x -> virt ", psge->address); */ if (!segment) { pSRB->virt_addr += Xferred; - /*printk ("%p\n", pSRB->virt_addr); */ + /*printk("%p\n", pSRB->virt_addr); */ return; } /* We have to walk the scatterlist to find it */ sg = (struct scatterlist *) pcmd->request_buffer; while (segment--) { - /*printk ("(%08x)%p ", BUS_ADDR(*sg), PAGE_ADDRESS(sg)); */ + /*printk("(%08x)%p ", BUS_ADDR(*sg), PAGE_ADDRESS(sg)); */ unsigned long mask = ~((unsigned long) sg->length - 1) & PAGE_MASK; if ((BUS_ADDR(*sg) & mask) == (psge->address & mask)) { pSRB->virt_addr = (PAGE_ADDRESS(sg) + psge->address - (psge->address & PAGE_MASK)); - /*printk ("%p\n", pSRB->virt_addr); */ + /*printk("%p\n", pSRB->virt_addr); */ return; } ++sg; } - printk(DC395X_NAME ": sg_to_virt failed!\n"); + dprintkl(KERN_ERR, "sg_to_virt failed!\n"); pSRB->virt_addr = 0; } @@ -2692,9 +2731,7 @@ u32 dLeftCounter = 0; struct DeviceCtlBlk *pDCB = pSRB->pSRBDCB; -#ifdef DC395x_DEBUG0 - printk(KERN_INFO DC395X_NAME ": DC395x_DataOutPhase0.....\n "); -#endif + dprintkdbg(DBG_0, "DC395x_DataOutPhase0.....\n"); TRACEPRINTF("DOP0*"); pDCB = pSRB->pSRBDCB; scsi_status = *pscsi_status; @@ -2711,16 +2748,12 @@ * KG: Stop DMA engine pushing more data into the SCSI FIFO * If we need more data, the DMA SG list will be freshly set up, anyway */ -#ifdef DC395x_DEBUGPIO - printk(DC395X_NAME - ": DOP0: DMA_FCNT: %02x, DMA_FSTAT: %02x, SCSI_FCNT: %02x, CTR %06x, stat %04x, Tot: %06x\n", + dprintkdbg(DBG_PIO, "DOP0: DMA_FCNT: %02x, DMA_FSTAT: %02x, SCSI_FCNT: %02x, CTR %06x, stat %04x, Tot: %06x\n", DC395x_read8(TRM_S1040_DMA_FIFOCNT), DC395x_read8(TRM_S1040_DMA_FIFOSTAT), DC395x_read8(TRM_S1040_SCSI_FIFOCNT), DC395x_read32(TRM_S1040_SCSI_COUNTER), scsi_status, pSRB->SRBTotalXferLength); - /*DC395x_dumpinfo(pACB, pDCB, pSRB); */ -#endif DC395x_write8(TRM_S1040_DMA_CONTROL, STOPDMAXFER | CLRXFIFO); if (!(pSRB->SRBState & SRB_XFERPAD)) { @@ -2744,23 +2777,22 @@ if (pDCB->SyncPeriod & WIDE_SYNC) dLeftCounter <<= 1; -#ifdef DC395x_DEBUG_KG - printk(DC395X_NAME - ": Debug: SCSI FIFO contains %i %s in DOP0\n", + dprintkdbg(DBG_KG, + "Debug: SCSI FIFO contains %i %s in DOP0\n", DC395x_read8(TRM_S1040_SCSI_FIFOCNT), (pDCB-> SyncPeriod & WIDE_SYNC) ? "words" : "bytes"); - printk(DC395X_NAME - ": SCSI FIFOCNT %02x, SCSI CTR %08x\n", + dprintkdbg(DBG_KG, + "SCSI FIFOCNT %02x, SCSI CTR %08x\n", DC395x_read8(TRM_S1040_SCSI_FIFOCNT), DC395x_read32(TRM_S1040_SCSI_COUNTER)); - printk(DC395X_NAME - ": DMA FIFOCNT %04x, FIFOSTAT %02x, DMA CTR %08x\n", + dprintkdbg(DBG_KG, + "DMA FIFOCNT %04x, FIFOSTAT %02x, DMA CTR %08x\n", DC395x_read8(TRM_S1040_DMA_FIFOCNT), DC395x_read8(TRM_S1040_DMA_FIFOSTAT), DC395x_read32(TRM_S1040_DMA_CXCNT)); -#endif + /* * if WIDE scsi SCSI FIFOCNT unit is word !!! * so need to *= 2 @@ -2786,8 +2818,7 @@ if (dLeftCounter == 1 && pDCB->SyncPeriod & WIDE_SYNC && pSRB->pcmd->request_bufflen % 2) { dLeftCounter = 0; - printk(DC395X_NAME - ": DOP0: Discard 1 byte. (%02x)\n", + dprintkl(KERN_INFO, "DOP0: Discard 1 byte. (%02x)\n", scsi_status); } /* @@ -2808,8 +2839,8 @@ * { * TempDMAstatus = DC395x_read8(TRM_S1040_DMA_STATUS); * } while( !(TempDMAstatus & DMAXFERCOMP) && --ctr); - * if (ctr < 6000000-1) printk (DC395X_NAME ": DMA should be complete ... in DOP1\n"); - * if (!ctr) printk (KERN_ERR DC395X_NAME ": Deadlock in DataOutPhase0 !!\n"); + * if (ctr < 6000000-1) dprintkl(KERN_DEBUG, "DMA should be complete ... in DOP1\n"); + * if (!ctr) dprintkl(KERN_ERR, "Deadlock in DataOutPhase0 !!\n"); */ pSRB->SRBTotalXferLength = 0; } else { /* Update SG list */ @@ -2829,9 +2860,8 @@ || ((oldXferred & ~PAGE_MASK) == (PAGE_SIZE - diff)) ) { - printk(DC395X_NAME - ": Work around chip bug (%i)?\n", - diff); + dprintkl(KERN_INFO, + "Work around chip bug (%i)?\n", diff); dLeftCounter = pSRB->SRBTotalXferLength - diff; DC395x_update_SGlist(pSRB, dLeftCounter); @@ -2844,16 +2874,16 @@ } #if 0 if (!(DC395x_read8(TRM_S1040_SCSI_FIFOCNT) & 0x40)) - printk(DC395X_NAME - ": DOP0(%li): %i bytes in SCSI FIFO! (Clear!)\n", - pSRB->pcmd->pid, - DC395x_read8(TRM_S1040_SCSI_FIFOCNT) & 0x1f); + dprintkl(KERN_DEBUG, + "DOP0(%li): %i bytes in SCSI FIFO! (Clear!)\n", + pSRB->pcmd->pid, + DC395x_read8(TRM_S1040_SCSI_FIFOCNT) & 0x1f); #endif /*DC395x_clrfifo (pACB, "DOP0"); */ /*DC395x_write8 (TRM_S1040_DMA_CONTROL, CLRXFIFO | ABORTXFER); */ #if 1 if ((*pscsi_status & PHASEMASK) != PH_DATA_OUT) { - /*printk (DC395X_NAME ": Debug: Clean up after Data Out ...\n"); */ + /*dprintkl(KERN_DEBUG, "Debug: Clean up after Data Out ...\n"); */ DC395x_cleanup_after_transfer(pACB, pSRB); } #endif @@ -2875,9 +2905,7 @@ u16 * pscsi_status) { -#ifdef DC395x_DEBUG0 - printk(KERN_INFO DC395X_NAME ": DC395x_DataOutPhase1.....\n"); -#endif + dprintkdbg(DBG_0, "DC395x_DataOutPhase1.....\n"); /*1.25 */ TRACEPRINTF("DOP1*"); DC395x_clrfifo(pACB, "DOP1"); @@ -2906,10 +2934,7 @@ /*struct DeviceCtlBlk* pDCB = pSRB->pSRBDCB; */ /*u8 bval; */ -#ifdef DC395x_DEBUG0 - printk(KERN_INFO DC395X_NAME - ": DC395x_DataInPhase0..............\n "); -#endif + dprintkdbg(DBG_0, "DC395x_DataInPhase0..............\n"); TRACEPRINTF("DIP0*"); scsi_status = *pscsi_status; @@ -2928,8 +2953,8 @@ */ if (!(pSRB->SRBState & SRB_XFERPAD)) { if (scsi_status & PARITYERROR) { - printk(DC395X_NAME - ": Parity Error (pid %li, target %02i-%i)\n", + dprintkl(KERN_INFO, + "Parity Error (pid %li, target %02i-%i)\n", pSRB->pcmd->pid, pSRB->pcmd->device->id, pSRB->pcmd->device->lun); pSRB->SRBStatus |= PARITY_ERROR; @@ -2943,8 +2968,8 @@ if (!(DC395x_read8(TRM_S1040_DMA_FIFOSTAT) & 0x80)) { #if 0 int ctr = 6000000; - printk(DC395X_NAME - ": DIP0: Wait for DMA FIFO to flush ...\n"); + dprintkl(KERN_DEBUG, + "DIP0: Wait for DMA FIFO to flush ...\n"); /*DC395x_write8 (TRM_S1040_DMA_CONTROL, STOPDMAXFER); */ /*DC395x_write32 (TRM_S1040_SCSI_COUNTER, 7); */ /*DC395x_write8 (TRM_S1040_SCSI_COMMAND, SCMD_DMA_IN); */ @@ -2952,18 +2977,16 @@ (DC395x_read16(TRM_S1040_DMA_FIFOSTAT) & 0x80) && --ctr); if (ctr < 6000000 - 1) - printk(DC395X_NAME - ": Debug: DIP0: Had to wait for DMA ...\n"); + dprintkl(KERN_DEBUG + "DIP0: Had to wait for DMA ...\n"); if (!ctr) - printk(KERN_ERR DC395X_NAME - ": Deadlock in DIP0 waiting for DMA FIFO empty!!\n"); + dprintkl(KERN_ERR, + "Deadlock in DIP0 waiting for DMA FIFO empty!!\n"); /*DC395x_write32 (TRM_S1040_SCSI_COUNTER, 0); */ #endif -#ifdef DC395x_DEBUG_KG - printk(DC395X_NAME ": DIP0: DMA_FIFO: %02x %02x\n", + dprintkdbg(DBG_KG, "DIP0: DMA_FIFO: %02x %02x\n", DC395x_read8(TRM_S1040_DMA_FIFOCNT), DC395x_read8(TRM_S1040_DMA_FIFOSTAT)); -#endif } /* Now: Check remainig data: The SCSI counters should tell us ... */ dLeftCounter = DC395x_read32(TRM_S1040_SCSI_COUNTER) @@ -2971,42 +2994,34 @@ << ((pSRB->pSRBDCB->SyncPeriod & WIDE_SYNC) ? 1 : 0)); -#ifdef DC395x_DEBUG_KG - printk(DC395X_NAME - ": Debug: SCSI FIFO contains %i %s in DIP0\n", - DC395x_read8(TRM_S1040_SCSI_FIFOCNT) & 0x1f, - (pSRB->pSRBDCB-> - SyncPeriod & WIDE_SYNC) ? "words" : "bytes"); - printk(DC395X_NAME ": SCSI FIFOCNT %02x, SCSI CTR %08x\n", - DC395x_read8(TRM_S1040_SCSI_FIFOCNT), - DC395x_read32(TRM_S1040_SCSI_COUNTER)); - printk(DC395X_NAME - ": DMA FIFOCNT %02x,%02x DMA CTR %08x\n", - DC395x_read8(TRM_S1040_DMA_FIFOCNT), - DC395x_read8(TRM_S1040_DMA_FIFOSTAT), - DC395x_read32(TRM_S1040_DMA_CXCNT)); - printk(DC395X_NAME - ": Remaining: TotXfer: %i, SCSI FIFO+Ctr: %i\n", - pSRB->SRBTotalXferLength, dLeftCounter); -#endif + dprintkdbg(DBG_KG, "SCSI FIFO contains %i %s in DIP0\n", + DC395x_read8(TRM_S1040_SCSI_FIFOCNT) & 0x1f, + (pSRB->pSRBDCB-> + SyncPeriod & WIDE_SYNC) ? "words" : "bytes"); + dprintkdbg(DBG_KG, "SCSI FIFOCNT %02x, SCSI CTR %08x\n", + DC395x_read8(TRM_S1040_SCSI_FIFOCNT), + DC395x_read32(TRM_S1040_SCSI_COUNTER)); + dprintkdbg(DBG_KG, "DMA FIFOCNT %02x,%02x DMA CTR %08x\n", + DC395x_read8(TRM_S1040_DMA_FIFOCNT), + DC395x_read8(TRM_S1040_DMA_FIFOSTAT), + DC395x_read32(TRM_S1040_DMA_CXCNT)); + dprintkdbg(DBG_KG, "Remaining: TotXfer: %i, SCSI FIFO+Ctr: %i\n", + pSRB->SRBTotalXferLength, dLeftCounter); #if DC395x_LASTPIO /* KG: Less than or equal to 4 bytes can not be transfered via DMA, it seems. */ if (dLeftCounter && pSRB->SRBTotalXferLength <= DC395x_LASTPIO) { /*u32 addr = (pSRB->SegmentX[pSRB->SRBSGIndex].address); */ /*DC395x_update_SGlist (pSRB, dLeftCounter); */ - DEBUGPIO(printk - (DC395X_NAME - ": DIP0: PIO (%i %s) to %p for remaining %i bytes:", + dprintkdbg(DBG_PIO, "DIP0: PIO (%i %s) to %p for remaining %i bytes:", DC395x_read8(TRM_S1040_SCSI_FIFOCNT) & 0x1f, (pSRB->pSRBDCB-> SyncPeriod & WIDE_SYNC) ? "words" : "bytes", pSRB->virt_addr, pSRB->SRBTotalXferLength); - ) - if (pSRB->pSRBDCB->SyncPeriod & WIDE_SYNC) + if (pSRB->pSRBDCB->SyncPeriod & WIDE_SYNC) DC395x_write8(TRM_S1040_SCSI_CONFIG2, CFG2_WIDEFIFO); @@ -3015,17 +3030,17 @@ u8 byte = DC395x_read8(TRM_S1040_SCSI_FIFO); *(pSRB->virt_addr)++ = byte; - DEBUGPIO(printk(" %02x", byte); - ) - pSRB->SRBTotalXferLength--; + if (debug_enabled(DBG_PIO)) + printk(" %02x", byte); + pSRB->SRBTotalXferLength--; dLeftCounter--; pSRB->SegmentX[pSRB->SRBSGIndex].length--; if (pSRB->SRBTotalXferLength && !pSRB->SegmentX[pSRB->SRBSGIndex]. length) { - DEBUGPIO(printk(" (next segment)"); - ) - pSRB->SRBSGIndex++; + if (debug_enabled(DBG_PIO)) + printk(" (next segment)"); + pSRB->SRBSGIndex++; DC395x_update_SGlist(pSRB, dLeftCounter); } @@ -3038,16 +3053,16 @@ (TRM_S1040_SCSI_FIFO); *(pSRB->virt_addr)++ = byte; pSRB->SRBTotalXferLength--; - DEBUGPIO(printk(" %02x", byte); - ) + if (debug_enabled(DBG_PIO)) + printk(" %02x", byte); } #endif DC395x_write8(TRM_S1040_SCSI_CONFIG2, 0); } - /*printk (" %08x", *(u32*)(bus_to_virt (addr))); */ + /*printk(" %08x", *(u32*)(bus_to_virt (addr))); */ /*pSRB->SRBTotalXferLength = 0; */ - DEBUGPIO(printk("\n"); - ) + if (debug_enabled(DBG_PIO)) + printk("\n"); } #endif /* DC395x_LASTPIO */ @@ -3075,12 +3090,12 @@ #endif /*dLeftCounter += DC395x_read32(TRM_S1040_SCSI_COUNTER); */ #if 0 - printk(DC395X_NAME - ": DIP0: ctr=%08x, DMA_FIFO=%02x,%02x SCSI_FIFO=%02x\n", + dprintkl(KERN_DEBUG, + "DIP0: ctr=%08x, DMA_FIFO=%02x,%02x SCSI_FIFO=%02x\n", dLeftCounter, DC395x_read8(TRM_S1040_DMA_FIFOCNT), DC395x_read8(TRM_S1040_DMA_FIFOSTAT), DC395x_read8(TRM_S1040_SCSI_FIFOCNT)); - printk(DC395X_NAME ": DIP0: DMAStat %02x\n", + dprintkl(KERN_DEBUG, "DIP0: DMAStat %02x\n", DC395x_read8(TRM_S1040_DMA_STATUS)); #endif @@ -3095,13 +3110,13 @@ DC395x_read8(TRM_S1040_DMA_STATUS); } while (!(TempDMAstatus & DMAXFERCOMP) && --ctr); if (!ctr) - printk(KERN_ERR DC395X_NAME - ": Deadlock in DataInPhase0 waiting for DMA!!\n"); + dprintkl(KERN_ERR, + "Deadlock in DataInPhase0 waiting for DMA!!\n"); pSRB->SRBTotalXferLength = 0; #endif -#if 0 /*def DC395x_DEBUG_KG */ - printk(DC395X_NAME - ": DIP0: DMA not yet ready: %02x: %i -> %i bytes\n", +#if 0 /*def DBG_KG */ + dprintkl(KERN_DEBUG, + "DIP0: DMA not yet ready: %02x: %i -> %i bytes\n", DC395x_read8(TRM_S1040_DMA_STATUS), pSRB->SRBTotalXferLength, dLeftCounter); #endif @@ -3120,7 +3135,7 @@ } /* KG: The target may decide to disconnect: Empty FIFO before! */ if ((*pscsi_status & PHASEMASK) != PH_DATA_IN) { - /*printk (DC395X_NAME ": Debug: Clean up after Data In ...\n"); */ + /*dprintkl(KERN_DEBUG, "Debug: Clean up after Data In ...\n"); */ DC395x_cleanup_after_transfer(pACB, pSRB); } #if 0 @@ -3128,13 +3143,13 @@ bval = DC395x_read8(TRM_S1040_SCSI_FIFOCNT); if (!(bval & 0x40)) { bval &= 0x1f; - printk(DC395X_NAME - ": DIP0(%li): %i bytes in SCSI FIFO (stat %04x) (left %08x)!!\n", + dprintkl(KERN_DEBUG, + "DIP0(%li): %i bytes in SCSI FIFO (stat %04x) (left %08x)!!\n", pSRB->pcmd->pid, bval & 0x1f, scsi_status, dLeftCounter); if ((dLeftCounter == 0) || (scsi_status & SCSIXFERCNT_2_ZERO)) { - printk(DC395X_NAME ": Clear FIFO!\n"); + dprintkl(KERN_DEBUG, "Clear FIFO!\n"); DC395x_clrfifo(pACB, "DIP0"); } } @@ -3159,9 +3174,7 @@ DC395x_DataInPhase1(struct AdapterCtlBlk *pACB, struct ScsiReqBlk *pSRB, u16 * pscsi_status) { -#ifdef DC395x_DEBUG0 - printk(KERN_INFO DC395X_NAME ": DC395x_DataInPhase1..... "); -#endif + dprintkdbg(DBG_0, "DC395x_DataInPhase1.....\n"); /* FIFO should be cleared, if previous phase was not DataPhase */ /*DC395x_clrfifo (pACB, "DIP1"); */ /* Allow data in! */ @@ -3189,19 +3202,15 @@ u8 bval; struct DeviceCtlBlk *pDCB; -#ifdef DC395x_DEBUG0 - printk(KERN_INFO DC395X_NAME - ": DataIO_transfer %c (pid %li): len = %i, SG: %i/%i\n", + dprintkdbg(DBG_0, "DataIO_transfer %c (pid %li): len = %i, SG: %i/%i\n", ((ioDir & DMACMD_DIR) ? 'r' : 'w'), pSRB->pcmd->pid, pSRB->SRBTotalXferLength, pSRB->SRBSGIndex, pSRB->SRBSGCount); -#endif TRACEPRINTF("%05x(%i/%i)*", pSRB->SRBTotalXferLength, pSRB->SRBSGIndex, pSRB->SRBSGCount); pDCB = pSRB->pSRBDCB; if (pSRB == pACB->pTmpSRB) { - printk(DC395X_NAME - ": ERROR! Using TmpSRB in DataPhase!\n"); + dprintkl(KERN_ERR, "Using TmpSRB in DataPhase!\n"); } if (pSRB->SRBSGIndex < pSRB->SRBSGCount) { if (pSRB->SRBTotalXferLength > DC395x_LASTPIO) { @@ -3211,8 +3220,7 @@ * Maybe, even ABORTXFER would be appropriate */ if (dma_status & XFERPENDING) { - printk(DC395X_NAME - ": Xfer pending! Expect trouble!!\n"); + dprintkl(KERN_DEBUG, "Xfer pending! Expect trouble!!\n"); DC395x_dumpinfo(pACB, pDCB, pSRB); DC395x_write8(TRM_S1040_DMA_CONTROL, CLRXFIFO); @@ -3280,19 +3288,13 @@ DC395x_write8 (TRM_S1040_SCSI_CONFIG2, CFG2_WIDEFIFO); - DEBUGPIO(printk - (DC395X_NAME - ": DOP1: PIO %i bytes from %p:", + dprintkdbg(DBG_PIO, "DOP1: PIO %i bytes from %p:", pSRB->SRBTotalXferLength, pSRB->virt_addr); - ) - while (pSRB->SRBTotalXferLength) { - DEBUGPIO(printk - (" %02x", - (unsigned char) *(pSRB-> - virt_addr)); - ) - DC395x_write8 + while (pSRB->SRBTotalXferLength) { + if (debug_enabled(DBG_PIO)) + printk(" %02x", (unsigned char) *(pSRB->virt_addr)); + DC395x_write8 (TRM_S1040_SCSI_FIFO, *(pSRB->virt_addr)++); pSRB->SRBTotalXferLength--; @@ -3302,10 +3304,9 @@ && !pSRB->SegmentX[pSRB-> SRBSGIndex]. length) { - DEBUGPIO(printk - (" (next segment)"); - ) - pSRB->SRBSGIndex++; + if (debug_enabled(DBG_PIO)) + printk(" (next segment)"); + pSRB->SRBSGIndex++; DC395x_update_SGlist(pSRB, pSRB-> SRBTotalXferLength); @@ -3313,19 +3314,17 @@ } if (pSRB->pSRBDCB->SyncPeriod & WIDE_SYNC) { if (ln % 2) { - DC395x_write8 - (TRM_S1040_SCSI_FIFO, - 0); - DEBUGPIO(printk(" |00"); - ) + DC395x_write8(TRM_S1040_SCSI_FIFO, 0); + if (debug_enabled(DBG_PIO)) + printk(" |00"); } DC395x_write8 (TRM_S1040_SCSI_CONFIG2, 0); } /*DC395x_write32(TRM_S1040_SCSI_COUNTER, ln); */ - DEBUGPIO(printk("\n"); - ) - DC395x_write8(TRM_S1040_SCSI_COMMAND, + if (debug_enabled(DBG_PIO)) + printk("\n"); + DC395x_write8(TRM_S1040_SCSI_COMMAND, SCMD_FIFO_OUT); } } @@ -3353,7 +3352,7 @@ data2 = DC395x_read8 (TRM_S1040_SCSI_FIFO); - /*printk (DC395X_NAME ": DataIO: Xfer pad: %02x %02x\n", data, data2); */ + /*dprintkl(KERN_DEBUG, "DataIO: Xfer pad: %02x %02x\n", data, data2); */ } else { /* Danger, Robinson: If you find KGs scattered over the wide * disk, the driver or chip is to blame :-( */ @@ -3371,7 +3370,7 @@ data = DC395x_read8 (TRM_S1040_SCSI_FIFO); - /*printk (DC395X_NAME ": DataIO: Xfer pad: %02x\n", data); */ + /*dprintkl(KERN_DEBUG, "DataIO: Xfer pad: %02x\n", data); */ } else { DC395x_write8(TRM_S1040_SCSI_FIFO, 'K'); @@ -3389,7 +3388,7 @@ } } /*DC395x_monitor_next_IRQ = 2; */ - /*printk (" done\n"); */ + /*printk(" done\n"); */ } @@ -3405,10 +3404,7 @@ DC395x_StatusPhase0(struct AdapterCtlBlk *pACB, struct ScsiReqBlk *pSRB, u16 * pscsi_status) { -#ifdef DC395x_DEBUG0 - printk(KERN_INFO DC395X_NAME ": StatusPhase0 (pid %li)\n", - pSRB->pcmd->pid); -#endif + dprintkdbg(DBG_0, "StatusPhase0 (pid %li)\n", pSRB->pcmd->pid); TRACEPRINTF("STP0 *"); pSRB->TargetStatus = DC395x_read8(TRM_S1040_SCSI_FIFO); pSRB->EndMessage = DC395x_read8(TRM_S1040_SCSI_FIFO); /* get message */ @@ -3436,10 +3432,7 @@ DC395x_StatusPhase1(struct AdapterCtlBlk *pACB, struct ScsiReqBlk *pSRB, u16 * pscsi_status) { -#ifdef DC395x_DEBUG0 - printk(KERN_INFO DC395X_NAME ": StatusPhase1 (pid=%li)\n", - pSRB->pcmd->pid); -#endif + dprintkdbg(DBG_0, "StatusPhase1 (pid=%li)\n", pSRB->pcmd->pid); TRACEPRINTF("STP1 *"); /* Cleanup is now done at the end of DataXXPhase0 */ /*DC395x_cleanup_after_transfer (pACB, pSRB); */ @@ -3494,8 +3487,8 @@ DC395x_ENABLE_MSGOUT; pSRB->SRBState &= ~SRB_MSGIN; pSRB->SRBState |= SRB_MSGOUT; - printk(KERN_INFO DC395X_NAME - ": Reject message %02x from %02i-%i\n", pSRB->MsgInBuf[0], + dprintkl(KERN_INFO, + "Reject message %02x from %02i-%i\n", pSRB->MsgInBuf[0], pSRB->pSRBDCB->TargetID, pSRB->pSRBDCB->TargetLUN); TRACEPRINTF("\\*"); } @@ -3525,12 +3518,10 @@ { struct ScsiReqBlk *lastSRB = pDCB->pGoingLast; struct ScsiReqBlk *pSRB = pDCB->pGoingSRB; -#ifdef DC395x_DEBUG0 - printk(DC395X_NAME ": QTag Msg (SRB %p): %i ", pSRB, tag); -#endif + dprintkdbg(DBG_0, "QTag Msg (SRB %p): %i\n", pSRB, tag); if (!(pDCB->TagMask & (1 << tag))) - printk(DC395X_NAME - ": MsgIn_QTag: TagMask (%08x) does not reserve tag %i!\n", + dprintkl(KERN_DEBUG, + "MsgIn_QTag: TagMask (%08x) does not reserve tag %i!\n", pDCB->TagMask, tag); if (!pSRB) @@ -3542,10 +3533,8 @@ goto mingx0; pSRB = pSRB->pNextSRB; } -#ifdef DC395x_DEBUG0 - printk("pid %li (%i-%i)\n", pSRB->pcmd->pid, + dprintkdbg(DBG_0, "pid %li (%i-%i)\n", pSRB->pcmd->pid, pSRB->pSRBDCB->TargetID, pSRB->pSRBDCB->TargetLUN); -#endif if (pDCB->DCBFlag & ABORT_DEV_) { /*pSRB->SRBState = SRB_ABORT_SENT; */ DC395x_EnableMsgOut_Abort(pACB, pSRB); @@ -3578,7 +3567,7 @@ pSRB->MsgCnt = 1; DC395x_ENABLE_MSGOUT; TRACEPRINTF("?*"); - printk(DC395X_NAME ": Unknown tag received: %i: abort !!\n", tag); + dprintkl(KERN_DEBUG, "Unknown tag received: %i: abort !!\n", tag); return pSRB; } @@ -3599,8 +3588,7 @@ DC395x_MsgIn_set_async(struct AdapterCtlBlk *pACB, struct ScsiReqBlk *pSRB) { struct DeviceCtlBlk *pDCB = pSRB->pSRBDCB; - printk(DC395X_NAME ": Target %02i: No sync transfers\n", - pDCB->TargetID); + dprintkl(KERN_DEBUG, "Target %02i: No sync transfers\n", pDCB->TargetID); TRACEPRINTF("!S *"); pDCB->SyncMode &= ~(SYNC_NEGO_ENABLE); pDCB->SyncMode |= SYNC_NEGO_DONE; @@ -3613,9 +3601,7 @@ && !(pDCB->SyncMode & WIDE_NEGO_DONE)) { DC395x_Build_WDTR(pACB, pDCB, pSRB); DC395x_ENABLE_MSGOUT; - DEBUG0(printk - (DC395X_NAME ": SDTR(rej): Try WDTR anyway ...\n"); - ) + dprintkdbg(DBG_0, "SDTR(rej): Try WDTR anyway ...\n"); } } @@ -3630,14 +3616,11 @@ /*u8 oldsyncperiod = pDCB->SyncPeriod; */ /*u8 oldsyncoffset = pDCB->SyncOffset; */ -#ifdef DC395x_DEBUG1 - printk(KERN_INFO DC395X_NAME - ": Target %02i: Sync: %ins (%02i.%01i MHz) Offset %i\n", + dprintkdbg(DBG_1, "Target %02i: Sync: %ins (%02i.%01i MHz) Offset %i\n", pDCB->TargetID, pSRB->MsgInBuf[3] << 2, (250 / pSRB->MsgInBuf[3]), ((250 % pSRB->MsgInBuf[3]) * 10) / pSRB->MsgInBuf[3], pSRB->MsgInBuf[4]); -#endif if (pSRB->MsgInBuf[4] > 15) pSRB->MsgInBuf[4] = 15; @@ -3655,8 +3638,8 @@ dc395x_clock_period[bval])) bval++; if (pSRB->MsgInBuf[3] < dc395x_clock_period[bval]) - printk(KERN_INFO DC395X_NAME - ": Increase sync nego period to %ins\n", + dprintkl(KERN_INFO, + "Increase sync nego period to %ins\n", dc395x_clock_period[bval] << 2); pSRB->MsgInBuf[3] = dc395x_clock_period[bval]; pDCB->SyncPeriod &= 0xf0; @@ -3668,8 +3651,8 @@ else fact = 250; - printk(KERN_INFO DC395X_NAME - ": Target %02i: %s Sync: %ins Offset %i (%02i.%01i MB/s)\n", + dprintkl(KERN_INFO, + "Target %02i: %s Sync: %ins Offset %i (%02i.%01i MB/s)\n", pDCB->TargetID, (fact == 500) ? "Wide16" : "", pDCB->MinNegoPeriod << 2, pDCB->SyncOffset, (fact / pDCB->MinNegoPeriod), @@ -3679,7 +3662,7 @@ TRACEPRINTF("S%i *", pDCB->MinNegoPeriod << 2); if (!(pSRB->SRBState & SRB_DO_SYNC_NEGO)) { /* Reply with corrected SDTR Message */ - printk(DC395X_NAME ": .. answer w/ %ins %i\n", + dprintkl(KERN_DEBUG, " .. answer w/ %ins %i\n", pSRB->MsgInBuf[3] << 2, pSRB->MsgInBuf[4]); memcpy(pSRB->MsgOutBuf, pSRB->MsgInBuf, 5); @@ -3691,9 +3674,7 @@ && !(pDCB->SyncMode & WIDE_NEGO_DONE)) { DC395x_Build_WDTR(pACB, pDCB, pSRB); DC395x_ENABLE_MSGOUT; - DEBUG0(printk - (DC395X_NAME ": SDTR: Also try WDTR ...\n"); - ) + dprintkdbg(DBG_0, "SDTR: Also try WDTR ...\n"); } } pSRB->SRBState &= ~SRB_DO_SYNC_NEGO; @@ -3708,10 +3689,8 @@ struct ScsiReqBlk *pSRB) { struct DeviceCtlBlk *pDCB = pSRB->pSRBDCB; -#ifdef DC395x_DEBUG_KG - printk(DC395X_NAME ": WDTR got rejected from target %02i\n", + dprintkdbg(DBG_KG, "WDTR got rejected from target %02i\n", pDCB->TargetID); -#endif TRACEPRINTF("!W *"); pDCB->SyncPeriod &= ~WIDE_SYNC; pDCB->SyncMode &= ~(WIDE_NEGO_ENABLE); @@ -3722,9 +3701,7 @@ && !(pDCB->SyncMode & SYNC_NEGO_DONE)) { DC395x_Build_SDTR(pACB, pDCB, pSRB); DC395x_ENABLE_MSGOUT; - DEBUG0(printk - (DC395X_NAME ": WDTR(rej): Try SDTR anyway ...\n"); - ) + dprintkdbg(DBG_0, "WDTR(rej): Try SDTR anyway ...\n"); } } @@ -3738,8 +3715,8 @@ pSRB->MsgInBuf[3] = wide; /* Completed */ if (!(pSRB->SRBState & SRB_DO_WIDE_NEGO)) { - printk(DC395X_NAME - ": Target %02i initiates Wide Nego ...\n", + dprintkl(KERN_DEBUG, + "Target %02i initiates Wide Nego ...\n", pDCB->TargetID); memcpy(pSRB->MsgOutBuf, pSRB->MsgInBuf, 4); pSRB->MsgCnt = 4; @@ -3755,18 +3732,15 @@ pSRB->SRBState &= ~SRB_DO_WIDE_NEGO; TRACEPRINTF("W%i *", (pDCB->SyncPeriod & WIDE_SYNC ? 1 : 0)); /*pDCB->SyncMode &= ~(WIDE_NEGO_ENABLE+WIDE_NEGO_DONE); */ -#ifdef DC395x_DEBUG_KG - printk(DC395X_NAME - ": Wide transfers (%i bit) negotiated with target %02i\n", + dprintkdbg(DBG_KG, + "Wide transfers (%i bit) negotiated with target %02i\n", (8 << pSRB->MsgInBuf[3]), pDCB->TargetID); -#endif DC395x_reprog(pACB, pDCB); if ((pDCB->SyncMode & SYNC_NEGO_ENABLE) && !(pDCB->SyncMode & SYNC_NEGO_DONE)) { DC395x_Build_SDTR(pACB, pDCB, pSRB); DC395x_ENABLE_MSGOUT; - DEBUG0(printk(DC395X_NAME ": WDTR: Also try SDTR ...\n"); - ) + dprintkdbg(DBG_0, "WDTR: Also try SDTR ...\n"); } } @@ -3797,17 +3771,14 @@ { struct DeviceCtlBlk *pDCB; -#ifdef DC395x_DEBUG0 - printk(KERN_INFO DC395X_NAME - ": DC395x_MsgInPhase0..............\n "); -#endif + dprintkdbg(DBG_0, "DC395x_MsgInPhase0..............\n"); TRACEPRINTF("MIP0*"); pDCB = pACB->pActiveDCB; pSRB->MsgInBuf[pACB->MsgLen++] = DC395x_read8(TRM_S1040_SCSI_FIFO); if (DC395x_MsgIn_complete(pSRB->MsgInBuf, pACB->MsgLen)) { TRACEPRINTF("(%02x)*", pSRB->MsgInBuf[0]); - /*printk (KERN_INFO DC395X_NAME ": MsgIn:"); */ + /*dprintkl(KERN_INFO, "MsgIn:"); */ /*DC395x_printMsg (pSRB->MsgInBuf, pACB->MsgLen); */ /* Now eval the msg */ @@ -3860,12 +3831,10 @@ /* Discard wide residual */ case MSG_IGNOREWIDE: - DEBUG0(printk - (DC395X_NAME ": Ignore Wide Residual!\n"); - ) - /*DC395x_write32 (TRM_S1040_SCSI_COUNTER, 1); */ - /*DC395x_read8 (TRM_S1040_SCSI_FIFO); */ - break; + dprintkdbg(DBG_0, "Ignore Wide Residual!\n"); + /*DC395x_write32 (TRM_S1040_SCSI_COUNTER, 1); */ + /*DC395x_read8 (TRM_S1040_SCSI_FIFO); */ + break; /* nothing has to be done */ case COMMAND_COMPLETE: @@ -3876,22 +3845,19 @@ * scsi command. Thanks, Gérard, for pointing it out. */ case SAVE_POINTERS: -#ifdef DC395x_DEBUG0 - printk(DC395X_NAME - ": SAVE POINTER message received (pid %li: rem.%i) ... ignore :-(\n", + dprintkdbg(DBG_0, "SAVE POINTER message received (pid %li: rem.%i) ... ignore :-(\n", pSRB->pcmd->pid, pSRB->SRBTotalXferLength); -#endif /*pSRB->Saved_Ptr = pSRB->TotalXferredLen; */ break; /* The device might want to restart transfer with a RESTORE */ case RESTORE_POINTERS: - printk(DC395X_NAME - ": RESTORE POINTER message received ... ignore :-(\n"); + dprintkl(KERN_DEBUG, + "RESTORE POINTER message received ... ignore :-(\n"); /*dc395x_restore_ptr (pACB, pSRB); */ break; case ABORT: - printk(DC395X_NAME - ": ABORT msg received (pid %li %02i-%i)\n", + dprintkl(KERN_DEBUG, + "ABORT msg received (pid %li %02i-%i)\n", pSRB->pcmd->pid, pDCB->TargetID, pDCB->TargetLUN); pDCB->DCBFlag |= ABORT_DEV_; @@ -3900,8 +3866,7 @@ /* reject unknown messages */ default: if (pSRB->MsgInBuf[0] & IDENTIFY_BASE) { - printk(DC395X_NAME - ": Identify Message received?\n"); + dprintkl(KERN_DEBUG, "Identify Message received?\n"); /*TRACEOUT (" %s\n", pSRB->debugtrace); */ pSRB->MsgCnt = 1; pSRB->MsgOutBuf[0] = pDCB->IdentifyMsg; @@ -3944,10 +3909,7 @@ DC395x_MsgInPhase1(struct AdapterCtlBlk *pACB, struct ScsiReqBlk *pSRB, u16 * pscsi_status) { -#ifdef DC395x_DEBUG0 - printk(KERN_INFO DC395X_NAME - ": DC395x_MsgInPhase1..............\n "); -#endif + dprintkdbg(DBG_0, "DC395x_MsgInPhase1..............\n"); TRACEPRINTF("MIP1 *"); DC395x_clrfifo(pACB, "MIP1"); DC395x_write32(TRM_S1040_SCSI_COUNTER, 1); @@ -4050,14 +4012,10 @@ struct DeviceCtlBlk *pDCB; struct ScsiReqBlk *pSRB; -#ifdef DC395x_DEBUG0 - printk(KERN_INFO DC395X_NAME ": Disconnect (pid=%li)\n", - pACB->pActiveDCB->pActiveSRB->pcmd->pid); -#endif + dprintkdbg(DBG_0, "Disconnect (pid=%li)\n", pACB->pActiveDCB->pActiveSRB->pcmd->pid); pDCB = pACB->pActiveDCB; if (!pDCB) { - printk(KERN_ERR DC395X_NAME - ": Disc: Exception Disconnect pDCB=NULL !!\n "); + dprintkl(KERN_ERR, "Disc: Exception Disconnect pDCB=NULL !!\n "); udelay(500); /* Suspend queue for a while */ pACB->pScsiHost->last_reset = @@ -4077,8 +4035,7 @@ DC395x_clrfifo(pACB, "Disc"); DC395x_write16(TRM_S1040_SCSI_CONTROL, DO_HWRESELECT); if (pSRB->SRBState & SRB_UNEXPECT_RESEL) { - printk(KERN_ERR DC395X_NAME - ": Disc: Unexpected Reselection (%i-%i)\n", + dprintkl(KERN_ERR, "Disc: Unexpected Reselection (%i-%i)\n", pDCB->TargetID, pDCB->TargetLUN); pSRB->SRBState = 0; DC395x_Waiting_process(pACB); @@ -4086,7 +4043,7 @@ /*Scsi_Cmnd* pcmd = pSRB->pcmd; */ pDCB->DCBFlag &= ~ABORT_DEV_; pACB->pScsiHost->last_reset = jiffies + HZ / 2 + 1; - printk(KERN_ERR DC395X_NAME ": Disc: SRB_ABORT_SENT!\n"); + dprintkl(KERN_ERR, "Disc: SRB_ABORT_SENT!\n"); DC395x_DoingSRB_Done(pACB, DID_ABORT, pSRB->pcmd, 1); DC395x_Query_to_Waiting(pACB); DC395x_Waiting_process(pACB); @@ -4102,8 +4059,7 @@ if (pSRB->SRBState != SRB_START_ && pSRB->SRBState != SRB_MSGOUT) { pSRB->SRBState = SRB_READY; - printk(DC395X_NAME - ": Unexpected Disconnection (pid %li)!\n", + dprintkl(KERN_DEBUG, "Unexpected Disconnection (pid %li)!\n", pSRB->pcmd->pid); pSRB->TargetStatus = SCSI_STAT_SEL_TIMEOUT; TRACEPRINTF("UnExpD *"); @@ -4112,12 +4068,10 @@ } else { /* Normal selection timeout */ TRACEPRINTF("SlTO *"); -#ifdef DC395x_DEBUG_KG - printk(DC395X_NAME - ": Disc: SelTO (pid=%li) for dev %02i-%i\n", + dprintkdbg(DBG_KG, + "Disc: SelTO (pid=%li) for dev %02i-%i\n", pSRB->pcmd->pid, pDCB->TargetID, pDCB->TargetLUN); -#endif if (pSRB->RetryCnt++ > DC395x_MAX_RETRIES || pACB->scan_devices) { pSRB->TargetStatus = @@ -4126,10 +4080,8 @@ } DC395x_freetag(pDCB, pSRB); DC395x_Going_to_Waiting(pDCB, pSRB); -#ifdef DC395x_DEBUG_KG - printk(DC395X_NAME ": Retry pid %li ...\n", + dprintkdbg(DBG_KG, "Retry pid %li ...\n", pSRB->pcmd->pid); -#endif DC395x_waiting_timer(pACB, HZ / 20); } } else if (pSRB->SRBState & SRB_DISCONNECT) { @@ -4137,16 +4089,13 @@ /* * SRB_DISCONNECT (This is what we expect!) */ - /* printk (DC395X_NAME ": DoWaitingSRB (pid=%li)\n", pSRB->pcmd->pid); */ + /* dprintkl(KERN_DEBUG, "DoWaitingSRB (pid=%li)\n", pSRB->pcmd->pid); */ TRACEPRINTF("+*"); if (bval & 0x40) { - DEBUG0(printk - (DC395X_NAME - ": Debug: DISC: SCSI bus stat %02x: ACK set! Other controllers?\n", + dprintkdbg(DBG_0, "Debug: DISC: SCSI bus stat %02x: ACK set! Other controllers?\n", bval); - ) - /* It could come from another initiator, therefore don't do much ! */ - TRACEPRINTF("ACK(%02x) *", bval); + /* It could come from another initiator, therefore don't do much ! */ + TRACEPRINTF("ACK(%02x) *", bval); /*DC395x_dumpinfo (pACB, pDCB, pSRB); */ /*TRACEOUT (" %s\n", pSRB->debugtrace); */ /*pDCB->DCBFlag |= ABORT_DEV_; */ @@ -4162,7 +4111,7 @@ DC395x_freetag(pDCB, pSRB); pDCB->pActiveSRB = 0; pSRB->SRBState = SRB_FREE; - /*printk (DC395X_NAME ": done (pid=%li)\n", pSRB->pcmd->pid); */ + /*dprintkl(KERN_DEBUG, "done (pid=%li)\n", pSRB->pcmd->pid); */ DC395x_SRBdone(pACB, pDCB, pSRB); } } @@ -4184,9 +4133,7 @@ u8 id, lun; u8 arblostflag = 0; -#ifdef DC395x_DEBUG0 - printk(KERN_INFO DC395X_NAME ": DC395x_Reselect..............\n "); -#endif + dprintkdbg(DBG_0, "DC395x_Reselect..............\n"); DC395x_clrfifo(pACB, "Resel"); /*DC395x_write16(TRM_S1040_SCSI_CONTROL, DO_HWRESELECT | DO_DATALATCH); */ @@ -4196,20 +4143,17 @@ if (pDCB) { /* Arbitration lost but Reselection win */ pSRB = pDCB->pActiveSRB; if (!pSRB) { - printk(DC395X_NAME - ": Arb lost Resel won, but pActiveSRB == 0!\n"); + dprintkl(KERN_DEBUG, "Arb lost Resel won, but pActiveSRB == 0!\n"); DC395x_write16(TRM_S1040_SCSI_CONTROL, DO_DATALATCH); /* it's important for atn stop */ return; } /* Why the if ? */ if (!(pACB->scan_devices)) { -#ifdef DC395x_DEBUG_KG - printk(DC395X_NAME - ": Arb lost but Resel win pid %li (%02i-%i) Rsel %04x Stat %04x\n", + dprintkdbg(DBG_KG, + "Arb lost but Resel win pid %li (%02i-%i) Rsel %04x Stat %04x\n", pSRB->pcmd->pid, pDCB->TargetID, pDCB->TargetLUN, RselTarLunId, DC395x_read16(TRM_S1040_SCSI_STATUS)); -#endif TRACEPRINTF("ArbLResel!*"); /*TRACEOUT (" %s\n", pSRB->debugtrace); */ arblostflag = 1; @@ -4225,15 +4169,13 @@ } /* Read Reselected Target Id and LUN */ if (!(RselTarLunId & (IDENTIFY_BASE << 8))) - printk(DC395X_NAME - ": Resel expects identify msg! Got %04x!\n", + dprintkl(KERN_DEBUG, "Resel expects identify msg! Got %04x!\n", RselTarLunId); id = RselTarLunId & 0xff; lun = (RselTarLunId >> 8) & 7; pDCB = DC395x_findDCB(pACB, id, lun); if (!pDCB) { - printk(KERN_ERR DC395X_NAME - ": Reselect from non existing device (%02i-%i)\n", + dprintkl(KERN_ERR, "Reselect from non existing device (%02i-%i)\n", id, lun); DC395x_write16(TRM_S1040_SCSI_CONTROL, DO_DATALATCH); /* it's important for atn stop */ return; @@ -4242,21 +4184,20 @@ pACB->pActiveDCB = pDCB; if (!(pDCB->DevMode & NTC_DO_DISCONNECT)) - printk(DC395X_NAME - ": Reselection in spite of forbidden disconnection? (%02i-%i)\n", + dprintkl(KERN_DEBUG, "Reselection in spite of forbidden disconnection? (%02i-%i)\n", pDCB->TargetID, pDCB->TargetLUN); if ((pDCB->SyncMode & EN_TAG_QUEUEING) /*&& !arblostflag */ ) { struct ScsiReqBlk *oldSRB = pSRB; pSRB = pACB->pTmpSRB; -#ifdef DC395x_DEBUGTRACE +#if debug_enabled(DBG_TRACE|DBG_TRACEALL) pSRB->debugpos = 0; pSRB->debugtrace[0] = 0; #endif pDCB->pActiveSRB = pSRB; if (oldSRB) TRACEPRINTF("ArbLResel(%li):*", oldSRB->pcmd->pid); - /*if (arblostflag) printk (DC395X_NAME ": Reselect: Wait for Tag ... \n"); */ + /*if (arblostflag) dprintkl(KERN_DEBUG, "Reselect: Wait for Tag ... \n"); */ } else { /* There can be only one! */ pSRB = pDCB->pActiveSRB; @@ -4266,8 +4207,8 @@ /* * abort command */ - printk(DC395X_NAME - ": Reselected w/o disconnected cmds from %02i-%i?\n", + dprintkl(KERN_DEBUG, + "Reselected w/o disconnected cmds from %02i-%i?\n", pDCB->TargetID, pDCB->TargetLUN); pSRB = pACB->pTmpSRB; pSRB->SRBState = SRB_UNEXPECT_RESEL; @@ -4307,14 +4248,12 @@ { struct DeviceCtlBlk *pPrevDCB = pACB->pLinkDCB; + dprintkdbg(DBG_0, "remove_dev\n"); if (pDCB->GoingSRBCnt > 1) { - DCBDEBUG(printk - (KERN_INFO DC395X_NAME - ": Driver won't free DCB (ID %i, LUN %i): 0x%08x because of SRBCnt %i\n", + dprintkdbg(DBG_DCB, "Driver won't free DCB (ID %i, LUN %i): 0x%08x because of SRBCnt %i\n", pDCB->TargetID, pDCB->TargetLUN, (int) pDCB, pDCB->GoingSRBCnt); - ) - return; + return; } pACB->DCBmap[pDCB->TargetID] &= ~(1 << pDCB->TargetLUN); pACB->children[pDCB->TargetID][pDCB->TargetLUN] = NULL; @@ -4335,19 +4274,16 @@ pACB->pLastDCB = pPrevDCB; } - DCBDEBUG(printk - (KERN_INFO DC395X_NAME - ": Driver about to free DCB (ID %i, LUN %i): %p\n", + dprintkdbg(DBG_DCB, "Driver about to free DCB (ID %i, LUN %i): %p\n", pDCB->TargetID, pDCB->TargetLUN, pDCB); - ) - if (pDCB == pACB->pActiveDCB) + if (pDCB == pACB->pActiveDCB) pACB->pActiveDCB = 0; if (pDCB == pACB->pLinkDCB) pACB->pLinkDCB = pDCB->pNextDCB; if (pDCB == pACB->pDCBRunRobin) pACB->pDCBRunRobin = pDCB->pNextDCB; pACB->DCBCnt--; - KFREE(pDCB); + dc395x_kfree(pDCB); /* pACB->DeviceCnt--; */ } @@ -4414,29 +4350,23 @@ dir = scsi_to_pci_dma_dir(pcmd->sc_data_direction); if (pcmd->use_sg && dir != PCI_DMA_NONE) { /* unmap DC395x SG list */ -#ifdef DC395x_SGPARANOIA - printk(DC395X_NAME - ": Unmap SG descriptor list %08x (%05x)\n", + dprintkdbg(DBG_SGPARANOIA, + "Unmap SG descriptor list %08x (%05x)\n", pSRB->SRBSGBusAddr, sizeof(struct SGentry) * DC395x_MAX_SG_LISTENTRY); -#endif pci_unmap_single(pACB->pdev, pSRB->SRBSGBusAddr, sizeof(struct SGentry) * DC395x_MAX_SG_LISTENTRY, PCI_DMA_TODEVICE); -#ifdef DC395x_SGPARANOIA - printk(DC395X_NAME ": Unmap %i SG segments from %p\n", + dprintkdbg(DBG_SGPARANOIA, "Unmap %i SG segments from %p\n", pcmd->use_sg, pcmd->request_buffer); -#endif /* unmap the sg segments */ pci_unmap_sg(pACB->pdev, (struct scatterlist *) pcmd->request_buffer, pcmd->use_sg, dir); } else if (pcmd->request_buffer && dir != PCI_DMA_NONE) { -#ifdef DC395x_SGPARANOIA - printk(DC395X_NAME ": Unmap buffer at %08x (%05x)\n", + dprintkdbg(DBG_SGPARANOIA, "Unmap buffer at %08x (%05x)\n", pSRB->SegmentX[0].address, pcmd->request_bufflen); -#endif pci_unmap_single(pACB->pdev, pSRB->SegmentX[0].address, pcmd->request_bufflen, dir); } @@ -4454,10 +4384,8 @@ if (!(pSRB->SRBFlag & AUTO_REQSENSE)) return; /* Unmap sense buffer */ -#ifdef DC395x_SGPARANOIA - printk(DC395X_NAME ": Unmap sense buffer from %08x (%05x)\n", - pSRB->SegmentX[0].address, sizeof(pcmd->sense_buffer)); -#endif + dprintkdbg(DBG_SGPARANOIA, "Unmap sense buffer from %08x\n", + pSRB->SegmentX[0].address); pci_unmap_single(pACB->pdev, pSRB->SegmentX[0].address, pSRB->SegmentX[0].length, PCI_DMA_FROMDEVICE); /* Restore SG stuff */ @@ -4497,22 +4425,16 @@ ptr = (struct ScsiInqData *) CPU_ADDR(*(struct scatterlist *) ptr); -#ifdef DC395x_SGPARANOIA - printk(KERN_INFO DC395X_NAME - ": SRBdone SG=%i (%i/%i), req_buf = %p, adr = %p\n", + dprintkdbg(DBG_SGPARANOIA, + "SRBdone SG=%i (%i/%i), req_buf = %p, adr = %p\n", pcmd->use_sg, pSRB->SRBSGIndex, pSRB->SRBSGCount, pcmd->request_buffer, ptr); -#endif -#ifdef DC395x_DEBUG_KG - printk(KERN_INFO DC395X_NAME - ": SRBdone (pid %li, target %02i-%i): ", pSRB->pcmd->pid, + dprintkdbg(DBG_KG, + "SRBdone (pid %li, target %02i-%i): ", pSRB->pcmd->pid, pSRB->pcmd->device->id, pSRB->pcmd->device->lun); -#endif status = pSRB->TargetStatus; if (pSRB->SRBFlag & AUTO_REQSENSE) { -#ifdef DC395x_DEBUG0 - printk(KERN_INFO "AUTO_REQSENSE1..............\n "); -#endif + dprintkdbg(DBG_0, "AUTO_REQSENSE1..............\n"); DC395x_pci_unmap_sense(pACB, pSRB); /* ** target status.......................... @@ -4520,60 +4442,58 @@ pSRB->SRBFlag &= ~AUTO_REQSENSE; pSRB->AdaptStatus = 0; pSRB->TargetStatus = CHECK_CONDITION << 1; -#ifdef DC395x_DEBUG_KG - switch (pcmd->sense_buffer[2] & 0x0f) { - case NOT_READY: - printk - ("\nDC395x: ReqSense: NOT_READY (Cmnd = 0x%02x, Dev = %i-%i, Stat = %i, Scan = %i) ", - pcmd->cmnd[0], pDCB->TargetID, - pDCB->TargetLUN, status, pACB->scan_devices); - break; - case UNIT_ATTENTION: - printk - ("\nDC395x: ReqSense: UNIT_ATTENTION (Cmnd = 0x%02x, Dev = %i-%i, Stat = %i, Scan = %i) ", - pcmd->cmnd[0], pDCB->TargetID, - pDCB->TargetLUN, status, pACB->scan_devices); - break; - case ILLEGAL_REQUEST: - printk - ("\nDC395x: ReqSense: ILLEGAL_REQUEST (Cmnd = 0x%02x, Dev = %i-%i, Stat = %i, Scan = %i) ", - pcmd->cmnd[0], pDCB->TargetID, - pDCB->TargetLUN, status, pACB->scan_devices); - break; - case MEDIUM_ERROR: - printk - ("\nDC395x: ReqSense: MEDIUM_ERROR (Cmnd = 0x%02x, Dev = %i-%i, Stat = %i, Scan = %i) ", - pcmd->cmnd[0], pDCB->TargetID, - pDCB->TargetLUN, status, pACB->scan_devices); - break; - case HARDWARE_ERROR: - printk - ("\nDC395x: ReqSense: HARDWARE_ERROR (Cmnd = 0x%02x, Dev = %i-%i, Stat = %i, Scan = %i) ", - pcmd->cmnd[0], pDCB->TargetID, - pDCB->TargetLUN, status, pACB->scan_devices); - break; + if (debug_enabled(DBG_KG)) { + switch (pcmd->sense_buffer[2] & 0x0f) { + case NOT_READY: + dprintkl(KERN_DEBUG, + "ReqSense: NOT_READY (Cmnd = 0x%02x, Dev = %i-%i, Stat = %i, Scan = %i) ", + pcmd->cmnd[0], pDCB->TargetID, + pDCB->TargetLUN, status, pACB->scan_devices); + break; + case UNIT_ATTENTION: + dprintkl(KERN_DEBUG, + "ReqSense: UNIT_ATTENTION (Cmnd = 0x%02x, Dev = %i-%i, Stat = %i, Scan = %i) ", + pcmd->cmnd[0], pDCB->TargetID, + pDCB->TargetLUN, status, pACB->scan_devices); + break; + case ILLEGAL_REQUEST: + dprintkl(KERN_DEBUG, + "ReqSense: ILLEGAL_REQUEST (Cmnd = 0x%02x, Dev = %i-%i, Stat = %i, Scan = %i) ", + pcmd->cmnd[0], pDCB->TargetID, + pDCB->TargetLUN, status, pACB->scan_devices); + break; + case MEDIUM_ERROR: + dprintkl(KERN_DEBUG, + "ReqSense: MEDIUM_ERROR (Cmnd = 0x%02x, Dev = %i-%i, Stat = %i, Scan = %i) ", + pcmd->cmnd[0], pDCB->TargetID, + pDCB->TargetLUN, status, pACB->scan_devices); + break; + case HARDWARE_ERROR: + dprintkl(KERN_DEBUG, + "ReqSense: HARDWARE_ERROR (Cmnd = 0x%02x, Dev = %i-%i, Stat = %i, Scan = %i) ", + pcmd->cmnd[0], pDCB->TargetID, + pDCB->TargetLUN, status, pACB->scan_devices); + break; + } + if (pcmd->sense_buffer[7] >= 6) + dprintkl(KERN_DEBUG, + "Sense=%02x, ASC=%02x, ASCQ=%02x (%08x %08x) ", + pcmd->sense_buffer[2], pcmd->sense_buffer[12], + pcmd->sense_buffer[13], + *((unsigned int *) (pcmd->sense_buffer + 3)), + *((unsigned int *) (pcmd->sense_buffer + 8))); + else + dprintkl(KERN_DEBUG, + "Sense=%02x, No ASC/ASCQ (%08x) ", + pcmd->sense_buffer[2], + *((unsigned int *) (pcmd->sense_buffer + 3))); } - if (pcmd->sense_buffer[7] >= 6) - printk - ("\nDC395x: Sense=%02x, ASC=%02x, ASCQ=%02x (%08x %08x) ", - pcmd->sense_buffer[2], pcmd->sense_buffer[12], - pcmd->sense_buffer[13], - *((unsigned int *) (pcmd->sense_buffer + 3)), - *((unsigned int *) (pcmd->sense_buffer + 8))); - else - printk - ("\nDC395x: Sense=%02x, No ASC/ASCQ (%08x) ", - pcmd->sense_buffer[2], - *((unsigned int *) (pcmd->sense_buffer + 3))); -#endif if (status == (CHECK_CONDITION << 1)) { pcmd->result = DID_BAD_TARGET << 16; goto ckc_e; } -#ifdef DC395x_DEBUG0 - printk(KERN_INFO "AUTO_REQSENSE2..............\n "); -#endif + dprintkdbg(DBG_0, "AUTO_REQSENSE2..............\n"); if ((pSRB->SRBTotalXferLength) && (pSRB->SRBTotalXferLength >= pcmd->underflow)) @@ -4680,28 +4600,24 @@ /* This may be interpreted by sb. or not ... */ pcmd->SCp.this_residual = pSRB->SRBTotalXferLength; pcmd->SCp.buffers_residual = 0; -#ifdef DC395x_DEBUG_KG - if (pSRB->SRBTotalXferLength) - printk - ("\nDC395x: pid %li: %02x (%02i-%i): Missed %i bytes\n", - pcmd->pid, pcmd->cmnd[0], pcmd->device->id, - pcmd->device->lun, pSRB->SRBTotalXferLength); -#endif + if (debug_enabled(DBG_KG)) { + if (pSRB->SRBTotalXferLength) + dprintkdbg(DBG_KG, "pid %li: %02x (%02i-%i): Missed %i bytes\n", + pcmd->pid, pcmd->cmnd[0], pcmd->device->id, + pcmd->device->lun, pSRB->SRBTotalXferLength); + } DC395x_Going_remove(pDCB, pSRB, 0); /* Add to free list */ if (pSRB == pACB->pTmpSRB) - printk("\nDC395x: ERROR! Completed Cmnd with TmpSRB!\n"); + dprintkl(KERN_ERR, "ERROR! Completed Cmnd with TmpSRB!\n"); else DC395x_Free_insert(pACB, pSRB); - DEBUG0(printk - (KERN_DEBUG DC395X_NAME ": SRBdone: done pid %li\n", - pcmd->pid); - ) -#ifdef DC395x_DEBUG_KG - printk(" 0x%08x\n", pcmd->result); -#endif + dprintkdbg(DBG_0, "SRBdone: done pid %li\n", pcmd->pid); + if (debug_enabled(DBG_KG)) { + printk(" 0x%08x\n", pcmd->result); + } TRACEPRINTF("%08x(%li)*", pcmd->result, jiffies); DC395x_pci_unmap(pACB, pSRB); /*DC395x_UNLOCK_ACB_NI; */ @@ -4735,7 +4651,7 @@ pDCB = pACB->pLinkDCB; if (!pDCB) return; - printk(KERN_INFO DC395X_NAME ": DC395x_DoingSRB_Done: pids "); + dprintkl(KERN_INFO, "DC395x_DoingSRB_Done: pids "); do { /* As the ML may queue cmnds again, cache old values */ struct ScsiReqBlk *pWaitingSRB = pDCB->pWaitingSRB; @@ -4779,12 +4695,12 @@ pSRB = pSRBTemp; } if (pDCB->pGoingSRB) - printk(DC395X_NAME - ": How could the ML send cmnds to the Going queue? (%02i-%i)!!\n", + dprintkl(KERN_DEBUG, + "How could the ML send cmnds to the Going queue? (%02i-%i)!!\n", pDCB->TargetID, pDCB->TargetLUN); if (pDCB->TagMask) - printk(DC395X_NAME - ": TagMask for %02i-%i should be empty, is %08x!\n", + dprintkl(KERN_DEBUG, + "TagMask for %02i-%i should be empty, is %08x!\n", pDCB->TargetID, pDCB->TargetLUN, pDCB->TagMask); /*pDCB->GoingSRBCnt = 0;; */ @@ -4850,10 +4766,7 @@ { /*u32 drv_flags=0; */ -#ifdef DC395x_DEBUG0 - printk(KERN_INFO DC395X_NAME - ": DC395x_ResetSCSIBus..............\n "); -#endif + dprintkdbg(DBG_0, "DC395x_ResetSCSIBus..............\n"); /*DC395x_DRV_LOCK(drv_flags); */ pACB->ACBFlag |= RESET_DEV; /* RESET_DETECT, RESET_DONE, RESET_DEV */ @@ -4892,7 +4805,7 @@ wval = DC395x_read16(TRM_S1040_DMA_CONFIG) & ~DMA_FIFO_CTRL; wval |= DMA_FIFO_HALF_HALF | DMA_ENHANCE /*| DMA_MEM_MULTI_READ */ ; - /*printk (KERN_INFO DC395X_NAME "DMA_Config: %04x\n", wval); */ + /*dprintkl(KERN_INFO, "DMA_Config: %04x\n", wval); */ DC395x_write16(TRM_S1040_DMA_CONFIG, wval); /* Clear pending interrupt status */ DC395x_read8(TRM_S1040_SCSI_INTSTATUS); @@ -4912,7 +4825,7 @@ */ static void DC395x_ScsiRstDetect(struct AdapterCtlBlk *pACB) { - printk(KERN_INFO DC395X_NAME ": DC395x_ScsiRstDetect\n"); + dprintkl(KERN_INFO, "DC395x_ScsiRstDetect\n"); /* delay half a second */ if (timer_pending(&pACB->Waiting_Timer)) del_timer(&pACB->Waiting_Timer); @@ -4960,11 +4873,9 @@ Scsi_Cmnd *pcmd; pcmd = pSRB->pcmd; -#ifdef DC395x_DEBUG_KG - printk(KERN_INFO DC395X_NAME - ": DC395x_RequestSense for pid %li, target %02i-%i\n", + dprintkdbg(DBG_KG, + "DC395x_RequestSense for pid %li, target %02i-%i\n", pcmd->pid, pcmd->device->id, pcmd->device->lun); -#endif TRACEPRINTF("RqSn*"); pSRB->SRBFlag |= AUTO_REQSENSE; pSRB->AdaptStatus = 0; @@ -4986,17 +4897,15 @@ pSRB->SegmentX[0].address = pci_map_single(pACB->pdev, pcmd->sense_buffer, sizeof(pcmd->sense_buffer), PCI_DMA_FROMDEVICE); -#ifdef DC395x_SGPARANOIA - printk(DC395X_NAME ": Map sense buffer at %p (%05x) to %08x\n", + dprintkdbg(DBG_SGPARANOIA, "Map sense buffer at %p (%05x) to %08x\n", pcmd->sense_buffer, sizeof(pcmd->sense_buffer), pSRB->SegmentX[0].address); -#endif pSRB->SRBSGCount = 1; pSRB->SRBSGIndex = 0; if (DC395x_StartSCSI(pACB, pDCB, pSRB)) { /* Should only happen, if sb. else grabs the bus */ - printk(DC395X_NAME - ": Request Sense failed for pid %li (%02i-%i)!\n", + dprintkl(KERN_DEBUG, + "Request Sense failed for pid %li (%02i-%i)!\n", pSRB->pcmd->pid, pDCB->TargetID, pDCB->TargetLUN); TRACEPRINTF("?*"); DC395x_Going_to_Waiting(pDCB, pSRB); @@ -5025,10 +4934,8 @@ struct DeviceCtlBlk *pDCB; struct DeviceCtlBlk *pDCB2; -#ifdef DC395x_DEBUG0 - printk(KERN_INFO DC395X_NAME ": DC395x_initDCB..............\n "); -#endif - pDCB = KMALLOC(sizeof(struct DeviceCtlBlk), GFP_ATOMIC); + dprintkdbg(DBG_0, "DC395x_initDCB..............\n"); + pDCB = dc395x_kmalloc(sizeof(struct DeviceCtlBlk), GFP_ATOMIC); /*pDCB = DC395x_findDCB (pACB, target, lun); */ *ppDCB = pDCB; pDCB2 = 0; @@ -5098,12 +5005,10 @@ struct DeviceCtlBlk *prevDCB = pACB->pLinkDCB; while (prevDCB->TargetID != pDCB->TargetID) prevDCB = prevDCB->pNextDCB; -#ifdef DC395x_DEBUG_KG - printk(DC395X_NAME - ": Copy settings from %02i-%02i to %02i-%02i\n", + dprintkdbg(DBG_KG, + "Copy settings from %02i-%02i to %02i-%02i\n", prevDCB->TargetID, prevDCB->TargetLUN, pDCB->TargetID, pDCB->TargetLUN); -#endif pDCB->SyncMode = prevDCB->SyncMode; pDCB->SyncPeriod = prevDCB->SyncPeriod; pDCB->MinNegoPeriod = prevDCB->MinNegoPeriod; @@ -5116,18 +5021,18 @@ } -/* Dynamically allocated memory handling */ - -#ifdef DC395x_DEBUGTRACE -/* Memory for trace buffers */ +#if debug_enabled(DBG_TRACE|DBG_TRACEALL) +/* + * Memory for trace buffers + */ void DC395x_free_tracebufs(struct AdapterCtlBlk *pACB, int SRBIdx) { int srbidx; const unsigned bufs_per_page = PAGE_SIZE / DEBUGTRACEBUFSZ; for (srbidx = 0; srbidx < SRBIdx; srbidx += bufs_per_page) { - /*printk (DC395X_NAME ": Free tracebuf %p (for %i)\n", */ + /*dprintkl(KERN_DEBUG, "Free tracebuf %p (for %i)\n", */ /* pACB->SRB_array[srbidx].debugtrace, srbidx); */ - KFREE(pACB->SRB_array[srbidx].debugtrace); + dc395x_kfree(pACB->SRB_array[srbidx].debugtrace); } } @@ -5141,14 +5046,14 @@ int SRBIdx = 0; unsigned i = 0; unsigned char *ptr; - /*printk (DC395X_NAME ": Alloc %i pages for tracebufs\n", pages); */ + /*dprintkl(KERN_DEBUG, "Alloc %i pages for tracebufs\n", pages); */ while (pages--) { - ptr = KMALLOC(PAGE_SIZE, GFP_KERNEL); + ptr = dc395x_kmalloc(PAGE_SIZE, GFP_KERNEL); if (!ptr) { DC395x_free_tracebufs(pACB, SRBIdx); return 1; } - /*printk (DC395X_NAME ": Alloc %li bytes at %p for tracebuf %i\n", */ + /*dprintkl(KERN_DEBUG, "Alloc %li bytes at %p for tracebuf %i\n", */ /* PAGE_SIZE, ptr, SRBIdx); */ i = 0; while (i < bufs_per_page && SRBIdx < DC395x_MAX_SRB_CNT) @@ -5159,23 +5064,23 @@ pACB->TmpSRB.debugtrace = ptr + (i * DEBUGTRACEBUFSZ); pACB->TmpSRB.debugtrace[0] = 0; } else - printk(DC395X_NAME - ": No space for tmpSRB tracebuf reserved?!\n"); + dprintkl(KERN_DEBUG, "No space for tmpSRB tracebuf reserved?!\n"); return 0; } #endif /* Free SG tables */ +static void DC395x_free_SG_tables(struct AdapterCtlBlk *pACB, int SRBIdx) { int srbidx; const unsigned SRBs_per_page = PAGE_SIZE / (DC395x_MAX_SG_LISTENTRY * sizeof(struct SGentry)); for (srbidx = 0; srbidx < SRBIdx; srbidx += SRBs_per_page) { - /*printk (DC395X_NAME ": Free SG segs %p (for %i)\n", */ + /*dprintkl(KERN_DEBUG, "Free SG segs %p (for %i)\n", */ /* pACB->SRB_array[srbidx].SegmentX, srbidx); */ - KFREE(pACB->SRB_array[srbidx].SegmentX); + dc395x_kfree(pACB->SRB_array[srbidx].SegmentX); } } @@ -5194,14 +5099,14 @@ int SRBIdx = 0; unsigned i = 0; struct SGentry *ptr; - /*printk (DC395X_NAME ": Alloc %i pages for SG tables\n", pages); */ + /*dprintkl(KERN_DEBUG, "Alloc %i pages for SG tables\n", pages); */ while (pages--) { - ptr = (struct SGentry *) KMALLOC(PAGE_SIZE, GFP_KERNEL); + ptr = (struct SGentry *) dc395x_kmalloc(PAGE_SIZE, GFP_KERNEL); if (!ptr) { DC395x_free_SG_tables(pACB, SRBIdx); return 1; } - /*printk (DC395X_NAME ": Alloc %li bytes at %p for SG segments %i\n", */ + /*dprintkl(KERN_DEBUG, "Alloc %li bytes at %p for SG segments %i\n", */ /* PAGE_SIZE, ptr, SRBIdx); */ i = 0; while (i < SRBs_per_page && SRBIdx < DC395x_MAX_SRB_CNT) @@ -5212,8 +5117,7 @@ pACB->TmpSRB.SegmentX = ptr + (i * DC395x_MAX_SG_LISTENTRY); else - printk(DC395X_NAME - ": No space for tmpSRB SG table reserved?!\n"); + dprintkl(KERN_DEBUG, "No space for tmpSRB SG table reserved?!\n"); return 0; } @@ -5306,13 +5210,12 @@ * link all device's SRB Q of this adapter */ if (DC395x_alloc_SG_tables(pACB)) { - printk(DC395X_NAME ": SG table allocation failed!\n"); + dprintkl(KERN_DEBUG, "SG table allocation failed!\n"); return 1; } -#ifdef DC395x_DEBUGTRACE +#if debug_enabled(DBG_TRACE|DBG_TRACEALL) if (DC395x_alloc_tracebufs(pACB)) { - printk(DC395X_NAME - ": SG trace buffer allocation failed!\n"); + dprintkl(KERN_DEBUG, "SG trace buffer allocation failed!\n"); DC395x_free_SG_tables(pACB, DC395x_MAX_SRB_CNT); return 1; } @@ -5329,15 +5232,11 @@ for (i = 0; i < DC395x_MAX_SCSI_ID; i++) pACB->DCBmap[i] = 0; -#ifdef DC395x_DEBUG0 - printk(KERN_INFO DC395X_NAME - ": pACB = %p, pDCBmap = %p, pSRB_array = %p\n", pACB, + dprintkdbg(DBG_0, "pACB = %p, pDCBmap = %p, pSRB_array = %p\n", pACB, pACB->DCBmap, pACB->SRB_array); - printk(KERN_INFO DC395X_NAME - ": ACB size= %04lx, DCB size= %04lx, SRB size= %04lx\n", + dprintkdbg(DBG_0, "ACB size= %04x, DCB size= %04x, SRB size= %04x\n", sizeof(struct AdapterCtlBlk), sizeof(struct DeviceCtlBlk), sizeof(struct ScsiReqBlk)); -#endif return 0; } @@ -5374,16 +5273,14 @@ } if (!request_region(io_port, host->n_io_port, DC395X_NAME)) { - printk(KERN_ERR DC395X_NAME - ": Failed to reserve IO region 0x%x\n", io_port); + dprintkl(KERN_ERR, "Failed to reserve IO region 0x%x\n", io_port); return -1; } if (!used_irq) { if (request_irq (irq, DC395x_Interrupt, SA_SHIRQ, DC395X_NAME, (void *) host->hostdata)) { - printk(KERN_INFO DC395X_NAME - ": Failed to register IRQ!\n"); + dprintkl(KERN_INFO, "Failed to register IRQ!\n"); return -1; } } @@ -5414,8 +5311,7 @@ pACB->Config |= HCC_SCSI_RESET; if (pACB->Config & HCC_SCSI_RESET) { - printk(KERN_INFO DC395X_NAME - ": Performing initial SCSI bus reset\n"); + dprintkl(KERN_INFO, "Performing initial SCSI bus reset\n"); DC395x_write8(TRM_S1040_SCSI_CONTROL, DO_RSTSCSI); /*while (!( DC395x_read8(TRM_S1040_SCSI_INTSTATUS) & INT_SCSIRESET )); */ @@ -5691,11 +5587,11 @@ cksum += *w_eeprom; if (cksum != 0x1234) { /* - * Checksum is wrong. + * Checksum is wrong. * Load a set of defaults into the eeprom buffer */ - printk(KERN_WARNING DC395X_NAME - ": EEProm checksum error: using default values and options.\n"); + dprintkl(KERN_WARNING, + "EEProm checksum error: using default values and options.\n"); eeprom->NvramSubVendorID[0] = (u8) PCI_VENDOR_ID_TEKRAM; eeprom->NvramSubVendorID[1] = (u8) (PCI_VENDOR_ID_TEKRAM >> 8); @@ -5723,8 +5619,8 @@ *d_eeprom = 0x00; /* Now load defaults (maybe set by boot/module params) */ - DC395x_check_for_safe_settings(); - DC395x_fill_with_defaults(); + set_safe_settings(); + fix_settings(); DC395x_EEprom_Override(eeprom); eeprom->NvramCheckSum = 0x00; @@ -5734,16 +5630,16 @@ *w_eeprom = 0x1234 - cksum; TRM_S1040_write_all(eeprom, io_port); - eeprom->NvramDelayTime = dc395x_trm[5]; + eeprom->NvramDelayTime = cfg_data[CFG_RESET_DELAY].value; } else { - DC395x_check_for_safe_settings(); - DC395x_interpret_delay(eeprom); + set_safe_settings(); + eeprom_index_to_delay(eeprom); DC395x_EEprom_Override(eeprom); } } -/* +/* * adapter - print connection and terminiation config * * @param pACB - adapter control block @@ -5753,7 +5649,7 @@ u8 bval; bval = DC395x_read8(TRM_S1040_GEN_STATUS); - printk(KERN_INFO DC395X_NAME "%c: Connectors: ", + dprintkl(KERN_INFO, "%c: Connectors: ", ((bval & WIDESCSI) ? 'W' : ' ')); if (!(bval & CON5068)) printk("ext%s ", !(bval & EXT68HIGH) ? "68" : "50"); @@ -5780,6 +5676,29 @@ } +/** + * DC395x_print_eeprom_settings - output the eeprom settings + * to the kernel log so people can see what they were. + * + * @index: Adapter number + **/ +static void __init +DC395x_print_eeprom_settings(u16 index) +{ + dprintkl(KERN_INFO, "Used settings: AdapterID=%02i, Speed=%i(%02i.%01iMHz), DevMode=0x%02x\n", + dc395x_trm_eepromBuf[index].NvramScsiId, + dc395x_trm_eepromBuf[index].NvramTarget[0].NvmTarPeriod, + dc395x_clock_speed[dc395x_trm_eepromBuf[index].NvramTarget[0].NvmTarPeriod] / 10, + dc395x_clock_speed[dc395x_trm_eepromBuf[index].NvramTarget[0].NvmTarPeriod] % 10, + dc395x_trm_eepromBuf[index].NvramTarget[0].NvmTarCfg0); + dprintkl(KERN_INFO, " AdaptMode=0x%02x, Tags=%i(%02i), DelayReset=%is\n", + dc395x_trm_eepromBuf[index].NvramChannelCfg, + dc395x_trm_eepromBuf[index].NvramMaxTag, + 1 << dc395x_trm_eepromBuf[index].NvramMaxTag, + dc395x_trm_eepromBuf[index].NvramDelayTime); +} + + /* ********************************************************************* * DC395x_detect @@ -5804,124 +5723,44 @@ */ DC395x_check_eeprom(&dc395x_trm_eepromBuf[index], (u16) io_port); - /*$$$$$$$$$$$ MEMORY ALLOCATE FOR ADAPTER CONTROL BLOCK $$$$$$$$$$$$ */ + /* + *$$$$$$$$$$$ MEMORY ALLOCATE FOR ADAPTER CONTROL BLOCK $$$$$$$$$$$$ + */ host = scsi_register(host_template, sizeof(struct AdapterCtlBlk)); if (!host) { - printk(KERN_INFO DC395X_NAME - " : pSH scsi_register ERROR\n"); + dprintkl(KERN_INFO, "pSH scsi_register ERROR\n"); return 0; } - printk(KERN_INFO DC395X_NAME - ": Used settings: AdapterID=%02i, Speed=%i(%02i.%01iMHz), DevMode=0x%02x\n", - dc395x_trm_eepromBuf[index].NvramScsiId, - dc395x_trm_eepromBuf[index].NvramTarget[0].NvmTarPeriod, - dc395x_clock_speed[dc395x_trm_eepromBuf[index]. - NvramTarget[0].NvmTarPeriod] / 10, - dc395x_clock_speed[dc395x_trm_eepromBuf[index]. - NvramTarget[0].NvmTarPeriod] % 10, - dc395x_trm_eepromBuf[index].NvramTarget[0].NvmTarCfg0); - printk(KERN_INFO DC395X_NAME - ": AdaptMode=0x%02x, Tags=%i(%02i), DelayReset=%is\n", - dc395x_trm_eepromBuf[index].NvramChannelCfg, - dc395x_trm_eepromBuf[index].NvramMaxTag, - 1 << dc395x_trm_eepromBuf[index].NvramMaxTag, - dc395x_trm_eepromBuf[index].NvramDelayTime); + DC395x_print_eeprom_settings(index); pACB = (struct AdapterCtlBlk *) host->hostdata; - /*DC395x_ACB_INITLOCK(pACB); */ - /*DC395x_ACB_LOCK(pACB,acb_flags); */ - /*$$$$$$$$ INITIAL ADAPTER CONTROL BLOCK $$$$$$$$$$$$ */ + if (DC395x_initACB(host, io_port, irq, index)) { scsi_unregister(host); - /*DC395x_ACB_UNLOCK(pACB,acb_flags); */ return 0; } DC395x_print_config(pACB); - /*$$$$$$$$$$$$$$$$$ INITIAL ADAPTER $$$$$$$$$$$$$$$$$ */ + + /* + *$$$$$$$$$$$$$$$$$ INITIAL ADAPTER $$$$$$$$$$$$$$$$$ + */ if (!DC395x_initAdapter(host, io_port, irq, index)) { if (!DC395x_pACB_start) { DC395x_pACB_start = pACB; - DC395x_pACB_current = pACB; - pACB->pNextACB = NULL; } else { DC395x_pACB_current->pNextACB = pACB; - DC395x_pACB_current = pACB; - pACB->pNextACB = NULL; } - /*DC395x_ACB_UNLOCK(pACB,acb_flags); */ - return host; + DC395x_pACB_current = pACB; + pACB->pNextACB = NULL; + } else { - printk(KERN_INFO DC395X_NAME - ": DC395x_initAdapter initial ERROR\n"); + dprintkl(KERN_INFO, "DC395x_initAdapter initial ERROR\n"); scsi_unregister(host); - /*DC395x_ACB_UNLOCK(pACB,acb_flags); */ - return 0; - } -} - - -/* - * DC395x_detect - * - * Detect TRM-S1040 cards, acquire resources and initialise the card. - * Argument is a pointer to the host driver's scsi_hosts entry. - * - * Returns the number of adapters found. - * - * This function is called during system initialization and must not - * call SCSI mid-level functions including scsi_malloc() and - * scsi_free(). - */ -static int __init DC395x_detect(Scsi_Host_Template * host_template) -{ - struct pci_dev *pdev = NULL; - unsigned int io_port; - u8 irq; - DC395x_pACB_start = NULL; - - /* without PCI we cannot do anything */ - if (pci_present() == 0) { - printk(KERN_INFO DC395X_NAME ": PCI not present\n"); - return 0; + host = NULL; } - printk(KERN_INFO DC395X_NAME ": %s %s\n", DC395X_BANNER, - DC395X_VERSION); - - while ((pdev = - pci_find_device(PCI_VENDOR_ID_TEKRAM, - PCI_DEVICE_ID_TEKRAM_TRMS1040, pdev))) { - struct Scsi_Host *scsi_host; - if (pci_enable_device(pdev)) - continue; - - io_port = - pci_resource_start(pdev, 0) & PCI_BASE_ADDRESS_IO_MASK; - irq = pdev->irq; -#ifdef DC395x_DEBUG0 - printk(KERN_INFO DC395X_NAME ": IO_PORT=%04x,IRQ=%x\n", - (unsigned int) io_port, irq); -#endif - if ((scsi_host = - DC395x_init(host_template, io_port, irq, - DC395x_adapterCnt))) { - pci_set_master(pdev); - ((struct AdapterCtlBlk *) (scsi_host->hostdata))-> - pdev = pdev; - /*DC395x_set_pci_cfg(pdev); */ - DC395x_adapterCnt++; - } - } - - if (DC395x_adapterCnt) { - host_template->proc_name = DC395X_NAME; - } - printk(KERN_INFO DC395X_NAME ": %s: %i adapters found\n", - DC395X_BANNER, DC395x_adapterCnt); - - return DC395x_adapterCnt; + return host; } - /* * Functions: DC395x_inquiry(), DC395x_inquiry_done() * @@ -5935,11 +5774,11 @@ (struct AdapterCtlBlk *) cmd->device->host->hostdata; struct DeviceCtlBlk *pDCB = DC395x_findDCB(pACB, cmd->device->id, cmd->device->lun); -#ifdef DC395x_DEBUGTRACE +#if debug_enabled(DBG_TRACE|DBG_TRACEALL) struct ScsiReqBlk *pSRB = pACB->pFreeSRB; #endif - printk(KERN_INFO DC395X_NAME - ": INQUIRY (%02i-%i) returned %08x: %02x %02x %02x %02x ...\n", + dprintkl(KERN_INFO, + "INQUIRY (%02i-%i) returned %08x: %02x %02x %02x %02x ...\n", cmd->device->id, cmd->device->lun, cmd->result, ((u8 *) cmd->request_buffer)[0], ((u8 *) cmd->request_buffer)[1], @@ -5947,7 +5786,7 @@ ((u8 *) cmd->request_buffer)[3]); /*TRACEOUT ("%s\n", pSRB->debugtrace); */ if (cmd->result) { - printk(DC395X_NAME ": Unsetting Wide, Sync and TagQ!\n"); + dprintkl(KERN_INFO, "Unsetting Wide, Sync and TagQ!\n"); if (pDCB) { TRACEOUT("%s\n", pSRB->debugtrace); pDCB->DevMode &= @@ -5965,8 +5804,8 @@ pDCB->SyncMode &= ~WIDE_NEGO_ENABLE; } } else { - printk(DC395X_NAME - ": ERROR! No DCB existent for %02i-%i ?\n", + dprintkl(KERN_ERR, + "ERROR! No DCB existent for %02i-%i ?\n", cmd->device->id, cmd->device->lun); } kfree(cmd->buffer); @@ -5981,15 +5820,15 @@ { char *buffer; Scsi_Cmnd *cmd; - cmd = KMALLOC(sizeof(Scsi_Cmnd), GFP_ATOMIC); + cmd = dc395x_kmalloc(sizeof(Scsi_Cmnd), GFP_ATOMIC); if (!cmd) { - printk(DC395X_NAME ": kmalloc failed in inquiry!\n"); + dprintkl(KERN_ERR, "kmalloc failed in inquiry!\n"); return; } buffer = kmalloc(256, GFP_ATOMIC); if (!buffer) { kfree(cmd); - printk(DC395X_NAME ": kmalloc failed in inquiry!\n"); + dprintkl(KERN_ERR, "kmalloc failed in inquiry!\n"); return; } @@ -6022,8 +5861,8 @@ pDCB->SyncMode |= SYNC_NEGO_ENABLE; pDCB->SyncMode &= ~WIDE_NEGO_DONE; pDCB->SyncMode |= WIDE_NEGO_ENABLE; - printk(KERN_INFO DC395X_NAME - ": Queue INQUIRY command to dev %02i-%i\n", pDCB->TargetID, + dprintkl(KERN_INFO, + "Queue INQUIRY command to dev %02i-%i\n", pDCB->TargetID, pDCB->TargetLUN); DC395x_queue_command(cmd, DC395x_inquiry_done); } @@ -6182,7 +6021,7 @@ pDCB->TargetID, pDCB->TargetLUN, pDCB->GoingSRBCnt); for (pSRB = pDCB->pGoingSRB; pSRB; pSRB = pSRB->pNextSRB) -#ifdef DC395x_DEBUGTRACE +#if debug_enabled(DBG_TRACE|DBG_TRACEALL) SPRINTF("\n %s", pSRB->debugtrace); #else SPRINTF(" %li", pSRB->pcmd->pid); @@ -6192,14 +6031,14 @@ pDCB = pDCB->pNextDCB; } -#ifdef DC395x_DEBUGDCB - SPRINTF("DCB list for ACB %p:\n", pACB); - pDCB = pACB->pLinkDCB; - SPRINTF("%p", pDCB); - for (dev = 0; dev < pACB->DCBCnt; dev++, pDCB = pDCB->pNextDCB) - SPRINTF("->%p", pDCB->pNextDCB); - SPRINTF("\n"); -#endif + if (debug_enabled(DBG_DCB)) { + SPRINTF("DCB list for ACB %p:\n", pACB); + pDCB = pACB->pLinkDCB; + SPRINTF("%p", pDCB); + for (dev = 0; dev < pACB->DCBCnt; dev++, pDCB = pDCB->pNextDCB) + SPRINTF("->%p", pDCB->pNextDCB); + SPRINTF("\n"); + } *start = buffer + offset; DC395x_UNLOCK_IO(pACB->pScsiHost); @@ -6213,135 +6052,224 @@ } -/* - * Function : int DC395x_shutdown (struct Scsi_Host *host) - * Purpose : does a clean (we hope) shutdown of the SCSI chip. - * Use prior to dumping core, unloading the driver, etc. - * Returns : 0 on success - */ -int DC395x_shutdown(struct Scsi_Host *host) +/** + * DC395x_chip_shutdown - cleanly shut down the scsi controller chip, + * stopping all operations and disablig interrupt generation on the + * card. + * + * @acb: The scsi adapter control block of the adapter to shut down. + **/ +static +void DC395x_chip_shutdown(struct AdapterCtlBlk *pACB) { - struct AdapterCtlBlk *pACB; - pACB = (struct AdapterCtlBlk *) (host->hostdata); - - /* pACB->soft_reset(host); */ - /* disable interrupt */ DC395x_write8(TRM_S1040_DMA_INTEN, 0); DC395x_write8(TRM_S1040_SCSI_INTEN, 0); + + /* remove timers */ if (timer_pending(&pACB->Waiting_Timer)) del_timer(&pACB->Waiting_Timer); if (timer_pending(&pACB->SelTO_Timer)) del_timer(&pACB->SelTO_Timer); - if (1 || pACB->Config & HCC_SCSI_RESET) + /* reset the scsi bus */ + if (pACB->Config & HCC_SCSI_RESET) DC395x_ResetSCSIBus(pACB); + /* clear any pending interupt state */ DC395x_read8(TRM_S1040_SCSI_INTSTATUS); -#ifdef DC395x_DEBUGTRACE + + /* release chip resources */ +#if debug_enabled(DBG_TRACE|DBG_TRACEALL) DC395x_free_tracebufs(pACB, DC395x_MAX_SRB_CNT); #endif DC395x_free_SG_tables(pACB, DC395x_MAX_SRB_CNT); - return 0; } -/* - * Free all DCBs - */ -void DC395x_freeDCBs(struct Scsi_Host *host) +/** + * DC395x_free_DCBs - Free all of the DCBs. + * + * @pACB: Adapter to remove the DCBs for. + **/ +static +void DC395x_free_DCBs(struct AdapterCtlBlk* pACB) { - struct DeviceCtlBlk *pDCB; - struct DeviceCtlBlk *nDCB; - struct AdapterCtlBlk *pACB = - (struct AdapterCtlBlk *) (host->hostdata); + struct DeviceCtlBlk *dcb; + struct DeviceCtlBlk *dcb_next; + + dprintkdbg(DBG_DCB, "Free %i DCBs\n", pACB->DCBCnt); + + for (dcb = pACB->pLinkDCB; dcb != NULL; dcb = dcb_next) + { + dcb_next = dcb->pNextDCB; + dprintkdbg(DBG_DCB, "Free DCB (ID %i, LUN %i): %p\n", + dcb->TargetID, dcb->TargetLUN, dcb); + /* + * Free the DCB. This removes the entry from the + * pLinkDCB list and decrements the count in DCBCnt + */ + DC395x_remove_dev(pACB, dcb); - DCBDEBUG(printk - (KERN_INFO DC395X_NAME ": Free %i DCBs\n", pACB->DCBCnt); - ) - pDCB = pACB->pLinkDCB; - if (pDCB) { - do { - nDCB = pDCB->pNextDCB; - DCBDEBUG(printk - (KERN_INFO DC395X_NAME - ": Free DCB (ID %i, LUN %i): %p\n", - pDCB->TargetID, pDCB->TargetLUN, pDCB); - ) - DC395x_remove_dev(pACB, pDCB); /* includes a KFREE(pDCB); */ - printk("."); - pDCB = nDCB; - } while (pDCB && pACB->pLinkDCB); } } - -/* - * Release method +/** + * DC395x_release - shutdown device and release resources that were + * allocate for it. Called once for each card as it is shutdown. * - * Called when we are to shutdown the controller and release all of - * it's resources. - */ -static int DC395x_release(struct Scsi_Host *host) + * @host: The adapter instance to shutdown. + **/ +static +void DC395x_release(struct Scsi_Host *host) { - struct AdapterCtlBlk *pACB = - (struct AdapterCtlBlk *) (host->hostdata); + struct AdapterCtlBlk *pACB = (struct AdapterCtlBlk *) (host->hostdata); unsigned long flags; - printk(DC395X_NAME ": release"); + dprintkl(KERN_DEBUG, "DC395x release\n"); DC395x_LOCK_IO(pACB->pScsiHost); - DC395x_shutdown(host); - DC395x_freeDCBs(host); + DC395x_chip_shutdown(pACB); + DC395x_free_DCBs(pACB); if (host->irq != NO_IRQ) { - /* - * Find the IRQ to release. XXX Why didn't we just store the - * appropriate IRQ details when we request_irq it? - */ - int irq_count; - for (irq_count = 0, pACB = DC395x_pACB_start; - pACB; - pACB = pACB->pNextACB) { - if (pACB->IRQLevel == host->irq) - ++irq_count; - } - if (irq_count == 1) - free_irq(host->irq, DC395x_pACB_start); + free_irq(host->irq, DC395x_pACB_start); } release_region(host->io_port, host->n_io_port); DC395x_UNLOCK_IO(pACB->pScsiHost); - - return 1; } /* * SCSI host template */ -static Scsi_Host_Template driver_template = { - .proc_name = DC395X_NAME, - .proc_info = DC395x_proc_info, - .name = DC395X_BANNER " " DC395X_VERSION, - .detect = DC395x_detect, - .release = DC395x_release, - .queuecommand = DC395x_queue_command, - .bios_param = DC395x_bios_param, - .slave_alloc = DC395x_slave_alloc, - .slave_destroy = DC395x_slave_destroy, - .can_queue = DC395x_MAX_CAN_QUEUE, - .this_id = 7, - .sg_tablesize = DC395x_MAX_SG_TABLESIZE, - .cmd_per_lun = DC395x_MAX_CMD_PER_LUN, - .eh_abort_handler = DC395x_eh_abort, - .eh_bus_reset_handler = DC395x_eh_bus_reset, - .unchecked_isa_dma = 0, - .use_clustering = DISABLE_CLUSTERING, +static Scsi_Host_Template dc395x_driver_template = { + .module = THIS_MODULE, + .proc_name = DC395X_NAME, + .proc_info = DC395x_proc_info, + .name = DC395X_BANNER " " DC395X_VERSION, + .queuecommand = DC395x_queue_command, + .bios_param = DC395x_bios_param, + .slave_alloc = DC395x_slave_alloc, + .slave_destroy = DC395x_slave_destroy, + .can_queue = DC395x_MAX_CAN_QUEUE, + .this_id = 7, + .sg_tablesize = DC395x_MAX_SG_TABLESIZE, + .cmd_per_lun = DC395x_MAX_CMD_PER_LUN, + .eh_abort_handler = DC395x_eh_abort, + .eh_bus_reset_handler = DC395x_eh_bus_reset, + .unchecked_isa_dma = 0, + .use_clustering = DISABLE_CLUSTERING, +}; + +/* + * Called to initialise a single instance of the adaptor + */ + +static +int __devinit dc395x_init_one(struct pci_dev *pdev, + const struct pci_device_id *id) +{ + unsigned int io_port; + u8 irq; + struct Scsi_Host *scsi_host; + static int banner_done = 0; + + dprintkdbg(DBG_0, "Init one instance of the dc395x\n"); + if (!banner_done) + { + dprintkl(KERN_INFO, "%s %s\n", DC395X_BANNER, DC395X_VERSION); + banner_done = 1; + } + + if (pci_enable_device(pdev)) + { + dprintkl(KERN_INFO, "PCI Enable device failed.\n"); + return -ENODEV; + } + + dprintkdbg(DBG_0, "Get resources...\n"); + io_port = pci_resource_start(pdev, 0) & PCI_BASE_ADDRESS_IO_MASK; + irq = pdev->irq; + dprintkdbg(DBG_0, "IO_PORT=%04x,IRQ=%x\n", (unsigned int) io_port, irq); + + scsi_host = DC395x_init(&dc395x_driver_template, io_port, irq, DC395x_adapterCnt); + if (!scsi_host) + { + dprintkdbg(DBG_0, "DC395x_init failed\n"); + return -ENOMEM; + } + + pci_set_master(pdev); + + /* store pci devices in out host data object. */ + ((struct AdapterCtlBlk *)(scsi_host->hostdata))->pdev = pdev; + + /* increment adaptor count */ + DC395x_adapterCnt++; + + /* store ptr to scsi host in the PCI device structure */ + pci_set_drvdata(pdev, scsi_host); + + /* get the scsi mid level to scan for new devices on the bus */ + scsi_add_host(scsi_host, &pdev->dev); + + return 0; +} + + +/* + * Called to remove a single instance of the adaptor + */ +static void __devexit dc395x_remove_one(struct pci_dev *pdev) +{ + struct Scsi_Host *host = pci_get_drvdata(pdev); + dprintkdbg(DBG_0, "Removing instance\n"); + scsi_remove_host(host); + DC395x_release(host); + pci_set_drvdata(pdev, NULL); +} + +/* + * Table which identifies the PCI devices which + * are handled by this device driver. + */ +static struct pci_device_id dc395x_pci_table[] __devinitdata = { + { + .vendor = PCI_VENDOR_ID_TEKRAM, + .device = PCI_DEVICE_ID_TEKRAM_TRMS1040, + .subvendor = PCI_ANY_ID, + .subdevice = PCI_ANY_ID, + }, + {} /* Terminating entry */ }; +MODULE_DEVICE_TABLE(pci, dc395x_pci_table); + /* - * The following code deals with registering the above scsi host - * template with the higher level scsi code and results in the detect - * method from the template being called during initialisation. + * PCI driver operations. + * Tells the PCI sub system what can be done with the card. */ -#include "scsi_module.c" +static struct pci_driver dc395x_driver = { + .name = DC395X_NAME, + .id_table = dc395x_pci_table, + .probe = dc395x_init_one, + .remove = __devexit_p(dc395x_remove_one), +}; + +static int __init dc395x_module_init(void) +{ + return pci_module_init(&dc395x_driver); +} + +static void __exit dc395x_module_exit(void) +{ + pci_unregister_driver(&dc395x_driver); +} + +module_init(dc395x_module_init); +module_exit(dc395x_module_exit); + +MODULE_AUTHOR("C.L. Huang / Erich Chen / Kurt Garloff"); +MODULE_DESCRIPTION("SCSI host adapter driver for Tekram TRM-S1040 based adapters: Tekram DC395 and DC315 series"); +MODULE_LICENSE("GPL"); diff -urN linux-2.5.70-bk8/drivers/scsi/hosts.c linux-2.5.70-bk9/drivers/scsi/hosts.c --- linux-2.5.70-bk8/drivers/scsi/hosts.c 2003-06-04 04:37:18.000000000 -0700 +++ linux-2.5.70-bk9/drivers/scsi/hosts.c 2003-06-04 04:37:30.000000000 -0700 @@ -234,27 +234,18 @@ int scsi_add_host(struct Scsi_Host *shost, struct device *dev) { Scsi_Host_Template *sht = shost->hostt; - struct scsi_device *sdev; - int error = 0, saved_error = 0; + int error; printk(KERN_INFO "scsi%d : %s\n", shost->host_no, sht->info ? sht->info(shost) : sht->name); error = scsi_sysfs_add_host(shost, dev); - if (error) - return error; - - scsi_proc_host_add(shost); - - scsi_scan_host(shost); + if (!error) { + scsi_proc_host_add(shost); + scsi_scan_host(shost); + }; - list_for_each_entry (sdev, &shost->my_devices, siblings) { - error = scsi_attach_device(sdev); - if (error) - saved_error = error; - } - - return saved_error; + return error; } /** @@ -500,60 +491,43 @@ } /** - * *scsi_host_get_next - get scsi host and inc ref count - * @shost: pointer to a Scsi_Host or NULL to start. + * scsi_host_lookup - get a reference to a Scsi_Host by host no + * + * @hostnum: host number to locate * * Return value: - * A pointer to next Scsi_Host in list or NULL. + * A pointer to located Scsi_Host or NULL. **/ -struct Scsi_Host *scsi_host_get_next(struct Scsi_Host *shost) +struct Scsi_Host *scsi_host_lookup(unsigned short hostnum) { - struct list_head *lh = NULL; - - spin_lock(&scsi_host_list_lock); - if (shost) { - /* XXX Dec ref on cur shost */ - lh = shost->sh_list.next; - } else { - lh = scsi_host_list.next; - } - - if (lh == &scsi_host_list) { - shost = (struct Scsi_Host *)NULL; - goto done; + struct class *class = class_get(&shost_class); + struct class_device *cdev; + struct Scsi_Host *shost = NULL, *p; + + if (class) { + down_read(&class->subsys.rwsem); + list_for_each_entry(cdev, &class->children, node) { + p = class_to_shost(cdev); + if (p->host_no == hostnum) { + scsi_host_get(p); + shost = p; + break; + } + } + up_read(&class->subsys.rwsem); } - shost = list_entry(lh, struct Scsi_Host, sh_list); - /* XXX Inc ref count */ - -done: - spin_unlock(&scsi_host_list_lock); return shost; } /** - * scsi_host_hn_get - get a Scsi_Host by host no and inc ref count - * @host_no: host number to locate - * - * Return value: - * A pointer to located Scsi_Host or NULL. - **/ -struct Scsi_Host *scsi_host_hn_get(unsigned short host_no) -{ - /* XXX Inc ref count */ - return scsi_find_host_by_num(host_no); -} - -/** * *scsi_host_get - inc a Scsi_Host ref count * @shost: Pointer to Scsi_Host to inc. **/ void scsi_host_get(struct Scsi_Host *shost) { - get_device(&shost->host_gendev); class_device_get(&shost->class_dev); - return; } /** @@ -565,7 +539,6 @@ class_device_put(&shost->class_dev); put_device(&shost->host_gendev); - return; } /** diff -urN linux-2.5.70-bk8/drivers/scsi/hosts.h linux-2.5.70-bk9/drivers/scsi/hosts.h --- linux-2.5.70-bk8/drivers/scsi/hosts.h 2003-06-04 04:37:18.000000000 -0700 +++ linux-2.5.70-bk9/drivers/scsi/hosts.h 2003-06-04 04:37:30.000000000 -0700 @@ -542,25 +542,23 @@ return shost->host_gendev.parent; } -struct Scsi_Device_Template -{ - struct list_head list; - const char * name; - struct module * module; /* Used for loadable modules */ - unsigned char scsi_type; - int (*attach)(Scsi_Device *); /* Attach devices to arrays */ - void (*detach)(Scsi_Device *); - int (*init_command)(Scsi_Cmnd *); /* Used by new queueing code. - Selects command for blkdevs */ - void (*rescan)(Scsi_Device *); - struct device_driver scsi_driverfs_driver; +struct scsi_driver { + struct module *owner; + struct device_driver gendrv; + + int (*init_command)(struct scsi_cmnd *); + void (*rescan)(struct device *); }; +#define to_scsi_driver(drv) \ + container_of((drv), struct scsi_driver, gendrv) -/* - * Highlevel driver registration/unregistration. - */ -extern int scsi_register_device(struct Scsi_Device_Template *); -extern int scsi_unregister_device(struct Scsi_Device_Template *); +extern int scsi_register_driver(struct device_driver *); +#define scsi_unregister_driver(drv) \ + driver_unregister(drv); + +extern int scsi_register_interface(struct class_interface *); +#define scsi_unregister_interface(intf) \ + class_interface_unregister(intf) /* * HBA allocation/freeing. diff -urN linux-2.5.70-bk8/drivers/scsi/ide-scsi.c linux-2.5.70-bk9/drivers/scsi/ide-scsi.c --- linux-2.5.70-bk8/drivers/scsi/ide-scsi.c 2003-05-26 18:00:42.000000000 -0700 +++ linux-2.5.70-bk9/drivers/scsi/ide-scsi.c 2003-06-04 04:37:30.000000000 -0700 @@ -771,6 +771,10 @@ static inline int should_transform(ide_drive_t *drive, Scsi_Cmnd *cmd) { idescsi_scsi_t *scsi = drive_to_idescsi(drive); + + /* this was a layering violation and we can't support it + anymore, sorry. */ +#if 0 struct gendisk *disk = cmd->request->rq_disk; if (disk) { @@ -778,6 +782,7 @@ if (strcmp((*p)->scsi_driverfs_driver.name, "sg") == 0) return test_bit(IDESCSI_SG_TRANSFORM, &scsi->transform); } +#endif return test_bit(IDESCSI_TRANSFORM, &scsi->transform); } diff -urN linux-2.5.70-bk8/drivers/scsi/imm.c linux-2.5.70-bk9/drivers/scsi/imm.c --- linux-2.5.70-bk8/drivers/scsi/imm.c 2003-06-04 04:37:18.000000000 -0700 +++ linux-2.5.70-bk9/drivers/scsi/imm.c 2003-06-04 04:37:30.000000000 -0700 @@ -254,7 +254,7 @@ } int imm_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t offset, - int length, int hostno, int inout) + int length, int inout) { int i; int len = 0; diff -urN linux-2.5.70-bk8/drivers/scsi/imm.h linux-2.5.70-bk9/drivers/scsi/imm.h --- linux-2.5.70-bk8/drivers/scsi/imm.h 2003-06-04 04:37:18.000000000 -0700 +++ linux-2.5.70-bk9/drivers/scsi/imm.h 2003-06-04 04:37:30.000000000 -0700 @@ -159,6 +159,7 @@ int imm_queuecommand(Scsi_Cmnd *, void (*done) (Scsi_Cmnd *)); int imm_abort(Scsi_Cmnd *); int imm_reset(Scsi_Cmnd *); +int imm_proc_info(struct Scsi_Host *, char *, char **, off_t, int, int); int imm_biosparam(struct scsi_device *, struct block_device *, sector_t, int *); diff -urN linux-2.5.70-bk8/drivers/scsi/megaraid.c linux-2.5.70-bk9/drivers/scsi/megaraid.c --- linux-2.5.70-bk8/drivers/scsi/megaraid.c 2003-06-04 04:37:18.000000000 -0700 +++ linux-2.5.70-bk9/drivers/scsi/megaraid.c 2003-06-04 04:37:31.000000000 -0700 @@ -723,7 +723,7 @@ { dma_addr_t prod_info_dma_handle; mega_inquiry3 *inquiry3; - u8 raw_mbox[16]; + u8 raw_mbox[sizeof(mbox_t)]; mbox_t *mbox; int retval; @@ -732,7 +732,7 @@ mbox = (mbox_t *)raw_mbox; memset((void *)adapter->mega_buffer, 0, MEGA_BUFFER_SIZE); - memset(mbox, 0, 16); + memset(mbox, 0, sizeof(*mbox)); /* * Try to issue Inquiry3 command @@ -2400,7 +2400,7 @@ { adapter_t *adapter; mbox_t *mbox; - u_char raw_mbox[16]; + u_char raw_mbox[sizeof(mbox_t)]; char buf[12] = { 0 }; adapter = (adapter_t *)host->hostdata; @@ -2409,7 +2409,7 @@ printk(KERN_NOTICE "megaraid: being unloaded..."); /* Flush adapter cache */ - memset(mbox, 0, 16); + memset(mbox, 0, sizeof(*mbox)); raw_mbox[0] = FLUSH_ADAPTER; irq_disable(adapter); @@ -2419,7 +2419,7 @@ issue_scb_block(adapter, raw_mbox); /* Flush disks cache */ - memset(mbox, 0, 16); + memset(mbox, 0, sizeof(*mbox)); raw_mbox[0] = FLUSH_SYSTEM; /* Issue a blocking (interrupts disabled) command to the card */ @@ -3881,7 +3881,7 @@ { adapter_t *adapter; struct Scsi_Host *host; - u8 raw_mbox[16]; + u8 raw_mbox[sizeof(mbox_t)]; mbox_t *mbox; int i,j; @@ -3897,7 +3897,7 @@ mbox = (mbox_t *)raw_mbox; /* Flush adapter cache */ - memset(mbox, 0, 16); + memset(mbox, 0, sizeof(*mbox)); raw_mbox[0] = FLUSH_ADAPTER; irq_disable(adapter); @@ -3910,7 +3910,7 @@ issue_scb_block(adapter, raw_mbox); /* Flush disks cache */ - memset(mbox, 0, 16); + memset(mbox, 0, sizeof(*mbox)); raw_mbox[0] = FLUSH_SYSTEM; issue_scb_block(adapter, raw_mbox); @@ -4643,7 +4643,7 @@ static int mega_is_bios_enabled(adapter_t *adapter) { - unsigned char raw_mbox[16]; + unsigned char raw_mbox[sizeof(mbox_t)]; mbox_t *mbox; int ret; @@ -4676,7 +4676,7 @@ static void mega_enum_raid_scsi(adapter_t *adapter) { - unsigned char raw_mbox[16]; + unsigned char raw_mbox[sizeof(mbox_t)]; mbox_t *mbox; int i; @@ -4731,7 +4731,7 @@ mega_get_boot_drv(adapter_t *adapter) { struct private_bios_data *prv_bios_data; - unsigned char raw_mbox[16]; + unsigned char raw_mbox[sizeof(mbox_t)]; mbox_t *mbox; u16 cksum = 0; u8 *cksum_p; @@ -4797,7 +4797,7 @@ static int mega_support_random_del(adapter_t *adapter) { - unsigned char raw_mbox[16]; + unsigned char raw_mbox[sizeof(mbox_t)]; mbox_t *mbox; int rval; @@ -4826,7 +4826,7 @@ static int mega_support_ext_cdb(adapter_t *adapter) { - unsigned char raw_mbox[16]; + unsigned char raw_mbox[sizeof(mbox_t)]; mbox_t *mbox; int rval; @@ -4944,7 +4944,7 @@ static void mega_get_max_sgl(adapter_t *adapter) { - unsigned char raw_mbox[16]; + unsigned char raw_mbox[sizeof(mbox_t)]; mbox_t *mbox; mbox = (mbox_t *)raw_mbox; @@ -4989,7 +4989,7 @@ static int mega_support_cluster(adapter_t *adapter) { - unsigned char raw_mbox[16]; + unsigned char raw_mbox[sizeof(mbox_t)]; mbox_t *mbox; mbox = (mbox_t *)raw_mbox; diff -urN linux-2.5.70-bk8/drivers/scsi/nsp32.c linux-2.5.70-bk9/drivers/scsi/nsp32.c --- linux-2.5.70-bk8/drivers/scsi/nsp32.c 2003-06-04 04:37:18.000000000 -0700 +++ linux-2.5.70-bk9/drivers/scsi/nsp32.c 2003-06-04 04:37:31.000000000 -0700 @@ -278,14 +278,12 @@ /* * function declaration */ -static int nsp32_detect(Scsi_Host_Template *); static int nsp32_queuecommand(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *)); static const char *nsp32_info(struct Scsi_Host *); static int nsp32_eh_abort(Scsi_Cmnd *); static int nsp32_eh_bus_reset(Scsi_Cmnd *); static int nsp32_eh_host_reset(Scsi_Cmnd *); static int nsp32_reset(Scsi_Cmnd *, unsigned int); -static int nsp32_release(struct Scsi_Host *); static int nsp32_proc_info(struct Scsi_Host *, char *, char **, off_t, int, int); static int __devinit nsp32_probe(struct pci_dev *, const struct pci_device_id *); static void __devexit nsp32_remove(struct pci_dev *); @@ -335,11 +333,10 @@ /* * max_sectors is currently limited up to 128. */ -static Scsi_Host_Template driver_template = { - .proc_name = "nsp32", +static Scsi_Host_Template nsp32_template = { .name = "Workbit NinjaSCSI-32Bi/UDE", + .proc_name = "nsp32", .proc_info = nsp32_proc_info, - .detect = nsp32_detect, .info = nsp32_info, .queuecommand = nsp32_queuecommand, .can_queue = 1, @@ -352,12 +349,6 @@ .eh_device_reset_handler = NULL, .eh_bus_reset_handler = nsp32_eh_bus_reset, .eh_host_reset_handler = nsp32_eh_host_reset, - .release = nsp32_release, -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,2)) - .use_new_eh_code = 1, -#else - /* .highmem_io = 1, */ -#endif }; #include "nsp32_io.h" @@ -1618,7 +1609,7 @@ * 0x900-0xbff: (map same 0x800-0x8ff I/O port image repeatedly) * 0xc00-0xfff: CardBus status registers */ -static int nsp32_detect(Scsi_Host_Template *sht) +static int nsp32_detect(struct pci_dev *pdev) { struct Scsi_Host *host; /* registered host structure */ int ret; @@ -1630,7 +1621,7 @@ /* * register this HBA as SCSI device */ - host = scsi_register(sht, sizeof(nsp32_hw_data)); + host = scsi_register(&nsp32_template, sizeof(nsp32_hw_data)); if (host == NULL) { nsp32_msg (KERN_ERR, "failed to scsi register"); goto err; @@ -1793,8 +1784,6 @@ "NinjaSCSI-32Bi/UDE: irq %d, io 0x%lx+0x%x", host->irq, host->io_port, host->n_io_port); - sht->name = data->info_str; - /* * SCSI bus reset * @@ -1832,7 +1821,9 @@ goto free_irq; } - return 1; + scsi_add_host(host, &pdev->dev); + pci_set_drvdata(pdev, host); + return 0; free_irq: free_irq(host->irq, data); @@ -1852,43 +1843,7 @@ scsi_unregister(host); err: - return 0; -} - -static int nsp32_release(struct Scsi_Host *shpnt) -{ - nsp32_hw_data *data = (nsp32_hw_data *)shpnt->hostdata; - - if (data->lunt_list) { - kfree(data->lunt_list); - } - - if (data->autoparam) { - pci_free_consistent(data->Pci, AUTOPARAM_SIZE, - data->autoparam, data->apaddr); - } - - if (data->sg_list) { - pci_free_consistent(data->Pci, - (sizeof(struct nsp32_sgtable) * NSP_SG_SIZE * MAX_TARGET * MAX_LUN), - data->sg_list, data->sgaddr); - } - - DEBUG(0, "free irq\n"); - if (shpnt->irq) { - free_irq(shpnt->irq, data); - } - - DEBUG(0, "free io\n"); - if (shpnt->io_port && shpnt->n_io_port) { - release_region(shpnt->io_port, shpnt->n_io_port); - } - - if (data->MmioAddress != 0) { - iounmap((void *)(data->MmioAddress)); - } - - return 0; + return 1; } static const char *nsp32_info(struct Scsi_Host *shpnt) @@ -2031,11 +1986,7 @@ pci_set_master(pdev); -#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,2)) - scsi_register_host(&driver_template); -#else - scsi_register_module(MODULE_SCSI_HA, &driver_template); -#endif + ret = nsp32_detect(pdev); nsp32_msg(KERN_INFO, "nsp32 irq: %i mmio: 0x%lx slot: %s model: %s", pdev->irq, data->MmioAddress, pdev->slot_name, @@ -2043,18 +1994,23 @@ nsp32_dbg(NSP32_DEBUG_REGISTER, "exit"); - return 0; + return ret; } static void __devexit nsp32_remove(struct pci_dev *pdev) { - nsp32_dbg(NSP32_DEBUG_REGISTER, "enter"); - -#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,2)) - scsi_unregister_host(&driver_template); -#else - scsi_unregister_module(MODULE_SCSI_HA, &driver_template); -#endif + struct Scsi_Host *shpnt = pci_get_drvdata(pdev); + nsp32_hw_data *data = (nsp32_hw_data *)shpnt->hostdata; + + kfree(data->lunt_list); + pci_free_consistent(data->Pci, AUTOPARAM_SIZE, + data->autoparam, data->apaddr); + pci_free_consistent(data->Pci, + (sizeof(struct nsp32_sgtable) * NSP_SG_SIZE*MAX_TARGET*MAX_LUN), + data->sg_list, data->sgaddr); + free_irq(shpnt->irq, data); + release_region(shpnt->io_port, shpnt->n_io_port); + iounmap((void *)(data->MmioAddress)); } static struct pci_device_id nsp32_pci_table[] __devinitdata = { diff -urN linux-2.5.70-bk8/drivers/scsi/osst.c linux-2.5.70-bk9/drivers/scsi/osst.c --- linux-2.5.70-bk8/drivers/scsi/osst.c 2003-05-26 18:00:39.000000000 -0700 +++ linux-2.5.70-bk9/drivers/scsi/osst.c 2003-06-04 04:37:31.000000000 -0700 @@ -160,19 +160,15 @@ static int osst_copy_to_buffer(OSST_buffer *, unsigned char *); static int osst_copy_from_buffer(OSST_buffer *, unsigned char *); -static int osst_attach(Scsi_Device *); -static void osst_detach(Scsi_Device *); +static int osst_probe(struct device *); +static int osst_remove(struct device *); -struct Scsi_Device_Template osst_template = -{ - .module = THIS_MODULE, - .list = LIST_HEAD_INIT(osst_template.list), - .name = "OnStream Tape", - .scsi_type = TYPE_TAPE, - .attach = osst_attach, - .detach = osst_detach, - .scsi_driverfs_driver = { - .name = "osst", +struct scsi_driver osst_template = { + .owner = THIS_MODULE, + .gendrv = { + .name = "osst", + .probe = osst_probe, + .remove = osst_remove, } }; @@ -5326,22 +5322,6 @@ #endif -/* Driverfs file support */ -static ssize_t osst_device_kdev_read(struct device *driverfs_dev, char *page) -{ - kdev_t kdev; - kdev.value=(int)(long)driverfs_dev->driver_data; - return sprintf(page, "%x\n",kdev.value); -} -static DEVICE_ATTR(kdev,S_IRUGO,osst_device_kdev_read,NULL); - -static ssize_t osst_device_type_read(struct device *driverfs_dev, char *page) -{ - return sprintf (page, "CHR\n"); -} -static DEVICE_ATTR(type,S_IRUGO,osst_device_type_read,NULL); - - static struct file_operations osst_fops = { .owner = THIS_MODULE, .read = osst_read, @@ -5384,8 +5364,9 @@ * osst startup / cleanup code */ -static int osst_attach(Scsi_Device * SDp) +static int osst_probe(struct device *dev) { + Scsi_Device * SDp = to_scsi_device(dev); OS_Scsi_Tape * tpnt; ST_mode * STm; ST_partstat * STps; @@ -5394,12 +5375,12 @@ int i, mode, dev_num; if (SDp->type != TYPE_TAPE || !osst_supports(SDp)) - return 1; + return -ENODEV; drive = alloc_disk(1); if (!drive) { printk(KERN_ERR "osst :E: Out of memory. Device not attached.\n"); - return 1; + return -ENODEV; } /* if this is the first attach, build the infrastructure */ @@ -5521,45 +5502,12 @@ write_unlock(&os_scsi_tapes_lock); for (mode = 0; mode < ST_NBR_MODES; ++mode) { - char name[8]; - /* Rewind entry */ - sprintf(name, "ot%s", osst_formats[mode]); - - sprintf(tpnt->driverfs_dev_r[mode].bus_id, "%s:%s", - SDp->sdev_driverfs_dev.bus_id, name); - sprintf(tpnt->driverfs_dev_r[mode].name, "%s%s", - SDp->sdev_driverfs_dev.name, name); - tpnt->driverfs_dev_r[mode].parent = &SDp->sdev_driverfs_dev; - tpnt->driverfs_dev_r[mode].bus = SDp->sdev_driverfs_dev.bus; - tpnt->driverfs_dev_r[mode].driver_data = - (void *)(long)__mkdev(OSST_MAJOR, dev_num + (mode << 5)); - device_register(&tpnt->driverfs_dev_r[mode]); - device_create_file(&tpnt->driverfs_dev_r[mode], - &dev_attr_type); - device_create_file(&tpnt->driverfs_dev_r[mode], &dev_attr_kdev); - devfs_mk_cdev(MKDEV(OSST_MAJOR, dev_num + (mode << 5)), S_IFCHR | S_IRUGO | S_IWUGO, "%s/ot%s", SDp->devfs_name, osst_formats[mode]); /* No-rewind entry */ - sprintf (name, "ot%sn", osst_formats[mode]); - - sprintf(tpnt->driverfs_dev_n[mode].bus_id, "%s:%s", - SDp->sdev_driverfs_dev.bus_id, name); - sprintf(tpnt->driverfs_dev_n[mode].name, "%s%s", - SDp->sdev_driverfs_dev.name, name); - tpnt->driverfs_dev_n[mode].parent= &SDp->sdev_driverfs_dev; - tpnt->driverfs_dev_n[mode].bus = SDp->sdev_driverfs_dev.bus; - tpnt->driverfs_dev_n[mode].driver_data = - (void *)(long)__mkdev(OSST_MAJOR, dev_num + (mode << 5) + 128); - device_register(&tpnt->driverfs_dev_n[mode]); - device_create_file(&tpnt->driverfs_dev_n[mode], - &dev_attr_type); - device_create_file(&tpnt->driverfs_dev_n[mode], - &dev_attr_kdev); - devfs_mk_cdev(MKDEV(OSST_MAJOR, dev_num + (mode << 5) + 128), S_IFCHR | S_IRUGO | S_IWUGO, "%s/ot%sn", SDp->devfs_name, osst_formats[mode]); @@ -5574,16 +5522,17 @@ out_put_disk: put_disk(drive); - return 1; + return -ENODEV; }; -static void osst_detach(Scsi_Device * SDp) +static int osst_remove(struct device *dev) { + Scsi_Device * SDp = to_scsi_device(dev); OS_Scsi_Tape * tpnt; int i, mode; if ((SDp->type != TYPE_TAPE) || (osst_nr_dev <= 0)) - return; + return 0; write_lock(&os_scsi_tapes_lock); for(i=0; i < osst_max_dev; i++) { @@ -5598,29 +5547,17 @@ os_scsi_tapes[i] = NULL; osst_nr_dev--; write_unlock(&os_scsi_tapes_lock); - for (mode = 0; mode < ST_NBR_MODES; ++mode) { - device_remove_file(&tpnt->driverfs_dev_r[mode], - &dev_attr_type); - device_remove_file(&tpnt->driverfs_dev_r[mode], - &dev_attr_kdev); - device_unregister(&tpnt->driverfs_dev_r[mode]); - device_remove_file(&tpnt->driverfs_dev_n[mode], - &dev_attr_type); - device_remove_file(&tpnt->driverfs_dev_n[mode], - &dev_attr_kdev); - device_unregister(&tpnt->driverfs_dev_n[mode]); - } if (tpnt->header_cache != NULL) vfree(tpnt->header_cache); if (tpnt->buffer) { normalize_buffer(tpnt->buffer); kfree(tpnt->buffer); } kfree(tpnt); - return; + return 0; } } write_unlock(&os_scsi_tapes_lock); - return; + return 0; } static int __init init_osst(void) @@ -5629,7 +5566,7 @@ validate_options(); - if ((register_chrdev(OSST_MAJOR,"osst", &osst_fops) < 0) || scsi_register_device(&osst_template)) { + if ((register_chrdev(OSST_MAJOR,"osst", &osst_fops) < 0) || scsi_register_driver(&osst_template.gendrv)) { printk(KERN_ERR "osst :E: Unable to register major %d for OnStream tapes\n", OSST_MAJOR); return 1; } @@ -5642,7 +5579,7 @@ int i; OS_Scsi_Tape * STp; - scsi_unregister_device(&osst_template); + scsi_unregister_driver(&osst_template.gendrv); unregister_chrdev(OSST_MAJOR, "osst"); if (os_scsi_tapes) { diff -urN linux-2.5.70-bk8/drivers/scsi/osst.h linux-2.5.70-bk9/drivers/scsi/osst.h --- linux-2.5.70-bk8/drivers/scsi/osst.h 2003-05-26 18:00:42.000000000 -0700 +++ linux-2.5.70-bk9/drivers/scsi/osst.h 2003-06-04 04:37:31.000000000 -0700 @@ -530,7 +530,7 @@ /* The OnStream tape drive descriptor */ typedef struct { - struct Scsi_Device_Template *driver; + struct scsi_driver *driver; unsigned capacity; Scsi_Device* device; struct semaphore lock; /* for serialization */ @@ -555,8 +555,6 @@ /* Mode characteristics */ ST_mode modes[ST_NBR_MODES]; int current_mode; - struct device driverfs_dev_r[ST_NBR_MODES]; - struct device driverfs_dev_n[ST_NBR_MODES]; /* Status variables */ int partition; diff -urN linux-2.5.70-bk8/drivers/scsi/ppa.c linux-2.5.70-bk9/drivers/scsi/ppa.c --- linux-2.5.70-bk8/drivers/scsi/ppa.c 2003-06-04 04:37:18.000000000 -0700 +++ linux-2.5.70-bk9/drivers/scsi/ppa.c 2003-06-04 04:37:31.000000000 -0700 @@ -277,7 +277,7 @@ int len = 0; for (i = 0; i < 4; i++) - if (ppa_hosts[i] == host) + if (ppa_hosts[i].host == host->host_no) break; if (inout) diff -urN linux-2.5.70-bk8/drivers/scsi/scsi.c linux-2.5.70-bk9/drivers/scsi/scsi.c --- linux-2.5.70-bk8/drivers/scsi/scsi.c 2003-05-26 18:00:40.000000000 -0700 +++ linux-2.5.70-bk9/drivers/scsi/scsi.c 2003-06-04 04:37:31.000000000 -0700 @@ -86,12 +86,6 @@ static unsigned long serial_number; /* - * List of all highlevel drivers. - */ -LIST_HEAD(scsi_devicelist); -static DECLARE_RWSEM(scsi_devicelist_mutex); - -/* * Note - the initial logging level can be set here to log events at boot time. * After the system is up, you may enable logging via the /proc interface. */ @@ -931,50 +925,6 @@ return depth; } -int scsi_attach_device(struct scsi_device *sdev) -{ - struct Scsi_Device_Template *sdt; - - down_read(&scsi_devicelist_mutex); - list_for_each_entry(sdt, &scsi_devicelist, list) { - if (!try_module_get(sdt->module)) - continue; - (*sdt->attach)(sdev); - module_put(sdt->module); - } - up_read(&scsi_devicelist_mutex); - return 0; -} - -void scsi_detach_device(struct scsi_device *sdev) -{ - struct Scsi_Device_Template *sdt; - - down_read(&scsi_devicelist_mutex); - list_for_each_entry(sdt, &scsi_devicelist, list) { - if (!try_module_get(sdt->module)) - continue; - (*sdt->detach)(sdev); - module_put(sdt->module); - } - up_read(&scsi_devicelist_mutex); -} - -void scsi_rescan_device(struct scsi_device *sdev) -{ - struct Scsi_Device_Template *sdt; - - down_read(&scsi_devicelist_mutex); - list_for_each_entry(sdt, &scsi_devicelist, list) { - if (!try_module_get(sdt->module)) - continue; - if (*sdt->rescan) - (*sdt->rescan)(sdev); - module_put(sdt->module); - } - up_read(&scsi_devicelist_mutex); -} - int scsi_device_get(struct scsi_device *sdev) { if (!try_module_get(sdev->host->hostt->module)) @@ -1030,71 +980,6 @@ } } -/* - * This entry point is called from the upper level module's module_init() - * routine. That implies that when this function is called, the - * scsi_mod module is locked down because of upper module layering and - * that the high level driver module is locked down by being in it's - * init routine. So, the *only* thing we have to do to protect adds - * we perform in this function is to make sure that all call's - * to the high level driver's attach() and detach() call in points, other - * than via scsi_register_device and scsi_unregister_device which are in - * the module_init and module_exit code respectively and therefore already - * locked down by the kernel module loader, are wrapped by try_module_get() - * and module_put() to avoid races on device adds and removes. - */ -int scsi_register_device(struct Scsi_Device_Template *tpnt) -{ - struct scsi_device *sdev; - struct Scsi_Host *shpnt; - -#ifdef CONFIG_KMOD - if (scsi_host_get_next(NULL) == NULL) - request_module("scsi_hostadapter"); -#endif - - if (!list_empty(&tpnt->list)) - return 1; - - down_write(&scsi_devicelist_mutex); - list_add_tail(&tpnt->list, &scsi_devicelist); - up_write(&scsi_devicelist_mutex); - - scsi_upper_driver_register(tpnt); - - for (shpnt = scsi_host_get_next(NULL); shpnt; - shpnt = scsi_host_get_next(shpnt)) - list_for_each_entry(sdev, &shpnt->my_devices, siblings) - (*tpnt->attach)(sdev); - - return 0; -} - -int scsi_unregister_device(struct Scsi_Device_Template *tpnt) -{ - struct scsi_device *sdev; - struct Scsi_Host *shpnt; - - /* - * Next, detach the devices from the driver. - */ - for (shpnt = scsi_host_get_next(NULL); shpnt; - shpnt = scsi_host_get_next(shpnt)) { - list_for_each_entry(sdev, &shpnt->my_devices, siblings) - (*tpnt->detach)(sdev); - } - - /* - * Extract the template from the linked list. - */ - down_write(&scsi_devicelist_mutex); - list_del(&tpnt->list); - up_write(&scsi_devicelist_mutex); - - scsi_upper_driver_unregister(tpnt); - return 0; -} - MODULE_DESCRIPTION("SCSI core"); MODULE_LICENSE("GPL"); diff -urN linux-2.5.70-bk8/drivers/scsi/scsi.h linux-2.5.70-bk9/drivers/scsi/scsi.h --- linux-2.5.70-bk8/drivers/scsi/scsi.h 2003-06-04 04:37:18.000000000 -0700 +++ linux-2.5.70-bk9/drivers/scsi/scsi.h 2003-06-04 04:37:31.000000000 -0700 @@ -316,6 +316,7 @@ */ struct scsi_device { + struct class_device sdev_classdev; /* * This information is private to the scsi mid-layer. */ diff -urN linux-2.5.70-bk8/drivers/scsi/scsi_lib.c linux-2.5.70-bk9/drivers/scsi/scsi_lib.c --- linux-2.5.70-bk8/drivers/scsi/scsi_lib.c 2003-06-04 04:37:18.000000000 -0700 +++ linux-2.5.70-bk9/drivers/scsi/scsi_lib.c 2003-06-04 04:37:31.000000000 -0700 @@ -613,29 +613,6 @@ } /* - * Function: scsi_get_request_dev() - * - * Purpose: Find the upper-level driver that is responsible for this - * request - * - * Arguments: request - I/O request we are preparing to queue. - * - * Lock status: No locks assumed to be held, but as it happens the - * q->queue_lock is held when this is called. - * - * Returns: Nothing - * - * Notes: The requests in the request queue may have originated - * from any block device driver. We need to find out which - * one so that we can later form the appropriate command. - */ -static struct Scsi_Device_Template *scsi_get_request_dev(struct request *req) -{ - struct gendisk *p = req->rq_disk; - return p ? *(struct Scsi_Device_Template **)p->private_data : NULL; -} - -/* * Function: scsi_io_completion() * * Purpose: Completion processing for block device I/O requests. @@ -849,11 +826,7 @@ return; } if (result) { - struct Scsi_Device_Template *sdt; - - sdt = scsi_get_request_dev(cmd->request); - printk("SCSI %s error : <%d %d %d %d> return code = 0x%x\n", - (sdt ? sdt->name : "device"), + printk("SCSI error : <%d %d %d %d> return code = 0x%x\n", cmd->device->host->host_no, cmd->device->channel, cmd->device->id, @@ -947,7 +920,6 @@ static int scsi_prep_fn(struct request_queue *q, struct request *req) { - struct Scsi_Device_Template *sdt; struct scsi_device *sdev = q->queuedata; struct scsi_cmnd *cmd; @@ -1003,6 +975,7 @@ * happening now. */ if (req->flags & (REQ_CMD | REQ_BLOCK_PC)) { + struct scsi_driver *drv; int ret; /* @@ -1017,8 +990,6 @@ * some kinds of consistency checking may cause the * request to be rejected immediately. */ - sdt = scsi_get_request_dev(req); - BUG_ON(!sdt); /* * This sets up the scatter-gather table (allocating if @@ -1031,7 +1002,8 @@ /* * Initialize the actual SCSI command for this request. */ - if (unlikely(!sdt->init_command(cmd))) { + drv = *(struct scsi_driver **)req->rq_disk->private_data; + if (unlikely(!drv->init_command(cmd))) { scsi_release_buffers(cmd); scsi_put_command(cmd); return BLKPREP_KILL; diff -urN linux-2.5.70-bk8/drivers/scsi/scsi_pc98.c linux-2.5.70-bk9/drivers/scsi/scsi_pc98.c --- linux-2.5.70-bk8/drivers/scsi/scsi_pc98.c 2003-05-26 18:00:21.000000000 -0700 +++ linux-2.5.70-bk9/drivers/scsi/scsi_pc98.c 2003-06-04 04:37:31.000000000 -0700 @@ -15,21 +15,6 @@ #include "hosts.h" -/* XXX - For now, we assume the first (i.e. having the least host_no) - real (i.e. non-emulated) host adapter shall be BIOS-controlled one. - We *SHOULD* invent another way. */ -static inline struct Scsi_Host *first_real_host(void) -{ - struct Scsi_Host *shost = NULL; - - while ((shost = scsi_host_get_next(shost))) { - if (!shost->hostt->emulated) - break; - } - - return shost; -} - static int pc98_first_bios_param(struct scsi_device *sdev, int *ip) { const u8 *p = (&__PC9800SCA(u8, PC9800SCA_SCSI_PARAMS) + sdev->id * 4); @@ -50,7 +35,16 @@ { struct Scsi_Host *first_real = first_real_host(); - if (sdev->host == first_real && sdev->id < 7 && + /* + * XXX + * XXX This needs to become a sysfs attribute that's set + * XXX by code that knows which host is the first one. + * XXX + * XXX Currently we support only one host on with a + * XXX PC98ish HBA. + * XXX + */ + if (1 || sdev->host == first_real && sdev->id < 7 && __PC9800SCA_TEST_BIT(PC9800SCA_DISK_EQUIPS, sdev->id)) return pc98_first_bios_param(sdev, ip); diff -urN linux-2.5.70-bk8/drivers/scsi/scsi_priv.h linux-2.5.70-bk9/drivers/scsi/scsi_priv.h --- linux-2.5.70-bk8/drivers/scsi/scsi_priv.h 2003-06-04 04:37:18.000000000 -0700 +++ linux-2.5.70-bk9/drivers/scsi/scsi_priv.h 2003-06-04 04:37:31.000000000 -0700 @@ -41,9 +41,6 @@ #define SCSI_SENSE_VALID(scmd) \ (((scmd)->sense_buffer[0] & 0x70) == 0x70) -struct Scsi_Device_Template; - - /* * scsi_target: representation of a scsi target, for now, this is only * used for single_lun devices. If no one has active IO to the target, @@ -58,8 +55,7 @@ /* hosts.c */ extern void scsi_host_busy_inc(struct Scsi_Host *, Scsi_Device *); extern void scsi_host_busy_dec_and_test(struct Scsi_Host *, Scsi_Device *); -extern struct Scsi_Host *scsi_host_get_next(struct Scsi_Host *); -extern struct Scsi_Host *scsi_host_hn_get(unsigned short); +extern struct Scsi_Host *scsi_host_lookup(unsigned short); extern void scsi_host_put(struct Scsi_Host *); extern void scsi_host_init(void); @@ -70,9 +66,6 @@ extern void scsi_done(struct scsi_cmnd *cmd); extern void scsi_finish_command(struct scsi_cmnd *cmd); extern int scsi_retry_command(struct scsi_cmnd *cmd); -extern int scsi_attach_device(struct scsi_device *sdev); -extern void scsi_detach_device(struct scsi_device *sdev); -extern void scsi_rescan_device(struct scsi_device *sdev); extern int scsi_insert_special_req(struct scsi_request *sreq, int); extern void scsi_init_cmd_from_req(struct scsi_cmnd *cmd, struct scsi_request *sreq); @@ -119,12 +112,11 @@ extern void scsi_free_sdev(struct scsi_device *); extern void scsi_free_shost(struct Scsi_Host *); extern void scsi_host_get(struct Scsi_Host *); +extern void scsi_rescan_device(struct device *dev); /* scsi_sysfs.c */ extern int scsi_device_register(struct scsi_device *); extern void scsi_device_unregister(struct scsi_device *); -extern int scsi_upper_driver_register(struct Scsi_Device_Template *); -extern void scsi_upper_driver_unregister(struct Scsi_Device_Template *); extern void scsi_sysfs_init_host(struct Scsi_Host *); extern int scsi_sysfs_add_host(struct Scsi_Host *, struct device *); extern void scsi_sysfs_remove_host(struct Scsi_Host *); @@ -136,4 +128,7 @@ extern struct class_device_attribute *scsi_sysfs_shost_attrs[]; extern struct device_attribute *scsi_sysfs_sdev_attrs[]; +extern struct class shost_class; +extern struct bus_type scsi_bus_type; + #endif /* _SCSI_PRIV_H */ diff -urN linux-2.5.70-bk8/drivers/scsi/scsi_proc.c linux-2.5.70-bk9/drivers/scsi/scsi_proc.c --- linux-2.5.70-bk8/drivers/scsi/scsi_proc.c 2003-06-04 04:37:18.000000000 -0700 +++ linux-2.5.70-bk9/drivers/scsi/scsi_proc.c 2003-06-04 04:37:31.000000000 -0700 @@ -24,6 +24,7 @@ #include #include #include +#include #include #include "scsi.h" @@ -86,7 +87,7 @@ return n; } -static int proc_scsi_write(struct file *file, const char *buf, +static int proc_scsi_write_proc(struct file *file, const char *buf, unsigned long count, void *data) { struct Scsi_Host *shost = data; @@ -137,7 +138,7 @@ return; } - p->write_proc = proc_scsi_write; + p->write_proc = proc_scsi_write_proc; p->owner = shost->hostt->module; } @@ -152,96 +153,52 @@ remove_proc_entry(shost->hostt->proc_name, proc_scsi); } -static void proc_print_scsidevice(struct scsi_device* sdev, char *buffer, - int *size, int len) +static int proc_print_scsidevice(struct device *dev, void *data) { - - int x, y = *size; - extern const char *const scsi_device_types[MAX_SCSI_DEVICE_CODE]; - - y = sprintf(buffer + len, - "Host: scsi%d Channel: %02d Id: %02d Lun: %02d\n Vendor: ", - sdev->host->host_no, sdev->channel, sdev->id, sdev->lun); - for (x = 0; x < 8; x++) { - if (sdev->vendor[x] >= 0x20) - y += sprintf(buffer + len + y, "%c", sdev->vendor[x]); + struct scsi_device *sdev = to_scsi_device(dev); + struct seq_file *s = data; + int i; + + seq_printf(s, + "Host: scsi%d Channel: %02d Id: %02d Lun: %02d\n Vendor: ", + sdev->host->host_no, sdev->channel, sdev->id, sdev->lun); + for (i = 0; i < 8; i++) { + if (sdev->vendor[i] >= 0x20) + seq_printf(s, "%c", sdev->vendor[i]); else - y += sprintf(buffer + len + y, " "); + seq_printf(s, " "); } - y += sprintf(buffer + len + y, " Model: "); - for (x = 0; x < 16; x++) { - if (sdev->model[x] >= 0x20) - y += sprintf(buffer + len + y, "%c", sdev->model[x]); + + seq_printf(s, " Model: "); + for (i = 0; i < 16; i++) { + if (sdev->model[i] >= 0x20) + seq_printf(s, "%c", sdev->model[i]); else - y += sprintf(buffer + len + y, " "); + seq_printf(s, " "); } - y += sprintf(buffer + len + y, " Rev: "); - for (x = 0; x < 4; x++) { - if (sdev->rev[x] >= 0x20) - y += sprintf(buffer + len + y, "%c", sdev->rev[x]); + + seq_printf(s, " Rev: "); + for (i = 0; i < 4; i++) { + if (sdev->rev[i] >= 0x20) + seq_printf(s, "%c", sdev->rev[i]); else - y += sprintf(buffer + len + y, " "); + seq_printf(s, " "); } - y += sprintf(buffer + len + y, "\n"); - y += sprintf(buffer + len + y, " Type: %s ", + seq_printf(s, "\n"); + + seq_printf(s, " Type: %s ", sdev->type < MAX_SCSI_DEVICE_CODE ? scsi_device_types[(int) sdev->type] : "Unknown "); - y += sprintf(buffer + len + y, " ANSI" + seq_printf(s, " ANSI" " SCSI revision: %02x", (sdev->scsi_level - 1) ? sdev->scsi_level - 1 : 1); if (sdev->scsi_level == 2) - y += sprintf(buffer + len + y, " CCS\n"); + seq_printf(s, " CCS\n"); else - y += sprintf(buffer + len + y, "\n"); - - *size = y; - return; -} + seq_printf(s, "\n"); -static int scsi_proc_info(char *buffer, char **start, off_t offset, int length) -{ - struct Scsi_Host *shost; - Scsi_Device *sdev; - int size, len = 0; - off_t begin = 0; - off_t pos = 0; - - /* - * First, see if there are any attached devices or not. - */ - for (shost = scsi_host_get_next(NULL); shost; - shost = scsi_host_get_next(shost)) { - if (!list_empty(&shost->my_devices)) { - break; - } - } - size = sprintf(buffer + len, "Attached devices: %s\n", - (shost) ? "" : "none"); - len += size; - pos = begin + len; - for (shost = scsi_host_get_next(NULL); shost; - shost = scsi_host_get_next(shost)) { - list_for_each_entry(sdev, &shost->my_devices, siblings) { - proc_print_scsidevice(sdev, buffer, &size, len); - len += size; - pos = begin + len; - - if (pos < offset) { - len = 0; - begin = pos; - } - if (pos > offset + length) - goto stop_output; - } - } - -stop_output: - *start = buffer + (offset - begin); /* Start of wanted data */ - len -= (offset - begin); /* Start slop */ - if (len > length) - len = length; /* Ending slop */ - return (len); + return 0; } static int scsi_add_single_device(uint host, uint channel, uint id, uint lun) @@ -250,7 +207,7 @@ struct scsi_device *sdev; int error = -ENODEV; - shost = scsi_host_hn_get(host); + shost = scsi_host_lookup(host); if (!shost) return -ENODEV; @@ -272,7 +229,7 @@ struct Scsi_Host *shost; int error = -ENODEV; - shost = scsi_host_hn_get(host); + shost = scsi_host_lookup(host); if (!shost) return -ENODEV; sdev = scsi_find_device(shost, channel, id, lun); @@ -287,8 +244,8 @@ return error; } -static int proc_scsi_gen_write(struct file * file, const char * buf, - unsigned long length, void *data) +static int proc_scsi_write(struct file *file, const char* buf, + size_t length, loff_t *ppos) { int host, channel, id, lun; char *buffer, *p; @@ -431,6 +388,30 @@ return err; } +static int proc_scsi_show(struct seq_file *s, void *p) +{ + seq_printf(s, "Attached devices:\n"); + bus_for_each_dev(&scsi_bus_type, NULL, s, proc_print_scsidevice); + return 0; +} + +static int proc_scsi_open(struct inode *inode, struct file *file) +{ + /* + * We don't really needs this for the write case but it doesn't + * harm either. + */ + return single_open(file, proc_scsi_show, NULL); +} + +static struct file_operations proc_scsi_operations = { + .open = proc_scsi_open, + .read = seq_read, + .write = proc_scsi_write, + .llseek = seq_lseek, + .release = single_release, +}; + int __init scsi_init_procfs(void) { struct proc_dir_entry *pde; @@ -439,10 +420,10 @@ if (!proc_scsi) goto err1; - pde = create_proc_info_entry("scsi/scsi", 0, 0, scsi_proc_info); + pde = create_proc_entry("scsi/scsi", 0, NULL); if (!pde) goto err2; - pde->write_proc = proc_scsi_gen_write; + pde->proc_fops = &proc_scsi_operations; return 0; diff -urN linux-2.5.70-bk8/drivers/scsi/scsi_scan.c linux-2.5.70-bk9/drivers/scsi/scsi_scan.c --- linux-2.5.70-bk8/drivers/scsi/scsi_scan.c 2003-06-04 04:37:18.000000000 -0700 +++ linux-2.5.70-bk9/drivers/scsi/scsi_scan.c 2003-06-04 04:37:32.000000000 -0700 @@ -1098,24 +1098,31 @@ uint channel, uint id, uint lun) { struct scsi_device *sdev; - int error = -ENODEV, res; + int res; res = scsi_probe_and_add_lun(shost, channel, id, lun, NULL, &sdev); - if (res == SCSI_SCAN_LUN_PRESENT) - error = scsi_attach_device(sdev); - - if (error) - sdev = ERR_PTR(error); + if (res != SCSI_SCAN_LUN_PRESENT) + sdev = ERR_PTR(-ENODEV); return sdev; } int scsi_remove_device(struct scsi_device *sdev) { - scsi_detach_device(sdev); scsi_device_unregister(sdev); return 0; } +void scsi_rescan_device(struct device *dev) +{ + struct scsi_driver *drv = to_scsi_driver(dev->driver); + + if (try_module_get(drv->owner)) { + if (drv->rescan) + drv->rescan(dev); + module_put(drv->owner); + } +} + /** * scsi_scan_target - scan a target id, possibly including all LUNs on the * target. diff -urN linux-2.5.70-bk8/drivers/scsi/scsi_syms.c linux-2.5.70-bk9/drivers/scsi/scsi_syms.c --- linux-2.5.70-bk8/drivers/scsi/scsi_syms.c 2003-06-04 04:37:18.000000000 -0700 +++ linux-2.5.70-bk9/drivers/scsi/scsi_syms.c 2003-06-04 04:37:32.000000000 -0700 @@ -29,8 +29,8 @@ * This source file contains the symbol table used by scsi loadable * modules. */ -EXPORT_SYMBOL(scsi_register_device); -EXPORT_SYMBOL(scsi_unregister_device); +EXPORT_SYMBOL(scsi_register_driver); +EXPORT_SYMBOL(scsi_register_interface); EXPORT_SYMBOL(scsi_register_host); EXPORT_SYMBOL(scsi_unregister_host); EXPORT_SYMBOL(scsi_add_host); diff -urN linux-2.5.70-bk8/drivers/scsi/scsi_sysfs.c linux-2.5.70-bk9/drivers/scsi/scsi_sysfs.c --- linux-2.5.70-bk8/drivers/scsi/scsi_sysfs.c 2003-06-04 04:37:18.000000000 -0700 +++ linux-2.5.70-bk9/drivers/scsi/scsi_sysfs.c 2003-06-04 04:37:32.000000000 -0700 @@ -54,37 +54,21 @@ NULL }; -static struct class shost_class = { +struct class shost_class = { .name = "scsi_host", }; -/** - * scsi_bus_match: - * @dev: - * @dev_driver: - * - * Return value: - **/ -static int scsi_bus_match(struct device *dev, - struct device_driver *dev_driver) +static struct class sdev_class = { + .name = "scsi_device", +}; + +/* all probing is done in the individual ->probe routines */ +static int scsi_bus_match(struct device *dev, struct device_driver *gendrv) { - if (!strcmp("sg", dev_driver->name)) { - if (strstr(dev->bus_id, ":gen")) - return 1; - } else if (!strcmp("st",dev_driver->name)) { - if (strstr(dev->bus_id,":mt")) - return 1; - } else if (!strcmp("sd", dev_driver->name)) { - if ((!strstr(dev->bus_id, ":gen")) && - (!strstr(dev->bus_id, ":mt"))) { - return 1; - } - } - return 0; + return 1; } - -static struct bus_type scsi_bus_type = { +struct bus_type scsi_bus_type = { .name = "scsi", .match = scsi_bus_match, }; @@ -99,45 +83,26 @@ return error; error = class_register(&shost_class); if (error) - return error; + goto bus_unregister; + error = class_register(&sdev_class); + if (error) + goto class_unregister; + return 0; + class_unregister: + class_unregister(&shost_class); + bus_unregister: + bus_unregister(&scsi_bus_type); return error; } void scsi_sysfs_unregister(void) { + class_unregister(&sdev_class); class_unregister(&shost_class); bus_unregister(&scsi_bus_type); } -/** - * scsi_upper_driver_register - register upper level driver. - * @sdev_tp: Upper level driver to register with the scsi bus. - * - * Return value: - * 0 on Success / non-zero on Failure - **/ -int scsi_upper_driver_register(struct Scsi_Device_Template *sdev_tp) -{ - int error = 0; - - sdev_tp->scsi_driverfs_driver.bus = &scsi_bus_type; - error = driver_register(&sdev_tp->scsi_driverfs_driver); - - return error; -} - -/** - * scsi_upper_driver_unregister - unregister upper level driver - * @sdev_tp: Upper level driver to unregister with the scsi bus. - * - **/ -void scsi_upper_driver_unregister(struct Scsi_Device_Template *sdev_tp) -{ - driver_unregister(&sdev_tp->scsi_driverfs_driver); -} - - /* * sdev_show_function: macro to create an attr function that can be used to * show a non-bit field. @@ -238,7 +203,7 @@ static ssize_t store_rescan_field (struct device *dev, const char *buf, size_t count) { - scsi_rescan_device(to_scsi_device(dev)); + scsi_rescan_device(dev); return 0; } @@ -280,15 +245,30 @@ { int error = 0, i; + device_initialize(&sdev->sdev_driverfs_dev); sprintf(sdev->sdev_driverfs_dev.bus_id,"%d:%d:%d:%d", sdev->host->host_no, sdev->channel, sdev->id, sdev->lun); sdev->sdev_driverfs_dev.parent = &sdev->host->host_gendev; sdev->sdev_driverfs_dev.bus = &scsi_bus_type; sdev->sdev_driverfs_dev.release = scsi_device_release; - error = device_register(&sdev->sdev_driverfs_dev); - if (error) + class_device_initialize(&sdev->sdev_classdev); + sdev->sdev_classdev.dev = &sdev->sdev_driverfs_dev; + sdev->sdev_classdev.class = &sdev_class; + snprintf(sdev->sdev_classdev.class_id, BUS_ID_SIZE, "%d:%d:%d:%d", + sdev->host->host_no, sdev->channel, sdev->id, sdev->lun); + + error = device_add(&sdev->sdev_driverfs_dev); + if (error) { + printk(KERN_INFO "error 1\n"); return error; + } + error = class_device_add(&sdev->sdev_classdev); + if (error) { + printk(KERN_INFO "error 2\n"); + device_unregister(&sdev->sdev_driverfs_dev); + return error; + } for (i = 0; !error && sdev->host->hostt->sdev_attrs[i] != NULL; i++) error = device_create_file(&sdev->sdev_driverfs_dev, @@ -310,9 +290,24 @@ for (i = 0; sdev->host->hostt->sdev_attrs[i] != NULL; i++) device_remove_file(&sdev->sdev_driverfs_dev, sdev->host->hostt->sdev_attrs[i]); + class_device_unregister(&sdev->sdev_classdev); device_unregister(&sdev->sdev_driverfs_dev); } +int scsi_register_driver(struct device_driver *drv) +{ + drv->bus = &scsi_bus_type; + + return driver_register(drv); +} + +int scsi_register_interface(struct class_interface *intf) +{ + intf->class = &sdev_class; + + return class_interface_register(intf); +} + static void scsi_host_release(struct device *dev) { struct Scsi_Host *shost; @@ -350,7 +345,7 @@ int i, error; if (!shost->host_gendev.parent) - shost->host_gendev.parent = (dev) ? dev : &legacy_bus; + shost->host_gendev.parent = dev ? dev : &legacy_bus; error = device_add(&shost->host_gendev); if (error) diff -urN linux-2.5.70-bk8/drivers/scsi/sd.c linux-2.5.70-bk9/drivers/scsi/sd.c --- linux-2.5.70-bk8/drivers/scsi/sd.c 2003-06-04 04:37:18.000000000 -0700 +++ linux-2.5.70-bk9/drivers/scsi/sd.c 2003-06-04 04:37:32.000000000 -0700 @@ -73,8 +73,7 @@ #define SD_MAX_RETRIES 5 struct scsi_disk { - struct list_head list; /* list of all scsi_disks */ - struct Scsi_Device_Template *driver; /* always &sd_template */ + struct scsi_driver *driver; /* always &sd_template */ struct scsi_device *device; struct gendisk *disk; sector_t capacity; /* size in 512-byte sectors */ @@ -85,37 +84,31 @@ unsigned RCD : 1; /* state of disk RCD bit, unused */ }; -static LIST_HEAD(sd_devlist); -static spinlock_t sd_devlist_lock = SPIN_LOCK_UNLOCKED; - static unsigned long sd_index_bits[SD_DISKS / BITS_PER_LONG]; static spinlock_t sd_index_lock = SPIN_LOCK_UNLOCKED; static void sd_init_onedisk(struct scsi_disk * sdkp, struct gendisk *disk); static void sd_rw_intr(struct scsi_cmnd * SCpnt); -static int sd_attach(struct scsi_device *); -static void sd_detach(struct scsi_device *); -static void sd_rescan(struct scsi_device *); +static int sd_probe(struct device *); +static int sd_remove(struct device *); +static void sd_shutdown(struct device *dev); +static void sd_rescan(struct device *); static int sd_init_command(struct scsi_cmnd *); static int sd_synchronize_cache(struct scsi_disk *, int); -static int sd_notifier(struct notifier_block *, unsigned long, void *); static void sd_read_capacity(struct scsi_disk *sdkp, char *diskname, struct scsi_request *SRpnt, unsigned char *buffer); -static struct notifier_block sd_notifier_block = {sd_notifier, NULL, 0}; -static struct Scsi_Device_Template sd_template = { - .module = THIS_MODULE, - .list = LIST_HEAD_INIT(sd_template.list), - .name = "disk", - .scsi_type = TYPE_DISK, - .attach = sd_attach, - .detach = sd_detach, - .rescan = sd_rescan, - .init_command = sd_init_command, - .scsi_driverfs_driver = { - .name = "sd", +static struct scsi_driver sd_template = { + .owner = THIS_MODULE, + .gendrv = { + .name = "sd", + .probe = sd_probe, + .remove = sd_remove, + .shutdown = sd_shutdown, }, + .rescan = sd_rescan, + .init_command = sd_init_command, }; static int sd_major(int major_idx) @@ -133,36 +126,6 @@ } } -static struct scsi_disk *sd_find_by_sdev(Scsi_Device *sd) -{ - struct scsi_disk *sdkp; - - spin_lock(&sd_devlist_lock); - list_for_each_entry(sdkp, &sd_devlist, list) { - if (sdkp->device == sd) { - spin_unlock(&sd_devlist_lock); - return sdkp; - } - } - - spin_unlock(&sd_devlist_lock); - return NULL; -} - -static inline void sd_devlist_insert(struct scsi_disk *sdkp) -{ - spin_lock(&sd_devlist_lock); - list_add(&sdkp->list, &sd_devlist); - spin_unlock(&sd_devlist_lock); -} - -static inline void sd_devlist_remove(struct scsi_disk *sdkp) -{ - spin_lock(&sd_devlist_lock); - list_del(&sdkp->list); - spin_unlock(&sd_devlist_lock); -} - static inline struct scsi_disk *scsi_disk(struct gendisk *disk) { return container_of(disk->private_data, struct scsi_disk, driver); @@ -636,12 +599,13 @@ return 1; } -static void sd_rescan(struct scsi_device * sdp) +static void sd_rescan(struct device *dev) { - unsigned char *buffer; - struct scsi_disk *sdkp = sd_find_by_sdev(sdp); + struct scsi_device *sdp = to_scsi_device(dev); + struct scsi_disk *sdkp = dev_get_drvdata(dev); struct gendisk *gd; struct scsi_request *SRpnt; + unsigned char *buffer; if (!sdkp || sdp->online == FALSE || !sdkp->media_present) return; @@ -1312,10 +1276,10 @@ } /** - * sd_attach - called during driver initialization and whenever a + * sd_probe - called during driver initialization and whenever a * new scsi device is attached to the system. It is called once * for each scsi device (not just disks) present. - * @sdp: pointer to mid level scsi device object + * @dev: pointer to device object * * Returns 0 if successful (or not interested in this scsi device * (e.g. scanner)); 1 when there is an error. @@ -1327,17 +1291,19 @@ * and minor number that is chosen here. * * Assume sd_attach is not re-entrant (for time being) - * Also think about sd_attach() and sd_detach() running coincidentally. + * Also think about sd_attach() and sd_remove() running coincidentally. **/ -static int sd_attach(struct scsi_device * sdp) +static int sd_probe(struct device *dev) { + struct scsi_device *sdp = to_scsi_device(dev); struct scsi_disk *sdkp; struct gendisk *gd; u32 index; int error; + error = -ENODEV; if ((sdp->type != TYPE_DISK) && (sdp->type != TYPE_MOD)) - return 1; + goto out; SCSI_LOG_HLQUEUE(3, printk("sd_attach: scsi device: <%d,%d,%d,%d>\n", sdp->host->host_no, sdp->channel, sdp->id, sdp->lun)); @@ -1389,8 +1355,8 @@ gd->private_data = &sdkp->driver; gd->queue = sdkp->device->request_queue; - sd_devlist_insert(sdkp); set_capacity(gd, sdkp->capacity); + dev_set_drvdata(dev, sdkp); add_disk(gd); printk(KERN_NOTICE "Attached scsi %sdisk %s at scsi%d, channel %d, " @@ -1409,44 +1375,42 @@ } /** - * sd_detach - called whenever a scsi disk (previously recognized by - * sd_attach) is detached from the system. It is called (potentially + * sd_remove - called whenever a scsi disk (previously recognized by + * sd_probe) is detached from the system. It is called (potentially * multiple times) during sd module unload. * @sdp: pointer to mid level scsi device object * * Note: this function is invoked from the scsi mid-level. * This function potentially frees up a device name (e.g. /dev/sdc) - * that could be re-used by a subsequent sd_attach(). + * that could be re-used by a subsequent sd_probe(). * This function is not called when the built-in sd driver is "exit-ed". **/ -static void sd_detach(struct scsi_device * sdp) +static int sd_remove(struct device *dev) { - struct scsi_disk *sdkp; - - SCSI_LOG_HLQUEUE(3, printk("sd_detach: <%d,%d,%d,%d>\n", - sdp->host->host_no, sdp->channel, sdp->id, - sdp->lun)); - - sdkp = sd_find_by_sdev(sdp); - if (!sdkp) - return; + struct scsi_disk *sdkp = dev_get_drvdata(dev); - /* check that we actually have a write back cache to synchronize */ - if (sdkp->WCE) { - printk(KERN_NOTICE "Synchronizing SCSI cache: "); - sd_synchronize_cache(sdkp, 1); - printk("\n"); - } - - sd_devlist_remove(sdkp); del_gendisk(sdkp->disk); spin_lock(&sd_index_lock); clear_bit(sdkp->index, sd_index_bits); spin_unlock(&sd_index_lock); + sd_shutdown(dev); put_disk(sdkp->disk); kfree(sdkp); + + return 0; +} + +static void sd_shutdown(struct device *dev) +{ + struct scsi_disk *sdkp = dev_get_drvdata(dev); + + if (sdkp->WCE) { + printk(KERN_NOTICE "Synchronizing SCSI cache: "); + sd_synchronize_cache(sdkp, 1); + printk("\n"); + } } /** @@ -1457,7 +1421,7 @@ **/ static int __init init_sd(void) { - int majors = 0, rc = -ENODEV, i; + int majors = 0, i; SCSI_LOG_HLQUEUE(3, printk("init_sd: sd driver entry point\n")); @@ -1468,11 +1432,7 @@ if (!majors) return -ENODEV; - rc = scsi_register_device(&sd_template); - if (rc) - return rc; - register_reboot_notifier(&sd_notifier_block); - return rc; + return scsi_register_driver(&sd_template.gendrv); } /** @@ -1486,37 +1446,11 @@ SCSI_LOG_HLQUEUE(3, printk("exit_sd: exiting sd driver\n")); - unregister_reboot_notifier(&sd_notifier_block); - scsi_unregister_device(&sd_template); + scsi_unregister_driver(&sd_template.gendrv); for (i = 0; i < SD_MAJORS; i++) unregister_blkdev(sd_major(i), "sd"); } -/* - * XXX: this function does not take sd_devlist_lock to synchronize - * access to sd_devlist. This should be safe as no other reboot - * notifier can access it. - */ -static int sd_notifier(struct notifier_block *n, unsigned long event, void *p) -{ - if (event != SYS_RESTART && - event != SYS_HALT && - event != SYS_POWER_OFF) - return NOTIFY_DONE; - - if (!list_empty(&sd_devlist)) { - struct scsi_disk *sdkp; - - printk(KERN_NOTICE "Synchronizing SCSI caches: "); - list_for_each_entry(sdkp, &sd_devlist, list) - if (sdkp->WCE) - sd_synchronize_cache(sdkp, 1); - printk("\n"); - } - - return NOTIFY_OK; -} - /* send a SYNCHRONIZE CACHE instruction down to the device through the * normal SCSI command structure. Wait for the command to complete (must * have user context) */ diff -urN linux-2.5.70-bk8/drivers/scsi/sg.c linux-2.5.70-bk9/drivers/scsi/sg.c --- linux-2.5.70-bk8/drivers/scsi/sg.c 2003-05-26 18:00:39.000000000 -0700 +++ linux-2.5.70-bk9/drivers/scsi/sg.c 2003-06-04 04:37:32.000000000 -0700 @@ -18,8 +18,8 @@ * */ #include -static char *sg_version_str = "3.5.28 [20030308]"; -static int sg_version_num = 30528; /* 2 digits for each component */ +static char *sg_version_str = "3.5.29 [20030529]"; +static int sg_version_num = 30529; /* 2 digits for each component */ /* * D. P. Gilbert (dgilbert@interlog.com, dougg@triode.net.au), notes: * - scsi logging is available via SCSI_LOG_TIMEOUT macros. First @@ -112,24 +112,17 @@ #define SG_DEV_ARR_LUMP 6 /* amount to over allocate sg_dev_arr by */ -static int sg_attach(Scsi_Device *); -static void sg_detach(Scsi_Device *); +static int sg_add(struct class_device *); +static void sg_remove(struct class_device *); static Scsi_Request *dummy_cmdp; /* only used for sizeof */ static rwlock_t sg_dev_arr_lock = RW_LOCK_UNLOCKED; /* Also used to lock file descriptor list for device */ -static struct Scsi_Device_Template sg_template = { - .module = THIS_MODULE, - .list = LIST_HEAD_INIT(sg_template.list), - .name = "generic", - .scsi_type = 0xff, - .attach = sg_attach, - .detach = sg_detach, - .scsi_driverfs_driver = { - .name = "sg", - }, +static struct class_interface sg_interface = { + .add = sg_add, + .remove = sg_remove, }; typedef struct sg_scatter_hold { /* holding area for scsi scatter gather info */ @@ -180,15 +173,13 @@ } Sg_fd; typedef struct sg_device { /* holds the state of each scsi generic device */ - struct Scsi_Device_Template *driver; - Scsi_Device *device; + struct scsi_device *device; wait_queue_head_t o_excl_wait; /* queue open() when O_EXCL in use */ int sg_tablesize; /* adapter's max scatter-gather table size */ Sg_fd *headfp; /* first open fd belonging to this device */ volatile char detached; /* 0->attached, 1->detached pending removal */ volatile char exclude; /* opened for exclusive access */ char sgdebug; /* 0->off, 1->sense, 9->dump dev, 10-> all devs */ - struct device sg_driverfs_dev; struct gendisk *disk; } Sg_device; @@ -1328,27 +1319,10 @@ .fasync = sg_fasync, }; -/* Driverfs file support */ -static ssize_t -sg_device_kdev_read(struct device *driverfs_dev, char *page) -{ - Sg_device *sdp = list_entry(driverfs_dev, Sg_device, sg_driverfs_dev); - return sprintf(page, "%x\n", MKDEV(sdp->disk->major, - sdp->disk->first_minor)); -} -static DEVICE_ATTR(kdev,S_IRUGO,sg_device_kdev_read,NULL); - -static ssize_t -sg_device_type_read(struct device *driverfs_dev, char *page) -{ - return sprintf(page, "CHR\n"); -} - -static DEVICE_ATTR(type,S_IRUGO,sg_device_type_read,NULL); - static int -sg_attach(Scsi_Device * scsidp) +sg_add(struct class_device *cdev) { + struct scsi_device *scsidp = to_scsi_device(cdev->dev); struct gendisk *disk; Sg_device *sdp = NULL; unsigned long iflags; @@ -1416,8 +1390,6 @@ SCSI_LOG_TIMEOUT(3, printk("sg_attach: dev=%d \n", k)); memset(sdp, 0, sizeof(*sdp)); - sdp->driver = &sg_template; - disk->private_data = &sdp->driver; sprintf(disk->disk_name, "sg%d", k); disk->major = SCSI_GENERIC_MAJOR; disk->first_minor = k; @@ -1430,40 +1402,20 @@ sdp->detached = 0; sdp->sg_tablesize = scsidp->host ? scsidp->host->sg_tablesize : 0; - memset(&sdp->sg_driverfs_dev, 0, sizeof (struct device)); - snprintf(sdp->sg_driverfs_dev.bus_id, BUS_ID_SIZE, "%s:gen", - scsidp->sdev_driverfs_dev.bus_id); - snprintf(sdp->sg_driverfs_dev.name, DEVICE_NAME_SIZE, "%sgeneric", - scsidp->sdev_driverfs_dev.name); - sdp->sg_driverfs_dev.parent = &scsidp->sdev_driverfs_dev; - sdp->sg_driverfs_dev.bus = scsidp->sdev_driverfs_dev.bus; - sg_nr_dev++; sg_dev_arr[k] = sdp; write_unlock_irqrestore(&sg_dev_arr_lock, iflags); - device_register(&sdp->sg_driverfs_dev); - device_create_file(&sdp->sg_driverfs_dev, &dev_attr_type); - device_create_file(&sdp->sg_driverfs_dev, &dev_attr_kdev); - devfs_mk_cdev(MKDEV(SCSI_GENERIC_MAJOR, k), S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP, "%s/generic", scsidp->devfs_name); - switch (scsidp->type) { - case TYPE_DISK: - case TYPE_MOD: - case TYPE_ROM: - case TYPE_WORM: - case TYPE_TAPE: - break; - default: - printk(KERN_NOTICE - "Attached scsi generic sg%d at scsi%d, channel" - " %d, id %d, lun %d, type %d\n", k, - scsidp->host->host_no, scsidp->channel, scsidp->id, - scsidp->lun, scsidp->type); - } + printk(KERN_NOTICE + "Attached scsi generic sg%d at scsi%d, channel" + " %d, id %d, lun %d, type %d\n", k, + scsidp->host->host_no, scsidp->channel, scsidp->id, + scsidp->lun, scsidp->type); + return 0; out: @@ -1472,8 +1424,9 @@ } static void -sg_detach(Scsi_Device * scsidp) +sg_remove(struct class_device *cdev) { + struct scsi_device *scsidp = to_scsi_device(cdev->dev); Sg_device *sdp = NULL; unsigned long iflags; Sg_fd *sfp; @@ -1524,9 +1477,6 @@ if (sdp) { devfs_remove("%s/generic", scsidp->devfs_name); - device_remove_file(&sdp->sg_driverfs_dev, &dev_attr_type); - device_remove_file(&sdp->sg_driverfs_dev, &dev_attr_kdev); - device_unregister(&sdp->sg_driverfs_dev); put_disk(sdp->disk); sdp->disk = NULL; if (NULL == sdp->headfp) @@ -1550,64 +1500,6 @@ MODULE_PARM_DESC(def_reserved_size, "size of buffer reserved for each fd"); -static ssize_t sg_allow_dio_show(struct device_driver * ddp, char * buf) -{ - return snprintf(buf, PAGE_SIZE, "%d\n", sg_allow_dio); -} -static ssize_t sg_allow_dio_store(struct device_driver * ddp, - const char * buf, size_t count) -{ - if (1 == sscanf(buf, "%d", &sg_allow_dio)) { - sg_allow_dio = sg_allow_dio ? 1 : 0; - return count; - } - return -EINVAL; -} -DRIVER_ATTR(allow_dio, S_IRUGO | S_IWUSR, sg_allow_dio_show, - sg_allow_dio_store) - -static ssize_t sg_def_reserved_show(struct device_driver * ddp, char * buf) -{ - return snprintf(buf, PAGE_SIZE, "%d\n", sg_big_buff); -} -static ssize_t sg_def_reserved_store(struct device_driver * ddp, - const char * buf, size_t count) -{ - if (1 == sscanf(buf, "%d", &def_reserved_size)) { - if (def_reserved_size >= 0) { - sg_big_buff = def_reserved_size; - return count; - } - } - return -EINVAL; -} -DRIVER_ATTR(def_reserved_size, S_IRUGO | S_IWUSR, sg_def_reserved_show, - sg_def_reserved_store) - -static ssize_t sg_version_show(struct device_driver * ddp, char * buf) -{ - return snprintf(buf, PAGE_SIZE, "%s\n", sg_version_str); -} -DRIVER_ATTR(version, S_IRUGO, sg_version_show, NULL) - -static void do_create_driverfs_files(void) -{ - struct device_driver * driverfs = &sg_template.scsi_driverfs_driver; - - driver_create_file(driverfs, &driver_attr_allow_dio); - driver_create_file(driverfs, &driver_attr_def_reserved_size); - driver_create_file(driverfs, &driver_attr_version); -} - -static void do_remove_driverfs_files(void) -{ - struct device_driver * driverfs = &sg_template.scsi_driverfs_driver; - - driver_remove_file(driverfs, &driver_attr_version); - driver_remove_file(driverfs, &driver_attr_def_reserved_size); - driver_remove_file(driverfs, &driver_attr_allow_dio); -} - static int __init init_sg(void) { @@ -1619,24 +1511,22 @@ rc = register_chrdev(SCSI_GENERIC_MAJOR, "sg", &sg_fops); if (rc) return rc; - rc = scsi_register_device(&sg_template); + rc = scsi_register_interface(&sg_interface); if (rc) return rc; #ifdef CONFIG_PROC_FS sg_proc_init(); #endif /* CONFIG_PROC_FS */ - do_create_driverfs_files(); return 0; } static void __exit exit_sg(void) { - do_remove_driverfs_files(); #ifdef CONFIG_PROC_FS sg_proc_cleanup(); #endif /* CONFIG_PROC_FS */ - scsi_unregister_device(&sg_template); + scsi_unregister_interface(&sg_interface); unregister_chrdev(SCSI_GENERIC_MAJOR, "sg"); if (sg_dev_arr != NULL) { vfree((char *) sg_dev_arr); @@ -1994,11 +1884,8 @@ if (res) return res; - for (; k < schp->k_use_sg; ++k, ++sclp) { - ksglen = (int) sclp->length; - p = sg_scatg2virt(sclp); - if (NULL == p) - break; + for (; p; ++sclp, ksglen = (int) sclp->length, + p = sg_scatg2virt(sclp)) { if (usglen <= 0) break; if (ksglen > usglen) { @@ -2025,6 +1912,9 @@ up += ksglen; usglen -= ksglen; } + ++k; + if (k >= schp->k_use_sg) + return 0; } } } @@ -2151,11 +2041,8 @@ if (res) return res; - for (; k < schp->k_use_sg; ++k, ++sclp) { - ksglen = (int) sclp->length; - p = sg_scatg2virt(sclp); - if (NULL == p) - break; + for (; p; ++sclp, ksglen = (int) sclp->length, + p = sg_scatg2virt(sclp)) { if (usglen <= 0) break; if (ksglen > usglen) { @@ -2182,6 +2069,9 @@ up += ksglen; usglen -= ksglen; } + ++k; + if (k >= schp->k_use_sg) + return 0; } } } diff -urN linux-2.5.70-bk8/drivers/scsi/sr.c linux-2.5.70-bk9/drivers/scsi/sr.c --- linux-2.5.70-bk8/drivers/scsi/sr.c 2003-06-04 04:37:18.000000000 -0700 +++ linux-2.5.70-bk9/drivers/scsi/sr.c 2003-06-04 04:37:32.000000000 -0700 @@ -67,26 +67,20 @@ CDC_PLAY_AUDIO|CDC_RESET|CDC_IOCTLS|CDC_DRIVE_STATUS| \ CDC_CD_R|CDC_CD_RW|CDC_DVD|CDC_DVD_R|CDC_GENERIC_PACKET) -static int sr_attach(struct scsi_device *); -static void sr_detach(struct scsi_device *); +static int sr_probe(struct device *); +static int sr_remove(struct device *); static int sr_init_command(struct scsi_cmnd *); -static struct Scsi_Device_Template sr_template = { - .module = THIS_MODULE, - .list = LIST_HEAD_INIT(sr_template.list), - .name = "cdrom", - .scsi_type = TYPE_ROM, - .attach = sr_attach, - .detach = sr_detach, - .init_command = sr_init_command, - .scsi_driverfs_driver = { - .name = "sr", +static struct scsi_driver sr_template = { + .owner = THIS_MODULE, + .gendrv = { + .name = "sr", + .probe = sr_probe, + .remove = sr_remove, }, + .init_command = sr_init_command, }; -static LIST_HEAD(sr_devlist); -static spinlock_t sr_devlist_lock = SPIN_LOCK_UNLOCKED; - static unsigned long sr_index_bits[SR_DISKS / BITS_PER_LONG]; static spinlock_t sr_index_lock = SPIN_LOCK_UNLOCKED; @@ -99,37 +93,6 @@ static int sr_media_change(struct cdrom_device_info *, int); static int sr_packet(struct cdrom_device_info *, struct cdrom_generic_command *); -static Scsi_CD *sr_find_by_sdev(Scsi_Device *sd) -{ - struct list_head *p; - Scsi_CD *cd; - - spin_lock(&sr_devlist_lock); - list_for_each(p, &sr_devlist) { - cd = list_entry(p, Scsi_CD, list); - if (cd->device == sd) { - spin_unlock(&sr_devlist_lock); - return cd; - } - } - spin_unlock(&sr_devlist_lock); - return NULL; -} - -static inline void sr_devlist_insert(Scsi_CD *cd) -{ - spin_lock(&sr_devlist_lock); - list_add(&cd->list, &sr_devlist); - spin_unlock(&sr_devlist_lock); -} - -static inline void sr_devlist_remove(Scsi_CD *cd) -{ - spin_lock(&sr_devlist_lock); - list_del(&cd->list); - spin_unlock(&sr_devlist_lock); -} - static struct cdrom_device_ops sr_dops = { .open = sr_open, .release = sr_release, @@ -506,14 +469,16 @@ scsi_device_put(cd->device); } -static int sr_attach(struct scsi_device *sdev) +static int sr_probe(struct device *dev) { + struct scsi_device *sdev = to_scsi_device(dev); struct gendisk *disk; struct scsi_cd *cd; int minor, error; + error = -ENODEV; if (sdev->type != TYPE_ROM && sdev->type != TYPE_WORM) - return 1; + goto fail; error = -ENOMEM; cd = kmalloc(sizeof(*cd), GFP_KERNEL); @@ -575,8 +540,8 @@ disk->private_data = &cd->driver; disk->queue = sdev->request_queue; + dev_set_drvdata(dev, cd); add_disk(disk); - sr_devlist_insert(cd); printk(KERN_DEBUG "Attached scsi CD-ROM %s at scsi%d, channel %d, id %d, lun %d\n", @@ -807,15 +772,10 @@ return cgc->stat; } -static void sr_detach(struct scsi_device * SDp) +static int sr_remove(struct device *dev) { - struct scsi_cd *cd; + struct scsi_cd *cd = dev_get_drvdata(dev); - cd = sr_find_by_sdev(SDp); - if (!cd) - return; - - sr_devlist_remove(cd); del_gendisk(cd->disk); spin_lock(&sr_index_lock); @@ -825,6 +785,8 @@ put_disk(cd->disk); unregister_cdrom(&cd->cdi); kfree(cd); + + return 0; } static int __init init_sr(void) @@ -834,12 +796,12 @@ rc = register_blkdev(SCSI_CDROM_MAJOR, "sr"); if (rc) return rc; - return scsi_register_device(&sr_template); + return scsi_register_driver(&sr_template.gendrv); } static void __exit exit_sr(void) { - scsi_unregister_device(&sr_template); + scsi_unregister_driver(&sr_template.gendrv); unregister_blkdev(SCSI_CDROM_MAJOR, "sr"); } diff -urN linux-2.5.70-bk8/drivers/scsi/sr.h linux-2.5.70-bk9/drivers/scsi/sr.h --- linux-2.5.70-bk8/drivers/scsi/sr.h 2003-05-26 18:00:38.000000000 -0700 +++ linux-2.5.70-bk9/drivers/scsi/sr.h 2003-06-04 04:37:32.000000000 -0700 @@ -25,8 +25,7 @@ #define IOCTL_TIMEOUT 30*HZ typedef struct scsi_cd { - struct Scsi_Device_Template *driver; - struct list_head list; + struct scsi_driver *driver; unsigned capacity; /* size in blocks */ Scsi_Device *device; unsigned int vendor; /* vendor code, see sr_vendor.c */ diff -urN linux-2.5.70-bk8/drivers/scsi/st.c linux-2.5.70-bk9/drivers/scsi/st.c --- linux-2.5.70-bk8/drivers/scsi/st.c 2003-05-26 18:00:42.000000000 -0700 +++ linux-2.5.70-bk9/drivers/scsi/st.c 2003-06-04 04:37:32.000000000 -0700 @@ -170,22 +170,19 @@ unsigned long, size_t, int); static int sgl_unmap_user_pages(struct scatterlist *, const unsigned int, int); -static int st_attach(Scsi_Device *); -static void st_detach(Scsi_Device *); +static int st_probe(struct device *); +static int st_remove(struct device *); static void do_create_driverfs_files(void); static void do_remove_driverfs_files(void); -static struct Scsi_Device_Template st_template = { - .module = THIS_MODULE, - .list = LIST_HEAD_INIT(st_template.list), - .name = "tape", - .scsi_type = TYPE_TAPE, - .attach = st_attach, - .detach = st_detach, - .scsi_driverfs_driver = { - .name = "st", +static struct scsi_driver st_template = { + .owner = THIS_MODULE, + .gendrv = { + .name = "st", + .probe = st_probe, + .remove = st_remove, }, }; @@ -3704,8 +3701,9 @@ .release = st_release, }; -static int st_attach(Scsi_Device * SDp) +static int st_probe(struct device *dev) { + struct scsi_device *SDp = to_scsi_device(dev); struct gendisk *disk; Scsi_Tape *tpnt; ST_mode *STm; @@ -3716,13 +3714,13 @@ u64 bounce_limit; if (SDp->type != TYPE_TAPE) - return 1; + return -ENODEV; if ((stp = st_incompatible(SDp))) { printk(KERN_INFO "st: Found incompatible tape at scsi%d, channel %d, id %d, lun %d\n", SDp->host->host_no, SDp->channel, SDp->id, SDp->lun); printk(KERN_INFO "st: The suggested driver is %s.\n", stp); - return 1; + return -ENODEV; } i = SDp->host->sg_tablesize; @@ -3862,43 +3860,11 @@ write_unlock(&st_dev_arr_lock); for (mode = 0; mode < ST_NBR_MODES; ++mode) { - char name[8]; - /* Rewind entry */ - sprintf(name, "mt%s", st_formats[mode]); - - sprintf(tpnt->driverfs_dev_r[mode].bus_id, "%s:%s", - SDp->sdev_driverfs_dev.bus_id, name); - sprintf(tpnt->driverfs_dev_r[mode].name, "%s%s", - SDp->sdev_driverfs_dev.name, name); - tpnt->driverfs_dev_r[mode].parent = &SDp->sdev_driverfs_dev; - tpnt->driverfs_dev_r[mode].bus = SDp->sdev_driverfs_dev.bus; - tpnt->driverfs_dev_r[mode].driver_data = - (void *)(long)__mkdev(SCSI_TAPE_MAJOR, dev_num + (mode << 5)); - device_register(&tpnt->driverfs_dev_r[mode]); - device_create_file(&tpnt->driverfs_dev_r[mode], - &dev_attr_type); - device_create_file(&tpnt->driverfs_dev_r[mode], &dev_attr_kdev); devfs_mk_cdev(MKDEV(SCSI_TAPE_MAJOR, dev_num + (mode << 5)), S_IFCHR | S_IRUGO | S_IWUGO, "%s/mt%s", SDp->devfs_name, st_formats[mode]); - /* No-rewind entry */ - sprintf (name, "mt%sn", st_formats[mode]); - - sprintf(tpnt->driverfs_dev_n[mode].bus_id, "%s:%s", - SDp->sdev_driverfs_dev.bus_id, name); - sprintf(tpnt->driverfs_dev_n[mode].name, "%s%s", - SDp->sdev_driverfs_dev.name, name); - tpnt->driverfs_dev_n[mode].parent= &SDp->sdev_driverfs_dev; - tpnt->driverfs_dev_n[mode].bus = SDp->sdev_driverfs_dev.bus; - tpnt->driverfs_dev_n[mode].driver_data = - (void *)(long)__mkdev(SCSI_TAPE_MAJOR, dev_num + (mode << 5) + 128); - device_register(&tpnt->driverfs_dev_n[mode]); - device_create_file(&tpnt->driverfs_dev_n[mode], - &dev_attr_type); - device_create_file(&tpnt->driverfs_dev_n[mode], - &dev_attr_kdev); devfs_mk_cdev(MKDEV(SCSI_TAPE_MAJOR, dev_num + (mode << 5) + 128), S_IFCHR | S_IRUGO | S_IWUGO, "%s/mt%sn", SDp->devfs_name, st_formats[mode]); @@ -3918,11 +3884,12 @@ out_buffer_free: kfree(buffer); out: - return 1; + return -ENODEV; }; -static void st_detach(Scsi_Device * SDp) +static int st_remove(struct device *dev) { + Scsi_Device *SDp = to_scsi_device(dev); Scsi_Tape *tpnt; int i, mode; @@ -3937,16 +3904,6 @@ for (mode = 0; mode < ST_NBR_MODES; ++mode) { devfs_remove("%s/mt%s", SDp->devfs_name, st_formats[mode]); devfs_remove("%s/mt%sn", SDp->devfs_name, st_formats[mode]); - device_remove_file(&tpnt->driverfs_dev_r[mode], - &dev_attr_type); - device_remove_file(&tpnt->driverfs_dev_r[mode], - &dev_attr_kdev); - device_unregister(&tpnt->driverfs_dev_r[mode]); - device_remove_file(&tpnt->driverfs_dev_n[mode], - &dev_attr_type); - device_remove_file(&tpnt->driverfs_dev_n[mode], - &dev_attr_kdev); - device_unregister(&tpnt->driverfs_dev_n[mode]); } tpnt->device = NULL; @@ -3957,12 +3914,12 @@ } put_disk(tpnt->disk); kfree(tpnt); - return; + return 0; } } write_unlock(&st_dev_arr_lock); - return; + return 0; } static int __init init_st(void) @@ -3974,7 +3931,7 @@ verstr, st_fixed_buffer_size, st_max_sg_segs); if (register_chrdev(SCSI_TAPE_MAJOR, "st", &st_fops) >= 0) { - if (scsi_register_device(&st_template) == 0) { + if (scsi_register_driver(&st_template.gendrv) == 0) { do_create_driverfs_files(); return 0; } @@ -3987,20 +3944,10 @@ static void __exit exit_st(void) { - int i; - do_remove_driverfs_files(); - scsi_unregister_device(&st_template); + scsi_unregister_driver(&st_template.gendrv); unregister_chrdev(SCSI_TAPE_MAJOR, "st"); - if (scsi_tapes != NULL) { - for (i=0; i < st_dev_max; ++i) - if (scsi_tapes[i]) { - printk(KERN_WARNING "st: scsi_tapes[] not " - "empty after scsi_unregister_device\n"); - st_detach(scsi_tapes[i]->device); - } - kfree(scsi_tapes); - } + kfree(scsi_tapes); printk(KERN_INFO "st: Unloaded.\n"); } @@ -4035,7 +3982,7 @@ static void do_create_driverfs_files(void) { - struct device_driver *driverfs = &st_template.scsi_driverfs_driver; + struct device_driver *driverfs = &st_template.gendrv; driver_create_file(driverfs, &driver_attr_try_direct_io); driver_create_file(driverfs, &driver_attr_fixed_buffer_size); @@ -4045,7 +3992,7 @@ static void do_remove_driverfs_files(void) { - struct device_driver *driverfs = &st_template.scsi_driverfs_driver; + struct device_driver *driverfs = &st_template.gendrv; driver_remove_file(driverfs, &driver_attr_version); driver_remove_file(driverfs, &driver_attr_max_sg_segs); diff -urN linux-2.5.70-bk8/drivers/scsi/st.h linux-2.5.70-bk9/drivers/scsi/st.h --- linux-2.5.70-bk8/drivers/scsi/st.h 2003-05-26 18:00:46.000000000 -0700 +++ linux-2.5.70-bk9/drivers/scsi/st.h 2003-06-04 04:37:32.000000000 -0700 @@ -70,7 +70,7 @@ /* The tape drive descriptor */ typedef struct { - struct Scsi_Device_Template *driver; + struct scsi_driver *driver; Scsi_Device *device; struct semaphore lock; /* For serialization */ struct completion wait; /* For SCSI commands */ @@ -103,8 +103,6 @@ /* Mode characteristics */ ST_mode modes[ST_NBR_MODES]; int current_mode; - struct device driverfs_dev_r[ST_NBR_MODES]; - struct device driverfs_dev_n[ST_NBR_MODES]; /* Status variables */ int partition; diff -urN linux-2.5.70-bk8/drivers/video/matrox/matroxfb_base.h linux-2.5.70-bk9/drivers/video/matrox/matroxfb_base.h --- linux-2.5.70-bk8/drivers/video/matrox/matroxfb_base.h 2003-06-04 04:37:18.000000000 -0700 +++ linux-2.5.70-bk9/drivers/video/matrox/matroxfb_base.h 2003-06-04 04:37:35.000000000 -0700 @@ -52,7 +52,7 @@ #include "../console/fbcon.h" -#if defined(CONFIG_PPC) +#if defined(CONFIG_ALL_PPC) #include #include #include